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 Int_t nbTracksfriends = fESDfriend->GetNumberOfTracks();
723 for(int itrk=0; itrk < nbTracksfriends; ++itrk){
726 fkEsdTrack = fESD->GetTrack(itrk);
727 if(!fkEsdTrack) continue;
728 ULong_t status = fkEsdTrack->GetStatus();
729 if(status&(AliESDtrack::kTPCout)) ++nbtrackTPC;
731 // Fix suggested by Alex
732 fFriendTrack = fESDfriend->GetTrack(itrk);
733 //printf("itrk %d\n",itrk);
734 //fFriendTrack = (fESDfriend->GetNumberOfTracks()>itrk)?fESDfriend->GetTrack(itrk):NULL;
736 //printf("No friend track %d\n",itrk);
743 Bool_t standalonetrack = kFALSE;
744 Bool_t offlinetrack = kFALSE;
745 //ULong_t status = fkEsdTrack->GetStatus();
747 //////////////////////////////////////
748 // Loop on calibration objects
749 //////////////////////////////////////
752 while((fCalibObject = (TObject *)(fFriendTrack->GetCalibObject(icalib++)))){
753 //printf("Name %s\n",fCalibObject->IsA()->GetName());
754 if(strcmp(fCalibObject->IsA()->GetName(), "AliTRDtrackV1") != 0) continue;
755 //printf("Find the calibration object\n");
758 if((status&(AliESDtrack::kTRDout)) && (!(status&(AliESDtrack::kTRDin)))) {
759 standalonetrack = kTRUE;
761 if((status&(AliESDtrack::kTRDin))) {
762 offlinetrack = kTRUE;
769 else if(fStandaloneTracks){
770 if(!standalonetrack){
775 fTrdTrack = (AliTRDtrackV1 *)fCalibObject;
776 // process chamberstatus
777 fTRDChamberStatus->ProcessTrack(fTrdTrack);
780 // Quality cuts on the AliESDtrack
781 if((fEsdTrackCuts) && (!fEsdTrackCuts->IsSelected((AliVParticle *)fkEsdTrack))) {
782 //printf("Not a good track\n");
786 // First Absolute gain calibration
787 Int_t trdNTracklets = (Int_t) fkEsdTrack->GetTRDntracklets();
788 Int_t trdNTrackletsPID = (Int_t) fkEsdTrack->GetTRDntrackletsPID();
789 //printf("Number of trd tracklets %d and PID trd tracklets %d\n",trdNTracklets,trdNTrackletsPID);
790 if((trdNTracklets > 0) && (trdNTrackletsPID > 0)) {
791 for(Int_t iPlane = 0; iPlane < 6; ++iPlane){
792 //Double_t slide = fkEsdTrack->GetTRDslice(iPlane);
793 //printf("Number of slide %d\n",fkEsdTrack->GetNumberOfTRDslices());
794 //Double_t momentum = fkEsdTrack->GetTRDmomentum(iPlane);
795 //printf("momentum %f, slide %f\n",momentum,slide);
796 if(fkEsdTrack->GetTRDslice(iPlane) > 0.0)
797 fAbsoluteGain->Fill(fkEsdTrack->GetTRDslice(iPlane)*8.0/100.0,
798 fkEsdTrack->GetTRDmomentum(iPlane));
803 if(!fTrdTrack) continue;
805 if(good && fOnInstance) {
806 //cout << "good" << endl;
807 fTRDCalibraFillHisto->UpdateHistogramsV1(fTrdTrack,fkEsdTrack);
808 //printf("Fill fTRDCalibraFillHisto\n");
812 const Double_t mag = AliTRDdEdxBaseUtils::IsExBOn() ? fESD->GetMagneticField() : -1;
813 const Int_t charge = AliTRDdEdxBaseUtils::IsExBOn() ? fkEsdTrack->Charge() : -1;
814 const Double_t toTPCscale = AliTRDdEdxCalibUtils::GetCalibTPCscale(fkEsdTrack->GetTPCncls(), fkEsdTrack->GetTPCsignal());
816 AliTRDdEdxCalibUtils::FillHist(fTrdTrack, 0, mag, charge, toTPCscale);
820 //////////////////////////////////
822 ////////////////////////////////
826 //printf("Enter debug\n");
828 Int_t nbtracklets = 0;
831 Bool_t standalonetracklet = kFALSE;
832 const AliTRDseedV1 *tracklet = 0x0;
833 //////////////////////////////////////
835 /////////////////////////////////////
837 Double_t phtb[AliTRDseedV1::kNtb];
838 memset(phtb, 0, AliTRDseedV1::kNtb*sizeof(Double_t));
840 Float_t normalisation = 1.13;
843 for(Int_t itr = 0; itr < 6; ++itr){
845 if(!(tracklet = fTrdTrack->GetTracklet(itr))) continue;
846 if(!tracklet->IsOK()) continue;
848 standalonetracklet = kFALSE;
849 if(tracklet->IsStandAlone()) standalonetracklet = kTRUE;
852 memset(phtb, 0, AliTRDseedV1::kNtb*sizeof(Double_t));
856 //Int_t crossrow = 0;
858 // Check no shared clusters
859 //for(int icc=AliTRDseedV1::kNtb; icc<AliTRDseedV1::kNclusters; icc++){
860 // if((fcl = tracklet->GetClusters(icc))) crossrow = 1;
867 for(int ic=0; ic<AliTRDseedV1::kNtb; ++ic){
869 if(!(fCl = tracklet->GetClusters(ic))) continue;
871 time = fCl->GetPadTime();
872 //ch = tracklet->GetdQdl(ic);
873 ch = tracklet->GetQperTB(ic);
874 qcl = TMath::Abs(fCl->GetQ());
875 detector = fCl->GetDetector();
876 // Add the charge if shared cluster
877 if((ic+AliTRDseedV1::kNtb) < AliTRDseedV1::kNclusters) {
878 if((fCl = tracklet->GetClusters(ic+AliTRDseedV1::kNtb))) {
879 qcl += TMath::Abs(fCl->GetQ());
880 //printf("Add the cluster charge\n");
883 if((time>-1) && (time<fNbTimeBins)) phtb[time]=qcl;
884 if((fCalDetGain) && (fCalDetGain->GetValue(detector) > 0.0)) sum += ch*fCalDetGain->GetValue(detector)/normalisation;
885 else sum += ch/normalisation;
888 fNbTimeBin->Fill(time);
889 if(tracklet->IsStandAlone()) fNbTimeBinStandalone->Fill(time);
890 else fNbTimeBinOffline->Fill(time);
893 sector = AliTRDgeometry::GetSector(detector);
896 fNbTracklets->Fill(detector);
897 if(tracklet->IsStandAlone()) fNbTrackletsStandalone->Fill(detector);
898 else fNbTrackletsOffline->Fill(detector);
900 fNbClusters->Fill(nbclusters);
901 if(tracklet->IsStandAlone()) fNbClustersStandalone->Fill(nbclusters);
902 else fNbClustersOffline->Fill(nbclusters);
905 if((nbclusters > fLow) && (nbclusters < fHigh)){
906 if(fRelativeScale > 0.0) sum = sum/fRelativeScale;
907 fCH2dTest->Fill(sum,detector+0.5);
908 fCH2dSM->Fill(sum,sector+0.5);
909 fCH2dSum->Fill(sum,0.5);
910 Bool_t checknoise = kTRUE;
911 if(fMaxCluster > 0) {
912 if(phtb[0] > fMaxCluster) checknoise = kFALSE;
913 if(fNbTimeBins > fNbMaxCluster) {
914 for(Int_t k = (fNbTimeBins-fNbMaxCluster); k < fNbTimeBins; k++){
915 if(phtb[k] > fMaxCluster) checknoise = kFALSE;
920 for(int ic=0; ic<fNbTimeBins; ic++){
922 fPH2dTest->Fill((Double_t)(ic/10.0),detector+0.5,(Double_t)phtb[ic]);
923 fPH2dSum->Fill((Double_t)(ic/10.0),0.5,(Double_t)phtb[ic]);
924 fPH2dSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[ic]);
928 fPH2dTest->Fill((Double_t)(ic/10.0),detector+0.5,(Double_t)phtb[ic]);
929 fPH2dSum->Fill((Double_t)(ic/10.0),0.0,(Double_t)phtb[ic]);
930 fPH2dSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[ic]);
936 if(detector == 0) FindP1TrackPHtrackletV1Test(tracklet,nbclusters);
938 } // loop on tracklets
943 if(nTRDtrackV1 > 0) {
945 if((status&(AliESDtrack::kTRDout)) && (!(status&(AliESDtrack::kTRDin)))) {
946 ++nbTrdTracksStandalone;
948 if((status&(AliESDtrack::kTRDin))) {
949 ++nbTrdTracksOffline;
952 //delete fFriendTrack;
956 fNbTRDTrack->Fill(nbTrdTracks);
957 fNbTRDTrackStandalone->Fill(nbTrdTracksStandalone);
958 fNbTRDTrackOffline->Fill(nbTrdTracksOffline);
959 fNbTPCTRDtrack->Fill(nbTrdTracks,nbtrackTPC);
963 PostData(1, fListHist);
964 //cout << "AliTRDCalibTask::Exec() OUT" << endl;
967 //________________________________________________________________________
968 void AliTRDCalibTask::Terminate(Option_t *)
974 if(fTRDCalibraFillHisto) fTRDCalibraFillHisto->DestroyDebugStreamer();
978 //_______________________________________________________
979 Bool_t AliTRDCalibTask::Load(const Char_t *filename)
982 // Generic container loader
985 if(!TFile::Open(filename)){
986 //AliWarning(Form("Couldn't open file %s.", filename));
990 if(!(o = (TList*)gFile->Get(GetName()))){
991 //AliWarning("Missing histogram container.");
994 fListHist = (TList*)o->Clone(GetName());
998 //_______________________________________________________
999 Bool_t AliTRDCalibTask::Load(TList *lister)
1002 // Generic container loader
1005 fListHist = (TList*)lister->Clone(GetName());
1008 //_______________________________________________________________________________________
1009 void AliTRDCalibTask::AddTask(const AliTRDCalibTask * calibTask) {
1015 TList *listcalibTask = calibTask->GetList();
1016 if(!listcalibTask) return;
1018 THnSparseI *histoEntries = (THnSparseI *) listcalibTask->FindObject("NumberOfEntries");
1020 TH1I *nEvents = (TH1I *) listcalibTask->FindObject(Form("NEvents_%s",(const char*)calibTask->GetName()));
1021 TH1I *nEventsInput = (TH1I *) listcalibTask->FindObject(Form("NEventsInput_%s",(const char*)calibTask->GetName()));
1022 TH2F *absoluteGain = (TH2F *) listcalibTask->FindObject(Form("AbsoluteGain_%s",(const char*)calibTask->GetName()));
1024 TH1F *trdTrack = (TH1F *) listcalibTask->FindObject(Form("TRDTrack_%s",(const char*)calibTask->GetName()));
1025 TH1F *trdTrackOffline = (TH1F *) listcalibTask->FindObject(Form("TRDTrackOffline_%s",(const char*)calibTask->GetName()));
1026 TH1F *trdTrackStandalone = (TH1F *) listcalibTask->FindObject(Form("TRDTrackStandalone_%s",(const char*)calibTask->GetName()));
1028 TH2F *tpctrdTrack = (TH2F *) listcalibTask->FindObject(Form("NbTPCTRDtrack_%s",(const char*)calibTask->GetName()));
1030 TH1F *nbTimeBin = (TH1F *) listcalibTask->FindObject(Form("NbTimeBin_%s",(const char*)calibTask->GetName()));
1031 TH1F *nbTimeBinOffline = (TH1F *) listcalibTask->FindObject(Form("NbTimeBinOffline_%s",(const char*)calibTask->GetName()));
1032 TH1F *nbTimeBinStandalone = (TH1F *) listcalibTask->FindObject(Form("NbTimeBinStandalone_%s",(const char*)calibTask->GetName()));
1034 TH1F *nbClusters = (TH1F *) listcalibTask->FindObject(Form("NbClusters_%s",(const char*)calibTask->GetName()));
1035 TH1F *nbClustersOffline = (TH1F *) listcalibTask->FindObject(Form("NbClustersOffline_%s",(const char*)calibTask->GetName()));
1036 TH1F *nbClustersStandalone = (TH1F *) listcalibTask->FindObject(Form("NbClustersStandalone_%s",(const char*)calibTask->GetName()));
1038 TH1F *nbTracklets = (TH1F *) listcalibTask->FindObject(Form("NbTracklets_%s",(const char*)calibTask->GetName()));
1039 TH1F *nbTrackletsOffline = (TH1F *) listcalibTask->FindObject(Form("NbTrackletsOffline_%s",(const char*)calibTask->GetName()));
1040 TH1F *nbTrackletsStandalone = (TH1F *) listcalibTask->FindObject(Form("NbTrackletsStandalone_%s",(const char*)calibTask->GetName()));
1042 TH2I *ch2d = (TH2I *) listcalibTask->FindObject("CH2d");
1043 TProfile2D *ph2d = (TProfile2D *) listcalibTask->FindObject("PH2d");
1044 TProfile2D *prf2d = (TProfile2D *) listcalibTask->FindObject("PRF2d");
1046 TH2I *ch2dSum = (TH2I *) listcalibTask->FindObject(Form("CH2dSum_%s",(const char*)calibTask->GetName()));
1047 TProfile2D *ph2dSum = (TProfile2D *) listcalibTask->FindObject(Form("PH2dSum_%s",(const char*)calibTask->GetName()));
1049 TH2I *ch2dSM = (TH2I *) listcalibTask->FindObject(Form("CH2dSM_%s",(const char*)calibTask->GetName()));
1050 TProfile2D *ph2dSM = (TProfile2D *) listcalibTask->FindObject(Form("PH2dSM_%s",(const char*)calibTask->GetName()));
1052 AliTRDCalibraVdriftLinearFit *linearfit = (AliTRDCalibraVdriftLinearFit *) listcalibTask->FindObject("AliTRDCalibraVdriftLinearFit");
1053 AliTRDCalibraExbAltFit *exbaltfit = (AliTRDCalibraExbAltFit *) listcalibTask->FindObject("AliTRDCalibraExbAltFit");
1054 AliTRDCalibraVector *calibraVector = (AliTRDCalibraVector *) listcalibTask->FindObject("AliTRDCalibraVector");
1058 THnSparseI *inhistoEntries = (THnSparseI *) fListHist->FindObject("NumberOfEntries");
1060 TH1I *inEventsInput = (TH1I *) fListHist->FindObject(Form("NEventsInput_%s",(const char*)fName));
1061 TH1I *inEvents = (TH1I *) fListHist->FindObject(Form("NEvents_%s",(const char*)fName));
1062 TH2F *iabsoluteGain = (TH2F *) fListHist->FindObject(Form("AbsoluteGain_%s",(const char*)fName));
1064 TH1F *itrdTrack = (TH1F *) fListHist->FindObject(Form("TRDTrack_%s",(const char*)fName));
1065 TH1F *itrdTrackOffline = (TH1F *) fListHist->FindObject(Form("TRDTrackOffline_%s",(const char*)fName));
1066 TH1F *itrdTrackStandalone = (TH1F *) fListHist->FindObject(Form("TRDTrackStandalone_%s",(const char*)fName));
1068 TH2F *itpctrdTrack = (TH2F *) fListHist->FindObject(Form("NbTPCTRDtrack_%s",(const char*)fName));
1070 TH1F *inbTimeBin = (TH1F *) fListHist->FindObject(Form("NbTimeBin_%s",(const char*)fName));
1071 TH1F *inbTimeBinOffline = (TH1F *) fListHist->FindObject(Form("NbTimeBinOffline_%s",(const char*)fName));
1072 TH1F *inbTimeBinStandalone = (TH1F *) fListHist->FindObject(Form("NbTimeBinStandalone_%s",(const char*)fName));
1074 TH1F *inbClusters = (TH1F *) fListHist->FindObject(Form("NbClusters_%s",(const char*)fName));
1075 TH1F *inbClustersOffline = (TH1F *) fListHist->FindObject(Form("NbClustersOffline_%s",(const char*)fName));
1076 TH1F *inbClustersStandalone = (TH1F *) fListHist->FindObject(Form("NbClustersStandalone_%s",(const char*)fName));
1078 TH1F *inbTracklets = (TH1F *) fListHist->FindObject(Form("NbTracklets_%s",(const char*)fName));
1079 TH1F *inbTrackletsOffline = (TH1F *) fListHist->FindObject(Form("NbTrackletsOffline_%s",(const char*)fName));
1080 TH1F *inbTrackletsStandalone = (TH1F *) fListHist->FindObject(Form("NbTrackletsStandalone_%s",(const char*)fName));
1082 TH2I *ich2d = (TH2I *) fListHist->FindObject("CH2d");
1083 TProfile2D *iph2d = (TProfile2D *) fListHist->FindObject("PH2d");
1084 TProfile2D *iprf2d = (TProfile2D *) fListHist->FindObject("PRF2d");
1086 TH2I *ich2dSum = (TH2I *) fListHist->FindObject(Form("CH2dSum_%s",(const char*)fName));
1087 TProfile2D *iph2dSum = (TProfile2D *) fListHist->FindObject(Form("PH2dSum_%s",(const char*)fName));
1089 TH2I *ich2dSM = (TH2I *) fListHist->FindObject(Form("CH2dSM_%s",(const char*)fName));
1090 TProfile2D *iph2dSM = (TProfile2D *) fListHist->FindObject(Form("PH2dSM_%s",(const char*)fName));
1092 AliTRDCalibraVdriftLinearFit *ilinearfit = (AliTRDCalibraVdriftLinearFit *) fListHist->FindObject("AliTRDCalibraVdriftLinearFit");
1093 AliTRDCalibraExbAltFit *iexbaltfit = (AliTRDCalibraExbAltFit *) fListHist->FindObject("AliTRDCalibraExbAltFit");
1094 AliTRDCalibraVector *icalibraVector = (AliTRDCalibraVector *) fListHist->FindObject("AliTRDCalibraVector");
1100 if(inhistoEntries) {
1101 inhistoEntries->Add(histoEntries);
1102 //printf("Add Events\n");
1105 //printf("Create new Events\n");
1106 inhistoEntries = (THnSparseI *) histoEntries->Clone();
1107 fListHist->Add(inhistoEntries);
1113 inEventsInput->Add(nEventsInput);
1114 //printf("Add Events\n");
1117 //printf("Create new Events\n");
1118 inEventsInput = new TH1I(*nEventsInput);
1119 fListHist->Add(inEventsInput);
1125 inEvents->Add(nEvents);
1126 //printf("Add Events\n");
1129 //printf("Create new Events\n");
1130 inEvents = new TH1I(*nEvents);
1131 fListHist->Add(inEvents);
1136 if(iabsoluteGain) iabsoluteGain->Add(absoluteGain);
1138 iabsoluteGain = new TH2F(*absoluteGain);
1139 fListHist->Add(iabsoluteGain);
1144 if(itrdTrack) itrdTrack->Add(trdTrack);
1146 itrdTrack = new TH1F(*trdTrack);
1147 fListHist->Add(itrdTrack);
1151 if(trdTrackOffline) {
1152 if(itrdTrackOffline) itrdTrackOffline->Add(trdTrackOffline);
1154 itrdTrackOffline = new TH1F(*trdTrackOffline);
1155 fListHist->Add(itrdTrackOffline);
1159 if(trdTrackStandalone) {
1160 if(itrdTrackStandalone) itrdTrackStandalone->Add(trdTrackStandalone);
1162 itrdTrackStandalone = new TH1F(*trdTrackStandalone);
1163 fListHist->Add(itrdTrackStandalone);
1168 if(itpctrdTrack) itpctrdTrack->Add(tpctrdTrack);
1170 itpctrdTrack = new TH2F(*tpctrdTrack);
1171 fListHist->Add(itpctrdTrack);
1176 if(inbTimeBin) inbTimeBin->Add(nbTimeBin);
1178 inbTimeBin = new TH1F(*inbTimeBin);
1179 fListHist->Add(inbTimeBin);
1183 if(nbTimeBinOffline) {
1184 if(inbTimeBinOffline) inbTimeBinOffline->Add(nbTimeBinOffline);
1186 inbTimeBinOffline = new TH1F(*nbTimeBinOffline);
1187 fListHist->Add(inbTimeBinOffline);
1191 if(nbTimeBinStandalone) {
1192 if(inbTimeBinStandalone) inbTimeBinStandalone->Add(nbTimeBinStandalone);
1194 inbTimeBinStandalone = new TH1F(*nbTimeBinStandalone);
1195 fListHist->Add(inbTimeBinStandalone);
1200 if(inbClusters) inbClusters->Add(nbClusters);
1202 inbClusters = new TH1F(*nbClusters);
1203 fListHist->Add(inbClusters);
1207 if(nbClustersOffline) {
1208 if(inbClustersOffline) inbClustersOffline->Add(nbClustersOffline);
1210 inbClustersOffline = new TH1F(*nbClustersOffline);
1211 fListHist->Add(inbClustersOffline);
1215 if(nbClustersStandalone) {
1216 if(inbClustersStandalone) inbClustersStandalone->Add(nbClustersStandalone);
1218 inbClustersStandalone = new TH1F(*nbClustersStandalone);
1219 fListHist->Add(inbClustersStandalone);
1224 if(inbTracklets) inbTracklets->Add(nbTracklets);
1226 inbTracklets = new TH1F(*nbTracklets);
1227 fListHist->Add(inbTracklets);
1231 if(nbTrackletsOffline) {
1232 if(inbTrackletsOffline) inbTrackletsOffline->Add(nbTrackletsOffline);
1234 inbTrackletsOffline = new TH1F(*nbTrackletsOffline);
1235 fListHist->Add(inbTrackletsOffline);
1239 if(nbTrackletsStandalone) {
1240 if(inbTrackletsStandalone) inbTrackletsStandalone->Add(nbTrackletsStandalone);
1242 inbTrackletsStandalone = new TH1F(*nbTrackletsStandalone);
1243 fListHist->Add(inbTrackletsStandalone);
1248 if(ich2d) ich2d->Add(ch2d);
1250 ich2d = new TH2I(*ch2d);
1251 fListHist->Add(ich2d);
1256 if(iph2d) iph2d->Add(ph2d);
1258 iph2d = new TProfile2D(*ph2d);
1259 fListHist->Add(iph2d);
1264 if(iprf2d) iprf2d->Add(prf2d);
1266 iprf2d = new TProfile2D(*prf2d);
1267 fListHist->Add(iprf2d);
1272 if(ich2dSum) ich2dSum->Add(ch2dSum);
1274 ich2dSum = new TH2I(*ch2dSum);
1275 fListHist->Add(ich2dSum);
1280 if(iph2dSum) iph2dSum->Add(ph2dSum);
1282 iph2dSum = new TProfile2D(*ph2dSum);
1283 fListHist->Add(iph2dSum);
1288 if(ich2dSM) ich2dSM->Add(ch2dSM);
1290 ich2dSM = new TH2I(*ch2dSM);
1291 fListHist->Add(ich2dSM);
1296 if(iph2dSM) iph2dSM->Add(ph2dSM);
1298 iph2dSM = new TProfile2D(*ph2dSM);
1299 fListHist->Add(iph2dSM);
1304 if(ilinearfit) ilinearfit->Add(linearfit);
1306 ilinearfit = new AliTRDCalibraVdriftLinearFit(*linearfit);
1307 fListHist->Add(ilinearfit);
1312 if(iexbaltfit) iexbaltfit->Add(exbaltfit);
1314 iexbaltfit = new AliTRDCalibraExbAltFit(*exbaltfit);
1315 fListHist->Add(iexbaltfit);
1320 if(icalibraVector) icalibraVector->Add(calibraVector);
1322 icalibraVector = new AliTRDCalibraVector(*calibraVector);
1323 fListHist->Add(icalibraVector);
1328 //________________________________________________________________________________
1329 Long64_t AliTRDCalibTask::Merge(TCollection *li) {
1335 TIterator* iter = li->MakeIterator();
1336 AliTRDCalibTask* cal = 0;
1338 while ((cal = (AliTRDCalibTask*)iter->Next())) {
1339 if (!cal->InheritsFrom(AliTRDCalibTask::Class())) {
1340 Error("Merge","Attempt to add object of class %s to a %s", cal->ClassName(), this->ClassName());
1344 // add histograms here...
1352 //_____________________________________________________
1353 Bool_t AliTRDCalibTask::SetVersionSubversion(){
1355 // Load Chamber Gain factors into the Tender supply
1358 //printf("SetVersionSubversion\n");
1360 //find previous entry from the UserInfo
1361 TTree *tree=((TChain*)GetInputData(0))->GetTree();
1363 AliError("Tree not found in ESDhandler");
1367 TList *userInfo=(TList*)tree->GetUserInfo();
1369 AliError("No UserInfo found in tree");
1373 TList *cdbList=(TList*)userInfo->FindObject("cdbList");
1375 AliError("No cdbList found in UserInfo");
1376 if (AliLog::GetGlobalLogLevel()>=AliLog::kError) userInfo->Print();
1380 TIter nextCDB(cdbList);
1382 while ( (os=(TObjString*)nextCDB()) ){
1383 if(os->GetString().Contains("TRD/Calib/ChamberGainFactor")){
1384 // Get Old gain calibration
1385 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1386 fFirstRunGain = id->GetFirstRun();
1387 fVersionGainUsed = id->GetVersion();
1388 fSubVersionGainUsed = id->GetSubVersion();
1389 } else if(os->GetString().Contains("TRD/Calib/ChamberVdrift")){
1390 // Get Old drift velocity calibration
1391 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1392 fFirstRunVdrift = id->GetFirstRun();
1393 fVersionVdriftUsed = id->GetVersion();
1394 fSubVersionVdriftUsed = id->GetSubVersion();
1395 } else if(os->GetString().Contains("TRD/Calib/LocalGainFactor")){
1396 // Get Old drift velocity calibration
1397 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1398 fFirstRunGainLocal = id->GetFirstRun();
1399 fVersionGainLocalUsed = id->GetVersion();
1400 fSubVersionGainLocalUsed = id->GetSubVersion();
1401 } else if((os->GetString().Contains("TRD/Calib/ChamberExB")) && (!os->GetString().Contains("TRD/Calib/ChamberExBAlt"))){
1402 // Get Old drift velocity calibration
1403 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1404 fFirstRunExB = id->GetFirstRun();
1405 fVersionExBUsed = id->GetVersion();
1406 fSubVersionExBUsed = id->GetSubVersion();
1407 //printf("Version %d and subversion %d\n",fVersionExBUsed,fSubVersionExBUsed);
1411 //printf("VersionGain %d, SubversionGain %d, VersionLocalGain %d, Subversionlocalgain %d, Versionvdrift %d, Subversionvdrift %d\n",fVersionGainUsed,fSubVersionGainUsed,fVersionGainLocalUsed,fSubVersionGainLocalUsed,fVersionVdriftUsed,fSubVersionVdriftUsed);
1414 if((fFirstRunGain < 0) ||
1415 (fFirstRunGainLocal < 0) ||
1416 (fFirstRunVdrift < 0) ||
1417 (fVersionGainUsed < 0) ||
1418 (fVersionGainLocalUsed < 0) ||
1419 (fSubVersionGainUsed < 0) ||
1420 (fSubVersionGainLocalUsed < 0) ||
1421 (fVersionVdriftUsed < 0) ||
1422 (fSubVersionVdriftUsed < 0)) {
1423 AliError("No recent calibration found");
1429 //_________________________________________________________________________________________________________________________
1430 Bool_t AliTRDCalibTask::ParticleGood(int i) const {
1433 // Definition of good tracks
1437 AliESDtrack *track = fESD->GetTrack(i);
1438 if (!track->IsOn(AliESDtrack::kTPCrefit)) return 0; // TPC refit
1439 if (track->GetTPCNcls() < 90) return 0; // number of TPC clusters
1440 if (fabs(track->Eta())>0.8) return 0; // fiducial pseudorapidity
1442 track->GetImpactParametersTPC(r,z);
1443 if (fabs(z)>2.0) return 0; // impact parameter in z
1444 if (fabs(r)>2.0) return 0; // impact parameter in xy
1450 //______________________________________________________________________________________________________________________
1451 Bool_t AliTRDCalibTask::FindP1TrackPHtrackletV1Test(const AliTRDseedV1 *tracklet, Int_t nbclusters)
1454 // Drift velocity calibration:
1455 // Fit the clusters with a straight line
1456 // From the slope find the drift velocity
1459 ////////////////////////////////////////////////
1460 //Number of points: if less than 3 return kFALSE
1461 /////////////////////////////////////////////////
1462 if(nbclusters <= 2) return kFALSE;
1467 // results of the linear fit
1468 Double_t dydt = 0.0; // dydt tracklet after straight line fit
1469 Double_t errorpar = 0.0; // error after straight line fit on dy/dt
1470 Double_t pointError = 0.0; // error after straight line fit
1471 // pad row problemes: avoid tracklet that cross pad rows, tilting angle in the constant
1472 Int_t crossrow = 0; // if it crosses a pad row
1473 Int_t rowp = -1; // if it crosses a pad row
1474 Float_t tnt = tracklet->GetTilt(); // tan tiltingangle
1475 TLinearFitter linearFitterTracklet(2,"pol1");
1476 linearFitterTracklet.StoreData(kTRUE);
1479 ///////////////////////////////////////////
1480 // Take the parameters of the track
1481 //////////////////////////////////////////
1482 // take now the snp, tnp and tgl from the track
1483 Double_t snp = tracklet->GetSnp(); // sin dy/dx at the end of the chamber
1484 Double_t tnp = 0.0; // dy/dx at the end of the chamber
1485 if( TMath::Abs(snp) < 1.){
1486 tnp = snp / TMath::Sqrt((1.-snp)*(1.+snp));
1488 Double_t tgl = tracklet->GetTgl(); // dz/dl
1489 Double_t dzdx = tgl*TMath::Sqrt(1+tnp*tnp); // dz/dx calculated from dz/dl
1491 //Double_t tnp = tracklet->GetYref(1); // dy/dx at the entrance of the chamber
1492 //Double_t tgl = tracklet->GetZref(1); // dz/dl at the entrance of the chamber
1493 //Double_t dzdx = tgl; //*TMath::Sqrt(1+tnp*tnp); // dz/dx from dz/dl
1494 // at the end with correction due to linear fit
1495 //Double_t tnp = tracklet->GetYfit(1); // dy/dx at the end of the chamber after fit correction
1496 //Double_t tgl = tracklet->GetZfit(1); // dz/dl at the end of the chamber after fit correction
1499 ////////////////////////////
1500 // loop over the clusters
1501 ////////////////////////////
1503 AliTRDcluster *cl = 0x0;
1504 //////////////////////////////
1505 // Check no shared clusters
1506 //////////////////////////////
1507 for(int icc=AliTRDseedV1::kNtb; icc<AliTRDseedV1::kNclusters; icc++){
1508 cl = tracklet->GetClusters(icc);
1509 if(cl) crossrow = 1;
1511 //////////////////////////////////
1513 //////////////////////////////////
1514 for(int ic=0; ic<AliTRDseedV1::kNtb; ic++){
1515 if(!(cl = tracklet->GetClusters(ic))) continue;
1516 //if((fLimitChargeIntegration) && (!cl->IsInChamber())) continue;
1518 Double_t ycluster = cl->GetY();
1519 Int_t time = cl->GetPadTime();
1520 Double_t timeis = time/10.0;
1521 //See if cross two pad rows
1522 Int_t row = cl->GetPadRow();
1523 if(rowp==-1) rowp = row;
1524 if(row != rowp) crossrow = 1;
1526 linearFitterTracklet.AddPoint(&timeis,ycluster,1);
1532 ////////////////////////////////////
1533 // Do the straight line fit now
1534 ///////////////////////////////////
1536 linearFitterTracklet.ClearPoints();
1540 linearFitterTracklet.Eval();
1541 linearFitterTracklet.GetParameters(pars);
1542 pointError = TMath::Sqrt(linearFitterTracklet.GetChisquare()/(nbli-2));
1543 errorpar = linearFitterTracklet.GetParError(1)*pointError;
1545 //printf("chis %f, nbli %d, pointError %f, parError %f, errorpar %f\n",linearFitterTracklet->GetChisquare(),nbli,pointError,linearFitterTracklet->GetParError(1),errorpar);
1546 linearFitterTracklet.ClearPoints();
1548 /////////////////////////
1550 ////////////////////////
1552 if(nbclusters < fLow) return kFALSE;
1553 if(nbclusters > fHigh) return kFALSE;
1554 if(pointError >= 0.3) return kFALSE;
1555 if(crossrow == 1) return kTRUE;
1557 ///////////////////////
1559 //////////////////////
1562 //Add to the linear fitter of the detector
1563 if( TMath::Abs(snp) < 1.){
1564 Double_t x = tnp-dzdx*tnt;
1565 //if(!fLinearVdriftTest) printf("Not there\n");
1566 Double_t nbentries = fLinearVdriftTest->GetEntries();
1567 if(nbentries < (5.0*32767)) fLinearVdriftTest->Fill(x,dydt);