using namespace std;
#include "hmdctrackingeff.h"
#include "hmdcdef.h"
#include "hgeantdef.h"
#include "hdebug.h"
#include "hades.h"
#include "hiterator.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hevent.h"
#include "hcategory.h"
#include "hmatrixcategory.h"
#include "hlinearcategory.h"
#include "hmdcsegsim.h"
#include "hmdcidealclasses.h"
#include "hmdctrkcand.h"
#include "hgeantkine.h"
#include "hgeantshower.h"
#include "hgeanttof.h"
#include "hpidphysicsconstants.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include "TDirectory.h"
#include "TNtuple.h"
#include "TStopwatch.h"
#include "TLorentzVector.h"
ClassImp(HMdcTrackingEff)
HMdcTrackingEff::HMdcTrackingEff(void) {
initVariables();
}
HMdcTrackingEff::HMdcTrackingEff(const Text_t* name,const Text_t* title)
: HReconstructor(name,title)
{
initVariables();
}
HMdcTrackingEff::~HMdcTrackingEff(void) {
}
void HMdcTrackingEff::initVariables()
{
offsetSeg1Kine=nEvnt;
offsetSeg2Kine=nEvnt+nKine+nSeg+nChi2;
offsetSeg1 =nEvnt+nKine;
offsetSeg2 =nEvnt+nKine+nSeg+nChi2+nKine;
offsetChi2 =nSeg;
offsetPair =nEvnt+nKine+nSeg+nChi2+nKine+nSeg+nChi2;
offsetSingle =nEvnt+nKine+nSeg+nChi2;
resetIndexTable(indexTable,maxTrks);
fNameRoot="ntuple_tracking_eff.root";
}
void HMdcTrackingEff::setOutputRoot(TString fname)
{
fNameRoot="";
if(fname.CompareTo("")!=0) fNameRoot = fname;
else {
Warning("setOutputRoot()","Empty string for filename recieved, will use ntuple_tracking_eff.root instead");
fNameRoot ="ntuple_tracking_eff.root";
}
}
Bool_t HMdcTrackingEff::init(void)
{
catmHMdcTrkCand=(HMatrixCategory*)gHades->getCurrentEvent()->getCategory(catMdcTrkCand);
if (!catmHMdcTrkCand) {
Error("init()","No MdcTrkCand cat available!");
exit(1);
} else iterTrkCand=(TIterator*)catmHMdcTrkCand->MakeIterator();
catmHMdcTrkCandIdeal=(HMatrixCategory*)gHades->getCurrentEvent()->getCategory(catMdcTrkCandIdeal);
if (!catmHMdcTrkCandIdeal) {
Error("init()","No MdcTrkCandIdeal cat available!");
exit(1);
} else iterTrkCandIdeal=(TIterator*)catmHMdcTrkCandIdeal->MakeIterator();
catmHMdcSegSim=(HMatrixCategory*)gHades->getCurrentEvent()->getCategory(catMdcSeg);
if (!catmHMdcSegSim) {
Error("init()","No MdcSegSim cat available!");
exit(1);
}
catmHMdcSegIdeal=(HMatrixCategory*)gHades->getCurrentEvent()->getCategory(catMdcSegIdeal);
if (!catmHMdcSegIdeal) {
Error("init()","No MdcSegIdeal cat available!");
exit(1);
}
catlHGeantKine=(HLinearCategory*)gHades->getCurrentEvent()->getCategory(catGeantKine);
if (!catlHGeantKine) {
Error("init()","No GeantKine cat available!");
exit(1);
}
catmHGeantShower=(HMatrixCategory*)gHades->getCurrentEvent()->getCategory(catShowerGeantRaw);
if (!catmHGeantShower) {
Error("init()","No GeantShower cat available!");
exit(1);
} iterGeantShower=(TIterator*)catmHGeantShower->MakeIterator();
catmHGeantTof=(HMatrixCategory*)gHades->getCurrentEvent()->getCategory(catTofGeantRaw);
if (!catmHGeantTof) {
Error("init()","No GeantShower cat available!");
exit(1);
} iterGeantTof=(TIterator*)catmHGeantTof->MakeIterator();
out=new TFile(fNameRoot.Data(),"RECREATE");
out->cd();
single=new TNtuple("single","single","evNr:sector:ptrk:genInfo:genInfo1:genInfo2:gID:mom:vx:vy:vz:"
"rId_1:zId_1:thetaId_1:phiId_1:nWId1_1:nWId2_1:"
"rId_2:zId_2:thetaId_2:phiId_2:nWId1_2:nWId2_2:"
"r_1:z_1:theta_1:phi_1:nW1_1:nW2_1:"
"r_2:z_2:theta_2:phi_2:nW1_2:nW2_2:"
"chi2_1:chi2_2:foundPair:nTracks:meta");
pairs=new TNtuple("pairs","pairs","evNr:"
"sector_1:ptrk_1:genInfo_1:genInfo1_1:genInfo2_1:gID_1:mom_1:vx_1:vy_1:vz_1:"
"rId_1_1:zId_1_1:thetaId_1_1:phiId_1_1:nWId1_1_1:nWId2_1_1:"
"rId_2_1:zId_2_1:thetaId_2_1:phiId_2_1:nWId1_2_1:nWId2_2_1:"
"r_1_1:z_1_1:theta_1_1:phi_1_1:nW1_1_1:nW2_1_1:"
"r_2_1:z_2_1:theta_2_1:phi_2_1:nW1_2_1:nW2_2_1:"
"chi2_1_1:chi2_2_1:"
"sector_2:ptrk_2:genInfo_2:genInfo1_2:genInfo2_2:gID_2:mom_2:vx_2:vy_2:vz_2:"
"rId_1_2:zId_1_2:thetaId_1_2:phiId_1_2:nWId1_1_2:nWId2_1_2:"
"rId_2_2:zId_2_2:thetaId_2_2:phiId_2_2:nWId1_2_2:nWId2_2_2:"
"r_1_2:z_1_2:theta_1_2:phi_1_2:nW1_1_2:nW2_1_2:"
"r_2_2:z_2_2:theta_2_2:phi_2_2:nW1_2_2:nW2_2_2:"
"chi2_1_2:chi2_2_2:"
"nTracks:meta_1:meta_2:"
"openingAngle:invM:pt:rapidity:pairPhi:pairTheta:"
"openingAngle_segId:invM_segId:pt_segId:rapidity_segId:pairPhi_segId:pairTheta_segId:"
"openingAngle_seg:invM_seg:pt_seg:rapidity_seg:pairPhi_seg:pairTheta_seg:"
"gphi_1:gtheta_1:gphi_2:gtheta_2");
fActive=kTRUE;
return kTRUE;
}
void HMdcTrackingEff::getSegPointers(Int_t* iSId_1,HMdcSegSim** pSId_1,
HMdcTrkCand* trkCandIdeal,
HMatrixCategory* catmHMdcSegIdeal,
Int_t mode)
{
iSId_1[0]=trkCandIdeal->getSeg1Ind();
iSId_1[1]=trkCandIdeal->getSeg2Ind();
for(Int_t iseg=0;iseg<2;iseg++)
{
if(iSId_1[iseg]!=-1)
{
pSId_1[iseg]=(HMdcSegSim*)catmHMdcSegIdeal->getObject(iSId_1[iseg]);
} else pSId_1[iseg]=0;
}
if(mode==1)
{
pSId_1[1] =0;
iSId_1[1] =-2;
}
}
HGeantKine* HMdcTrackingEff::getKineInfo(Int_t trkNr,Int_t& parentTrk,Int_t& gID,
Float_t& generatorInfo,
Float_t& generatorInfo1,
Float_t& generatorInfo2,
HLinearCategory* catlHGeantKine)
{
HGeantKine* kine=(HGeantKine*)catlHGeantKine->getObject(trkNr-1);
gID=kine->getID();
kine->getGenerator(generatorInfo,generatorInfo1,generatorInfo2);
parentTrk=kine->getParentTrack();
return kine;
}
Bool_t HMdcTrackingEff::sameTrkSegments(Int_t trkNr,HMdcSegSim** pSeg,Int_t mode)
{
if(mode==0)
{
if(!pSeg[0] || !pSeg[1])
{
Error("sameTrkSegments()","Zero pointer in mode 0 : %i %i !",pSeg[0],pSeg[1]);
exit(1);
}
if(trkNr==pSeg[0]->getTrack(0)&&
trkNr==pSeg[1]->getTrack(0)) {return kTRUE ;}
else {return kFALSE;}
}else{
if(!pSeg[0])
{
Error("sameTrkSegments()","Zero pointer in mode 1 : %i !",pSeg[0]);
exit(1);
}
if(trkNr==pSeg[0]->getTrack(0)) {return kTRUE ;}
else {return kFALSE;}
}
}
HMdcTrkCand* HMdcTrackingEff::findSameRealCand(Int_t trkNr,Int_t* iSeg,HMdcSegSim** pSeg,
TIterator* iterTrkCand,
HMatrixCategory* catmHMdcTrkCand,
HMatrixCategory* catmHMdcSeg,
HLinearCategory* catlHGeantKine)
{
HMdcTrkCand* trkCnd=0;
iSeg[0]=iSeg[1]=-999;
pSeg[0]=pSeg[1]= 0;
Bool_t found=kFALSE;
iterTrkCand->Reset();
while ( (trkCnd=(HMdcTrkCand*)iterTrkCand->Next()) != 0 )
{
Int_t nOuterSeg=trkCnd->getNCandForSeg1();
if(nOuterSeg==-1)
{
continue;
}
getSegPointers(iSeg,pSeg,trkCnd,catmHMdcSeg,1);
if(!sameTrkSegments(trkNr,pSeg,1)) continue;
if(nOuterSeg==0)
{
found=kTRUE;
break;
}
else
{
Int_t nextObjInd=0;
Bool_t foundOuter=kFALSE;
HMdcTrkCand* pTrkCnd=trkCnd;
while (nextObjInd>=0)
{
nextObjInd = pTrkCnd->getNextCandInd();
if(nextObjInd>=0)
{
pTrkCnd = (HMdcTrkCand*)catmHMdcTrkCand->getObject(nextObjInd);
getSegPointers(iSeg,pSeg,pTrkCnd,catmHMdcSeg);
if(sameTrkSegments(trkNr,pSeg))
{
found =kTRUE;
foundOuter=kTRUE;
trkCnd =pTrkCnd;
break;
}
else
{
found =kFALSE;
foundOuter=kFALSE;
}
}
}
if(foundOuter==kTRUE) break;
if(foundOuter==kFALSE)
{
getSegPointers(iSeg,pSeg,trkCnd,catmHMdcSeg,1);
found=kTRUE;
break;
}
}
}
if(found==kFALSE)
{
trkCnd =0;
iSeg[0]=iSeg[1]=-999;
pSeg[0]=pSeg[1]= 0;
}
return trkCnd;
}
TString HMdcTrackingEff::getProcessString(Float_t generatorInfo1_1)
{
TString info="Unknown process ";
if (generatorInfo1_1==7051) info="pi0 dalitz";
else if(generatorInfo1_1==7001) info="conversion";
else if(generatorInfo1_1==17051)info="eta dalitz";
else if(generatorInfo1_1==34051)info="delta dalitz";
else if(generatorInfo1_1==41) info="rho direct";
else if(generatorInfo1_1==52051)info="omega dalitz";
else if(generatorInfo1_1==52) info="omega direct";
else info+=generatorInfo1_1;
return info;
}
Bool_t HMdcTrackingEff::sameDecay(Int_t parenttrk_1,Int_t parenttrk_2,
Float_t generatorInfo1_1,Float_t generatorInfo1_2,
Float_t generatorInfo2_1,Float_t generatorInfo2_2)
{
if(parenttrk_1 == 0 &&
parenttrk_2 == 0 &&
generatorInfo1_1 == generatorInfo1_2 &&
generatorInfo2_1 == generatorInfo2_2 )
{
return kTRUE;
}
else
{
return kFALSE;
}
}
void HMdcTrackingEff::resetIndexTable(Int_t* indexTable,Int_t n)
{
if(n>maxTrks) n=maxTrks;
for(Int_t ii=0;ii<sizeInd*n;ii++)
{
indexTable[ii]=-99;
}
}
Bool_t HMdcTrackingEff::fillIndexTable(Int_t* indexTable,Int_t& track_ct,
Int_t trkNrId_1,
Int_t* indSegId_1,
Int_t* indSeg_1,
HLinearCategory* catlHGeantKine)
{
if(track_ct<maxTrks)
{
Bool_t found=kFALSE;
for(Int_t i=0;i<track_ct;i++)
{
if(indexTable[i*sizeInd+3]==indSeg_1[0]&&indSeg_1[0]>=0)
{
Warning("fillIndexTable()","Same candidate put twice! Skipping!");
found=kTRUE;
break;
}
}
if(!found)
{
Int_t pTrk,gID;
Float_t Info,Info1,Info2;
getKineInfo(trkNrId_1,pTrk,gID,Info,Info1,Info2,catlHGeantKine);
indexTable[track_ct*sizeInd+0]=trkNrId_1;
indexTable[track_ct*sizeInd+1]=indSegId_1[0];
indexTable[track_ct*sizeInd+2]=indSegId_1[1];
indexTable[track_ct*sizeInd+3]=indSeg_1[0];
indexTable[track_ct*sizeInd+4]=indSeg_1[1];
indexTable[track_ct*sizeInd+5]=0;
indexTable[track_ct*sizeInd+6]=pTrk;
indexTable[track_ct*sizeInd+7]=(Int_t)Info;
indexTable[track_ct*sizeInd+8]=(Int_t)Info1;
indexTable[track_ct*sizeInd+9]=(Int_t)Info2;
track_ct++;
} else return kFALSE;
}else{
Warning("fillIndexTable()","Number of Tracks larger than maxTrks! skipped!!");
return kFALSE;
}
return kTRUE;
}
void HMdcTrackingEff::printIndexTable(Int_t* indexTable,Int_t track_ct)
{
if(track_ct<maxTrks)
{
cout<<"trkNr " <<indexTable[track_ct*sizeInd+0]<<endl;
cout<<"\t s1_id " <<indexTable[track_ct*sizeInd+1]<<endl;
cout<<"\t s2_id " <<indexTable[track_ct*sizeInd+2]<<endl;
cout<<"\t s1 " <<indexTable[track_ct*sizeInd+3]<<endl;
cout<<"\t s2 " <<indexTable[track_ct*sizeInd+4]<<endl;
cout<<"\t used " <<indexTable[track_ct*sizeInd+5]<<endl;
cout<<"\t pTrk " <<indexTable[track_ct*sizeInd+6]<<endl;
cout<<"\t I " <<indexTable[track_ct*sizeInd+7]<<endl;
cout<<"\t I1 " <<indexTable[track_ct*sizeInd+8]<<endl;
cout<<"\t I2 " <<indexTable[track_ct*sizeInd+9]<<endl;
}else{
Warning("fillPrintTable()","Number of Tracks larger than maxTrks! skipped!!");
}
}
Int_t HMdcTrackingEff::findPartner(Int_t* iT,Int_t size,Int_t i)
{
if(size<maxTrks)
{
for(Int_t j=0;j<size;j++)
{
if(iT[i*sizeInd+5]==1 ||iT[j*sizeInd+5]==1 ) continue;
if(iT[i*sizeInd+6]==-99||iT[j*sizeInd+6]==-99) continue;
if(i==j) continue;
if(sameDecay(iT[i*sizeInd+6],iT[j*sizeInd+6],
iT[i*sizeInd+8],iT[j*sizeInd+8],
iT[i*sizeInd+9],iT[j*sizeInd+9]))
{
iT[i*sizeInd+5]=1;
iT[j*sizeInd+5]=1;
return j;
}
}
}else{
Warning("findPartner()","Number of Tracks larger than maxTrks! skipped!!");
}
return -1;
}
Bool_t HMdcTrackingEff::hasPartner(Int_t* iT,Int_t size,Int_t i)
{
if(size<maxTrks)
{
if(iT[i*sizeInd+5]==1) return kTRUE;
else return kFALSE;
}else{
Warning("hasPartner()","Number of Tracks larger than maxTrks! skipped!!");
}
return kFALSE;
}
void HMdcTrackingEff::fillSegData(Int_t ind,Int_t* iT,Float_t* data,Int_t offset,
HMatrixCategory* catmHMdcSegIdeal,
HMatrixCategory* catmHMdcSegSim)
{
HMdcSegSim* seg=0;
if(iT[ind*sizeInd+1]>=0)
{
seg=(HMdcSegSim*)catmHMdcSegIdeal->getObject(iT[ind*sizeInd+1]);
data[offset+0]=seg->getRprime();
data[offset+1]=seg->getRprime();
data[offset+2]=seg->getTheta()*TMath::RadToDeg();
data[offset+3]=seg->getPhi() *TMath::RadToDeg();
data[offset+4]=seg->getSumWires(0);
data[offset+5]=seg->getSumWires(1);
}
if(iT[ind*sizeInd+2]>=0)
{
seg=(HMdcSegSim*)catmHMdcSegIdeal->getObject(iT[ind*sizeInd+2]);
data[offset+6] =seg->getRprime();
data[offset+7] =seg->getRprime();
data[offset+8] =seg->getTheta()*TMath::RadToDeg();
data[offset+9] =seg->getPhi() *TMath::RadToDeg();
data[offset+sizeInd]=seg->getSumWires(0);
data[offset+11]=seg->getSumWires(1);
}
if(iT[ind*sizeInd+3]>=0)
{
seg=(HMdcSegSim*)catmHMdcSegSim->getObject(iT[ind*sizeInd+3]);
data[offset+12]=seg->getRprime();
data[offset+13]=seg->getRprime();
data[offset+14]=seg->getTheta()*TMath::RadToDeg();
data[offset+15]=seg->getPhi() *TMath::RadToDeg();
data[offset+16]=seg->getSumWires(0);
data[offset+17]=seg->getSumWires(1);
data[offset+offsetChi2+0]=seg->getChi2();
}
if(iT[ind*sizeInd+4]>=0)
{
seg=(HMdcSegSim*)catmHMdcSegSim->getObject(iT[ind*sizeInd+4]);
data[offset+18]=seg->getRprime();
data[offset+19]=seg->getRprime();
data[offset+20]=seg->getTheta()*TMath::RadToDeg();
data[offset+21]=seg->getPhi() *TMath::RadToDeg();
data[offset+22]=seg->getSumWires(0);
data[offset+23]=seg->getSumWires(1);
data[offset+offsetChi2+1]=seg->getChi2();
}
}
void HMdcTrackingEff::fillKineData(Int_t& sec,Int_t ind,Int_t* iT,Float_t* data,Int_t offset,
HMatrixCategory* catmHMdcSegIdeal,
HLinearCategory* catlHGeantKine)
{
HGeantKine* kine=0;
HMdcSegSim* seg=0;
seg=(HMdcSegSim*)catmHMdcSegIdeal->getObject(iT[ind*sizeInd+1]);
if(iT[ind*sizeInd+0]>=0&&seg)
{
sec=seg->getSec();
Int_t pTrk,gID;
Float_t Info,Info1,Info2;
kine=getKineInfo(iT[ind*sizeInd+0],pTrk,gID,Info,Info1,Info2,catlHGeantKine);
Float_t vx,vy,vz;
kine->getVertex(vx,vy,vz);
data[offset+0]=seg->getSec();
data[offset+1]=pTrk;
data[offset+2]=Info;
data[offset+3]=Info1;
data[offset+4]=Info2;
data[offset+5]=gID;
data[offset+6]=kine->getTotalMomentum();
data[offset+7]=vx;
data[offset+8]=vy;
data[offset+9]=vz;
}else{
Warning("fillKineData()","Segment Pointer 0 or kine index <0 !");
}
}
Int_t HMdcTrackingEff::findGeantMeta(Int_t trkNr,Int_t sector,
TIterator* iterGeantTof,
HMatrixCategory* catmHGeantTof,
TIterator* iterGeantShower,
HMatrixCategory* catmHGeantShower)
{
HGeantShower* showerhit;
iterGeantShower->Reset();
while ( (showerhit=(HGeantShower*)iterGeantShower->Next()) != 0 )
{
if(showerhit->getTrack() !=trkNr) continue;
if(showerhit->getSector()==sector) return 0;
else return -2;
}
HGeantTof* tofhit;
iterGeantTof->Reset();
while ( (tofhit=(HGeantTof*)iterGeantTof->Next()) != 0 )
{
if(tofhit->getTrack() !=trkNr) continue;
if(tofhit->getSector()==sector) return 1;
else return -3;
}
return -1;
}
void HMdcTrackingEff::fillNTuple(Int_t evNr,Int_t* indexTable,Int_t size,
HMatrixCategory* catmHMdcSegSim,
HMatrixCategory* catmHMdcSegIdeal,
HLinearCategory* catlHGeantKine,
TIterator* iterGeantTof,
HMatrixCategory* catmHGeantTof,
TIterator* iterGeantShower,
HMatrixCategory* catmHGeantShower,
TNtuple* single,TNtuple* pairs)
{
resetDataArray();
TLorentzVector vL1;
TLorentzVector vL2;
TLorentzVector vL1_segId;
TLorentzVector vL2_segId;
TLorentzVector vL1_seg;
TLorentzVector vL2_seg;
TVector3 v1;
TVector3 v2;
Int_t sec_1,sec_2;
if(size<maxTrks)
{
for(Int_t i=0;i<size;i++)
{
Int_t j=findPartner(indexTable,size,i);
if(j!=-1)
{
dPairs[0]=evNr;
fillKineData(sec_1,i,indexTable,dPairs,offsetSeg1Kine,catmHMdcSegIdeal,catlHGeantKine);
fillSegData ( i,indexTable,dPairs,offsetSeg1 ,catmHMdcSegIdeal,catmHMdcSegSim);
fillKineData(sec_2,j,indexTable,dPairs,offsetSeg2Kine,catmHMdcSegIdeal,catlHGeantKine);
fillSegData ( j,indexTable,dPairs,offsetSeg2 ,catmHMdcSegIdeal,catmHMdcSegSim);
Float_t gphi_1,gphi_2,gtheta_1,gtheta_2;
HGeantKine* kine;
kine=(HGeantKine*)catlHGeantKine->getObject(indexTable[i*sizeInd+0]-1);
fillVectorFromKine(vL1,i);
kineToSegPhiThetaDeg(kine,gtheta_1,gphi_1);
if(indexTable[i*sizeInd+1]>=0&&indexTable[j*sizeInd+1]>=0)
{
fillVectorFromSeg(vL1_segId,i,0);
}
if(indexTable[i*sizeInd+3]>=0&&indexTable[j*sizeInd+3]>=0)
{
fillVectorFromSeg(vL1_seg,i,1);
}
kine=(HGeantKine*)catlHGeantKine->getObject(indexTable[j*sizeInd+0]-1);
fillVectorFromKine(vL2,j);
kineToSegPhiThetaDeg(kine,gtheta_2,gphi_2);
if(indexTable[i*sizeInd+1]>=0&&indexTable[j*sizeInd+1]>=0)
{
fillVectorFromSeg(vL2_segId,j,0);
}
if(indexTable[i*sizeInd+3]>=0&&indexTable[j*sizeInd+3]>=0)
{
fillVectorFromSeg(vL2_seg,j,1);
}
TLorentzVector dilep = vL1 + vL2;
TLorentzVector dilep_segId= vL1_segId + vL2_segId;
TLorentzVector dilep_seg = vL1_seg + vL2_seg;
dPairs[offsetPair+0] =size;
dPairs[offsetPair+1] =findGeantMeta(indexTable[i*sizeInd+0],sec_1,iterGeantTof,catmHGeantTof,iterGeantShower,catmHGeantShower);
dPairs[offsetPair+2] =findGeantMeta(indexTable[j*sizeInd+0],sec_2,iterGeantTof,catmHGeantTof,iterGeantShower,catmHGeantShower);
dPairs[offsetPair+3] =vL2.Angle(vL1.Vect())*TMath::RadToDeg();
dPairs[offsetPair+4] =dilep.M();
dPairs[offsetPair+5] =dilep.Pt();
dPairs[offsetPair+6] =dilep.Rapidity();
dPairs[offsetPair+7] =pairPhiToLabDeg(dilep.Phi());
dPairs[offsetPair+8] =pairThetaToLabDeg(dilep.Theta());
if(indexTable[i*sizeInd+1]>=0&&indexTable[j*sizeInd+1]>=0)
{
dPairs[offsetPair+9] =vL2_segId.Angle(vL1_segId.Vect())*TMath::RadToDeg();
dPairs[offsetPair+10]=dilep_segId.M();
dPairs[offsetPair+11]=dilep_segId.Pt();
dPairs[offsetPair+12]=dilep_segId.Rapidity();
dPairs[offsetPair+13]=pairPhiToLabDeg(dilep_segId.Phi());
dPairs[offsetPair+14]=pairThetaToLabDeg(dilep_segId.Theta());
}
if(indexTable[i*sizeInd+3]>=0&&indexTable[j*sizeInd+3]>=0)
{
dPairs[offsetPair+15]=vL2_seg.Angle(vL1_seg.Vect())*TMath::RadToDeg();
dPairs[offsetPair+16]=dilep_seg.M();
dPairs[offsetPair+17]=dilep_seg.Pt();
dPairs[offsetPair+18]=dilep_seg.Rapidity();
dPairs[offsetPair+19]=pairPhiToLabDeg(dilep_seg.Phi());
dPairs[offsetPair+20]=pairThetaToLabDeg(dilep_seg.Theta());
}
dPairs[offsetPair+21]=gphi_1;
dPairs[offsetPair+22]=gtheta_1;
dPairs[offsetPair+23]=gphi_2;
dPairs[offsetPair+24]=gtheta_2;
pairs->Fill(dPairs);
}
dSingle[0]=evNr;
fillKineData(sec_1,i,indexTable,dSingle,offsetSeg1Kine,catmHMdcSegIdeal,catlHGeantKine);
fillSegData ( i,indexTable,dSingle,offsetSeg1 ,catmHMdcSegIdeal,catmHMdcSegSim);
if(hasPartner(indexTable,size,i))dSingle[offsetSingle+0]=1;
else dSingle[offsetSingle+0]=0;
dSingle[offsetSingle+1]=size;
dSingle[offsetSingle+2]=findGeantMeta(indexTable[i*sizeInd+0],sec_1,iterGeantTof,catmHGeantTof,iterGeantShower,catmHGeantShower);
single->Fill(dSingle);
}
}else{
Warning("fillNTuple()","Number of Tracks larger than maxTrks! skipped !");
}
}
void HMdcTrackingEff::fillVectorFromSeg(TLorentzVector& v, Int_t slot,Int_t type)
{
if(type==0||type==1)
{
HMdcSegSim* seg=0;
Int_t off=type*2;
if(type==0)seg=(HMdcSegSim*)catmHMdcSegIdeal->getObject(indexTable[slot*sizeInd+1+off]);
if(type==1)seg=(HMdcSegSim*)catmHMdcSegSim ->getObject(indexTable[slot*sizeInd+1+off]);
HGeantKine* kine=(HGeantKine*)catlHGeantKine->getObject(indexTable[slot*sizeInd+0]-1);
Int_t sec =seg->getSec();
Float_t theta =seg->getTheta();
Float_t phi =getLabPhiDeg(sec,seg->getPhi())*TMath::DegToRad();
Float_t totmom=kine->getTotalMomentum();
v.SetXYZM(totmom * TMath::Sin(theta) * TMath::Cos(phi),
totmom * TMath::Sin(theta) * TMath::Sin(phi),
totmom * TMath::Cos(theta),HPidPhysicsConstants::mass(kine->getID()));
}else
{
Error("fillVectorFromSeg()","Wrong type, should be 0 or 1!");
exit(1);
}
}
void HMdcTrackingEff::fillVectorFromKine(TLorentzVector& v, Int_t slot)
{
Float_t xmom,ymom,zmom;
HGeantKine* kine=(HGeantKine*)catlHGeantKine->getObject(indexTable[slot*sizeInd+0]-1);
kine->getMomentum(xmom,ymom,zmom);
Double_t mass =HPidPhysicsConstants::mass(kine->getID());
Double_t energy=TMath::Sqrt(mass*mass + xmom*xmom + ymom*ymom + zmom*zmom);
v.SetPxPyPzE(xmom,ymom,zmom,energy);
}
void HMdcTrackingEff::kineToSegPhiThetaDeg(HGeantKine* kine,Float_t& theta,Float_t& phi)
{
Float_t xmom,ymom,zmom,mom;
kine->getMomentum(xmom,ymom,zmom);
mom =kine->getTotalMomentum();
theta = (mom>0.) ? (TMath::RadToDeg() * TMath::Abs(TMath::ACos(zmom / mom))) : 0.;
phi = TMath::RadToDeg() * TMath::ATan2( ymom, xmom);
if (phi < 0.) phi += 360.;
phi=fmod(phi,60.f)+60.;
}
Float_t HMdcTrackingEff::pairPhiToLabDeg(Float_t phi)
{
phi = TMath::RadToDeg() * phi;
if (phi < 0.) phi += 360.;
return phi;
}
Float_t HMdcTrackingEff::pairThetaToLabDeg(Float_t theta)
{
theta = TMath::Abs((TMath::RadToDeg() * theta));
return theta;
}
Float_t HMdcTrackingEff::getLabPhiDeg(Int_t sector, Float_t phi)
{
phi = TMath::RadToDeg() * phi;
switch(sector)
{
case 0:
break;
case 1:
case 2:
case 3:
case 4:
phi += 60.0 * sector;
break;
default:
phi -= 60.0f;
break;
}
return phi;
}
Float_t HMdcTrackingEff::getThetaPairDeg(TLorentzVector& v)
{
return TMath::RadToDeg() * v.Theta();
}
Float_t HMdcTrackingEff::getPhiPairDeg(TLorentzVector& v)
{
Float_t phi;
if((phi = TMath::RadToDeg() * v.Phi()) < 0.0) phi += 360.0;
return phi;
}
Bool_t HMdcTrackingEff::finalize(void)
{
out->cd();
single->Write();
pairs->Write();
out->Save();
out->Close();
return kTRUE;
}
Int_t HMdcTrackingEff::execute()
{
Int_t track_ct=0;
resetIndexTable(indexTable,track_ct);
track_ct=0;
HMdcTrkCand* trkCand =0;
HMdcTrkCandIdeal* trkCandIdeal=0;
iterTrkCandIdeal->Reset();
while ( (trkCandIdeal=(HMdcTrkCandIdeal*)iterTrkCandIdeal->Next()) != 0 )
{
Int_t nOuterSeg=trkCandIdeal->getNCandForSeg1();
if(nOuterSeg==-1)
{
continue;
}
if(nOuterSeg==0)
{
}
else
{
Int_t nextObjInd = trkCandIdeal->getNextCandInd();
trkCandIdeal = (HMdcTrkCandIdeal*)catmHMdcTrkCandIdeal->getObject(nextObjInd);
if(!trkCandIdeal)
{
Error("tracking()","Zero pointer for trkCandIdeal retrieved!");
exit(1);
}
}
getSegPointers(indSegId,pSegId,trkCandIdeal,catmHMdcSegIdeal);
trkNrId=pSegId[0]->getTrack(0);
trkCand=findSameRealCand(trkNrId,indSeg,pSeg,iterTrkCand,catmHMdcTrkCand,catmHMdcSegSim,catlHGeantKine);
fillIndexTable(indexTable,track_ct,trkNrId,indSegId,indSeg,catlHGeantKine);
}
fillNTuple(gHades->getEventCounter(),indexTable,track_ct,catmHMdcSegSim,catmHMdcSegIdeal,catlHGeantKine,
iterGeantTof,catmHGeantTof,iterGeantShower,catmHGeantShower,single,pairs);
return 0;
}
Last change: Sat May 22 13:04:11 2010
Last generated: 2010-05-22 13:04
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.