11 #include "FairRunAna.h"
14 #include "KFParticleTopoReconstructor.h"
15 #include "KFTopoPerformance.h"
16 #include "KFMCTrack.h"
20 #include "TClonesArray.h"
24 #include "TDatabasePDG.h"
34 FairTask(name, iVerbose), fMCTracksBranchName(
""), fChargedTrackBranchName(
""), fNeutralTrackBranchName(
""),
35 fMCTrackArray(0), fChargedTrackArray(0), fNeutralTrackArray(0), fEmcBumps(0),
36 fRecParticles(0), fMCParticles(0), fMatchParticles(0), fSaveParticles(0), fSaveMCParticles(0),
37 fOutFileName(outFileName),
fOutFile(0), fEfffileName(
"Efficiency.txt"), fTopoPerformance(0), fPrintFrequency(100), fNEvents(0)
39 for(Int_t
i=0;
i<5;
i++)
45 TFile* curFile = gFile;
46 TDirectory* curDirectory = gDirectory;
55 gDirectory = curDirectory;
59 int index[4] = {48, 49, 50, 63};
61 for(
int iPall=0; iPall<4; iPall++)
63 int iParticle = index[iPall];
64 Double_t lifetime = eff.partLifeTime[iParticle];
65 Double_t mass = eff.partMass[iParticle];
66 Int_t PDG = eff.
partPDG[iParticle];
67 Double_t charge = eff.partCharge[iParticle];
68 Double_t width = 6.58211928e-22/lifetime;
70 TDatabasePDG::Instance()->AddParticle(eff.
partTitle[iParticle], eff.
partTitle[iParticle],
71 mass, kFALSE, width, charge,
"hadron", PDG);
92 FairRootManager* ioman= FairRootManager::Instance();
96 Error(
"PndKFParticleFinderQA::Init",
"RootManager not instantiated!");
104 Error(
"StandaloneHitGenerator::Init",
"mc track array not found!");
112 Error(
"StandaloneHitGenerator::Init",
"Charged tracks array not found!");
120 Error(
"StandaloneHitGenerator::Init",
"Neutral tracks match array not found! Continue without gammas.");
122 fEmcBumps = (TClonesArray*) ioman->GetObject(
"EmcBump");
128 ioman->Register(
"RecoParticles",
"KFParticle",
fRecParticles, kTRUE);
135 ioman->Register(
"KFMCParticles",
"KFParticle",
fMCParticles, kTRUE);
139 ioman->Register(
"KFParticleMatch",
"KFParticle",
fMatchParticles, kTRUE);
158 vector<KFMCTrack> mcTracks(nMCTracks);
159 vector< vector<int> > mcDaughters(nMCTracks);
160 for(Int_t iMC=0; iMC<nMCTracks; iMC++)
167 mcTracks[iMC].SetPx( pndMCTrack->
GetMomentum().X() );
168 mcTracks[iMC].SetPy( pndMCTrack->
GetMomentum().Y() );
169 mcTracks[iMC].SetPz( pndMCTrack->
GetMomentum().Z() );
174 q = TDatabasePDG::Instance()->GetParticle(pdg)->Charge()/3.0;
178 mcTracks[iMC].SetMotherId(pndMCTrack->
GetMotherID());
179 mcTracks[iMC].SetQP(q/p);
180 mcTracks[iMC].SetPDG(pdg);
181 mcTracks[iMC].SetNMCPoints(0);
183 if( (mcTracks[iMC].
R() > 10) && (pdg == 22) )
184 mcTracks[iMC].SetOutOfDetector();
187 mcDaughters[pndMCTrack->
GetMotherID()].push_back(iMC);
206 vector<int> trackMatch(ntrackMatches, -1);
207 static int Nghosts = 0;
208 for(
int iTr=0; iTr<ntrackMatches; iTr++)
215 if(!inTrack)
continue;
224 float rMC[3] = {
static_cast<float>(pndMCTrack->
GetStartVertex().X()),
227 float R =
TMath::Sqrt(rMC[0]*rMC[0] + rMC[1]*rMC[1] + rMC[2]*rMC[2]);
233 int closestTrack = -1;
238 float rReco[3] = {
static_cast<float>(inBump->
x()),
239 static_cast<float>(inBump->
y()),
240 static_cast<float>(inBump->
z()) };
257 if(trId < 0)
continue;
258 mcTracks[trId].SetReconstructed();
259 trackMatch[iTr] = trId;
271 for(
int iT=0; iT<4; iT++)
275 std::cout <<
"Topo reconstruction time"
276 <<
" Real = " << std::setw( 10 ) <<
fTime[4]/
fNEvents * 1.e3 <<
" ms" << std::endl;
277 std::cout <<
" Init " <<
fTime[0]/
fNEvents * 1.e3 <<
" ms" << std::endl;
278 std::cout <<
" PV Finder " <<
fTime[1]/
fNEvents * 1.e3 <<
" ms" << std::endl;
279 std::cout <<
" Sort Tracks " <<
fTime[2]/
fNEvents * 1.e3 <<
" ms" << std::endl;
280 std::cout <<
" KF Particle Finder " <<
fTime[3]/
fNEvents * 1.e3 <<
" ms" << std::endl;
286 for(
unsigned int iP=0; iP <
fTopoPerformance->GetTopoReconstructor()->GetParticles().size(); iP++)
294 for(
unsigned int iP=0; iP <
fTopoPerformance->GetTopoReconstructor()->GetParticles().size(); iP++)
299 Short_t matchType = 0;
328 TDirectory *curr = gDirectory;
329 TFile *currentFile = gFile;
350 const vector< vector<int> >& mcDaughters)
352 if( (trackId<0) || (trackId>=mcDaughters.size()) )
return;
354 for(
int iDaughter=0; iDaughter<mcDaughters[trackId].size(); iDaughter++)
356 int daughterIndex = mcDaughters[trackId][iDaughter];
358 float rMC[3] = {
static_cast<float>(daughter->
GetStartVertex().X()),
362 float dx = rReco[0] - rMC[0];
363 float dy = rReco[1] - rMC[1];
364 float dz = rReco[2] - rMC[2];
365 float dr =
sqrt(dx*dx + dy*dy + dz*dz);
369 closestTrack = daughterIndex;
372 if(mcDaughters[daughterIndex].size() > 0)
380 float rMC[3] = {
static_cast<float>(daughter->
GetStartVertex().X()),
383 float R =
TMath::Sqrt(rMC[0]*rMC[0] + rMC[1]*rMC[1] + rMC[2]*rMC[2]);
389 if(iMother < 0)
break;
396 R =
TMath::Sqrt(rMC[0]*rMC[0] + rMC[1]*rMC[1] + rMC[2]*rMC[2]);
401 if( !obj->IsFolder() ) obj->Write();
403 TDirectory *cur = gDirectory;
404 TFile *currentFile = gFile;
406 TDirectory *sub = cur->GetDirectory(obj->GetName());
408 TList *listSub = (
static_cast<TDirectory*
>(obj))->GetList();
TClonesArray * fMCParticles
void SetPrintEffFrequency(Int_t n)
TString fChargedTrackBranchName
Name of the input TCA with MC tracks.
friend F32vec4 sqrt(const F32vec4 &a)
void SetMatchType(Short_t i)
static T Sqrt(const T &x)
virtual void Exec(Option_t *opt)
PndKFParticleFinderQA(const char *name="PndKFParticleFinderQA", Int_t iVerbose=0, KFParticleTopoReconstructor *tr=0, TString outFileName="PndKFParticleFinderQA.root")
TVector3 GetMomentum() const
cout<< "POINTs for new FwEndCap == "<< tsim-> GetEntriesFast()
Int_t GetEmcIndex() const
TString partTitle[nParticles]
TClonesArray * fRecParticles
KFTopoPerformance * fTopoPerformance
TClonesArray * fNeutralTrackArray
void FindClosestMCTrackToBump(const int trackId, int &closestTrack, float &drMin, const float *rReco, const std::vector< std::vector< int > > &mcDaughters)
TString fNeutralTrackBranchName
Name of the input TCA with charged tracks.
TVector3 GetStartVertex() const
Int_t GetMotherID() const
void WriteHistosCurFile(TObject *obj)
TString fMCTracksBranchName
TClonesArray * fMCTrackArray
Name of the input TCA with neutral tracks.
represents a reconstructed (splitted) emc cluster
virtual InitStatus Init()
TClonesArray * fChargedTrackArray
void FindEmcClusterMother(const int iDaughter, int &iMother)
TClonesArray * fMatchParticles