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 // Offline TRD calibration task
24 // R. Bailhache (R.Bailhache@gsi.de)
26 //////////////////////////////////////////////////////////////////////////////////////
30 #include "Riostream.h"
34 #include "TProfile2D.h"
42 #include "TObjArray.h"
48 #include "TIterator.h"
49 #include "TLinearFitter.h"
52 #include "AliAnalysisTask.h"
53 #include "AliAnalysisManager.h"
55 #include "AliExternalTrackParam.h"
56 #include "AliESDVertex.h"
57 #include "AliESDEvent.h"
58 #include "AliESDfriend.h"
59 #include "AliCentrality.h"
60 #include "AliESDInputHandler.h"
61 #include "AliESDtrack.h"
62 #include "AliESDfriendTrack.h"
63 #include "AliTRDtrackV1.h"
64 #include "AliTRDseedV1.h"
65 #include "AliTRDcluster.h"
66 #include "AliTRDgeometry.h"
67 #include "AliESDtrackCuts.h"
68 #include "AliESDVertex.h"
69 #include "AliTRDCalDet.h"
71 #include "AliTRDCalibraVector.h"
72 #include "AliTRDCalibraFillHisto.h"
73 #include "AliTRDCalibraVdriftLinearFit.h"
74 #include "AliTRDCalibraExbAltFit.h"
76 #include "AliTRDcalibDB.h"
80 #include "AliTRDCalibChamberStatus.h"
81 #include "AliTRDdEdxBaseUtils.h"
82 #include "AliTRDdEdxCalibHistArray.h"
83 #include "AliTRDdEdxCalibUtils.h"
85 #include "AliTRDCalibTask.h"
88 ClassImp(AliTRDCalibTask)
90 //________________________________________________________________________
91 AliTRDCalibTask::AliTRDCalibTask(const char *name)
92 : AliAnalysisTaskSE(name), fESD(0),
99 fTRDCalibraFillHisto(0),
100 fTRDChamberStatus(0),
104 fNbTRDTrackOffline(0),
105 fNbTRDTrackStandalone(0),
109 fNbTimeBinOffline(0),
110 fNbTimeBinStandalone(0),
112 fNbClustersOffline(0),
113 fNbClustersStandalone(0),
115 fNbTrackletsOffline(0),
116 fNbTrackletsStandalone(0),
125 fLinearVdriftTest(0),
129 fVdriftLinear(kTRUE),
131 fDebugLevelTRDCalibraFillHisto(0),
133 fNumberBinCharge(100),
139 fSelectTrigger(kTRUE),
140 fSelectedTrigger(new TObjArray()),
143 fRequirePrimaryVertex(kFALSE),
146 fMinNbContributors(0),
147 fRangePrimaryVertexZ(9999999.0),
148 fRejectPileUpWithSPD(kFALSE),
149 fRejectPileUpWithTOF(kFALSE),
151 fMaxNbTracks(999999999),
152 fCutWithVdriftCalib(kFALSE),
153 fMinNbTRDtracklets(0),
155 fScaleGainWithTPCSignal(kFALSE),
159 fNormalizeNbOfCluster(kFALSE),
163 fOfflineTracks(kFALSE),
164 fStandaloneTracks(kFALSE),
166 fVersionGainUsed(-1),
167 fSubVersionGainUsed(-1),
168 fFirstRunGainLocal(-1),
169 fVersionGainLocalUsed(-1),
170 fSubVersionGainLocalUsed(-1),
172 fVersionVdriftUsed(-1),
173 fSubVersionVdriftUsed(-1),
176 fSubVersionExBUsed(-1),
183 // Default constructor
195 // Define input and output slots here
196 // Input slot #0 works with a TChain
197 DefineInput(0, TChain::Class());
199 // Output slot #0 writes into a TList container
200 DefineOutput(1, TList::Class());
204 //____________________________________________________________________________________
205 AliTRDCalibTask::~AliTRDCalibTask()
208 // AliTRDCalibTask destructor
212 if(fNEvents) delete fNEvents;
213 if(fNEventsInput) delete fNEventsInput;
214 if(fNbTRDTrack) delete fNbTRDTrack;
215 if(fNbTRDTrackOffline) delete fNbTRDTrackOffline;
216 if(fNbTRDTrackStandalone) delete fNbTRDTrackStandalone;
217 if(fNbTPCTRDtrack) delete fNbTPCTRDtrack;
218 if(fNbGoodTracks) delete fNbGoodTracks;
219 if(fNbTimeBin) delete fNbTimeBin;
220 if(fNbTimeBinOffline) delete fNbTimeBinOffline;
221 if(fNbTimeBinStandalone) delete fNbTimeBinStandalone;
222 if(fNbClusters) delete fNbClusters;
223 if(fNbClustersOffline) delete fNbClustersOffline;
224 if(fNbClustersStandalone) delete fNbClustersStandalone;
225 if(fNbTracklets) delete fNbTracklets;
226 if(fNbTrackletsOffline) delete fNbTrackletsOffline;
227 if(fNbTrackletsStandalone) delete fNbTrackletsStandalone;
228 if(fAbsoluteGain) delete fAbsoluteGain;
229 if(fTOFbc) delete fTOFbc;
230 if(fCH2dSum) delete fCH2dSum;
231 if(fPH2dSum) delete fPH2dSum;
232 if(fCH2dSM) delete fCH2dSM;
233 if(fPH2dSM) delete fPH2dSM;
234 if(fCH2dTest) delete fCH2dTest;
235 if(fPH2dTest) delete fPH2dTest;
236 if(fLinearVdriftTest) delete fLinearVdriftTest;
238 AliTRDdEdxCalibUtils::DeleteHistArray();
241 if(fCalDetGain) delete fCalDetGain;
243 if(fSelectedTrigger) {
244 fSelectedTrigger->Delete();
245 delete fSelectedTrigger;
248 delete fEsdTrackCuts;
251 if(fTRDChamberStatus) delete fTRDChamberStatus;
255 //________________________________________________________________________
256 void AliTRDCalibTask::UserCreateOutputObjects()
261 //cout << "AliTRDCalibTask::CreateOutputObjects() IN" << endl;
263 // Number of time bins
265 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
266 fNbTimeBins = cal->GetNumberOfTimeBinsDCS();
267 if(fNbTimeBins <= 0){
268 AliWarning(Form("No of TimeBins from DB [%d] use default [30]", fNbTimeBins));
274 fListHist = new TList();
275 fListHist->SetOwner();
277 // init chamber status
278 fTRDChamberStatus = new AliTRDCalibChamberStatus();
279 fTRDChamberStatus->Init();
280 fListHist->Add(fTRDChamberStatus->GetSparseI());
282 // instance calibration
283 fTRDCalibraFillHisto = AliTRDCalibraFillHisto::Instance();
285 fTRDCalibraFillHisto->SetNumberBinCharge(fNumberBinCharge); // set number of bin of the charge distribution
286 fTRDCalibraFillHisto->SetCutWithVdriftCalib(fCutWithVdriftCalib); // cut vdrift
287 fTRDCalibraFillHisto->SetMinNbTRDtracklets(fMinNbTRDtracklets); // min number of TRD tracklets
288 fTRDCalibraFillHisto->SetMinTRDMomentum(fMinTRDMomentum); // min TRD momentum
289 fTRDCalibraFillHisto->SetHisto2d(fHisto2d); // choose to use histograms
290 fTRDCalibraFillHisto->SetVector2d(fVector2d); // choose to use vectors
291 fTRDCalibraFillHisto->SetCH2dOn(); // choose to calibrate the gain
292 fTRDCalibraFillHisto->SetPH2dOn(); // choose to calibrate the drift velocity
293 fTRDCalibraFillHisto->SetPRF2dOn(); // choose to look at the PRF
294 fTRDCalibraFillHisto->SetLinearFitterOn(fVdriftLinear); // Other possibility vdrift VDRIFT
295 fTRDCalibraFillHisto->SetLinearFitterDebugOn(fVdriftLinear); // Other possibility vdrift
296 fTRDCalibraFillHisto->SetExbAltFitOn(fExbAlt); // Alternative method for exb
297 fTRDCalibraFillHisto->SetScaleWithTPCSignal(fScaleGainWithTPCSignal); // Scale Gain with TPC signal
298 for(Int_t k = 0; k < 3; k++){
299 if(((fNz[k] != 10) && (fNrphi[k] != 10)) && ((fNz[k] != 100) && (fNrphi[k] != 100))) {
300 fTRDCalibraFillHisto->SetNz(k,fNz[k]); // Mode calibration
301 fTRDCalibraFillHisto->SetNrphi(k,fNrphi[k]); // Mode calibration
304 if((fNz[k] == 100) && (fNrphi[k] == 100)) {
305 if(fVector2d) AliInfo("The mode all together is not supported by the vector method");
306 fTRDCalibraFillHisto->SetAllTogether(k);
308 if((fNz[k] == 10) && (fNrphi[k] == 10)) {
309 if(fVector2d) AliInfo("The mode per supermodule is not supported by the vector method");
310 fTRDCalibraFillHisto->SetPerSuperModule(k);
314 // Variables for how to fill
315 fTRDCalibraFillHisto->SetFillWithZero(fFillZero);
316 fTRDCalibraFillHisto->SetNormalizeNbOfCluster(fNormalizeNbOfCluster);
317 fTRDCalibraFillHisto->SetMaxCluster(fMaxCluster);
318 fTRDCalibraFillHisto->SetNbMaxCluster(fNbMaxCluster);
320 // Init with 30 timebins
321 fTRDCalibraFillHisto->Init2Dhistos(fNbTimeBins); // initialise the histos
322 fTRDCalibraFillHisto->SetNumberClusters(fLow); // At least 11 clusters
323 fTRDCalibraFillHisto->SetNumberClustersf(fHigh); // At least 11 clusters
326 fTRDCalibraFillHisto->SetDebugLevel(fDebugLevelTRDCalibraFillHisto); //debug stuff
329 fListHist->Add(fTRDCalibraFillHisto->GetCH2d());
330 fListHist->Add(fTRDCalibraFillHisto->GetPH2d());
331 fListHist->Add(fTRDCalibraFillHisto->GetPRF2d());
334 AliTRDCalibraVdriftLinearFit *fvdl = fTRDCalibraFillHisto->GetVdriftLinearFit();
336 fvdl->SetNbBindx(fVdBindx);
337 fvdl->SetNbBindy(fVdBindy);
338 fvdl->SetRangedx(fVdRangex);
339 fvdl->SetRangedy(fVdRangey);
341 fListHist->Add((TObject *)fTRDCalibraFillHisto->GetVdriftLinearFit());
343 if(fVector2d) fListHist->Add((TObject *) fTRDCalibraFillHisto->GetCalibraVector()); //calibra vector
344 if(fExbAlt) fListHist->Add((TObject *)fTRDCalibraFillHisto->GetExbAltFit());
346 fRelativeScale = fTRDCalibraFillHisto->GetRelativeScale(); // Get the relative scale for the gain
348 fNEvents = new TH1I(Form("NEvents_%s",(const char*)fName),"NEvents", 2, 0, 2);
349 fListHist->Add(fNEvents);
350 fNEventsInput = new TH1I(Form("NEventsInput_%s",(const char*)fName),"NEventsInput", 2, 0, 2);
351 fListHist->Add(fNEventsInput);
353 // absolute gain calibration even without AliESDfriend
355 Double_t minPt = 0.001;
356 Double_t maxPt = 10.0;
358 Double_t *binLimLogPt = new Double_t[nBinsPt+1];
359 Double_t *binLimPt = new Double_t[nBinsPt+1];
360 for(Int_t i=0; i<=nBinsPt; i++) binLimLogPt[i]=(Double_t)TMath::Log10(minPt) + (TMath::Log10(maxPt)-TMath::Log10(minPt))/nBinsPt*(Double_t)i ;
361 for(Int_t i=0; i<=nBinsPt; i++) binLimPt[i]=(Double_t)TMath::Power(10,binLimLogPt[i]);
363 fAbsoluteGain = new TH2F(Form("AbsoluteGain_%s",(const char*)fName),"AbsoluteGain", 200, 0.0, 700.0, nBinsPt, binLimPt);
364 fAbsoluteGain->SetYTitle("Momentum at TRD");
365 fAbsoluteGain->SetXTitle("charge deposit [a.u]");
366 fAbsoluteGain->SetZTitle("counts");
367 fAbsoluteGain->SetStats(0);
368 fAbsoluteGain->Sumw2();
369 fListHist->Add(fAbsoluteGain);
371 fTOFbc = new TH2F(Form("TOFbc_%s",(const char*)fName),"TOFbc", 200, -150., 50., nBinsPt, binLimPt);
372 fTOFbc->SetYTitle("Momentum");
373 fTOFbc->SetXTitle("TOF bc");
374 fTOFbc->SetZTitle("counts");
377 fListHist->Add(fTOFbc);
380 printf("\n AliTRDCalibTask PHQ is on!! \n\n");
381 AliTRDdEdxBaseUtils::PrintControl();
382 AliTRDdEdxCalibUtils::IniHistArray(fListHist, kTRUE);
385 printf("\n AliTRDCalibTask PHQ is off!! \n\n");
388 /////////////////////////////////////////
390 ///////////////////////////////////////
393 fLinearVdriftTest = new TH2S(Form("LFDV0testversion_%s",(const char*)fName),"LFDV0testversion",36,-0.9,0.9,48,-1.2,1.2);
394 fLinearVdriftTest->SetXTitle("tan(phi_{track})");
395 fLinearVdriftTest->SetYTitle("dy/dt");
396 fLinearVdriftTest->SetZTitle("Number of tracklets");
397 fLinearVdriftTest->SetStats(0);
398 fLinearVdriftTest->SetDirectory(0);
400 // Standart with AliESDfriend
401 fPH2dTest = new TProfile2D(Form("PH2dTest_%s",(const char*)fName),"Nz0Nrphi0"
402 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
404 fPH2dTest->SetYTitle("Det/pad groups");
405 fPH2dTest->SetXTitle("time [#mus]");
406 fPH2dTest->SetZTitle("<PH> [a.u.]");
407 fPH2dTest->SetStats(0);
409 fCH2dTest = new TH2I(Form("CH2dTest_%s",(const char*)fName),"Nz0Nrphi0",50,0,300,540,0,540);
410 fCH2dTest->SetYTitle("Det/pad groups");
411 fCH2dTest->SetXTitle("charge deposit [a.u]");
412 fCH2dTest->SetZTitle("counts");
413 fCH2dTest->SetStats(0);
417 fPH2dSM = new TProfile2D(Form("PH2dSM_%s",(const char*)fName),"Nz10Nrphi10"
418 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
420 fPH2dSM->SetYTitle("Det/pad groups");
421 fPH2dSM->SetXTitle("time [#mus]");
422 fPH2dSM->SetZTitle("<PH> [a.u.]");
423 fPH2dSM->SetStats(0);
425 fCH2dSM = new TH2I(Form("CH2dSM_%s",(const char*)fName),"Nz10Nrphi10",50,0,300,18,0,18);
426 fCH2dSM->SetYTitle("Det/pad groups");
427 fCH2dSM->SetXTitle("charge deposit [a.u]");
428 fCH2dSM->SetZTitle("counts");
429 fCH2dSM->SetStats(0);
432 fPH2dSum = new TProfile2D(Form("PH2dSum_%s",(const char*)fName),"Nz100Nrphi100"
433 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
435 fPH2dSum->SetYTitle("Det/pad groups");
436 fPH2dSum->SetXTitle("time [#mus]");
437 fPH2dSum->SetZTitle("<PH> [a.u.]");
438 fPH2dSum->SetStats(0);
440 fCH2dSum = new TH2I(Form("CH2dSum_%s",(const char*)fName),"Nz100Nrphi100",50,0,300,1,0,1);
441 fCH2dSum->SetYTitle("Det/pad groups");
442 fCH2dSum->SetXTitle("charge deposit [a.u]");
443 fCH2dSum->SetZTitle("counts");
444 fCH2dSum->SetStats(0);
449 fListHist->Add(fLinearVdriftTest);
450 fListHist->Add(fPH2dTest);
451 fListHist->Add(fCH2dTest);
452 fListHist->Add(fPH2dSM);
453 fListHist->Add(fCH2dSM);
454 fListHist->Add(fPH2dSum);
455 fListHist->Add(fCH2dSum);
459 /////////////////////////////////////////
460 // Second debug level
461 ///////////////////////////////////////
464 fNbGoodTracks = new TH2F(Form("NbGoodTracks_%s",(const char*)fName),"NbGoodTracks",500,0.0,2500.0,200,0.0,100.0);
465 fNbGoodTracks->SetXTitle("Nb of good tracks");
466 fNbGoodTracks->SetYTitle("Centrality");
467 fNbGoodTracks->SetStats(0);
469 fNbTRDTrack = new TH1F(Form("TRDTrack_%s",(const char*)fName),"TRDTrack",50,0,50);
470 fNbTRDTrack->Sumw2();
471 fNbTRDTrackOffline = new TH1F(Form("TRDTrackOffline_%s",(const char*)fName),"TRDTrackOffline",50,0,50);
472 fNbTRDTrackOffline->Sumw2();
473 fNbTRDTrackStandalone = new TH1F(Form("TRDTrackStandalone_%s",(const char*)fName),"TRDTrackStandalone",50,0,50);
474 fNbTRDTrackStandalone->Sumw2();
475 fNbTPCTRDtrack = new TH2F(Form("NbTPCTRDtrack_%s",(const char*)fName),"NbTPCTRDtrack",100,0,100,100,0,100);
476 fNbTPCTRDtrack->Sumw2();
478 fNbTimeBin = new TH1F(Form("NbTimeBin_%s",(const char*)fName),"NbTimeBin",35,0,35);
480 fNbTimeBinOffline = new TH1F(Form("NbTimeBinOffline_%s",(const char*)fName),"NbTimeBinOffline",35,0,35);
481 fNbTimeBinOffline->Sumw2();
482 fNbTimeBinStandalone = new TH1F(Form("NbTimeBinStandalone_%s",(const char*)fName),"NbTimeBinStandalone",35,0,35);
483 fNbTimeBinStandalone->Sumw2();
485 fNbClusters = new TH1F(Form("NbClusters_%s",(const char*)fName),"",35,0,35);
486 fNbClusters->Sumw2();
487 fNbClustersOffline = new TH1F(Form("NbClustersOffline_%s",(const char*)fName),"",35,0,35);
488 fNbClustersOffline->Sumw2();
489 fNbClustersStandalone = new TH1F(Form("NbClustersStandalone_%s",(const char*)fName),"",35,0,35);
490 fNbClustersStandalone->Sumw2();
492 fNbTracklets = new TH1F(Form("NbTracklets_%s",(const char*)fName),"NbTracklets",540,0.,540.);
493 fNbTracklets->Sumw2();
494 fNbTrackletsOffline = new TH1F(Form("NbTrackletsOffline_%s",(const char*)fName),"NbTrackletsOffline",540,0.,540.);
495 fNbTrackletsOffline->Sumw2();
496 fNbTrackletsStandalone = new TH1F(Form("NbTrackletsStandalone_%s",(const char*)fName),"NbTrackletsStandalone",540,0.,540.);
497 fNbTrackletsStandalone->Sumw2();
499 fListHist->Add(fNbGoodTracks);
501 fListHist->Add(fNbTRDTrack);
502 fListHist->Add(fNbTRDTrackOffline);
503 fListHist->Add(fNbTRDTrackStandalone);
504 fListHist->Add(fNbTPCTRDtrack);
506 fListHist->Add(fNbTimeBin);
507 fListHist->Add(fNbTimeBinOffline);
508 fListHist->Add(fNbTimeBinStandalone);
509 fListHist->Add(fNbClusters);
510 fListHist->Add(fNbClustersOffline);
511 fListHist->Add(fNbClustersStandalone);
512 fListHist->Add(fNbTracklets);
513 fListHist->Add(fNbTrackletsOffline);
514 fListHist->Add(fNbTrackletsStandalone);
518 delete [] binLimLogPt;
521 PostData(1,fListHist);
523 //cout << "AliTRDCalibTask::UserCreateOutputObjects() OUT" << endl;
527 //________________________________________________________________________
528 void AliTRDCalibTask::UserExec(Option_t *)
531 // Filling of the histos
533 //cout << "AliTRDCalibTask::Exec() IN" << endl;
535 // Init Versions and subversions used
536 if((fFirstRunGain==-1) || (fVersionGainUsed==-1) || (fSubVersionGainUsed==-1) || (fFirstRunGainLocal==-1) || (fVersionGainLocalUsed==-1) || (fSubVersionGainLocalUsed==-1) || (fFirstRunVdrift==-1) || (fVersionVdriftUsed==-1) || (fSubVersionVdriftUsed==-1)) {
537 if(!SetVersionSubversion()) {
538 PostData(1, fListHist);
544 fTRDCalibraFillHisto->SetFirstRunGain(fFirstRunGain); // Gain Used
545 fTRDCalibraFillHisto->SetVersionGainUsed(fVersionGainUsed); // Gain Used
546 fTRDCalibraFillHisto->SetSubVersionGainUsed(fSubVersionGainUsed); // Gain Used
547 fTRDCalibraFillHisto->SetFirstRunGainLocal(fFirstRunGainLocal); // Gain Used
548 fTRDCalibraFillHisto->SetVersionGainLocalUsed(fVersionGainLocalUsed); // Gain Used
549 fTRDCalibraFillHisto->SetSubVersionGainLocalUsed(fSubVersionGainLocalUsed); // Gain Used
550 fTRDCalibraFillHisto->SetFirstRunVdrift(fFirstRunVdrift); // Vdrift Used
551 fTRDCalibraFillHisto->SetVersionVdriftUsed(fVersionVdriftUsed); // Vdrift Used
552 fTRDCalibraFillHisto->SetSubVersionVdriftUsed(fSubVersionVdriftUsed); // Vdrift Used
553 if((fFirstRunExB != -1) && (fVersionExBUsed != -1) && (fSubVersionExBUsed != -1)){
554 fTRDCalibraFillHisto->SetFirstRunExB(fFirstRunExB); // ExB Used
555 fTRDCalibraFillHisto->SetVersionExBUsed(fVersionExBUsed); // ExB Used
556 fTRDCalibraFillHisto->SetSubVersionExBUsed(fSubVersionExBUsed); // ExB Used
558 fTRDCalibraFillHisto->InitCalDet();
563 name += fVersionGainUsed;
565 name += fSubVersionGainUsed;
567 name += fFirstRunGain;
569 fCH2dTest->SetTitle(name);
571 TString namee("Ver");
572 namee += fVersionVdriftUsed;
574 namee += fSubVersionVdriftUsed;
576 namee += fFirstRunVdrift;
577 namee += "Nz0Nrphi0";
578 fPH2dTest->SetTitle(namee);
582 // AliLog::SetGlobalLogLevel(AliLog::kError);
583 // cout << "AliTRDCalibTask::Exec() 1" << endl;
584 fESD = dynamic_cast<AliESDEvent*>(fInputEvent);
586 AliError("ESD Event missing");
587 PostData(1, fListHist);
591 const char* type = fESD->GetBeamType();
594 //printf("Counter %d\n",fCounter);
597 fNEventsInput->Fill(1);
599 //cout << "maxEvent = " << fMaxEvent << endl;
600 //if(fCounter%100==0) cout << "fCounter = " << fCounter << endl;
601 if((fMaxEvent != 0) && (fMaxEvent < fCounter)) {
602 PostData(1, fListHist);
605 //if(fCounter%100==0) cout << "fCounter1 = " << fCounter << endl;
606 //cout << "event = " << fCounter << endl;
608 //printf("Counter %d\n",fCounter);
615 if (fSelectTrigger) {
617 //printf("Will check the triggers\n");
619 Int_t numberOfTriggerSelected = fSelectedTrigger->GetEntriesFast();
620 //printf("numberofTriggerSelected %d\n",numberOfTriggerSelected);
623 for(Int_t k = 0; k < numberOfTriggerSelected; k++){
624 const TObjString *const obString=(TObjString*)fSelectedTrigger->At(k);
625 const TString tString=obString->GetString();
626 if(fESD->IsTriggerClassFired((const char*)tString)) {
633 for(Int_t k = 0; k < numberOfTriggerSelected; k++){
634 const TObjString *const obString=(TObjString*)fSelectedTrigger->At(k);
635 const TString tString=obString->GetString();
636 if(fESD->IsTriggerClassFired((const char*)tString)) {
642 PostData(1, fListHist);
648 //printf("Class Fired %s\n",(const char*)fESD->GetFiredTriggerClasses());
649 //printf("Trigger passed\n");
651 ///////////////////////////////
652 // Require a primary vertex
653 //////////////////////////////
654 if(fRequirePrimaryVertex) {
655 const AliESDVertex* vtxESD = 0x0;
656 if (fVtxTPC) vtxESD = fESD->GetPrimaryVertexTPC() ;
657 else if (fVtxSPD) vtxESD = fESD->GetPrimaryVertexSPD() ;
658 else vtxESD = fESD->GetPrimaryVertexTracks() ;
660 PostData(1, fListHist);
663 Int_t nCtrb = vtxESD->GetNContributors();
664 if(nCtrb < fMinNbContributors) {
665 PostData(1, fListHist);
668 Double_t zPosition = vtxESD->GetZ();
669 if(TMath::Abs(zPosition) > fRangePrimaryVertexZ) {
670 PostData(1, fListHist);
676 //printf("Primary vertex passed\n");
678 //////////////////////////////////
679 // Reject pile-up with SPD
680 //////////////////////////////////
682 if(fRejectPileUpWithSPD) {
683 if(fInputEvent->IsPileupFromSPD(3, 0.8, 3., 2., 5)){
685 PostData(1, fListHist);
690 //////////////////////////////////////
691 // Requirement on number of good tracks
692 //////////////////////////////////////
693 Int_t nGoodParticles = 0;
694 Double_t nbTracks = fESD->GetNumberOfTracks();
695 for(Int_t itrack = 0; itrack < nbTracks; itrack++) {
696 if(ParticleGood(itrack)) nGoodParticles++;
700 AliCentrality *esdCentrality = fESD->GetCentrality();
701 Float_t centrality = esdCentrality->GetCentralityPercentile("V0M");
702 //Float_t centralityb = esdCentrality->GetCentralityPercentile("CL1");
703 fNbGoodTracks->Fill(nGoodParticles,centrality);
704 //printf("centrality %f, centralityb %f\n",centrality,centralityb);
707 //printf("Beam type %s\n",(const char*)type);
708 if (!strstr(type,"p-p")) {
709 //if (strstr(type,"A-A")) {
710 //printf("Will check the number of good tracks %f %f %f\n",nGoodParticles,fMinNbTracks,fMaxNbTracks);
711 if((nGoodParticles < fMinNbTracks) || (nGoodParticles > fMaxNbTracks)) {
712 PostData(1, fListHist);
720 Int_t nbTrdTracks = 0;
722 Int_t nbTrdTracksStandalone = 0;
724 Int_t nbTrdTracksOffline = 0;
726 Int_t nbtrackTPC = 0;
730 if (nbTracks <= 0.0) {
733 fNbTRDTrack->Fill(nbTrdTracks);
734 fNbTRDTrackStandalone->Fill(nbTrdTracksStandalone);
735 fNbTRDTrackOffline->Fill(nbTrdTracksOffline);
737 PostData(1, fListHist);
742 fESDfriend = dynamic_cast<AliESDfriend*> (fESD->FindListObject("AliESDfriend"));
744 AliError("fESDfriend not available");
745 PostData(1, fListHist);
749 if(fESDfriend->TestSkipBit()) {
750 PostData(1, fListHist);
754 //printf("has friends\n");
756 /////////////////////////////////////
757 // Loop on AliESDtrack
758 ////////////////////////////////////
759 //printf("Nb of tracks %f\n",nbTracks);
760 Int_t nbTracksfriends = fESDfriend->GetNumberOfTracks();
761 for(int itrk=0; itrk < nbTracksfriends; ++itrk){
764 fkEsdTrack = fESD->GetTrack(itrk);
765 if(!fkEsdTrack) continue;
766 ULong_t status = fkEsdTrack->GetStatus();
767 if(status&(AliESDtrack::kTPCout)) ++nbtrackTPC;
769 // Fix suggested by Alex
770 fFriendTrack = fESDfriend->GetTrack(itrk);
771 //printf("itrk %d\n",itrk);
772 //fFriendTrack = (fESDfriend->GetNumberOfTracks()>itrk)?fESDfriend->GetTrack(itrk):NULL;
774 //printf("No friend track %d\n",itrk);
781 Bool_t standalonetrack = kFALSE;
782 Bool_t offlinetrack = kFALSE;
783 //ULong_t status = fkEsdTrack->GetStatus();
785 //////////////////////////////////////
786 // Loop on calibration objects
787 //////////////////////////////////////
790 while((fCalibObject = (TObject *)(fFriendTrack->GetCalibObject(icalib++)))){
791 //printf("Name %s\n",fCalibObject->IsA()->GetName());
792 if(strcmp(fCalibObject->IsA()->GetName(), "AliTRDtrackV1") != 0) continue;
793 //printf("Find the calibration object\n");
796 if((status&(AliESDtrack::kTRDout)) && (!(status&(AliESDtrack::kTRDin)))) {
797 standalonetrack = kTRUE;
799 if((status&(AliESDtrack::kTRDin))) {
800 offlinetrack = kTRUE;
807 else if(fStandaloneTracks){
808 if(!standalonetrack){
813 fTrdTrack = (AliTRDtrackV1 *)fCalibObject;
814 // process chamberstatus
815 fTRDChamberStatus->ProcessTrack(fTrdTrack);
818 // Quality cuts on the AliESDtrack
819 if((fEsdTrackCuts) && (!fEsdTrackCuts->IsSelected((AliVParticle *)fkEsdTrack))) {
820 //printf("Not a good track\n");
824 Int_t nbcrossing = fkEsdTrack->GetTOFBunchCrossing();
825 fTOFbc->Fill(nbcrossing,fkEsdTrack->Pt());
826 // TOF pile-up rejection is asked
827 if(fRejectPileUpWithTOF) {
828 if(TMath::Abs(nbcrossing)>0.5) continue;
831 // First Absolute gain calibration
832 Int_t trdNTracklets = (Int_t) fkEsdTrack->GetTRDntracklets();
833 Int_t trdNTrackletsPID = (Int_t) fkEsdTrack->GetTRDntrackletsPID();
834 //printf("Number of trd tracklets %d and PID trd tracklets %d\n",trdNTracklets,trdNTrackletsPID);
835 if((trdNTracklets > 0) && (trdNTrackletsPID > 0)) {
836 for(Int_t iPlane = 0; iPlane < 6; ++iPlane){
837 //Double_t slide = fkEsdTrack->GetTRDslice(iPlane);
838 //printf("Number of slide %d\n",fkEsdTrack->GetNumberOfTRDslices());
839 //Double_t momentum = fkEsdTrack->GetTRDmomentum(iPlane);
840 //printf("momentum %f, slide %f\n",momentum,slide);
841 if(fkEsdTrack->GetTRDslice(iPlane) > 0.0)
842 fAbsoluteGain->Fill(fkEsdTrack->GetTRDslice(iPlane)*8.0/100.0,
843 fkEsdTrack->GetTRDmomentum(iPlane));
848 if(!fTrdTrack) continue;
850 if(good && fOnInstance) {
851 //cout << "good" << endl;
852 fTRDCalibraFillHisto->UpdateHistogramsV1(fTrdTrack,fkEsdTrack);
853 //printf("Fill fTRDCalibraFillHisto\n");
857 const Double_t mag = AliTRDdEdxBaseUtils::IsExBOn() ? fESD->GetMagneticField() : -1;
858 const Int_t charge = AliTRDdEdxBaseUtils::IsExBOn() ? fkEsdTrack->Charge() : -1;
859 const Double_t toTPCscale = AliTRDdEdxCalibUtils::GetCalibTPCscale(fkEsdTrack->GetTPCncls(), fkEsdTrack->GetTPCsignal());
861 AliTRDdEdxCalibUtils::FillHist(fTrdTrack, 0, mag, charge, toTPCscale);
865 //////////////////////////////////
867 ////////////////////////////////
871 //printf("Enter debug\n");
873 Int_t nbtracklets = 0;
877 //Bool_t standalonetracklet = kFALSE;
878 const AliTRDseedV1 *tracklet = 0x0;
879 //////////////////////////////////////
881 /////////////////////////////////////
883 Double_t phtb[AliTRDseedV1::kNtb];
884 memset(phtb, 0, AliTRDseedV1::kNtb*sizeof(Double_t));
886 Float_t normalisation = 1.13;
889 for(Int_t itr = 0; itr < 6; ++itr){
891 if(!(tracklet = fTrdTrack->GetTracklet(itr))) continue;
892 if(!tracklet->IsOK()) continue;
895 //standalonetracklet = kFALSE;
896 //if(tracklet->IsStandAlone()) standalonetracklet = kTRUE;
899 memset(phtb, 0, AliTRDseedV1::kNtb*sizeof(Double_t));
903 //Int_t crossrow = 0;
905 // Check no shared clusters
906 //for(int icc=AliTRDseedV1::kNtb; icc<AliTRDseedV1::kNclusters; icc++){
907 // if((fcl = tracklet->GetClusters(icc))) crossrow = 1;
914 for(int ic=0; ic<AliTRDseedV1::kNtb; ++ic){
916 if(!(fCl = tracklet->GetClusters(ic))) continue;
918 time = fCl->GetPadTime();
919 //ch = tracklet->GetdQdl(ic);
920 ch = tracklet->GetQperTB(ic);
921 qcl = TMath::Abs(fCl->GetQ());
922 detector = fCl->GetDetector();
923 // Add the charge if shared cluster
924 if((ic+AliTRDseedV1::kNtb) < AliTRDseedV1::kNclusters) {
925 if((fCl = tracklet->GetClusters(ic+AliTRDseedV1::kNtb))) {
926 qcl += TMath::Abs(fCl->GetQ());
927 //printf("Add the cluster charge\n");
930 if((time>-1) && (time<fNbTimeBins)) phtb[time]=qcl;
931 if((fCalDetGain) && (fCalDetGain->GetValue(detector) > 0.0)) sum += ch*fCalDetGain->GetValue(detector)/normalisation;
932 else sum += ch/normalisation;
935 fNbTimeBin->Fill(time);
936 if(tracklet->IsStandAlone()) fNbTimeBinStandalone->Fill(time);
937 else fNbTimeBinOffline->Fill(time);
940 sector = AliTRDgeometry::GetSector(detector);
943 fNbTracklets->Fill(detector);
944 if(tracklet->IsStandAlone()) fNbTrackletsStandalone->Fill(detector);
945 else fNbTrackletsOffline->Fill(detector);
947 fNbClusters->Fill(nbclusters);
948 if(tracklet->IsStandAlone()) fNbClustersStandalone->Fill(nbclusters);
949 else fNbClustersOffline->Fill(nbclusters);
952 if((nbclusters > fLow) && (nbclusters < fHigh)){
953 if(fRelativeScale > 0.0) sum = sum/fRelativeScale;
954 fCH2dTest->Fill(sum,detector+0.5);
955 fCH2dSM->Fill(sum,sector+0.5);
956 fCH2dSum->Fill(sum,0.5);
957 Bool_t checknoise = kTRUE;
958 if(fMaxCluster > 0) {
959 if(phtb[0] > fMaxCluster) checknoise = kFALSE;
960 if(fNbTimeBins > fNbMaxCluster) {
961 for(Int_t k = (fNbTimeBins-fNbMaxCluster); k < fNbTimeBins; k++){
962 if(phtb[k] > fMaxCluster) checknoise = kFALSE;
967 for(int ic=0; ic<fNbTimeBins; ic++){
969 fPH2dTest->Fill((Double_t)(ic/10.0),detector+0.5,(Double_t)phtb[ic]);
970 fPH2dSum->Fill((Double_t)(ic/10.0),0.5,(Double_t)phtb[ic]);
971 fPH2dSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[ic]);
975 fPH2dTest->Fill((Double_t)(ic/10.0),detector+0.5,(Double_t)phtb[ic]);
976 fPH2dSum->Fill((Double_t)(ic/10.0),0.0,(Double_t)phtb[ic]);
977 fPH2dSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[ic]);
983 if(detector == 0) FindP1TrackPHtrackletV1Test(tracklet,nbclusters);
985 } // loop on tracklets
990 if(nTRDtrackV1 > 0) {
992 if((status&(AliESDtrack::kTRDout)) && (!(status&(AliESDtrack::kTRDin)))) {
993 ++nbTrdTracksStandalone;
995 if((status&(AliESDtrack::kTRDin))) {
996 ++nbTrdTracksOffline;
999 //delete fFriendTrack;
1003 fNbTRDTrack->Fill(nbTrdTracks);
1004 fNbTRDTrackStandalone->Fill(nbTrdTracksStandalone);
1005 fNbTRDTrackOffline->Fill(nbTrdTracksOffline);
1006 fNbTPCTRDtrack->Fill(nbTrdTracks,nbtrackTPC);
1010 PostData(1, fListHist);
1011 //cout << "AliTRDCalibTask::Exec() OUT" << endl;
1014 //________________________________________________________________________
1015 void AliTRDCalibTask::Terminate(Option_t *)
1021 if(fTRDCalibraFillHisto) fTRDCalibraFillHisto->DestroyDebugStreamer();
1025 //_______________________________________________________
1026 Bool_t AliTRDCalibTask::Load(const Char_t *filename)
1029 // Generic container loader
1032 if(!TFile::Open(filename)){
1033 //AliWarning(Form("Couldn't open file %s.", filename));
1037 if(!(o = (TList*)gFile->Get(GetName()))){
1038 //AliWarning("Missing histogram container.");
1041 fListHist = (TList*)o->Clone(GetName());
1045 //_______________________________________________________
1046 Bool_t AliTRDCalibTask::Load(TList *lister)
1049 // Generic container loader
1052 fListHist = (TList*)lister->Clone(GetName());
1055 //_______________________________________________________________________________________
1056 void AliTRDCalibTask::AddTask(const AliTRDCalibTask * calibTask) {
1062 TList *listcalibTask = calibTask->GetList();
1063 if(!listcalibTask) return;
1065 THnSparseI *histoEntries = (THnSparseI *) listcalibTask->FindObject("NumberOfEntries");
1067 TH1I *nEvents = (TH1I *) listcalibTask->FindObject(Form("NEvents_%s",(const char*)calibTask->GetName()));
1068 TH1I *nEventsInput = (TH1I *) listcalibTask->FindObject(Form("NEventsInput_%s",(const char*)calibTask->GetName()));
1069 TH2F *absoluteGain = (TH2F *) listcalibTask->FindObject(Form("AbsoluteGain_%s",(const char*)calibTask->GetName()));
1071 TH1F *trdTrack = (TH1F *) listcalibTask->FindObject(Form("TRDTrack_%s",(const char*)calibTask->GetName()));
1072 TH1F *trdTrackOffline = (TH1F *) listcalibTask->FindObject(Form("TRDTrackOffline_%s",(const char*)calibTask->GetName()));
1073 TH1F *trdTrackStandalone = (TH1F *) listcalibTask->FindObject(Form("TRDTrackStandalone_%s",(const char*)calibTask->GetName()));
1075 TH2F *tpctrdTrack = (TH2F *) listcalibTask->FindObject(Form("NbTPCTRDtrack_%s",(const char*)calibTask->GetName()));
1077 TH1F *nbTimeBin = (TH1F *) listcalibTask->FindObject(Form("NbTimeBin_%s",(const char*)calibTask->GetName()));
1078 TH1F *nbTimeBinOffline = (TH1F *) listcalibTask->FindObject(Form("NbTimeBinOffline_%s",(const char*)calibTask->GetName()));
1079 TH1F *nbTimeBinStandalone = (TH1F *) listcalibTask->FindObject(Form("NbTimeBinStandalone_%s",(const char*)calibTask->GetName()));
1081 TH1F *nbClusters = (TH1F *) listcalibTask->FindObject(Form("NbClusters_%s",(const char*)calibTask->GetName()));
1082 TH1F *nbClustersOffline = (TH1F *) listcalibTask->FindObject(Form("NbClustersOffline_%s",(const char*)calibTask->GetName()));
1083 TH1F *nbClustersStandalone = (TH1F *) listcalibTask->FindObject(Form("NbClustersStandalone_%s",(const char*)calibTask->GetName()));
1085 TH1F *nbTracklets = (TH1F *) listcalibTask->FindObject(Form("NbTracklets_%s",(const char*)calibTask->GetName()));
1086 TH1F *nbTrackletsOffline = (TH1F *) listcalibTask->FindObject(Form("NbTrackletsOffline_%s",(const char*)calibTask->GetName()));
1087 TH1F *nbTrackletsStandalone = (TH1F *) listcalibTask->FindObject(Form("NbTrackletsStandalone_%s",(const char*)calibTask->GetName()));
1089 TH2I *ch2d = (TH2I *) listcalibTask->FindObject("CH2d");
1090 TProfile2D *ph2d = (TProfile2D *) listcalibTask->FindObject("PH2d");
1091 TProfile2D *prf2d = (TProfile2D *) listcalibTask->FindObject("PRF2d");
1093 TH2I *ch2dSum = (TH2I *) listcalibTask->FindObject(Form("CH2dSum_%s",(const char*)calibTask->GetName()));
1094 TProfile2D *ph2dSum = (TProfile2D *) listcalibTask->FindObject(Form("PH2dSum_%s",(const char*)calibTask->GetName()));
1096 TH2I *ch2dSM = (TH2I *) listcalibTask->FindObject(Form("CH2dSM_%s",(const char*)calibTask->GetName()));
1097 TProfile2D *ph2dSM = (TProfile2D *) listcalibTask->FindObject(Form("PH2dSM_%s",(const char*)calibTask->GetName()));
1099 AliTRDCalibraVdriftLinearFit *linearfit = (AliTRDCalibraVdriftLinearFit *) listcalibTask->FindObject("AliTRDCalibraVdriftLinearFit");
1100 AliTRDCalibraExbAltFit *exbaltfit = (AliTRDCalibraExbAltFit *) listcalibTask->FindObject("AliTRDCalibraExbAltFit");
1101 AliTRDCalibraVector *calibraVector = (AliTRDCalibraVector *) listcalibTask->FindObject("AliTRDCalibraVector");
1105 THnSparseI *inhistoEntries = (THnSparseI *) fListHist->FindObject("NumberOfEntries");
1107 TH1I *inEventsInput = (TH1I *) fListHist->FindObject(Form("NEventsInput_%s",(const char*)fName));
1108 TH1I *inEvents = (TH1I *) fListHist->FindObject(Form("NEvents_%s",(const char*)fName));
1109 TH2F *iabsoluteGain = (TH2F *) fListHist->FindObject(Form("AbsoluteGain_%s",(const char*)fName));
1111 TH1F *itrdTrack = (TH1F *) fListHist->FindObject(Form("TRDTrack_%s",(const char*)fName));
1112 TH1F *itrdTrackOffline = (TH1F *) fListHist->FindObject(Form("TRDTrackOffline_%s",(const char*)fName));
1113 TH1F *itrdTrackStandalone = (TH1F *) fListHist->FindObject(Form("TRDTrackStandalone_%s",(const char*)fName));
1115 TH2F *itpctrdTrack = (TH2F *) fListHist->FindObject(Form("NbTPCTRDtrack_%s",(const char*)fName));
1117 TH1F *inbTimeBin = (TH1F *) fListHist->FindObject(Form("NbTimeBin_%s",(const char*)fName));
1118 TH1F *inbTimeBinOffline = (TH1F *) fListHist->FindObject(Form("NbTimeBinOffline_%s",(const char*)fName));
1119 TH1F *inbTimeBinStandalone = (TH1F *) fListHist->FindObject(Form("NbTimeBinStandalone_%s",(const char*)fName));
1121 TH1F *inbClusters = (TH1F *) fListHist->FindObject(Form("NbClusters_%s",(const char*)fName));
1122 TH1F *inbClustersOffline = (TH1F *) fListHist->FindObject(Form("NbClustersOffline_%s",(const char*)fName));
1123 TH1F *inbClustersStandalone = (TH1F *) fListHist->FindObject(Form("NbClustersStandalone_%s",(const char*)fName));
1125 TH1F *inbTracklets = (TH1F *) fListHist->FindObject(Form("NbTracklets_%s",(const char*)fName));
1126 TH1F *inbTrackletsOffline = (TH1F *) fListHist->FindObject(Form("NbTrackletsOffline_%s",(const char*)fName));
1127 TH1F *inbTrackletsStandalone = (TH1F *) fListHist->FindObject(Form("NbTrackletsStandalone_%s",(const char*)fName));
1129 TH2I *ich2d = (TH2I *) fListHist->FindObject("CH2d");
1130 TProfile2D *iph2d = (TProfile2D *) fListHist->FindObject("PH2d");
1131 TProfile2D *iprf2d = (TProfile2D *) fListHist->FindObject("PRF2d");
1133 TH2I *ich2dSum = (TH2I *) fListHist->FindObject(Form("CH2dSum_%s",(const char*)fName));
1134 TProfile2D *iph2dSum = (TProfile2D *) fListHist->FindObject(Form("PH2dSum_%s",(const char*)fName));
1136 TH2I *ich2dSM = (TH2I *) fListHist->FindObject(Form("CH2dSM_%s",(const char*)fName));
1137 TProfile2D *iph2dSM = (TProfile2D *) fListHist->FindObject(Form("PH2dSM_%s",(const char*)fName));
1139 AliTRDCalibraVdriftLinearFit *ilinearfit = (AliTRDCalibraVdriftLinearFit *) fListHist->FindObject("AliTRDCalibraVdriftLinearFit");
1140 AliTRDCalibraExbAltFit *iexbaltfit = (AliTRDCalibraExbAltFit *) fListHist->FindObject("AliTRDCalibraExbAltFit");
1141 AliTRDCalibraVector *icalibraVector = (AliTRDCalibraVector *) fListHist->FindObject("AliTRDCalibraVector");
1147 if(inhistoEntries) {
1148 inhistoEntries->Add(histoEntries);
1149 //printf("Add Events\n");
1152 //printf("Create new Events\n");
1153 inhistoEntries = (THnSparseI *) histoEntries->Clone();
1154 fListHist->Add(inhistoEntries);
1160 inEventsInput->Add(nEventsInput);
1161 //printf("Add Events\n");
1164 //printf("Create new Events\n");
1165 inEventsInput = new TH1I(*nEventsInput);
1166 fListHist->Add(inEventsInput);
1172 inEvents->Add(nEvents);
1173 //printf("Add Events\n");
1176 //printf("Create new Events\n");
1177 inEvents = new TH1I(*nEvents);
1178 fListHist->Add(inEvents);
1183 if(iabsoluteGain) iabsoluteGain->Add(absoluteGain);
1185 iabsoluteGain = new TH2F(*absoluteGain);
1186 fListHist->Add(iabsoluteGain);
1191 if(itrdTrack) itrdTrack->Add(trdTrack);
1193 itrdTrack = new TH1F(*trdTrack);
1194 fListHist->Add(itrdTrack);
1198 if(trdTrackOffline) {
1199 if(itrdTrackOffline) itrdTrackOffline->Add(trdTrackOffline);
1201 itrdTrackOffline = new TH1F(*trdTrackOffline);
1202 fListHist->Add(itrdTrackOffline);
1206 if(trdTrackStandalone) {
1207 if(itrdTrackStandalone) itrdTrackStandalone->Add(trdTrackStandalone);
1209 itrdTrackStandalone = new TH1F(*trdTrackStandalone);
1210 fListHist->Add(itrdTrackStandalone);
1215 if(itpctrdTrack) itpctrdTrack->Add(tpctrdTrack);
1217 itpctrdTrack = new TH2F(*tpctrdTrack);
1218 fListHist->Add(itpctrdTrack);
1223 if(inbTimeBin) inbTimeBin->Add(nbTimeBin);
1225 inbTimeBin = new TH1F(*inbTimeBin);
1226 fListHist->Add(inbTimeBin);
1230 if(nbTimeBinOffline) {
1231 if(inbTimeBinOffline) inbTimeBinOffline->Add(nbTimeBinOffline);
1233 inbTimeBinOffline = new TH1F(*nbTimeBinOffline);
1234 fListHist->Add(inbTimeBinOffline);
1238 if(nbTimeBinStandalone) {
1239 if(inbTimeBinStandalone) inbTimeBinStandalone->Add(nbTimeBinStandalone);
1241 inbTimeBinStandalone = new TH1F(*nbTimeBinStandalone);
1242 fListHist->Add(inbTimeBinStandalone);
1247 if(inbClusters) inbClusters->Add(nbClusters);
1249 inbClusters = new TH1F(*nbClusters);
1250 fListHist->Add(inbClusters);
1254 if(nbClustersOffline) {
1255 if(inbClustersOffline) inbClustersOffline->Add(nbClustersOffline);
1257 inbClustersOffline = new TH1F(*nbClustersOffline);
1258 fListHist->Add(inbClustersOffline);
1262 if(nbClustersStandalone) {
1263 if(inbClustersStandalone) inbClustersStandalone->Add(nbClustersStandalone);
1265 inbClustersStandalone = new TH1F(*nbClustersStandalone);
1266 fListHist->Add(inbClustersStandalone);
1271 if(inbTracklets) inbTracklets->Add(nbTracklets);
1273 inbTracklets = new TH1F(*nbTracklets);
1274 fListHist->Add(inbTracklets);
1278 if(nbTrackletsOffline) {
1279 if(inbTrackletsOffline) inbTrackletsOffline->Add(nbTrackletsOffline);
1281 inbTrackletsOffline = new TH1F(*nbTrackletsOffline);
1282 fListHist->Add(inbTrackletsOffline);
1286 if(nbTrackletsStandalone) {
1287 if(inbTrackletsStandalone) inbTrackletsStandalone->Add(nbTrackletsStandalone);
1289 inbTrackletsStandalone = new TH1F(*nbTrackletsStandalone);
1290 fListHist->Add(inbTrackletsStandalone);
1295 if(ich2d) ich2d->Add(ch2d);
1297 ich2d = new TH2I(*ch2d);
1298 fListHist->Add(ich2d);
1303 if(iph2d) iph2d->Add(ph2d);
1305 iph2d = new TProfile2D(*ph2d);
1306 fListHist->Add(iph2d);
1311 if(iprf2d) iprf2d->Add(prf2d);
1313 iprf2d = new TProfile2D(*prf2d);
1314 fListHist->Add(iprf2d);
1319 if(ich2dSum) ich2dSum->Add(ch2dSum);
1321 ich2dSum = new TH2I(*ch2dSum);
1322 fListHist->Add(ich2dSum);
1327 if(iph2dSum) iph2dSum->Add(ph2dSum);
1329 iph2dSum = new TProfile2D(*ph2dSum);
1330 fListHist->Add(iph2dSum);
1335 if(ich2dSM) ich2dSM->Add(ch2dSM);
1337 ich2dSM = new TH2I(*ch2dSM);
1338 fListHist->Add(ich2dSM);
1343 if(iph2dSM) iph2dSM->Add(ph2dSM);
1345 iph2dSM = new TProfile2D(*ph2dSM);
1346 fListHist->Add(iph2dSM);
1351 if(ilinearfit) ilinearfit->Add(linearfit);
1353 ilinearfit = new AliTRDCalibraVdriftLinearFit(*linearfit);
1354 fListHist->Add(ilinearfit);
1359 if(iexbaltfit) iexbaltfit->Add(exbaltfit);
1361 iexbaltfit = new AliTRDCalibraExbAltFit(*exbaltfit);
1362 fListHist->Add(iexbaltfit);
1367 if(icalibraVector) icalibraVector->Add(calibraVector);
1369 icalibraVector = new AliTRDCalibraVector(*calibraVector);
1370 fListHist->Add(icalibraVector);
1375 //________________________________________________________________________________
1376 Long64_t AliTRDCalibTask::Merge(TCollection *li) {
1382 TIterator* iter = li->MakeIterator();
1383 AliTRDCalibTask* cal = 0;
1385 while ((cal = (AliTRDCalibTask*)iter->Next())) {
1386 if (!cal->InheritsFrom(AliTRDCalibTask::Class())) {
1387 Error("Merge","Attempt to add object of class %s to a %s", cal->ClassName(), this->ClassName());
1391 // add histograms here...
1399 //_____________________________________________________
1400 Bool_t AliTRDCalibTask::SetVersionSubversion(){
1402 // Load Chamber Gain factors into the Tender supply
1405 //printf("SetVersionSubversion\n");
1407 //find previous entry from the UserInfo
1408 TTree *tree=((TChain*)GetInputData(0))->GetTree();
1410 AliError("Tree not found in ESDhandler");
1414 TList *userInfo=(TList*)tree->GetUserInfo();
1416 AliError("No UserInfo found in tree");
1420 TList *cdbList=(TList*)userInfo->FindObject("cdbList");
1422 AliError("No cdbList found in UserInfo");
1423 if (AliLog::GetGlobalLogLevel()>=AliLog::kError) userInfo->Print();
1427 TIter nextCDB(cdbList);
1429 while ( (os=(TObjString*)nextCDB()) ){
1430 if(os->GetString().Contains("TRD/Calib/ChamberGainFactor")){
1431 // Get Old gain calibration
1432 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1433 fFirstRunGain = id->GetFirstRun();
1434 fVersionGainUsed = id->GetVersion();
1435 fSubVersionGainUsed = id->GetSubVersion();
1436 } else if(os->GetString().Contains("TRD/Calib/ChamberVdrift")){
1437 // Get Old drift velocity calibration
1438 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1439 fFirstRunVdrift = id->GetFirstRun();
1440 fVersionVdriftUsed = id->GetVersion();
1441 fSubVersionVdriftUsed = id->GetSubVersion();
1442 } else if(os->GetString().Contains("TRD/Calib/LocalGainFactor")){
1443 // Get Old drift velocity calibration
1444 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1445 fFirstRunGainLocal = id->GetFirstRun();
1446 fVersionGainLocalUsed = id->GetVersion();
1447 fSubVersionGainLocalUsed = id->GetSubVersion();
1448 } else if((os->GetString().Contains("TRD/Calib/ChamberExB")) && (!os->GetString().Contains("TRD/Calib/ChamberExBAlt"))){
1449 // Get Old drift velocity calibration
1450 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1451 fFirstRunExB = id->GetFirstRun();
1452 fVersionExBUsed = id->GetVersion();
1453 fSubVersionExBUsed = id->GetSubVersion();
1454 //printf("Version %d and subversion %d\n",fVersionExBUsed,fSubVersionExBUsed);
1458 //printf("VersionGain %d, SubversionGain %d, VersionLocalGain %d, Subversionlocalgain %d, Versionvdrift %d, Subversionvdrift %d\n",fVersionGainUsed,fSubVersionGainUsed,fVersionGainLocalUsed,fSubVersionGainLocalUsed,fVersionVdriftUsed,fSubVersionVdriftUsed);
1461 if((fFirstRunGain < 0) ||
1462 (fFirstRunGainLocal < 0) ||
1463 (fFirstRunVdrift < 0) ||
1464 (fVersionGainUsed < 0) ||
1465 (fVersionGainLocalUsed < 0) ||
1466 (fSubVersionGainUsed < 0) ||
1467 (fSubVersionGainLocalUsed < 0) ||
1468 (fVersionVdriftUsed < 0) ||
1469 (fSubVersionVdriftUsed < 0)) {
1470 AliError("No recent calibration found");
1476 //_________________________________________________________________________________________________________________________
1477 Bool_t AliTRDCalibTask::ParticleGood(int i) const {
1480 // Definition of good tracks
1484 AliESDtrack *track = fESD->GetTrack(i);
1485 if (!track->IsOn(AliESDtrack::kTPCrefit)) return 0; // TPC refit
1486 if (track->GetTPCNcls() < 90) return 0; // number of TPC clusters
1487 if (fabs(track->Eta())>0.8) return 0; // fiducial pseudorapidity
1489 track->GetImpactParametersTPC(r,z);
1490 if (fabs(z)>2.0) return 0; // impact parameter in z
1491 if (fabs(r)>2.0) return 0; // impact parameter in xy
1497 //______________________________________________________________________________________________________________________
1498 Bool_t AliTRDCalibTask::FindP1TrackPHtrackletV1Test(const AliTRDseedV1 *tracklet, Int_t nbclusters)
1501 // Drift velocity calibration:
1502 // Fit the clusters with a straight line
1503 // From the slope find the drift velocity
1506 ////////////////////////////////////////////////
1507 //Number of points: if less than 3 return kFALSE
1508 /////////////////////////////////////////////////
1509 if(nbclusters <= 2) return kFALSE;
1514 // results of the linear fit
1515 Double_t dydt = 0.0; // dydt tracklet after straight line fit
1517 //Double_t errorpar = 0.0; // error after straight line fit on dy/dt
1518 Double_t pointError = 0.0; // error after straight line fit
1519 // pad row problemes: avoid tracklet that cross pad rows, tilting angle in the constant
1520 Int_t crossrow = 0; // if it crosses a pad row
1521 Int_t rowp = -1; // if it crosses a pad row
1522 Float_t tnt = tracklet->GetTilt(); // tan tiltingangle
1523 TLinearFitter linearFitterTracklet(2,"pol1");
1524 linearFitterTracklet.StoreData(kTRUE);
1527 ///////////////////////////////////////////
1528 // Take the parameters of the track
1529 //////////////////////////////////////////
1530 // take now the snp, tnp and tgl from the track
1531 Double_t snp = tracklet->GetSnp(); // sin dy/dx at the end of the chamber
1532 Double_t tnp = 0.0; // dy/dx at the end of the chamber
1533 if( TMath::Abs(snp) < 1.){
1534 tnp = snp / TMath::Sqrt((1.-snp)*(1.+snp));
1536 Double_t tgl = tracklet->GetTgl(); // dz/dl
1537 Double_t dzdx = tgl*TMath::Sqrt(1+tnp*tnp); // dz/dx calculated from dz/dl
1539 //Double_t tnp = tracklet->GetYref(1); // dy/dx at the entrance of the chamber
1540 //Double_t tgl = tracklet->GetZref(1); // dz/dl at the entrance of the chamber
1541 //Double_t dzdx = tgl; //*TMath::Sqrt(1+tnp*tnp); // dz/dx from dz/dl
1542 // at the end with correction due to linear fit
1543 //Double_t tnp = tracklet->GetYfit(1); // dy/dx at the end of the chamber after fit correction
1544 //Double_t tgl = tracklet->GetZfit(1); // dz/dl at the end of the chamber after fit correction
1547 ////////////////////////////
1548 // loop over the clusters
1549 ////////////////////////////
1551 AliTRDcluster *cl = 0x0;
1552 //////////////////////////////
1553 // Check no shared clusters
1554 //////////////////////////////
1555 for(int icc=AliTRDseedV1::kNtb; icc<AliTRDseedV1::kNclusters; icc++){
1556 cl = tracklet->GetClusters(icc);
1557 if(cl) crossrow = 1;
1559 //////////////////////////////////
1561 //////////////////////////////////
1562 for(int ic=0; ic<AliTRDseedV1::kNtb; ic++){
1563 if(!(cl = tracklet->GetClusters(ic))) continue;
1564 //if((fLimitChargeIntegration) && (!cl->IsInChamber())) continue;
1566 Double_t ycluster = cl->GetY();
1567 Int_t time = cl->GetPadTime();
1568 Double_t timeis = time/10.0;
1569 //See if cross two pad rows
1570 Int_t row = cl->GetPadRow();
1571 if(rowp==-1) rowp = row;
1572 if(row != rowp) crossrow = 1;
1574 linearFitterTracklet.AddPoint(&timeis,ycluster,1);
1580 ////////////////////////////////////
1581 // Do the straight line fit now
1582 ///////////////////////////////////
1584 linearFitterTracklet.ClearPoints();
1588 linearFitterTracklet.Eval();
1589 linearFitterTracklet.GetParameters(pars);
1590 pointError = TMath::Sqrt(linearFitterTracklet.GetChisquare()/(nbli-2));
1592 //errorpar = linearFitterTracklet.GetParError(1)*pointError;
1594 //printf("chis %f, nbli %d, pointError %f, parError %f, errorpar %f\n",linearFitterTracklet->GetChisquare(),nbli,pointError,linearFitterTracklet->GetParError(1),errorpar);
1595 linearFitterTracklet.ClearPoints();
1597 /////////////////////////
1599 ////////////////////////
1601 if(nbclusters < fLow) return kFALSE;
1602 if(nbclusters > fHigh) return kFALSE;
1603 if(pointError >= 0.3) return kFALSE;
1604 if(crossrow == 1) return kTRUE;
1606 ///////////////////////
1608 //////////////////////
1611 //Add to the linear fitter of the detector
1612 if( TMath::Abs(snp) < 1.){
1613 Double_t x = tnp-dzdx*tnt;
1614 //if(!fLinearVdriftTest) printf("Not there\n");
1615 Double_t nbentries = fLinearVdriftTest->GetEntries();
1616 if(nbentries < (5.0*32767)) fLinearVdriftTest->Fill(x,dydt);