ROOT logo
//*-- Author   : Patrick Sellheim, Georgy Kornakov
//*-- Created  : 09/01/2014

//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////////////////////////////////////////////
//
//  HParticleBt
//
//  This class contains functions to search rings in 1 event based on data
//  provided by HBtMatrix.
// General strategy for RICH back tracking:
//  - Use theta and phi angle information of particle candidate
//    to point to ring center on RICH pad plane
//  - Predict fired pads with the help of ring shape parametrization
//    function
//  - If at least one predicted pad is fired cluster information will
//    be calculated
//  - Fired pads are allocated to clusters of rings
//  - Local maxima of clusters are searched and used to calculate the
//    ring quality observable chi2
//  - Number of all shared maxima per ring and shared maxima with a
//    specific track are identified
//  - User output is stored.
//
//////////////////////////////////////////////////////////////////////////////

#include "hparticlebt.h"
#include "hcategorymanager.h"
#include "richdef.h"
#include "hparticledef.h"
#include "hruntimedb.h"
#include "hparticlebtpar.h"
#include "hparticletool.h"


  Float_t  HParticleBt::fBetaRPCLimit = 0.8;
  Float_t  HParticleBt::fBetaTOFLimit = 0.8;
  Float_t  HParticleBt::fMdcdEdxLimit = 50.;
  Float_t  HParticleBt::foAngleLimit  = 4.;

// ----------------------------------------------------------------
ClassImp(HParticleBt)

// ----------------------------------------------------------------

HParticleBt::HParticleBt(void)
{
    fRing         = NULL;
    fClus         = NULL;
    fCandCat      = NULL;
    fRichCal      = NULL;
    fBtPar        = NULL;
    fDebugInfo    = kFALSE;
}

HParticleBt::HParticleBt(const Text_t* name,const Text_t* title,const TString beamtime)
: HReconstructor(name,title)
{
    fDebugInfo    = kFALSE;
    fRing         = NULL;
    fClus         = NULL;
    fCandCat      = NULL;
    fRichCal      = NULL;
    fBtPar        = NULL;
    fDebugInfo    = kFALSE;

    fSorter.getSetup().kIgnoreInnerMDC = kTRUE;
    fSorter.getSetup().kIgnoreOuterMDC = kTRUE;
    fSorter.getSetup().kIgnoreMETA     = kTRUE;

    cout << "--------------------------------------------------------------------------------------------" << endl;
    cout << "HParticleBtRing: "<< endl;

    if(beamtime=="apr12"){
	cout << "Beamtime: '" << beamtime << "' Angle corrections for leptons are applied." << endl;
	fdoAngleCorr = kTRUE;
    }else if(beamtime=="jul14" || beamtime=="aug14" ){
	fdoAngleCorr = kFALSE;
	cout << "Beamtime: '" << beamtime << "' Angle corrections for leptons are not applied." << endl;
    }else{
	cout << "WARNING: Unknown beamtime " << beamtime << "! Angle corrections for leptons are applied by default." << endl;
	fdoAngleCorr = kFALSE;
    }
    cout << endl;
}

HParticleBt::~HParticleBt(void)
{

}

void HParticleBt::setDebugInfo(Bool_t debugInfo)
{
    //Set kTRUE to produce RingInfo output
    fDebugInfo = debugInfo;
}


Bool_t HParticleBt::init(void)
{

    fCandCat = gHades->getCurrentEvent()->getCategory(catParticleCand);
    if(!fCandCat) {
        Error("init","No ParticleCand Category");
	return kFALSE;
    }

   

    fRichCal = gHades->getCurrentEvent()->getCategory(catRichCal);
    if(!fRichCal) {
        Error("init","No RichCalCategory");
	return kFALSE;
    }

    fBtPar =(HParticleBtPar*) gHades->getRuntimeDb()->getContainer("ParticleBtPar");
    if(!fBtPar) {
        Error ("init()", "Retrieve ZERO pointer for ParticleBtPar!");
        return kFALSE;
    }
    
    fAngleCor.setDefaults("apr12");
    fSorter.init();

    fRing = new HParticleBtRingF();
    fClus = new HParticleBtClusterF();
    fClus->setRingF(fRing);

    // make output category
    fParticleBtOutCat = HCategoryManager::getCategory(catParticleBtRing,-1,"catParticleBtRing" );
    if(!fParticleBtOutCat) fParticleBtOutCat = HCategoryManager::addCategory(catParticleBtRing,"HParticleBtRing",1,"Particle");

    if(!fParticleBtOutCat) {
	Error( "init", "Cannot make catParticleBtOut category" );
	return kFALSE;
    }

    // make ring info category
    if(fDebugInfo){
	fParticleBtRingInfoCat = HCategoryManager::getCategory(catParticleBtRingInfo,-1,"catParticleBtRingInfo" );
	if(!fParticleBtRingInfoCat) fParticleBtRingInfoCat = HCategoryManager::addCategory(catParticleBtRingInfo,"HParticleBtRingInfo",1,"Particle");

	if(!fParticleBtRingInfoCat) {
	Error( "init", "Cannot make catParticleBtRingInfo category" );
	return kFALSE;
	}
    }
    return kTRUE;
}

Bool_t HParticleBt::reinit(void)
{

    fClus -> init();
    fRing -> init();
    fClus -> setRingF(fRing);

    fBetaRPCLimit = fBtPar->getBetaRPCLimit();
    fBetaTOFLimit = fBtPar->getBetaTOFLimit();
    fMdcdEdxLimit = fBtPar->getMDCdEdxLimit();
    foAngleLimit  = 4.;

    return kTRUE;
}

Bool_t HParticleBt::isGoodLepton(HParticleCand* cand)
{
    //Good Particle cand selection
    Int_t sys       = cand->getSystemUsed();
    Float_t beta    = cand->getBeta();
    Float_t dEdx    = cand->getMdcdEdx();

    if(dEdx > fMdcdEdxLimit)
	return kFALSE;
    else{
	if( (sys == 0 && beta > fBetaRPCLimit) || (sys == 1 && beta > fBetaTOFLimit) )
	    return kTRUE;
	else
            return kFALSE;
    }
    return kFALSE;
}

Bool_t HParticleBt::selectLeptonsBeta(HParticleCand* pcand)
{
    //Track selection function for lepton candidates.

    Bool_t selectEpEm = kFALSE;
    if(pcand->isFlagAND(4,
			Particle::kIsAcceptedHitInnerMDC,
			Particle::kIsAcceptedHitOuterMDC,
			Particle::kIsAcceptedHitMETA,
			Particle::kIsAcceptedRK)&&

       pcand->getInnerSegmentChi2() > 0
       &&
       isGoodLepton(pcand)
       &&
       pcand->getChi2() < 500) selectEpEm=kTRUE;
    if(selectEpEm)
	return kTRUE;
    else
	return kFALSE;
}


Int_t HParticleBt::execute(void)
 {
    //Backtracking main class
    //Sorting the particle candidates in order to fill the internally used vector
    vector <HParticleCand> candidates;
    HVertex& vertex = gHades->getCurrentEvent()->getHeader()->getVertex();
    HParticleCand* cand1 = 0;
    Int_t counter        = 0;
    Bool_t trackInSec[6] = {kFALSE,kFALSE,kFALSE,kFALSE,kFALSE,kFALSE};

  
    //------------------------------------------------------------------------
    // clean vectors and index arrays

    fSorter.backupSetup();      // remember old setup to restore it later
    fSorter.backupFlags(kTRUE); // backup only flags not setup
    fSorter.cleanUp();
    //------------------------------------------------------------------------
    fSorter.getSetup().copyToStatic();    // copy own setup as set in constructor to static vars
    fSorter.resetFlags(kTRUE,kTRUE,kTRUE,kTRUE);            // reset all flags for flags (0-28) ,reject,used,lepton
   
    fSorter.fill(selectLeptonsBeta);   // fill only good leptons
    fSorter.selectBest(Particle::kIsBestRKRKMETASorter,Particle::kIsLeptonSorter);
    // Loop over particle candidates for finding reasanoble tracks (beta, chi2, mmqa,...) for further matching with RICH

    for(Int_t i = 0; i < fCandCat->getEntries() ; i ++){
	cand1 = HCategoryManager::getObject(cand1,fCandCat,i);
	if(!cand1->isFlagBit(Particle::kIsLepton)) {
	    continue;
	}
	candidates.push_back(*cand1);
    }

    // Loop for filling prediction and correction for MS
    Int_t size = candidates.size();
    for(Int_t i = 0; i < size; i ++){
	if(fdoAngleCorr)
	    fAngleCor.recalcSetAngles(&candidates[i]);
        fRing->fillPrediction(&candidates[i], vertex,kTRUE,fdoAngleCorr);
    }

    fRing->fillRichCal(fRichCal);


    //Search for close Track parts around good rings. Search area is restricted by foAngleLimit.
    Int_t candidatesSize = candidates.size();
    for(Int_t i = 0; i < fCandCat->getEntries() ; i ++){
	cand1 = HCategoryManager::getObject(cand1,fCandCat,i);
        Float_t oAngle = 99;
	for(Int_t j = 0; j < candidatesSize; j ++){
	    if(cand1->getSector() != candidates[j].getSector()) continue;
	    oAngle = HParticleTool::getOpeningAngle(&candidates[j],cand1);
	    if(oAngle < foAngleLimit && fClus->getPadsRing(j) > 0) {
		Bool_t isInList = kFALSE;
		for(Int_t k = 0 ; k < candidatesSize ; k++){
		    if(candidates[k].getIndex() == cand1->getIndex())
			isInList = kTRUE;
		}
		if(!isInList){ //Candidate is not included in list of good candidates
		    candidates.push_back(*cand1);
		    if(fdoAngleCorr)
			fAngleCor.recalcSetAngles(&candidates[candidates.size()-1]);
		    fRing->fillPrediction(&candidates[candidates.size()-1], vertex,kFALSE,fdoAngleCorr);
		
		}
	    }
	}
    }

    // Fills rich cal hits for further calculations
    for(Int_t i = 0; i < size; i++){
	counter = fClus->getPadsRing(i);

	if(counter>0) {
	    // Calculate cluster information only if at least one hit was found
	    fClus -> calcCluster(i);
	    trackInSec[candidates[i].getSector()] = kTRUE;
        }
    }


    fSorter.restoreFlags(kTRUE); // restore only flags not backup
    fSorter.restoreSetup();      // restore old setup

    if(!fRing->hasNoisyRichSeg(trackInSec))
	fillOutput(candidates);
    fRing -> clearData();
    fClus -> clearCluster();

    return EXIT_SUCCESS;
}

void HParticleBt::fillOutput(vector <HParticleCand> &candidates)
{
    Int_t size = candidates.size();
    HParticleBtRing*     particleBtOut      = 0;
    HParticleBtRingInfo* particleBtRingInfo = 0;
    HParticleCand*       cand               = 0;
    Int_t                trackCounter       = 0;

    //Fill user output
    const   Int_t shareLimit                    = 10;
    Int_t   sharedMaxima[shareLimit]            = {0,0,0,0,0,0,0,0,0,0};
    Int_t   sharedMaximaBad[shareLimit]         = {0,0,0,0,0,0,0,0,0,0};
    Float_t sharedMaximaCharge[shareLimit]      = {0,0,0,0,0,0,0,0,0,0};
    Float_t sharedMaximaChargeBad[shareLimit]   = {0,0,0,0,0,0,0,0,0,0};
    Int_t   sharedMaximaNearby[shareLimit]      = {0,0,0,0,0,0,0,0,0,0};

    Int_t   sharedMaximaIdx[shareLimit]         = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
    Int_t   sharedMaximaBadIdx[shareLimit]      = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
    Int_t   sharedMaximaChargeIdx[shareLimit]   = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
    Int_t   sharedMaximaChargeBadIdx[shareLimit]= {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
    Int_t   sharedMaximaNearbyIdx[shareLimit]   = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};

    Int_t   sharedTmp                           = 0;
    Int_t   sharedTmpBad                        = 0;
    Float_t sharedTmpCharge                     = 0;
    Float_t sharedTmpChargeBad                  = 0;
    Int_t   sharedTmpNearby                     = 0;
    Int_t   counterShared                       = 0;
    Int_t   counterSharedBad                    = 0;
    Int_t   counterSharedCharge                 = 0;
    Int_t   counterSharedChargeBad              = 0;
    Int_t   counterSharedNearby                 = 0;





    for(Int_t trackNo=0; trackNo < size; trackNo++){
	if(fClus->getPadsRing(trackNo) > 0 ) {
	    for(Int_t i = 0; i < shareLimit; i++){
		sharedMaxima[i]            = 0;
		sharedMaximaBad[i]         = 0;
                sharedMaximaCharge[i]      = 0.;
		sharedMaximaChargeBad[i]   = 0.;
	        sharedMaximaNearby[i]      = 0;

		sharedMaximaIdx[i]         = -1;
	        sharedMaximaBadIdx[i]      = -1;
	        sharedMaximaChargeIdx[i]   = -1;
	        sharedMaximaChargeBadIdx[i]= -1;
	        sharedMaximaNearbyIdx[i]   = -1;
	    }
	    sharedTmp               = 0;
	    sharedTmpBad            = 0;
	    sharedTmpCharge         = 0.;
            sharedTmpChargeBad      = 0.;
	    sharedTmpNearby         = 0;

	    counterShared           = 0;
	    counterSharedBad        = 0;
	    counterSharedCharge     = 0;
	    counterSharedChargeBad  = 0;
	    counterSharedNearby     = 0;

	    for(Int_t i = 0; i < size; i ++){
		if(i == trackNo)
                    continue;
	        sharedTmp           = fClus->getMaximaSharedTrack(trackNo,i);
	        sharedTmpBad        = fClus->getMaximaSharedBadTrack(trackNo,i);
	        sharedTmpCharge     = fClus->getMaximaChargeSharedTrack(trackNo,i);
	        sharedTmpChargeBad  = fClus->getMaximaChargeSharedBadTrack(trackNo,i);
	        sharedTmpNearby     = fClus->getNearbyMaximaSharedTrack(trackNo,i);
		if(sharedTmp > 0){
		    if(counterShared  < shareLimit){
			sharedMaxima[counterShared]    = sharedTmp;
			sharedMaximaIdx[counterShared] = candidates[i].getIndex();
		    
		    }
		    counterShared++;
		}
                if(sharedTmpBad > 0){
		    if(counterSharedBad  < shareLimit){
			sharedMaximaBad[counterSharedBad]    = sharedTmpBad;
			sharedMaximaBadIdx[counterSharedBad] = candidates[i].getIndex();
		    }
		    counterSharedBad++;
		}
		if(sharedTmpCharge > 0){
		    if(counterSharedCharge  < shareLimit){
                	sharedMaximaCharge[counterSharedCharge]    = sharedTmpCharge;
			sharedMaximaChargeIdx[counterSharedCharge] = candidates[i].getIndex();
	            }
		    counterSharedCharge++;
		}
	        if(sharedTmpChargeBad > 0){
		    if(counterSharedChargeBad  < shareLimit){
			sharedMaximaChargeBad[counterSharedChargeBad]    = sharedTmpChargeBad;
			sharedMaximaChargeBadIdx[counterSharedChargeBad] = candidates[i].getIndex();
		    }
		    counterSharedChargeBad++;
		}
	        if(sharedTmpNearby > 0){
		    if( counterSharedNearby < shareLimit){
			sharedMaximaNearby[counterSharedNearby]    = sharedTmpNearby;
			sharedMaximaNearbyIdx[counterSharedNearby] = candidates[i].getIndex();
		    }
		    counterSharedNearby++;
		}
	    }
	    //Set -1 if Maxima are shared with more than 5 tracks --> Bad event
	    if(counterShared>shareLimit){
		for(Int_t i=0; i < shareLimit; i++){
		    sharedMaxima[i]    = -1;
		    sharedMaximaIdx[i] = -1;
		}
	    }
	    if(counterSharedBad>shareLimit){
		for(Int_t i=0; i < shareLimit; i++){
		    sharedMaximaBad[i]    = -1;
		    sharedMaximaBadIdx[i] = -1;
		}
	    }
	    if(counterSharedCharge>shareLimit){
		for(Int_t i=0; i < shareLimit; i++){
		    sharedMaximaCharge[i]    = -1;
		    sharedMaximaChargeIdx[i] = -1;
		}
	    }
	    if(counterSharedChargeBad>shareLimit){
		for(Int_t i=0; i < shareLimit; i++){
		    sharedMaximaChargeBad[i]    = -1;
		    sharedMaximaChargeBadIdx[i] = -1;
		}
	    }
	    if(counterSharedNearby>shareLimit){
		for(Int_t i=0; i < shareLimit; i++){
		    sharedMaximaNearby[i]    = -1;
		    sharedMaximaNearbyIdx[i] = -1;
		}
	    }

	    // fill output category
	    Int_t index = -1;
	    if((particleBtOut = HCategoryManager::newObject(particleBtOut,fParticleBtOutCat,index)) != 0 )
	    {
		particleBtOut = new (particleBtOut) HParticleBtRing;

		particleBtOut->setPadsRing(     fClus->getPadsRing(trackNo)  );
		particleBtOut->setPadsClus(      fClus->getPadsSum(trackNo)   );
		particleBtOut->setChargeRing(   fClus->getChargeRing(trackNo));
		particleBtOut->setChargeClus(    fClus->getChargeSum(trackNo) );

		particleBtOut->setClusters(     fClus->getNClusters(trackNo)   );
		particleBtOut->setMaxima(       fClus->getMaxima(trackNo)      );
		particleBtOut->setMaximaCharge( fClus->getMaximaCharge(trackNo));
		particleBtOut->setNearbyMaxima( fClus->getNearbyMaxima(trackNo));

		particleBtOut->setChi2(         fClus->getChi2Value(trackNo)       );
	        particleBtOut->setRingMatrix(   fRing->getRingMatrix(trackNo)      );
		particleBtOut->setMeanDist(     fClus->getMeanDist(trackCounter)   );
         
                particleBtOut->setMaximaShared(                       fClus->getMaximaShared(trackNo)      );
	        particleBtOut->setMaximaSharedFragment(               fClus->getMaximaSharedBad(trackNo)      );
	        particleBtOut->setMaximaChargeShared(                 fClus->getMaximaChargeShared(trackNo)      );
	        particleBtOut->setMaximaChargeSharedFragment(         fClus->getMaximaChargeSharedBad(trackNo)      );
	        particleBtOut->setNearbyMaximaShared(                 fClus->getNearbyMaximaShared(trackNo));
	        particleBtOut->setMaximaSharedTrack(                  sharedMaxima         );
                particleBtOut->setMaximaSharedTrackIdx(               sharedMaximaIdx      );
	        particleBtOut->setMaximaSharedFragmentTrack(          sharedMaximaBad      );
                particleBtOut->setMaximaSharedFragmentTrackIdx(       sharedMaximaBadIdx   );
	        particleBtOut->setMaximaChargeSharedTrack(            sharedMaximaCharge   );
                particleBtOut->setMaximaChargeSharedTrackIdx(         sharedMaximaChargeIdx);
	        particleBtOut->setMaximaChargeSharedFragmentTrack(    sharedMaximaChargeBad   );
                particleBtOut->setMaximaChargeSharedFragmentTrackIdx( sharedMaximaChargeBadIdx);
	        particleBtOut->setNearbyMaximaSharedTrack(            sharedMaximaNearby   );
                particleBtOut->setNearbyMaximaSharedTrackIdx(         sharedMaximaNearbyIdx);

		cand = HCategoryManager::getObject(cand,fCandCat,candidates[trackNo].getIndex());
                cand->setRichBTInd(index);
                trackCounter++;
	    }
	    else
	    {
		Error( "execute", "Couldn't get a new slot from 'catParticleBtRing'!" );
		exit( 2 );
	    }
	}
    }

    if(fDebugInfo){
	//Fill RingInfo category
	Int_t index2 = -1;
	Bool_t clusterInfoFilled = kFALSE;
	Bool_t ringInfoFilled = kFALSE;
	HParticleBtRingInfo ringInfoTest;
	ringInfoFilled      = fRing->fillRingInfo(&ringInfoTest);
        clusterInfoFilled   = fClus->fillRingInfo(&ringInfoTest);

	if((particleBtRingInfo = HCategoryManager::newObject(particleBtRingInfo,fParticleBtRingInfoCat,index2)) != 0 ){
	    particleBtRingInfo = new (particleBtRingInfo) HParticleBtRingInfo(ringInfoTest);
	}
	else
	{
	    Warning( "execute", "Couldn't get a new slot from 'catParticleBtRingInfo'!" );
	    exit( 2 );
	}

      
	if(clusterInfoFilled || ringInfoFilled )
	{
	    Warning( "execute", "'catParticleBtRingInfo' array limit is reached! Ring information is not stored." );

	}
    }
}






 hparticlebt.cc:1
 hparticlebt.cc:2
 hparticlebt.cc:3
 hparticlebt.cc:4
 hparticlebt.cc:5
 hparticlebt.cc:6
 hparticlebt.cc:7
 hparticlebt.cc:8
 hparticlebt.cc:9
 hparticlebt.cc:10
 hparticlebt.cc:11
 hparticlebt.cc:12
 hparticlebt.cc:13
 hparticlebt.cc:14
 hparticlebt.cc:15
 hparticlebt.cc:16
 hparticlebt.cc:17
 hparticlebt.cc:18
 hparticlebt.cc:19
 hparticlebt.cc:20
 hparticlebt.cc:21
 hparticlebt.cc:22
 hparticlebt.cc:23
 hparticlebt.cc:24
 hparticlebt.cc:25
 hparticlebt.cc:26
 hparticlebt.cc:27
 hparticlebt.cc:28
 hparticlebt.cc:29
 hparticlebt.cc:30
 hparticlebt.cc:31
 hparticlebt.cc:32
 hparticlebt.cc:33
 hparticlebt.cc:34
 hparticlebt.cc:35
 hparticlebt.cc:36
 hparticlebt.cc:37
 hparticlebt.cc:38
 hparticlebt.cc:39
 hparticlebt.cc:40
 hparticlebt.cc:41
 hparticlebt.cc:42
 hparticlebt.cc:43
 hparticlebt.cc:44
 hparticlebt.cc:45
 hparticlebt.cc:46
 hparticlebt.cc:47
 hparticlebt.cc:48
 hparticlebt.cc:49
 hparticlebt.cc:50
 hparticlebt.cc:51
 hparticlebt.cc:52
 hparticlebt.cc:53
 hparticlebt.cc:54
 hparticlebt.cc:55
 hparticlebt.cc:56
 hparticlebt.cc:57
 hparticlebt.cc:58
 hparticlebt.cc:59
 hparticlebt.cc:60
 hparticlebt.cc:61
 hparticlebt.cc:62
 hparticlebt.cc:63
 hparticlebt.cc:64
 hparticlebt.cc:65
 hparticlebt.cc:66
 hparticlebt.cc:67
 hparticlebt.cc:68
 hparticlebt.cc:69
 hparticlebt.cc:70
 hparticlebt.cc:71
 hparticlebt.cc:72
 hparticlebt.cc:73
 hparticlebt.cc:74
 hparticlebt.cc:75
 hparticlebt.cc:76
 hparticlebt.cc:77
 hparticlebt.cc:78
 hparticlebt.cc:79
 hparticlebt.cc:80
 hparticlebt.cc:81
 hparticlebt.cc:82
 hparticlebt.cc:83
 hparticlebt.cc:84
 hparticlebt.cc:85
 hparticlebt.cc:86
 hparticlebt.cc:87
 hparticlebt.cc:88
 hparticlebt.cc:89
 hparticlebt.cc:90
 hparticlebt.cc:91
 hparticlebt.cc:92
 hparticlebt.cc:93
 hparticlebt.cc:94
 hparticlebt.cc:95
 hparticlebt.cc:96
 hparticlebt.cc:97
 hparticlebt.cc:98
 hparticlebt.cc:99
 hparticlebt.cc:100
 hparticlebt.cc:101
 hparticlebt.cc:102
 hparticlebt.cc:103
 hparticlebt.cc:104
 hparticlebt.cc:105
 hparticlebt.cc:106
 hparticlebt.cc:107
 hparticlebt.cc:108
 hparticlebt.cc:109
 hparticlebt.cc:110
 hparticlebt.cc:111
 hparticlebt.cc:112
 hparticlebt.cc:113
 hparticlebt.cc:114
 hparticlebt.cc:115
 hparticlebt.cc:116
 hparticlebt.cc:117
 hparticlebt.cc:118
 hparticlebt.cc:119
 hparticlebt.cc:120
 hparticlebt.cc:121
 hparticlebt.cc:122
 hparticlebt.cc:123
 hparticlebt.cc:124
 hparticlebt.cc:125
 hparticlebt.cc:126
 hparticlebt.cc:127
 hparticlebt.cc:128
 hparticlebt.cc:129
 hparticlebt.cc:130
 hparticlebt.cc:131
 hparticlebt.cc:132
 hparticlebt.cc:133
 hparticlebt.cc:134
 hparticlebt.cc:135
 hparticlebt.cc:136
 hparticlebt.cc:137
 hparticlebt.cc:138
 hparticlebt.cc:139
 hparticlebt.cc:140
 hparticlebt.cc:141
 hparticlebt.cc:142
 hparticlebt.cc:143
 hparticlebt.cc:144
 hparticlebt.cc:145
 hparticlebt.cc:146
 hparticlebt.cc:147
 hparticlebt.cc:148
 hparticlebt.cc:149
 hparticlebt.cc:150
 hparticlebt.cc:151
 hparticlebt.cc:152
 hparticlebt.cc:153
 hparticlebt.cc:154
 hparticlebt.cc:155
 hparticlebt.cc:156
 hparticlebt.cc:157
 hparticlebt.cc:158
 hparticlebt.cc:159
 hparticlebt.cc:160
 hparticlebt.cc:161
 hparticlebt.cc:162
 hparticlebt.cc:163
 hparticlebt.cc:164
 hparticlebt.cc:165
 hparticlebt.cc:166
 hparticlebt.cc:167
 hparticlebt.cc:168
 hparticlebt.cc:169
 hparticlebt.cc:170
 hparticlebt.cc:171
 hparticlebt.cc:172
 hparticlebt.cc:173
 hparticlebt.cc:174
 hparticlebt.cc:175
 hparticlebt.cc:176
 hparticlebt.cc:177
 hparticlebt.cc:178
 hparticlebt.cc:179
 hparticlebt.cc:180
 hparticlebt.cc:181
 hparticlebt.cc:182
 hparticlebt.cc:183
 hparticlebt.cc:184
 hparticlebt.cc:185
 hparticlebt.cc:186
 hparticlebt.cc:187
 hparticlebt.cc:188
 hparticlebt.cc:189
 hparticlebt.cc:190
 hparticlebt.cc:191
 hparticlebt.cc:192
 hparticlebt.cc:193
 hparticlebt.cc:194
 hparticlebt.cc:195
 hparticlebt.cc:196
 hparticlebt.cc:197
 hparticlebt.cc:198
 hparticlebt.cc:199
 hparticlebt.cc:200
 hparticlebt.cc:201
 hparticlebt.cc:202
 hparticlebt.cc:203
 hparticlebt.cc:204
 hparticlebt.cc:205
 hparticlebt.cc:206
 hparticlebt.cc:207
 hparticlebt.cc:208
 hparticlebt.cc:209
 hparticlebt.cc:210
 hparticlebt.cc:211
 hparticlebt.cc:212
 hparticlebt.cc:213
 hparticlebt.cc:214
 hparticlebt.cc:215
 hparticlebt.cc:216
 hparticlebt.cc:217
 hparticlebt.cc:218
 hparticlebt.cc:219
 hparticlebt.cc:220
 hparticlebt.cc:221
 hparticlebt.cc:222
 hparticlebt.cc:223
 hparticlebt.cc:224
 hparticlebt.cc:225
 hparticlebt.cc:226
 hparticlebt.cc:227
 hparticlebt.cc:228
 hparticlebt.cc:229
 hparticlebt.cc:230
 hparticlebt.cc:231
 hparticlebt.cc:232
 hparticlebt.cc:233
 hparticlebt.cc:234
 hparticlebt.cc:235
 hparticlebt.cc:236
 hparticlebt.cc:237
 hparticlebt.cc:238
 hparticlebt.cc:239
 hparticlebt.cc:240
 hparticlebt.cc:241
 hparticlebt.cc:242
 hparticlebt.cc:243
 hparticlebt.cc:244
 hparticlebt.cc:245
 hparticlebt.cc:246
 hparticlebt.cc:247
 hparticlebt.cc:248
 hparticlebt.cc:249
 hparticlebt.cc:250
 hparticlebt.cc:251
 hparticlebt.cc:252
 hparticlebt.cc:253
 hparticlebt.cc:254
 hparticlebt.cc:255
 hparticlebt.cc:256
 hparticlebt.cc:257
 hparticlebt.cc:258
 hparticlebt.cc:259
 hparticlebt.cc:260
 hparticlebt.cc:261
 hparticlebt.cc:262
 hparticlebt.cc:263
 hparticlebt.cc:264
 hparticlebt.cc:265
 hparticlebt.cc:266
 hparticlebt.cc:267
 hparticlebt.cc:268
 hparticlebt.cc:269
 hparticlebt.cc:270
 hparticlebt.cc:271
 hparticlebt.cc:272
 hparticlebt.cc:273
 hparticlebt.cc:274
 hparticlebt.cc:275
 hparticlebt.cc:276
 hparticlebt.cc:277
 hparticlebt.cc:278
 hparticlebt.cc:279
 hparticlebt.cc:280
 hparticlebt.cc:281
 hparticlebt.cc:282
 hparticlebt.cc:283
 hparticlebt.cc:284
 hparticlebt.cc:285
 hparticlebt.cc:286
 hparticlebt.cc:287
 hparticlebt.cc:288
 hparticlebt.cc:289
 hparticlebt.cc:290
 hparticlebt.cc:291
 hparticlebt.cc:292
 hparticlebt.cc:293
 hparticlebt.cc:294
 hparticlebt.cc:295
 hparticlebt.cc:296
 hparticlebt.cc:297
 hparticlebt.cc:298
 hparticlebt.cc:299
 hparticlebt.cc:300
 hparticlebt.cc:301
 hparticlebt.cc:302
 hparticlebt.cc:303
 hparticlebt.cc:304
 hparticlebt.cc:305
 hparticlebt.cc:306
 hparticlebt.cc:307
 hparticlebt.cc:308
 hparticlebt.cc:309
 hparticlebt.cc:310
 hparticlebt.cc:311
 hparticlebt.cc:312
 hparticlebt.cc:313
 hparticlebt.cc:314
 hparticlebt.cc:315
 hparticlebt.cc:316
 hparticlebt.cc:317
 hparticlebt.cc:318
 hparticlebt.cc:319
 hparticlebt.cc:320
 hparticlebt.cc:321
 hparticlebt.cc:322
 hparticlebt.cc:323
 hparticlebt.cc:324
 hparticlebt.cc:325
 hparticlebt.cc:326
 hparticlebt.cc:327
 hparticlebt.cc:328
 hparticlebt.cc:329
 hparticlebt.cc:330
 hparticlebt.cc:331
 hparticlebt.cc:332
 hparticlebt.cc:333
 hparticlebt.cc:334
 hparticlebt.cc:335
 hparticlebt.cc:336
 hparticlebt.cc:337
 hparticlebt.cc:338
 hparticlebt.cc:339
 hparticlebt.cc:340
 hparticlebt.cc:341
 hparticlebt.cc:342
 hparticlebt.cc:343
 hparticlebt.cc:344
 hparticlebt.cc:345
 hparticlebt.cc:346
 hparticlebt.cc:347
 hparticlebt.cc:348
 hparticlebt.cc:349
 hparticlebt.cc:350
 hparticlebt.cc:351
 hparticlebt.cc:352
 hparticlebt.cc:353
 hparticlebt.cc:354
 hparticlebt.cc:355
 hparticlebt.cc:356
 hparticlebt.cc:357
 hparticlebt.cc:358
 hparticlebt.cc:359
 hparticlebt.cc:360
 hparticlebt.cc:361
 hparticlebt.cc:362
 hparticlebt.cc:363
 hparticlebt.cc:364
 hparticlebt.cc:365
 hparticlebt.cc:366
 hparticlebt.cc:367
 hparticlebt.cc:368
 hparticlebt.cc:369
 hparticlebt.cc:370
 hparticlebt.cc:371
 hparticlebt.cc:372
 hparticlebt.cc:373
 hparticlebt.cc:374
 hparticlebt.cc:375
 hparticlebt.cc:376
 hparticlebt.cc:377
 hparticlebt.cc:378
 hparticlebt.cc:379
 hparticlebt.cc:380
 hparticlebt.cc:381
 hparticlebt.cc:382
 hparticlebt.cc:383
 hparticlebt.cc:384
 hparticlebt.cc:385
 hparticlebt.cc:386
 hparticlebt.cc:387
 hparticlebt.cc:388
 hparticlebt.cc:389
 hparticlebt.cc:390
 hparticlebt.cc:391
 hparticlebt.cc:392
 hparticlebt.cc:393
 hparticlebt.cc:394
 hparticlebt.cc:395
 hparticlebt.cc:396
 hparticlebt.cc:397
 hparticlebt.cc:398
 hparticlebt.cc:399
 hparticlebt.cc:400
 hparticlebt.cc:401
 hparticlebt.cc:402
 hparticlebt.cc:403
 hparticlebt.cc:404
 hparticlebt.cc:405
 hparticlebt.cc:406
 hparticlebt.cc:407
 hparticlebt.cc:408
 hparticlebt.cc:409
 hparticlebt.cc:410
 hparticlebt.cc:411
 hparticlebt.cc:412
 hparticlebt.cc:413
 hparticlebt.cc:414
 hparticlebt.cc:415
 hparticlebt.cc:416
 hparticlebt.cc:417
 hparticlebt.cc:418
 hparticlebt.cc:419
 hparticlebt.cc:420
 hparticlebt.cc:421
 hparticlebt.cc:422
 hparticlebt.cc:423
 hparticlebt.cc:424
 hparticlebt.cc:425
 hparticlebt.cc:426
 hparticlebt.cc:427
 hparticlebt.cc:428
 hparticlebt.cc:429
 hparticlebt.cc:430
 hparticlebt.cc:431
 hparticlebt.cc:432
 hparticlebt.cc:433
 hparticlebt.cc:434
 hparticlebt.cc:435
 hparticlebt.cc:436
 hparticlebt.cc:437
 hparticlebt.cc:438
 hparticlebt.cc:439
 hparticlebt.cc:440
 hparticlebt.cc:441
 hparticlebt.cc:442
 hparticlebt.cc:443
 hparticlebt.cc:444
 hparticlebt.cc:445
 hparticlebt.cc:446
 hparticlebt.cc:447
 hparticlebt.cc:448
 hparticlebt.cc:449
 hparticlebt.cc:450
 hparticlebt.cc:451
 hparticlebt.cc:452
 hparticlebt.cc:453
 hparticlebt.cc:454
 hparticlebt.cc:455
 hparticlebt.cc:456
 hparticlebt.cc:457
 hparticlebt.cc:458
 hparticlebt.cc:459
 hparticlebt.cc:460
 hparticlebt.cc:461
 hparticlebt.cc:462
 hparticlebt.cc:463
 hparticlebt.cc:464
 hparticlebt.cc:465
 hparticlebt.cc:466
 hparticlebt.cc:467
 hparticlebt.cc:468
 hparticlebt.cc:469
 hparticlebt.cc:470
 hparticlebt.cc:471
 hparticlebt.cc:472
 hparticlebt.cc:473
 hparticlebt.cc:474
 hparticlebt.cc:475
 hparticlebt.cc:476
 hparticlebt.cc:477
 hparticlebt.cc:478
 hparticlebt.cc:479
 hparticlebt.cc:480
 hparticlebt.cc:481
 hparticlebt.cc:482
 hparticlebt.cc:483
 hparticlebt.cc:484
 hparticlebt.cc:485
 hparticlebt.cc:486
 hparticlebt.cc:487
 hparticlebt.cc:488
 hparticlebt.cc:489
 hparticlebt.cc:490
 hparticlebt.cc:491
 hparticlebt.cc:492
 hparticlebt.cc:493
 hparticlebt.cc:494
 hparticlebt.cc:495
 hparticlebt.cc:496
 hparticlebt.cc:497
 hparticlebt.cc:498
 hparticlebt.cc:499
 hparticlebt.cc:500
 hparticlebt.cc:501
 hparticlebt.cc:502
 hparticlebt.cc:503
 hparticlebt.cc:504
 hparticlebt.cc:505
 hparticlebt.cc:506
 hparticlebt.cc:507
 hparticlebt.cc:508
 hparticlebt.cc:509
 hparticlebt.cc:510
 hparticlebt.cc:511
 hparticlebt.cc:512
 hparticlebt.cc:513
 hparticlebt.cc:514
 hparticlebt.cc:515
 hparticlebt.cc:516
 hparticlebt.cc:517
 hparticlebt.cc:518
 hparticlebt.cc:519