3 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
4 //*-- Copyright © ASV
8 #include <TPolyMarker3D.h>
9 #include <TPolyLine3D.h>
13 #include <TGeometry.h>
15 #include <TParticle.h>
18 #include "AliL3Display.h"
21 #include "AliSimDigits.h"
22 #include "AliTPCParam.h"
24 #include "AliL3Transform.h"
25 #include "AliL3Track.h"
26 #include "AliL3TrackArray.h"
27 #include "AliL3SpacePointData.h"
28 #include "AliL3MemHandler.h"
29 #include "AliL3Logging.h"
32 //_____________________________________________________________
35 // Simple display class for the Level3 tracker.
37 ClassImp(AliL3Display)
39 AliL3Display::AliL3Display()
45 AliL3Display::AliL3Display(Int_t *slice,Char_t *gfile)
47 //Ctor. Specify which slices you want to look at.
49 TFile *file = new TFile(gfile);
50 if(!file) printf("NO FILE\n");
52 LOG(AliL3Log::kError,"AliL3Display::AliL3Display","File Open")
53 <<"Geometry file " << gfile << " does not exist"<<ENDLOG;
55 fGeom = (TGeometry*)file->Get("AliceGeom");
63 AliL3Display::~AliL3Display()
70 void AliL3Display::Setup(Char_t *trackfile,Char_t *path)
72 //Read in the hit and track information from produced files.
74 AliL3Transform::Init(path);
76 AliL3MemHandler *clusterfile[36][6];
77 for(Int_t s=fMinSlice; s<=fMaxSlice; s++)
79 for(Int_t p=0; p<6; p++)
81 clusterfile[s][p] = new AliL3MemHandler();
82 sprintf(fname,"%spoints_%d_%d.raw",path,s,p);
83 if(!clusterfile[s][p]->SetBinaryInput(fname))
85 LOG(AliL3Log::kError,"AliL3Evaluation::Setup","File Open")
86 <<"Inputfile "<<fname<<" does not exist"<<ENDLOG;
87 delete clusterfile[s][p];
88 clusterfile[s][p] = 0;
91 fClusters[s][p] = (AliL3SpacePointData*)clusterfile[s][p]->Allocate();
92 clusterfile[s][p]->Binary2Memory(fNcl[s][p],fClusters[s][p]);
93 clusterfile[s][p]->CloseBinaryInput();
98 AliL3MemHandler *tfile = new AliL3MemHandler();
99 if(!tfile->SetBinaryInput(trackfile))
101 LOG(AliL3Log::kError,"AliL3Evaluation::Setup","File Open")
102 <<"Inputfile "<<trackfile<<" does not exist"<<ENDLOG;
105 fTracks = new AliL3TrackArray();
106 tfile->Binary2TrackArray(fTracks);
107 tfile->CloseBinaryInput();
112 void AliL3Display::DisplayTracks(Int_t min_hits,Bool_t x3don,Float_t thr)
114 //Display the found tracks.
116 TCanvas *c1 = new TCanvas("c1","",700,700);
119 TView *v = new TView(1);
120 v->SetRange(-430,-560,-430,430,560,1710);
126 Int_t ntracks = fTracks->GetNTracks();
127 TPolyLine3D *line = new TPolyLine3D[ntracks];
132 for(Int_t j=0; j<ntracks; j++)
134 AliL3Track *gtrack = fTracks->GetCheckedTrack(j);
135 if(!gtrack) continue;
136 if(gtrack->GetPt()<thr) continue;
137 Int_t nHits = gtrack->GetNHits();
138 UInt_t *hitnum = gtrack->GetHitNumbers();
139 if(nHits < min_hits) continue;
140 TPolyMarker3D *pm = new TPolyMarker3D(nHits);
142 for(Int_t h=0; h<nHits; h++)
145 Int_t slice = (id>>25) & 0x7f;
146 Int_t patch = (id>>22) & 0x7;
147 UInt_t pos = id&0x3fffff;
148 AliL3SpacePointData *points = fClusters[slice][patch];
149 if(slice < fMinSlice || slice > fMaxSlice)
153 LOG(AliL3Log::kError,"AliL3Display::DisplayTracks","Clusterarray")
154 <<"No points at slice "<<slice<<" patch "<<patch<<" pos "<<pos<<ENDLOG;
157 if(pos>=fNcl[slice][patch]) {printf("Error \n"); continue;}
159 xyz_tmp[0] = points[pos].fX;
160 xyz_tmp[1] = points[pos].fY;
161 xyz_tmp[2] = points[pos].fZ;
167 pm->SetPoint(h,xcl[h],ycl[h],zcl[h]);
170 if(hitcount==0) continue;
171 pm->SetMarkerColor(2);
173 TPolyLine3D *current_line = &(line[j]);
174 current_line = new TPolyLine3D(nHits,xcl,ycl,zcl,"");
176 current_line->SetLineColor(4);
177 current_line->Draw("same");
181 //Take this if you want black&white display for printing.
185 c1->SetFillColor(10);
188 sprintf(fname,"LS0%d",i);
189 fGeom->GetNode(fname)->SetLineColor(color);
190 sprintf(fname,"US0%d",i);
191 fGeom->GetNode(fname)->SetLineColor(color);
195 sprintf(fname,"LS%d",i);
196 fGeom->GetNode(fname)->SetLineColor(color);
197 sprintf(fname,"US%d",i);
198 fGeom->GetNode(fname)->SetLineColor(color);
207 void AliL3Display::DisplayClusters(Bool_t x3don)
209 //Display all clusters.
211 TCanvas *c1 = new TCanvas("c1","",700,700);
214 TView *v = new TView(1);
215 v->SetRange(-430,-560,-430,430,560,1710);
221 for(Int_t s=fMinSlice; s<=fMaxSlice; s++)
223 for(Int_t p=0;p<6;p++)
225 AliL3SpacePointData *points = fClusters[s][p];
226 if(!points) continue;
227 Int_t npoints = fNcl[s][p];
228 TPolyMarker3D *pm = new TPolyMarker3D(npoints);
231 for(Int_t i=0; i<npoints; i++)
234 xyz[0] = points[i].fX;
235 xyz[1] = points[i].fY;
236 xyz[2] = points[i].fZ;
238 pm->SetPoint(i,xyz[0],xyz[1],xyz[2]);
241 pm->SetMarkerColor(2);
251 void AliL3Display::DisplayAll(Int_t min_hits,Bool_t x3don)
253 //Display tracks & all hits.
255 TCanvas *c1 = new TCanvas("c1","",700,700);
257 TView *v = new TView(1);
258 v->SetRange(-430,-560,-430,430,560,1710);
264 for(Int_t s=fMinSlice; s<=fMaxSlice; s++)
266 for(Int_t p=0;p<6;p++)
268 AliL3SpacePointData *points = fClusters[s][p];
269 if(!points) continue;
270 Int_t npoints = fNcl[s][p];
271 TPolyMarker3D *pm = new TPolyMarker3D(npoints);
274 for(Int_t i=0; i<npoints; i++){
275 xyz[0] = points[i].fX;
276 xyz[1] = points[i].fY;
277 xyz[2] = points[i].fZ;
279 pm->SetPoint(i,xyz[0],xyz[1],xyz[2]);
282 pm->SetMarkerColor(2);
287 Int_t ntracks = fTracks->GetNTracks();
288 TPolyLine3D *line = new TPolyLine3D[ntracks];
293 for(Int_t j=0; j<ntracks; j++)
295 AliL3Track *gtrack = fTracks->GetCheckedTrack(j);
296 if(!gtrack) continue;
297 Int_t nHits = gtrack->GetNHits();
298 UInt_t *hitnum = gtrack->GetHitNumbers();
299 if(nHits < min_hits) continue;
300 TPolyMarker3D *pm = new TPolyMarker3D(nHits);
302 for(Int_t h=0; h<nHits; h++)
305 Int_t slice = (id>>25) & 0x7f;
306 Int_t patch = (id>>22) & 0x7;
307 UInt_t pos = id&0x3fffff;
308 if(slice < fMinSlice || slice > fMaxSlice)
311 AliL3SpacePointData *points = fClusters[slice][patch];
313 LOG(AliL3Log::kError,"AliL3Display::DisplayTracks","Clusterarray")
314 <<"No points at slice "<<slice<<" patch "<<patch<<" pos "<<pos<<ENDLOG;
317 if(pos>=fNcl[slice][patch]) {printf("Error \n"); continue;}
318 xcl[h] = points[pos].fX;
319 ycl[h] = points[pos].fY;
320 zcl[h] = points[pos].fZ;
321 pm->SetPoint(h,xcl[h],ycl[h],zcl[h]);
324 if(hitcount==0) continue;
325 pm->SetMarkerColor(3);
327 TPolyLine3D *current_line = &(line[j]);
328 current_line = new TPolyLine3D(nHits,xcl,ycl,zcl,"");
329 current_line->SetLineColor(4);
330 current_line->SetLineWidth(2);
331 current_line->Draw("same");
337 c1->SetFillColor(10);
340 sprintf(fname,"LS0%d",i);
341 fGeom->GetNode(fname)->SetLineColor(color);
342 sprintf(fname,"US0%d",i);
343 fGeom->GetNode(fname)->SetLineColor(color);
347 sprintf(fname,"LS%d",i);
348 fGeom->GetNode(fname)->SetLineColor(color);
349 sprintf(fname,"US%d",i);
350 fGeom->GetNode(fname)->SetLineColor(color);
358 void AliL3Display::DisplayClusterRow(Int_t slice,Int_t padrow,Char_t *digitsFile,Char_t *type)
360 //Display the found clusters on this row together with the raw data.
363 TFile *file = new TFile(digitsFile);
364 AliTPCParam *param = (AliTPCParam*)file->Get("75x40_100x60");
365 TTree *TD=(TTree*)file->Get("TreeD_75x40_100x60_0");
366 AliSimDigits da, *digits=&da;
367 TD->GetBranch("Segment")->SetAddress(&digits); //Return pointer to branch segment.
370 AliL3Transform::Slice2Sector(slice,padrow,sector,row);
371 Int_t npads = param->GetNPads(sector,row);
372 Int_t ntimes = param->GetMaxTBin();
373 TH2F *histdig = new TH2F("histdig","",npads,0,npads-1,ntimes,0,ntimes-1);
374 TH2F *histfast = new TH2F("histfast","",npads,0,npads-1,ntimes,0,ntimes-1);
375 TH2F *histpart = new TH2F("histpart","",npads,0,npads-1,ntimes,0,ntimes-1);
378 Int_t sectors_by_rows=(Int_t)TD->GetEntries();
380 for (i=0; i<sectors_by_rows; i++) {
381 if (!TD->GetEvent(i)) continue;
383 param->AdjustSectorRow(digits->GetID(),sec,ro);
385 if(sec != sector) continue;
386 if(ro < row) continue;
388 printf("sector %d row %d\n",sec,ro);
390 while (digits->Next()) {
391 Int_t it=digits->CurrentRow(), ip=digits->CurrentColumn();
392 Short_t dig = digits->GetDigit(it,ip);
393 if(dig<=param->GetZeroSup()) continue;
395 if(it < param->GetMaxTBin()-1 && it > 0)
396 if(digits->GetDigit(it+1,ip) <= param->GetZeroSup()
397 && digits->GetDigit(it-1,ip) <= param->GetZeroSup())
400 histdig->Fill(ip,it,dig);
405 AliRun *gAlice = (AliRun*)file->Get("gAlice");
407 TClonesArray *fParticles=gAlice->Particles();
408 TParticle *part = (TParticle*)fParticles->UncheckedAt(0);
409 AliL3Evaluate *eval = new AliL3Evaluate();
410 Float_t xyz_cross[3];
413 for(Int_t p=0;p<6;p++)
415 AliL3SpacePointData *points = fClusters[slice][p];
416 if(!points) continue;
418 Int_t npoints = fNcl[slice][p];
420 for(Int_t i=0; i<npoints; i++)
422 if(points[i].fPadRow != padrow) continue;
423 xyz[0] = points[i].fX;
424 xyz[1] = points[i].fY;
425 xyz[2] = points[i].fZ;
426 AliL3Transform::Global2Raw(xyz,sector,row);
427 histfast->Fill(xyz[1],xyz[2],1);
434 TCanvas *c1 = new TCanvas("c1","",900,900);
437 histfast->SetMarkerColor(2);
438 histfast->SetMarkerStyle(4);
439 histpart->SetMarkerColor(2);
440 histpart->SetMarkerStyle(3);
442 histdig->GetXaxis()->SetTitle("Pad #");
443 histdig->GetYaxis()->SetTitle("Timebin #");
445 histfast->Draw("psame");
446 //histpart->Draw("psame");