1 #if !defined(__CINT__) || defined(__MAKECINT__)
12 #include <TClonesArray.h>
17 #include <TStopwatch.h>
18 #include <TParticlePDG.h>
20 #include "AliRunLoader.h"
21 #include "AliMultiplicity.h"
22 #include "AliESDtrackCuts.h"
24 #include "AliESDEvent.h"
25 #include "AliESDtrack.h"
26 #include "AliITSRecPointContainer.h"
27 #include "AliITSgeomTGeo.h"
28 #include "AliITSRecPoint.h"
29 #include "AliCDBManager.h"
30 #include "AliHeader.h"
31 #include "AliGenEventHeader.h"
34 #include "../HLT/ITS/trackingSAP/AliITSSAPAux.h"
35 #include "../HLT/ITS/trackingSAP/AliITSSAPLayer.h"
36 #include "../HLT/ITS/trackingSAP/AliITSSAPTracker.h"
38 #include "TStopwatch.h"
42 AliITSSAPTracker* tracker=0;
45 AliRunLoader* runLoader = 0;
75 void ProcessEvent(int iev);
76 void Process(const char* path);
77 void ProcChunk(const char* path);
78 void TestTracker(TTree* tRP, const AliESDVertex* vtx);
79 void LoadClusters(TTree* tRP);
80 Double_t* DefLogAx(double xMn,double xMx, int nbin);
81 void CheckRecStatus();
82 void InitOutTree(const char* fname="rcInfo.root");
84 void InitTracker(int runNumber);
89 TProfile* hTiming[AliITSSAPTracker::kNSW];
92 void Process(const char* inpData)
96 TString inpDtStr = inpData;
97 if (inpDtStr.EndsWith(".root") || inpDtStr.EndsWith(".zip#")) {
98 ProcChunk(inpDtStr.Data());
101 ifstream inpf(inpData);
103 printf("Failed on input filename %s\n",inpData);
107 inpDtStr.ReadLine(inpf);
108 while ( !inpDtStr.IsNull() ) {
109 inpDtStr = inpDtStr.Strip(TString::kBoth,' ');
110 if (inpDtStr.BeginsWith("//") || inpDtStr.BeginsWith("#")) {inpDtStr.ReadLine(inpf); continue;}
111 inpDtStr = inpDtStr.Strip(TString::kBoth,',');
112 inpDtStr = inpDtStr.Strip(TString::kBoth,'"');
113 ProcChunk(inpDtStr.Data());
114 inpDtStr.ReadLine(inpf);
118 tracker->SaveHistos();
123 void ProcChunk(const char* path)
128 printf("Processing %s\n",dir.Data());
130 if (dir.EndsWith("AliESDs.root")) {
131 dir.ReplaceAll("AliESDs.root","");
134 esd = new AliESDEvent();
136 runLoader = AliRunLoader::Open(Form("%sgalice.root",dir.Data()));
138 printf("galice not found\n");
141 runLoader->LoadgAlice();
142 gAlice = runLoader->GetAliRun();
143 runLoader->LoadHeader();
144 runLoader->LoadKinematics();
145 runLoader->LoadRecPoints("ITS");
147 TFile* esdFile = TFile::Open(Form("%sAliESDs.root",dir.Data()));
148 if (!esdFile || !esdFile->IsOpen()) {
149 printf("Error in opening ESD file\n");
150 runLoader->UnloadKinematics();
151 runLoader->UnloadHeader();
152 runLoader->UnloadgAlice();
156 treeInp = (TTree*) esdFile->Get("esdTree");
158 printf("Error: no ESD tree found\n");
159 runLoader->UnloadKinematics();
160 runLoader->UnloadHeader();
161 runLoader->UnloadgAlice();
165 esd->ReadFromTree(treeInp);
167 for (int iEv=0;iEv<runLoader->GetNumberOfEvents(); iEv++) {
168 printf("ev %d\n",iEv);
171 runLoader->UnloadRecPoints("all");
172 runLoader->UnloadKinematics();
173 runLoader->UnloadHeader();
174 runLoader->UnloadgAlice();
181 //_______________________________________________
182 void ProcessEvent(int iEv)
184 runLoader->GetEvent(iEv);
185 treeInp->GetEvent(iEv);
187 if (!tracker) InitTracker(esd->GetRunNumber());
189 AliStack *stack = runLoader->Stack();
190 Int_t nParticles = stack ? stack->GetNtrack() : 0;
191 Int_t nTracks= esd->GetNumberOfTracks();
192 printf("Ntr: %d NPartMC: %d\n",nTracks,nParticles);
193 const AliESDVertex* vtx = esd->GetPrimaryVertexSPD();
194 if (!vtx || !vtx->GetStatus()) return;
196 TTree* treeITSRP = runLoader->GetTreeR("ITS",kFALSE);
198 printf("Failed to fetch ITS recpoints\n");
203 static Double_t cpuTime[AliITSSAPTracker::kNSW] = {0};
205 printf("\n\n\nEvent: %d\n",iEv);
206 TestTracker(treeITSRP, vtx);
209 if (vtx->GetStatus()==1) {
210 double mlt = esd->GetMultiplicity()->GetNumberOfTracklets();
211 for (int i=0;i<AliITSSAPTracker::kNSW;i++) {
212 TStopwatch& sw = (TStopwatch&)tracker->GetStopwatch(i);
213 double tm = sw.CpuTime();
214 hTiming[i]->Fill(mlt, tm - cpuTime[i]);
225 //_________________________________________________
226 void TestTracker(TTree* tRP, const AliESDVertex* vtx)
230 tracker->SetSPDVertex(vtx);
231 tracker->SetBz(esd->GetMagneticField());
232 tracker->ProcessEvent();
234 tracker->PrintTracklets();
235 tracker->PrintTracks();
239 // esd->GetMultiplicity()->Print("t");
242 AliHeader* hd = runLoader->GetHeader();
243 AliGenEventHeader* hdmc;
244 if (tracker->GetTrackVertex().GetStatus()==1 && hd && (hdmc=hd->GenEventHeader()) ) {
246 hdmc->PrimaryVertex(vtxMC);
247 printf("MCvtx: %f %f %f\n",vtxMC[0],vtxMC[1],vtxMC[2]);
252 //_________________________________________________
253 void LoadClusters(TTree* tRP)
255 // AliITSRecPointContainer* rpcont = AliITSRecPointContainer::Instance();
256 // TClonesArray* itsClusters = rpcont->FetchClusters(0,tRP);
257 // if(!rpcont->IsSPDActive()){
258 // printf("No SPD rec points found, multiplicity not calculated\n");
262 // else printf("NSP0: %d\n",itsClusters->GetEntriesFast());
263 static TClonesArray* itsModAdd[2198] = {0};
264 static Bool_t first = kTRUE;
267 for (int i=0;i<2198;i++) itsModAdd[i] = new TClonesArray("AliITSRecPoint");
269 int nMod = AliITSgeomTGeo::GetNModules();
270 for (int imd=0;imd<nMod;imd++) {
271 TClonesArray* itsClusters = itsModAdd[imd];
272 tRP->SetBranchAddress("ITSRecPoints",&itsClusters);
274 // itsClusters = rpcont->UncheckedGetClusters(imd);
276 int nClusters = itsClusters->GetEntriesFast();
277 if (!nClusters) continue;
279 AliITSRecPoint* cluster = (AliITSRecPoint*)itsClusters->UncheckedAt(nClusters);
280 if (!cluster) continue;
281 tracker->AddCluster(cluster);
287 //______________________________________________
288 Double_t* DefLogAx(double xMn,double xMx, int nbin)
290 // get array for log axis
291 if (xMn<=0 || xMx<=xMn || nbin<2) {
292 printf("Wrong axis request: %f %f %d\n",xMn,xMx,nbin);
295 double dx = log(xMx/xMn)/nbin;
296 double *xax = new Double_t[nbin+1];
297 for (int i=0;i<=nbin;i++) xax[i]= xMn*exp(dx*i);
300 //______________________________________________
301 void CheckRecStatus()
305 static TBits patternMC;
306 static vector<char> ntrCorr;
307 static vector<char> ntrFake;
308 static vector<char> mtlCorr;
309 static vector<char> mtlFake;
310 static vector<char> ntlCorr;
311 static vector<char> ntlFake;
312 static vector<float> spdDPhi;
313 static vector<float> spdDTht;
314 static vector<float> spdChi2;
317 AliRunLoader* rl = AliRunLoader::Instance();
318 if (!rl || !(stack=rl->Stack())) return;
321 enum {kIsPrim=AliITSSAPTracker::kNLrActive,kValidTracklet,kValidTrack,kRecDone,kBitPerTrack};
322 int nTrkMC = stack->GetNtrack();
323 patternMC.SetBitNumber(nTrkMC*kBitPerTrack,0);
324 patternMC.ResetAllBits();
337 ntrCorr.resize(nTrkMC,0);
338 ntrFake.resize(nTrkMC,0);
339 ntlCorr.resize(nTrkMC,0);
340 ntlFake.resize(nTrkMC,0);
341 mtlCorr.resize(nTrkMC,0);
342 mtlFake.resize(nTrkMC,0);
343 spdDPhi.resize(nTrkMC,0);
344 spdDTht.resize(nTrkMC,0);
345 spdChi2.resize(nTrkMC,0);
348 // fill MC track patterns
349 for (int ilr=6;ilr--;) {
350 AliITSSAPLayer *lr = tracker->GetLayer(ilr);
351 int ncl = lr->GetNClusters();
352 for (int icl=ncl;icl--;) {
353 AliITSRecPoint* cl = lr->GetClusterUnSorted(icl);
354 for (int j=0;j<3;j++) {
355 int lb = cl->GetLabel(j);
356 if (lb<0 || lb>=nTrkMC) break;
357 patternMC.SetBitNumber(lb*kBitPerTrack+ilr,kTRUE);
362 int nTrk = tracker->GetNTracklets();
364 for (int itr=0;itr<nTrk;itr++) {
365 const AliITSSAPTracker::SPDtracklet_t& trlet = tracker->GetTracklet(itr);
366 // PrintTracklet(itr);
368 int lbl = trlet.label;
369 if (lbl==-3141593) continue;
370 int lblA = TMath::Abs(lbl);
371 if (lblA==lbl) ntlCorr[lblA]++;
372 else ntlFake[lblA]++;
374 if (spdChi2[lblA]==0 || spdChi2[lblA]<trlet.chi2) {
375 spdChi2[lblA] = trlet.chi2;
376 spdDPhi[lblA] = trlet.dphi;
377 spdDTht[lblA] = trlet.dtht;
381 AliITSSAPLayer* lr0 = tracker->GetLayer(0);
382 AliITSSAPLayer* lr1 = tracker->GetLayer(1);
383 for (int itrm=0;itrm<nTrkMC;itrm++) {
384 if (ntlCorr[itrm]+ntlFake[itrm]<2) continue;
385 printf("\nExtra for tr %d nC:%d nF:%d\n",itrm,ntlCorr[itrm],ntlFake[itrm]);
388 for (int itr=0;itr<nTrk;itr++) {
389 const AliITSSAPTracker::SPDtracklet_t& trlet = tracker->GetTracklet(itr);
390 if (TMath::Abs(trlet.label)!=itrm) continue;
391 AliITSSAPLayer::ClsInfo_t* clinf0 = lr0->GetClusterInfo(trlet.id1);
392 AliITSSAPLayer::ClsInfo_t* clinf1 = lr1->GetClusterInfo(trlet.id2);
393 printf("#%2d%s%4d chi:%.2f [%4d/%3d] [%4d/%3d]\n",cnt++,trlet.label<0 ? "-":"+",itr,trlet.chi2,
394 trlet.id1,clinf0->detid,
395 trlet.id2,clinf1->detid);
399 const AliMultiplicity* mltESD = esd->GetMultiplicity();
400 nTrk = mltESD->GetNumberOfTracklets();
401 for (int itr=0;itr<nTrk;itr++) {
402 int lb0 = mltESD->GetLabel(itr,0);
403 int lb1 = mltESD->GetLabel(itr,1);
404 if (lb0==lb1) mtlCorr[lb1]++;
408 nTrk = tracker->GetNTracks();
409 for (int itr=0;itr<nTrk;itr++) {
410 const AliITSSAPTracker::ITStrack_t &track = tracker->GetTrack(itr);
412 int lbl = track.label;
413 if (lbl==-3141593) continue;
414 int lblA = TMath::Abs(lbl);
415 if (lblA==lbl) ntrCorr[lblA]++;
416 else ntrFake[lblA]++;
419 // set reconstructability
420 for (int itr=nTrkMC;itr--;) {
421 int bitoffs = itr*kBitPerTrack;
423 tres.validSPD = patternMC.TestBitNumber(bitoffs+AliITSSAPTracker::kALrSPD1) &&
424 patternMC.TestBitNumber(bitoffs+AliITSSAPTracker::kALrSPD2);
426 for (int il=AliITSSAPTracker::kALrSDD1;il<=AliITSSAPTracker::kALrSSD2;il++)
427 if (tracker->IsObligatoryLayer(il) && !patternMC.TestBitNumber(bitoffs+il)) nmiss++;
428 tres.validTrc = tres.validSPD && (nmiss<=tracker->GetMaxMissedLayers());
430 if ( !tres.validSPD && !tres.validTrc &&
431 (ntlCorr[itr]+ntlFake[itr])==0 &&
432 (ntrCorr[itr]+ntrFake[itr])==0 &&
433 (mtlCorr[itr]+mtlFake[itr])==0 ) continue;
435 TParticle* mctr = stack->Particle(itr);
436 tres.isPrim = stack->IsPhysicalPrimary(itr);
437 tres.pdg = mctr->GetPdgCode();
438 tres.pt = mctr->Pt();
439 tres.eta = mctr->Eta();
440 tres.phi = mctr->Phi();
442 tres.ntlC = ntlCorr[itr];
443 tres.ntlF = ntlFake[itr];
444 tres.ntrC = ntrCorr[itr];
445 tres.ntrF = ntrFake[itr];
447 tres.mtlC = mtlCorr[itr];
448 tres.mtlF = mtlFake[itr];
451 tres.mult = tracker->GetNTracklets();
452 tres.zv = tracker->GetSPDVertex()->GetZ();
454 tres.spdDPhi = spdDPhi[itr];
455 tres.spdDTht = spdDTht[itr];
456 tres.spdChi2 = spdChi2[itr];
463 //___________________________________________________
464 void InitOutTree(const char* fname)
467 flOut = TFile::Open(fname,"recreate");
468 trOut = new TTree("rcinfo","rcinfo");
469 trOut->Branch("res",&tres);
472 //___________________________________________________
486 //______________________________________________
487 void InitTracker(int runNumber)
489 AliCDBManager* man = AliCDBManager::Instance();
490 man->SetRun(runNumber);
491 tracker = new AliITSSAPTracker();
497 double *mltAx = DefLogAx(1,6000,nbMlt);
498 for (int i=0;i<AliITSSAPTracker::kNSW;i++) {
499 hTiming[i] = new TProfile(tracker->GetStopwatchName(i),tracker->GetStopwatchName(i),nbMlt,mltAx);