]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/qaRec/AliTRDcheckDetector.cxx
insert protection against missing pointer
[u/mrichter/AliRoot.git] / TRD / qaRec / AliTRDcheckDetector.cxx
1 #include <TFile.h>
2 #include <TH1F.h>
3 #include <TGraph.h>
4 #include <TMath.h>
5 #include <TMap.h>
6 #include <TObjArray.h>
7 #include <TObject.h>
8 #include <TObjString.h>
9 #include <TProfile.h>
10 #include <TProfile2D.h>
11 #include <TROOT.h>
12
13 #include "AliLog.h"
14 #include "AliTRDcluster.h"
15 #include "AliESDHeader.h"
16 #include "AliESDRun.h"
17 #include "AliTRDgeometry.h"
18 #include "AliTRDseedV1.h"
19 #include "AliTRDtrackV1.h"
20 #include "AliTrackReference.h"
21 #include "TTreeStream.h"
22
23 #include "AliTRDtrackInfo/AliTRDtrackInfo.h"
24 #include "AliTRDtrackInfo/AliTRDeventInfo.h"
25 #include "AliTRDcheckDetector.h"
26
27 #include <cstdio>
28 #include <iostream>
29
30 ////////////////////////////////////////////////////////////////////////////
31 //                                                                        //
32 //  Reconstruction QA                                                     //
33 //                                                                        //
34 //  Task doing basic checks for tracking and detector performance         //
35 //                                                                        //
36 //  Authors:                                                              //
37 //    Anton Andronic <A.Andronic@gsi.de>                                  //
38 //    Markus Fasel <M.Fasel@gsi.de>                                       //
39 //                                                                        //
40 ////////////////////////////////////////////////////////////////////////////
41
42 //_______________________________________________________
43 AliTRDcheckDetector::AliTRDcheckDetector():
44   AliTRDrecoTask("DetChecker", "Basic Detector Checker")
45   ,fEventInfo(0x0)
46   ,fTriggerNames(0x0)
47 {
48   //
49   // Default constructor
50   //
51   DefineInput(1,AliTRDeventInfo::Class());
52   InitFunctorList();
53 }
54
55 //_______________________________________________________
56 AliTRDcheckDetector::~AliTRDcheckDetector(){
57   //
58   // Destructor
59   // 
60   if(fEventInfo) delete fEventInfo;
61   if(fTriggerNames) delete fTriggerNames;
62 }
63
64 //_______________________________________________________
65 void AliTRDcheckDetector::ConnectInputData(Option_t *opt){
66   //
67   // Connect the Input data with the task
68   //
69   AliTRDrecoTask::ConnectInputData(opt);
70   fEventInfo = dynamic_cast<AliTRDeventInfo *>(GetInputData(1));
71 }
72
73 //_______________________________________________________
74 void AliTRDcheckDetector::CreateOutputObjects(){
75   //
76   // Create Output Objects
77   //
78   OpenFile(0,"RECREATE");
79   fContainer = Histos();
80   if(!fTriggerNames) fTriggerNames = new TMap();
81 }
82
83 //_______________________________________________________
84 void AliTRDcheckDetector::Exec(Option_t *opt){
85   //
86   // Execution function
87   // Filling TRD quality histos
88   //
89   if(!HasMCdata() && fEventInfo->GetEventHeader()->GetEventType() != 7) return; // For real data we select only physical events
90   AliTRDrecoTask::Exec(opt);  
91   Int_t nTracks = 0;            // Count the number of tracks per event
92   Int_t triggermask = fEventInfo->GetEventHeader()->GetTriggerMask();
93   TString triggername =  fEventInfo->GetRunInfo()->GetFiredTriggerClasses(triggermask);
94   if(fDebugLevel > 6)printf("Trigger cluster: %d, Trigger class: %s\n", triggermask, triggername.Data());
95   dynamic_cast<TH1F *>(fContainer->UncheckedAt(kNEventsTrigger))->Fill(triggermask);
96   for(Int_t iti = 0; iti < fTracks->GetEntriesFast(); iti++){
97     if(!fTracks->UncheckedAt(iti)) continue;
98     AliTRDtrackInfo *fTrackInfo = dynamic_cast<AliTRDtrackInfo *>(fTracks->UncheckedAt(iti));
99     if(!fTrackInfo->GetTrack()) continue;
100     nTracks++;
101   }
102   if(nTracks){
103     dynamic_cast<TH1F *>(fContainer->UncheckedAt(kNEventsTriggerTracks))->Fill(triggermask);
104     dynamic_cast<TH1F *>(fContainer->UncheckedAt(kNTracksEventHist))->Fill(nTracks);
105   }
106   if(triggermask <= 20 && !fTriggerNames->FindObject(Form("%d", triggermask))){
107     fTriggerNames->Add(new TObjString(Form("%d", triggermask)), new TObjString(triggername));
108     // also set the label for both histograms
109     TH1 *histo = dynamic_cast<TH1F *>(fContainer->UncheckedAt(kNEventsTriggerTracks));
110     histo->GetXaxis()->SetBinLabel(histo->FindBin(triggermask), triggername);
111     histo = dynamic_cast<TH1F *>(fContainer->UncheckedAt(kNEventsTrigger));
112     histo->GetXaxis()->SetBinLabel(histo->FindBin(triggermask), triggername);
113   }
114   PostData(0, fContainer);
115 }
116
117 //_______________________________________________________
118 void AliTRDcheckDetector::Terminate(Option_t *){
119   //
120   // Terminate function
121   //
122 }
123
124 //_______________________________________________________
125 Bool_t AliTRDcheckDetector::PostProcess(){
126   //
127   // Do Postprocessing (for the moment set the number of Reference histograms)
128   //
129   
130   TH1 * histo = 0x0;
131   histo = dynamic_cast<TH1F *>(fContainer->UncheckedAt(kNTracksEventHist));
132   histo->GetXaxis()->SetTitle("Number of Tracks");
133   histo->GetYaxis()->SetTitle("Events");
134   histo = dynamic_cast<TH1F *>(fContainer->UncheckedAt(kNclustersHist));
135   histo->GetXaxis()->SetTitle("Number of Clusters");
136   histo->GetYaxis()->SetTitle("Entries");
137   histo = dynamic_cast<TH1F *>(fContainer->UncheckedAt(kNtrackletsHist));
138   histo->GetXaxis()->SetTitle("Number of Tracklets");
139   histo->GetYaxis()->SetTitle("Entries");
140   histo = dynamic_cast<TH1F *>(fContainer->UncheckedAt(kNclusterTrackletHist));
141   histo->GetXaxis()->SetTitle("Number of Clusters");
142   histo->GetYaxis()->SetTitle("Entries");
143   histo = dynamic_cast<TH1F *>(fContainer->UncheckedAt(kChi2));
144   histo->GetXaxis()->SetTitle("#chi^2");
145   histo->GetYaxis()->SetTitle("Entries");
146   histo = dynamic_cast<TH1F *>(fContainer->UncheckedAt(kNTracksSectorHist));
147   histo->GetXaxis()->SetTitle("Sector");
148   histo->GetYaxis()->SetTitle("Number of Tracks");
149   histo = dynamic_cast<TProfile *>(fContainer->UncheckedAt(kPulseHeight));
150   histo->GetXaxis()->SetTitle("Time / 100ns");
151   histo->GetYaxis()->SetTitle("Average Pulse Height (a. u.)");
152   histo = dynamic_cast<TH1F *>(fContainer->UncheckedAt(kClusterCharge));
153   histo->GetXaxis()->SetTitle("Cluster Charge (a.u.)");
154   histo->GetYaxis()->SetTitle("Entries");
155   histo = dynamic_cast<TH1F *>(fContainer->UncheckedAt(kChargeDeposit));
156   histo->GetXaxis()->SetTitle("Charge Deposit (a.u.)");
157   histo->GetYaxis()->SetTitle("Entries");
158   
159   // Calculate the purity of the trigger clusters
160   histo = dynamic_cast<TH1F *>(fContainer->UncheckedAt(kNEventsTrigger));
161   TH1F *histoTracks = dynamic_cast<TH1F *>(fContainer->UncheckedAt(kNEventsTriggerTracks));
162   histoTracks->Divide(histo);
163   Float_t purities[20], val = 0;
164   TString triggernames[20];
165   Int_t nTriggerClasses = 0;
166   for(Int_t ibin = 1; ibin <= histo->GetNbinsX(); ibin++){
167     if((val = histoTracks->GetBinContent(ibin))){
168       purities[nTriggerClasses] = val;
169       triggernames[nTriggerClasses] = histoTracks->GetXaxis()->GetBinLabel(ibin);
170       nTriggerClasses++;
171     }
172   }
173   TH1F *hTriggerInf = new TH1F("fTriggerInf", "Trigger Information", TMath::Max(nTriggerClasses, 1), 0, TMath::Max(nTriggerClasses, 1));
174   for(Int_t ibin = 1; ibin <= nTriggerClasses; ibin++){
175     hTriggerInf->SetBinContent(ibin, purities[ibin-1]);
176     hTriggerInf->GetXaxis()->SetBinLabel(ibin, triggernames[ibin-1].Data());
177   }
178   hTriggerInf->GetXaxis()->SetTitle("Trigger Cluster");
179   hTriggerInf->GetYaxis()->SetTitle("Ratio");
180   hTriggerInf->GetYaxis()->SetRangeUser(0,1);
181 //      hTriggerInf->SetMarkerColor(kBlue);
182 //      hTriggerInf->SetMarkerStyle(22);
183   fContainer->Add(hTriggerInf);
184   fNRefFigures = 10;
185   return kTRUE;
186 }
187
188 //_______________________________________________________
189 void AliTRDcheckDetector::GetRefFigure(Int_t ifig){
190   //
191   // Setting Reference Figures
192   //
193   TH1 *h = 0x0;
194   switch(ifig){
195   case 0:       
196     ((TH1F*)fContainer->At(kNTracksEventHist))->Draw("pl");
197     break;
198   case 1:
199     ((TH1F*)fContainer->At(kNclustersHist))->Draw("pl");
200     break;
201   case 2:
202     h = (TH1F*)fContainer->At(kNtrackletsHist);
203     if(!h->GetEntries()) break;
204     h->Scale(100./h->Integral());
205     h->GetXaxis()->SetRangeUser(.5, 6.5);
206     h->SetFillColor(kGreen);
207     h->SetBarOffset(.2);
208     h->SetBarWidth(.6);
209     h->Draw("bar1");
210     break;
211   case 3:
212     ((TH1F*)fContainer->At(kNclusterTrackletHist))->Draw("pc");
213     break;
214   case 4:
215     ((TH1F*)fContainer->At(kChi2))->Draw("");
216     break;
217   case 5:
218     h = (TH1F*)fContainer->At(kNTracksSectorHist);
219     if(!h->GetEntries()) break;
220     h->Scale(100./h->Integral());
221     h->SetFillColor(kGreen);
222     h->SetBarOffset(.2);
223     h->SetBarWidth(.6);
224     h->Draw("bar1");
225     break;
226   case 6:
227     h = (TH1F*)fContainer->At(kPulseHeight);
228     h->SetMarkerStyle(24);
229     h->Draw("e1");
230     break;
231   case 7:
232     ((TH1F*)fContainer->At(kClusterCharge))->Draw("c");
233     break;
234   case 8:
235     ((TH1F*)fContainer->At(kChargeDeposit))->Draw("c");
236     break;
237   case 9: 
238     h=(TH1F*)fContainer->At(kPurity);
239     h->SetBarOffset(.2);
240     h->SetBarWidth(.6);
241     h->SetFillColor(kGreen);
242     h->Draw("bar1");
243     break;
244   default:
245     ((TH1F*)fContainer->At(kNTracksEventHist))->Draw("pl");
246     break;
247   }
248 }
249
250 //_______________________________________________________
251 TObjArray *AliTRDcheckDetector::Histos(){
252   //
253   // Create QA histograms
254   //
255   if(fContainer) return fContainer;
256   
257   fContainer = new TObjArray(25);
258   // Register Histograms
259   fContainer->AddAt(new TH1F("hNtrks", "Number of Tracks per event", 100, 0, 100), kNTracksEventHist);
260   fContainer->AddAt(new TH1F("hEventsTriggerTracks", "Trigger Class (Tracks)", 100, 0, 100), kNEventsTriggerTracks);
261   fContainer->AddAt(new TH1F("hNcls", "Nr. of clusters per track", 181, -0.5, 180.5), kNclustersHist);
262   fContainer->AddAt(new TH1F("hNtls", "Nr. tracklets per track", 7, -0.5, 6.5), kNtrackletsHist);
263   fContainer->AddAt(new TH1F("hNclTls","Mean Number of clusters per tracklet", 31, -0.5, 30.5), kNclusterTrackletHist);
264   fContainer->AddAt(new TH1F("hChi2", "Chi2", 200, 0, 20), kChi2);
265   fContainer->AddAt(new TH1F("hChi2n", "Norm. Chi2 (tracklets)", 50, 0, 5), kChi2Normalized);
266   fContainer->AddAt(new TH1F("hSM", "Track Counts in Supermodule", 18, -0.5, 17.5), kNTracksSectorHist);
267   // Detector signal on Detector-by-Detector basis
268   fContainer->AddAt(new TProfile("hPHdetector", "Average PH", 31, -0.5, 30.5), kPulseHeight);
269   fContainer->AddAt(new TH1F("hQclDetector", "Cluster charge", 200, 0, 1200), kClusterCharge);
270   fContainer->AddAt(new TH1F("hQTdetector", "Total Charge Deposit", 6000, 0, 6000), kChargeDeposit);
271   fContainer->AddAt(new TH1F("hEventsTrigger", "Trigger Class", 100, 0, 100), kNEventsTrigger);
272
273   return fContainer;
274 }
275
276 /*
277 * Plotting Functions
278 */
279
280 //_______________________________________________________
281 TH1 *AliTRDcheckDetector::PlotMeanNClusters(const AliTRDtrackV1 *track){
282   //
283   // Plot the mean number of clusters per tracklet
284   //
285   if(!fTrack){
286     if(!track){
287       AliWarning("No Track defined.");
288       return 0x0;
289     }
290     fTrack = track;
291   }
292   TH1 *h = 0x0;
293   if(!(h = dynamic_cast<TH1F *>(fContainer->At(kNclusterTrackletHist)))){
294     AliWarning("No Histogram defined.");
295     return 0x0;
296   }
297   AliTRDseedV1 *tracklet = 0x0;
298   for(Int_t itl = 0; itl < AliTRDgeometry::kNlayer; itl++){
299     if(!(tracklet = fTrack->GetTracklet(itl)) || !tracklet->IsOK()) continue;
300     h->Fill(tracklet->GetN());
301   }
302   return h;
303 }
304
305 //_______________________________________________________
306 TH1 *AliTRDcheckDetector::PlotNClusters(const AliTRDtrackV1 *track){
307   //
308   // Plot the number of clusters in one track
309   //
310   if(!fTrack){
311     if(!track){
312       AliWarning("No Track defined.");
313       return 0x0;
314     }
315     fTrack = track;
316   }
317   TH1 *h = 0x0;
318   if(!(h = dynamic_cast<TH1F *>(fContainer->At(kNclustersHist)))){
319     AliWarning("No Histogram defined.");
320     return 0x0;
321   }
322   
323   Int_t nclusters = 0;
324   AliTRDseedV1 *tracklet = 0x0;
325   for(Int_t itl = 0; itl < AliTRDgeometry::kNlayer; itl++){
326     if(!(tracklet = fTrack->GetTracklet(itl)) || !tracklet->IsOK()) continue;
327     nclusters += tracklet->GetN();
328     if(fDebugLevel > 2){
329       Int_t crossing = tracklet->GetNChange();
330       AliTRDcluster *c = 0x0;
331       for(Int_t itime = 0; itime < kNTimeBins; itime++){
332         if(!(c = tracklet->GetClusters(itime))) continue;
333         break;
334       }
335       Int_t detector = c->GetDetector();
336       Float_t sector = static_cast<Int_t>(detector/AliTRDgeometry::kNdets);
337       Float_t theta = TMath::ATan(tracklet->GetZfit(1));
338       Float_t phi = TMath::ATan(tracklet->GetYfit(1));
339       Float_t momentum = 0.;
340       Int_t pdg = 0;
341       if(fMC){
342               if(fMC->GetTrackRef()) momentum = fMC->GetTrackRef()->P();
343         pdg = fMC->GetPDG();
344       }
345       (*fDebugStream) << "NClusters"
346         << "Detector="  << detector
347         << "Sector="    << sector
348         << "crossing="  << crossing
349         << "momentum="  << momentum
350         << "pdg="                               << pdg
351         << "theta="                     << theta
352         << "phi="                               << phi
353         << "nclusters=" << nclusters
354         << "\n";
355     }
356   }
357   h->Fill(nclusters);
358   return h;
359 }
360
361 //_______________________________________________________
362 TH1 *AliTRDcheckDetector::PlotChi2(const AliTRDtrackV1 *track){
363   //
364   // Plot the chi2 of the track
365   //
366     if(!fTrack){
367     if(!track){
368       AliWarning("No Track defined.");
369       return 0x0;
370     }
371     fTrack = track;
372   }
373   TH1 *h = 0x0;
374   if(!(h = dynamic_cast<TH1F *>(fContainer->At(kChi2)))){
375     AliWarning("No Histogram defined.");
376     return 0x0;
377   }
378   h->Fill(fTrack->GetChi2());
379   return h;
380 }
381
382 //_______________________________________________________
383 TH1 *AliTRDcheckDetector::PlotNormalizedChi2(const AliTRDtrackV1 *track){
384   //
385   // Plot the chi2 of the track
386   //
387     if(!fTrack){
388     if(!track){
389       AliWarning("No Track defined.");
390       return 0x0;
391     }
392     fTrack = track;
393   }
394   TH1 *h = 0x0;
395   if(!(h = dynamic_cast<TH1F *>(fContainer->At(kChi2Normalized)))){
396     AliWarning("No Histogram defined.");
397     return 0x0;
398   }
399   Int_t nTracklets = 0;
400   AliTRDseedV1 *tracklet = 0x0;
401   for(Int_t itl = 0; itl < AliTRDgeometry::kNlayer; itl++){
402     if(!(tracklet = fTrack->GetTracklet(itl)) || !tracklet->IsOK()) continue;
403     nTracklets++;
404   }
405   h->Fill(fTrack->GetChi2()/nTracklets);
406   return h;
407 }
408
409
410 //_______________________________________________________
411 TH1 *AliTRDcheckDetector::PlotNTracklets(const AliTRDtrackV1 *track){
412   //
413   // Plot the number of tracklets
414   //
415   if(!fTrack){
416     if(!track){
417       AliWarning("No Track defined.");
418       return 0x0;
419     }
420     fTrack = track;
421   }
422   TH1 *h = 0x0;
423   if(!(h = dynamic_cast<TH1F *>(fContainer->At(kNtrackletsHist)))){
424     AliWarning("No Histogram defined.");
425     return 0x0;
426   }
427   Int_t nTracklets = 0;
428   AliTRDseedV1 *tracklet = 0x0;
429   for(Int_t itl = 0; itl < AliTRDgeometry::kNlayer; itl++){
430     if(!(tracklet = fTrack->GetTracklet(itl)) || !tracklet->IsOK()) continue;
431     nTracklets++;
432   }
433   h->Fill(nTracklets);
434   return h;
435 }
436
437 //_______________________________________________________
438 TH1 *AliTRDcheckDetector::PlotPulseHeight(const AliTRDtrackV1 *track){
439   //
440   // Plot the average pulse height
441   //
442   if(!fTrack){
443     if(!track){
444       AliWarning("No Track defined.");
445       return 0x0;
446     }
447     fTrack = track;
448   }
449   TProfile *h = 0x0;
450   if(!(h = dynamic_cast<TProfile *>(fContainer->At(kPulseHeight)))){
451     AliWarning("No Histogram defined.");
452     return 0x0;
453   }
454   AliTRDseedV1 *tracklet = 0x0;
455   AliTRDcluster *c = 0x0;
456   for(Int_t itl = 0; itl < AliTRDgeometry::kNlayer; itl++){
457     if(!(tracklet = fTrack->GetTracklet(itl)) || !tracklet->IsOK())continue;
458     for(Int_t itime = 0; itime < kNTimeBins; itime++){
459       if(!(c = tracklet->GetClusters(itime))) continue;
460       Int_t localtime        = c->GetLocalTimeBin();
461       Double_t absolute_charge = TMath::Abs(c->GetQ());
462       h->Fill(localtime, absolute_charge);
463       if(fDebugLevel > 3){
464         Int_t crossing = tracklet->GetNChange();
465         Int_t detector = c->GetDetector();
466         Float_t sector = static_cast<Int_t>(detector/AliTRDgeometry::kNdets);
467         Float_t theta = TMath::ATan(tracklet->GetZfit(1));
468         Float_t phi = TMath::ATan(tracklet->GetYfit(1));
469         Float_t momentum = 0.;
470         Int_t pdg = 0;
471         if(fMC){
472           if(fMC->GetTrackRef()) momentum = fMC->GetTrackRef()->P();
473           pdg = fMC->GetPDG();
474         }
475         (*fDebugStream) << "PulseHeight"
476           << "Detector="        << detector
477           << "Sector="          << sector
478           << "crossing="        << crossing
479           << "Timebin="         << localtime
480           << "Charge="          << absolute_charge
481           << "momentum="        << momentum
482           << "pdg="                             << pdg
483           << "theta="                   << theta
484           << "phi="                             << phi
485           << "\n";
486       }
487     }
488   }
489   return h;
490 }
491
492 //_______________________________________________________
493 TH1 *AliTRDcheckDetector::PlotClusterCharge(const AliTRDtrackV1 *track){
494   //
495   // Plot the cluster charge
496   //
497   if(!fTrack){
498     if(!track){
499       AliWarning("No Track defined.");
500       return 0x0;
501     }
502     fTrack = track;
503   }
504   TH1 *h = 0x0;
505   if(!(h = dynamic_cast<TH1F *>(fContainer->At(kClusterCharge)))){
506     AliWarning("No Histogram defined.");
507     return 0x0;
508   }
509   AliTRDseedV1 *tracklet = 0x0;
510   AliTRDcluster *c = 0x0;
511   for(Int_t itl = 0; itl < AliTRDgeometry::kNlayer; itl++){
512     if(!(tracklet = fTrack->GetTracklet(itl)) || !tracklet->IsOK())continue;
513     for(Int_t itime = 0; itime < kNTimeBins; itime++){
514       if(!(c = tracklet->GetClusters(itime))) continue;
515       h->Fill(c->GetQ());
516     }
517   }
518   return h;
519 }
520
521 //_______________________________________________________
522 TH1 *AliTRDcheckDetector::PlotChargeDeposit(const AliTRDtrackV1 *track){
523   //
524   // Plot the charge deposit per chamber
525   //
526   if(!fTrack){
527     if(!track){
528       AliWarning("No Track defined.");
529       return 0x0;
530     }
531     fTrack = track;
532   }
533   TH1 *h = 0x0;
534   if(!(h = dynamic_cast<TH1F *>(fContainer->At(kChargeDeposit)))){
535     AliWarning("No Histogram defined.");
536     return 0x0;
537   }
538   AliTRDseedV1 *tracklet = 0x0;
539   AliTRDcluster *c = 0x0, *c1 = 0x0;    // c1 for the Debug Stream
540   Double_t Qtot = 0;
541   for(Int_t itl = 0x0; itl < AliTRDgeometry::kNlayer; itl++){
542     if(!(tracklet = fTrack->GetTracklet(itl)) || !tracklet->IsOK()) continue;
543     Qtot = 0;
544     c1 = 0x0;
545     for(Int_t itime = 0; itime < kNTimeBins; itime++){
546       if(!(c = tracklet->GetClusters(itime))) continue;
547       if(!c1) c1 = c;
548       Qtot += TMath::Abs(c->GetQ());
549     }
550     h->Fill(Qtot);
551     if(fDebugLevel > 3){
552       Int_t crossing = tracklet->GetNChange();
553       Int_t detector = c1->GetDetector();
554       Float_t sector = static_cast<Int_t>(detector/AliTRDgeometry::kNdets);
555       Float_t theta = TMath::ATan(tracklet->GetZfit(1));
556       Float_t phi = TMath::ATan(tracklet->GetYfit(1));
557       Float_t momentum = 0.;
558       Int_t pdg = 0;
559       if(fMC){
560               if(fMC->GetTrackRef()) momentum = fMC->GetTrackRef()->P();
561         pdg = fMC->GetPDG();
562       }
563       (*fDebugStream) << "ChargeDeposit"
564         << "Detector="  << detector
565         << "Sector="    << sector
566         << "crossing="  << crossing
567         << "momentum="  << momentum
568         << "pdg="                               << pdg
569         << "theta="                     << theta
570         << "phi="                               << phi
571         << "QT="        << Qtot
572         << "\n";
573     }
574   }
575   return h;
576 }
577
578 //_______________________________________________________
579 TH1 *AliTRDcheckDetector::PlotTracksSector(const AliTRDtrackV1 *track){
580   //
581   // Plot the number of tracks per Sector
582   //
583   if(!fTrack){
584     if(!track){
585       AliWarning("No Track defined.");
586       return 0x0;
587     }
588     fTrack = track;
589   }
590   TH1 *h = 0x0;
591   if(!(h = dynamic_cast<TH1F *>(fContainer->At(kNTracksSectorHist)))){
592     AliWarning("No Histogram defined.");
593     return 0x0;
594   }
595   AliTRDseedV1 *tracklet = 0x0;
596   AliTRDcluster *c = 0x0;
597   Int_t sector = -1;
598   for(Int_t itl = 0; itl < AliTRDgeometry::kNlayer; itl++){
599     if(!(tracklet = fTrack->GetTracklet(itl)) || !tracklet->IsOK()) continue;
600     for(Int_t itime = 0; itime < kNTimeBins; itime++){
601       if(!(c = tracklet->GetClusters(itime))) continue;
602       sector = static_cast<Int_t>(c->GetDetector()/AliTRDgeometry::kNdets);
603     }
604     break;
605   }
606   h->Fill(sector);
607   return h;
608 }
609