ROOT logo
#include "hparticlepairmaker.h"
#include "hparticlepairdraw.h"
#include "hcategorymanager.h"
#include "hphysicsconstants.h"
#include "hades.h"
#include "hrecevent.h"


#include "TCanvas.h"
#include "TH1F.h"
#include "TLatex.h"
#include "TEllipse.h"
#include "TLine.h"

// ROOT's IO and RTTI stuff is added here
ClassImp(HParticlePairMaker)

//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////////////////////
//
//
// HParticlePairMaker
//
// Build vectors of freference candidates, fothers candidates and fpairs
// for the current event. As reference candidates marked as kIsLepton
// will be used.
//
// nectEvent() to be called inside eventloop after HParticleSorter selection.
// 1. clear all internal structures
// 2. fill vector freference by candidates which are flagged kIsLepton ( or kIsUsed if it is setup)
//    All other candidates (disregarding kIsLepton or kIsUsed) are added to vector fothers
//    To avoid unneeded pairs the user can set a userFilter by set setUserFilter(Bool_t (*userfilter)(HParticleCand*))
//    In this case only candidates passing this function (return kTRUE) will be taken into account
//    for freference and fothers.
// 3. created all pair combinations between freference x freference (no double counting) and freference x fothers.
//       If setDoSkippedFullCandPairs(kTRUE) is  set (default) in addition all pairs of full reconstructed
//       particles ( inner+outer MDC + META) of fOthers are build (ffullrecoOthers x ffullrecoOthers +
//       ffullrecoOthers x fnofullrecoOthers ). All pairs with full reco candidates of the event are build
//       this way for investigation, even the ones which are skipped from reference by any criteria or double hit
//       rejection.
//    a. pass the selectPID1 and selectPID2 functions
//       will get pid1 or pid2 assigned. Otherwise pid is -2(fake+), -1(fake-) (see HPhysicsConstants).
//       if pid2 fails it will get pid assigned opposite to reference cand in pairCase10.
//       fakes for pid2 will be assigned by polarity or opposite to reference cand.
//    b. eClosePairSelect flags will be set for each pair (see hparticledef.h).
//       This flags can be used later to classify the pairs.
//    c. pairs are inserted in fpairs vector. With static HParticlePair::setDoMomentumCorrection(Bool_t doit)
//       the enegryloss correction can be swithced on/off
//    d. secondary vertex and vertex cut vars are calulated. Which  primary ebevnt vertex
//       should be used has to be set by the user (default = kVertexParticle, see eVertex
//       in hparticledef.h). The user can provide an own event vertex per event by calling setVertex().
//
//
// Bool_t  HParticleTool::evalPairsFlags(UInt_t flag,HParticlePair& pair)
// can be used to classify the pair according to the predefined pair cases
// in ePairCase + eClosePairSelect (hparticledef.h). There are dedicated filter
// functions provided to select from the pairs vector
//
//BEGIN_HTML
// <img src="http://web-docs.gsi.de/~halo/docs/hydra/classDocumentation/docu_pics/hydra2/particle/lepton_pair_cases_1.png" alt="Lepton Pair Cases" width="750" >
// <img src="http://web-docs.gsi.de/~halo/docs/hydra/classDocumentation/docu_pics/hydra2/particle/lepton_pair_cases_2.png" alt="Lepton Pair Cases" width="750" >
//END_HTML
//   Fig 1. All predefined pairCases for Leptons
//
//BEGIN_HTML
// <img src="http://web-docs.gsi.de/~halo/docs/hydra/classDocumentation/docu_pics/hydra2/particle/hadron_pair_cases.png" alt="Hadron Pair Cases" width="750" >
//END_HTML
//   Fig 2. All predefined pairCases for Hadrons
//
//BEGIN_HTML
// <img src="http://web-docs.gsi.de/~halo/docs/hydra/classDocumentation/docu_pics/hydra2/particle/lepton_hadron_pair_cases.png" alt="Mixed Lepton Hadron Pair Cases" width="525" >
//END_HTML
//   Fig 2. All predefined pairCases for mixed Lepton Hadrons
//
    //
    //-----------------------------------------------------------------------------
    // USAGE:
    // #include  "hparticlepairmaker.h"
    // #include  "hparticledef.h"
    // #include  "hparticletool.h"
    // #include  <vector>
    // using namespace std;
    // ....
    //
    //
    // {
    // // setup HLoop etc ....
    //
    // ....
    //  HEnergyLossCorrPar enLossCorr;
    //  enLossCorr.setDefaultPar("apr12"); //  "jan04","nov02","aug04","apr12"
    //
    // //---------------------------------------------
    // // HPARTICLEPAIRMAKER SETUP :
    // HParticlePairMaker pairmaker;
    // // pairmaker.setPIDs(2,3,51) // default
    // // pairmaker.setPIDsSelection(mySelectionPID1,mySelectionPID2) // set your own selection function for pid1+pid2 (signature :  Bool_t myfunction(HParticleCand*) )
    // // pairmaker.setUseLeptons(kTRUE);// kTRUE : use kIsLepton, kFALSE: kIsUsed for selection of reference  (default kTRUE)
    // // pairmake.setRequireRich(kFALSE); // do not ask for rich Hit in selection functions ( default = kTRUE)
    // // pairmaker.setVertexCase(Particle::kVertexParticle); // select which event vertex to use (default = kVertexParticle)
    // // HParticlePair::setDoMomentumCorrection(kTRUE); // default : kTRUE
    // //---------------------------------------------
    //
    // vector<HParticlePair*> pairs;
    //
    // for (Int_t i=0; i < entries; i++) {
    //    Int_t nbytes =  loop.nextEvent(i);             // get next event. categories will be cleared before
    //    if(nbytes <= 0) { cout<<nbytes<<endl; break; } // last event reached
    //
    //
    //    //--------------------------------------------------------------------------
    //    // HPARTICLETRACKSORTER SETUP
    //    sorter.cleanUp();
    //    sorter.resetFlags(kTRUE,kTRUE,kTRUE,kTRUE);     // reset all flags for flags (0-28) ,reject,used,lepton
    //    Int_t nCandLep     = sorter.fill(HParticleTrackSorter::selectLeptons);   // fill only good leptons
    //    Int_t nCandLepBest = sorter.selectBest(HParticleTrackSorter::kIsBestRKRKMETA,HParticleTrackSorter::kIsLepton);
    //    Int_t nCandHad     = sorter.fill(HParticleTrackSorter::selectHadrons);   // fill only good hadrons (already marked good leptons will be skipped)
    //    Int_t nCandHadBest = sorter.selectBest(HParticleTrackSorter::kIsBestRKRKMETA,HParticleTrackSorter::kIsHadron);
    //    //--------------------------------------------------------------------------
    //
    //
    //    //###########################################################################
    //    // HPARTICLEPAIRMAKER ACTION:
    //    pairmaker.nextEvent();  // call it after your HParticleSorter action!
    //
    //
    //
    //    //--------------------------------------------------------------------------
    //    // example  1:
    //    // fill list of pairs for pairCase1 and require
    //    // fitted inner+out+RK for second leg in addition
    //    pairmaker.filterPairsVector(pairs,kPairCase1|kFittedInnerMDC2|kFittedInnerMDC2|kRK2);
    //
    //    for(UInt_t j = 0; j < pairs.size(); j++ ){ // print the pairs
    //       pairs[j]->print();
    //    }
    //    //--------------------------------------------------------------------------
    //
    //
    //    //--------------------------------------------------------------------------
    //    // example 2:
    //    // get list of all pairs and loop over the list
    //    // plot different pairCases
    //
    //    vector<HParticlePair>& pairsVec =  pairmaker.getPairsVector();
    //    for(UInt_t l = 0; l < pairsVec.size(); l++ ){
    //        HParticlePair& pair = pairsVec[l];
    //
    //        if(HParticleTool::evalPairsFlags(kPairCase1,pair)){
    //    	cout<<"case1"<<endl;
    //        } else if(HParticleTool::evalPairsFlags(kPairCase2,pair)){
    //    	cout<<"case2"<<endl;
    //        } else if(HParticleTool::evalPairsFlags(kPairCase3,pair)){
    //    	cout<<"case3"<<endl;
    //        } else if(HParticleTool::evalPairsFlags(kPairCase4,pair)){
    //    	cout<<"case4"<<endl;
    //        } else if(HParticleTool::evalPairsFlags(kPairCase5,pair)){
    //    	cout<<"case5"<<endl;
    //        } else if(HParticleTool::evalPairsFlags(kPairCase6,pair)){
    //    	cout<<"case6"<<endl;
    //        } else if(HParticleTool::evalPairsFlags(kPairCase7,pair)){
    //    	cout<<"case7"<<endl;
    //        } else if(HParticleTool::evalPairsFlags(kPairCase8,pair)){
    //    	cout<<"case8"<<endl;
    //        } else if(HParticleTool::evalPairsFlags(kPairCase9,pair)){
    //    	cout<<"case9"<<endl;
    //        } else if(HParticleTool::evalPairsFlags(kPairCase10,pair)){
    //    	cout<<"case10"<<endl;
    //        } else if(HParticleTool::evalPairsFlags(kPairCase11,pair)){
    //   	cout<<"case11"<<endl;
    //        }
    //    }
    //    //--------------------------------------------------------------------------
    //    //###########################################################################
    //   }  // end event loop
    // }
////////////////////////////////////////////////////////////////////////////////

Bool_t HParticlePairMaker::frequireRich = kTRUE;

HParticlePairMaker::HParticlePairMaker()
{
    fPID1      = HPhysicsConstants::pid("e+");
    fPID2      = HPhysicsConstants::pid("e-");
    fMotherPID = HPhysicsConstants::pid("dilepton");
    fselectPID1 = 0;
    fselectPID2 = 0;
    fuserFilter = 0;
    fuse_kIsLepton = kTRUE;
    fVertexCase = kVertexParticle ;
    fdoSkippedFullCandPairs = kTRUE;
    fpairs    .resize(10000);
    fothers   .resize(1000);
    ffullrecoOthers   .resize(100);
    fnofullrecoOthers .resize(1000);
    freference.resize(100);


    fCaseVec.push_back(kPairCase1);
    fCaseVec.push_back(kPairCase2);
    fCaseVec.push_back(kPairCase3);
    fCaseVec.push_back(kPairCase4);
    fCaseVec.push_back(kPairCase5);
    fCaseVec.push_back(kPairCase6);
    fCaseVec.push_back(kPairCase7);
    fCaseVec.push_back(kPairCase8);
    fCaseVec.push_back(kPairCase9);
    fCaseVec.push_back(kPairCase10);
    fCaseVec.push_back(kPairCase11);
    fCaseVec.push_back(kPairCase12);
    fCaseVec.push_back(kPairCase13);
    fCaseVec.push_back(kPairCase14);
    fCaseVec.push_back(kPairCase15);

    for(UInt_t i=0;i<fCaseVec.size();i++) fCaseCt.push_back(0);
    richCandCt = 0 ;
}

HParticlePairMaker::~HParticlePairMaker()
{
     clearVectors();
}

Bool_t HParticlePairMaker::selectPos(HParticleCand* cand)
{
    // standard function for positrons
    // require richmatch (broad window,  frequireRich =kTRUE)
    // Select positive polatity

    if(getRequireRich() && cand->getRichInd() == -1) return kFALSE;

    if( cand->getCharge() > 0 ) return kTRUE;
    else                        return kFALSE;
}

Bool_t HParticlePairMaker::selectNeg(HParticleCand* cand)
{
    // standard function for electrons
    // require richmatch (broad window,  frequireRich =kTRUE)
    // Select negative polatity

    if(getRequireRich() && cand->getRichInd() == -1) return kFALSE;

    if( cand->getCharge() < 0 ) return kTRUE;
    else                        return kFALSE;
}

void HParticlePairMaker::bookHits(HParticleCand* cand1)
{
    // add candidate hits to maps

    if(cand1->getRichInd() !=-1 ) {
	if(mRichtoCand.find(cand1->getRichInd()) == mRichtoCand.end()){
	    vector<HParticleCand*> v;
	    v.push_back(cand1);
	    mRichtoCand[cand1->getRichInd()] = v;
	} else {
	    mRichtoCand[cand1->getRichInd()].push_back(cand1);
	}
    }

    if(cand1->getInnerSegInd() !=-1 ) {
	if(mInnerMdctoCand.find(cand1->getInnerSegInd()) == mInnerMdctoCand.end()){
	    vector<HParticleCand*> v;
	    v.push_back(cand1);
	    mInnerMdctoCand[cand1->getInnerSegInd()] = v;
	} else {
	    mInnerMdctoCand[cand1->getInnerSegInd()].push_back(cand1);
	}
    }

    if(cand1->getOuterSegInd() !=-1 ) {
	if(mOuterMdctoCand.find(cand1->getOuterSegInd()) == mOuterMdctoCand.end()){
	    vector<HParticleCand*> v;
	    v.push_back(cand1);
	    mOuterMdctoCand[cand1->getOuterSegInd()] = v;
	} else {
	    mOuterMdctoCand[cand1->getOuterSegInd()].push_back(cand1);
	}
    }

    if(cand1->getSystemUsed() != -1){
	Int_t meta = cand1->getMetaHitInd();
	if(cand1->isTofHitUsed()){
	    if(mTofHittoCand.find(meta) == mTofHittoCand.end()){
		vector<HParticleCand*> v;
		v.push_back(cand1);
		mTofHittoCand[meta] = v;
	    } else {
		mTofHittoCand[meta].push_back(cand1);
	    }
	} else if (cand1->isTofClstUsed()){
	    if(mTofClsttoCand.find(meta) == mTofClsttoCand.end()){
		vector<HParticleCand*> v;
		v.push_back(cand1);
		mTofClsttoCand[meta] = v;
	    } else {
		mTofClsttoCand[meta].push_back(cand1);
	    }
	} else if (cand1->isRpcClstUsed()){
	    if(mRpcClsttoCand.find(meta) == mRpcClsttoCand.end()){
		vector<HParticleCand*> v;
		v.push_back(cand1);
		mRpcClsttoCand[meta] = v;
	    } else {
		mRpcClsttoCand[meta].push_back(cand1);
	    }
	} else if (cand1->isShowerUsed()){
	    if(mShowertoCand.find(meta) == mShowertoCand.end()){
		vector<HParticleCand*> v;
		v.push_back(cand1);
		mShowertoCand[meta] = v;
	    } else {
		mShowertoCand[meta].push_back(cand1);
	    }
	} else if (cand1->isEmcUsed()){
	    if(mEmctoCand.find(meta) == mEmctoCand.end()){
		vector<HParticleCand*> v;
		v.push_back(cand1);
		mEmctoCand[meta] = v;
	    } else {
		mEmctoCand[meta].push_back(cand1);
	    }
	}
    }
}
void HParticlePairMaker::selectPID(HParticleCand* cand1,Int_t& pid1,Bool_t warn)
{
    if(       (*fselectPID1)(cand1) ) { pid1 = fPID1;}    // one of the 2 functions should set the PID1 , take care about others!
    else if  ((*fselectPID2)(cand1) ) { pid1 = fPID2;}
    else     {
	if(warn){
	    Warning("nextEvent()","Reference particle not labeled with PID! Should not happen. Check your selection functions. frequireRich = kTRUE but kIsLepton is not used as referencce this might cause empty pids.");
	    cand1->print();
	}
    }
}

void HParticlePairMaker::nextEvent()
{
    // to be called inside eventloop after HParticleSorter selection.
    // 1. clear all internal structures
    // 2. fill vector freference by candidates which are flagged kIsLepton
    //    All other candidates are added to vector fothers
    // 3. created all pair combinations between freference and fothers which
    //    a. pass the selectPID1 and selectPID2 functions
    //       will get pid1 or pid2 assigned. Otherwise pid is -2(fake+), -1(fake-) (see HPhysicsConstants).
    //       if pid2 fails it will get pid assigend opposite to reference cand in pairCase10.
    //       fakes for pid2 will be assigned by polarity or opposite to reference cand.
    //    b. eClosePairSelect flags will be set for each pair.
    //       This flags can be used later to classify the pairs.
    //    c. pairs are inserted in fpairs vector.


    clearVectors();

    if(!fselectPID1) fselectPID1 = HParticlePairMaker::selectPos;
    if(!fselectPID2) fselectPID2 = HParticlePairMaker::selectNeg;

    HRecEvent* event = (HRecEvent*)gHades->getCurrentEvent();
    if(event){
	if(fVertexCase != kVertexUser){
	    fVertex = HParticleTool::getGlobalVertex(fVertexCase,kFALSE);
	}

	HCategory* candCat = (HCategory*) event->getCategory(catParticleCand);
	if(candCat){
	    UInt_t n = candCat->getEntries();
	    HParticleCand* cand1 = 0 ;
	    HParticleCand* cand2 = 0 ;
	    //-------------------------------------------------------
	    // fill lists for reference and others
	    for(UInt_t i=0; i < n; i++){
		cand1 = HCategoryManager::getObject(cand1,candCat,i);

		//-------------------------------------------------------
		//  book the hits -> candiate lists
		bookHits(cand1);
		//-------------------------------------------------------

		if(cand1){

		    if(fuserFilter && !(*fuserFilter)(cand1)) continue;


		    if(( fuse_kIsLepton && cand1->isFlagBit(Particle::kIsLepton)) ||
		       (!fuse_kIsLepton && cand1->isFlagBit(Particle::kIsUsed))
		      ){
			freference.push_back(cand1);
		    } else {
			fothers.push_back(cand1);
		    }
		}
	    } // end fill list loop
	    //-------------------------------------------------------


	    //-------------------------------------------------------
	    //  create pair combinations
	    Int_t pid1,pid2;
	    pid1 = pid2 = -10;

	    //-------------------------------------------------------
	    //  first do good pairs from reference x reference candidates

	    n = freference.size();
	    if(n > 1){
		for(UInt_t i = 0 ; i < n ; i++){
		    cand1 = freference[i];
		    pid1 = -10;

		    selectPID(cand1,pid1,kTRUE);

		    for(UInt_t j = i+1 ; j < n; j++){
			cand2 = freference[j];
			if(cand2->getRichInd()!=-1) richCandCt++;
			UInt_t flag = 0;
			HParticleTool::setPairFlags(flag,cand2,cand1);

			if(!fuse_kIsLepton) flag=flag|kNoUseRICH;

			pid2 = -10;

			selectPID(cand2,pid2,kTRUE);

			HParticlePair pair;
			pair.setPair(cand1,pid1,cand2,pid2,fMotherPID,flag,fVertex);
			fpairs.push_back(pair);

		    } // end loop others
		} // end loop reference x reference
	    }
	    //-------------------------------------------------------

	    //-------------------------------------------------------
	    // now do all pairs reference x other candidates
	    for(UInt_t i = 0 ; i < freference.size(); i++){
		cand1 = freference[i];
		pid1 = -10;

		selectPID(cand1,pid1,kTRUE);

		for(UInt_t j = 0 ; j < fothers.size(); j++){
		    cand2 = fothers[j];
		    if(cand2->getRichInd()!=-1) richCandCt++;
		    UInt_t flag = 0;
		    HParticleTool::setPairFlags(flag,cand2,cand1);

		    if(!fuse_kIsLepton) flag=flag|kNoUseRICH;

		    pid2 = -10;
		    if(        pid1 == fPID2 && (*fselectPID1)(cand2) ) { pid2 = fPID1;}  // PID2 could fail no polarity is defined
		    else if  ( pid1 == fPID1 && (*fselectPID2)(cand2) ) { pid2 = fPID2;}

		    if(pid2 == -10){

			if((flag&kNoOuterMDC2) == kNoOuterMDC2) {
			    // in this case polarity is not defined
			    // selectPID will fail, but we want to set
			    // pid2 in this case

			    if(pid1 == fPID1) pid2 = fPID2;
			    else              pid2 = fPID1;
			}
		    }

		    if(pid2 == -10) { // all cases with no RICH
			if(cand2->getCharge() != 0){
			    if(cand2->getCharge() > 0) pid2 =  HPhysicsConstants::pid("fake+");
			    else                       pid2 =  HPhysicsConstants::pid("fake-");
			} else {
			    if(HPhysicsConstants::charge(pid1) < 0 ) pid2 =  HPhysicsConstants::pid("fake+");
			    else                                     pid2 =  HPhysicsConstants::pid("fake-");
			}

		    }

		    HParticlePair pair;
		    pair.setPair(cand1,pid1,cand2,pid2,fMotherPID,flag,fVertex);
		    fpairs.push_back(pair);
		    //#define dbug
#ifdef  dbug
		    Int_t ct = 0 ;
		    for(UInt_t k = 0; k < fCaseVec.size(); k ++){   // fill statistics for pair cases
			if(HParticleTool::evalPairsFlags(fCaseVec[k],pair) || cand2->getRichInd()==-1) {
			    good2=kTRUE;
			    if(cand2->getRichInd()!=-1) ct++;
			}
		    }
		    if(!good2 || ct>1) pair.print();
#endif
		} // end loop others
	    } // end loop reference
	    //-------------------------------------------------------




	    if(fdoSkippedFullCandPairs)
	    {
                
		//-------------------------------------------------------
		// now do all pairs full reco of others x no full reco other candidates and fullreco others X full reco others
                for(UInt_t j = 0 ; j < fothers.size(); j++){
                    HParticleCand* c = fothers[j];
                    if(c->isFlagAND(4,                                 // Fully reconstructed
				    Particle::kIsAcceptedHitInnerMDC,
				    Particle::kIsAcceptedHitOuterMDC,
				    Particle::kIsAcceptedHitMETA,
				    Particle::kIsAcceptedRK )){
                          ffullrecoOthers.push_back(c);
		    } else {
                          fnofullrecoOthers.push_back(c);
		    }
		}

		//-------------------------------------------------------
                //fullreco others X full reco others
		for(UInt_t i = 0 ; i < ffullrecoOthers.size(); i++){
		    cand1 = ffullrecoOthers[i];
		    pid1 = -10;

		    selectPID(cand1,pid1,kTRUE);

		    for(UInt_t j = i+1 ; j < ffullrecoOthers.size(); j++){
			cand2 = ffullrecoOthers[j];
			UInt_t flag = 0;
			HParticleTool::setPairFlags(flag,cand2,cand1);

			if(!fuse_kIsLepton) flag=flag|kNoUseRICH;

			pid2 = -10;
			if(        pid1 == fPID2 && (*fselectPID1)(cand2) ) { pid2 = fPID1;}  // PID2 could fail no polarity is defined
			else if  ( pid1 == fPID1 && (*fselectPID2)(cand2) ) { pid2 = fPID2;}

			if(pid2 == -10){

			    if((flag&kNoOuterMDC2) == kNoOuterMDC2) {
				// in this case polarity is not defined
				// selectPID will fail, but we want to set
				// pid2 in this case

				if(pid1 == fPID1) pid2 = fPID2;
				else              pid2 = fPID1;
			    }
			}

			if(pid2 == -10) { // all cases with no RICH
			    if(cand2->getCharge() != 0){
				if(cand2->getCharge() > 0) pid2 =  HPhysicsConstants::pid("fake+");
				else                       pid2 =  HPhysicsConstants::pid("fake-");
			    } else {
				if(HPhysicsConstants::charge(pid1) < 0 ) pid2 =  HPhysicsConstants::pid("fake+");
				else                                     pid2 =  HPhysicsConstants::pid("fake-");
			    }

			}

			HParticlePair pair;
			pair.setPair(cand1,pid1,cand2,pid2,fMotherPID,flag,fVertex);
			fpairs.push_back(pair);

		    } // end loop fullreco
		} // end loop fullreco
		//-------------------------------------------------------

		//-------------------------------------------------------
                //fullreco others X no full reco others
		for(UInt_t i = 0 ; i < ffullrecoOthers.size(); i++){
		    cand1 = ffullrecoOthers[i];
		    pid1 = -10;

		    selectPID(cand1,pid1,kTRUE);

		    for(UInt_t j = 0 ; j < fnofullrecoOthers.size(); j++){
			cand2 = fnofullrecoOthers[j];
			UInt_t flag = 0;
			HParticleTool::setPairFlags(flag,cand2,cand1);

			if(!fuse_kIsLepton) flag=flag|kNoUseRICH;

			pid2 = -10;
			if(        pid1 == fPID2 && (*fselectPID1)(cand2) ) { pid2 = fPID1;}  // PID2 could fail no polarity is defined
			else if  ( pid1 == fPID1 && (*fselectPID2)(cand2) ) { pid2 = fPID2;}

			if(pid2 == -10){

			    if((flag&kNoOuterMDC2) == kNoOuterMDC2) {
				// in this case polarity is not defined
				// selectPID will fail, but we want to set
				// pid2 in this case

				if(pid1 == fPID1) pid2 = fPID2;
				else              pid2 = fPID1;
			    }
			}

			if(pid2 == -10) { // all cases with no RICH
			    if(cand2->getCharge() != 0){
				if(cand2->getCharge() > 0) pid2 =  HPhysicsConstants::pid("fake+");
				else                       pid2 =  HPhysicsConstants::pid("fake-");
			    } else {
				if(HPhysicsConstants::charge(pid1) < 0 ) pid2 =  HPhysicsConstants::pid("fake+");
				else                                     pid2 =  HPhysicsConstants::pid("fake-");
			    }

			}

			HParticlePair pair;
			pair.setPair(cand1,pid1,cand2,pid2,fMotherPID,flag,fVertex);
			fpairs.push_back(pair);

		    } // end loop fullnoreco
		} // end loop fullreco
		//-------------------------------------------------------

	    }  // end fdoSkippedFullCandPairs


	    //-------------------------------------------------------
	    //  book the candidate -> pair lists
	    for(UInt_t i = 0; i < fpairs.size(); i++){
		HParticlePair* pair = &(fpairs[i]);
		cand1 = dynamic_cast<HParticleCand*>(pair->getCand(0));
		cand2 = dynamic_cast<HParticleCand*>(pair->getCand(1));


		//-------------------------------------------------------
		// fill statistics for pair cases
		for(UInt_t k = 0; k < fCaseVec.size(); k ++){
		    if(HParticleTool::evalPairsFlags(fCaseVec[k],*pair)) {
			fCaseCt[k]++;
		    }
		}
		//-------------------------------------------------------


		if(mCandtoPair.find(cand1) == mCandtoPair.end()){
		    vector<HParticlePair*> pairs;
		    pairs.push_back(pair);
		    mCandtoPair[cand1] = pairs;
		} else {
		    mCandtoPair[cand1].push_back(pair);
		}
		if(mCandtoPair.find(cand2) == mCandtoPair.end()){
		    vector<HParticlePair*> pairs;
		    pairs.push_back(pair);
		    mCandtoPair[cand2] = pairs;
		} else {
		    mCandtoPair[cand2].push_back(pair);
		}
	    }
	    //-------------------------------------------------------

	}

    }
}

void HParticlePairMaker::clearVectors()
{
    // clear all internal vectors etc
    freference     .clear();
    fothers        .clear();
    fpairs         .clear();
    ffullrecoOthers.clear();
    fnofullrecoOthers.clear();

    mTofHittoCand  .clear();
    mTofClsttoCand .clear();
    mRpcClsttoCand .clear();
    mShowertoCand  .clear();
    mEmctoCand     .clear();
    mInnerMdctoCand.clear();
    mOuterMdctoCand.clear();
    mRichtoCand    .clear();
    mCandtoPair    .clear();
}

void HParticlePairMaker::filterPairsVector(vector<HParticlePair*>& filterpairs,UInt_t flag)
{
    // fill all pairs which fullfill the flag to filterspairs.
    // filterpairs will be cleared automatically before filling.
    filterpairs.clear();
    for(UInt_t i = 0; i < fpairs.size(); i++){
        HParticlePair& pair = fpairs[i];
	if(HParticleTool::evalPairsFlags(flag,pair)){
	    filterpairs.push_back(&pair);
	}
    }
}
void HParticlePairMaker::filterPairsVector(vector<HParticlePair*>& filterpairs,vector<UInt_t>& flags)
{
    // fill all pairs which fullfill the flags to filterspairs.
    // filterpairs will be cleared automatically before filling.
    filterpairs.clear();
    for(UInt_t i = 0; i < fpairs.size(); i++){
        HParticlePair& pair = fpairs[i];
	if(HParticleTool::evalPairsFlags(flags,pair)){
	    filterpairs.push_back(&pair);
	}
    }
}

Int_t HParticlePairMaker::filterCandidates(HVirtualCand* cand,vector<HVirtualCand*>& candidates,UInt_t flag,Float_t oAngle)
{
    // vector candidates with all candidates which have been combined into pairs.
    // if flag == 0 no filtering will be done. Filtering takes place on pairs.
    // Flag can be used to filter for candidates which share 1 or more detector
    // hits with the candidate (see flags eClosePairSelect+ ePairCase (hparticledef.h)).
    // In addition a filter of opening Angle of the track can be applied (oAngle < 0 does no selection)
    // The function returns the number of found candidates or -1 if the candidate
    // has not been found at all (should not happen).

    candidates.clear();

    map<HVirtualCand*,vector<HParticlePair*> >::iterator it = mCandtoPair.find(cand);
    if(it != mCandtoPair.end()){
	vector<HParticlePair*>& v = it->second;

	for(UInt_t i = 0 ; i < v.size(); i++){
            HParticlePair& pair = *(v[i]);
	    if(HParticleTool::evalPairsFlags(flag,pair) && (oAngle < 0 || pair.getOpeningAngle() < oAngle )){

		if(pair.getCand(0) == cand) candidates.push_back(pair.getCand(1));
                else                        candidates.push_back(pair.getCand(0));
	    }
	}

       return candidates.size();
    }
    return -1;
}

Int_t HParticlePairMaker::filterCandidates (HVirtualCand* cand,vector<HParticlePair*>& filterpairs,UInt_t flag,Float_t oAngle)
{
    // Fills vector filterpairs with all pairs which share cand.
    // if flag == 0 no filtering will be done. Filtering takes place on pairs.
    // Flag can be used to filter for candidates which share 1 or more detector
    // hits with the candidate (see flags eClosePairSelect+ ePairCase (hparticledef.h)).
    // In addition a filter of opening Angle of the track can be applied (oAngle < 0 does no selection)
    // The function returns the number of found pairs or -1 if the candidate
    // has not been found at all (should not happen).

    filterpairs.clear();
    map<HVirtualCand*,vector<HParticlePair*> >::iterator it = mCandtoPair.find(cand);
    if(it != mCandtoPair.end()){
	vector<HParticlePair*>& v = it->second;
        for(UInt_t i = 0 ; i < v.size(); i++){

            if(HParticleTool::evalPairsFlags(flag,*(v[i])) && ( oAngle < 0 || v[i]->getOpeningAngle() < oAngle) ){
		filterpairs.push_back(v[i]);
	    }
	}

    } else return -1;

    return filterpairs.size();

}


Int_t HParticlePairMaker::getSameRich(HParticleCand* cand,vector<HParticleCand*>& candidates,UInt_t flag,Bool_t isReference)
{
    // fills list of candidates which share the same RICH. If the RICH is not found
    // at all -1 is returned, other wise the number of candidates found for the hit.
    // The input candidate will be not included in candidates. Candidates can be filtered
    // by flag ( 0 == no filter, see flags eClosePairSelect+ ePairCase (hparticledef.h)).
    // The input candidate will be treated as refererence if isReference == kTRUE.

    candidates.clear();
    if(cand->getRichInd() !=-1 ){
	map<Int_t,vector<HParticleCand*> >::iterator it = mRichtoCand.find(cand->getRichInd());
        if(it != mRichtoCand.end()){
	    vector<HParticleCand*>& v = it->second;
	    for(UInt_t i = 0 ; i < v.size(); i++){

		if(v[i] != cand) {  // skip same cand
		    if(flag == 0 ) candidates.push_back(v[i]);
		    else {
			Bool_t fl = kFALSE;
			if(!isReference) fl=HParticleTool::evalPairsFlags(fl,cand,v[i]);
			else             fl=HParticleTool::evalPairsFlags(fl,v[i],cand);
			if(fl){
			    candidates.push_back(v[i]);
			}
		    }
		}
	    } //end loop
	} else return -1;
    }
    return candidates.size();
}

Int_t HParticlePairMaker::getSameInnerMdc(HParticleCand* cand,vector<HParticleCand*>& candidates,UInt_t flag,Bool_t isReference)
{
    // fills list of candidates which share the same inner MDC seg. If the seg is not found
    // at all -1 is returned, other wise the number of candidates found for the hit.
    // The input candidate will be not included in candidates. Candidates can be filtered
    // by flag ( 0 == no filter, see flags eClosePairSelect+ ePairCase (hparticledef.h)).
    // The input candidate will be treated as refererence if isReference == kTRUE.

    candidates.clear();
    if(cand->getInnerSegInd() !=-1 ){
	map<Int_t,vector<HParticleCand*> >::iterator it = mInnerMdctoCand.find(cand->getInnerSegInd());
        if(it != mInnerMdctoCand.end()){
	    vector<HParticleCand*>& v = it->second;
	    for(UInt_t i = 0 ; i < v.size(); i++){

		if(v[i] != cand) {  // skip same cand
		    if(flag == 0 ) candidates.push_back(v[i]);
		    else {
			Bool_t fl = kFALSE;
			if(!isReference) fl=HParticleTool::evalPairsFlags(fl,cand,v[i]);
			else             fl=HParticleTool::evalPairsFlags(fl,v[i],cand);
			if(fl){
			    candidates.push_back(v[i]);
			}
		    }
		}
	    } //end loop
	} else return -1;
    }
    return candidates.size();
}

Int_t HParticlePairMaker::getSameOuterMdc(HParticleCand* cand,vector<HParticleCand*>& candidates,UInt_t flag,Bool_t isReference)
{
    // fills list of candidates which share the same outer MDC seg. If the seg is not found
    // at all -1 is returned, other wise the number of candidates found for the hit.
    // The input candidate will be not included in candidates. Candidates can be filtered
    // by flag ( 0 == no filter, see flags eClosePairSelect+ ePairCase (hparticledef.h)).
    // The input candidate will be treated as refererence if isReference == kTRUE.

    candidates.clear();
    if(cand->getOuterSegInd() !=-1 ){
	map<Int_t,vector<HParticleCand*> >::iterator it = mOuterMdctoCand.find(cand->getOuterSegInd());
        if(it != mOuterMdctoCand.end()){
	    vector<HParticleCand*>& v = it->second;
	    for(UInt_t i = 0 ; i < v.size(); i++){

		if(v[i] != cand) {  // skip same cand
		    if(flag == 0 ) candidates.push_back(v[i]);
		    else {
			Bool_t fl = kFALSE;
			if(!isReference) fl=HParticleTool::evalPairsFlags(fl,cand,v[i]);
			else             fl=HParticleTool::evalPairsFlags(fl,v[i],cand);
			if(fl){
			    candidates.push_back(v[i]);
			}
		    }
		}
	    } //end loop
	} else return -1;
    }
    return candidates.size();
}

Int_t HParticlePairMaker::getSameMeta(HParticleCand* cand,vector<HParticleCand*>& candidates,UInt_t flag,Bool_t isReference)
{
    // fills list of candidates which share the same META hit. The number of candidates
    // found for the hit is returned or -1 if the hit is not found at all..
    // The input candidate will be not included in candidates. Candidates can be filtered
    // by flag ( 0 == no filter, see flags eClosePairSelect+ ePairCase (hparticledef.h)).
    // The input candidate will be treated as refererence if isReference == kTRUE.

    candidates.clear();

    Int_t metaind = cand->getMetaHitInd();
    Int_t sel     = cand->getSelectedMeta();

    if(metaind != -1 ){
        map<Int_t,vector<HParticleCand*> >* mp =0;

	if     (sel == kTofClst)           mp = &mTofClsttoCand;
        else if(sel == kTofHit1||sel==kTofHit2) mp = &mTofHittoCand;
        else if(sel == kRpcClst)           mp = &mRpcClsttoCand;
        else if(sel == kShowerHit)         mp = &mShowertoCand;
        else if(sel == kEmcClst)           mp = &mEmctoCand;
	else  {
	    Error("getSameMeta()","unknown Meta case!"); return 0;
	}
        map<Int_t,vector<HParticleCand*> >::iterator it = mp->find(metaind);

	if(it != mp->end()){
	    vector<HParticleCand*>& v = it->second;
	    for(UInt_t i = 0 ; i < v.size(); i++){

		if(v[i] != cand) {  // skip same cand
		    if(flag == 0 ) candidates.push_back(v[i]);
		    else {
			Bool_t fl = kFALSE;
			if(!isReference) fl=HParticleTool::evalPairsFlags(fl,cand,v[i]);
			else             fl=HParticleTool::evalPairsFlags(fl,v[i],cand);
			if(fl){
			    candidates.push_back(v[i]);
			}
		    }
		}
	    } //end loop
	} else return -1;
    } 
    return candidates.size();
}

void  HParticlePairMaker::plotPairCaseStat()
{
    // draws the fraction of pair cases for
    // the default pairCases1...12.

    TCanvas* c = new TCanvas("pairCase","pairCase",1500,800);
    c->SetGridx();
    c->SetGridy();
    c->SetBottomMargin(0.15);

    UInt_t bins = fCaseVec.size();

    TH1F* h = new TH1F("h","",bins,0,bins);
    h->SetLineColor(kRed);
    h->SetLineWidth(3);
    h->SetYTitle("Fraction of pairs [%]");
    h->GetXaxis()->SetNdivisions(100+bins);
    h->GetXaxis()->SetLabelSize(0);

    h->GetYaxis()->SetRangeUser(0.,50.);
    Float_t sum = 0;
    for(UInt_t i=0;i<bins;i++)  sum+=fCaseCt[i];

    cout<<"Pairs Cases for Leptons :"<<endl;
    for(UInt_t i=0;i<bins;i++){
	Float_t frac = 0;
	if(sum != 0) frac = (fCaseCt[i]/sum)*100.;
        if(sum !=0 ) h->Fill(i,frac);
	cout<<Form("case%2i : ",i+1)<<setw(15)<< frac << " cts "<<setw(15)<<fCaseCt[i]<<endl;

    }
    h->Draw();

    Double_t offsetX  = 0.25;
    Double_t offsetY  =   -8;
    Double_t scaleX   = 1.;
    Double_t scaleY   = 1.;

    HParticlePairDraw pairdraw;

    for(UInt_t i=0; i < bins; i++){
	pairdraw.drawPair(offsetX+i,offsetY,scaleX,scaleY,fCaseVec[i],Form("Case%i",i+1),"");
    }
    cout<<"sum "<<sum<< " check " <<richCandCt<<endl;
}

 hparticlepairmaker.cc:1
 hparticlepairmaker.cc:2
 hparticlepairmaker.cc:3
 hparticlepairmaker.cc:4
 hparticlepairmaker.cc:5
 hparticlepairmaker.cc:6
 hparticlepairmaker.cc:7
 hparticlepairmaker.cc:8
 hparticlepairmaker.cc:9
 hparticlepairmaker.cc:10
 hparticlepairmaker.cc:11
 hparticlepairmaker.cc:12
 hparticlepairmaker.cc:13
 hparticlepairmaker.cc:14
 hparticlepairmaker.cc:15
 hparticlepairmaker.cc:16
 hparticlepairmaker.cc:17
 hparticlepairmaker.cc:18
 hparticlepairmaker.cc:19
 hparticlepairmaker.cc:20
 hparticlepairmaker.cc:21
 hparticlepairmaker.cc:22
 hparticlepairmaker.cc:23
 hparticlepairmaker.cc:24
 hparticlepairmaker.cc:25
 hparticlepairmaker.cc:26
 hparticlepairmaker.cc:27
 hparticlepairmaker.cc:28
 hparticlepairmaker.cc:29
 hparticlepairmaker.cc:30
 hparticlepairmaker.cc:31
 hparticlepairmaker.cc:32
 hparticlepairmaker.cc:33
 hparticlepairmaker.cc:34
 hparticlepairmaker.cc:35
 hparticlepairmaker.cc:36
 hparticlepairmaker.cc:37
 hparticlepairmaker.cc:38
 hparticlepairmaker.cc:39
 hparticlepairmaker.cc:40
 hparticlepairmaker.cc:41
 hparticlepairmaker.cc:42
 hparticlepairmaker.cc:43
 hparticlepairmaker.cc:44
 hparticlepairmaker.cc:45
 hparticlepairmaker.cc:46
 hparticlepairmaker.cc:47
 hparticlepairmaker.cc:48
 hparticlepairmaker.cc:49
 hparticlepairmaker.cc:50
 hparticlepairmaker.cc:51
 hparticlepairmaker.cc:52
 hparticlepairmaker.cc:53
 hparticlepairmaker.cc:54
 hparticlepairmaker.cc:55
 hparticlepairmaker.cc:56
 hparticlepairmaker.cc:57
 hparticlepairmaker.cc:58
 hparticlepairmaker.cc:59
 hparticlepairmaker.cc:60
 hparticlepairmaker.cc:61
 hparticlepairmaker.cc:62
 hparticlepairmaker.cc:63
 hparticlepairmaker.cc:64
 hparticlepairmaker.cc:65
 hparticlepairmaker.cc:66
 hparticlepairmaker.cc:67
 hparticlepairmaker.cc:68
 hparticlepairmaker.cc:69
 hparticlepairmaker.cc:70
 hparticlepairmaker.cc:71
 hparticlepairmaker.cc:72
 hparticlepairmaker.cc:73
 hparticlepairmaker.cc:74
 hparticlepairmaker.cc:75
 hparticlepairmaker.cc:76
 hparticlepairmaker.cc:77
 hparticlepairmaker.cc:78
 hparticlepairmaker.cc:79
 hparticlepairmaker.cc:80
 hparticlepairmaker.cc:81
 hparticlepairmaker.cc:82
 hparticlepairmaker.cc:83
 hparticlepairmaker.cc:84
 hparticlepairmaker.cc:85
 hparticlepairmaker.cc:86
 hparticlepairmaker.cc:87
 hparticlepairmaker.cc:88
 hparticlepairmaker.cc:89
 hparticlepairmaker.cc:90
 hparticlepairmaker.cc:91
 hparticlepairmaker.cc:92
 hparticlepairmaker.cc:93
 hparticlepairmaker.cc:94
 hparticlepairmaker.cc:95
 hparticlepairmaker.cc:96
 hparticlepairmaker.cc:97
 hparticlepairmaker.cc:98
 hparticlepairmaker.cc:99
 hparticlepairmaker.cc:100
 hparticlepairmaker.cc:101
 hparticlepairmaker.cc:102
 hparticlepairmaker.cc:103
 hparticlepairmaker.cc:104
 hparticlepairmaker.cc:105
 hparticlepairmaker.cc:106
 hparticlepairmaker.cc:107
 hparticlepairmaker.cc:108
 hparticlepairmaker.cc:109
 hparticlepairmaker.cc:110
 hparticlepairmaker.cc:111
 hparticlepairmaker.cc:112
 hparticlepairmaker.cc:113
 hparticlepairmaker.cc:114
 hparticlepairmaker.cc:115
 hparticlepairmaker.cc:116
 hparticlepairmaker.cc:117
 hparticlepairmaker.cc:118
 hparticlepairmaker.cc:119
 hparticlepairmaker.cc:120
 hparticlepairmaker.cc:121
 hparticlepairmaker.cc:122
 hparticlepairmaker.cc:123
 hparticlepairmaker.cc:124
 hparticlepairmaker.cc:125
 hparticlepairmaker.cc:126
 hparticlepairmaker.cc:127
 hparticlepairmaker.cc:128
 hparticlepairmaker.cc:129
 hparticlepairmaker.cc:130
 hparticlepairmaker.cc:131
 hparticlepairmaker.cc:132
 hparticlepairmaker.cc:133
 hparticlepairmaker.cc:134
 hparticlepairmaker.cc:135
 hparticlepairmaker.cc:136
 hparticlepairmaker.cc:137
 hparticlepairmaker.cc:138
 hparticlepairmaker.cc:139
 hparticlepairmaker.cc:140
 hparticlepairmaker.cc:141
 hparticlepairmaker.cc:142
 hparticlepairmaker.cc:143
 hparticlepairmaker.cc:144
 hparticlepairmaker.cc:145
 hparticlepairmaker.cc:146
 hparticlepairmaker.cc:147
 hparticlepairmaker.cc:148
 hparticlepairmaker.cc:149
 hparticlepairmaker.cc:150
 hparticlepairmaker.cc:151
 hparticlepairmaker.cc:152
 hparticlepairmaker.cc:153
 hparticlepairmaker.cc:154
 hparticlepairmaker.cc:155
 hparticlepairmaker.cc:156
 hparticlepairmaker.cc:157
 hparticlepairmaker.cc:158
 hparticlepairmaker.cc:159
 hparticlepairmaker.cc:160
 hparticlepairmaker.cc:161
 hparticlepairmaker.cc:162
 hparticlepairmaker.cc:163
 hparticlepairmaker.cc:164
 hparticlepairmaker.cc:165
 hparticlepairmaker.cc:166
 hparticlepairmaker.cc:167
 hparticlepairmaker.cc:168
 hparticlepairmaker.cc:169
 hparticlepairmaker.cc:170
 hparticlepairmaker.cc:171
 hparticlepairmaker.cc:172
 hparticlepairmaker.cc:173
 hparticlepairmaker.cc:174
 hparticlepairmaker.cc:175
 hparticlepairmaker.cc:176
 hparticlepairmaker.cc:177
 hparticlepairmaker.cc:178
 hparticlepairmaker.cc:179
 hparticlepairmaker.cc:180
 hparticlepairmaker.cc:181
 hparticlepairmaker.cc:182
 hparticlepairmaker.cc:183
 hparticlepairmaker.cc:184
 hparticlepairmaker.cc:185
 hparticlepairmaker.cc:186
 hparticlepairmaker.cc:187
 hparticlepairmaker.cc:188
 hparticlepairmaker.cc:189
 hparticlepairmaker.cc:190
 hparticlepairmaker.cc:191
 hparticlepairmaker.cc:192
 hparticlepairmaker.cc:193
 hparticlepairmaker.cc:194
 hparticlepairmaker.cc:195
 hparticlepairmaker.cc:196
 hparticlepairmaker.cc:197
 hparticlepairmaker.cc:198
 hparticlepairmaker.cc:199
 hparticlepairmaker.cc:200
 hparticlepairmaker.cc:201
 hparticlepairmaker.cc:202
 hparticlepairmaker.cc:203
 hparticlepairmaker.cc:204
 hparticlepairmaker.cc:205
 hparticlepairmaker.cc:206
 hparticlepairmaker.cc:207
 hparticlepairmaker.cc:208
 hparticlepairmaker.cc:209
 hparticlepairmaker.cc:210
 hparticlepairmaker.cc:211
 hparticlepairmaker.cc:212
 hparticlepairmaker.cc:213
 hparticlepairmaker.cc:214
 hparticlepairmaker.cc:215
 hparticlepairmaker.cc:216
 hparticlepairmaker.cc:217
 hparticlepairmaker.cc:218
 hparticlepairmaker.cc:219
 hparticlepairmaker.cc:220
 hparticlepairmaker.cc:221
 hparticlepairmaker.cc:222
 hparticlepairmaker.cc:223
 hparticlepairmaker.cc:224
 hparticlepairmaker.cc:225
 hparticlepairmaker.cc:226
 hparticlepairmaker.cc:227
 hparticlepairmaker.cc:228
 hparticlepairmaker.cc:229
 hparticlepairmaker.cc:230
 hparticlepairmaker.cc:231
 hparticlepairmaker.cc:232
 hparticlepairmaker.cc:233
 hparticlepairmaker.cc:234
 hparticlepairmaker.cc:235
 hparticlepairmaker.cc:236
 hparticlepairmaker.cc:237
 hparticlepairmaker.cc:238
 hparticlepairmaker.cc:239
 hparticlepairmaker.cc:240
 hparticlepairmaker.cc:241
 hparticlepairmaker.cc:242
 hparticlepairmaker.cc:243
 hparticlepairmaker.cc:244
 hparticlepairmaker.cc:245
 hparticlepairmaker.cc:246
 hparticlepairmaker.cc:247
 hparticlepairmaker.cc:248
 hparticlepairmaker.cc:249
 hparticlepairmaker.cc:250
 hparticlepairmaker.cc:251
 hparticlepairmaker.cc:252
 hparticlepairmaker.cc:253
 hparticlepairmaker.cc:254
 hparticlepairmaker.cc:255
 hparticlepairmaker.cc:256
 hparticlepairmaker.cc:257
 hparticlepairmaker.cc:258
 hparticlepairmaker.cc:259
 hparticlepairmaker.cc:260
 hparticlepairmaker.cc:261
 hparticlepairmaker.cc:262
 hparticlepairmaker.cc:263
 hparticlepairmaker.cc:264
 hparticlepairmaker.cc:265
 hparticlepairmaker.cc:266
 hparticlepairmaker.cc:267
 hparticlepairmaker.cc:268
 hparticlepairmaker.cc:269
 hparticlepairmaker.cc:270
 hparticlepairmaker.cc:271
 hparticlepairmaker.cc:272
 hparticlepairmaker.cc:273
 hparticlepairmaker.cc:274
 hparticlepairmaker.cc:275
 hparticlepairmaker.cc:276
 hparticlepairmaker.cc:277
 hparticlepairmaker.cc:278
 hparticlepairmaker.cc:279
 hparticlepairmaker.cc:280
 hparticlepairmaker.cc:281
 hparticlepairmaker.cc:282
 hparticlepairmaker.cc:283
 hparticlepairmaker.cc:284
 hparticlepairmaker.cc:285
 hparticlepairmaker.cc:286
 hparticlepairmaker.cc:287
 hparticlepairmaker.cc:288
 hparticlepairmaker.cc:289
 hparticlepairmaker.cc:290
 hparticlepairmaker.cc:291
 hparticlepairmaker.cc:292
 hparticlepairmaker.cc:293
 hparticlepairmaker.cc:294
 hparticlepairmaker.cc:295
 hparticlepairmaker.cc:296
 hparticlepairmaker.cc:297
 hparticlepairmaker.cc:298
 hparticlepairmaker.cc:299
 hparticlepairmaker.cc:300
 hparticlepairmaker.cc:301
 hparticlepairmaker.cc:302
 hparticlepairmaker.cc:303
 hparticlepairmaker.cc:304
 hparticlepairmaker.cc:305
 hparticlepairmaker.cc:306
 hparticlepairmaker.cc:307
 hparticlepairmaker.cc:308
 hparticlepairmaker.cc:309
 hparticlepairmaker.cc:310
 hparticlepairmaker.cc:311
 hparticlepairmaker.cc:312
 hparticlepairmaker.cc:313
 hparticlepairmaker.cc:314
 hparticlepairmaker.cc:315
 hparticlepairmaker.cc:316
 hparticlepairmaker.cc:317
 hparticlepairmaker.cc:318
 hparticlepairmaker.cc:319
 hparticlepairmaker.cc:320
 hparticlepairmaker.cc:321
 hparticlepairmaker.cc:322
 hparticlepairmaker.cc:323
 hparticlepairmaker.cc:324
 hparticlepairmaker.cc:325
 hparticlepairmaker.cc:326
 hparticlepairmaker.cc:327
 hparticlepairmaker.cc:328
 hparticlepairmaker.cc:329
 hparticlepairmaker.cc:330
 hparticlepairmaker.cc:331
 hparticlepairmaker.cc:332
 hparticlepairmaker.cc:333
 hparticlepairmaker.cc:334
 hparticlepairmaker.cc:335
 hparticlepairmaker.cc:336
 hparticlepairmaker.cc:337
 hparticlepairmaker.cc:338
 hparticlepairmaker.cc:339
 hparticlepairmaker.cc:340
 hparticlepairmaker.cc:341
 hparticlepairmaker.cc:342
 hparticlepairmaker.cc:343
 hparticlepairmaker.cc:344
 hparticlepairmaker.cc:345
 hparticlepairmaker.cc:346
 hparticlepairmaker.cc:347
 hparticlepairmaker.cc:348
 hparticlepairmaker.cc:349
 hparticlepairmaker.cc:350
 hparticlepairmaker.cc:351
 hparticlepairmaker.cc:352
 hparticlepairmaker.cc:353
 hparticlepairmaker.cc:354
 hparticlepairmaker.cc:355
 hparticlepairmaker.cc:356
 hparticlepairmaker.cc:357
 hparticlepairmaker.cc:358
 hparticlepairmaker.cc:359
 hparticlepairmaker.cc:360
 hparticlepairmaker.cc:361
 hparticlepairmaker.cc:362
 hparticlepairmaker.cc:363
 hparticlepairmaker.cc:364
 hparticlepairmaker.cc:365
 hparticlepairmaker.cc:366
 hparticlepairmaker.cc:367
 hparticlepairmaker.cc:368
 hparticlepairmaker.cc:369
 hparticlepairmaker.cc:370
 hparticlepairmaker.cc:371
 hparticlepairmaker.cc:372
 hparticlepairmaker.cc:373
 hparticlepairmaker.cc:374
 hparticlepairmaker.cc:375
 hparticlepairmaker.cc:376
 hparticlepairmaker.cc:377
 hparticlepairmaker.cc:378
 hparticlepairmaker.cc:379
 hparticlepairmaker.cc:380
 hparticlepairmaker.cc:381
 hparticlepairmaker.cc:382
 hparticlepairmaker.cc:383
 hparticlepairmaker.cc:384
 hparticlepairmaker.cc:385
 hparticlepairmaker.cc:386
 hparticlepairmaker.cc:387
 hparticlepairmaker.cc:388
 hparticlepairmaker.cc:389
 hparticlepairmaker.cc:390
 hparticlepairmaker.cc:391
 hparticlepairmaker.cc:392
 hparticlepairmaker.cc:393
 hparticlepairmaker.cc:394
 hparticlepairmaker.cc:395
 hparticlepairmaker.cc:396
 hparticlepairmaker.cc:397
 hparticlepairmaker.cc:398
 hparticlepairmaker.cc:399
 hparticlepairmaker.cc:400
 hparticlepairmaker.cc:401
 hparticlepairmaker.cc:402
 hparticlepairmaker.cc:403
 hparticlepairmaker.cc:404
 hparticlepairmaker.cc:405
 hparticlepairmaker.cc:406
 hparticlepairmaker.cc:407
 hparticlepairmaker.cc:408
 hparticlepairmaker.cc:409
 hparticlepairmaker.cc:410
 hparticlepairmaker.cc:411
 hparticlepairmaker.cc:412
 hparticlepairmaker.cc:413
 hparticlepairmaker.cc:414
 hparticlepairmaker.cc:415
 hparticlepairmaker.cc:416
 hparticlepairmaker.cc:417
 hparticlepairmaker.cc:418
 hparticlepairmaker.cc:419
 hparticlepairmaker.cc:420
 hparticlepairmaker.cc:421
 hparticlepairmaker.cc:422
 hparticlepairmaker.cc:423
 hparticlepairmaker.cc:424
 hparticlepairmaker.cc:425
 hparticlepairmaker.cc:426
 hparticlepairmaker.cc:427
 hparticlepairmaker.cc:428
 hparticlepairmaker.cc:429
 hparticlepairmaker.cc:430
 hparticlepairmaker.cc:431
 hparticlepairmaker.cc:432
 hparticlepairmaker.cc:433
 hparticlepairmaker.cc:434
 hparticlepairmaker.cc:435
 hparticlepairmaker.cc:436
 hparticlepairmaker.cc:437
 hparticlepairmaker.cc:438
 hparticlepairmaker.cc:439
 hparticlepairmaker.cc:440
 hparticlepairmaker.cc:441
 hparticlepairmaker.cc:442
 hparticlepairmaker.cc:443
 hparticlepairmaker.cc:444
 hparticlepairmaker.cc:445
 hparticlepairmaker.cc:446
 hparticlepairmaker.cc:447
 hparticlepairmaker.cc:448
 hparticlepairmaker.cc:449
 hparticlepairmaker.cc:450
 hparticlepairmaker.cc:451
 hparticlepairmaker.cc:452
 hparticlepairmaker.cc:453
 hparticlepairmaker.cc:454
 hparticlepairmaker.cc:455
 hparticlepairmaker.cc:456
 hparticlepairmaker.cc:457
 hparticlepairmaker.cc:458
 hparticlepairmaker.cc:459
 hparticlepairmaker.cc:460
 hparticlepairmaker.cc:461
 hparticlepairmaker.cc:462
 hparticlepairmaker.cc:463
 hparticlepairmaker.cc:464
 hparticlepairmaker.cc:465
 hparticlepairmaker.cc:466
 hparticlepairmaker.cc:467
 hparticlepairmaker.cc:468
 hparticlepairmaker.cc:469
 hparticlepairmaker.cc:470
 hparticlepairmaker.cc:471
 hparticlepairmaker.cc:472
 hparticlepairmaker.cc:473
 hparticlepairmaker.cc:474
 hparticlepairmaker.cc:475
 hparticlepairmaker.cc:476
 hparticlepairmaker.cc:477
 hparticlepairmaker.cc:478
 hparticlepairmaker.cc:479
 hparticlepairmaker.cc:480
 hparticlepairmaker.cc:481
 hparticlepairmaker.cc:482
 hparticlepairmaker.cc:483
 hparticlepairmaker.cc:484
 hparticlepairmaker.cc:485
 hparticlepairmaker.cc:486
 hparticlepairmaker.cc:487
 hparticlepairmaker.cc:488
 hparticlepairmaker.cc:489
 hparticlepairmaker.cc:490
 hparticlepairmaker.cc:491
 hparticlepairmaker.cc:492
 hparticlepairmaker.cc:493
 hparticlepairmaker.cc:494
 hparticlepairmaker.cc:495
 hparticlepairmaker.cc:496
 hparticlepairmaker.cc:497
 hparticlepairmaker.cc:498
 hparticlepairmaker.cc:499
 hparticlepairmaker.cc:500
 hparticlepairmaker.cc:501
 hparticlepairmaker.cc:502
 hparticlepairmaker.cc:503
 hparticlepairmaker.cc:504
 hparticlepairmaker.cc:505
 hparticlepairmaker.cc:506
 hparticlepairmaker.cc:507
 hparticlepairmaker.cc:508
 hparticlepairmaker.cc:509
 hparticlepairmaker.cc:510
 hparticlepairmaker.cc:511
 hparticlepairmaker.cc:512
 hparticlepairmaker.cc:513
 hparticlepairmaker.cc:514
 hparticlepairmaker.cc:515
 hparticlepairmaker.cc:516
 hparticlepairmaker.cc:517
 hparticlepairmaker.cc:518
 hparticlepairmaker.cc:519
 hparticlepairmaker.cc:520
 hparticlepairmaker.cc:521
 hparticlepairmaker.cc:522
 hparticlepairmaker.cc:523
 hparticlepairmaker.cc:524
 hparticlepairmaker.cc:525
 hparticlepairmaker.cc:526
 hparticlepairmaker.cc:527
 hparticlepairmaker.cc:528
 hparticlepairmaker.cc:529
 hparticlepairmaker.cc:530
 hparticlepairmaker.cc:531
 hparticlepairmaker.cc:532
 hparticlepairmaker.cc:533
 hparticlepairmaker.cc:534
 hparticlepairmaker.cc:535
 hparticlepairmaker.cc:536
 hparticlepairmaker.cc:537
 hparticlepairmaker.cc:538
 hparticlepairmaker.cc:539
 hparticlepairmaker.cc:540
 hparticlepairmaker.cc:541
 hparticlepairmaker.cc:542
 hparticlepairmaker.cc:543
 hparticlepairmaker.cc:544
 hparticlepairmaker.cc:545
 hparticlepairmaker.cc:546
 hparticlepairmaker.cc:547
 hparticlepairmaker.cc:548
 hparticlepairmaker.cc:549
 hparticlepairmaker.cc:550
 hparticlepairmaker.cc:551
 hparticlepairmaker.cc:552
 hparticlepairmaker.cc:553
 hparticlepairmaker.cc:554
 hparticlepairmaker.cc:555
 hparticlepairmaker.cc:556
 hparticlepairmaker.cc:557
 hparticlepairmaker.cc:558
 hparticlepairmaker.cc:559
 hparticlepairmaker.cc:560
 hparticlepairmaker.cc:561
 hparticlepairmaker.cc:562
 hparticlepairmaker.cc:563
 hparticlepairmaker.cc:564
 hparticlepairmaker.cc:565
 hparticlepairmaker.cc:566
 hparticlepairmaker.cc:567
 hparticlepairmaker.cc:568
 hparticlepairmaker.cc:569
 hparticlepairmaker.cc:570
 hparticlepairmaker.cc:571
 hparticlepairmaker.cc:572
 hparticlepairmaker.cc:573
 hparticlepairmaker.cc:574
 hparticlepairmaker.cc:575
 hparticlepairmaker.cc:576
 hparticlepairmaker.cc:577
 hparticlepairmaker.cc:578
 hparticlepairmaker.cc:579
 hparticlepairmaker.cc:580
 hparticlepairmaker.cc:581
 hparticlepairmaker.cc:582
 hparticlepairmaker.cc:583
 hparticlepairmaker.cc:584
 hparticlepairmaker.cc:585
 hparticlepairmaker.cc:586
 hparticlepairmaker.cc:587
 hparticlepairmaker.cc:588
 hparticlepairmaker.cc:589
 hparticlepairmaker.cc:590
 hparticlepairmaker.cc:591
 hparticlepairmaker.cc:592
 hparticlepairmaker.cc:593
 hparticlepairmaker.cc:594
 hparticlepairmaker.cc:595
 hparticlepairmaker.cc:596
 hparticlepairmaker.cc:597
 hparticlepairmaker.cc:598
 hparticlepairmaker.cc:599
 hparticlepairmaker.cc:600
 hparticlepairmaker.cc:601
 hparticlepairmaker.cc:602
 hparticlepairmaker.cc:603
 hparticlepairmaker.cc:604
 hparticlepairmaker.cc:605
 hparticlepairmaker.cc:606
 hparticlepairmaker.cc:607
 hparticlepairmaker.cc:608
 hparticlepairmaker.cc:609
 hparticlepairmaker.cc:610
 hparticlepairmaker.cc:611
 hparticlepairmaker.cc:612
 hparticlepairmaker.cc:613
 hparticlepairmaker.cc:614
 hparticlepairmaker.cc:615
 hparticlepairmaker.cc:616
 hparticlepairmaker.cc:617
 hparticlepairmaker.cc:618
 hparticlepairmaker.cc:619
 hparticlepairmaker.cc:620
 hparticlepairmaker.cc:621
 hparticlepairmaker.cc:622
 hparticlepairmaker.cc:623
 hparticlepairmaker.cc:624
 hparticlepairmaker.cc:625
 hparticlepairmaker.cc:626
 hparticlepairmaker.cc:627
 hparticlepairmaker.cc:628
 hparticlepairmaker.cc:629
 hparticlepairmaker.cc:630
 hparticlepairmaker.cc:631
 hparticlepairmaker.cc:632
 hparticlepairmaker.cc:633
 hparticlepairmaker.cc:634
 hparticlepairmaker.cc:635
 hparticlepairmaker.cc:636
 hparticlepairmaker.cc:637
 hparticlepairmaker.cc:638
 hparticlepairmaker.cc:639
 hparticlepairmaker.cc:640
 hparticlepairmaker.cc:641
 hparticlepairmaker.cc:642
 hparticlepairmaker.cc:643
 hparticlepairmaker.cc:644
 hparticlepairmaker.cc:645
 hparticlepairmaker.cc:646
 hparticlepairmaker.cc:647
 hparticlepairmaker.cc:648
 hparticlepairmaker.cc:649
 hparticlepairmaker.cc:650
 hparticlepairmaker.cc:651
 hparticlepairmaker.cc:652
 hparticlepairmaker.cc:653
 hparticlepairmaker.cc:654
 hparticlepairmaker.cc:655
 hparticlepairmaker.cc:656
 hparticlepairmaker.cc:657
 hparticlepairmaker.cc:658
 hparticlepairmaker.cc:659
 hparticlepairmaker.cc:660
 hparticlepairmaker.cc:661
 hparticlepairmaker.cc:662
 hparticlepairmaker.cc:663
 hparticlepairmaker.cc:664
 hparticlepairmaker.cc:665
 hparticlepairmaker.cc:666
 hparticlepairmaker.cc:667
 hparticlepairmaker.cc:668
 hparticlepairmaker.cc:669
 hparticlepairmaker.cc:670
 hparticlepairmaker.cc:671
 hparticlepairmaker.cc:672
 hparticlepairmaker.cc:673
 hparticlepairmaker.cc:674
 hparticlepairmaker.cc:675
 hparticlepairmaker.cc:676
 hparticlepairmaker.cc:677
 hparticlepairmaker.cc:678
 hparticlepairmaker.cc:679
 hparticlepairmaker.cc:680
 hparticlepairmaker.cc:681
 hparticlepairmaker.cc:682
 hparticlepairmaker.cc:683
 hparticlepairmaker.cc:684
 hparticlepairmaker.cc:685
 hparticlepairmaker.cc:686
 hparticlepairmaker.cc:687
 hparticlepairmaker.cc:688
 hparticlepairmaker.cc:689
 hparticlepairmaker.cc:690
 hparticlepairmaker.cc:691
 hparticlepairmaker.cc:692
 hparticlepairmaker.cc:693
 hparticlepairmaker.cc:694
 hparticlepairmaker.cc:695
 hparticlepairmaker.cc:696
 hparticlepairmaker.cc:697
 hparticlepairmaker.cc:698
 hparticlepairmaker.cc:699
 hparticlepairmaker.cc:700
 hparticlepairmaker.cc:701
 hparticlepairmaker.cc:702
 hparticlepairmaker.cc:703
 hparticlepairmaker.cc:704
 hparticlepairmaker.cc:705
 hparticlepairmaker.cc:706
 hparticlepairmaker.cc:707
 hparticlepairmaker.cc:708
 hparticlepairmaker.cc:709
 hparticlepairmaker.cc:710
 hparticlepairmaker.cc:711
 hparticlepairmaker.cc:712
 hparticlepairmaker.cc:713
 hparticlepairmaker.cc:714
 hparticlepairmaker.cc:715
 hparticlepairmaker.cc:716
 hparticlepairmaker.cc:717
 hparticlepairmaker.cc:718
 hparticlepairmaker.cc:719
 hparticlepairmaker.cc:720
 hparticlepairmaker.cc:721
 hparticlepairmaker.cc:722
 hparticlepairmaker.cc:723
 hparticlepairmaker.cc:724
 hparticlepairmaker.cc:725
 hparticlepairmaker.cc:726
 hparticlepairmaker.cc:727
 hparticlepairmaker.cc:728
 hparticlepairmaker.cc:729
 hparticlepairmaker.cc:730
 hparticlepairmaker.cc:731
 hparticlepairmaker.cc:732
 hparticlepairmaker.cc:733
 hparticlepairmaker.cc:734
 hparticlepairmaker.cc:735
 hparticlepairmaker.cc:736
 hparticlepairmaker.cc:737
 hparticlepairmaker.cc:738
 hparticlepairmaker.cc:739
 hparticlepairmaker.cc:740
 hparticlepairmaker.cc:741
 hparticlepairmaker.cc:742
 hparticlepairmaker.cc:743
 hparticlepairmaker.cc:744
 hparticlepairmaker.cc:745
 hparticlepairmaker.cc:746
 hparticlepairmaker.cc:747
 hparticlepairmaker.cc:748
 hparticlepairmaker.cc:749
 hparticlepairmaker.cc:750
 hparticlepairmaker.cc:751
 hparticlepairmaker.cc:752
 hparticlepairmaker.cc:753
 hparticlepairmaker.cc:754
 hparticlepairmaker.cc:755
 hparticlepairmaker.cc:756
 hparticlepairmaker.cc:757
 hparticlepairmaker.cc:758
 hparticlepairmaker.cc:759
 hparticlepairmaker.cc:760
 hparticlepairmaker.cc:761
 hparticlepairmaker.cc:762
 hparticlepairmaker.cc:763
 hparticlepairmaker.cc:764
 hparticlepairmaker.cc:765
 hparticlepairmaker.cc:766
 hparticlepairmaker.cc:767
 hparticlepairmaker.cc:768
 hparticlepairmaker.cc:769
 hparticlepairmaker.cc:770
 hparticlepairmaker.cc:771
 hparticlepairmaker.cc:772
 hparticlepairmaker.cc:773
 hparticlepairmaker.cc:774
 hparticlepairmaker.cc:775
 hparticlepairmaker.cc:776
 hparticlepairmaker.cc:777
 hparticlepairmaker.cc:778
 hparticlepairmaker.cc:779
 hparticlepairmaker.cc:780
 hparticlepairmaker.cc:781
 hparticlepairmaker.cc:782
 hparticlepairmaker.cc:783
 hparticlepairmaker.cc:784
 hparticlepairmaker.cc:785
 hparticlepairmaker.cc:786
 hparticlepairmaker.cc:787
 hparticlepairmaker.cc:788
 hparticlepairmaker.cc:789
 hparticlepairmaker.cc:790
 hparticlepairmaker.cc:791
 hparticlepairmaker.cc:792
 hparticlepairmaker.cc:793
 hparticlepairmaker.cc:794
 hparticlepairmaker.cc:795
 hparticlepairmaker.cc:796
 hparticlepairmaker.cc:797
 hparticlepairmaker.cc:798
 hparticlepairmaker.cc:799
 hparticlepairmaker.cc:800
 hparticlepairmaker.cc:801
 hparticlepairmaker.cc:802
 hparticlepairmaker.cc:803
 hparticlepairmaker.cc:804
 hparticlepairmaker.cc:805
 hparticlepairmaker.cc:806
 hparticlepairmaker.cc:807
 hparticlepairmaker.cc:808
 hparticlepairmaker.cc:809
 hparticlepairmaker.cc:810
 hparticlepairmaker.cc:811
 hparticlepairmaker.cc:812
 hparticlepairmaker.cc:813
 hparticlepairmaker.cc:814
 hparticlepairmaker.cc:815
 hparticlepairmaker.cc:816
 hparticlepairmaker.cc:817
 hparticlepairmaker.cc:818
 hparticlepairmaker.cc:819
 hparticlepairmaker.cc:820
 hparticlepairmaker.cc:821
 hparticlepairmaker.cc:822
 hparticlepairmaker.cc:823
 hparticlepairmaker.cc:824
 hparticlepairmaker.cc:825
 hparticlepairmaker.cc:826
 hparticlepairmaker.cc:827
 hparticlepairmaker.cc:828
 hparticlepairmaker.cc:829
 hparticlepairmaker.cc:830
 hparticlepairmaker.cc:831
 hparticlepairmaker.cc:832
 hparticlepairmaker.cc:833
 hparticlepairmaker.cc:834
 hparticlepairmaker.cc:835
 hparticlepairmaker.cc:836
 hparticlepairmaker.cc:837
 hparticlepairmaker.cc:838
 hparticlepairmaker.cc:839
 hparticlepairmaker.cc:840
 hparticlepairmaker.cc:841
 hparticlepairmaker.cc:842
 hparticlepairmaker.cc:843
 hparticlepairmaker.cc:844
 hparticlepairmaker.cc:845
 hparticlepairmaker.cc:846
 hparticlepairmaker.cc:847
 hparticlepairmaker.cc:848
 hparticlepairmaker.cc:849
 hparticlepairmaker.cc:850
 hparticlepairmaker.cc:851
 hparticlepairmaker.cc:852
 hparticlepairmaker.cc:853
 hparticlepairmaker.cc:854
 hparticlepairmaker.cc:855
 hparticlepairmaker.cc:856
 hparticlepairmaker.cc:857
 hparticlepairmaker.cc:858
 hparticlepairmaker.cc:859
 hparticlepairmaker.cc:860
 hparticlepairmaker.cc:861
 hparticlepairmaker.cc:862
 hparticlepairmaker.cc:863
 hparticlepairmaker.cc:864
 hparticlepairmaker.cc:865
 hparticlepairmaker.cc:866
 hparticlepairmaker.cc:867
 hparticlepairmaker.cc:868
 hparticlepairmaker.cc:869
 hparticlepairmaker.cc:870
 hparticlepairmaker.cc:871
 hparticlepairmaker.cc:872
 hparticlepairmaker.cc:873
 hparticlepairmaker.cc:874
 hparticlepairmaker.cc:875
 hparticlepairmaker.cc:876
 hparticlepairmaker.cc:877
 hparticlepairmaker.cc:878
 hparticlepairmaker.cc:879
 hparticlepairmaker.cc:880
 hparticlepairmaker.cc:881
 hparticlepairmaker.cc:882
 hparticlepairmaker.cc:883
 hparticlepairmaker.cc:884
 hparticlepairmaker.cc:885
 hparticlepairmaker.cc:886
 hparticlepairmaker.cc:887
 hparticlepairmaker.cc:888
 hparticlepairmaker.cc:889
 hparticlepairmaker.cc:890
 hparticlepairmaker.cc:891
 hparticlepairmaker.cc:892
 hparticlepairmaker.cc:893
 hparticlepairmaker.cc:894
 hparticlepairmaker.cc:895
 hparticlepairmaker.cc:896
 hparticlepairmaker.cc:897
 hparticlepairmaker.cc:898
 hparticlepairmaker.cc:899
 hparticlepairmaker.cc:900
 hparticlepairmaker.cc:901
 hparticlepairmaker.cc:902
 hparticlepairmaker.cc:903
 hparticlepairmaker.cc:904
 hparticlepairmaker.cc:905
 hparticlepairmaker.cc:906
 hparticlepairmaker.cc:907
 hparticlepairmaker.cc:908
 hparticlepairmaker.cc:909
 hparticlepairmaker.cc:910
 hparticlepairmaker.cc:911
 hparticlepairmaker.cc:912
 hparticlepairmaker.cc:913
 hparticlepairmaker.cc:914
 hparticlepairmaker.cc:915
 hparticlepairmaker.cc:916
 hparticlepairmaker.cc:917
 hparticlepairmaker.cc:918
 hparticlepairmaker.cc:919
 hparticlepairmaker.cc:920
 hparticlepairmaker.cc:921
 hparticlepairmaker.cc:922
 hparticlepairmaker.cc:923
 hparticlepairmaker.cc:924
 hparticlepairmaker.cc:925
 hparticlepairmaker.cc:926
 hparticlepairmaker.cc:927
 hparticlepairmaker.cc:928
 hparticlepairmaker.cc:929
 hparticlepairmaker.cc:930
 hparticlepairmaker.cc:931
 hparticlepairmaker.cc:932
 hparticlepairmaker.cc:933
 hparticlepairmaker.cc:934
 hparticlepairmaker.cc:935
 hparticlepairmaker.cc:936
 hparticlepairmaker.cc:937
 hparticlepairmaker.cc:938
 hparticlepairmaker.cc:939
 hparticlepairmaker.cc:940
 hparticlepairmaker.cc:941
 hparticlepairmaker.cc:942
 hparticlepairmaker.cc:943
 hparticlepairmaker.cc:944
 hparticlepairmaker.cc:945
 hparticlepairmaker.cc:946
 hparticlepairmaker.cc:947
 hparticlepairmaker.cc:948
 hparticlepairmaker.cc:949
 hparticlepairmaker.cc:950
 hparticlepairmaker.cc:951