#include "hpidsingleleptoneff.h"
#include "hades.h"
#include "hcategory.h"
#include "hevent.h"
#include "hgeantkine.h"
#include "hgeantmdc.h"
#include "hgeantshower.h"
#include "hgeanttof.h"
#include "hiterator.h"
#include "hmdcseg.h"
#include "hpairdata.h"
#include "hpairfl.h"
#include "hpairgeantdata.h"
#include "hpairsim.h"
#include "hpidfl.h"
#include "hpidparticlesim.h"
#include "hreconstructor.h"
#include "pairsdef.h"
#include "piddef.h"
#include "TFile.h"
#include "TMath.h"
#include "TNtuple.h"
#include "TString.h"
#include "TVector3.h"
#include <iostream>
using namespace std;
ClassImp(HPidSingleLeptonEff)
HPidSingleLeptonEff::HPidSingleLeptonEff(const Char_t * file)
: HReconstructor("PidPartFiller","Filler of HPidParticle category")
{
out = new TFile(file,"recreate");
bookNTuple();
maxNParticle = 100;
}
HPidSingleLeptonEff::~HPidSingleLeptonEff()
{
if( NULL != out )
{
delete out;
out = NULL;
}
if ( NULL != pitPartCat )
{
delete pitPartCat;
pitPartCat = NULL;
}
if ( NULL != pitPairCat )
{
delete pitPairCat;
pitPairCat = NULL;
}
if ( NULL != pitGeant )
{
delete pitGeant;
pitGeant = NULL;
}
if ( NULL != pitGeant1 )
{
delete pitGeant1;
pitGeant1 = NULL;
}
}
HPidSingleLeptonEff::HPidSingleLeptonEff(const Text_t name[],const Text_t title[], const Char_t * file)
: HReconstructor(name,title)
{
out = new TFile(file,"recreate");
bookNTuple();
maxNParticle = 100;
}
void HPidSingleLeptonEff::bookNTuple()
{
simYieldEle = new TNtuple("simYieldEle","simYieldEle","p:theta:phi:pt");
simYieldPos = new TNtuple("simYieldPos","simYieldPos","p:theta:phi:pt");
TString sVarList("pRecon:pGeant:thetaRecon:thetaGeant:"
"phiRecon:phiGeant:ptGeant:isCutNb:"
"commonTrack:bitFieldPassedCuts:"
"angleHadronFitted:angleHadronNonFitted:"
"angleLeptonFitted:angleLeptonNonFitted:"
"isRing:innerChi2:rkChi2:metaMatchQality:"
"metaMatchRK:vertX:vertY:vertZ:"
"outerChi2:isHiddenLepton:beta:"
"pairVertx:pairVerty:pairVertz:"
"opang:pReconPartner:pidRecPartner"
);
effEle = new TNtuple("effEle", "effEle", sVarList);
effPos = new TNtuple("effPos", "effPos", sVarList);
acceEle = new TNtuple("acceEle", "acceEle", "p:theta:phi:pt");
accePos = new TNtuple("accePos", "accePos", "p:theta:phi:pt");
}
Bool_t HPidSingleLeptonEff::init(void)
{
if( NULL == (pPartCat = gHades->getCurrentEvent()->getCategory(catPidPart)))
{
Error("init", "No category catPidPart");
return kFALSE;
}
pitPartCat = (HIterator *)pPartCat->MakeIterator();
if( NULL == (pPairCat = gHades->getCurrentEvent()->getCategory(catPairs)) )
{
Error("init", "No category catPairs");
return kFALSE;
}
pitPairCat = (HIterator *) pPairCat->MakeIterator();
if( NULL == (pGeantCat = gHades->getCurrentEvent()->getCategory(catGeantKine)) )
{
Error("init", "No category catGeantKine ");
return kFALSE;
}
pitGeant = (HIterator *)pGeantCat->MakeIterator();
pitGeant1 = (HIterator *)pGeantCat->MakeIterator();
if( NULL == gHades->getCurrentEvent()->getCategory(catMdcGeantRaw) )
{
Error("init", "No category catMdcGeantRaw ");
return kFALSE;
}
if( NULL == gHades->getCurrentEvent()->getCategory(catTofGeantRaw) )
{
Error("init", "No category catTofGeantRaw ");
return kFALSE;
}
if( NULL == gHades->getCurrentEvent()->getCategory(catShowerGeantRaw) )
{
Error("init", "No category catTofGeantRaw ");
return kFALSE;
}
if ( NULL == (pEvtHeader = (HEventHeader*) gHades->getCurrentEvent()->getHeader()) )
{
Error("init", "Event header not found");
return kFALSE;
}
return kTRUE;
}
Int_t HPidSingleLeptonEff::execute(void)
{
HGeantKine *pKine = NULL;
TVector3 pD;
Float_t xMom,yMom,zMom;
Int_t aTrackLepton, aIDLepton;
Int_t aParLepton, aMedLepton, aMechLepton;
Int_t* partIndex = new Int_t[maxNParticle];
for( Int_t i = 0; i < maxNParticle; ++i )
partIndex[i] = 0;
removecloseTracks(partIndex);
pitGeant->Reset();
while( NULL != (pKine = (HGeantKine*) pitGeant->Next()) )
{
pKine->getParticle(aTrackLepton,aIDLepton);
pKine->getCreator (aParLepton,aMedLepton,aMechLepton);
if(aParLepton == 0 && (aIDLepton == 2 || aIDLepton == 3))
{
if( aTrackLepton >= maxNParticle )
{
Warning("execute","Track number of lepton exceeded maxNumber ! skipping!");
break;
}
pKine->getMomentum(xMom, yMom, zMom);
pD.SetXYZ(xMom, yMom, zMom);
if( aIDLepton == 3 )
simYieldEle->Fill(pD.Mag(),pD.Theta()*TMath::RadToDeg(),transformPhi(pD.Phi()),pD.Pt());
if( aIDLepton == 2 )
simYieldPos->Fill(pD.Mag(),pD.Theta()*TMath::RadToDeg(),transformPhi(pD.Phi()),pD.Pt());
if (partIndex[aTrackLepton] == 0) checkEff(pKine);
}
}
delete [] partIndex;
return 0;
}
void HPidSingleLeptonEff::removecloseTracks(Int_t* p)
{
HGeantKine *pKine1 = NULL;
HGeantKine *pKine2 = NULL;
Int_t aTrackLepton1, aIDLepton1;
Int_t aTrackLepton2, aIDLepton2;
Int_t aParLepton1, aMedLepton1, aMechLepton1;
Int_t aParLepton2, aMedLepton2, aMechLepton2;
pitGeant->Reset();
while( NULL != (pKine1 = (HGeantKine*) pitGeant->Next()) )
{
pKine1->getParticle(aTrackLepton1, aIDLepton1);
pKine1->getCreator (aParLepton1, aMedLepton1, aMechLepton1);
if ( aParLepton1 == 0 && (aIDLepton1 == 2 || aIDLepton1 == 3) )
{
if( aTrackLepton1 >= maxNParticle )
{
Warning("removecloseTracks", "Track number of lepton exceeded maxNumber ! skipping!");
break;
}
pitGeant1->Reset();
while( NULL != (pKine2 = (HGeantKine*) pitGeant1->Next()) )
{
if ( pKine1->getSector() != pKine2->getSector() )
continue;
pKine2->getParticle(aTrackLepton2, aIDLepton2);
pKine2->getCreator (aParLepton2, aMedLepton2, aMechLepton2);
if(aParLepton2 == 0 &&
(aIDLepton2 == 2 || aIDLepton2 == 3) &&
aTrackLepton1 != aTrackLepton2 )
{
if(calcOpeningAngleKine(pKine1, pKine2) < 9.0)
{
p[aTrackLepton1] = 1;
}
}
}
}
}
}
Float_t HPidSingleLeptonEff::calcOpeningAngleKine(HGeantKine* kine1,
HGeantKine* kine2)
{
TVector3 vec1;
TVector3 vec2;
Float_t xMom1,yMom1,zMom1;
Float_t xMom2,yMom2,zMom2;
if ( NULL != kine1 )
{
kine1->getMomentum(xMom1, yMom1, zMom1);
vec1.SetX(xMom1);
vec1.SetY(yMom1);
vec1.SetZ(zMom1);
}
else
{
Error("calcOpeningAngleKine", "First pointer is NULL");
return -1.;
}
if ( NULL != kine2 )
{
kine2->getMomentum(xMom2, yMom2, zMom2);
vec2.SetX(xMom2);
vec2.SetY(yMom2);
vec2.SetZ(zMom2);
}
else
{
Error("calcOpeningAngleKine", "Second pointer is NULL");
return -1.;
}
return TMath::RadToDeg() * vec1.Angle(vec2);
}
void HPidSingleLeptonEff::checkEff(HGeantKine* pKine)
{
HPairSim* pair = NULL;
HPidParticleSim* part = NULL;
HPidParticleSim* part2 = NULL;
const HPidHitData* pHitData = NULL;
const HPidTrackData* pTrackData = NULL;
TVector3 pD;
TVector3 pairvertex;
TVector3 pairdistance;
Float_t xMom = 0.;
Float_t yMom = 0.;
Float_t zMom = 0.;
Float_t thetaExp = 0.;
Float_t phiExp = 0.;
Float_t momExp = 0.;
Float_t mmRK = -1.;
Int_t aTrackLepton, aIDLepton;
Int_t comDet = 0;
Int_t whichParticle = -1;
Int_t indexPart = -1;
Bool_t isHiddenLepton = kFALSE;
Bool_t flagPair = 0;
Bool_t isGoodPair = 0;
pKine->getMomentum(xMom, yMom, zMom);
pKine->getParticle(aTrackLepton, aIDLepton);
pD.SetXYZ(xMom, yMom, zMom);
if( isGeantTrackInAcceptance(pKine) )
{
if(aIDLepton == 2) accePos->Fill(pD.Mag(),pD.Theta() * TMath::RadToDeg(),transformPhi(pD.Phi()),pD.Pt());
if(aIDLepton == 3) acceEle->Fill(pD.Mag(),pD.Theta() * TMath::RadToDeg(),transformPhi(pD.Phi()),pD.Pt());
} else return;
pitPairCat->Reset();
while ( NULL != ( pair = (HPairSim*) pitPairCat->Next()) )
{
comDet = checkTrackId(pair, aTrackLepton, whichParticle, isHiddenLepton);
if( comDet >= 76 )
{
flagPair = 1;
if (pair->getIsCutFlag() != 1 && isGoodPair == 0 )
{
calculateTrackProperties(pair, thetaExp, phiExp, momExp, whichParticle);
if (whichParticle == 1) indexPart = pair->getIndexParticle1();
else if (whichParticle == 2) indexPart = pair->getIndexParticle2();
else {
Error("checkEff()","Wrong number for particle selection!");
continue;
}
part = (HPidParticleSim*) pPartCat->getObject(indexPart);
pHitData = part->getHitData();
pTrackData = part->getTrackData();
mmRK = TMath::Sqrt(pTrackData->getRkMetadx() * pTrackData->getRkMetadx() +
pTrackData->getRkMetady() * pTrackData->getRkMetady() +
pTrackData->getRkMetadz() * pTrackData->getRkMetadz() );
HPairFL::calcVertex((HPidParticleSim*) pPartCat->getObject(pair->getIndexParticle1()),
(HPidParticleSim*) pPartCat->getObject(pair->getIndexParticle2()),
&pairvertex,&pairdistance);
if (whichParticle == 1) part2 = (HPidParticleSim*) pPartCat->getObject(pair->getIndexParticle2());
else if (whichParticle == 2) part2 = (HPidParticleSim*) pPartCat->getObject(pair->getIndexParticle1());
Float_t aVar[] = {
momExp,
pD.Mag(),
thetaExp,
pD.Theta() * TMath::RadToDeg(),
phiExp,
transformPhi(pD.Phi()),
pD.Pt(),
pair->getIsCutFlag(),
comDet,
pair->getBitFieldPassedCuts(),
pTrackData->getAngleWithClosestCandidate(-1, 1),
pTrackData->getAngleWithClosestCandidate(-1, -1),
pTrackData->getAngleWithClosestCandidate( 1, 1),
pTrackData->getAngleWithClosestCandidate( 1, -1),
static_cast<Float_t>(pHitData->getRingCorrelation(4)),
pHitData->getInnerMdcChiSquare(),
pTrackData->getRKChiSquare(),
pTrackData->getMetaMatchingQuality(),
mmRK,
pEvtHeader->getVertex().getX(),
pEvtHeader->getVertex().getY(),
pEvtHeader->getVertex().getZ(),
pHitData->getOuterMdcChiSquare(),
isHiddenLepton,
pTrackData->fTofRecBeta[4],
pairvertex.x(),
pairvertex.y(),
pairvertex.z(),
pair->getOpeningAngleDeg(),
part2->P(),
part2->getPid()
};
if(aIDLepton == 3) effEle->Fill(aVar);
if(aIDLepton == 2) effPos->Fill(aVar);
isGoodPair = 1;
}
}
}
if ( 0 == flagPair )
{
pitPartCat->Reset();
while( NULL != (part = ( HPidParticleSim *)pitPartCat->Next()) )
{
comDet = checkSingleTrack(part, aTrackLepton, isHiddenLepton);
if(comDet >= 76)
{
pHitData = part->getHitData();
pTrackData = part->getTrackData();
mmRK = TMath::Sqrt(pTrackData->getRkMetadx() * pTrackData->getRkMetadx() +
pTrackData->getRkMetady() * pTrackData->getRkMetady() +
pTrackData->getRkMetadz() * pTrackData->getRkMetadz() );
Float_t aVar[] = {
part->P(),
pD.Mag(),
part->thetaDeg(),
pD.Theta() * TMath::RadToDeg(),
part->phiDeg(),
transformPhi(pD.Phi()),
pD.Pt(),
-1,
comDet,
-1,
pTrackData->getAngleWithClosestCandidate(-1, 1),
pTrackData->getAngleWithClosestCandidate(-1, -1),
pTrackData->getAngleWithClosestCandidate( 1, 1),
pTrackData->getAngleWithClosestCandidate( 1, -1),
static_cast<Float_t>(pHitData->getRingCorrelation(4)),
pHitData->getInnerMdcChiSquare(),
pTrackData->getRKChiSquare(),
pTrackData->getMetaMatchingQuality(),
mmRK,
pEvtHeader->getVertex().getX(),
pEvtHeader->getVertex().getY(),
pEvtHeader->getVertex().getZ(),
pHitData->getOuterMdcChiSquare(),
isHiddenLepton,
pTrackData->fTofRecBeta[4],
-1000,
-1000,
-1000,
-1,
-1,
-1
};
if(aIDLepton == 3) effEle ->Fill(aVar);
if(aIDLepton == 2) effPos->Fill(aVar);
break;
}
}
}
}
Int_t HPidSingleLeptonEff::checkSingleTrack(HPidParticleSim* part,
Int_t lepTrackNb,
Bool_t& isHiddenLepton)
{
Int_t comDet = 0;
HGeantKine* kine = NULL;
isHiddenLepton = kFALSE;
kine = (HGeantKine*) pGeantCat->getObject(lepTrackNb - 1);
if(part->getGeantTrackSet()->getGeantTrackID() == lepTrackNb &&
part->getGeantTrackSet()->getGeantParentTrackID() == 0 &&
part->getHitData()->getRingCorrelation(4) == kTRUE &&
(part->getPid() == 2 || part->getPid() == 3) &&
kine->getID() == part->getPid()
)
{
comDet = part->getGeantTrackSet()->getMostCommonCorrelation();
if( comDet < 76 && part->getSystem() == 0 )
{
UInt_t nShowerTracks = part->getGeantTrackSet()->getNShowerTracks();
if(nShowerTracks > 1){
for(UInt_t i = 0; i < nShowerTracks; i ++){
if(part->getGeantTrackSet()->getShowerTrack(i) == lepTrackNb){
comDet = comDet | kSeenInMETA;
isHiddenLepton = kTRUE;
break;
}
}
}
} else {
isHiddenLepton = kFALSE;
}
return comDet;
} else {
return 0;
}
}
Int_t HPidSingleLeptonEff::checkTrackId(HPairSim* p,
Int_t lepTrackNb,
Int_t& whichPart,
Bool_t& isHiddenLepton)
{
HPidParticleSim* part = NULL;
HPairGeantData pg(p);
Int_t comDet = 0;
whichPart = -1;
isHiddenLepton = kFALSE;
part = (HPidParticleSim*) pPartCat->getObject(p->getIndexParticle1());
comDet = checkSingleTrack(part, lepTrackNb, isHiddenLepton);
if ( comDet > 0 )
{
if ( (pg.getParentTrackNumber2() == 0 &&
(pg.getGPid2() != 2 && pg.getGPid2() != 3)) ||
(pg.getParentTrackNumber2() != 0 ))
{
whichPart = 1;
return comDet;
}
else return 0;
}
part = (HPidParticleSim*) pPartCat->getObject(p->getIndexParticle2());
comDet = checkSingleTrack(part,lepTrackNb,isHiddenLepton);
if ( comDet > 0 )
{
if ( (pg.getParentTrackNumber1() == 0 &&
(pg.getGPid1() != 2 && pg.getGPid1() != 3)) ||
(pg.getParentTrackNumber1() != 0 ))
{
whichPart = 2;
return comDet;
}
else return 0;
}
return 0;
}
void HPidSingleLeptonEff::calculateTrackProperties(HPairSim* pair,
Float_t& th,
Float_t& ph,
Float_t& p,
Int_t whichParticle)
{
HPairGeantData pg(pair);
HPairData pd(pair);
if ( 1 == whichParticle && 0 == pg.getParentTrackNumber1() )
{
th = pd.getThetaDeg1();
ph = pd.getPhiDeg1();
p = pd.getMom1();
}
else if ( 2 == whichParticle && 0 == pg.getParentTrackNumber2() )
{
th = pd.getThetaDeg2();
ph = pd.getPhiDeg2();
p = pd.getMom2();
} else
{
Error("calculateTrackProperties()","Called with not identified Particle number!");
}
}
Bool_t
HPidSingleLeptonEff::isGeantTrackInAcceptance(HGeantKine *pG)
{
Int_t nStatMDC1 = pG->getNMdcHits(0);
Int_t nStatMDC2 = pG->getNMdcHits(1);
Int_t nStatMDC3 = pG->getNMdcHits(2);
Int_t nStatMDC4 = pG->getNMdcHits(3);
Int_t nStatTof = pG->getNTofHits();
Int_t nStatShower = pG->getNShowerHits();
if(nStatMDC1 && nStatMDC2 && ( nStatMDC3 || nStatMDC4 ) && (nStatTof || nStatShower))
{
return kTRUE;
}
return kFALSE;
}
Bool_t HPidSingleLeptonEff::finalize()
{
out->cd();
simYieldEle->Write();
simYieldPos->Write();
effEle ->Write();
effPos ->Write();
acceEle->Write();
accePos->Write();
out->Close();
return kTRUE;
}
Float_t HPidSingleLeptonEff::transformPhi(Float_t Phi)
{
Float_t dPhi;
if( (dPhi = TMath::RadToDeg() * Phi) < 0.0 )
dPhi += 360.0;
return dPhi;
}
Last change: Sat May 22 13:07:26 2010
Last generated: 2010-05-22 13:07
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.