]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/src/AliL3Evaluate.cxx
This commit was generated by cvs2svn to compensate for changes in r3176,
[u/mrichter/AliRoot.git] / HLT / src / AliL3Evaluate.cxx
CommitLineData
108615fc 1//Author: Anders Strand Vestbo
2//Last Modified: 5.01.2001
3
4#include <stdio.h>
5#include <TFile.h>
6#include <TH1.h>
7#include <TParticle.h>
8#include <TTree.h>
9#include <TClonesArray.h>
10
11#include "AliRun.h"
12#include "AliSimDigits.h"
13#include "AliTPC.h"
14#include "AliTPCClustersArray.h"
15#include "AliTPCClustersRow.h"
16#include "AliTPCcluster.h"
17#include "AliTPCParam.h"
18
19#include "AliL3Transform.h"
20#include "AliL3SpacePointData.h"
21#include "AliL3Track.h"
22#include "AliL3FileHandler.h"
23#include "AliL3TrackArray.h"
24#include "AliL3Evaluate.h"
25#include "AliL3Logging.h"
26
27//AliL3Evaluate
28//Class for tracking evaluation.
29
30ClassImp(AliL3Evaluate)
31
32AliL3Evaluate::AliL3Evaluate()
33{
34 fMCFile = NULL;
35 fTracks = NULL;
36 fMCclusterfile = NULL;
37}
38
39AliL3Evaluate::AliL3Evaluate(Char_t *mcfile,Int_t *slice)
40{
41 //Normal constructor. Input are the rootfile containing the
42 //original MC information of the simulated event.
43
44 fMCFile = new TFile(mcfile,"READ");
45 if(!fMCFile->IsOpen())
46 {
47 LOG(AliL3Log::kError,"AliL3Evaluation::AliL3Evaluation","File Open")
48 <<"Inputfile "<<mcfile<<" does not exist"<<ENDLOG;
49 return;
50 }
51
52 fParam = (AliTPCParam*)fMCFile->Get("75x40_100x60");
53 fTransform = new AliL3Transform();
54
55 fMinSlice = slice[0];
56 fMaxSlice = slice[1];
57
58}
59
60AliL3Evaluate::~AliL3Evaluate()
61{
62 if(fDigitsTree)
63 fDigitsTree->Delete();
64
65
66 /*if(fMCFile)
67 {
68 fMCFile->Close();
69 delete fMCFile;
70 }
71 */
72 if(fTransform)
73 delete fTransform;
74 if(fTracks)
75 delete fTracks;
76 if(fPtRes)
77 delete fPtRes;
78 if(fNGoodTracksPt)
79 delete fNGoodTracksPt;
80 if(fNFoundTracksPt)
81 delete fNFoundTracksPt;
82 if(fNFakeTracksPt)
83 delete fNFakeTracksPt;
84 if(fTrackEffPt)
85 delete fTrackEffPt;
86 if(fFakeTrackEffPt)
87 delete fFakeTrackEffPt;
88 if(fNGoodTracksEta)
89 delete fNGoodTracksEta;
90 if(fNFoundTracksEta)
91 delete fNFoundTracksEta;
92 if(fNFakeTracksEta)
93 delete fNFakeTracksEta;
94 if(fTrackEffEta)
95 delete fTrackEffEta;
96 if(fFakeTrackEffEta)
97 delete fFakeTrackEffEta;
98}
99
100void AliL3Evaluate::Setup(Char_t *trackfile,Char_t *clustfile)
101{
102 //Setup for using the slow simulator.
103 //Read in the hit and track information from produced files.
104
105 fIsSlow = true;
106
107 Char_t fname[256];
108 AliL3FileHandler *clusterfile[36][5];
109 for(Int_t s=fMinSlice; s<=fMaxSlice; s++)
110 {
111 for(Int_t p=0; p<5; p++)
112 {
113 clusterfile[s][p] = new AliL3FileHandler();
114 sprintf(fname,"points_%d_%d.raw",s,p);
115 if(!clusterfile[s][p]->SetBinaryInput(fname))
116 {
117 LOG(AliL3Log::kError,"AliL3Evaluation::Setup","File Open")
118 <<"Inputfile "<<fname<<" does not exist"<<ENDLOG;
119 return;
120 }
121 fClusters[s][p] = (AliL3SpacePointData*)clusterfile[s][p]->Allocate();
122 clusterfile[s][p]->Binary2Memory(fNcl[s][p],fClusters[s][p]);
123 clusterfile[s][p]->CloseBinaryInput();
124 }
125 }
126
127
128 AliL3FileHandler *tfile = new AliL3FileHandler();
129 if(!tfile->SetBinaryInput(trackfile))
130 {
131 LOG(AliL3Log::kError,"AliL3Evaluation::Setup","File Open")
132 <<"Inputfile "<<trackfile<<" does not exist"<<ENDLOG;
133 return;
134 }
135 fTracks = new AliL3TrackArray();
136 tfile->Binary2TrackArray(fTracks);
137 tfile->CloseBinaryInput();
138 delete tfile;
139
140 if(!SetDigitsTree())
141 LOG(AliL3Log::kError,"AliL3Evaluation::Setup","Digits Tree")
142 <<"Error setting up digits tree"<<ENDLOG;
143 if(!SetMCParticleArray())
144 LOG(AliL3Log::kError,"AliL3Evaluation::Setup","Particle array")
145 <<"Error setting up particle array"<<ENDLOG;
146
147}
148
149void AliL3Evaluate::SetupFast(Char_t *trackfile,Char_t *clustfile,Char_t *mcClusterfile)
150{
151 //Setup for using the fast simulator.
152
153 fIsSlow = false;
154
155 fMCclusterfile = new TFile(mcClusterfile);
156 if(!fMCclusterfile->IsOpen())
157 LOG(AliL3Log::kError,"AliL3Evaluation::SetupFast","File Open")
158 <<"Inputfile "<<mcClusterfile<<" does not exist"<<ENDLOG;
159
160 Char_t fname[256];
161 AliL3FileHandler *clusterfile[36][5];
162 for(Int_t s=fMinSlice; s<=fMaxSlice; s++)
163 {
164 for(Int_t p=0; p<5; p++)
165 {
166 clusterfile[s][p] = new AliL3FileHandler();
167 sprintf(fname,"points_%d_%d.raw",s,p);
168 if(!clusterfile[s][p]->SetBinaryInput(fname))
169 {
170 LOG(AliL3Log::kError,"AliL3Evaluation::Setup","File Open")
171 <<"Inputfile "<<fname<<" does not exist"<<ENDLOG;
172 return;
173 }
174 fClusters[s][p] = (AliL3SpacePointData*)clusterfile[s][p]->Allocate();
175 clusterfile[s][p]->Binary2Memory(fNcl[s][p],fClusters[s][p]);
176 clusterfile[s][p]->CloseBinaryInput();
177 }
178 }
179
180
181 AliL3FileHandler *tfile = new AliL3FileHandler();
182 if(!tfile->SetBinaryInput(trackfile))
183 {
184 LOG(AliL3Log::kError,"AliL3Evaluation::Setup","File Open")
185 <<"Inputfile "<<trackfile<<" does not exist"<<ENDLOG;
186 return;
187 }
188 fTracks = new AliL3TrackArray();
189 tfile->Binary2TrackArray(fTracks);
190 tfile->CloseBinaryInput();
191 delete tfile;
192
193 if(!SetMCParticleArray())
194 LOG(AliL3Log::kError,"AliL3Evaluation::SetupFast","Particle array")
195 <<"Error setting up particle array"<<ENDLOG;
196}
197
198void AliL3Evaluate::CreateHistos(Int_t nbin,Int_t xlow,Int_t xup)
199{
200 //Create the histograms
201
202 fPtRes = new TH1F("fPtRes","Relative Pt resolution",30,-10.,10.);
203 fNGoodTracksPt = new TH1F("fNGoodTracksPt","Good tracks vs pt",nbin,xlow,xup);
204 fNFoundTracksPt = new TH1F("fNFoundTracksPt","Found tracks vs pt",nbin,xlow,xup);
205 fNFakeTracksPt = new TH1F("fNFakeTracksPt","Fake tracks vs pt",nbin,xlow,xup);
206 fTrackEffPt = new TH1F("fTrackEffPt","Tracking efficiency vs pt",nbin,xlow,xup);
207 fFakeTrackEffPt = new TH1F("fFakeTrackEffPt","Efficiency for fake tracks vs pt",nbin,xlow,xup);
208
209 fNGoodTracksEta = new TH1F("fNGoodTracksEta","Good tracks vs eta",20,-50,50);
210 fNFoundTracksEta = new TH1F("fNFoundTracksEta","Found tracks vs eta",20,-50,50);
211 fNFakeTracksEta = new TH1F("fNFakeTracksEta","Fake tracks vs eta",20,-50,50);
212 fTrackEffEta = new TH1F("fTrackEffEta","Tracking efficienct vs eta",20,-50,50);
213 fFakeTrackEffEta = new TH1F("fFakeTrackEffEta","Efficiency for fake tracks vs eta",20,-50,50);
214
215}
216
217Bool_t AliL3Evaluate::SetDigitsTree()
218{
219
220 fMCFile->cd();
221 fDigitsTree = (TTree*)fMCFile->Get("TreeD_75x40_100x60");
222 if(!fDigitsTree) return false;
223 fDigitsTree->GetBranch("Segment")->SetAddress(&fDigits);
224 for(Int_t i=0; i<fDigitsTree->GetEntries(); i++)
225 {
226 if(!fDigitsTree->GetEvent(i)) continue;
227 Int_t se,ro,slice,slicerow;
228 fParam->AdjustSectorRow(fDigits->GetID(),se,ro);
229 fTransform->Sector2Slice(slice,slicerow,se,ro);
230 fRowid[slice][slicerow] = i;
231 }
232
233 return true;
234}
235
236Bool_t AliL3Evaluate::SetMCParticleArray()
237{
238 fMCFile->cd();
239 AliRun *gAlice = (AliRun*)fMCFile->Get("gAlice");
240 if (!gAlice)
241 {
242 LOG(AliL3Log::kError,"AliL3Evaluate::SetParticleArray","gAlice")
243 <<"AliRun object non existing on file"<<ENDLOG;
244 return false;
245 }
246
247 gAlice->GetEvent(0);
248 fParticles=gAlice->Particles();
249 return true;
250}
251
252
253TObjArray *AliL3Evaluate::DefineGoodTracks(Int_t slice,Int_t *padrow,Int_t good_number,Int_t *particle_id)
254{
255 //Loop over MC particles, and mark the good ones
256 //(which the tracker should find...)
257
258 Int_t np=fParticles->GetEntriesFast();
259 AliTPC *TPC = (AliTPC*)gAlice->GetDetector("TPC");
260 TPC->SetParam(fParam);
261 Int_t ver = TPC->IsVersion();
262 LOG(AliL3Log::kInformational,"AliL3Evaluate::DefineGoodTracks","TPC version")
263 <<"TPC version "<<ver<<" found on file"<<ENDLOG;
264
265 //Int_t nrow_up=TPC->GetParam()->GetNRowUp();
266 //Int_t nrows=TPC->GetParam()->GetNRowLow()+nrow_up;
267 Int_t zero=TPC->GetParam()->GetZeroSup();
268
269 //Int_t number_of_rows = padrow[1] - padrow[0] + 1;
270
271 Int_t *good = new Int_t[np];
272 for(Int_t ii=0; ii<np; ii++)
273 good[ii] = 0;
274
275 if(ver==1)
276 {
277 if(fIsSlow)
278 LOG(AliL3Log::kError,"AliL3Evaluate::DefineGoodTracks","TPC version")
279 <<"TPC version "<<ver<<" does not match."<<ENDLOG;
280 fMCclusterfile->cd();
281 AliTPCClustersArray carray;
282 carray.Setup(fParam);
283 carray.SetClusterType("AliTPCcluster");
284 Bool_t clusterok = carray.ConnectTree("Segment Tree");
285 if(!clusterok)
286 LOG(AliL3Log::kError,"AliL3Evaluate::DefineGoodTracks","Cluster Array")
287 <<"Error loading clusters from rootfile"<<ENDLOG;
288
289 for(Int_t i=padrow[0]; i<=padrow[1]; i++)
290 {
291 Int_t sec,row,sl,lr;
292 AliSegmentID *s = carray.LoadEntry(i);
293 fParam->AdjustSectorRow(s->GetID(),sec,row);
294 fTransform->Sector2Slice(sl,lr,sec,row);
295
296 if(sl != slice) {carray.ClearRow(sec,row); continue;}
297 if(lr != i) {carray.ClearRow(sec,row); continue;}
298 AliTPCClustersRow *cRow = carray.GetRow(sec,row);
299 for(Int_t j=0; j<cRow->GetArray()->GetEntriesFast(); j++)
300 {
301 AliTPCcluster *cluster=(AliTPCcluster*)(*cRow)[j];
302 Int_t lab=cluster->GetLabel(0);
303 if(lab<0) continue;
304 lab=TMath::Abs(lab);
305 good[lab]++;
306 }
307 if(carray.GetRow(sec,row))
308 carray.ClearRow(sec,row);
309 }
310 }
311 else if(ver==2)
312 {
313 if(!fIsSlow)
314 LOG(AliL3Log::kError,"AliL3Evaluate::DefineGoodTracks","TPC version")
315 <<"TPC version "<<ver<<" does not match."<<ENDLOG;
316 Int_t *count = new Int_t[np]; //np number of particles.
317 Int_t i;
318 for (i=0; i<np; i++) count[i]=0;
319 for (i=padrow[0]; i<=padrow[1]; i++) {
320 Int_t index = fRowid[slice][i];
321 if (!fDigitsTree->GetEvent(index)) continue;
322 Int_t sec,row;
323 fParam->AdjustSectorRow(fDigits->GetID(),sec,row);
324 fDigits->First();
325 while (fDigits->Next()) {
326 Int_t it=fDigits->CurrentRow(), ip=fDigits->CurrentColumn();
327 Short_t dig = fDigits->GetDigit(it,ip);
328 Int_t idx0=fDigits->GetTrackID(it,ip,0);
329 Int_t idx1=fDigits->GetTrackID(it,ip,1);
330 Int_t idx2=fDigits->GetTrackID(it,ip,2);
331 if (idx0>=0 && dig>=zero) count[idx0]+=1;
332 if (idx1>=0 && dig>=zero) count[idx1]+=1;
333 if (idx2>=0 && dig>=zero) count[idx2]+=1;
334 }
335 for (Int_t j=0; j<np; j++) {
336 if (count[j]>1) {//at least two digits at this padrow
337 good[j]++;
338 }
339 count[j]=0;
340 }
341 }
342 delete[] count;
343 }
344 else
345 {
346 LOG(AliL3Log::kError,"AliL3Evaluation::FillEffHistos","TPC version")
347 <<"No valid TPC version found"<<ENDLOG;
348 return 0;
349 }
350
351 Float_t torad=TMath::Pi()/180;
352
353 Float_t phi_min = slice*20 - 10;
354 Float_t phi_max = slice*20 + 10;
355 TObjArray *good_part = new TObjArray();
356
357 for(Int_t i=0; i<fParticles->GetEntriesFast(); i++)
358 {
359 TParticle *p = (TParticle*)fParticles->UncheckedAt(i);
360 if(p->GetFirstMother()>0) continue; //secondary particle
361 if(good[i] < good_number) {continue;}
362
363 Double_t ptg=p->Pt(),pxg=p->Px(),pyg=p->Py(),pzg=p->Pz();
364 Double_t phi_part = TMath::ATan2(pyg,pxg);
365 if (phi_part < 0) phi_part += 2*TMath::Pi();
366
367
368 if(phi_part < phi_min*torad || phi_part > phi_max*torad) {continue;}
369 if(ptg<0.100) continue;
370 if(fabs(pzg/ptg)>0.999) {continue;}
371 Int_t entries = good_part->GetEntriesFast();
372 good_part->AddLast(p);
373 particle_id[entries] = i;
374 }
375 delete [] good;
376 return good_part;
377}
378
379void AliL3Evaluate::EvaluatePatch(Int_t slice,Int_t patch,Int_t min_points,Int_t good_number)
380{
381 //Make efficiency plots for tracking on patch level (before any merging).
382
383 Int_t row[5][2] = {{ 0, 45},{46,77},{78,109},{110,141},{142,173}};
384 Int_t *particle_id = new Int_t[fParticles->GetEntriesFast()];
385 TObjArray *good_particles = DefineGoodTracks(slice,row[patch],good_number,particle_id);
386 SetMinPoints(min_points);
387 AssignIDs();
388 FillEffHistos(good_particles,particle_id);
389 delete good_particles;
390 delete [] particle_id;
391}
392
393void AliL3Evaluate::EvaluateSlice(Int_t slice,Int_t min_points,Int_t good_number)
394{
395 //Make efficiency plots for tracking on a slice (after merging).
396 //min_points = minimum points on track to be considered for evaluation
397 //good_number = minimum hits (padrows) produced by simulated track for consideration.
398
399 Int_t row[174] = {0,173};
400 Int_t *particle_id = new Int_t[fParticles->GetEntriesFast()];
401 TObjArray *good_particles = DefineGoodTracks(slice,row,good_number,particle_id);
402 SetMinPoints(min_points);
403 AssignIDs();
404 FillEffHistos(good_particles,particle_id);
405 delete good_particles;
406 delete [] particle_id;
407}
408
409void AliL3Evaluate::EvaluateGlobal()
410{
411 //Make efficiency plots for tracking on several slices.
412 /*
413 Int_t row[174] = {0,173};
414 TObjArray *good_particles = DefineGoodTracks(slice,row,good_number);
415 FillEffHistos(good_particles);
416 delete good_particles;
417 */
418}
419
420void AliL3Evaluate::FillEffHistos(TObjArray *good_particles,Int_t *particle_id)
421{
422 //Fill the efficiency histograms.
423
424
425 CreateHistos();
426
427 for(Int_t i=0; i<good_particles->GetEntriesFast(); i++)
428 {
429 TParticle *p = (TParticle*)good_particles->UncheckedAt(i);
430 Double_t ptg=p->Pt(),pzg=p->Pz();
431 Float_t dipangle=TMath::ATan2(pzg,ptg)*180./TMath::Pi();
432 fNGoodTracksPt->Fill(ptg);
433 fNGoodTracksEta->Fill(dipangle);
434 Int_t found = 0;
435 for(Int_t k=0; k<fTracks->GetNTracks(); k++)
436 {
437 AliL3Track *track = fTracks->GetCheckedTrack(k);
438 if(!track) continue;
439 Int_t nHits = track->GetNumberOfPoints();
440 if(nHits < fMinPointsOnTrack) break;
441
442 Int_t tracklabel;
443 tracklabel = track->GetMCid();
444
445 if(TMath::Abs(tracklabel) != particle_id[i]) continue;
446 found=1;
447 if(tracklabel == particle_id[i]) {fNFoundTracksPt->Fill(ptg); fNFoundTracksEta->Fill(dipangle);}
448 else {fNFakeTracksPt->Fill(ptg); fNFakeTracksEta->Fill(dipangle);}
449 Float_t pt=track->GetPt();
450 fPtRes->Fill((pt-ptg)/ptg*100.);
451 break;
452
453 }
454 }
455
456
457 Stat_t ngood=fNGoodTracksPt->GetEntries();
458 Stat_t nfound=fNFoundTracksPt->GetEntries();
459 Stat_t nfake=fNFakeTracksPt->GetEntries();
460
461 LOG(AliL3Log::kInformational,"AliL3Evaluate::FillEffHistos","Efficiency")
462 <<AliL3Log::kDec<<"There was "<<ngood<<" generated good tracks"<<ENDLOG;
463 LOG(AliL3Log::kInformational,"AliL3Evaluate::FillEffHistos","Efficiency")
464 <<AliL3Log::kDec<<"Found "<<nfound<<" tracks"<<ENDLOG;
465 LOG(AliL3Log::kInformational,"AliL3Evaluate::FillEffHistos","Efficiency")
466 <<AliL3Log::kDec<<"Integral efficiency is about "<<nfound/ngood*100<<ENDLOG;
467 LOG(AliL3Log::kInformational,"AliL3Evaluate::FillEffHistos","Efficiency")
468 <<AliL3Log::kDec<<"Fake tracks relative is about "<<nfake/ngood*100<<ENDLOG;
469
470 fNFoundTracksPt->Sumw2(); fNGoodTracksPt->Sumw2();
471 fTrackEffPt->Divide(fNFoundTracksPt,fNGoodTracksPt,1,1.,"b");
472 fFakeTrackEffPt->Divide(fNFakeTracksPt,fNGoodTracksPt,1,1.,"b");
473 fTrackEffPt->SetMaximum(1.4);
474 fTrackEffPt->SetXTitle("P_{T} [GeV]");
475 fTrackEffPt->SetLineWidth(2);
476 fFakeTrackEffPt->SetFillStyle(3013);
477 fTrackEffPt->SetLineColor(4);
478 fFakeTrackEffPt->SetFillColor(2);
479
480 fNFoundTracksEta->Sumw2(); fNGoodTracksEta->Sumw2();
481 fTrackEffEta->Divide(fNFoundTracksEta,fNGoodTracksEta,1,1.,"b");
482 fFakeTrackEffEta->Divide(fNFakeTracksEta,fNGoodTracksEta,1,1.,"b");
483 fTrackEffEta->SetMaximum(1.4);
484 fTrackEffEta->SetXTitle("#lambda [degrees]");
485 fTrackEffEta->SetLineWidth(2);
486 fFakeTrackEffEta->SetFillStyle(3013);
487 fTrackEffEta->SetLineColor(4);
488 fFakeTrackEffEta->SetFillColor(2);
489
490}
491
492void AliL3Evaluate::AssignIDs()
493{
494 //Assign MC id to the tracks.
495
496 UInt_t *index=0,tmp_ind=0;
497 Int_t *pID=0,npoints=0;
498
499 if(!fIsSlow)
500 {
501 pID = GetFastIDs(tmp_ind,npoints);
502 index = (UInt_t*)tmp_ind;
503 }
504
505 fTracks->QSort();
506 LOG(AliL3Log::kDebug,"AliL3Evaluate::AssignIDs","Track Loop")
507 <<"Assigning MC id to the found tracks...."<<ENDLOG;
508 for(Int_t i=0; i<fTracks->GetNTracks(); i++)
509 {
510 AliL3Track *track = (AliL3Track*)fTracks->GetCheckedTrack(i);
511 if(!track)
512 {
513 LOG(AliL3Log::kWarning,"AliL3Evaluate::AssignIDs","Track Loop")
514 <<AliL3Log::kDec<<"No track in track array, index "<<i<<ENDLOG;
515 continue;
516 }
517 if(track->GetNumberOfPoints() < fMinPointsOnTrack) break;
518 Int_t tID;
519 if(!fIsSlow)
520 tID = GetMCTrackLabel(track,index,pID,npoints);
521 else
522 tID = GetMCTrackLabel(track);
523 track->SetMCid(tID);
524 printf("track %i id %d\n",i,tID);
525 }
526
527 if(!fIsSlow)
528 {
529 delete [] pID;
530 delete [] index;
531 }
532
533}
534
535
536struct S {Int_t lab; Int_t max;};
537Int_t AliL3Evaluate::GetMCTrackLabel(AliL3Track *track,UInt_t *index,Int_t *pID,Int_t npoints)
538{
539 //Returns the MCtrackID of the belonging clusters.
540 //If MCLabel < 0, means that track is fake.
541 //Fake track means that more than 10 percent of clusters are assigned incorrectly.
542
543 Int_t num_of_clusters = track->GetNumberOfPoints();
544 S *s=new S[num_of_clusters];
545 Int_t i;
546 for (i=0; i<num_of_clusters; i++) s[i].lab=s[i].max=0;
547 UInt_t *hitnum = track->GetHitNumbers();
548 UInt_t id;
549
550 Int_t **trackID;
551
552 if(fIsSlow)
553 trackID = GetClusterIDs(track);
554 else
555 trackID = GetClusterIDs(track,index,pID,npoints);
556
557
558 Int_t lab=123456789;
559 for (i=0; i<num_of_clusters; i++)
560 {
561 //Tricks to get the clusters belonging to this track:
562 id = hitnum[i];
563 Int_t slice = (id>>25) & 0x7f;
564 Int_t patch = (id>>22) & 0x7;
565 UInt_t pos = id&0x3fffff;
566
567 AliL3SpacePointData *points = fClusters[slice][patch];
568
569 if(!points)
570 continue;
571
572 if(pos>=fNcl[slice][patch])
573 {
574 LOG(AliL3Log::kError,"AliL3Evaluate::GetMCTrackLabel","Clusterarray")
575 <<AliL3Log::kDec<<"ERROR"<<ENDLOG;
576 continue;
577 }
578
579 //Get the label of the cluster:
580 //printf("label %d %d %d\n",trackID[i][0],trackID[i][1],trackID[i][2]);
581 lab=abs(trackID[i][0]);
582 Int_t j;
583 for (j=0; j<num_of_clusters; j++)
584 if (s[j].lab==lab || s[j].max==0) break;
585 s[j].lab=lab;
586 s[j].max++;
587 }
588
589 Int_t max=0;
590 for (i=0; i<num_of_clusters; i++)
591 if (s[i].max>max) {max=s[i].max; lab=s[i].lab;}
592
593 delete[] s;
594
595 for (i=0; i<num_of_clusters; i++)
596 {
597 id = hitnum[i];
598 Int_t slice = (id>>25) & 0x7f;
599 Int_t patch = (id>>22) & 0x7;
600 UInt_t pos = id&0x3fffff;
601
602 AliL3SpacePointData *points = fClusters[slice][patch];
603
604 if(!points)
605 continue;
606
607 if(pos>=fNcl[slice][patch])
608 {
609 LOG(AliL3Log::kError,"AliL3Evaluate::GetMCTrackLabel","Clusterarray")
610 <<AliL3Log::kDec<<"ERROR"<<ENDLOG;
611 continue;
612 }
613
614 if (abs(trackID[i][1]) == lab ||
615 abs(trackID[i][2]) == lab ) max++;
616 }
617
618 //check if more than 10% of the clusters are incorrectly assigned (fake track):
619 if (1.-Float_t(max)/num_of_clusters > 0.10)
620 {
621 return -lab;
622 }
623
624 delete [] trackID;
625 return lab;
626}
627
628
629Int_t **AliL3Evaluate::GetClusterIDs(AliL3Track *track,UInt_t *index,Int_t *pID,Int_t npoints)
630{
631 //Return the MC information of all clusters belonging to track.
632
633 Int_t num_of_clusters = track->GetNumberOfPoints();
634 Int_t **trackID = new Int_t*[num_of_clusters];
635
636 UInt_t *hitnum = track->GetHitNumbers();
637 UInt_t id;
638
639
640 Float_t xyz[3];
641 Int_t sector,padrow;
642 for(Int_t i=0; i<num_of_clusters; i++)
643 {
644 id = hitnum[i];
645 Int_t slice = (id>>25) & 0x7f;
646 Int_t patch = (id>>22) & 0x7;
647 UInt_t pos = id&0x3fffff;
648
649 AliL3SpacePointData *points = fClusters[slice][patch];
650
651 if(!points)
652 {
653 LOG(AliL3Log::kError,"AliL3Evaluate::GetClusterIDs","Clusterarray")
654 <<"No points at slice "<<slice<<" patch "<<patch<<" pos "<<pos<<ENDLOG;
655 continue;
656 }
657 if(pos>=fNcl[slice][patch])
658 {
659 LOG(AliL3Log::kError,"AliL3Evaluate::GetClusterIDs","Clusterarray")
660 <<AliL3Log::kDec<<"ERROR"<<ENDLOG;
661 continue;
662 }
663
664 xyz[0] = points[pos].fX;
665 xyz[1] = points[pos].fY;
666 xyz[2] = points[pos].fZ;
667 //sector = points[pos].fSector;
668 padrow = points[pos].fPadRow;
669 Int_t se,ro;
670 fTransform->Slice2Sector(slice,padrow,se,ro);
671 fTransform->Global2Raw(xyz,se,ro);
672
673 if(fIsSlow)
674 {
675 Int_t p = fRowid[slice][padrow];
676
677 if(!fDigitsTree->GetEvent(p))
678 LOG(AliL3Log::kError,"AliL3Evaluate::GetClusterIDs","Digits Tree")
679 <<"Error reading digits tree"<<ENDLOG;
680
681 trackID[i] = new Int_t[3];
682 trackID[i][0] = fDigits->GetTrackID((Int_t)xyz[2],(Int_t)xyz[1],0);
683 trackID[i][1] = fDigits->GetTrackID((Int_t)xyz[2],(Int_t)xyz[1],1);
684 trackID[i][2] = fDigits->GetTrackID((Int_t)xyz[2],(Int_t)xyz[1],2);
685 }
686 else
687 {
688 Int_t tmp_pid=0;
689 for(Int_t ii=0; ii<npoints; ii++)
690 {
691 tmp_pid = pID[ii];
692 if(index[ii] == id) break;
693 }
694 trackID[i] = new Int_t[3];
695 trackID[i][0] = tmp_pid;
696 trackID[i][1] = -1;
697 trackID[i][2] = -1;
698 }
699 }
700 return trackID;
701}
702
703Int_t *AliL3Evaluate::GetFastIDs(UInt_t &tmp_ind,Int_t &npoints)
704{
705 //Get the MC id of space points in case of using the fast simulator.
706
707 FILE *infile = fopen("point_mc.dat","r");
708 if(!infile) return 0;
709 Int_t hitid,hitmc,i;
710
711 for(i=0; ; i++)
712 if(fscanf(infile,"%d %d",&hitid,&hitmc)==EOF) break;
713 npoints = i;
714 rewind(infile);
715 Int_t *pID = new Int_t[npoints];
716 UInt_t *ind = new UInt_t[npoints];
717 tmp_ind = (UInt_t)ind;
718
719 for(i=0; i<npoints; i++)
720 {
721 if(fscanf(infile,"%d %d",&hitid,&hitmc)==EOF) break;
722 pID[i] = hitmc;
723 ind[i] = hitid;
724 }
725 fclose(infile);
726
727 return pID;
728
729}
730
731void AliL3Evaluate::Write2File(Char_t *outputfile)
732{
733 //Write histograms to file:
734
735 TFile *of = new TFile(outputfile,"RECREATE");
736 if(!of->IsOpen())
737 {
738 LOG(AliL3Log::kError,"AliL3Evaluate::Write2File","File Open")
739 <<"Problems opening rootfile"<<ENDLOG;
740 return;
741 }
742
743 of->cd();
744 fPtRes->Write();
745 fNGoodTracksPt->Write();
746 fNFoundTracksPt->Write();
747 fNFakeTracksPt->Write();
748 fTrackEffPt->Write();
749 fFakeTrackEffPt->Write();
750 fNGoodTracksEta->Write();
751 fNFoundTracksEta->Write();
752 fNFakeTracksEta->Write();
753 fTrackEffEta->Write();
754 fFakeTrackEffEta->Write();
755
756 of->Close();
757 delete of;
758
759}
760