ROOT logo

#include "hparticlecandsim.h"

#include "hparticlepair.h"
#include "hparticletool.h"
#include "hphysicsconstants.h"

#include <iostream>
#include <iomanip>

using namespace std;

ClassImp(HParticlePair)


//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////////////////////
//
//
// HParticlePair
//
// a pair build of 2 HVirtualCand objects. Opening Angle + Vertex variables
// are calulated when the pair is set.  With static HParticlePair::setDoMomentumCorrection(Bool_t doit)
// Particle momenta are corrected for energyloss (default: kTRUE).
//
////////////////////////////////////////////////////////////////////////////////


Bool_t HParticlePair::fDoMomCorrection = kTRUE;

HParticlePair::HParticlePair()
{
    clear();
}

HParticlePair::~HParticlePair()
{

}

Bool_t HParticlePair::isSimulation()
{
    // checks if pair is created by sim objects

    HVirtualCand* c = 0;

    if     (fcand[0]) c = fcand[0];
    else if(fcand[1]) c = fcand[1];

    if(c){
	TString n = c->ClassName();
	if(n.CompareTo("HVirtualCandSim") == 0){ return kTRUE; }
    }

    if(fpair[0] && fpair[0]->getIsSimulation()) return kTRUE;
    if(fpair[1] && fpair[1]->getIsSimulation()) return kTRUE;

    return kFALSE;
}


Int_t HParticlePair::isFakePair() {

    // checkes the assigned pids (not GEANT!)
    // return 2 if both cands are fake, 1 if one is
    // fake and 0 if none is fake

    if     (fPID[0] < 0 && fPID[1] < 0 ) return 2;
    else if(fPID[0] < 0 || fPID[1] < 0 ) return 1;
    else                                 return 0;
}

Bool_t HParticlePair::isTruePair() {

    // return kTRUE if both candidates have the same
    // geant pid as assigned pid and candidate is not
    // a ghost. Should be called on simulation only.
    if(fIsSimulation){
	if( (fstatusFlags&3) == 3) return kTRUE;  // 2 bits for true candidates
    }
    return kFALSE;
}

Bool_t  HParticlePair::calcVertex()
{

    if( (!fcand[0] && !fpair[0]) || (!fcand[1] && !fpair[1])) {
	Error("calcVertex()","Candidates not yet filled! Skipped!");
	return kFALSE;
    }
    HGeomVector base1,dir1,base2,dir2,dirMother;

    if(fcand[0]) HParticleTool::calcSegVector(fcand[0]->getZ(),fcand[0]->getR(),(TMath::DegToRad()*fcand[0]->getPhi()),(TMath::DegToRad()*fcand[0]->getTheta()),base1,dir1);
    else {
	base1 = fpair[0]->getDecayVertex();
        dir1  .setXYZ((*fpair[0]).X(),(*fpair[0]).Y(),(*fpair[0]).Z());
    }

    if(fcand[1]) HParticleTool::calcSegVector(fcand[1]->getZ(),fcand[1]->getR(),(TMath::DegToRad()*fcand[1]->getPhi()),(TMath::DegToRad()*fcand[1]->getTheta()),base2,dir2);
    else {
	base2 = fpair[1]->getDecayVertex();
        dir2  .setXYZ((*fpair[1]).X(),(*fpair[1]).Y(),(*fpair[1]).Z());
    }

    fDecayVertex  = HParticleTool::calcVertexAnalytical(base1,dir1,base2,dir2); // vertex of the two tracks

    dirMother.setXYZ((*this).X(),(*this).Y(),(*this).Z());

    fVerMinDistCand[0]   = HParticleTool::calculateMinimumDistanceStraightToPoint(base1,dir1,fEventVertex); //distance first secondary particle from primary vertex
    fVerMinDistCand[1]   = HParticleTool::calculateMinimumDistanceStraightToPoint(base2,dir2,fEventVertex); //distance second secondary particle from primary vertex
    fVerMinDistMother    = HParticleTool::calculateMinimumDistanceStraightToPoint(fDecayVertex,dirMother,fEventVertex);//?? distance decay vertex from primary vertex
    fVerDistMother       = (fDecayVertex-fEventVertex).length(); // decay vertex <-> global vertex
    fMinDistCandidates   = HParticleTool::calculateMinimumDistance(base1,dir1,base2,dir2);

    return kTRUE;
}

Bool_t  HParticlePair::calcVectors(Int_t pid1,Int_t pid2,Int_t motherpid,HGeomVector& vertex)
{
    // sets fPID1,fPID2,fMotherPID and fills lorentz vectors
    // opening Angle etc.

    if( (!fcand[0] && !fpair[0]) || (!fcand[1] && !fpair[1]) ) { Error("calcVectors()","Candidates not yet filled! Skipped!"); return kFALSE; }

    fPID[0]    = pid1;
    fPID[1]    = pid2;
    fMotherPID = motherpid;
    fEventVertex = vertex;
    Float_t mass =  HPhysicsConstants::mass(fPID[0]);
    if(mass == -1) mass = HPhysicsConstants::mass(2);

    if(fcand[0]) HParticleTool::fillTLorentzVector(fc[0],fcand[0],fPID[0],HParticlePair::getDoMomentumCorrection());
    else         fc[0]         = (*((TLorentzVector*)fpair[0]));

    mass =  HPhysicsConstants::mass(fPID[1]);
    if(mass == -1) mass = HPhysicsConstants::mass(2);


    if(fcand[1]) HParticleTool::fillTLorentzVector(fc[1],fcand[1],fPID[1],HParticlePair::getDoMomentumCorrection());
    else         fc[1]         = (*((TLorentzVector*)fpair[1]));

    (*((TLorentzVector*)this)) =  fc[0] + fc[1];

    foAngle = fc[0].Angle(fc[1].Vect()) * TMath::RadToDeg();

    calcVertex();

    return kTRUE;
}

HVirtualCandSim* HParticlePair::getFirstDaughter()
{
    // returns the pointer to the first valid daughter
    // returns 0 if no valid daughter is found
    HVirtualCandSim* c =0;
    if(getCandSim(0)) return getCandSim(0);
    if(getCandSim(1)) return getCandSim(1);

    return c;
}

Bool_t HParticlePair::isGeantDecay()
{
    // returns true if both daughters
    // have a parentTrack > 0 (mother is inside GEANT)
    // both parent tracks are the same
    //

    if(getCandSim(0) && getCandSim(1))
    {
        // decay in GEANT
	if(getCandSim(0)->getGeantParentTrackNum() > 0 &&
	   getCandSim(1)->getGeantParentTrackNum() > 0 &&
           getCandSim(0)->getGeantParentTrackNum() == getCandSim(1)->getGeantParentTrackNum()
	  ) return kTRUE;
    }
    Int_t geninfo_1         = -1;
    Int_t geninfo1_1        = -1;
    Int_t geninfo2_1        = -1;
    Int_t parentTrack1      = -1;
    Int_t grandparentTrack1 = -1;
    Int_t geninfo_2         = -1;
    Int_t geninfo1_2        = -1;
    Int_t geninfo2_2        = -1;
    Int_t parentTrack2      = -1;
    Int_t grandparentTrack2 = -1;

    if(getCandSim(0) && fpair[1])
    {
	          getSourceInfo( 0,parentTrack1,grandparentTrack1,geninfo_1,geninfo1_1,geninfo2_1);
        fpair[1]->getSourceInfo(-1,parentTrack2,grandparentTrack2,geninfo_2,geninfo1_2,geninfo2_2);

        if(fpair[1]->isTruePair() && parentTrack1 > 0 && grandparentTrack2 == parentTrack1 ) return kTRUE;

	return kFALSE;
    }

    if(getCandSim(1) && fpair[0])
    {
	          getSourceInfo( 1,parentTrack1,grandparentTrack1,geninfo_1,geninfo1_1,geninfo2_1);
        fpair[0]->getSourceInfo(-1,parentTrack2,grandparentTrack2,geninfo_2,geninfo1_2,geninfo2_2);

        if(fpair[0]->isTruePair() && parentTrack1 > 0 && grandparentTrack2 == parentTrack1 ) return kTRUE;

	return kFALSE;
    }

    if(fpair[0] && fpair[1])
    {
	fpair[0]->getSourceInfo(-1,parentTrack1,grandparentTrack1,geninfo_1,geninfo1_1,geninfo2_1);
        fpair[1]->getSourceInfo(-1,parentTrack2,grandparentTrack2,geninfo_2,geninfo1_2,geninfo2_2);

	if(fpair[0]->isTruePair() &&
	   fpair[1]->isTruePair() &&
	   grandparentTrack1 > 0 && grandparentTrack2 == grandparentTrack1 ) return kTRUE;

	return kFALSE;
    }

    return kFALSE;
}

Bool_t HParticlePair::isSameExternalSource()
{
    // returns true if both daughters
    // have a parentTrack = 0 (mother is outside GEANT)
    // and the stem form the same source (geninfo > 0,
    // geninfo and geninfo2 are equal)

    Int_t geninfo_1         = -1;
    Int_t geninfo1_1        = -1;
    Int_t geninfo2_1        = -1;
    Int_t parentTrack1      = -1;
    Int_t grandparentTrack1 = -1;
    Int_t geninfo_2         = -1;
    Int_t geninfo1_2        = -1;
    Int_t geninfo2_2        = -1;
    Int_t parentTrack2      = -1;
    Int_t grandparentTrack2 = -1;

    if(getCandSim(0) && getCandSim(1))
    {
	getSourceInfo( 0,parentTrack1,grandparentTrack1,geninfo_1,geninfo1_1,geninfo2_1);
        getSourceInfo( 1,parentTrack2,grandparentTrack2,geninfo_2,geninfo1_2,geninfo2_2);


	// decay in PLUTO
	if(  (( parentTrack1 == 0 && parentTrack2 == 0 )             ||      // decay outside GEANT
	      ( parentTrack1  > 0 && parentTrack2 == parentTrack1 )          // decay inside  GEANT
	     )  &&      // decay inside  GEANT
	   geninfo_1 > 0                                &&  // external source
	   geninfo_1  == geninfo_2                      &&  // sourceID
	   geninfo2_1 == geninfo2_2                         // parentindex if more than 1 decay of the same source is in the event
	  )
	{
	    return kTRUE;
	}
	return kFALSE;
    }

    Bool_t truepair=kFALSE;

    if(getCandSim(0) && fpair[1])
    {
                  getSourceInfo( 0,parentTrack1,grandparentTrack1,geninfo_1,geninfo1_1,geninfo2_1);
	fpair[1]->getSourceInfo(-1,parentTrack2,grandparentTrack2,geninfo_2,geninfo1_2,geninfo2_2);

	truepair=fpair[1]->isTruePair();

	if(truepair &&
          (
	   (parentTrack1 == 0 && grandparentTrack2 == 0 && parentTrack2 > 0) || // decay outside GEANT
	   (parentTrack1 >  0 && grandparentTrack2 == parentTrack1)             // decay inside  GEANT
	  ) &&
	   geninfo_1 > 0                                &&  // external source
	   geninfo_1  == geninfo_2                      &&  // sourceID
	   geninfo2_1 == geninfo2_2                         // parentindex if more than 1 decay of the same source is in the event
	  ) return kTRUE;

    } else if (getCandSim(1) && fpair[0]){
	          getSourceInfo( 1,parentTrack1,grandparentTrack1,geninfo_1,geninfo1_1,geninfo2_1);
	fpair[0]->getSourceInfo(-1,parentTrack2,grandparentTrack2,geninfo_2,geninfo1_2,geninfo2_2);

	truepair=fpair[0]->isTruePair();

	if(truepair &&
	   (
	    (parentTrack2 == 0 && grandparentTrack1 == 0 && parentTrack1 > 0) || // decay outside GEANT
	    (parentTrack2 >  0 && grandparentTrack1 == parentTrack2)             // decay inside  GEANT
	   )
	   &&
	   geninfo_1 > 0                                &&  // external source
	   geninfo_1  == geninfo_2                      &&  // sourceID
	   geninfo2_1 == geninfo2_2                         // parentindex if more than 1 decay of the same source is in the event
	  ) return kTRUE;

    } else if (fpair[0] && fpair[1]){
	fpair[0]->getSourceInfo(-1,parentTrack1,grandparentTrack1,geninfo_1,geninfo1_1,geninfo2_1);
	fpair[1]->getSourceInfo(-1,parentTrack2,grandparentTrack2,geninfo_2,geninfo1_2,geninfo2_2);

	truepair=fpair[0]->isTruePair();
        if(truepair) truepair=fpair[1]->isTruePair();

	if(truepair &&
           (
	    (grandparentTrack1 == 0 && grandparentTrack2 == 0 && parentTrack1 > 0 && parentTrack2 > 0 ) ||  // decay outside GEANT
	    (grandparentTrack1 < 0 &&  grandparentTrack1 == grandparentTrack2 )                             // decay inside  GEANT
	   )
           &&
	   geninfo_1 > 0                                &&  // external source
	   geninfo_1  == geninfo_2                      &&  // sourceID
	   geninfo2_1 == geninfo2_2                         // parentindex if more than 1 decay of the same source is in the event
	  ) return kTRUE;
    }

    return kFALSE;
}

void HParticlePair::getSourceInfo(Int_t index,Int_t& parentTrack,Int_t& grandParentTrack,Int_t& geninfo,Int_t& geninfo1,Int_t& geninfo2)
{
    // returns parent track, grand parent track, geninfo and
    // geninfo2 of the daughter with index (first valid daughter if index==-1).


    geninfo =-1;
    geninfo1=-1;
    geninfo2=-1;
    parentTrack = 0;
    grandParentTrack = 0;

    if(!fIsSimulation) return;

    HVirtualCandSim* c = 0;

    if     (index == -1)              c = getFirstDaughter();
    else if(index >= 0 && index < 3 ) c = getCandSim(index);

    if(c){
	geninfo  = c->getGeantGeninfo();
	geninfo1 = c->getGeantGeninfo1();
	geninfo2 = c->getGeantGeninfo2();
        parentTrack = c->getGeantParentTrackNum();
        grandParentTrack = c->getGeantGrandParentTrackNum();
    }
}


void    HParticlePair::setTruePair()
{
    if(!fIsSimulation) return;

    if(getCandSim(0) && getCandSim(1))
    {
	if(getCandSim(0)->getGeantParentTrackNum() > 0 && getCandSim(0)->getGeantParentTrackNum() == getCandSim(1)->getGeantParentTrackNum()) {    // decay in GEANT
        HParticleCandSim * pcandsim0 = dynamic_cast<HParticleCandSim*>(getCandSim(0));
        HParticleCandSim * pcandsim1 = dynamic_cast<HParticleCandSim*>(getCandSim(1));
        if(pcandsim0) { if(!pcandsim0->isGhostTrack()) fstatusFlags = fstatusFlags|0x01; }
        else                                         { fstatusFlags = fstatusFlags|0x01; }
        if(pcandsim1) { if(!pcandsim1->isGhostTrack()) fstatusFlags = fstatusFlags|0x02; }
        else                                         { fstatusFlags = fstatusFlags|0x02; }
	    return;
	}

	Int_t geninfo_1  = getCandSim(0)->getGeantGeninfo();
        Int_t geninfo2_1 = getCandSim(0)->getGeantGeninfo2();
        Int_t geninfo_2  = getCandSim(1)->getGeantGeninfo();
        Int_t geninfo2_2 = getCandSim(1)->getGeantGeninfo2();

        if(geninfo_1 > 0                                &&  // external source
	   geninfo_1  == geninfo_2                      &&  // sourceID
	   geninfo2_1 == geninfo2_2                         // parentindex if more than 1 decay of the same source is in the event
	  ) {
            HParticleCandSim * pcandsim0 = dynamic_cast<HParticleCandSim*>(getCandSim(0));
            HParticleCandSim * pcandsim1 = dynamic_cast<HParticleCandSim*>(getCandSim(1));
            if(pcandsim0) { if(!pcandsim0->isGhostTrack()) fstatusFlags = fstatusFlags|0x01; }
            else                                         { fstatusFlags = fstatusFlags|0x01; }
            if(pcandsim1) { if(!pcandsim1->isGhostTrack()) fstatusFlags = fstatusFlags|0x02; }
            else                                         { fstatusFlags = fstatusFlags|0x02; }
	    return;
	}

	return;
    }


    if(getCandSim(0) && fpair[1])
    {
	Int_t geninfo_1        = -1;
	Int_t geninfo1_1       = -1;
        Int_t geninfo2_1       = -1;
        Int_t parentTrack      = -1;
        Int_t grandparentTrack = -1;


	fpair[1]->getSourceInfo(-1,parentTrack,grandparentTrack,geninfo_1,geninfo1_1,geninfo2_1);

	if(grandparentTrack > 0 && getCandSim(0)->getGeantParentTrackNum() == grandparentTrack) {    // decay in GEANT
        HParticleCandSim * pcandsim0 = dynamic_cast<HParticleCandSim*>(getCandSim(0));
        if(pcandsim0) { if(!pcandsim0->isGhostTrack()) fstatusFlags = fstatusFlags|0x01; }
        else                                         { fstatusFlags = fstatusFlags|0x01; }
        if(fpair[1]->isTruePair())                  fstatusFlags = fstatusFlags|0x02;
	    return;
	}

	Int_t geninfo_2  = getCandSim(0)->getGeantGeninfo();
        Int_t geninfo2_2 = getCandSim(0)->getGeantGeninfo2();

        if(geninfo_1 > 0                                &&  // external source
	   geninfo_1  == geninfo_2                      &&  // sourceID
	   geninfo2_1 == geninfo2_2                         // parentindex if more than 1 decay of the same source is in the event
	  ) {
        HParticleCandSim * pcandsim0 = dynamic_cast<HParticleCandSim*>(getCandSim(0));
        if(pcandsim0) { if(!pcandsim0->isGhostTrack()) fstatusFlags = fstatusFlags|0x01; }
        else                                         { fstatusFlags = fstatusFlags|0x01; }
        if(fpair[1]->isTruePair())                  fstatusFlags = fstatusFlags|0x02;
	}

	return;
    }

    if(getCandSim(1) && fpair[0])
    {
	Int_t geninfo_1        = -1;
	Int_t geninfo1_1       = -1;
        Int_t geninfo2_1       = -1;
        Int_t parentTrack      = -1;
        Int_t grandparentTrack = -1;


	fpair[0]->getSourceInfo(-1,parentTrack,grandparentTrack,geninfo_1,geninfo1_1,geninfo2_1);

	if(grandparentTrack > 0 && getCandSim(1)->getGeantParentTrackNum() == grandparentTrack) {    // decay in GEANT
        HParticleCandSim * pcandsim1 = dynamic_cast<HParticleCandSim*>(getCandSim(1));
        if(pcandsim1) { if(!pcandsim1->isGhostTrack()) fstatusFlags = fstatusFlags|0x01; }
        else                                         { fstatusFlags = fstatusFlags|0x01; }
        if(fpair[0]->isTruePair())                  fstatusFlags = fstatusFlags|0x02;
	    return;
	}

	Int_t geninfo_2  = getCandSim(1)->getGeantGeninfo();
        Int_t geninfo2_2 = getCandSim(1)->getGeantGeninfo2();

        if(geninfo_1 > 0                                &&  // external source
	   geninfo_1  == geninfo_2                      &&  // sourceID
	   geninfo2_1 == geninfo2_2                         // parentindex if more than 1 decay of the same source is in the event
	  ) {
        HParticleCandSim * pcandsim1 = dynamic_cast<HParticleCandSim*>(getCandSim(1));
        if(pcandsim1) { if(!pcandsim1->isGhostTrack()) fstatusFlags = fstatusFlags|0x01; }
        else                                         { fstatusFlags = fstatusFlags|0x01; }
        if(fpair[0]->isTruePair())                  fstatusFlags = fstatusFlags|0x02;
	}

	return;
    }




    if(fpair[0] && fpair[1])
    {
	Int_t gparentTrack1 =-1;
	Int_t gparentTrack2 =-1;
	Int_t parentTrack1  =-1;
	Int_t parentTrack2  =-1;
	Int_t geninfo_1  = -1;
	Int_t geninfo1_1 = -1;
	Int_t geninfo2_1 = -1;
	Int_t geninfo_2  = -1;
	Int_t geninfo1_2 = -1;
	Int_t geninfo2_2 = -1;

	fpair[0]->getSourceInfo(-1,parentTrack1,gparentTrack1,geninfo_1,geninfo1_1,geninfo2_1);
	fpair[1]->getSourceInfo(-1,parentTrack2,gparentTrack2,geninfo_2,geninfo1_2,geninfo2_2);


	if(gparentTrack1 > 0 && gparentTrack2 > 0 && gparentTrack1 == gparentTrack2)   { // decay in GEANT
	    fstatusFlags = fstatusFlags|0x01;
	    fstatusFlags = fstatusFlags|0x02;
	    return;
	}

	if(gparentTrack1 == 0 && gparentTrack2 == 0 &&
	   geninfo_1 > 0  &&
	   geninfo_1  == geninfo_2                  &&  // sourceID
	   geninfo2_1 == geninfo2_2                     // parentindex if more than 1 decay of the same source is in the event

	  )   { // decay in PLUTO
	    fstatusFlags = fstatusFlags|0x01;
	    fstatusFlags = fstatusFlags|0x02;
	    return;
	}

    } // end both pair

}

Bool_t  HParticlePair::setPair(HVirtualCand* cnd1,Int_t pid1,
			       HVirtualCand* cnd2,Int_t pid2,
			       Int_t motherpid,UInt_t pairflags,HGeomVector& vertex)
{
    // sets pairflags , candidates and calls
    // calcvectors. Supposed to be called at initial
    // filling.

    fpairFlags    = pairflags;
    fpair[0]      = 0;
    fpair[1]      = 0;
    fcand[0]      = cnd1;
    fcand[1]      = cnd2;
    fIsSimulation = isSimulation();

    setTruePair();

    return calcVectors(pid1,pid2,motherpid,vertex);
}

Bool_t  HParticlePair::setPair(HParticlePair* cnd1,Int_t pid1,
			       HVirtualCand* cnd2,Int_t pid2,
			       Int_t motherpid,UInt_t pairflags,HGeomVector& vertex)
{
    // sets pairflags , candidates and calls
    // calcvectors. Supposed to be called at initial
    // filling. candidate1 will be filled from
    // mother + decay vertex from the pair.

    fpairFlags    = pairflags;
    fpair[0]      = cnd1;
    fpair[1]      = 0;
    fcand[0]      = 0;
    fcand[1]      = cnd2;
    fIsSimulation = isSimulation();


    setTruePair();

    return calcVectors(pid1,pid2,motherpid,vertex);
}

Bool_t  HParticlePair::setPair(HParticlePair* cnd1,Int_t pid1,
			       HParticlePair* cnd2,Int_t pid2,
			       Int_t motherpid,UInt_t pairflags,HGeomVector& vertex)
{
    // sets pairflags , candidates and calls
    // calcvectors. Supposed to be called at initial
    // filling. candidate1 and candidate2 will be filled from
    // mother + decay vertex from the pair.

    fpairFlags    = pairflags;
    fpair[0]      = cnd1;
    fpair[1]      = cnd2;
    fcand[0]      = 0;
    fcand[1]      = 0;
    fIsSimulation = isSimulation();



    setTruePair();

    return calcVectors(pid1,pid2,motherpid,vertex);
}

void HParticlePair::printFlags()
{
    // print pairs flags

    TString out="";
    for(Int_t i=32;i>0;i--){
	if(i%4==0) out+=" ";
	out+= ( (fpairFlags>>(i-1)) & 0x1 );
    }
    cout<<"    bin "<<out.Data()<<" pairflags "<<endl;
    cout<<endl;


    cout<<"kSameRICH               1: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kSameRICH)<<endl;
    cout<<"kSameInnerMDC           2: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kSameInnerMDC)<<endl;
    cout<<"kSameOuterMDC           3: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kSameOuterMDC)<<endl;
    cout<<"kSameMETA               4: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kSameMETA)<<endl;
    cout<<"kSamePosPolarity        5: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kSamePosPolarity)<<endl;
    cout<<"kSameNegPolarity        6: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kSameNegPolarity)<<endl;
    cout<<"kSamePolarity           7: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kSamePolarity)<<endl;

    cout<<"kRICH2                  8: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kRICH2)<<endl;
    cout<<"kFittedInnerMDC2        9: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kFittedInnerMDC2)<<endl;
    cout<<"kFittedOuterMDC2       10: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kFittedOuterMDC2)<<endl;
    cout<<"kOuterMDC2             11: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kOuterMDC2)<<endl;
    cout<<"kRK2                   12: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kRK2)<<endl;
    cout<<"kMETA2                 13: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kMETA2)<<endl;
    cout<<"kIsLepton2             14: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kIsLepton2)<<endl;
    cout<<"kIsUsed2               15: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kIsUsed2)<<endl;

    cout<<"kNoSameRICH            16: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoSameRICH)<<endl;
    cout<<"kNoSameInnerMDC        17: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoSameInnerMDC)<<endl;
    cout<<"kNoSameOuterMDC        18: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoSameOuterMDC)<<endl;
    cout<<"kNoSameMETA            19: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoSameMETA)<<endl;
    cout<<"kNoSamePosPolarity     20: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoSamePosPolarity)<<endl;
    cout<<"kNoSameNegPolarity     21: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoSameNegPolarity)<<endl;
    cout<<"kNoSamePolarity        22: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoSamePolarity)<<endl;

    cout<<"kNoRICH2               23: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoRICH2)<<endl;
    cout<<"kNoFittedInnerMDC2     24: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoFittedInnerMDC2)<<endl;
    cout<<"kNoFittedOuterMDC2     25: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoFittedOuterMDC2)<<endl;
    cout<<"kNoOuterMDC2           26: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoOuterMDC2)<<endl;
    cout<<"kNoRK2                 27: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoRK2)<<endl;
    cout<<"kNoMETA2               28: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoMETA2)<<endl;
    cout<<"kNoIsLepton2           29: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoIsLepton2)<<endl;
    cout<<"kNoIsUsed2             30: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoIsUsed2)<<endl;
    cout<<"kNoUseRICH             31: "<< HParticleTool::isPairsFlagsBit(fpairFlags,kNoUseRICH)<<endl;


}

void  HParticlePair::print(UInt_t selection)
{
    // print option bits
    // bit   1 : print particle infos                      (selection == 1)
    //       2 : print pids, oAngle and polarities         (selection == 2)
    //       3 : print hit indices and META selection info (selection == 4)
    //       4 : print vertex infos                        (selection == 8)
    //       4 : print pair flags                          (selection == 16)
    // default : print all


    cout<<"HParticlePair::print() --------------------------------------"<<endl;

    if( (selection>>0) & 0x01){
	if(fcand[0]) fcand[0]->print();
	if(fcand[1]) fcand[1]->print();
    if(fpair[0]) fpair[0]->print(1);
	if(fpair[1]) fpair[1]->print(1);
    }

    if( (selection>>1) & 0x01){
	cout<<"    pid1 = "   <<fPID[0]
	    <<", pid2 = "     <<fPID[1]
	    <<", motherpid = "<<fMotherPID
	    <<", oAngle = "<<foAngle
	    <<", pol1 = "  << (Int_t) ( (fcand[0]) ?  fcand[0]->getCharge() : 0 )
	    <<", pol2 = "  << (Int_t) ( (fcand[1]) ?  fcand[1]->getCharge() : 0 )
	    <<endl;
    }

    if( ( (selection>>2) & 0x01) && fcand[0] && fcand[1]){
        HParticleCandSim * _fcand0 = dynamic_cast<HParticleCandSim*>(fcand[0]);
        HParticleCandSim * _fcand1 = dynamic_cast<HParticleCandSim*>(fcand[1]);
        if (_fcand0 && _fcand1)
        {
            cout<<"    RICH     : " <<setw(3)<<_fcand0->getRichInd()    <<" "<<setw(3)<< _fcand1->getRichInd()<<endl;
            cout<<"    InnerMDC : " <<setw(3)<<_fcand0->getInnerSegInd()<<" "<<setw(3)<< _fcand1->getInnerSegInd()<<endl;
            cout<<"    OuterMDC : " <<setw(3)<<_fcand0->getOuterSegInd()<<" "<<setw(3)<< _fcand1->getOuterSegInd()<<endl;
            cout<<"    META     : " <<setw(3)<<_fcand0->getMetaHitInd() <<" "<<setw(3)<<_fcand1->getMetaHitInd()<<" "<<setw(3)<<_fcand0->getSelectedMeta()<<" "<<setw(3)<<_fcand1->getSelectedMeta()<<endl;
            cout<<" systemUsed1 : "<<setw(3)<<_fcand0->getSystemUsed()        <<", systemUsed2 : "<<setw(3)<<_fcand1->getSystemUsed()<<endl;
            cout<<" isTofClst1  : "<<setw(3)<<(Int_t)_fcand0->isTofClstUsed() <<", isTofClst2  : "<<setw(3)<<(Int_t)_fcand1->isTofClstUsed()<<endl;
            cout<<" isTofHit1   : "<<setw(3)<<(Int_t)_fcand0->isTofHitUsed()  <<", isTofHit2   : "<<setw(3)<<(Int_t)_fcand1->isTofHitUsed()<<endl;
            cout<<" isRpcClst1  : "<<setw(3)<<(Int_t)_fcand0->isRpcClstUsed() <<", isRpcClst2  : "<<setw(3)<<(Int_t)_fcand1->isRpcClstUsed()<<endl;
            cout<<" isShower1   : "<<setw(3)<<(Int_t)_fcand0->isShowerUsed()  <<", isShower2   : "<<setw(3)<<(Int_t)_fcand1->isShowerUsed()<<endl;
        }
    }

    if( (selection>>3) & 0x01){
	cout<<"primary vertex    : "<<setw(12)<<fEventVertex.X() <<", "<<setw(12)<<fEventVertex.Y()<<", "<<setw(12)<<fEventVertex.Z()<<endl;
	cout<<"decay   vertex    : "<<setw(12)<<fDecayVertex.X() <<", "<<setw(12)<<fDecayVertex.Y()<<", "<<setw(12)<<fDecayVertex.Z()<<endl;
	cout<<"vermindist cand1  : "<<setw(12)<<fVerMinDistCand[0] <<", vermindist cand2 : "<<setw(12)<<fVerMinDistCand[1]<<", mindist candidates : "<<setw(12)<<fMinDistCandidates<<endl;
	cout<<"vermindist mother : "<<setw(12)<<fVerMinDistMother<<", verdist mother   : "<<setw(12)<<fVerDistMother<<endl;
    }


    if( (selection>>4) & 0x01) printFlags();

}





void  HParticlePair::clear()
{
    // clears all data elements but not vectors!
    fcand[0]         = 0;
    fcand[1]         = 0;
    fpair[0]         = 0;
    fpair[1]         = 0;
    fpairFlags       = 0;
    fstatusFlags     = 0;
    fPID[0]          = -10;
    fPID[1]          = -10;
    fMotherPID       = -10;
    foAngle          = -1;
    fIsSimulation    = kFALSE;

    fVerMinDistCand[0]   = 0.;
    fVerMinDistCand[1]   = 0.;
    fVerMinDistMother    = 0.;
    fVerDistMother       = 0.;
    fMinDistCandidates   = 0.;
}

 hparticlepair.cc:1
 hparticlepair.cc:2
 hparticlepair.cc:3
 hparticlepair.cc:4
 hparticlepair.cc:5
 hparticlepair.cc:6
 hparticlepair.cc:7
 hparticlepair.cc:8
 hparticlepair.cc:9
 hparticlepair.cc:10
 hparticlepair.cc:11
 hparticlepair.cc:12
 hparticlepair.cc:13
 hparticlepair.cc:14
 hparticlepair.cc:15
 hparticlepair.cc:16
 hparticlepair.cc:17
 hparticlepair.cc:18
 hparticlepair.cc:19
 hparticlepair.cc:20
 hparticlepair.cc:21
 hparticlepair.cc:22
 hparticlepair.cc:23
 hparticlepair.cc:24
 hparticlepair.cc:25
 hparticlepair.cc:26
 hparticlepair.cc:27
 hparticlepair.cc:28
 hparticlepair.cc:29
 hparticlepair.cc:30
 hparticlepair.cc:31
 hparticlepair.cc:32
 hparticlepair.cc:33
 hparticlepair.cc:34
 hparticlepair.cc:35
 hparticlepair.cc:36
 hparticlepair.cc:37
 hparticlepair.cc:38
 hparticlepair.cc:39
 hparticlepair.cc:40
 hparticlepair.cc:41
 hparticlepair.cc:42
 hparticlepair.cc:43
 hparticlepair.cc:44
 hparticlepair.cc:45
 hparticlepair.cc:46
 hparticlepair.cc:47
 hparticlepair.cc:48
 hparticlepair.cc:49
 hparticlepair.cc:50
 hparticlepair.cc:51
 hparticlepair.cc:52
 hparticlepair.cc:53
 hparticlepair.cc:54
 hparticlepair.cc:55
 hparticlepair.cc:56
 hparticlepair.cc:57
 hparticlepair.cc:58
 hparticlepair.cc:59
 hparticlepair.cc:60
 hparticlepair.cc:61
 hparticlepair.cc:62
 hparticlepair.cc:63
 hparticlepair.cc:64
 hparticlepair.cc:65
 hparticlepair.cc:66
 hparticlepair.cc:67
 hparticlepair.cc:68
 hparticlepair.cc:69
 hparticlepair.cc:70
 hparticlepair.cc:71
 hparticlepair.cc:72
 hparticlepair.cc:73
 hparticlepair.cc:74
 hparticlepair.cc:75
 hparticlepair.cc:76
 hparticlepair.cc:77
 hparticlepair.cc:78
 hparticlepair.cc:79
 hparticlepair.cc:80
 hparticlepair.cc:81
 hparticlepair.cc:82
 hparticlepair.cc:83
 hparticlepair.cc:84
 hparticlepair.cc:85
 hparticlepair.cc:86
 hparticlepair.cc:87
 hparticlepair.cc:88
 hparticlepair.cc:89
 hparticlepair.cc:90
 hparticlepair.cc:91
 hparticlepair.cc:92
 hparticlepair.cc:93
 hparticlepair.cc:94
 hparticlepair.cc:95
 hparticlepair.cc:96
 hparticlepair.cc:97
 hparticlepair.cc:98
 hparticlepair.cc:99
 hparticlepair.cc:100
 hparticlepair.cc:101
 hparticlepair.cc:102
 hparticlepair.cc:103
 hparticlepair.cc:104
 hparticlepair.cc:105
 hparticlepair.cc:106
 hparticlepair.cc:107
 hparticlepair.cc:108
 hparticlepair.cc:109
 hparticlepair.cc:110
 hparticlepair.cc:111
 hparticlepair.cc:112
 hparticlepair.cc:113
 hparticlepair.cc:114
 hparticlepair.cc:115
 hparticlepair.cc:116
 hparticlepair.cc:117
 hparticlepair.cc:118
 hparticlepair.cc:119
 hparticlepair.cc:120
 hparticlepair.cc:121
 hparticlepair.cc:122
 hparticlepair.cc:123
 hparticlepair.cc:124
 hparticlepair.cc:125
 hparticlepair.cc:126
 hparticlepair.cc:127
 hparticlepair.cc:128
 hparticlepair.cc:129
 hparticlepair.cc:130
 hparticlepair.cc:131
 hparticlepair.cc:132
 hparticlepair.cc:133
 hparticlepair.cc:134
 hparticlepair.cc:135
 hparticlepair.cc:136
 hparticlepair.cc:137
 hparticlepair.cc:138
 hparticlepair.cc:139
 hparticlepair.cc:140
 hparticlepair.cc:141
 hparticlepair.cc:142
 hparticlepair.cc:143
 hparticlepair.cc:144
 hparticlepair.cc:145
 hparticlepair.cc:146
 hparticlepair.cc:147
 hparticlepair.cc:148
 hparticlepair.cc:149
 hparticlepair.cc:150
 hparticlepair.cc:151
 hparticlepair.cc:152
 hparticlepair.cc:153
 hparticlepair.cc:154
 hparticlepair.cc:155
 hparticlepair.cc:156
 hparticlepair.cc:157
 hparticlepair.cc:158
 hparticlepair.cc:159
 hparticlepair.cc:160
 hparticlepair.cc:161
 hparticlepair.cc:162
 hparticlepair.cc:163
 hparticlepair.cc:164
 hparticlepair.cc:165
 hparticlepair.cc:166
 hparticlepair.cc:167
 hparticlepair.cc:168
 hparticlepair.cc:169
 hparticlepair.cc:170
 hparticlepair.cc:171
 hparticlepair.cc:172
 hparticlepair.cc:173
 hparticlepair.cc:174
 hparticlepair.cc:175
 hparticlepair.cc:176
 hparticlepair.cc:177
 hparticlepair.cc:178
 hparticlepair.cc:179
 hparticlepair.cc:180
 hparticlepair.cc:181
 hparticlepair.cc:182
 hparticlepair.cc:183
 hparticlepair.cc:184
 hparticlepair.cc:185
 hparticlepair.cc:186
 hparticlepair.cc:187
 hparticlepair.cc:188
 hparticlepair.cc:189
 hparticlepair.cc:190
 hparticlepair.cc:191
 hparticlepair.cc:192
 hparticlepair.cc:193
 hparticlepair.cc:194
 hparticlepair.cc:195
 hparticlepair.cc:196
 hparticlepair.cc:197
 hparticlepair.cc:198
 hparticlepair.cc:199
 hparticlepair.cc:200
 hparticlepair.cc:201
 hparticlepair.cc:202
 hparticlepair.cc:203
 hparticlepair.cc:204
 hparticlepair.cc:205
 hparticlepair.cc:206
 hparticlepair.cc:207
 hparticlepair.cc:208
 hparticlepair.cc:209
 hparticlepair.cc:210
 hparticlepair.cc:211
 hparticlepair.cc:212
 hparticlepair.cc:213
 hparticlepair.cc:214
 hparticlepair.cc:215
 hparticlepair.cc:216
 hparticlepair.cc:217
 hparticlepair.cc:218
 hparticlepair.cc:219
 hparticlepair.cc:220
 hparticlepair.cc:221
 hparticlepair.cc:222
 hparticlepair.cc:223
 hparticlepair.cc:224
 hparticlepair.cc:225
 hparticlepair.cc:226
 hparticlepair.cc:227
 hparticlepair.cc:228
 hparticlepair.cc:229
 hparticlepair.cc:230
 hparticlepair.cc:231
 hparticlepair.cc:232
 hparticlepair.cc:233
 hparticlepair.cc:234
 hparticlepair.cc:235
 hparticlepair.cc:236
 hparticlepair.cc:237
 hparticlepair.cc:238
 hparticlepair.cc:239
 hparticlepair.cc:240
 hparticlepair.cc:241
 hparticlepair.cc:242
 hparticlepair.cc:243
 hparticlepair.cc:244
 hparticlepair.cc:245
 hparticlepair.cc:246
 hparticlepair.cc:247
 hparticlepair.cc:248
 hparticlepair.cc:249
 hparticlepair.cc:250
 hparticlepair.cc:251
 hparticlepair.cc:252
 hparticlepair.cc:253
 hparticlepair.cc:254
 hparticlepair.cc:255
 hparticlepair.cc:256
 hparticlepair.cc:257
 hparticlepair.cc:258
 hparticlepair.cc:259
 hparticlepair.cc:260
 hparticlepair.cc:261
 hparticlepair.cc:262
 hparticlepair.cc:263
 hparticlepair.cc:264
 hparticlepair.cc:265
 hparticlepair.cc:266
 hparticlepair.cc:267
 hparticlepair.cc:268
 hparticlepair.cc:269
 hparticlepair.cc:270
 hparticlepair.cc:271
 hparticlepair.cc:272
 hparticlepair.cc:273
 hparticlepair.cc:274
 hparticlepair.cc:275
 hparticlepair.cc:276
 hparticlepair.cc:277
 hparticlepair.cc:278
 hparticlepair.cc:279
 hparticlepair.cc:280
 hparticlepair.cc:281
 hparticlepair.cc:282
 hparticlepair.cc:283
 hparticlepair.cc:284
 hparticlepair.cc:285
 hparticlepair.cc:286
 hparticlepair.cc:287
 hparticlepair.cc:288
 hparticlepair.cc:289
 hparticlepair.cc:290
 hparticlepair.cc:291
 hparticlepair.cc:292
 hparticlepair.cc:293
 hparticlepair.cc:294
 hparticlepair.cc:295
 hparticlepair.cc:296
 hparticlepair.cc:297
 hparticlepair.cc:298
 hparticlepair.cc:299
 hparticlepair.cc:300
 hparticlepair.cc:301
 hparticlepair.cc:302
 hparticlepair.cc:303
 hparticlepair.cc:304
 hparticlepair.cc:305
 hparticlepair.cc:306
 hparticlepair.cc:307
 hparticlepair.cc:308
 hparticlepair.cc:309
 hparticlepair.cc:310
 hparticlepair.cc:311
 hparticlepair.cc:312
 hparticlepair.cc:313
 hparticlepair.cc:314
 hparticlepair.cc:315
 hparticlepair.cc:316
 hparticlepair.cc:317
 hparticlepair.cc:318
 hparticlepair.cc:319
 hparticlepair.cc:320
 hparticlepair.cc:321
 hparticlepair.cc:322
 hparticlepair.cc:323
 hparticlepair.cc:324
 hparticlepair.cc:325
 hparticlepair.cc:326
 hparticlepair.cc:327
 hparticlepair.cc:328
 hparticlepair.cc:329
 hparticlepair.cc:330
 hparticlepair.cc:331
 hparticlepair.cc:332
 hparticlepair.cc:333
 hparticlepair.cc:334
 hparticlepair.cc:335
 hparticlepair.cc:336
 hparticlepair.cc:337
 hparticlepair.cc:338
 hparticlepair.cc:339
 hparticlepair.cc:340
 hparticlepair.cc:341
 hparticlepair.cc:342
 hparticlepair.cc:343
 hparticlepair.cc:344
 hparticlepair.cc:345
 hparticlepair.cc:346
 hparticlepair.cc:347
 hparticlepair.cc:348
 hparticlepair.cc:349
 hparticlepair.cc:350
 hparticlepair.cc:351
 hparticlepair.cc:352
 hparticlepair.cc:353
 hparticlepair.cc:354
 hparticlepair.cc:355
 hparticlepair.cc:356
 hparticlepair.cc:357
 hparticlepair.cc:358
 hparticlepair.cc:359
 hparticlepair.cc:360
 hparticlepair.cc:361
 hparticlepair.cc:362
 hparticlepair.cc:363
 hparticlepair.cc:364
 hparticlepair.cc:365
 hparticlepair.cc:366
 hparticlepair.cc:367
 hparticlepair.cc:368
 hparticlepair.cc:369
 hparticlepair.cc:370
 hparticlepair.cc:371
 hparticlepair.cc:372
 hparticlepair.cc:373
 hparticlepair.cc:374
 hparticlepair.cc:375
 hparticlepair.cc:376
 hparticlepair.cc:377
 hparticlepair.cc:378
 hparticlepair.cc:379
 hparticlepair.cc:380
 hparticlepair.cc:381
 hparticlepair.cc:382
 hparticlepair.cc:383
 hparticlepair.cc:384
 hparticlepair.cc:385
 hparticlepair.cc:386
 hparticlepair.cc:387
 hparticlepair.cc:388
 hparticlepair.cc:389
 hparticlepair.cc:390
 hparticlepair.cc:391
 hparticlepair.cc:392
 hparticlepair.cc:393
 hparticlepair.cc:394
 hparticlepair.cc:395
 hparticlepair.cc:396
 hparticlepair.cc:397
 hparticlepair.cc:398
 hparticlepair.cc:399
 hparticlepair.cc:400
 hparticlepair.cc:401
 hparticlepair.cc:402
 hparticlepair.cc:403
 hparticlepair.cc:404
 hparticlepair.cc:405
 hparticlepair.cc:406
 hparticlepair.cc:407
 hparticlepair.cc:408
 hparticlepair.cc:409
 hparticlepair.cc:410
 hparticlepair.cc:411
 hparticlepair.cc:412
 hparticlepair.cc:413
 hparticlepair.cc:414
 hparticlepair.cc:415
 hparticlepair.cc:416
 hparticlepair.cc:417
 hparticlepair.cc:418
 hparticlepair.cc:419
 hparticlepair.cc:420
 hparticlepair.cc:421
 hparticlepair.cc:422
 hparticlepair.cc:423
 hparticlepair.cc:424
 hparticlepair.cc:425
 hparticlepair.cc:426
 hparticlepair.cc:427
 hparticlepair.cc:428
 hparticlepair.cc:429
 hparticlepair.cc:430
 hparticlepair.cc:431
 hparticlepair.cc:432
 hparticlepair.cc:433
 hparticlepair.cc:434
 hparticlepair.cc:435
 hparticlepair.cc:436
 hparticlepair.cc:437
 hparticlepair.cc:438
 hparticlepair.cc:439
 hparticlepair.cc:440
 hparticlepair.cc:441
 hparticlepair.cc:442
 hparticlepair.cc:443
 hparticlepair.cc:444
 hparticlepair.cc:445
 hparticlepair.cc:446
 hparticlepair.cc:447
 hparticlepair.cc:448
 hparticlepair.cc:449
 hparticlepair.cc:450
 hparticlepair.cc:451
 hparticlepair.cc:452
 hparticlepair.cc:453
 hparticlepair.cc:454
 hparticlepair.cc:455
 hparticlepair.cc:456
 hparticlepair.cc:457
 hparticlepair.cc:458
 hparticlepair.cc:459
 hparticlepair.cc:460
 hparticlepair.cc:461
 hparticlepair.cc:462
 hparticlepair.cc:463
 hparticlepair.cc:464
 hparticlepair.cc:465
 hparticlepair.cc:466
 hparticlepair.cc:467
 hparticlepair.cc:468
 hparticlepair.cc:469
 hparticlepair.cc:470
 hparticlepair.cc:471
 hparticlepair.cc:472
 hparticlepair.cc:473
 hparticlepair.cc:474
 hparticlepair.cc:475
 hparticlepair.cc:476
 hparticlepair.cc:477
 hparticlepair.cc:478
 hparticlepair.cc:479
 hparticlepair.cc:480
 hparticlepair.cc:481
 hparticlepair.cc:482
 hparticlepair.cc:483
 hparticlepair.cc:484
 hparticlepair.cc:485
 hparticlepair.cc:486
 hparticlepair.cc:487
 hparticlepair.cc:488
 hparticlepair.cc:489
 hparticlepair.cc:490
 hparticlepair.cc:491
 hparticlepair.cc:492
 hparticlepair.cc:493
 hparticlepair.cc:494
 hparticlepair.cc:495
 hparticlepair.cc:496
 hparticlepair.cc:497
 hparticlepair.cc:498
 hparticlepair.cc:499
 hparticlepair.cc:500
 hparticlepair.cc:501
 hparticlepair.cc:502
 hparticlepair.cc:503
 hparticlepair.cc:504
 hparticlepair.cc:505
 hparticlepair.cc:506
 hparticlepair.cc:507
 hparticlepair.cc:508
 hparticlepair.cc:509
 hparticlepair.cc:510
 hparticlepair.cc:511
 hparticlepair.cc:512
 hparticlepair.cc:513
 hparticlepair.cc:514
 hparticlepair.cc:515
 hparticlepair.cc:516
 hparticlepair.cc:517
 hparticlepair.cc:518
 hparticlepair.cc:519
 hparticlepair.cc:520
 hparticlepair.cc:521
 hparticlepair.cc:522
 hparticlepair.cc:523
 hparticlepair.cc:524
 hparticlepair.cc:525
 hparticlepair.cc:526
 hparticlepair.cc:527
 hparticlepair.cc:528
 hparticlepair.cc:529
 hparticlepair.cc:530
 hparticlepair.cc:531
 hparticlepair.cc:532
 hparticlepair.cc:533
 hparticlepair.cc:534
 hparticlepair.cc:535
 hparticlepair.cc:536
 hparticlepair.cc:537
 hparticlepair.cc:538
 hparticlepair.cc:539
 hparticlepair.cc:540
 hparticlepair.cc:541
 hparticlepair.cc:542
 hparticlepair.cc:543
 hparticlepair.cc:544
 hparticlepair.cc:545
 hparticlepair.cc:546
 hparticlepair.cc:547
 hparticlepair.cc:548
 hparticlepair.cc:549
 hparticlepair.cc:550
 hparticlepair.cc:551
 hparticlepair.cc:552
 hparticlepair.cc:553
 hparticlepair.cc:554
 hparticlepair.cc:555
 hparticlepair.cc:556
 hparticlepair.cc:557
 hparticlepair.cc:558
 hparticlepair.cc:559
 hparticlepair.cc:560
 hparticlepair.cc:561
 hparticlepair.cc:562
 hparticlepair.cc:563
 hparticlepair.cc:564
 hparticlepair.cc:565
 hparticlepair.cc:566
 hparticlepair.cc:567
 hparticlepair.cc:568
 hparticlepair.cc:569
 hparticlepair.cc:570
 hparticlepair.cc:571
 hparticlepair.cc:572
 hparticlepair.cc:573
 hparticlepair.cc:574
 hparticlepair.cc:575
 hparticlepair.cc:576
 hparticlepair.cc:577
 hparticlepair.cc:578
 hparticlepair.cc:579
 hparticlepair.cc:580
 hparticlepair.cc:581
 hparticlepair.cc:582
 hparticlepair.cc:583
 hparticlepair.cc:584
 hparticlepair.cc:585
 hparticlepair.cc:586
 hparticlepair.cc:587
 hparticlepair.cc:588
 hparticlepair.cc:589
 hparticlepair.cc:590
 hparticlepair.cc:591
 hparticlepair.cc:592
 hparticlepair.cc:593
 hparticlepair.cc:594
 hparticlepair.cc:595
 hparticlepair.cc:596
 hparticlepair.cc:597
 hparticlepair.cc:598
 hparticlepair.cc:599
 hparticlepair.cc:600
 hparticlepair.cc:601
 hparticlepair.cc:602
 hparticlepair.cc:603
 hparticlepair.cc:604
 hparticlepair.cc:605
 hparticlepair.cc:606
 hparticlepair.cc:607
 hparticlepair.cc:608
 hparticlepair.cc:609
 hparticlepair.cc:610
 hparticlepair.cc:611
 hparticlepair.cc:612
 hparticlepair.cc:613
 hparticlepair.cc:614
 hparticlepair.cc:615
 hparticlepair.cc:616
 hparticlepair.cc:617
 hparticlepair.cc:618
 hparticlepair.cc:619
 hparticlepair.cc:620
 hparticlepair.cc:621
 hparticlepair.cc:622
 hparticlepair.cc:623
 hparticlepair.cc:624
 hparticlepair.cc:625
 hparticlepair.cc:626
 hparticlepair.cc:627
 hparticlepair.cc:628
 hparticlepair.cc:629
 hparticlepair.cc:630
 hparticlepair.cc:631
 hparticlepair.cc:632
 hparticlepair.cc:633
 hparticlepair.cc:634
 hparticlepair.cc:635
 hparticlepair.cc:636
 hparticlepair.cc:637
 hparticlepair.cc:638
 hparticlepair.cc:639
 hparticlepair.cc:640
 hparticlepair.cc:641
 hparticlepair.cc:642
 hparticlepair.cc:643
 hparticlepair.cc:644
 hparticlepair.cc:645
 hparticlepair.cc:646
 hparticlepair.cc:647
 hparticlepair.cc:648
 hparticlepair.cc:649
 hparticlepair.cc:650
 hparticlepair.cc:651
 hparticlepair.cc:652
 hparticlepair.cc:653
 hparticlepair.cc:654
 hparticlepair.cc:655
 hparticlepair.cc:656
 hparticlepair.cc:657
 hparticlepair.cc:658
 hparticlepair.cc:659
 hparticlepair.cc:660
 hparticlepair.cc:661
 hparticlepair.cc:662
 hparticlepair.cc:663
 hparticlepair.cc:664
 hparticlepair.cc:665
 hparticlepair.cc:666
 hparticlepair.cc:667
 hparticlepair.cc:668
 hparticlepair.cc:669
 hparticlepair.cc:670
 hparticlepair.cc:671
 hparticlepair.cc:672
 hparticlepair.cc:673
 hparticlepair.cc:674
 hparticlepair.cc:675
 hparticlepair.cc:676
 hparticlepair.cc:677
 hparticlepair.cc:678
 hparticlepair.cc:679
 hparticlepair.cc:680
 hparticlepair.cc:681
 hparticlepair.cc:682
 hparticlepair.cc:683
 hparticlepair.cc:684
 hparticlepair.cc:685
 hparticlepair.cc:686
 hparticlepair.cc:687
 hparticlepair.cc:688
 hparticlepair.cc:689
 hparticlepair.cc:690
 hparticlepair.cc:691
 hparticlepair.cc:692
 hparticlepair.cc:693
 hparticlepair.cc:694
 hparticlepair.cc:695
 hparticlepair.cc:696
 hparticlepair.cc:697