3 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliL3StandardIncludes.h"
9 #include <TPolyMarker3D.h>
10 #include <TPolyLine3D.h>
14 #include <TGeometry.h>
16 #include <TParticle.h>
19 #include <TClonesArray.h>
21 #include <AliSimDigits.h>
22 #include <AliTPCParam.h>
25 #include "AliL3Logging.h"
26 #include "AliL3Display.h"
27 #include "AliL3Transform.h"
28 #include "AliL3Track.h"
29 #include "AliL3TrackArray.h"
30 #include "AliL3SpacePointData.h"
31 #include "AliL3MemHandler.h"
37 /** \class AliL3Display
39 //_____________________________________________________________
42 // Simple display class for the HLT tracks.
46 ClassImp(AliL3Display)
48 AliL3Display::AliL3Display()
55 AliL3Display::AliL3Display(Int_t *slice,Char_t *gfile)
57 //Ctor. Specify which slices you want to look at.
59 TFile *file = TFile::Open(gfile);
62 LOG(AliL3Log::kError,"AliL3Display::AliL3Display","File Open")
63 <<"Geometry file " << gfile << " does not exist!"<<ENDLOG;
67 fGeom = (TGeometry*)file->Get("AliceGeom");
75 AliL3Display::~AliL3Display()
82 void AliL3Display::Setup(Char_t *trackfile,Char_t *path,Int_t event,Bool_t sp)
84 //Read in the hit and track information from produced files.
87 AliL3MemHandler *clusterfile[36][6];
88 memset(fClusters,0,36*6*sizeof(AliL3SpacePointData*));
89 for(Int_t s=fMinSlice; s<=fMaxSlice; s++)
91 for(Int_t p=0; p<AliL3Transform::GetNPatches(); p++)
98 clusterfile[s][p] = new AliL3MemHandler();
100 sprintf(fname,"%s/points_%d_%d.raw",path,s,patch);
102 sprintf(fname,"%s/points_%d_%d_%d.raw",path,event,s,patch);
103 if(!clusterfile[s][p]->SetBinaryInput(fname))
105 LOG(AliL3Log::kError,"AliL3Evaluation::Setup","File Open")
106 <<"Inputfile "<<fname<<" does not exist"<<ENDLOG;
107 delete clusterfile[s][p];
108 clusterfile[s][p] = 0;
111 fClusters[s][p] = (AliL3SpacePointData*)clusterfile[s][p]->Allocate();
112 clusterfile[s][p]->Binary2Memory(fNcl[s][p],fClusters[s][p]);
113 clusterfile[s][p]->CloseBinaryInput();
119 if(!trackfile) return;
120 AliL3MemHandler *tfile = new AliL3MemHandler();
121 if(!tfile->SetBinaryInput(trackfile))
123 LOG(AliL3Log::kError,"AliL3Evaluation::Setup","File Open")
124 <<"Inputfile "<<trackfile<<" does not exist"<<ENDLOG;
127 fTracks = new AliL3TrackArray();
128 tfile->Binary2TrackArray(fTracks);
129 tfile->CloseBinaryInput();
134 void AliL3Display::DisplayTracks(Int_t min_hits,Bool_t x3don,Float_t thr)
136 //Display the found tracks.
138 TCanvas *c1 = new TCanvas("c1","",700,700);
141 TView *v = new TView(1);
142 v->SetRange(-430,-560,-430,430,560,1710);
148 Int_t ntracks = fTracks->GetNTracks();
149 TPolyLine3D *line = new TPolyLine3D[ntracks];
154 for(Int_t j=0; j<ntracks; j++)
156 AliL3Track *gtrack = fTracks->GetCheckedTrack(j);
157 if(!gtrack) continue;
158 if((thr>=0)&&(gtrack->GetPt()<thr)) continue;
159 Int_t nHits = gtrack->GetNHits();
160 UInt_t *hitnum = gtrack->GetHitNumbers();
161 if(nHits < min_hits) continue;
162 TPolyMarker3D *pm = new TPolyMarker3D(nHits);
164 for(Int_t h=0; h<nHits; h++)
168 Int_t slice = (id>>25) & 0x7f;
169 Int_t patch = (id>>22) & 0x7;
170 UInt_t pos = id&0x3fffff;
171 //cout << h << " id " << pos << endl;
172 AliL3SpacePointData *points = fClusters[slice][patch];
173 if(slice < fMinSlice || slice > fMaxSlice)
177 LOG(AliL3Log::kError,"AliL3Display::DisplayTracks","Clusterarray")
178 <<"No points at slice "<<slice<<" patch "<<patch<<" pos "<<pos<<ENDLOG;
181 if(pos>=fNcl[slice][patch]){
182 LOG(AliL3Log::kError,"AliL3Display::DisplayTracks","Clusterarray")
183 <<"Pos is too large: pos "<<pos <<" ncl "<<fNcl[slice][patch]<<ENDLOG;
188 xyz_tmp[0] = points[pos].fX;
189 xyz_tmp[1] = points[pos].fY;
190 xyz_tmp[2] = points[pos].fZ;
196 pm->SetPoint(h,xcl[h],ycl[h],zcl[h]);
199 if(hitcount==0) continue;
200 pm->SetMarkerColor(2);
202 TPolyLine3D *current_line = &(line[j]);
203 current_line = new TPolyLine3D(nHits,xcl,ycl,zcl,"");
205 current_line->SetLineColor(4);
206 current_line->Draw("same");
210 //Take this if you want black&white display for printing.
214 c1->SetFillColor(10);
217 sprintf(fname,"LS0%d",i);
218 fGeom->GetNode(fname)->SetLineColor(color);
219 sprintf(fname,"US0%d",i);
220 fGeom->GetNode(fname)->SetLineColor(color);
224 sprintf(fname,"LS%d",i);
225 fGeom->GetNode(fname)->SetLineColor(color);
226 sprintf(fname,"US%d",i);
227 fGeom->GetNode(fname)->SetLineColor(color);
236 void AliL3Display::DisplayClusters(Bool_t x3don)
238 //Display all clusters.
240 TCanvas *c1 = new TCanvas("c1","",700,700);
243 TView *v = new TView(1);
244 v->SetRange(-430,-560,-430,430,560,1710);
250 for(Int_t s=fMinSlice; s<=fMaxSlice; s++)
252 for(Int_t p=0;p<6;p++)
254 AliL3SpacePointData *points = fClusters[s][p];
255 if(!points) continue;
256 Int_t npoints = fNcl[s][p];
257 TPolyMarker3D *pm = new TPolyMarker3D(npoints);
260 for(Int_t i=0; i<npoints; i++)
262 xyz[0] = points[i].fX;
263 xyz[1] = points[i].fY;
264 xyz[2] = points[i].fZ;
265 //AliL3Transform::Local2Global(xyz,s);
266 pm->SetPoint(i,xyz[0],xyz[1],xyz[2]);
268 pm->SetMarkerColor(2);
278 void AliL3Display::DisplayAll(Int_t min_hits,Bool_t x3don)
280 //Display tracks & all hits.
282 TCanvas *c1 = new TCanvas("c1","",700,700);
284 TView *v = new TView(1);
285 v->SetRange(-430,-560,-430,430,560,1710);
291 for(Int_t s=fMinSlice; s<=fMaxSlice; s++)
293 for(Int_t p=0;p<6;p++)
295 AliL3SpacePointData *points = fClusters[s][p];
296 if(!points) continue;
297 Int_t npoints = fNcl[s][p];
298 TPolyMarker3D *pm = new TPolyMarker3D(npoints);
301 for(Int_t i=0; i<npoints; i++){
302 xyz[0] = points[i].fX;
303 xyz[1] = points[i].fY;
304 xyz[2] = points[i].fZ;
306 pm->SetPoint(i,xyz[0],xyz[1],xyz[2]);
309 pm->SetMarkerColor(2);
314 Int_t ntracks = fTracks->GetNTracks();
315 TPolyLine3D *line = new TPolyLine3D[ntracks];
320 for(Int_t j=0; j<ntracks; j++)
322 AliL3Track *gtrack = fTracks->GetCheckedTrack(j);
323 if(!gtrack) continue;
324 Int_t nHits = gtrack->GetNHits();
325 UInt_t *hitnum = gtrack->GetHitNumbers();
326 if(nHits < min_hits) continue;
327 TPolyMarker3D *pm = new TPolyMarker3D(nHits);
329 for(Int_t h=0; h<nHits; h++)
332 Int_t slice = (id>>25) & 0x7f;
333 Int_t patch = (id>>22) & 0x7;
334 UInt_t pos = id&0x3fffff;
335 if(slice < fMinSlice || slice > fMaxSlice)
338 AliL3SpacePointData *points = fClusters[slice][patch];
340 LOG(AliL3Log::kError,"AliL3Display::DisplayAll","Clusterarray")
341 <<"No points at slice "<<slice<<" patch "<<patch<<" pos "<<pos<<ENDLOG;
344 if(pos>=fNcl[slice][patch]) {
345 LOG(AliL3Log::kError,"AliL3Display::DisplayAll","Clusterarray")
346 <<"Pos is too large: pos "<<pos <<" ncl "<<fNcl[slice][patch]<<ENDLOG;
349 xcl[h] = points[pos].fX;
350 ycl[h] = points[pos].fY;
351 zcl[h] = points[pos].fZ;
352 pm->SetPoint(h,xcl[h],ycl[h],zcl[h]);
355 if(hitcount==0) continue;
356 pm->SetMarkerColor(3);
358 TPolyLine3D *current_line = &(line[j]);
359 current_line = new TPolyLine3D(nHits,xcl,ycl,zcl,"");
360 current_line->SetLineColor(4);
361 current_line->SetLineWidth(2);
362 current_line->Draw("same");
368 c1->SetFillColor(10);
371 sprintf(fname,"LS0%d",i);
372 fGeom->GetNode(fname)->SetLineColor(color);
373 sprintf(fname,"US0%d",i);
374 fGeom->GetNode(fname)->SetLineColor(color);
378 sprintf(fname,"LS%d",i);
379 fGeom->GetNode(fname)->SetLineColor(color);
380 sprintf(fname,"US%d",i);
381 fGeom->GetNode(fname)->SetLineColor(color);
389 void AliL3Display::DisplayClusterRow(Int_t slice,Int_t padrow,Char_t *digitsFile,Char_t *type)
391 //Display the found clusters on this row together with the raw data.
394 TFile *file = new TFile(digitsFile);
395 AliTPCParam *param = (AliTPCParam*)file->Get(AliL3Transform::GetParamName());
398 sprintf(dname,"TreeD_%s_0",AliL3Transform::GetParamName());
399 TTree *TD=(TTree*)file->Get(dname);
400 AliSimDigits da, *digits=&da;
401 TD->GetBranch("Segment")->SetAddress(&digits); //Return pointer to branch segment.
404 AliL3Transform::Slice2Sector(slice,padrow,sector,row);
405 Int_t npads = param->GetNPads(sector,row);
406 Int_t ntimes = param->GetMaxTBin();
407 TH2F *histdig = new TH2F("histdig","",npads,0,npads-1,ntimes,0,ntimes-1);
408 TH2F *histfast = new TH2F("histfast","",npads,0,npads-1,ntimes,0,ntimes-1);
409 TH2F *histpart = new TH2F("histpart","",npads,0,npads-1,ntimes,0,ntimes-1);
412 Int_t sectors_by_rows=(Int_t)TD->GetEntries();
414 for (i=0; i<sectors_by_rows; i++) {
415 if (!TD->GetEvent(i)) continue;
417 param->AdjustSectorRow(digits->GetID(),sec,ro);
419 if(sec != sector) continue;
420 if(ro < row) continue;
422 printf("sector %d row %d\n",sec,ro);
424 while (digits->Next()) {
425 Int_t it=digits->CurrentRow(), ip=digits->CurrentColumn();
426 Short_t dig = digits->GetDigit(it,ip);
427 if(dig<=param->GetZeroSup()) continue;
429 if(it < param->GetMaxTBin()-1 && it > 0)
430 if(digits->GetDigit(it+1,ip) <= param->GetZeroSup()
431 && digits->GetDigit(it-1,ip) <= param->GetZeroSup())
434 histdig->Fill(ip,it,dig);
439 AliRun *gAlice = (AliRun*)file->Get("gAlice");
441 TClonesArray *fParticles=gAlice->Particles();
442 TParticle *part = (TParticle*)fParticles->UncheckedAt(0);
443 AliL3Evaluate *eval = new AliL3Evaluate();
444 Float_t xyz_cross[3];
447 for(Int_t p=0;p<6;p++)
449 AliL3SpacePointData *points = fClusters[slice][p];
450 if(!points) continue;
452 Int_t npoints = fNcl[slice][p];
454 for(Int_t i=0; i<npoints; i++)
456 if(points[i].fPadRow != padrow) continue;
457 xyz[0] = points[i].fX;
458 xyz[1] = points[i].fY;
459 xyz[2] = points[i].fZ;
460 AliL3Transform::Global2Raw(xyz,sector,row);
461 //AliL3Transform::Local2Raw(xyz,sector,row);
462 histfast->Fill(xyz[1],xyz[2],1);
469 TCanvas *c1 = new TCanvas("c1","",900,900);
472 histfast->SetMarkerColor(2);
473 histfast->SetMarkerStyle(4);
474 histpart->SetMarkerColor(2);
475 histpart->SetMarkerStyle(3);
477 histdig->GetXaxis()->SetTitle("Pad #");
478 histdig->GetYaxis()->SetTitle("Timebin #");
480 histfast->Draw("psame");
481 //histpart->Draw("psame");