2 /**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
17 /////////////////////////////////////////////////////////////////////////////////
21 // Task to run the calibration offline.
23 // R. Bailhache (rbailhache@ikf.uni-frankfurt.de, R.Bailhache@gsi.de)
25 //////////////////////////////////////////////////////////////////////////////////
28 #include "Riostream.h"
31 #include "TProfile2D.h"
39 #include "TObjArray.h"
43 #include "TGraphErrors.h"
45 #include "AliTRDrecoTask.h"
46 #include "AliAnalysisManager.h"
48 #include "AliESDInputHandler.h"
49 #include "AliTRDtrackV1.h"
50 #include "AliTRDseedV1.h"
51 #include "AliTRDcluster.h"
52 #include "info/AliTRDtrackInfo.h"
53 #include "AliTRDcalibDB.h"
55 #include "AliTRDCalibraFillHisto.h"
56 #include "AliTRDCalibraFit.h"
57 #include "AliTRDCalibraVdriftLinearFit.h"
58 #include "AliTRDCalibraMode.h"
59 #include "AliTRDCalibraVector.h"
60 #include "./Cal/AliTRDCalPad.h"
61 #include "./Cal/AliTRDCalDet.h"
65 #include "AliTRDcalibration.h"
68 ClassImp(AliTRDcalibration)
70 //________________________________________________________________________
71 AliTRDcalibration::AliTRDcalibration()
76 ,fTRDCalibraFillHisto(0)
78 ,fNbTRDTrackOffline(0)
79 ,fNbTRDTrackStandalone(0)
81 ,fNbTRDTrackletOffline(0)
82 ,fNbTRDTrackletStandalone(0)
84 ,fNbTimeBinOffline(0x0)
85 ,fNbTimeBinStandalone(0x0)
87 ,fNbClustersOffline(0)
88 ,fNbClustersStandalone(0)
102 ,fnormalizeNbOfCluster(kFALSE)
104 ,fOfflineTracks(kFALSE)
105 ,fStandaloneTracks(kFALSE)
106 ,fCompressPerDetector(kFALSE)
109 ,fPostProcess(kFALSE)
115 for(Int_t k = 0; k < 3; k++)
123 AliTRDcalibration::AliTRDcalibration(char* name)
124 :AliTRDrecoTask(name, "Calibration on tracks")
128 ,fTRDCalibraFillHisto(0)
130 ,fNbTRDTrackOffline(0)
131 ,fNbTRDTrackStandalone(0)
133 ,fNbTRDTrackletOffline(0)
134 ,fNbTRDTrackletStandalone(0)
136 ,fNbTimeBinOffline(0x0)
137 ,fNbTimeBinStandalone(0x0)
139 ,fNbClustersOffline(0)
140 ,fNbClustersStandalone(0)
149 ,fVdriftLinear(kTRUE)
154 ,fnormalizeNbOfCluster(kFALSE)
156 ,fOfflineTracks(kFALSE)
157 ,fStandaloneTracks(kFALSE)
158 ,fCompressPerDetector(kFALSE)
161 ,fPostProcess(kFALSE)
167 for(Int_t k = 0; k < 3; k++)
175 //________________________________________________________________________
176 AliTRDcalibration::~AliTRDcalibration()
178 // Default destructor
180 if(fNbTRDTrack) delete fNbTRDTrack;
181 if(fNbTRDTrackOffline) delete fNbTRDTrackOffline;
182 if(fNbTRDTrackStandalone) delete fNbTRDTrackStandalone;
183 if(fNbTRDTracklet) delete fNbTRDTracklet;
184 if(fNbTRDTrackletOffline) delete fNbTRDTrackletOffline;
185 if(fNbTRDTrackletStandalone) delete fNbTRDTrackletStandalone;
186 if(fNbTimeBin) delete fNbTimeBin;
187 if(fNbTimeBinOffline) delete fNbTimeBinOffline;
188 if(fNbTimeBinStandalone) delete fNbTimeBinStandalone;
189 if(fNbClusters) delete fNbClusters;
190 if(fNbClustersOffline) delete fNbClustersOffline;
191 if(fNbClustersStandalone) delete fNbClustersStandalone;
192 if(fPHSM) delete fPHSM;
193 if(fCHSM) delete fCHSM;
194 if(fPHSum) delete fPHSum;
195 if(fCHSum) delete fCHSum;
196 if(fDetSum) delete fDetSum;
197 if(fDetSumVector) delete fDetSumVector;
198 if(fGraph){fGraph->Delete(); delete fGraph;}
199 if(fArrayCalib){fArrayCalib->Delete(); delete fArrayCalib;}
202 //________________________________________________________________________
203 void AliTRDcalibration::UserCreateOutputObjects()
205 // Create output objects
207 // Number of time bins
209 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
210 fNbTimeBins = cal->GetNumberOfTimeBinsDCS();
211 if(fNbTimeBins <= 0){
212 AliWarning(Form("No of TimeBins from DB [%d] use default [30]", fNbTimeBins));
217 // instance calibration: what to calibrate
218 fTRDCalibraFillHisto = AliTRDCalibraFillHisto::Instance();
219 fTRDCalibraFillHisto->SetHisto2d(fHisto2d); // choose to use histograms
220 fTRDCalibraFillHisto->SetVector2d(fVector2d); // choose to use vectors
221 fTRDCalibraFillHisto->SetCH2dOn(); // choose to calibrate the gain
222 fTRDCalibraFillHisto->SetPH2dOn(); // choose to calibrate the drift velocity
223 fTRDCalibraFillHisto->SetPRF2dOn(); // choose to look at the PRF
224 fTRDCalibraFillHisto->SetLinearFitterOn(fVdriftLinear); // Other possibility vdrift VDRIFT
225 fTRDCalibraFillHisto->SetLinearFitterDebugOn(fVdriftLinear); // Other possibility vdrift
227 // segmentation (should be per default the max and add at the end)
228 for(Int_t k = 0; k < 3; k++){
229 if(((fNz[k] != 10) && (fNrphi[k] != 10)) && ((fNz[k] != 100) && (fNrphi[k] != 100))) {
230 fTRDCalibraFillHisto->SetNz(k,fNz[k]); // Mode calibration
231 fTRDCalibraFillHisto->SetNrphi(k,fNrphi[k]); // Mode calibration
234 if((fNz[k] == 100) && (fNrphi[k] == 100)) {
235 if(fVector2d) AliInfo("The mode all together is not supported by the vector method");
236 fTRDCalibraFillHisto->SetAllTogether(k);
238 if((fNz[k] == 10) && (fNrphi[k] == 10)) {
239 if(fVector2d) AliInfo("The mode per supermodule is not supported by the vector method");
240 fTRDCalibraFillHisto->SetPerSuperModule(k);
246 fTRDCalibraFillHisto->SetDebugLevel(DebugLevel()); //debug stuff
249 fTRDCalibraFillHisto->Init2Dhistos(fNbTimeBins); // initialise the histos
252 fTRDCalibraFillHisto->SetNumberClusters(flow); // At least flow clusters
253 fTRDCalibraFillHisto->SetNumberClustersf(fhigh); // The more fhigh clusters
254 fTRDCalibraFillHisto->SetFillWithZero(ffillZero); // Fill zeros
255 fTRDCalibraFillHisto->SetNormalizeNbOfCluster(fnormalizeNbOfCluster); // For iterations
257 // Add them to the container
258 fContainer = new TObjArray();
260 fContainer->Add(fTRDCalibraFillHisto->GetCH2d()); //TH2I
261 fContainer->Add(fTRDCalibraFillHisto->GetPH2d()); //TProfile2D
262 fContainer->Add(fTRDCalibraFillHisto->GetPRF2d()); //TProfile2D
264 if(fVdriftLinear) fContainer->Add(fTRDCalibraFillHisto->GetVdriftLinearFit()); // Other drift velocity
265 if(fVector2d) fContainer->Add(fTRDCalibraFillHisto->GetCalibraVector()); //calibra vector
269 // Init the debug histos
270 fNbTRDTrack = new TH1F("TRDTrack","TRDTrack",500,0,500);
271 fNbTRDTrack->Sumw2();
272 fNbTRDTrackOffline = new TH1F("TRDTrackOffline","TRDTrackOffline",500,0,500);
273 fNbTRDTrackOffline->Sumw2();
274 fNbTRDTrackStandalone = new TH1F("TRDTrackStandalone","TRDTrackStandalone",500,0,500);
275 fNbTRDTrackStandalone->Sumw2();
277 fNbTRDTracklet = new TH1F("TRDTracklet","TRDTracklet",540,0.,540.);
278 fNbTRDTracklet->Sumw2();
279 fNbTRDTrackletOffline = new TH1F("TRDTrackletOffline","TRDTrackletOffline",540,0.,540.);
280 fNbTRDTrackletOffline->Sumw2();
281 fNbTRDTrackletStandalone = new TH1F("TRDTrackletStandalone","TRDTrackletStandalone",540,0.,540.);
282 fNbTRDTrackletStandalone->Sumw2();
284 fNbTimeBin = new TH1F("TimeBin","TimeBin",35,0,35);
286 fNbTimeBinOffline = new TH1F("TimeBinOffline","TimeBinOffline",35,0,35);
287 fNbTimeBinOffline->Sumw2();
288 fNbTimeBinStandalone = new TH1F("TimeBinStandalone","TimeBinStandalone",35,0,35);
289 fNbTimeBinStandalone->Sumw2();
291 fNbClusters = new TH1F("NbClusters","",35,0,35);
292 fNbClusters->Sumw2();
293 fNbClustersOffline = new TH1F("NbClustersOffline","",35,0,35);
294 fNbClustersOffline->Sumw2();
295 fNbClustersStandalone = new TH1F("NbClustersStandalone","",35,0,35);
296 fNbClustersStandalone->Sumw2();
298 fPHSM = new TProfile2D("PH2dSM","Nz10Nrphi10"
299 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
301 fPHSM->SetYTitle("Det/pad groups");
302 fPHSM->SetXTitle("time [#mus]");
303 fPHSM->SetZTitle("<PH> [a.u.]");
306 fCHSM = new TH2I("CH2dSM","Nz10Nrphi10",50,0,300,18,0,18);
307 fCHSM->SetYTitle("Det/pad groups");
308 fCHSM->SetXTitle("charge deposit [a.u]");
309 fCHSM->SetZTitle("counts");
313 fPHSum = new TProfile2D("PH2dSum","Nz100Nrphi100"
314 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
316 fPHSum->SetYTitle("Det/pad groups");
317 fPHSum->SetXTitle("time [#mus]");
318 fPHSum->SetZTitle("<PH> [a.u.]");
321 fCHSum = new TH2I("CH2dSum","Nz100Nrphi100",50,0,300,1,0,1);
322 fCHSum->SetYTitle("Det/pad groups");
323 fCHSum->SetXTitle("charge deposit [a.u]");
324 fCHSum->SetZTitle("counts");
329 fContainer->Add(fNbTRDTrack);
330 fContainer->Add(fNbTRDTrackOffline);
331 fContainer->Add(fNbTRDTrackStandalone);
332 fContainer->Add(fNbTRDTracklet);
333 fContainer->Add(fNbTRDTrackletOffline);
334 fContainer->Add(fNbTRDTrackletStandalone);
335 fContainer->Add(fNbTimeBin);
336 fContainer->Add(fNbTimeBinOffline);
337 fContainer->Add(fNbTimeBinStandalone);
338 fContainer->Add(fNbClusters);
339 fContainer->Add(fNbClustersOffline);
340 fContainer->Add(fNbClustersStandalone);
341 fContainer->Add(fPHSM);
342 fContainer->Add(fCHSM);
343 fContainer->Add(fPHSum);
344 fContainer->Add(fCHSum);
350 //________________________________________________________________________
351 void AliTRDcalibration::UserExec(Option_t *)
354 // Execute function where the reference data are filled
360 Int_t nbTrdTracks = 0;
362 Int_t nbTrdTracksStandalone = 0;
364 Int_t nbTrdTracksOffline = 0;
368 // Loop on track in the event
370 //printf("Total of %d\n",fTracks->GetEntriesFast());
371 for(Int_t itrk=0; itrk < fTracks->GetEntriesFast(); itrk++){
373 //printf("itrk %d\n",itrk);
375 fTrackInfo = (AliTRDtrackInfo*)fTracks->UncheckedAt(itrk);
376 ftrdTrack = fTrackInfo->GetTrack();
377 if(!ftrdTrack) continue;
381 fTRDCalibraFillHisto->UpdateHistogramsV1(ftrdTrack);
385 Bool_t standalonetracklet = kFALSE;
386 const AliTRDseedV1 *tracklet = 0x0;
388 // Loop on tracklet in the event
390 for(Int_t itr = 0; itr < 6; itr++){
391 //printf("itr %d\n",itr);
392 if(!(tracklet = ftrdTrack->GetTracklet(itr))) continue;
393 if(!tracklet->IsOK()) continue;
395 if(tracklet->IsStandAlone()) standalonetracklet = kTRUE;
396 Int_t nbclusters = 0;
398 Double_t phtb[AliTRDseedV1::kNtb];
399 memset(phtb, 0, AliTRDseedV1::kNtb*sizeof(Double_t));
403 Float_t normalisation = 6.67;
407 // Check no shared clusters
408 for(int icc=AliTRDseedV1::kNtb; icc<AliTRDseedV1::kNclusters; icc++){
409 if((fcl = tracklet->GetClusters(icc))) crossrow = 1;
412 for(int ic=0; ic<AliTRDseedV1::kNtb; ic++){
413 if(!(fcl = tracklet->GetClusters(ic))) continue;
415 Int_t time = fcl->GetPadTime();
416 Float_t ch = tracklet->GetdQdl(ic);
417 Float_t qcl = TMath::Abs(fcl->GetQ());
418 detector = fcl->GetDetector();
419 if((time>-1) && (time<fNbTimeBins)) phtb[time]=qcl;
420 sum += ch/normalisation;
421 fNbTimeBin->Fill(time);
422 if(tracklet->IsStandAlone()) fNbTimeBinStandalone->Fill(time);
423 else fNbTimeBinOffline->Fill(time);
425 sector = AliTRDgeometry::GetSector(detector);
427 fNbTRDTracklet->Fill(detector);
428 if(tracklet->IsStandAlone()) fNbTRDTrackletStandalone->Fill(detector);
429 else fNbTRDTrackletOffline->Fill(detector);
431 fNbClusters->Fill(nbclusters);
432 if(tracklet->IsStandAlone()) fNbClustersStandalone->Fill(nbclusters);
433 else fNbClustersOffline->Fill(nbclusters);
435 if((nbclusters > flow) && (nbclusters < fhigh)){
436 fCHSM->Fill(sum/20.0,sector+0.5);
437 fCHSum->Fill(sum/20.0,0.5);
438 for(int ic=0; ic<fNbTimeBins; ic++){
440 fPHSum->Fill((Double_t)(ic/10.0),0.5,(Double_t)phtb[ic]);
441 fPHSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[ic]);
445 fPHSum->Fill((Double_t)(ic/10.0),0.0,(Double_t)phtb[ic]);
446 fPHSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[ic]);
453 if(standalonetracklet) nbTrdTracksStandalone++;
454 else nbTrdTracksOffline++;
463 fNbTRDTrack->Fill(nbTrdTracks);
464 fNbTRDTrackStandalone->Fill(nbTrdTracksStandalone);
465 fNbTRDTrackOffline->Fill(nbTrdTracksOffline);
469 //printf("Nbof tracks %d\n",nbTrdTracks);
472 PostData(1, fContainer);
474 //printf("post container\n");
477 //________________________________________________________________________
478 void AliTRDcalibration::Terminate(Option_t *)
480 // Draw result to the screen
481 // Called once at the end of the query
483 //printf("terminate\n");
485 if(fTRDCalibraFillHisto) fTRDCalibraFillHisto->DestroyDebugStreamer();
488 //________________________________________________________
489 Bool_t AliTRDcalibration::GetRefFigure(Int_t ifig)
492 // Draw filled histos
495 gStyle->SetPalette(1);
496 gStyle->SetOptStat(1111);
497 gStyle->SetPadBorderMode(0);
498 gStyle->SetCanvasColor(10);
499 gStyle->SetPadLeftMargin(0.13);
500 gStyle->SetPadRightMargin(0.13);
502 if(!fContainer) return kFALSE;
506 TCanvas *c0 = new TCanvas("c0","c0",10,10,510,510);
507 TLegend *legNbTrack = new TLegend(.7, .7, .98, .98);
508 legNbTrack->SetBorderSize(1);
512 if(!(h = (TH1F *)fContainer->FindObject("TRDTrack"))) break;
513 if(!(ho = (TH1F *)fContainer->FindObject("TRDTrackOffline"))) break;
514 if(!(hs = (TH1F *)fContainer->FindObject("TRDTrackStandalone"))) break;
522 legNbTrack->AddEntry(h, "all", "p");
523 legNbTrack->AddEntry(ho, "offline", "p");
524 legNbTrack->AddEntry(hs, "standalone", "p");
525 legNbTrack->Draw("same");
529 TLegend *legNbTracklet = new TLegend(.7, .7, .98, .98);
530 legNbTracklet->SetBorderSize(1);
534 if(!(h = (TH1F *)fContainer->FindObject("TRDTracklet"))) break;
535 if(!(ho = (TH1F *)fContainer->FindObject("TRDTrackletOffline"))) break;
536 if(!(hs = (TH1F *)fContainer->FindObject("TRDTrackletStandalone"))) break;
540 legNbTracklet->AddEntry(h, "all", "p");
541 legNbTracklet->AddEntry(ho, "offline", "p");
542 legNbTracklet->AddEntry(hs, "standalone", "p");
543 legNbTracklet->Draw("same");
550 TLegend *legNbTimeBin = new TLegend(.7, .7, .98, .98);
551 legNbTimeBin->SetBorderSize(1);
555 if(!(h = (TH1F *)fContainer->FindObject("TimeBin"))) break;
556 if(!(ho = (TH1F *)fContainer->FindObject("TimeBinOffline"))) break;
557 if(!(hs = (TH1F *)fContainer->FindObject("TimeBinStandalone"))) break;
561 legNbTimeBin->AddEntry(h, "all", "p");
562 legNbTimeBin->AddEntry(ho, "offline", "p");
563 legNbTimeBin->AddEntry(hs, "standalone", "p");
564 legNbTimeBin->Draw("same");
571 TLegend *legNbClusters = new TLegend(.7, .7, .98, .98);
572 legNbClusters->SetBorderSize(1);
576 if(!(h = (TH1F *)fContainer->FindObject("NbClusters"))) break;
577 if(!(ho = (TH1F *)fContainer->FindObject("NbClustersOffline"))) break;
578 if(!(hs = (TH1F *)fContainer->FindObject("NbClustersStandalone"))) break;
582 legNbClusters->AddEntry(h, "all", "p");
583 legNbClusters->AddEntry(ho, "offline", "p");
584 legNbClusters->AddEntry(hs, "standalone", "p");
585 legNbClusters->Draw("same");
593 if(!(h = (TProfile2D *)fContainer->FindObject("PH2dSum"))) break;
594 TH1D *projh = h->ProjectionX("projh",1,1,"e");
602 if(!(h = (TH2I *)fContainer->FindObject("CH2dSum"))) break;
603 TH1D *projh = h->ProjectionX("projhh",1,1,"e");
611 AliInfo("Histo was not filled!");
615 if(!(h = (TProfile2D *)fContainer->FindObject("PH2d"))) break;
621 AliInfo("Histo was not filled!");
625 if(!(h = (TH2I *)fContainer->FindObject("CH2d"))) break;
631 AliInfo("Histo was not filled!");
635 if(!(h = (TProfile2D *)fContainer->FindObject("PRF2d"))) break;
641 AliInfo("vector was not filled!");
644 AliTRDCalibraVector *v = 0x0;
645 TGraphErrors *vdet = 0x0;
646 if(!(v = (AliTRDCalibraVector *)fContainer->FindObject("AliTRDCalibraVector"))) break;
647 Int_t detectormax = -1;
649 if(!v->FindTheMaxEntries(1,detectormax,groupmax)) break;
650 if(!(vdet = v->ConvertVectorPHTGraphErrors((Int_t)detectormax,groupmax,"plotPH2dVector"))) break;
651 Int_t nbeentries = 0;
652 TH1F *ko = v->CorrectTheError(vdet,nbeentries);
654 AliInfo(Form("There are %d entries in the detector %d and group %d",nbeentries,detectormax,groupmax));
659 AliInfo("vector was not filled!");
662 AliTRDCalibraVector *v = 0x0;
664 if(!(v = (AliTRDCalibraVector *)fContainer->FindObject("AliTRDCalibraVector"))) break;
665 Int_t detectormax = -1;
667 if(!v->FindTheMaxEntries(0,detectormax,groupmax)) break;
668 if(!(vdet = v->ConvertVectorCHHisto((Int_t)detectormax,groupmax,"plotCH2dVector"))) break;
670 AliInfo(Form("The detectormax and groupmax are %d and %d",detectormax,groupmax));
675 AliInfo("vector was not filled!");
678 AliTRDCalibraVector *v = 0x0;
679 TGraphErrors *vdet = 0x0;
680 if(!(v = (AliTRDCalibraVector *)fContainer->FindObject("AliTRDCalibraVector"))) break;
681 Int_t detectormax = -1;
683 Int_t nbeentries = 0;
684 if(!v->FindTheMaxEntries(2,detectormax,groupmax)) break;
685 if(!(vdet = v->ConvertVectorPRFTGraphErrors((Int_t)detectormax,groupmax,"plotPRF2dVector"))) break;
686 TH1F *ko = v->CorrectTheError(vdet,nbeentries);
688 AliInfo(Form("The detectormax and groupmax are %d and %d",detectormax,groupmax));
693 AliInfo("vdrift linear was not filled!");
696 AliTRDCalibraVdriftLinearFit *h = 0x0;
697 TH2S *hdetector = 0x0;
698 if(!(h = (AliTRDCalibraVdriftLinearFit *)fContainer->FindObject("AliTRDCalibraVdriftLinearFit"))) break;
699 Double_t entries[540];
700 for(Int_t k = 0; k < 540; k++){
703 if(!(hdetector = (TH2S *)h->GetLinearFitterHisto(k,kFALSE))) continue;
704 entries[k] = hdetector->GetEntries();
706 Double_t max = -10.0;
707 Double_t detectormax = -1;
708 for(Int_t k = 0; k < 540; k++){
709 if(entries[k] > max) {
715 if((TMath::Abs(max) <= 0.001) || (detectormax <0.0) || (detectormax >=540.0)) break;
716 if(!(hdetector = (TH2S *)h->GetLinearFitterHisto((Int_t)detectormax,kFALSE))) break;
717 AliInfo(Form("The detector with the maximum of entries is %f",detectormax));
723 if(!PostProcess()) break;
725 TGraph *fgain = (TGraph *) fGraph->At(0);
730 case kVdriftT0Factor:{
732 if(!PostProcess()) break;
734 TCanvas *c = new TCanvas("c","c",10,10,510,510);
736 TGraph *fvd = (TGraph *) fGraph->At(1);
741 TGraph *ft0 = (TGraph *) fGraph->At(2);
748 case kVdriftLorentzAngleFactor:{
750 AliInfo("vdrift linear was not filled!");
754 if(!PostProcess()) break;
756 TCanvas *c = new TCanvas("c","c",10,10,510,510);
758 TGraph *fvdl = (TGraph *) fGraph->At(3);
763 TGraph *flal = (TGraph *) fGraph->At(4);
772 if(!PostProcess()) break;
774 TGraph *fprf = (TGraph *) fGraph->At(5);
784 //________________________________________________________________________
785 Bool_t AliTRDcalibration::PostProcess()
788 // Fit the filled histos
789 // Put the calibration object in fArrayCalib
790 // 0 and 1 AliTRDCalDet and AliTRDCalPad gain
791 // 2 and 3 AliTRDCalDet and AliTRDCalPad vdrift PH
792 // 4 and 5 AliTRDCalDet and AliTRDCalPad timeoffset PH
793 // 6 AliTRDCalPad PRF
794 // 7 and 8 AliTRDCalDet and AliTRDCalPad vdrift second
795 // 9 and 10 AliTRDCalDet and AliTRDCalPad lorentz angle second
799 fArrayCalib = new TObjArray(11);
800 fArrayCalib->SetOwner();
808 fGraph = new TObjArray(6);
816 Bool_t storage[3] = {kFALSE,kFALSE,kFALSE};
818 // Objects for fitting
819 AliTRDCalibraFit *calibra = AliTRDCalibraFit::Instance();
820 calibra->SetDebugLevel(2); // 0 rien, 1 fitvoir, 2 debug files, 3 one detector
824 Printf("ERROR: list not available");
828 if(fHisto2d && fVector2d) AliInfo("We will only look at histos. Set fHisto2d off if you don't want");
829 AliTRDCalibraVector *calibraVector = 0x0;
830 if(fVector2d) calibraVector = (AliTRDCalibraVector *) fContainer->FindObject("CalibraVector");
834 Bool_t pass = kFALSE;
835 AliTRDCalibraVector *vvect = 0x0;
837 TH2I *histogain = (TH2I *) fContainer->FindObject("CH2d");
839 histogain->SetDirectory(0);
840 calibra->SetMinEntries(20);
841 if(fCompressPerDetector){
842 if(AddStatsPerDetector(histogain)) pass = calibra->AnalyseCH(fCHSum);
844 else pass = calibra->AnalyseCH(histogain);
848 if(fVector2d && calibraVector) {
849 calibra->SetMinEntries(20);
850 if(fCompressPerDetector){
851 if(!(vvect = calibraVector->AddStatsPerDetectorCH())) return kFALSE;
852 pass = calibra->AnalyseCH(vvect);
854 else pass = calibra->AnalyseCH(calibraVector);
860 Int_t nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(0))
861 + 6* 18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(0));
862 Int_t nbfit = calibra->GetNumberFit(); //Number of fits
863 Int_t nbE = calibra->GetNumberEnt(); //Number of detector mit entries
866 (nbfit >= 0.001*nbE))
868 // create the cal objects
869 calibra->PutMeanValueOtherVectorFit(1,kTRUE);
870 TObjArray object = calibra->GetVectorFit();
871 AliTRDCalDet *objgaindet = calibra->CreateDetObjectGain(&object);
872 TObject *objgainpad = calibra->CreatePadObjectGain();
874 fArrayCalib->AddAt(objgaindet,0);
875 fArrayCalib->AddAt(objgainpad,1);
879 if(FillGraphIndex(&object,graph)){
880 fGraph->AddAt(graph,0);
882 }//if(enough statistics?)
883 calibra->ResetVectorFit();
888 // VDRIFT average pulse height
892 TProfile2D *histodriftvelocity = (TProfile2D *) fContainer->FindObject("PH2d");
893 if(histodriftvelocity) {
894 histodriftvelocity->SetDirectory(0);
895 calibra->SetMinEntries(20*20);
896 if(fCompressPerDetector){
897 if(AddStatsPerDetector(histodriftvelocity,1)) {
898 pass = calibra->AnalysePH(fDetSumVector);
901 else pass = calibra->AnalysePH(histodriftvelocity);
905 if(fVector2d && calibraVector) {
906 calibra->SetMinEntries(20*20);
907 if(fCompressPerDetector){
908 if(!(vvect = calibraVector->AddStatsPerDetectorPH())) return kFALSE;
909 pass = calibra->AnalysePH(vvect);
911 else pass = calibra->AnalysePH(calibraVector);
916 Int_t nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(1))
917 + 6* 18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(1));
918 Int_t nbfit = calibra->GetNumberFit();
919 Int_t nbE = calibra->GetNumberEnt();
922 (nbfit >= 0.001*nbE))
924 // create the cal objects
925 calibra->PutMeanValueOtherVectorFit(1,kTRUE);
926 calibra->PutMeanValueOtherVectorFit2(1,kTRUE);
927 TObjArray object = calibra->GetVectorFit();
928 AliTRDCalDet *objdriftvelocitydet = calibra->CreateDetObjectVdrift(&object,kTRUE);
929 TObject *objdriftvelocitypad = calibra->CreatePadObjectVdrift();
930 TObjArray objectt = calibra->GetVectorFit2();
931 AliTRDCalDet *objtime0det = calibra->CreateDetObjectT0(&object,kTRUE);
932 TObject *objtime0pad = calibra->CreatePadObjectT0();
934 fArrayCalib->AddAt(objdriftvelocitydet,2);
935 fArrayCalib->AddAt(objdriftvelocitypad,3);
937 fArrayCalib->AddAt(objtime0det,4);
938 fArrayCalib->AddAt(objtime0pad,5);
941 if(FillGraphIndex(&object,graph)){
942 fGraph->AddAt(graph,1);
944 TGraph *graphh = 0x0;
945 if(FillGraphIndex(&objectt,graphh)){
946 fGraph->AddAt(graphh,2);
948 }//if(enough statistics)
949 calibra->ResetVectorFit();
958 TProfile2D *histoprf = (TProfile2D *) fContainer->FindObject("PRF2d");
960 histoprf->SetDirectory(0);
961 calibra->SetMinEntries(600);
962 if(fCompressPerDetector){
963 if(AddStatsPerDetector(histoprf,2)) pass = calibra->AnalysePRFMarianFit(fDetSumVector);
965 else pass = calibra->AnalysePRFMarianFit(histoprf);
969 if(fVector2d && calibraVector) {
970 calibra->SetMinEntries(600);
971 if(fCompressPerDetector){
972 if(!(vvect =calibraVector->AddStatsPerDetectorPRF())) return kFALSE;
973 pass = calibra->AnalysePRFMarianFit(vvect);
975 else pass = calibra->AnalysePRFMarianFit(calibraVector);
980 Int_t nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(2))
981 + 6* 18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(2));
982 Int_t nbfit = calibra->GetNumberFit();
983 Int_t nbE = calibra->GetNumberEnt();
986 (nbfit >= 0.001*nbE)) {
987 TObjArray object = calibra->GetVectorFit();
988 TObject *objPRFpad = calibra->CreatePadObjectPRF(&object);
990 fArrayCalib->AddAt(objPRFpad,6);
993 if(FillGraphIndex(&object,graph)){
994 fGraph->AddAt(graph,5);
997 calibra->ResetVectorFit();
1002 // VDRIFT linear fit
1004 AliTRDCalibraVdriftLinearFit *vlinearfit = (AliTRDCalibraVdriftLinearFit *) fContainer->FindObject("LinearVdriftFit");
1006 calibra->SetMinEntries(20*20);
1007 if(calibra->AnalyseLinearFitters(vlinearfit)) {
1009 Int_t nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(2))
1010 + 6* 18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(2));
1011 Int_t nbfit = calibra->GetNumberFit();
1012 Int_t nbE = calibra->GetNumberEnt();
1013 // enough statistics
1015 (nbfit >= 0.001*nbE))
1017 // create the cal objects
1018 calibra->PutMeanValueOtherVectorFit(1,kTRUE);
1019 calibra->PutMeanValueOtherVectorFit2(1,kTRUE);
1020 TObjArray object = calibra->GetVectorFit();
1021 AliTRDCalDet *objdriftvelocitydet = calibra->CreateDetObjectVdrift(&object,kTRUE);
1022 TObject *objdriftvelocitypad = calibra->CreatePadObjectVdrift();
1023 TObjArray objectt = calibra->GetVectorFit2();
1024 AliTRDCalDet *objtime0det = calibra->CreateDetObjectT0(&object,kTRUE);
1025 TObject *objtime0pad = calibra->CreatePadObjectT0();
1027 fArrayCalib->AddAt(objdriftvelocitydet,7);
1028 fArrayCalib->AddAt(objdriftvelocitypad,8);
1030 fArrayCalib->AddAt(objtime0det,9);
1031 fArrayCalib->AddAt(objtime0pad,10);
1033 TGraph *graph = 0x0;
1034 if(FillGraphIndex(&object,graph)){
1035 fGraph->AddAt(graph,3);
1037 TGraph *graphh = 0x0;
1038 if(FillGraphIndex(&objectt,graphh)){
1039 fGraph->AddAt(graphh,4);
1041 }//if(enough statistics)
1043 calibra->ResetVectorFit();
1047 fPostProcess = kTRUE;
1053 //________________________________________________________________________
1054 Bool_t AliTRDcalibration::FillGraphIndex(const TObjArray *vectora,TGraph *graph) const
1057 // Fill one value (the first one) per detector
1060 Int_t loop = (Int_t) vectora->GetEntriesFast();
1062 AliInfo("The Vector Fit is not complete!");
1068 for (Int_t k = 0; k < loop; k++) {
1069 if(!vectora->At(k)){
1074 x[k] = ((AliTRDCalibraFit::AliTRDFitInfo *) vectora->At(k))->GetDetector();
1075 y[k] = ((Float_t *)((AliTRDCalibraFit::AliTRDFitInfo *) vectora->At(k))->GetCoef())[0];
1078 if(!graph) graph = new TGraph(540,&x[0],&y[0]);
1081 new(graph) TGraph(540,&x[0],&y[0]);
1087 //________________________________________________________________________
1088 Bool_t AliTRDcalibration::AddStatsPerDetector(const TH2I *ch)
1091 // Add statistic per detector
1094 AliTRDCalibraMode calibMode = AliTRDCalibraMode();
1095 const char *name = ch->GetTitle();
1096 if(!SetNzFromTObject(name,0,&calibMode)) return 0x0;
1097 if(!SetNrphiFromTObject(name,0,&calibMode)) return 0x0;
1098 if(((calibMode.GetNz(0) == 100) && (calibMode.GetNrphi(0) == 100)) || ((calibMode.GetNz(0) == 10) && (calibMode.GetNrphi(0) == 10))) return kFALSE;
1100 Int_t nybins = ch->GetNbinsY();// groups number
1101 Int_t nxbins = ch->GetNbinsX();// number of bins X
1102 TAxis *xaxis = ch->GetXaxis();
1103 Double_t lowedge = xaxis->GetBinLowEdge(1);
1104 Double_t upedge = xaxis->GetBinUpEdge(nxbins);
1106 // number per chamber 2
1107 calibMode.ModePadCalibration(2,0);
1108 calibMode.ModePadFragmentation(0,2,0,0);
1109 calibMode.SetDetChamb2(0);
1110 Int_t perChamber2 = (Int_t) calibMode.GetDetChamb2(0);
1112 // number per other chamber
1113 calibMode.ModePadCalibration(0,0);
1114 calibMode.ModePadFragmentation(0,0,0,0);
1115 calibMode.SetDetChamb0(0);
1116 Int_t perChamber0 = (Int_t) calibMode.GetDetChamb0(0);
1118 if(nybins != (6*18*perChamber2+6*4*18*perChamber0)) return kFALSE;
1121 TString nname((const char *)ch->GetName());
1122 nname += "PerDetector";
1123 TString title("Nz");
1127 if(!fCHSum) fCHSum = new TH2I((const char *)nname,(const char *)title
1128 ,nxbins,lowedge,upedge,540,0,540);
1131 new(fCHSum) TH2I((const Char_t *) nname,(const char *)title
1132 ,nxbins,lowedge,upedge,540,0,540);
1134 fCHSum->SetYTitle("Detector number");
1135 fCHSum->SetXTitle("charge deposit [a.u]");
1136 fCHSum->SetZTitle("counts");
1137 fCHSum->SetStats(0);
1142 for(Int_t det = 0; det < 540; det++){
1144 Int_t numberofgroup = 0;
1145 if(AliTRDgeometry::GetStack(det) == 2) numberofgroup = perChamber2;
1146 else numberofgroup = perChamber0;
1147 TH1I *projch = (TH1I *) ch->ProjectionX("projch",counter+1,counter+numberofgroup,(Option_t *)"e");
1148 projch->SetDirectory(0);
1150 for(Int_t nx = 0; nx <= nxbins; nx++) {
1151 fCHSum->SetBinContent(nx,det+1,projch->GetBinContent(nx));
1152 fCHSum->SetBinError(nx,det+1,projch->GetBinError(nx));
1155 counter += numberofgroup;
1164 //_____________________________________________________________________________________________________________________
1165 Bool_t AliTRDcalibration::AddStatsPerDetector(const TProfile2D *ph,Int_t i)
1168 // Add statistic per detector
1171 AliTRDCalibraMode calibMode = AliTRDCalibraMode();
1172 const char *name = ph->GetTitle();
1173 //printf("name %s\n",name);
1174 if(!SetNzFromTObject(name,0,&calibMode)) return kFALSE;
1175 if(!SetNrphiFromTObject(name,0,&calibMode)) return kFALSE;
1176 if(((calibMode.GetNz(0) == 100) && (calibMode.GetNrphi(0) == 100)) || ((calibMode.GetNz(0) == 10) && (calibMode.GetNrphi(0) == 10))) return kFALSE;
1177 //printf("Found mode Mz %d, Nrphi %d\n",calibMode.GetNz(0),calibMode.GetNrphi(0));
1180 Int_t nybins = ph->GetNbinsY();// groups number
1181 Int_t nxbins = ph->GetNbinsX();// number of bins X
1182 TAxis *xaxis = ph->GetXaxis();
1183 Double_t lowedge = xaxis->GetBinLowEdge(1);
1184 Double_t upedge = xaxis->GetBinUpEdge(nxbins);
1186 // number per chamber 2
1187 calibMode.ModePadCalibration(2,0);
1188 calibMode.ModePadFragmentation(0,2,0,0);
1189 calibMode.SetDetChamb2(0);
1190 Int_t perChamber2 = (Int_t) calibMode.GetDetChamb2(0);
1192 // number per other chamber
1193 calibMode.ModePadCalibration(0,0);
1194 calibMode.ModePadFragmentation(0,0,0,0);
1195 calibMode.SetDetChamb0(0);
1196 Int_t perChamber0 = (Int_t) calibMode.GetDetChamb0(0);
1198 if(nybins != (6*18*perChamber2+6*4*18*perChamber0)) return kFALSE;
1201 TString nbname((const char *)ph->GetName());
1202 nbname += "PerDetectorVector";
1203 if(!fDetSumVector) fDetSumVector = new AliTRDCalibraVector();
1205 fDetSumVector->~AliTRDCalibraVector();
1206 new(fDetSumVector) AliTRDCalibraVector();
1209 fDetSumVector->SetTimeMax(nxbins);
1212 fDetSumVector->SetNumberBinPRF(nxbins);
1213 fDetSumVector->SetPRFRange(TMath::Abs(lowedge));
1215 fDetSumVector->SetDetCha0(i,1);
1216 fDetSumVector->SetDetCha2(i,1);
1217 fDetSumVector->SetNzNrphi(i,0,0);
1219 Int_t nbg = GetNumberOfGroupsPRF((const char *)name);
1220 fDetSumVector->SetNbGroupPRF(nbg);
1224 TString nname((const char *)ph->GetName());
1225 nname += "PerDetector";
1226 TString title("Nz");
1230 if(!fDetSum) fDetSum = new TH2D((const char *)nname,(const Char_t *) title
1231 ,nxbins,lowedge,upedge,540,0,540);
1234 new(fDetSum) TH2D((const Char_t *) nname,(const Char_t *) title
1235 ,nxbins,lowedge,upedge,540,0,540);
1237 fDetSum->SetYTitle("Detector number");
1238 fDetSum->SetXTitle(xaxis->GetTitle());
1239 fDetSum->SetStats(0);
1243 for(Int_t det = 0; det < 540; det++){
1245 Int_t numberofgroup = 0;
1246 if(AliTRDgeometry::GetStack(det) == 2) numberofgroup = perChamber2;
1247 else numberofgroup = perChamber0;
1249 for(Int_t nx = 1; nx <= nxbins; nx++) {
1251 Double_t entries = 0.0;
1252 Double_t sumw2 = 0.0;
1253 Double_t sumw = 0.0;
1255 for(Int_t k = counter+1; k <= (counter+numberofgroup); k++){
1256 Int_t binnumber = ph->GetBin(nx,k);
1257 entries += ph->GetBinEntries(binnumber);
1258 sumw2 += (ph->GetBinError(binnumber)*ph->GetBinError(binnumber)+ph->GetBinContent(binnumber)*ph->GetBinContent(binnumber))*ph->GetBinEntries(binnumber);
1259 sumw += ph->GetBinContent(binnumber)*ph->GetBinEntries(binnumber);
1262 Double_t mean = 0.0;
1263 if(entries > 0.0) mean = sumw/entries;
1264 Double_t squaremean = 0.0;
1265 if(entries > 0.0) squaremean = sumw2/entries;
1266 Double_t errorf = squaremean - mean*mean;
1267 Double_t error = 0.0;
1268 if(entries > 0.0) error = TMath::Sqrt(TMath::Abs(errorf)/entries);
1270 fDetSum->SetBinContent(nx,det+1,mean);
1271 fDetSum->SetBinError(nx,det+1,error);
1273 if(i==1) fDetSumVector->FillVectorPH(det,0,nx-1,(Int_t)entries,(Float_t)mean,(Float_t)squaremean);
1274 if(i==2) fDetSumVector->FillVectorPRF(det,0,nx-1,(Int_t)entries,(Float_t)mean,(Float_t)squaremean);
1278 counter += numberofgroup;
1286 //_____________________________________________________________________________
1287 Bool_t AliTRDcalibration::SetNrphiFromTObject(const char *name, Int_t i, AliTRDCalibraMode *calibMode) const
1290 // Set the granularity from object
1293 const Char_t *patternrphi0 = "Nrphi0";
1294 const Char_t *patternrphi1 = "Nrphi1";
1295 const Char_t *patternrphi2 = "Nrphi2";
1296 const Char_t *patternrphi3 = "Nrphi3";
1297 const Char_t *patternrphi4 = "Nrphi4";
1298 const Char_t *patternrphi5 = "Nrphi5";
1299 const Char_t *patternrphi6 = "Nrphi6";
1302 const Char_t *patternrphi10 = "Nrphi10";
1303 const Char_t *patternrphi100 = "Nrphi100";
1304 const Char_t *patternz10 = "Nz10";
1305 const Char_t *patternz100 = "Nz100";
1308 if ((strstr(name,patternrphi100)) && (strstr(name,patternz100))) {
1309 calibMode->SetAllTogether(i);
1312 if ((strstr(name,patternrphi10)) && (strstr(name,patternz10))) {
1313 calibMode->SetPerSuperModule(i);
1317 if (strstr(name,patternrphi0)) {
1318 calibMode->SetNrphi(i ,0);
1321 if (strstr(name,patternrphi1)) {
1322 calibMode->SetNrphi(i, 1);
1325 if (strstr(name,patternrphi2)) {
1326 calibMode->SetNrphi(i, 2);
1329 if (strstr(name,patternrphi3)) {
1330 calibMode->SetNrphi(i, 3);
1333 if (strstr(name,patternrphi4)) {
1334 calibMode->SetNrphi(i, 4);
1337 if (strstr(name,patternrphi5)) {
1338 calibMode->SetNrphi(i, 5);
1341 if (strstr(name,patternrphi6)) {
1342 calibMode->SetNrphi(i, 6);
1346 calibMode->SetNrphi(i ,0);
1350 //_____________________________________________________________________________
1351 Bool_t AliTRDcalibration::SetNzFromTObject(const char *name, Int_t i, AliTRDCalibraMode *calibMode) const
1354 // Set fNz[i] of the AliTRDCalibraFit::Instance()
1355 // corresponding to the given TObject
1359 const Char_t *patternz0 = "Nz0";
1360 const Char_t *patternz1 = "Nz1";
1361 const Char_t *patternz2 = "Nz2";
1362 const Char_t *patternz3 = "Nz3";
1363 const Char_t *patternz4 = "Nz4";
1365 const Char_t *patternrphi10 = "Nrphi10";
1366 const Char_t *patternrphi100 = "Nrphi100";
1367 const Char_t *patternz10 = "Nz10";
1368 const Char_t *patternz100 = "Nz100";
1370 if ((strstr(name,patternrphi100)) && (strstr(name,patternz100))) {
1371 calibMode->SetAllTogether(i);
1374 if ((strstr(name,patternrphi10)) && (strstr(name,patternz10))) {
1375 calibMode->SetPerSuperModule(i);
1378 if (strstr(name,patternz0)) {
1379 calibMode->SetNz(i, 0);
1382 if (strstr(name,patternz1)) {
1383 calibMode->SetNz(i ,1);
1386 if (strstr(name,patternz2)) {
1387 calibMode->SetNz(i ,2);
1390 if (strstr(name,patternz3)) {
1391 calibMode->SetNz(i ,3);
1394 if (strstr(name,patternz4)) {
1395 calibMode->SetNz(i ,4);
1399 calibMode->SetNz(i ,0);
1402 //____________________________________________________________________________________________________
1403 Int_t AliTRDcalibration::GetNumberOfGroupsPRF(const char* nametitle) const
1406 // Get numberofgroupsprf
1410 const Char_t *pattern0 = "Ngp0";
1411 const Char_t *pattern1 = "Ngp1";
1412 const Char_t *pattern2 = "Ngp2";
1413 const Char_t *pattern3 = "Ngp3";
1414 const Char_t *pattern4 = "Ngp4";
1415 const Char_t *pattern5 = "Ngp5";
1416 const Char_t *pattern6 = "Ngp6";
1419 if (strstr(nametitle,pattern0)) {
1422 if (strstr(nametitle,pattern1)) {
1425 if (strstr(nametitle,pattern2)) {
1428 if (strstr(nametitle,pattern3)) {
1431 if (strstr(nametitle,pattern4)) {
1434 if (strstr(nametitle,pattern5)) {
1437 if (strstr(nametitle,pattern6)){