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),
124 fLinearVdriftTest(0),
128 fVdriftLinear(kTRUE),
130 fDebugLevelTRDCalibraFillHisto(0),
132 fNumberBinCharge(50),
133 fSelectTrigger(kTRUE),
134 fSelectedTrigger(new TObjArray()),
137 fRequirePrimaryVertex(kFALSE),
140 fMinNbContributors(0),
141 fRangePrimaryVertexZ(9999999.0),
143 fMaxNbTracks(999999999),
144 fCutWithVdriftCalib(kFALSE),
145 fMinNbTRDtracklets(0),
147 fScaleGainWithTPCSignal(kFALSE),
151 fNormalizeNbOfCluster(kFALSE),
155 fOfflineTracks(kFALSE),
156 fStandaloneTracks(kFALSE),
158 fVersionGainUsed(-1),
159 fSubVersionGainUsed(-1),
160 fFirstRunGainLocal(-1),
161 fVersionGainLocalUsed(-1),
162 fSubVersionGainLocalUsed(-1),
164 fVersionVdriftUsed(-1),
165 fSubVersionVdriftUsed(-1),
168 fSubVersionExBUsed(-1),
175 // Default constructor
187 // Define input and output slots here
188 // Input slot #0 works with a TChain
189 DefineInput(0, TChain::Class());
191 // Output slot #0 writes into a TList container
192 DefineOutput(1, TList::Class());
196 //____________________________________________________________________________________
197 AliTRDCalibTask::~AliTRDCalibTask()
200 // AliTRDCalibTask destructor
204 if(fNEvents) delete fNEvents;
205 if(fNEventsInput) delete fNEventsInput;
206 if(fNbTRDTrack) delete fNbTRDTrack;
207 if(fNbTRDTrackOffline) delete fNbTRDTrackOffline;
208 if(fNbTRDTrackStandalone) delete fNbTRDTrackStandalone;
209 if(fNbTPCTRDtrack) delete fNbTPCTRDtrack;
210 if(fNbGoodTracks) delete fNbGoodTracks;
211 if(fNbTimeBin) delete fNbTimeBin;
212 if(fNbTimeBinOffline) delete fNbTimeBinOffline;
213 if(fNbTimeBinStandalone) delete fNbTimeBinStandalone;
214 if(fNbClusters) delete fNbClusters;
215 if(fNbClustersOffline) delete fNbClustersOffline;
216 if(fNbClustersStandalone) delete fNbClustersStandalone;
217 if(fNbTracklets) delete fNbTracklets;
218 if(fNbTrackletsOffline) delete fNbTrackletsOffline;
219 if(fNbTrackletsStandalone) delete fNbTrackletsStandalone;
220 if(fAbsoluteGain) delete fAbsoluteGain;
221 if(fCH2dSum) delete fCH2dSum;
222 if(fPH2dSum) delete fPH2dSum;
223 if(fCH2dSM) delete fCH2dSM;
224 if(fPH2dSM) delete fPH2dSM;
225 if(fCH2dTest) delete fCH2dTest;
226 if(fPH2dTest) delete fPH2dTest;
227 if(fLinearVdriftTest) delete fLinearVdriftTest;
229 AliTRDdEdxCalibUtils::DeleteHistArray();
232 if(fCalDetGain) delete fCalDetGain;
234 if(fSelectedTrigger) {
235 fSelectedTrigger->Delete();
236 delete fSelectedTrigger;
239 delete fEsdTrackCuts;
242 if(fTRDChamberStatus) delete fTRDChamberStatus;
246 //________________________________________________________________________
247 void AliTRDCalibTask::UserCreateOutputObjects()
252 //cout << "AliTRDCalibTask::CreateOutputObjects() IN" << endl;
254 // Number of time bins
256 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
257 fNbTimeBins = cal->GetNumberOfTimeBinsDCS();
258 if(fNbTimeBins <= 0){
259 AliWarning(Form("No of TimeBins from DB [%d] use default [30]", fNbTimeBins));
265 fListHist = new TList();
266 fListHist->SetOwner();
268 // init chamber status
269 fTRDChamberStatus = new AliTRDCalibChamberStatus();
270 fTRDChamberStatus->Init();
271 fListHist->Add(fTRDChamberStatus->GetSparseI());
273 // instance calibration
274 fTRDCalibraFillHisto = AliTRDCalibraFillHisto::Instance();
276 fTRDCalibraFillHisto->SetNumberBinCharge(fNumberBinCharge); // set number of bin of the charge distribution
277 fTRDCalibraFillHisto->SetCutWithVdriftCalib(fCutWithVdriftCalib); // cut vdrift
278 fTRDCalibraFillHisto->SetMinNbTRDtracklets(fMinNbTRDtracklets); // min number of TRD tracklets
279 fTRDCalibraFillHisto->SetMinTRDMomentum(fMinTRDMomentum); // min TRD momentum
280 fTRDCalibraFillHisto->SetHisto2d(fHisto2d); // choose to use histograms
281 fTRDCalibraFillHisto->SetVector2d(fVector2d); // choose to use vectors
282 fTRDCalibraFillHisto->SetCH2dOn(); // choose to calibrate the gain
283 fTRDCalibraFillHisto->SetPH2dOn(); // choose to calibrate the drift velocity
284 fTRDCalibraFillHisto->SetPRF2dOn(); // choose to look at the PRF
285 fTRDCalibraFillHisto->SetLinearFitterOn(fVdriftLinear); // Other possibility vdrift VDRIFT
286 fTRDCalibraFillHisto->SetLinearFitterDebugOn(fVdriftLinear); // Other possibility vdrift
287 fTRDCalibraFillHisto->SetExbAltFitOn(fExbAlt); // Alternative method for exb
288 fTRDCalibraFillHisto->SetScaleWithTPCSignal(fScaleGainWithTPCSignal); // Scale Gain with TPC signal
289 for(Int_t k = 0; k < 3; k++){
290 if(((fNz[k] != 10) && (fNrphi[k] != 10)) && ((fNz[k] != 100) && (fNrphi[k] != 100))) {
291 fTRDCalibraFillHisto->SetNz(k,fNz[k]); // Mode calibration
292 fTRDCalibraFillHisto->SetNrphi(k,fNrphi[k]); // Mode calibration
295 if((fNz[k] == 100) && (fNrphi[k] == 100)) {
296 if(fVector2d) AliInfo("The mode all together is not supported by the vector method");
297 fTRDCalibraFillHisto->SetAllTogether(k);
299 if((fNz[k] == 10) && (fNrphi[k] == 10)) {
300 if(fVector2d) AliInfo("The mode per supermodule is not supported by the vector method");
301 fTRDCalibraFillHisto->SetPerSuperModule(k);
305 // Variables for how to fill
306 fTRDCalibraFillHisto->SetFillWithZero(fFillZero);
307 fTRDCalibraFillHisto->SetNormalizeNbOfCluster(fNormalizeNbOfCluster);
308 fTRDCalibraFillHisto->SetMaxCluster(fMaxCluster);
309 fTRDCalibraFillHisto->SetNbMaxCluster(fNbMaxCluster);
311 // Init with 30 timebins
312 fTRDCalibraFillHisto->Init2Dhistos(fNbTimeBins); // initialise the histos
313 fTRDCalibraFillHisto->SetNumberClusters(fLow); // At least 11 clusters
314 fTRDCalibraFillHisto->SetNumberClustersf(fHigh); // At least 11 clusters
317 fTRDCalibraFillHisto->SetDebugLevel(fDebugLevelTRDCalibraFillHisto); //debug stuff
320 fListHist->Add(fTRDCalibraFillHisto->GetCH2d());
321 fListHist->Add(fTRDCalibraFillHisto->GetPH2d());
322 fListHist->Add(fTRDCalibraFillHisto->GetPRF2d());
324 if(fVdriftLinear) fListHist->Add((TObject *)fTRDCalibraFillHisto->GetVdriftLinearFit());
325 if(fVector2d) fListHist->Add((TObject *) fTRDCalibraFillHisto->GetCalibraVector()); //calibra vector
326 if(fExbAlt) fListHist->Add((TObject *)fTRDCalibraFillHisto->GetExbAltFit());
328 fRelativeScale = fTRDCalibraFillHisto->GetRelativeScale(); // Get the relative scale for the gain
330 fNEvents = new TH1I(Form("NEvents_%s",(const char*)fName),"NEvents", 2, 0, 2);
331 fListHist->Add(fNEvents);
332 fNEventsInput = new TH1I(Form("NEventsInput_%s",(const char*)fName),"NEventsInput", 2, 0, 2);
333 fListHist->Add(fNEventsInput);
335 // absolute gain calibration even without AliESDfriend
337 Double_t minPt = 0.001;
338 Double_t maxPt = 10.0;
340 Double_t *binLimLogPt = new Double_t[nBinsPt+1];
341 Double_t *binLimPt = new Double_t[nBinsPt+1];
342 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 ;
343 for(Int_t i=0; i<=nBinsPt; i++) binLimPt[i]=(Double_t)TMath::Power(10,binLimLogPt[i]);
345 fAbsoluteGain = new TH2F(Form("AbsoluteGain_%s",(const char*)fName),"AbsoluteGain", 200, 0.0, 700.0, nBinsPt, binLimPt);
346 fAbsoluteGain->SetYTitle("Momentum at TRD");
347 fAbsoluteGain->SetXTitle("charge deposit [a.u]");
348 fAbsoluteGain->SetZTitle("counts");
349 fAbsoluteGain->SetStats(0);
350 fAbsoluteGain->Sumw2();
351 fListHist->Add(fAbsoluteGain);
354 printf("\n AliTRDCalibTask PHQ is on!! \n\n");
355 AliTRDdEdxBaseUtils::PrintControl();
356 AliTRDdEdxCalibUtils::IniHistArray(fListHist, kTRUE);
359 printf("\n AliTRDCalibTask PHQ is off!! \n\n");
362 /////////////////////////////////////////
364 ///////////////////////////////////////
367 fLinearVdriftTest = new TH2S(Form("LFDV0testversion_%s",(const char*)fName),"LFDV0testversion",36,-0.9,0.9,48,-1.2,1.2);
368 fLinearVdriftTest->SetXTitle("tan(phi_{track})");
369 fLinearVdriftTest->SetYTitle("dy/dt");
370 fLinearVdriftTest->SetZTitle("Number of tracklets");
371 fLinearVdriftTest->SetStats(0);
372 fLinearVdriftTest->SetDirectory(0);
374 // Standart with AliESDfriend
375 fPH2dTest = new TProfile2D(Form("PH2dTest_%s",(const char*)fName),"Nz0Nrphi0"
376 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
378 fPH2dTest->SetYTitle("Det/pad groups");
379 fPH2dTest->SetXTitle("time [#mus]");
380 fPH2dTest->SetZTitle("<PH> [a.u.]");
381 fPH2dTest->SetStats(0);
383 fCH2dTest = new TH2I(Form("CH2dTest_%s",(const char*)fName),"Nz0Nrphi0",50,0,300,540,0,540);
384 fCH2dTest->SetYTitle("Det/pad groups");
385 fCH2dTest->SetXTitle("charge deposit [a.u]");
386 fCH2dTest->SetZTitle("counts");
387 fCH2dTest->SetStats(0);
391 fPH2dSM = new TProfile2D(Form("PH2dSM_%s",(const char*)fName),"Nz10Nrphi10"
392 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
394 fPH2dSM->SetYTitle("Det/pad groups");
395 fPH2dSM->SetXTitle("time [#mus]");
396 fPH2dSM->SetZTitle("<PH> [a.u.]");
397 fPH2dSM->SetStats(0);
399 fCH2dSM = new TH2I(Form("CH2dSM_%s",(const char*)fName),"Nz10Nrphi10",50,0,300,18,0,18);
400 fCH2dSM->SetYTitle("Det/pad groups");
401 fCH2dSM->SetXTitle("charge deposit [a.u]");
402 fCH2dSM->SetZTitle("counts");
403 fCH2dSM->SetStats(0);
406 fPH2dSum = new TProfile2D(Form("PH2dSum_%s",(const char*)fName),"Nz100Nrphi100"
407 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
409 fPH2dSum->SetYTitle("Det/pad groups");
410 fPH2dSum->SetXTitle("time [#mus]");
411 fPH2dSum->SetZTitle("<PH> [a.u.]");
412 fPH2dSum->SetStats(0);
414 fCH2dSum = new TH2I(Form("CH2dSum_%s",(const char*)fName),"Nz100Nrphi100",50,0,300,1,0,1);
415 fCH2dSum->SetYTitle("Det/pad groups");
416 fCH2dSum->SetXTitle("charge deposit [a.u]");
417 fCH2dSum->SetZTitle("counts");
418 fCH2dSum->SetStats(0);
423 fListHist->Add(fLinearVdriftTest);
424 fListHist->Add(fPH2dTest);
425 fListHist->Add(fCH2dTest);
426 fListHist->Add(fPH2dSM);
427 fListHist->Add(fCH2dSM);
428 fListHist->Add(fPH2dSum);
429 fListHist->Add(fCH2dSum);
433 /////////////////////////////////////////
434 // Second debug level
435 ///////////////////////////////////////
438 fNbGoodTracks = new TH2F(Form("NbGoodTracks_%s",(const char*)fName),"NbGoodTracks",500,0.0,2500.0,200,0.0,100.0);
439 fNbGoodTracks->SetXTitle("Nb of good tracks");
440 fNbGoodTracks->SetYTitle("Centrality");
441 fNbGoodTracks->SetStats(0);
443 fNbTRDTrack = new TH1F(Form("TRDTrack_%s",(const char*)fName),"TRDTrack",50,0,50);
444 fNbTRDTrack->Sumw2();
445 fNbTRDTrackOffline = new TH1F(Form("TRDTrackOffline_%s",(const char*)fName),"TRDTrackOffline",50,0,50);
446 fNbTRDTrackOffline->Sumw2();
447 fNbTRDTrackStandalone = new TH1F(Form("TRDTrackStandalone_%s",(const char*)fName),"TRDTrackStandalone",50,0,50);
448 fNbTRDTrackStandalone->Sumw2();
449 fNbTPCTRDtrack = new TH2F(Form("NbTPCTRDtrack_%s",(const char*)fName),"NbTPCTRDtrack",100,0,100,100,0,100);
450 fNbTPCTRDtrack->Sumw2();
452 fNbTimeBin = new TH1F(Form("NbTimeBin_%s",(const char*)fName),"NbTimeBin",35,0,35);
454 fNbTimeBinOffline = new TH1F(Form("NbTimeBinOffline_%s",(const char*)fName),"NbTimeBinOffline",35,0,35);
455 fNbTimeBinOffline->Sumw2();
456 fNbTimeBinStandalone = new TH1F(Form("NbTimeBinStandalone_%s",(const char*)fName),"NbTimeBinStandalone",35,0,35);
457 fNbTimeBinStandalone->Sumw2();
459 fNbClusters = new TH1F(Form("NbClusters_%s",(const char*)fName),"",35,0,35);
460 fNbClusters->Sumw2();
461 fNbClustersOffline = new TH1F(Form("NbClustersOffline_%s",(const char*)fName),"",35,0,35);
462 fNbClustersOffline->Sumw2();
463 fNbClustersStandalone = new TH1F(Form("NbClustersStandalone_%s",(const char*)fName),"",35,0,35);
464 fNbClustersStandalone->Sumw2();
466 fNbTracklets = new TH1F(Form("NbTracklets_%s",(const char*)fName),"NbTracklets",540,0.,540.);
467 fNbTracklets->Sumw2();
468 fNbTrackletsOffline = new TH1F(Form("NbTrackletsOffline_%s",(const char*)fName),"NbTrackletsOffline",540,0.,540.);
469 fNbTrackletsOffline->Sumw2();
470 fNbTrackletsStandalone = new TH1F(Form("NbTrackletsStandalone_%s",(const char*)fName),"NbTrackletsStandalone",540,0.,540.);
471 fNbTrackletsStandalone->Sumw2();
473 fListHist->Add(fNbGoodTracks);
475 fListHist->Add(fNbTRDTrack);
476 fListHist->Add(fNbTRDTrackOffline);
477 fListHist->Add(fNbTRDTrackStandalone);
478 fListHist->Add(fNbTPCTRDtrack);
480 fListHist->Add(fNbTimeBin);
481 fListHist->Add(fNbTimeBinOffline);
482 fListHist->Add(fNbTimeBinStandalone);
483 fListHist->Add(fNbClusters);
484 fListHist->Add(fNbClustersOffline);
485 fListHist->Add(fNbClustersStandalone);
486 fListHist->Add(fNbTracklets);
487 fListHist->Add(fNbTrackletsOffline);
488 fListHist->Add(fNbTrackletsStandalone);
492 delete [] binLimLogPt;
495 PostData(1,fListHist);
497 //cout << "AliTRDCalibTask::UserCreateOutputObjects() OUT" << endl;
501 //________________________________________________________________________
502 void AliTRDCalibTask::UserExec(Option_t *)
505 // Filling of the histos
507 //cout << "AliTRDCalibTask::Exec() IN" << endl;
509 // Init Versions and subversions used
510 if((fFirstRunGain==-1) || (fVersionGainUsed==-1) || (fSubVersionGainUsed==-1) || (fFirstRunGainLocal==-1) || (fVersionGainLocalUsed==-1) || (fSubVersionGainLocalUsed==-1) || (fFirstRunVdrift==-1) || (fVersionVdriftUsed==-1) || (fSubVersionVdriftUsed==-1)) {
511 if(!SetVersionSubversion()) {
512 PostData(1, fListHist);
518 fTRDCalibraFillHisto->SetFirstRunGain(fFirstRunGain); // Gain Used
519 fTRDCalibraFillHisto->SetVersionGainUsed(fVersionGainUsed); // Gain Used
520 fTRDCalibraFillHisto->SetSubVersionGainUsed(fSubVersionGainUsed); // Gain Used
521 fTRDCalibraFillHisto->SetFirstRunGainLocal(fFirstRunGainLocal); // Gain Used
522 fTRDCalibraFillHisto->SetVersionGainLocalUsed(fVersionGainLocalUsed); // Gain Used
523 fTRDCalibraFillHisto->SetSubVersionGainLocalUsed(fSubVersionGainLocalUsed); // Gain Used
524 fTRDCalibraFillHisto->SetFirstRunVdrift(fFirstRunVdrift); // Vdrift Used
525 fTRDCalibraFillHisto->SetVersionVdriftUsed(fVersionVdriftUsed); // Vdrift Used
526 fTRDCalibraFillHisto->SetSubVersionVdriftUsed(fSubVersionVdriftUsed); // Vdrift Used
527 if((fFirstRunExB != -1) && (fVersionExBUsed != -1) && (fSubVersionExBUsed != -1)){
528 fTRDCalibraFillHisto->SetFirstRunExB(fFirstRunExB); // ExB Used
529 fTRDCalibraFillHisto->SetVersionExBUsed(fVersionExBUsed); // ExB Used
530 fTRDCalibraFillHisto->SetSubVersionExBUsed(fSubVersionExBUsed); // ExB Used
532 fTRDCalibraFillHisto->InitCalDet();
537 name += fVersionGainUsed;
539 name += fSubVersionGainUsed;
541 name += fFirstRunGain;
543 fCH2dTest->SetTitle(name);
545 TString namee("Ver");
546 namee += fVersionVdriftUsed;
548 namee += fSubVersionVdriftUsed;
550 namee += fFirstRunVdrift;
551 namee += "Nz0Nrphi0";
552 fPH2dTest->SetTitle(namee);
556 // AliLog::SetGlobalLogLevel(AliLog::kError);
557 // cout << "AliTRDCalibTask::Exec() 1" << endl;
558 fESD = dynamic_cast<AliESDEvent*>(fInputEvent);
560 AliError("ESD Event missing");
561 PostData(1, fListHist);
565 const char* type = fESD->GetBeamType();
568 //printf("Counter %d\n",fCounter);
571 fNEventsInput->Fill(1);
573 //cout << "maxEvent = " << fMaxEvent << endl;
574 //if(fCounter%100==0) cout << "fCounter = " << fCounter << endl;
575 if((fMaxEvent != 0) && (fMaxEvent < fCounter)) {
576 PostData(1, fListHist);
579 //if(fCounter%100==0) cout << "fCounter1 = " << fCounter << endl;
580 //cout << "event = " << fCounter << endl;
582 //printf("Counter %d\n",fCounter);
589 if (fSelectTrigger) {
591 //printf("Will check the triggers\n");
593 Int_t numberOfTriggerSelected = fSelectedTrigger->GetEntriesFast();
594 //printf("numberofTriggerSelected %d\n",numberOfTriggerSelected);
597 for(Int_t k = 0; k < numberOfTriggerSelected; k++){
598 const TObjString *const obString=(TObjString*)fSelectedTrigger->At(k);
599 const TString tString=obString->GetString();
600 if(fESD->IsTriggerClassFired((const char*)tString)) {
607 for(Int_t k = 0; k < numberOfTriggerSelected; k++){
608 const TObjString *const obString=(TObjString*)fSelectedTrigger->At(k);
609 const TString tString=obString->GetString();
610 if(fESD->IsTriggerClassFired((const char*)tString)) {
616 PostData(1, fListHist);
622 //printf("Class Fired %s\n",(const char*)fESD->GetFiredTriggerClasses());
623 //printf("Trigger passed\n");
625 ///////////////////////////////
626 // Require a primary vertex
627 //////////////////////////////
628 if(fRequirePrimaryVertex) {
629 const AliESDVertex* vtxESD = 0x0;
630 if (fVtxTPC) vtxESD = fESD->GetPrimaryVertexTPC() ;
631 else if (fVtxSPD) vtxESD = fESD->GetPrimaryVertexSPD() ;
632 else vtxESD = fESD->GetPrimaryVertexTracks() ;
634 PostData(1, fListHist);
637 Int_t nCtrb = vtxESD->GetNContributors();
638 if(nCtrb < fMinNbContributors) {
639 PostData(1, fListHist);
642 Double_t zPosition = vtxESD->GetZ();
643 if(TMath::Abs(zPosition) > fRangePrimaryVertexZ) {
644 PostData(1, fListHist);
650 //printf("Primary vertex passed\n");
652 //////////////////////////////////////
653 // Requirement on number of good tracks
654 //////////////////////////////////////
655 Int_t nGoodParticles = 0;
656 Double_t nbTracks = fESD->GetNumberOfTracks();
657 for(Int_t itrack = 0; itrack < nbTracks; itrack++) {
658 if(ParticleGood(itrack)) nGoodParticles++;
662 AliCentrality *esdCentrality = fESD->GetCentrality();
663 Float_t centrality = esdCentrality->GetCentralityPercentile("V0M");
664 //Float_t centralityb = esdCentrality->GetCentralityPercentile("CL1");
665 fNbGoodTracks->Fill(nGoodParticles,centrality);
666 //printf("centrality %f, centralityb %f\n",centrality,centralityb);
669 //printf("Beam type %s\n",(const char*)type);
670 if (!strstr(type,"p-p")) {
671 //if (strstr(type,"A-A")) {
672 //printf("Will check the number of good tracks %f %f %f\n",nGoodParticles,fMinNbTracks,fMaxNbTracks);
673 if((nGoodParticles < fMinNbTracks) || (nGoodParticles > fMaxNbTracks)) {
674 PostData(1, fListHist);
682 Int_t nbTrdTracks = 0;
684 Int_t nbTrdTracksStandalone = 0;
686 Int_t nbTrdTracksOffline = 0;
688 Int_t nbtrackTPC = 0;
692 if (nbTracks <= 0.0) {
695 fNbTRDTrack->Fill(nbTrdTracks);
696 fNbTRDTrackStandalone->Fill(nbTrdTracksStandalone);
697 fNbTRDTrackOffline->Fill(nbTrdTracksOffline);
699 PostData(1, fListHist);
704 fESDfriend = dynamic_cast<AliESDfriend*> (fESD->FindListObject("AliESDfriend"));
706 AliError("fESDfriend not available");
707 PostData(1, fListHist);
711 if(fESDfriend->TestSkipBit()) {
712 PostData(1, fListHist);
716 //printf("has friends\n");
718 /////////////////////////////////////
719 // Loop on AliESDtrack
720 ////////////////////////////////////
721 //printf("Nb of tracks %f\n",nbTracks);
722 for(int itrk=0; itrk < nbTracks; ++itrk){
725 fkEsdTrack = fESD->GetTrack(itrk);
726 if(!fkEsdTrack) continue;
727 ULong_t status = fkEsdTrack->GetStatus();
728 if(status&(AliESDtrack::kTPCout)) ++nbtrackTPC;
730 // Fix suggested by Alex
731 //fFriendTrack = fESDfriend->GetTrack(itrk);
732 fFriendTrack = (fESDfriend->GetNumberOfTracks()>itrk)?fESDfriend->GetTrack(itrk):NULL;
734 //printf("No friend track %d\n",itrk);
741 Bool_t standalonetrack = kFALSE;
742 Bool_t offlinetrack = kFALSE;
743 //ULong_t status = fkEsdTrack->GetStatus();
745 //////////////////////////////////////
746 // Loop on calibration objects
747 //////////////////////////////////////
750 while((fCalibObject = (TObject *)(fFriendTrack->GetCalibObject(icalib++)))){
751 //printf("Name %s\n",fCalibObject->IsA()->GetName());
752 if(strcmp(fCalibObject->IsA()->GetName(), "AliTRDtrackV1") != 0) continue;
753 //printf("Find the calibration object\n");
756 if((status&(AliESDtrack::kTRDout)) && (!(status&(AliESDtrack::kTRDin)))) {
757 standalonetrack = kTRUE;
759 if((status&(AliESDtrack::kTRDin))) {
760 offlinetrack = kTRUE;
767 else if(fStandaloneTracks){
768 if(!standalonetrack){
773 fTrdTrack = (AliTRDtrackV1 *)fCalibObject;
774 // process chamberstatus
775 fTRDChamberStatus->ProcessTrack(fTrdTrack);
778 // Quality cuts on the AliESDtrack
779 if((fEsdTrackCuts) && (!fEsdTrackCuts->IsSelected((AliVParticle *)fkEsdTrack))) {
780 //printf("Not a good track\n");
784 // First Absolute gain calibration
785 Int_t trdNTracklets = (Int_t) fkEsdTrack->GetTRDntracklets();
786 Int_t trdNTrackletsPID = (Int_t) fkEsdTrack->GetTRDntrackletsPID();
787 //printf("Number of trd tracklets %d and PID trd tracklets %d\n",trdNTracklets,trdNTrackletsPID);
788 if((trdNTracklets > 0) && (trdNTrackletsPID > 0)) {
789 for(Int_t iPlane = 0; iPlane < 6; ++iPlane){
790 //Double_t slide = fkEsdTrack->GetTRDslice(iPlane);
791 //printf("Number of slide %d\n",fkEsdTrack->GetNumberOfTRDslices());
792 //Double_t momentum = fkEsdTrack->GetTRDmomentum(iPlane);
793 //printf("momentum %f, slide %f\n",momentum,slide);
794 if(fkEsdTrack->GetTRDslice(iPlane) > 0.0)
795 fAbsoluteGain->Fill(fkEsdTrack->GetTRDslice(iPlane)*8.0/100.0,
796 fkEsdTrack->GetTRDmomentum(iPlane));
801 if(!fTrdTrack) continue;
803 if(good && fOnInstance) {
804 //cout << "good" << endl;
805 fTRDCalibraFillHisto->UpdateHistogramsV1(fTrdTrack,fkEsdTrack);
806 //printf("Fill fTRDCalibraFillHisto\n");
810 const Double_t mag = AliTRDdEdxBaseUtils::IsExBOn() ? fESD->GetMagneticField() : -1;
811 const Int_t charge = AliTRDdEdxBaseUtils::IsExBOn() ? fkEsdTrack->Charge() : -1;
812 const Double_t toTPCscale = AliTRDdEdxCalibUtils::GetCalibTPCscale(fkEsdTrack->GetTPCncls(), fkEsdTrack->GetTPCsignal());
814 AliTRDdEdxCalibUtils::FillHist(fTrdTrack, 0, mag, charge, toTPCscale);
818 //////////////////////////////////
820 ////////////////////////////////
824 //printf("Enter debug\n");
826 Int_t nbtracklets = 0;
829 Bool_t standalonetracklet = kFALSE;
830 const AliTRDseedV1 *tracklet = 0x0;
831 //////////////////////////////////////
833 /////////////////////////////////////
835 Double_t phtb[AliTRDseedV1::kNtb];
836 memset(phtb, 0, AliTRDseedV1::kNtb*sizeof(Double_t));
838 Float_t normalisation = 1.13;
841 for(Int_t itr = 0; itr < 6; ++itr){
843 if(!(tracklet = fTrdTrack->GetTracklet(itr))) continue;
844 if(!tracklet->IsOK()) continue;
846 standalonetracklet = kFALSE;
847 if(tracklet->IsStandAlone()) standalonetracklet = kTRUE;
850 memset(phtb, 0, AliTRDseedV1::kNtb*sizeof(Double_t));
854 //Int_t crossrow = 0;
856 // Check no shared clusters
857 //for(int icc=AliTRDseedV1::kNtb; icc<AliTRDseedV1::kNclusters; icc++){
858 // if((fcl = tracklet->GetClusters(icc))) crossrow = 1;
865 for(int ic=0; ic<AliTRDseedV1::kNtb; ++ic){
867 if(!(fCl = tracklet->GetClusters(ic))) continue;
869 time = fCl->GetPadTime();
870 //ch = tracklet->GetdQdl(ic);
871 ch = tracklet->GetQperTB(ic);
872 qcl = TMath::Abs(fCl->GetQ());
873 detector = fCl->GetDetector();
874 // Add the charge if shared cluster
875 if((ic+AliTRDseedV1::kNtb) < AliTRDseedV1::kNclusters) {
876 if((fCl = tracklet->GetClusters(ic+AliTRDseedV1::kNtb))) {
877 qcl += TMath::Abs(fCl->GetQ());
878 //printf("Add the cluster charge\n");
881 if((time>-1) && (time<fNbTimeBins)) phtb[time]=qcl;
882 if((fCalDetGain) && (fCalDetGain->GetValue(detector) > 0.0)) sum += ch*fCalDetGain->GetValue(detector)/normalisation;
883 else sum += ch/normalisation;
886 fNbTimeBin->Fill(time);
887 if(tracklet->IsStandAlone()) fNbTimeBinStandalone->Fill(time);
888 else fNbTimeBinOffline->Fill(time);
891 sector = AliTRDgeometry::GetSector(detector);
894 fNbTracklets->Fill(detector);
895 if(tracklet->IsStandAlone()) fNbTrackletsStandalone->Fill(detector);
896 else fNbTrackletsOffline->Fill(detector);
898 fNbClusters->Fill(nbclusters);
899 if(tracklet->IsStandAlone()) fNbClustersStandalone->Fill(nbclusters);
900 else fNbClustersOffline->Fill(nbclusters);
903 if((nbclusters > fLow) && (nbclusters < fHigh)){
904 if(fRelativeScale > 0.0) sum = sum/fRelativeScale;
905 fCH2dTest->Fill(sum,detector+0.5);
906 fCH2dSM->Fill(sum,sector+0.5);
907 fCH2dSum->Fill(sum,0.5);
908 Bool_t checknoise = kTRUE;
909 if(fMaxCluster > 0) {
910 if(phtb[0] > fMaxCluster) checknoise = kFALSE;
911 if(fNbTimeBins > fNbMaxCluster) {
912 for(Int_t k = (fNbTimeBins-fNbMaxCluster); k < fNbTimeBins; k++){
913 if(phtb[k] > fMaxCluster) checknoise = kFALSE;
918 for(int ic=0; ic<fNbTimeBins; ic++){
920 fPH2dTest->Fill((Double_t)(ic/10.0),detector+0.5,(Double_t)phtb[ic]);
921 fPH2dSum->Fill((Double_t)(ic/10.0),0.5,(Double_t)phtb[ic]);
922 fPH2dSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[ic]);
926 fPH2dTest->Fill((Double_t)(ic/10.0),detector+0.5,(Double_t)phtb[ic]);
927 fPH2dSum->Fill((Double_t)(ic/10.0),0.0,(Double_t)phtb[ic]);
928 fPH2dSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[ic]);
934 if(detector == 0) FindP1TrackPHtrackletV1Test(tracklet,nbclusters);
936 } // loop on tracklets
941 if(nTRDtrackV1 > 0) {
943 if((status&(AliESDtrack::kTRDout)) && (!(status&(AliESDtrack::kTRDin)))) {
944 ++nbTrdTracksStandalone;
946 if((status&(AliESDtrack::kTRDin))) {
947 ++nbTrdTracksOffline;
950 //delete fFriendTrack;
954 fNbTRDTrack->Fill(nbTrdTracks);
955 fNbTRDTrackStandalone->Fill(nbTrdTracksStandalone);
956 fNbTRDTrackOffline->Fill(nbTrdTracksOffline);
957 fNbTPCTRDtrack->Fill(nbTrdTracks,nbtrackTPC);
961 PostData(1, fListHist);
962 //cout << "AliTRDCalibTask::Exec() OUT" << endl;
965 //________________________________________________________________________
966 void AliTRDCalibTask::Terminate(Option_t *)
972 if(fTRDCalibraFillHisto) fTRDCalibraFillHisto->DestroyDebugStreamer();
976 //_______________________________________________________
977 Bool_t AliTRDCalibTask::Load(const Char_t *filename)
980 // Generic container loader
983 if(!TFile::Open(filename)){
984 //AliWarning(Form("Couldn't open file %s.", filename));
988 if(!(o = (TList*)gFile->Get(GetName()))){
989 //AliWarning("Missing histogram container.");
992 fListHist = (TList*)o->Clone(GetName());
996 //_______________________________________________________
997 Bool_t AliTRDCalibTask::Load(TList *lister)
1000 // Generic container loader
1003 fListHist = (TList*)lister->Clone(GetName());
1006 //_______________________________________________________________________________________
1007 void AliTRDCalibTask::AddTask(const AliTRDCalibTask * calibTask) {
1013 TList *listcalibTask = calibTask->GetList();
1014 if(!listcalibTask) return;
1016 THnSparseI *histoEntries = (THnSparseI *) listcalibTask->FindObject("NumberOfEntries");
1018 TH1I *nEvents = (TH1I *) listcalibTask->FindObject(Form("NEvents_%s",(const char*)calibTask->GetName()));
1019 TH1I *nEventsInput = (TH1I *) listcalibTask->FindObject(Form("NEventsInput_%s",(const char*)calibTask->GetName()));
1020 TH2F *absoluteGain = (TH2F *) listcalibTask->FindObject(Form("AbsoluteGain_%s",(const char*)calibTask->GetName()));
1022 TH1F *trdTrack = (TH1F *) listcalibTask->FindObject(Form("TRDTrack_%s",(const char*)calibTask->GetName()));
1023 TH1F *trdTrackOffline = (TH1F *) listcalibTask->FindObject(Form("TRDTrackOffline_%s",(const char*)calibTask->GetName()));
1024 TH1F *trdTrackStandalone = (TH1F *) listcalibTask->FindObject(Form("TRDTrackStandalone_%s",(const char*)calibTask->GetName()));
1026 TH2F *tpctrdTrack = (TH2F *) listcalibTask->FindObject(Form("NbTPCTRDtrack_%s",(const char*)calibTask->GetName()));
1028 TH1F *nbTimeBin = (TH1F *) listcalibTask->FindObject(Form("NbTimeBin_%s",(const char*)calibTask->GetName()));
1029 TH1F *nbTimeBinOffline = (TH1F *) listcalibTask->FindObject(Form("NbTimeBinOffline_%s",(const char*)calibTask->GetName()));
1030 TH1F *nbTimeBinStandalone = (TH1F *) listcalibTask->FindObject(Form("NbTimeBinStandalone_%s",(const char*)calibTask->GetName()));
1032 TH1F *nbClusters = (TH1F *) listcalibTask->FindObject(Form("NbClusters_%s",(const char*)calibTask->GetName()));
1033 TH1F *nbClustersOffline = (TH1F *) listcalibTask->FindObject(Form("NbClustersOffline_%s",(const char*)calibTask->GetName()));
1034 TH1F *nbClustersStandalone = (TH1F *) listcalibTask->FindObject(Form("NbClustersStandalone_%s",(const char*)calibTask->GetName()));
1036 TH1F *nbTracklets = (TH1F *) listcalibTask->FindObject(Form("NbTracklets_%s",(const char*)calibTask->GetName()));
1037 TH1F *nbTrackletsOffline = (TH1F *) listcalibTask->FindObject(Form("NbTrackletsOffline_%s",(const char*)calibTask->GetName()));
1038 TH1F *nbTrackletsStandalone = (TH1F *) listcalibTask->FindObject(Form("NbTrackletsStandalone_%s",(const char*)calibTask->GetName()));
1040 TH2I *ch2d = (TH2I *) listcalibTask->FindObject("CH2d");
1041 TProfile2D *ph2d = (TProfile2D *) listcalibTask->FindObject("PH2d");
1042 TProfile2D *prf2d = (TProfile2D *) listcalibTask->FindObject("PRF2d");
1044 TH2I *ch2dSum = (TH2I *) listcalibTask->FindObject(Form("CH2dSum_%s",(const char*)calibTask->GetName()));
1045 TProfile2D *ph2dSum = (TProfile2D *) listcalibTask->FindObject(Form("PH2dSum_%s",(const char*)calibTask->GetName()));
1047 TH2I *ch2dSM = (TH2I *) listcalibTask->FindObject(Form("CH2dSM_%s",(const char*)calibTask->GetName()));
1048 TProfile2D *ph2dSM = (TProfile2D *) listcalibTask->FindObject(Form("PH2dSM_%s",(const char*)calibTask->GetName()));
1050 AliTRDCalibraVdriftLinearFit *linearfit = (AliTRDCalibraVdriftLinearFit *) listcalibTask->FindObject("AliTRDCalibraVdriftLinearFit");
1051 AliTRDCalibraExbAltFit *exbaltfit = (AliTRDCalibraExbAltFit *) listcalibTask->FindObject("AliTRDCalibraExbAltFit");
1052 AliTRDCalibraVector *calibraVector = (AliTRDCalibraVector *) listcalibTask->FindObject("AliTRDCalibraVector");
1056 THnSparseI *inhistoEntries = (THnSparseI *) fListHist->FindObject("NumberOfEntries");
1058 TH1I *inEventsInput = (TH1I *) fListHist->FindObject(Form("NEventsInput_%s",(const char*)fName));
1059 TH1I *inEvents = (TH1I *) fListHist->FindObject(Form("NEvents_%s",(const char*)fName));
1060 TH2F *iabsoluteGain = (TH2F *) fListHist->FindObject(Form("AbsoluteGain_%s",(const char*)fName));
1062 TH1F *itrdTrack = (TH1F *) fListHist->FindObject(Form("TRDTrack_%s",(const char*)fName));
1063 TH1F *itrdTrackOffline = (TH1F *) fListHist->FindObject(Form("TRDTrackOffline_%s",(const char*)fName));
1064 TH1F *itrdTrackStandalone = (TH1F *) fListHist->FindObject(Form("TRDTrackStandalone_%s",(const char*)fName));
1066 TH2F *itpctrdTrack = (TH2F *) fListHist->FindObject(Form("NbTPCTRDtrack_%s",(const char*)fName));
1068 TH1F *inbTimeBin = (TH1F *) fListHist->FindObject(Form("NbTimeBin_%s",(const char*)fName));
1069 TH1F *inbTimeBinOffline = (TH1F *) fListHist->FindObject(Form("NbTimeBinOffline_%s",(const char*)fName));
1070 TH1F *inbTimeBinStandalone = (TH1F *) fListHist->FindObject(Form("NbTimeBinStandalone_%s",(const char*)fName));
1072 TH1F *inbClusters = (TH1F *) fListHist->FindObject(Form("NbClusters_%s",(const char*)fName));
1073 TH1F *inbClustersOffline = (TH1F *) fListHist->FindObject(Form("NbClustersOffline_%s",(const char*)fName));
1074 TH1F *inbClustersStandalone = (TH1F *) fListHist->FindObject(Form("NbClustersStandalone_%s",(const char*)fName));
1076 TH1F *inbTracklets = (TH1F *) fListHist->FindObject(Form("NbTracklets_%s",(const char*)fName));
1077 TH1F *inbTrackletsOffline = (TH1F *) fListHist->FindObject(Form("NbTrackletsOffline_%s",(const char*)fName));
1078 TH1F *inbTrackletsStandalone = (TH1F *) fListHist->FindObject(Form("NbTrackletsStandalone_%s",(const char*)fName));
1080 TH2I *ich2d = (TH2I *) fListHist->FindObject("CH2d");
1081 TProfile2D *iph2d = (TProfile2D *) fListHist->FindObject("PH2d");
1082 TProfile2D *iprf2d = (TProfile2D *) fListHist->FindObject("PRF2d");
1084 TH2I *ich2dSum = (TH2I *) fListHist->FindObject(Form("CH2dSum_%s",(const char*)fName));
1085 TProfile2D *iph2dSum = (TProfile2D *) fListHist->FindObject(Form("PH2dSum_%s",(const char*)fName));
1087 TH2I *ich2dSM = (TH2I *) fListHist->FindObject(Form("CH2dSM_%s",(const char*)fName));
1088 TProfile2D *iph2dSM = (TProfile2D *) fListHist->FindObject(Form("PH2dSM_%s",(const char*)fName));
1090 AliTRDCalibraVdriftLinearFit *ilinearfit = (AliTRDCalibraVdriftLinearFit *) fListHist->FindObject("AliTRDCalibraVdriftLinearFit");
1091 AliTRDCalibraExbAltFit *iexbaltfit = (AliTRDCalibraExbAltFit *) fListHist->FindObject("AliTRDCalibraExbAltFit");
1092 AliTRDCalibraVector *icalibraVector = (AliTRDCalibraVector *) fListHist->FindObject("AliTRDCalibraVector");
1098 if(inhistoEntries) {
1099 inhistoEntries->Add(histoEntries);
1100 //printf("Add Events\n");
1103 //printf("Create new Events\n");
1104 inhistoEntries = (THnSparseI *) histoEntries->Clone();
1105 fListHist->Add(inhistoEntries);
1111 inEventsInput->Add(nEventsInput);
1112 //printf("Add Events\n");
1115 //printf("Create new Events\n");
1116 inEventsInput = new TH1I(*nEventsInput);
1117 fListHist->Add(inEventsInput);
1123 inEvents->Add(nEvents);
1124 //printf("Add Events\n");
1127 //printf("Create new Events\n");
1128 inEvents = new TH1I(*nEvents);
1129 fListHist->Add(inEvents);
1134 if(iabsoluteGain) iabsoluteGain->Add(absoluteGain);
1136 iabsoluteGain = new TH2F(*absoluteGain);
1137 fListHist->Add(iabsoluteGain);
1142 if(itrdTrack) itrdTrack->Add(trdTrack);
1144 itrdTrack = new TH1F(*trdTrack);
1145 fListHist->Add(itrdTrack);
1149 if(trdTrackOffline) {
1150 if(itrdTrackOffline) itrdTrackOffline->Add(trdTrackOffline);
1152 itrdTrackOffline = new TH1F(*trdTrackOffline);
1153 fListHist->Add(itrdTrackOffline);
1157 if(trdTrackStandalone) {
1158 if(itrdTrackStandalone) itrdTrackStandalone->Add(trdTrackStandalone);
1160 itrdTrackStandalone = new TH1F(*trdTrackStandalone);
1161 fListHist->Add(itrdTrackStandalone);
1166 if(itpctrdTrack) itpctrdTrack->Add(tpctrdTrack);
1168 itpctrdTrack = new TH2F(*tpctrdTrack);
1169 fListHist->Add(itpctrdTrack);
1174 if(inbTimeBin) inbTimeBin->Add(nbTimeBin);
1176 inbTimeBin = new TH1F(*inbTimeBin);
1177 fListHist->Add(inbTimeBin);
1181 if(nbTimeBinOffline) {
1182 if(inbTimeBinOffline) inbTimeBinOffline->Add(nbTimeBinOffline);
1184 inbTimeBinOffline = new TH1F(*nbTimeBinOffline);
1185 fListHist->Add(inbTimeBinOffline);
1189 if(nbTimeBinStandalone) {
1190 if(inbTimeBinStandalone) inbTimeBinStandalone->Add(nbTimeBinStandalone);
1192 inbTimeBinStandalone = new TH1F(*nbTimeBinStandalone);
1193 fListHist->Add(inbTimeBinStandalone);
1198 if(inbClusters) inbClusters->Add(nbClusters);
1200 inbClusters = new TH1F(*nbClusters);
1201 fListHist->Add(inbClusters);
1205 if(nbClustersOffline) {
1206 if(inbClustersOffline) inbClustersOffline->Add(nbClustersOffline);
1208 inbClustersOffline = new TH1F(*nbClustersOffline);
1209 fListHist->Add(inbClustersOffline);
1213 if(nbClustersStandalone) {
1214 if(inbClustersStandalone) inbClustersStandalone->Add(nbClustersStandalone);
1216 inbClustersStandalone = new TH1F(*nbClustersStandalone);
1217 fListHist->Add(inbClustersStandalone);
1222 if(inbTracklets) inbTracklets->Add(nbTracklets);
1224 inbTracklets = new TH1F(*nbTracklets);
1225 fListHist->Add(inbTracklets);
1229 if(nbTrackletsOffline) {
1230 if(inbTrackletsOffline) inbTrackletsOffline->Add(nbTrackletsOffline);
1232 inbTrackletsOffline = new TH1F(*nbTrackletsOffline);
1233 fListHist->Add(inbTrackletsOffline);
1237 if(nbTrackletsStandalone) {
1238 if(inbTrackletsStandalone) inbTrackletsStandalone->Add(nbTrackletsStandalone);
1240 inbTrackletsStandalone = new TH1F(*nbTrackletsStandalone);
1241 fListHist->Add(inbTrackletsStandalone);
1246 if(ich2d) ich2d->Add(ch2d);
1248 ich2d = new TH2I(*ch2d);
1249 fListHist->Add(ich2d);
1254 if(iph2d) iph2d->Add(ph2d);
1256 iph2d = new TProfile2D(*ph2d);
1257 fListHist->Add(iph2d);
1262 if(iprf2d) iprf2d->Add(prf2d);
1264 iprf2d = new TProfile2D(*prf2d);
1265 fListHist->Add(iprf2d);
1270 if(ich2dSum) ich2dSum->Add(ch2dSum);
1272 ich2dSum = new TH2I(*ch2dSum);
1273 fListHist->Add(ich2dSum);
1278 if(iph2dSum) iph2dSum->Add(ph2dSum);
1280 iph2dSum = new TProfile2D(*ph2dSum);
1281 fListHist->Add(iph2dSum);
1286 if(ich2dSM) ich2dSM->Add(ch2dSM);
1288 ich2dSM = new TH2I(*ch2dSM);
1289 fListHist->Add(ich2dSM);
1294 if(iph2dSM) iph2dSM->Add(ph2dSM);
1296 iph2dSM = new TProfile2D(*ph2dSM);
1297 fListHist->Add(iph2dSM);
1302 if(ilinearfit) ilinearfit->Add(linearfit);
1304 ilinearfit = new AliTRDCalibraVdriftLinearFit(*linearfit);
1305 fListHist->Add(ilinearfit);
1310 if(iexbaltfit) iexbaltfit->Add(exbaltfit);
1312 iexbaltfit = new AliTRDCalibraExbAltFit(*exbaltfit);
1313 fListHist->Add(iexbaltfit);
1318 if(icalibraVector) icalibraVector->Add(calibraVector);
1320 icalibraVector = new AliTRDCalibraVector(*calibraVector);
1321 fListHist->Add(icalibraVector);
1326 //________________________________________________________________________________
1327 Long64_t AliTRDCalibTask::Merge(TCollection *li) {
1333 TIterator* iter = li->MakeIterator();
1334 AliTRDCalibTask* cal = 0;
1336 while ((cal = (AliTRDCalibTask*)iter->Next())) {
1337 if (!cal->InheritsFrom(AliTRDCalibTask::Class())) {
1338 Error("Merge","Attempt to add object of class %s to a %s", cal->ClassName(), this->ClassName());
1342 // add histograms here...
1350 //_____________________________________________________
1351 Bool_t AliTRDCalibTask::SetVersionSubversion(){
1353 // Load Chamber Gain factors into the Tender supply
1356 //printf("SetVersionSubversion\n");
1358 //find previous entry from the UserInfo
1359 TTree *tree=((TChain*)GetInputData(0))->GetTree();
1361 AliError("Tree not found in ESDhandler");
1365 TList *userInfo=(TList*)tree->GetUserInfo();
1367 AliError("No UserInfo found in tree");
1371 TList *cdbList=(TList*)userInfo->FindObject("cdbList");
1373 AliError("No cdbList found in UserInfo");
1374 if (AliLog::GetGlobalLogLevel()>=AliLog::kError) userInfo->Print();
1378 TIter nextCDB(cdbList);
1380 while ( (os=(TObjString*)nextCDB()) ){
1381 if(os->GetString().Contains("TRD/Calib/ChamberGainFactor")){
1382 // Get Old gain calibration
1383 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1384 fFirstRunGain = id->GetFirstRun();
1385 fVersionGainUsed = id->GetVersion();
1386 fSubVersionGainUsed = id->GetSubVersion();
1387 } else if(os->GetString().Contains("TRD/Calib/ChamberVdrift")){
1388 // Get Old drift velocity calibration
1389 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1390 fFirstRunVdrift = id->GetFirstRun();
1391 fVersionVdriftUsed = id->GetVersion();
1392 fSubVersionVdriftUsed = id->GetSubVersion();
1393 } else if(os->GetString().Contains("TRD/Calib/LocalGainFactor")){
1394 // Get Old drift velocity calibration
1395 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1396 fFirstRunGainLocal = id->GetFirstRun();
1397 fVersionGainLocalUsed = id->GetVersion();
1398 fSubVersionGainLocalUsed = id->GetSubVersion();
1399 } else if((os->GetString().Contains("TRD/Calib/ChamberExB")) && (!os->GetString().Contains("TRD/Calib/ChamberExBAlt"))){
1400 // Get Old drift velocity calibration
1401 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1402 fFirstRunExB = id->GetFirstRun();
1403 fVersionExBUsed = id->GetVersion();
1404 fSubVersionExBUsed = id->GetSubVersion();
1405 //printf("Version %d and subversion %d\n",fVersionExBUsed,fSubVersionExBUsed);
1409 //printf("VersionGain %d, SubversionGain %d, VersionLocalGain %d, Subversionlocalgain %d, Versionvdrift %d, Subversionvdrift %d\n",fVersionGainUsed,fSubVersionGainUsed,fVersionGainLocalUsed,fSubVersionGainLocalUsed,fVersionVdriftUsed,fSubVersionVdriftUsed);
1412 if((fFirstRunGain < 0) ||
1413 (fFirstRunGainLocal < 0) ||
1414 (fFirstRunVdrift < 0) ||
1415 (fVersionGainUsed < 0) ||
1416 (fVersionGainLocalUsed < 0) ||
1417 (fSubVersionGainUsed < 0) ||
1418 (fSubVersionGainLocalUsed < 0) ||
1419 (fVersionVdriftUsed < 0) ||
1420 (fSubVersionVdriftUsed < 0)) {
1421 AliError("No recent calibration found");
1427 //_________________________________________________________________________________________________________________________
1428 Bool_t AliTRDCalibTask::ParticleGood(int i) const {
1431 // Definition of good tracks
1435 AliESDtrack *track = fESD->GetTrack(i);
1436 if (!track->IsOn(AliESDtrack::kTPCrefit)) return 0; // TPC refit
1437 if (track->GetTPCNcls() < 90) return 0; // number of TPC clusters
1438 if (fabs(track->Eta())>0.8) return 0; // fiducial pseudorapidity
1440 track->GetImpactParametersTPC(r,z);
1441 if (fabs(z)>2.0) return 0; // impact parameter in z
1442 if (fabs(r)>2.0) return 0; // impact parameter in xy
1448 //______________________________________________________________________________________________________________________
1449 Bool_t AliTRDCalibTask::FindP1TrackPHtrackletV1Test(const AliTRDseedV1 *tracklet, Int_t nbclusters)
1452 // Drift velocity calibration:
1453 // Fit the clusters with a straight line
1454 // From the slope find the drift velocity
1457 ////////////////////////////////////////////////
1458 //Number of points: if less than 3 return kFALSE
1459 /////////////////////////////////////////////////
1460 if(nbclusters <= 2) return kFALSE;
1465 // results of the linear fit
1466 Double_t dydt = 0.0; // dydt tracklet after straight line fit
1467 Double_t errorpar = 0.0; // error after straight line fit on dy/dt
1468 Double_t pointError = 0.0; // error after straight line fit
1469 // pad row problemes: avoid tracklet that cross pad rows, tilting angle in the constant
1470 Int_t crossrow = 0; // if it crosses a pad row
1471 Int_t rowp = -1; // if it crosses a pad row
1472 Float_t tnt = tracklet->GetTilt(); // tan tiltingangle
1473 TLinearFitter linearFitterTracklet(2,"pol1");
1474 linearFitterTracklet.StoreData(kTRUE);
1477 ///////////////////////////////////////////
1478 // Take the parameters of the track
1479 //////////////////////////////////////////
1480 // take now the snp, tnp and tgl from the track
1481 Double_t snp = tracklet->GetSnp(); // sin dy/dx at the end of the chamber
1482 Double_t tnp = 0.0; // dy/dx at the end of the chamber
1483 if( TMath::Abs(snp) < 1.){
1484 tnp = snp / TMath::Sqrt((1.-snp)*(1.+snp));
1486 Double_t tgl = tracklet->GetTgl(); // dz/dl
1487 Double_t dzdx = tgl*TMath::Sqrt(1+tnp*tnp); // dz/dx calculated from dz/dl
1489 //Double_t tnp = tracklet->GetYref(1); // dy/dx at the entrance of the chamber
1490 //Double_t tgl = tracklet->GetZref(1); // dz/dl at the entrance of the chamber
1491 //Double_t dzdx = tgl; //*TMath::Sqrt(1+tnp*tnp); // dz/dx from dz/dl
1492 // at the end with correction due to linear fit
1493 //Double_t tnp = tracklet->GetYfit(1); // dy/dx at the end of the chamber after fit correction
1494 //Double_t tgl = tracklet->GetZfit(1); // dz/dl at the end of the chamber after fit correction
1497 ////////////////////////////
1498 // loop over the clusters
1499 ////////////////////////////
1501 AliTRDcluster *cl = 0x0;
1502 //////////////////////////////
1503 // Check no shared clusters
1504 //////////////////////////////
1505 for(int icc=AliTRDseedV1::kNtb; icc<AliTRDseedV1::kNclusters; icc++){
1506 cl = tracklet->GetClusters(icc);
1507 if(cl) crossrow = 1;
1509 //////////////////////////////////
1511 //////////////////////////////////
1512 for(int ic=0; ic<AliTRDseedV1::kNtb; ic++){
1513 if(!(cl = tracklet->GetClusters(ic))) continue;
1514 //if((fLimitChargeIntegration) && (!cl->IsInChamber())) continue;
1516 Double_t ycluster = cl->GetY();
1517 Int_t time = cl->GetPadTime();
1518 Double_t timeis = time/10.0;
1519 //See if cross two pad rows
1520 Int_t row = cl->GetPadRow();
1521 if(rowp==-1) rowp = row;
1522 if(row != rowp) crossrow = 1;
1524 linearFitterTracklet.AddPoint(&timeis,ycluster,1);
1530 ////////////////////////////////////
1531 // Do the straight line fit now
1532 ///////////////////////////////////
1534 linearFitterTracklet.ClearPoints();
1538 linearFitterTracklet.Eval();
1539 linearFitterTracklet.GetParameters(pars);
1540 pointError = TMath::Sqrt(linearFitterTracklet.GetChisquare()/(nbli-2));
1541 errorpar = linearFitterTracklet.GetParError(1)*pointError;
1543 //printf("chis %f, nbli %d, pointError %f, parError %f, errorpar %f\n",linearFitterTracklet->GetChisquare(),nbli,pointError,linearFitterTracklet->GetParError(1),errorpar);
1544 linearFitterTracklet.ClearPoints();
1546 /////////////////////////
1548 ////////////////////////
1550 if(nbclusters < fLow) return kFALSE;
1551 if(nbclusters > fHigh) return kFALSE;
1552 if(pointError >= 0.3) return kFALSE;
1553 if(crossrow == 1) return kTRUE;
1555 ///////////////////////
1557 //////////////////////
1560 //Add to the linear fitter of the detector
1561 if( TMath::Abs(snp) < 1.){
1562 Double_t x = tnp-dzdx*tnt;
1563 //if(!fLinearVdriftTest) printf("Not there\n");
1564 Double_t nbentries = fLinearVdriftTest->GetEntries();
1565 if(nbentries < (5.0*32767)) fLinearVdriftTest->Fill(x,dydt);