1 //Author: Anders Strand Vestbo
2 //Last Modified: 12.01.2001
6 #include <TPolyMarker3D.h>
7 #include <TPolyLine3D.h>
11 #include <TGeometry.h>
13 #include <TParticle.h>
15 #include "AliL3Evaluate.h"
17 #include "AliSimDigits.h"
18 #include "AliTPCParam.h"
19 #include "AliL3Transform.h"
20 #include "AliL3Track.h"
21 #include "AliL3TrackArray.h"
22 #include "AliL3SpacePointData.h"
23 #include "AliL3FileHandler.h"
24 #include "AliL3Logging.h"
25 #include "AliL3Display.h"
28 // Simple display class for the Level3 tracker.
30 ClassImp(AliL3Display)
32 AliL3Display::AliL3Display()
38 AliL3Display::AliL3Display(Int_t *slice)
40 //Ctor. Specify which slices you want to look at.
42 TFile *file = new TFile("/prog/alice/data/GEO/alice.geom");
43 if(!file) printf("NO FILE\n");
45 LOG(AliL3Log::kError,"AliL3Display::AliL3Display","File Open")
46 <<"Geometry file alice.geom does not exist"<<ENDLOG;
48 fGeom = (TGeometry*)file->Get("AliceGeom");
52 fTransform = new AliL3Transform();
57 AliL3Display::~AliL3Display()
66 void AliL3Display::Setup(Char_t *trackfile,Char_t *path)
68 //Read in the hit and track information from produced files.
71 AliL3FileHandler *clusterfile[36][6];
72 for(Int_t s=fMinSlice; s<=fMaxSlice; s++)
74 for(Int_t p=0; p<6; p++)
76 clusterfile[s][p] = new AliL3FileHandler();
77 sprintf(fname,"%spoints_%d_%d.raw",path,s,p);
78 if(!clusterfile[s][p]->SetBinaryInput(fname))
80 LOG(AliL3Log::kError,"AliL3Evaluation::Setup","File Open")
81 <<"Inputfile "<<fname<<" does not exist"<<ENDLOG;
82 delete clusterfile[s][p];
83 clusterfile[s][p] = 0;
86 fClusters[s][p] = (AliL3SpacePointData*)clusterfile[s][p]->Allocate();
87 clusterfile[s][p]->Binary2Memory(fNcl[s][p],fClusters[s][p]);
88 clusterfile[s][p]->CloseBinaryInput();
93 AliL3FileHandler *tfile = new AliL3FileHandler();
94 if(!tfile->SetBinaryInput(trackfile))
96 LOG(AliL3Log::kError,"AliL3Evaluation::Setup","File Open")
97 <<"Inputfile "<<trackfile<<" does not exist"<<ENDLOG;
100 fTracks = new AliL3TrackArray();
101 tfile->Binary2TrackArray(fTracks);
102 tfile->CloseBinaryInput();
107 void AliL3Display::DisplayTracks(Int_t min_hits)
109 //Display the found tracks.
111 TCanvas *c1 = new TCanvas("c1","",700,700);
114 TView *v = new TView(1);
115 v->SetRange(-430,-560,-430,430,560,1710);
122 Int_t ntracks = fTracks->GetNTracks();
123 TPolyLine3D *line = new TPolyLine3D[ntracks];
128 for(Int_t j=0; j<ntracks; j++)
130 AliL3Track *gtrack = fTracks->GetCheckedTrack(j);
131 if(!gtrack) continue;
132 Int_t nHits = gtrack->GetNHits();
133 UInt_t *hitnum = gtrack->GetHitNumbers();
134 if(nHits < min_hits) continue;
135 TPolyMarker3D *pm = new TPolyMarker3D(nHits);
137 for(Int_t h=0; h<nHits; h++)
140 Int_t slice = (id>>25) & 0x7f;
141 Int_t patch = (id>>22) & 0x7;
142 UInt_t pos = id&0x3fffff;
143 AliL3SpacePointData *points = fClusters[slice][patch];
144 if(slice < fMinSlice || slice > fMaxSlice)
148 LOG(AliL3Log::kError,"AliL3Display::DisplayTracks","Clusterarray")
149 <<"No points at slice "<<slice<<" patch "<<patch<<" pos "<<pos<<ENDLOG;
152 if(pos>=fNcl[slice][patch]) {printf("Error \n"); continue;}
154 xyz_tmp[0] = points[pos].fX;
155 xyz_tmp[1] = points[pos].fY;
156 xyz_tmp[2] = points[pos].fZ;
162 pm->SetPoint(h,xcl[h],ycl[h],zcl[h]);
164 pm->SetMarkerColor(2);
166 TPolyLine3D *current_line = &(line[j]);
167 current_line = new TPolyLine3D(nHits,xcl,ycl,zcl,"");
169 current_line->SetLineColor(1);
170 current_line->Draw("same");
174 /*Take this if you want black&white display for printing.
180 sprintf(fname,"LS0%d",i);
181 geom->GetNode(fname)->SetLineColor(color);
182 sprintf(fname,"US0%d",i);
183 geom->GetNode(fname)->SetLineColor(color);
187 sprintf(fname,"LS%d",i);
188 geom->GetNode(fname)->SetLineColor(color);
189 sprintf(fname,"US%d",i);
190 geom->GetNode(fname)->SetLineColor(color);
199 void AliL3Display::DisplayClusters()
201 //Display all clusters.
203 TCanvas *c1 = new TCanvas("c1","",700,700);
205 TView *v = new TView(1);
206 v->SetRange(-430,-560,-430,430,560,1710);
212 for(Int_t s=fMinSlice; s<=fMaxSlice; s++)
214 for(Int_t p=0;p<6;p++)
216 AliL3SpacePointData *points = fClusters[s][p];
217 if(!points) continue;
218 Int_t npoints = fNcl[s][p];
219 TPolyMarker3D *pm = new TPolyMarker3D(npoints);
222 for(Int_t i=0; i<npoints; i++)
225 xyz[0] = points[i].fX;
226 xyz[1] = points[i].fY;
227 xyz[2] = points[i].fZ;
229 pm->SetPoint(i,xyz[0],xyz[1],xyz[2]);
232 pm->SetMarkerColor(2);
242 void AliL3Display::DisplayAll(Int_t min_hits)
244 //Display tracks & all hits.
247 TCanvas *c1 = new TCanvas("c1","",700,700);
249 TView *v = new TView(1);
250 v->SetRange(-430,-560,-430,430,560,1710);
256 for(Int_t s=fMinSlice; s<=fMaxSlice; s++)
258 for(Int_t p=0;p<1;p++)
260 AliL3SpacePointData *points = fClusters[s][p];
261 if(!points) continue;
262 Int_t npoints = fNcl[s][p];
263 TPolyMarker3D *pm = new TPolyMarker3D(npoints);
266 for(Int_t i=0; i<npoints; i++){
267 xyz[0] = points[i].fX;
268 xyz[1] = points[i].fY;
269 xyz[2] = points[i].fZ;
271 pm->SetPoint(i,xyz[0],xyz[1],xyz[2]);
274 pm->SetMarkerColor(2);
279 Int_t ntracks = fTracks->GetNTracks();
280 TPolyLine3D *line = new TPolyLine3D[ntracks];
286 for(Int_t j=0; j<ntracks; j++)
288 AliL3Track *gtrack = fTracks->GetCheckedTrack(j);
289 if(!gtrack) continue;
290 Int_t nHits = gtrack->GetNHits();
291 UInt_t *hitnum = gtrack->GetHitNumbers();
292 if(nHits < min_hits) continue;
293 TPolyMarker3D *pm = new TPolyMarker3D(nHits);
294 for(Int_t h=0; h<nHits; h++)
297 Int_t slice = (id>>25) & 0x7f;
298 Int_t patch = (id>>22) & 0x7;
299 UInt_t pos = id&0x3fffff;
301 AliL3SpacePointData *points = fClusters[slice][patch];
304 LOG(AliL3Log::kError,"AliL3Display::DisplayTracks","Clusterarray")
305 <<"No points at slice "<<slice<<" patch "<<patch<<" pos "<<pos<<ENDLOG;
308 if(pos>=fNcl[slice][patch]) {printf("Error \n"); continue;}
309 xcl[h] = points[pos].fX;
310 ycl[h] = points[pos].fY;
311 zcl[h] = points[pos].fZ;
312 pm->SetPoint(h,xcl[h],ycl[h],zcl[h]);
314 pm->SetMarkerColor(3);
316 TPolyLine3D *current_line = &(line[j]);
317 current_line = new TPolyLine3D(nHits,xcl,ycl,zcl,"");
319 current_line->SetLineColor(4);
320 current_line->Draw("same");
329 void AliL3Display::DisplayClusterRow(Int_t slice,Int_t padrow,Char_t *digitsFile,Char_t *type)
331 //Display the found clusters on this row together with the raw data.
334 TFile *file = new TFile(digitsFile);
335 AliTPCParam *param = (AliTPCParam*)file->Get("75x40_100x60");
336 TTree *TD=(TTree*)file->Get("TreeD_75x40_100x60_0");
337 AliSimDigits da, *digits=&da;
338 TD->GetBranch("Segment")->SetAddress(&digits); //Return pointer to branch segment.
339 AliL3Transform *transform = new AliL3Transform();
342 transform->Slice2Sector(slice,padrow,sector,row);
343 Int_t npads = param->GetNPads(sector,row);
344 Int_t ntimes = param->GetMaxTBin();
345 TH2F *histdig = new TH2F("histdig","",npads,0,npads-1,ntimes,0,ntimes-1);
346 TH2F *histfast = new TH2F("histfast","",npads,0,npads-1,ntimes,0,ntimes-1);
347 TH2F *histpart = new TH2F("histpart","",npads,0,npads-1,ntimes,0,ntimes-1);
350 Int_t sectors_by_rows=(Int_t)TD->GetEntries();
352 for (i=0; i<sectors_by_rows; i++) {
353 if (!TD->GetEvent(i)) continue;
355 param->AdjustSectorRow(digits->GetID(),sec,ro);
357 if(sec != sector) continue;
358 if(ro < row) continue;
360 printf("sector %d row %d\n",sec,ro);
362 while (digits->Next()) {
363 Int_t it=digits->CurrentRow(), ip=digits->CurrentColumn();
364 Short_t dig = digits->GetDigit(it,ip);
365 if(dig<=param->GetZeroSup()) continue;
367 if(it < param->GetMaxTBin()-1 && it > 0)
368 if(digits->GetDigit(it+1,ip) <= param->GetZeroSup()
369 && digits->GetDigit(it-1,ip) <= param->GetZeroSup())
372 histdig->Fill(ip,it,dig);
377 AliRun *gAlice = (AliRun*)file->Get("gAlice");
379 TClonesArray *fParticles=gAlice->Particles();
380 TParticle *part = (TParticle*)fParticles->UncheckedAt(0);
381 AliL3Evaluate *eval = new AliL3Evaluate();
382 Float_t xyz_cross[3];
385 for(Int_t p=0;p<6;p++)
387 AliL3SpacePointData *points = fClusters[slice][p];
388 if(!points) continue;
390 Int_t npoints = fNcl[slice][p];
392 for(Int_t i=0; i<npoints; i++)
394 if(points[i].fPadRow != padrow) continue;
395 xyz[0] = points[i].fX;
396 xyz[1] = points[i].fY;
397 xyz[2] = points[i].fZ;
398 transform->Global2Raw(xyz,sector,row);
399 histfast->Fill(xyz[1],xyz[2],1);
406 TCanvas *c1 = new TCanvas("c1","",900,900);
409 histfast->SetMarkerColor(2);
410 histfast->SetMarkerStyle(4);
411 histpart->SetMarkerColor(2);
412 histpart->SetMarkerStyle(3);
414 histdig->GetXaxis()->SetTitle("Pad #");
415 histdig->GetYaxis()->SetTitle("Timebin #");
417 histfast->Draw("psame");
418 //histpart->Draw("psame");