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 "AliTRDdEdxUtils.h"
83 #include "AliTRDCalibTask.h"
86 ClassImp(AliTRDCalibTask)
88 //________________________________________________________________________
89 AliTRDCalibTask::AliTRDCalibTask(const char *name)
90 : AliAnalysisTaskSE(name), fESD(0),
97 fTRDCalibraFillHisto(0),
102 fNbTRDTrackOffline(0),
103 fNbTRDTrackStandalone(0),
107 fNbTimeBinOffline(0),
108 fNbTimeBinStandalone(0),
110 fNbClustersOffline(0),
111 fNbClustersStandalone(0),
113 fNbTrackletsOffline(0),
114 fNbTrackletsStandalone(0),
122 fLinearVdriftTest(0),
126 fVdriftLinear(kTRUE),
128 fDebugLevelTRDCalibraFillHisto(0),
130 fNumberBinCharge(50),
131 fSelectTrigger(kTRUE),
132 fSelectedTrigger(new TObjArray()),
135 fRequirePrimaryVertex(kFALSE),
138 fMinNbContributors(0),
139 fRangePrimaryVertexZ(9999999.0),
141 fMaxNbTracks(999999999),
142 fCutWithVdriftCalib(kFALSE),
143 fMinNbTRDtracklets(0),
145 fScaleGainWithTPCSignal(kFALSE),
149 fNormalizeNbOfCluster(kFALSE),
153 fOfflineTracks(kFALSE),
154 fStandaloneTracks(kFALSE),
156 fVersionGainUsed(-1),
157 fSubVersionGainUsed(-1),
158 fFirstRunGainLocal(-1),
159 fVersionGainLocalUsed(-1),
160 fSubVersionGainLocalUsed(-1),
162 fVersionVdriftUsed(-1),
163 fSubVersionVdriftUsed(-1),
166 fSubVersionExBUsed(-1),
173 // Default constructor
185 // Define input and output slots here
186 // Input slot #0 works with a TChain
187 DefineInput(0, TChain::Class());
189 // Output slot #0 writes into a TList container
190 DefineOutput(1, TList::Class());
194 //____________________________________________________________________________________
195 AliTRDCalibTask::~AliTRDCalibTask()
198 // AliTRDCalibTask destructor
202 if(fNEvents) delete fNEvents;
203 if(fNEventsInput) delete fNEventsInput;
204 if(fNbTRDTrack) delete fNbTRDTrack;
205 if(fNbTRDTrackOffline) delete fNbTRDTrackOffline;
206 if(fNbTRDTrackStandalone) delete fNbTRDTrackStandalone;
207 if(fNbTPCTRDtrack) delete fNbTPCTRDtrack;
208 if(fNbGoodTracks) delete fNbGoodTracks;
209 if(fNbTimeBin) delete fNbTimeBin;
210 if(fNbTimeBinOffline) delete fNbTimeBinOffline;
211 if(fNbTimeBinStandalone) delete fNbTimeBinStandalone;
212 if(fNbClusters) delete fNbClusters;
213 if(fNbClustersOffline) delete fNbClustersOffline;
214 if(fNbClustersStandalone) delete fNbClustersStandalone;
215 if(fNbTracklets) delete fNbTracklets;
216 if(fNbTrackletsOffline) delete fNbTrackletsOffline;
217 if(fNbTrackletsStandalone) delete fNbTrackletsStandalone;
218 if(fAbsoluteGain) delete fAbsoluteGain;
219 if(fCH2dSum) delete fCH2dSum;
220 if(fPH2dSum) delete fPH2dSum;
221 if(fCH2dSM) delete fCH2dSM;
222 if(fPH2dSM) delete fPH2dSM;
223 if(fCH2dTest) delete fCH2dTest;
224 if(fPH2dTest) delete fPH2dTest;
225 if(fLinearVdriftTest) delete fLinearVdriftTest;
227 AliTRDdEdxUtils::DeleteCalibHist();
230 if(fCalDetGain) delete fCalDetGain;
232 if(fSelectedTrigger) {
233 fSelectedTrigger->Delete();
234 delete fSelectedTrigger;
237 delete fEsdTrackCuts;
240 if(fTRDChamberStatus) delete fTRDChamberStatus;
244 //________________________________________________________________________
245 void AliTRDCalibTask::UserCreateOutputObjects()
250 //cout << "AliTRDCalibTask::CreateOutputObjects() IN" << endl;
252 // Number of time bins
254 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
255 fNbTimeBins = cal->GetNumberOfTimeBinsDCS();
256 if(fNbTimeBins <= 0){
257 AliWarning(Form("No of TimeBins from DB [%d] use default [30]", fNbTimeBins));
263 fListHist = new TList();
264 fListHist->SetOwner();
266 // init chamber status
267 fTRDChamberStatus = new AliTRDCalibChamberStatus();
268 fTRDChamberStatus->Init();
269 fListHist->Add(fTRDChamberStatus->GetSparseI());
271 // instance calibration
272 fTRDCalibraFillHisto = AliTRDCalibraFillHisto::Instance();
274 fTRDCalibraFillHisto->SetNumberBinCharge(fNumberBinCharge); // set number of bin of the charge distribution
275 fTRDCalibraFillHisto->SetCutWithVdriftCalib(fCutWithVdriftCalib); // cut vdrift
276 fTRDCalibraFillHisto->SetMinNbTRDtracklets(fMinNbTRDtracklets); // min number of TRD tracklets
277 fTRDCalibraFillHisto->SetMinTRDMomentum(fMinTRDMomentum); // min TRD momentum
278 fTRDCalibraFillHisto->SetHisto2d(fHisto2d); // choose to use histograms
279 fTRDCalibraFillHisto->SetVector2d(fVector2d); // choose to use vectors
280 fTRDCalibraFillHisto->SetCH2dOn(); // choose to calibrate the gain
281 fTRDCalibraFillHisto->SetPH2dOn(); // choose to calibrate the drift velocity
282 fTRDCalibraFillHisto->SetPRF2dOn(); // choose to look at the PRF
283 fTRDCalibraFillHisto->SetLinearFitterOn(fVdriftLinear); // Other possibility vdrift VDRIFT
284 fTRDCalibraFillHisto->SetLinearFitterDebugOn(fVdriftLinear); // Other possibility vdrift
285 fTRDCalibraFillHisto->SetExbAltFitOn(fExbAlt); // Alternative method for exb
286 fTRDCalibraFillHisto->SetScaleWithTPCSignal(fScaleGainWithTPCSignal); // Scale Gain with TPC signal
287 for(Int_t k = 0; k < 3; k++){
288 if(((fNz[k] != 10) && (fNrphi[k] != 10)) && ((fNz[k] != 100) && (fNrphi[k] != 100))) {
289 fTRDCalibraFillHisto->SetNz(k,fNz[k]); // Mode calibration
290 fTRDCalibraFillHisto->SetNrphi(k,fNrphi[k]); // Mode calibration
293 if((fNz[k] == 100) && (fNrphi[k] == 100)) {
294 if(fVector2d) AliInfo("The mode all together is not supported by the vector method");
295 fTRDCalibraFillHisto->SetAllTogether(k);
297 if((fNz[k] == 10) && (fNrphi[k] == 10)) {
298 if(fVector2d) AliInfo("The mode per supermodule is not supported by the vector method");
299 fTRDCalibraFillHisto->SetPerSuperModule(k);
303 // Variables for how to fill
304 fTRDCalibraFillHisto->SetFillWithZero(fFillZero);
305 fTRDCalibraFillHisto->SetNormalizeNbOfCluster(fNormalizeNbOfCluster);
306 fTRDCalibraFillHisto->SetMaxCluster(fMaxCluster);
307 fTRDCalibraFillHisto->SetNbMaxCluster(fNbMaxCluster);
309 // Init with 30 timebins
310 fTRDCalibraFillHisto->Init2Dhistos(fNbTimeBins); // initialise the histos
311 fTRDCalibraFillHisto->SetNumberClusters(fLow); // At least 11 clusters
312 fTRDCalibraFillHisto->SetNumberClustersf(fHigh); // At least 11 clusters
315 fTRDCalibraFillHisto->SetDebugLevel(fDebugLevelTRDCalibraFillHisto); //debug stuff
318 fListHist->Add(fTRDCalibraFillHisto->GetCH2d());
319 fListHist->Add(fTRDCalibraFillHisto->GetPH2d());
320 fListHist->Add(fTRDCalibraFillHisto->GetPRF2d());
322 if(fVdriftLinear) fListHist->Add((TObject *)fTRDCalibraFillHisto->GetVdriftLinearFit());
323 if(fVector2d) fListHist->Add((TObject *) fTRDCalibraFillHisto->GetCalibraVector()); //calibra vector
324 if(fExbAlt) fListHist->Add((TObject *)fTRDCalibraFillHisto->GetExbAltFit());
326 fRelativeScale = fTRDCalibraFillHisto->GetRelativeScale(); // Get the relative scale for the gain
328 fNEvents = new TH1I(Form("NEvents_%s",(const char*)fName),"NEvents", 2, 0, 2);
329 fListHist->Add(fNEvents);
330 fNEventsInput = new TH1I(Form("NEventsInput_%s",(const char*)fName),"NEventsInput", 2, 0, 2);
331 fListHist->Add(fNEventsInput);
333 // absolute gain calibration even without AliESDfriend
335 Double_t minPt = 0.001;
336 Double_t maxPt = 10.0;
338 Double_t *binLimLogPt = new Double_t[nBinsPt+1];
339 Double_t *binLimPt = new Double_t[nBinsPt+1];
340 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 ;
341 for(Int_t i=0; i<=nBinsPt; i++) binLimPt[i]=(Double_t)TMath::Power(10,binLimLogPt[i]);
343 fAbsoluteGain = new TH2F(Form("AbsoluteGain_%s",(const char*)fName),"AbsoluteGain", 200, 0.0, 700.0, nBinsPt, binLimPt);
344 fAbsoluteGain->SetYTitle("Momentum at TRD");
345 fAbsoluteGain->SetXTitle("charge deposit [a.u]");
346 fAbsoluteGain->SetZTitle("counts");
347 fAbsoluteGain->SetStats(0);
348 fAbsoluteGain->Sumw2();
349 fListHist->Add(fAbsoluteGain);
352 printf("\n AliTRDCalibTask PHQ is on!! \n\n");
353 AliTRDdEdxUtils::PrintControl();
354 AliTRDdEdxUtils::IniCalibHist(fListHist, kTRUE);
357 printf("\n AliTRDCalibTask PHQ is off!! \n\n");
360 /////////////////////////////////////////
362 ///////////////////////////////////////
365 fLinearVdriftTest = new TH2S(Form("LFDV0testversion_%s",(const char*)fName),"LFDV0testversion",36,-0.9,0.9,48,-1.2,1.2);
366 fLinearVdriftTest->SetXTitle("tan(phi_{track})");
367 fLinearVdriftTest->SetYTitle("dy/dt");
368 fLinearVdriftTest->SetZTitle("Number of tracklets");
369 fLinearVdriftTest->SetStats(0);
370 fLinearVdriftTest->SetDirectory(0);
372 // Standart with AliESDfriend
373 fPH2dTest = new TProfile2D(Form("PH2dTest_%s",(const char*)fName),"Nz0Nrphi0"
374 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
376 fPH2dTest->SetYTitle("Det/pad groups");
377 fPH2dTest->SetXTitle("time [#mus]");
378 fPH2dTest->SetZTitle("<PH> [a.u.]");
379 fPH2dTest->SetStats(0);
381 fCH2dTest = new TH2I(Form("CH2dTest_%s",(const char*)fName),"Nz0Nrphi0",50,0,300,540,0,540);
382 fCH2dTest->SetYTitle("Det/pad groups");
383 fCH2dTest->SetXTitle("charge deposit [a.u]");
384 fCH2dTest->SetZTitle("counts");
385 fCH2dTest->SetStats(0);
389 fPH2dSM = new TProfile2D(Form("PH2dSM_%s",(const char*)fName),"Nz10Nrphi10"
390 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
392 fPH2dSM->SetYTitle("Det/pad groups");
393 fPH2dSM->SetXTitle("time [#mus]");
394 fPH2dSM->SetZTitle("<PH> [a.u.]");
395 fPH2dSM->SetStats(0);
397 fCH2dSM = new TH2I(Form("CH2dSM_%s",(const char*)fName),"Nz10Nrphi10",50,0,300,18,0,18);
398 fCH2dSM->SetYTitle("Det/pad groups");
399 fCH2dSM->SetXTitle("charge deposit [a.u]");
400 fCH2dSM->SetZTitle("counts");
401 fCH2dSM->SetStats(0);
404 fPH2dSum = new TProfile2D(Form("PH2dSum_%s",(const char*)fName),"Nz100Nrphi100"
405 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
407 fPH2dSum->SetYTitle("Det/pad groups");
408 fPH2dSum->SetXTitle("time [#mus]");
409 fPH2dSum->SetZTitle("<PH> [a.u.]");
410 fPH2dSum->SetStats(0);
412 fCH2dSum = new TH2I(Form("CH2dSum_%s",(const char*)fName),"Nz100Nrphi100",50,0,300,1,0,1);
413 fCH2dSum->SetYTitle("Det/pad groups");
414 fCH2dSum->SetXTitle("charge deposit [a.u]");
415 fCH2dSum->SetZTitle("counts");
416 fCH2dSum->SetStats(0);
421 fListHist->Add(fLinearVdriftTest);
422 fListHist->Add(fPH2dTest);
423 fListHist->Add(fCH2dTest);
424 fListHist->Add(fPH2dSM);
425 fListHist->Add(fCH2dSM);
426 fListHist->Add(fPH2dSum);
427 fListHist->Add(fCH2dSum);
431 /////////////////////////////////////////
432 // Second debug level
433 ///////////////////////////////////////
436 fNbGoodTracks = new TH2F(Form("NbGoodTracks_%s",(const char*)fName),"NbGoodTracks",500,0.0,2500.0,200,0.0,100.0);
437 fNbGoodTracks->SetXTitle("Nb of good tracks");
438 fNbGoodTracks->SetYTitle("Centrality");
439 fNbGoodTracks->SetStats(0);
441 fNbTRDTrack = new TH1F(Form("TRDTrack_%s",(const char*)fName),"TRDTrack",50,0,50);
442 fNbTRDTrack->Sumw2();
443 fNbTRDTrackOffline = new TH1F(Form("TRDTrackOffline_%s",(const char*)fName),"TRDTrackOffline",50,0,50);
444 fNbTRDTrackOffline->Sumw2();
445 fNbTRDTrackStandalone = new TH1F(Form("TRDTrackStandalone_%s",(const char*)fName),"TRDTrackStandalone",50,0,50);
446 fNbTRDTrackStandalone->Sumw2();
447 fNbTPCTRDtrack = new TH2F(Form("NbTPCTRDtrack_%s",(const char*)fName),"NbTPCTRDtrack",100,0,100,100,0,100);
448 fNbTPCTRDtrack->Sumw2();
450 fNbTimeBin = new TH1F(Form("NbTimeBin_%s",(const char*)fName),"NbTimeBin",35,0,35);
452 fNbTimeBinOffline = new TH1F(Form("NbTimeBinOffline_%s",(const char*)fName),"NbTimeBinOffline",35,0,35);
453 fNbTimeBinOffline->Sumw2();
454 fNbTimeBinStandalone = new TH1F(Form("NbTimeBinStandalone_%s",(const char*)fName),"NbTimeBinStandalone",35,0,35);
455 fNbTimeBinStandalone->Sumw2();
457 fNbClusters = new TH1F(Form("NbClusters_%s",(const char*)fName),"",35,0,35);
458 fNbClusters->Sumw2();
459 fNbClustersOffline = new TH1F(Form("NbClustersOffline_%s",(const char*)fName),"",35,0,35);
460 fNbClustersOffline->Sumw2();
461 fNbClustersStandalone = new TH1F(Form("NbClustersStandalone_%s",(const char*)fName),"",35,0,35);
462 fNbClustersStandalone->Sumw2();
464 fNbTracklets = new TH1F(Form("NbTracklets_%s",(const char*)fName),"NbTracklets",540,0.,540.);
465 fNbTracklets->Sumw2();
466 fNbTrackletsOffline = new TH1F(Form("NbTrackletsOffline_%s",(const char*)fName),"NbTrackletsOffline",540,0.,540.);
467 fNbTrackletsOffline->Sumw2();
468 fNbTrackletsStandalone = new TH1F(Form("NbTrackletsStandalone_%s",(const char*)fName),"NbTrackletsStandalone",540,0.,540.);
469 fNbTrackletsStandalone->Sumw2();
471 fListHist->Add(fNbGoodTracks);
473 fListHist->Add(fNbTRDTrack);
474 fListHist->Add(fNbTRDTrackOffline);
475 fListHist->Add(fNbTRDTrackStandalone);
476 fListHist->Add(fNbTPCTRDtrack);
478 fListHist->Add(fNbTimeBin);
479 fListHist->Add(fNbTimeBinOffline);
480 fListHist->Add(fNbTimeBinStandalone);
481 fListHist->Add(fNbClusters);
482 fListHist->Add(fNbClustersOffline);
483 fListHist->Add(fNbClustersStandalone);
484 fListHist->Add(fNbTracklets);
485 fListHist->Add(fNbTrackletsOffline);
486 fListHist->Add(fNbTrackletsStandalone);
490 delete [] binLimLogPt;
493 PostData(1,fListHist);
495 //cout << "AliTRDCalibTask::UserCreateOutputObjects() OUT" << endl;
499 //________________________________________________________________________
500 void AliTRDCalibTask::UserExec(Option_t *)
503 // Filling of the histos
505 //cout << "AliTRDCalibTask::Exec() IN" << endl;
507 // Init Versions and subversions used
508 if((fFirstRunGain==-1) || (fVersionGainUsed==-1) || (fSubVersionGainUsed==-1) || (fFirstRunGainLocal==-1) || (fVersionGainLocalUsed==-1) || (fSubVersionGainLocalUsed==-1) || (fFirstRunVdrift==-1) || (fVersionVdriftUsed==-1) || (fSubVersionVdriftUsed==-1)) {
509 if(!SetVersionSubversion()) {
510 PostData(1, fListHist);
516 fTRDCalibraFillHisto->SetFirstRunGain(fFirstRunGain); // Gain Used
517 fTRDCalibraFillHisto->SetVersionGainUsed(fVersionGainUsed); // Gain Used
518 fTRDCalibraFillHisto->SetSubVersionGainUsed(fSubVersionGainUsed); // Gain Used
519 fTRDCalibraFillHisto->SetFirstRunGainLocal(fFirstRunGainLocal); // Gain Used
520 fTRDCalibraFillHisto->SetVersionGainLocalUsed(fVersionGainLocalUsed); // Gain Used
521 fTRDCalibraFillHisto->SetSubVersionGainLocalUsed(fSubVersionGainLocalUsed); // Gain Used
522 fTRDCalibraFillHisto->SetFirstRunVdrift(fFirstRunVdrift); // Vdrift Used
523 fTRDCalibraFillHisto->SetVersionVdriftUsed(fVersionVdriftUsed); // Vdrift Used
524 fTRDCalibraFillHisto->SetSubVersionVdriftUsed(fSubVersionVdriftUsed); // Vdrift Used
525 if((fFirstRunExB != -1) && (fVersionExBUsed != -1) && (fSubVersionExBUsed != -1)){
526 fTRDCalibraFillHisto->SetFirstRunExB(fFirstRunExB); // ExB Used
527 fTRDCalibraFillHisto->SetVersionExBUsed(fVersionExBUsed); // ExB Used
528 fTRDCalibraFillHisto->SetSubVersionExBUsed(fSubVersionExBUsed); // ExB Used
530 fTRDCalibraFillHisto->InitCalDet();
535 name += fVersionGainUsed;
537 name += fSubVersionGainUsed;
539 name += fFirstRunGain;
541 fCH2dTest->SetTitle(name);
543 TString namee("Ver");
544 namee += fVersionVdriftUsed;
546 namee += fSubVersionVdriftUsed;
548 namee += fFirstRunVdrift;
549 namee += "Nz0Nrphi0";
550 fPH2dTest->SetTitle(namee);
554 // AliLog::SetGlobalLogLevel(AliLog::kError);
555 // cout << "AliTRDCalibTask::Exec() 1" << endl;
556 fESD = dynamic_cast<AliESDEvent*>(fInputEvent);
558 AliError("ESD Event missing");
559 PostData(1, fListHist);
563 const char* type = fESD->GetBeamType();
566 //printf("Counter %d\n",fCounter);
569 fNEventsInput->Fill(1);
571 //cout << "maxEvent = " << fMaxEvent << endl;
572 //if(fCounter%100==0) cout << "fCounter = " << fCounter << endl;
573 if((fMaxEvent != 0) && (fMaxEvent < fCounter)) {
574 PostData(1, fListHist);
577 //if(fCounter%100==0) cout << "fCounter1 = " << fCounter << endl;
578 //cout << "event = " << fCounter << endl;
580 //printf("Counter %d\n",fCounter);
587 if (fSelectTrigger) {
589 //printf("Will check the triggers\n");
591 Int_t numberOfTriggerSelected = fSelectedTrigger->GetEntriesFast();
592 //printf("numberofTriggerSelected %d\n",numberOfTriggerSelected);
595 for(Int_t k = 0; k < numberOfTriggerSelected; k++){
596 const TObjString *const obString=(TObjString*)fSelectedTrigger->At(k);
597 const TString tString=obString->GetString();
598 if(fESD->IsTriggerClassFired((const char*)tString)) {
605 for(Int_t k = 0; k < numberOfTriggerSelected; k++){
606 const TObjString *const obString=(TObjString*)fSelectedTrigger->At(k);
607 const TString tString=obString->GetString();
608 if(fESD->IsTriggerClassFired((const char*)tString)) {
614 PostData(1, fListHist);
620 //printf("Class Fired %s\n",(const char*)fESD->GetFiredTriggerClasses());
621 //printf("Trigger passed\n");
623 ///////////////////////////////
624 // Require a primary vertex
625 //////////////////////////////
626 if(fRequirePrimaryVertex) {
627 const AliESDVertex* vtxESD = 0x0;
628 if (fVtxTPC) vtxESD = fESD->GetPrimaryVertexTPC() ;
629 else if (fVtxSPD) vtxESD = fESD->GetPrimaryVertexSPD() ;
630 else vtxESD = fESD->GetPrimaryVertexTracks() ;
632 PostData(1, fListHist);
635 Int_t nCtrb = vtxESD->GetNContributors();
636 if(nCtrb < fMinNbContributors) {
637 PostData(1, fListHist);
640 Double_t zPosition = vtxESD->GetZ();
641 if(TMath::Abs(zPosition) > fRangePrimaryVertexZ) {
642 PostData(1, fListHist);
648 //printf("Primary vertex passed\n");
650 //////////////////////////////////////
651 // Requirement on number of good tracks
652 //////////////////////////////////////
653 Int_t nGoodParticles = 0;
654 Double_t nbTracks = fESD->GetNumberOfTracks();
655 for(Int_t itrack = 0; itrack < nbTracks; itrack++) {
656 if(ParticleGood(itrack)) nGoodParticles++;
660 AliCentrality *esdCentrality = fESD->GetCentrality();
661 Float_t centrality = esdCentrality->GetCentralityPercentile("V0M");
662 //Float_t centralityb = esdCentrality->GetCentralityPercentile("CL1");
663 fNbGoodTracks->Fill(nGoodParticles,centrality);
664 //printf("centrality %f, centralityb %f\n",centrality,centralityb);
667 //printf("Beam type %s\n",(const char*)type);
668 if (!strstr(type,"p-p")) {
669 //if (strstr(type,"A-A")) {
670 //printf("Will check the number of good tracks %f %f %f\n",nGoodParticles,fMinNbTracks,fMaxNbTracks);
671 if((nGoodParticles < fMinNbTracks) || (nGoodParticles > fMaxNbTracks)) {
672 PostData(1, fListHist);
680 Int_t nbTrdTracks = 0;
682 Int_t nbTrdTracksStandalone = 0;
684 Int_t nbTrdTracksOffline = 0;
686 Int_t nbtrackTPC = 0;
690 if (nbTracks <= 0.0) {
693 fNbTRDTrack->Fill(nbTrdTracks);
694 fNbTRDTrackStandalone->Fill(nbTrdTracksStandalone);
695 fNbTRDTrackOffline->Fill(nbTrdTracksOffline);
697 PostData(1, fListHist);
702 fESDfriend = dynamic_cast<AliESDfriend*> (fESD->FindListObject("AliESDfriend"));
704 AliError("fESDfriend not available");
705 PostData(1, fListHist);
709 if(fESDfriend->TestSkipBit()) {
710 PostData(1, fListHist);
714 //printf("has friends\n");
716 /////////////////////////////////////
717 // Loop on AliESDtrack
718 ////////////////////////////////////
719 //printf("Nb of tracks %f\n",nbTracks);
720 for(int itrk=0; itrk < nbTracks; ++itrk){
723 fkEsdTrack = fESD->GetTrack(itrk);
724 if(!fkEsdTrack) continue;
725 ULong_t status = fkEsdTrack->GetStatus();
726 if(status&(AliESDtrack::kTPCout)) ++nbtrackTPC;
728 fFriendTrack = fESDfriend->GetTrack(itrk);
730 //printf("No friend track %d\n",itrk);
737 Bool_t standalonetrack = kFALSE;
738 Bool_t offlinetrack = kFALSE;
739 //ULong_t status = fkEsdTrack->GetStatus();
741 //////////////////////////////////////
742 // Loop on calibration objects
743 //////////////////////////////////////
746 while((fCalibObject = (TObject *)(fFriendTrack->GetCalibObject(icalib++)))){
747 //printf("Name %s\n",fCalibObject->IsA()->GetName());
748 if(strcmp(fCalibObject->IsA()->GetName(), "AliTRDtrackV1") != 0) continue;
749 //printf("Find the calibration object\n");
752 if((status&(AliESDtrack::kTRDout)) && (!(status&(AliESDtrack::kTRDin)))) {
753 standalonetrack = kTRUE;
755 if((status&(AliESDtrack::kTRDin))) {
756 offlinetrack = kTRUE;
763 else if(fStandaloneTracks){
764 if(!standalonetrack){
769 fTrdTrack = (AliTRDtrackV1 *)fCalibObject;
770 // process chamberstatus
771 fTRDChamberStatus->ProcessTrack(fTrdTrack);
774 // Quality cuts on the AliESDtrack
775 if((fEsdTrackCuts) && (!fEsdTrackCuts->IsSelected((AliVParticle *)fkEsdTrack))) {
776 //printf("Not a good track\n");
780 // First Absolute gain calibration
781 Int_t trdNTracklets = (Int_t) fkEsdTrack->GetTRDntracklets();
782 Int_t trdNTrackletsPID = (Int_t) fkEsdTrack->GetTRDntrackletsPID();
783 //printf("Number of trd tracklets %d and PID trd tracklets %d\n",trdNTracklets,trdNTrackletsPID);
784 if((trdNTracklets > 0) && (trdNTrackletsPID > 0)) {
785 for(Int_t iPlane = 0; iPlane < 6; ++iPlane){
786 //Double_t slide = fkEsdTrack->GetTRDslice(iPlane);
787 //printf("Number of slide %d\n",fkEsdTrack->GetNumberOfTRDslices());
788 //Double_t momentum = fkEsdTrack->GetTRDmomentum(iPlane);
789 //printf("momentum %f, slide %f\n",momentum,slide);
790 if(fkEsdTrack->GetTRDslice(iPlane) > 0.0)
791 fAbsoluteGain->Fill(fkEsdTrack->GetTRDslice(iPlane)*8.0/100.0,
792 fkEsdTrack->GetTRDmomentum(iPlane));
797 if(!fTrdTrack) continue;
799 if(good && fOnInstance) {
800 //cout << "good" << endl;
801 fTRDCalibraFillHisto->UpdateHistogramsV1(fTrdTrack,fkEsdTrack);
802 //printf("Fill fTRDCalibraFillHisto\n");
806 const Double_t mag = AliTRDdEdxUtils::IsExBOn() ? fESD->GetMagneticField() : -1;
807 const Int_t charge = AliTRDdEdxUtils::IsExBOn() ? fkEsdTrack->Charge() : -1;
808 const Double_t toTPCscale = AliTRDdEdxUtils::GetCalibTPCscale(fkEsdTrack->GetTPCncls(), fkEsdTrack->GetTPCsignal());
810 AliTRDdEdxUtils::FillCalibHist(fTrdTrack, 0, mag, charge, toTPCscale);
814 //////////////////////////////////
816 ////////////////////////////////
820 //printf("Enter debug\n");
822 Int_t nbtracklets = 0;
825 Bool_t standalonetracklet = kFALSE;
826 const AliTRDseedV1 *tracklet = 0x0;
827 //////////////////////////////////////
829 /////////////////////////////////////
831 Double_t phtb[AliTRDseedV1::kNtb];
832 memset(phtb, 0, AliTRDseedV1::kNtb*sizeof(Double_t));
834 Float_t normalisation = 1.13;
837 for(Int_t itr = 0; itr < 6; ++itr){
839 if(!(tracklet = fTrdTrack->GetTracklet(itr))) continue;
840 if(!tracklet->IsOK()) continue;
842 standalonetracklet = kFALSE;
843 if(tracklet->IsStandAlone()) standalonetracklet = kTRUE;
846 memset(phtb, 0, AliTRDseedV1::kNtb*sizeof(Double_t));
850 //Int_t crossrow = 0;
852 // Check no shared clusters
853 //for(int icc=AliTRDseedV1::kNtb; icc<AliTRDseedV1::kNclusters; icc++){
854 // if((fcl = tracklet->GetClusters(icc))) crossrow = 1;
861 for(int ic=0; ic<AliTRDseedV1::kNtb; ++ic){
863 if(!(fCl = tracklet->GetClusters(ic))) continue;
865 time = fCl->GetPadTime();
866 //ch = tracklet->GetdQdl(ic);
867 ch = tracklet->GetQperTB(ic);
868 qcl = TMath::Abs(fCl->GetQ());
869 detector = fCl->GetDetector();
870 // Add the charge if shared cluster
871 if((ic+AliTRDseedV1::kNtb) < AliTRDseedV1::kNclusters) {
872 if((fCl = tracklet->GetClusters(ic+AliTRDseedV1::kNtb))) {
873 qcl += TMath::Abs(fCl->GetQ());
874 //printf("Add the cluster charge\n");
877 if((time>-1) && (time<fNbTimeBins)) phtb[time]=qcl;
878 if((fCalDetGain) && (fCalDetGain->GetValue(detector) > 0.0)) sum += ch*fCalDetGain->GetValue(detector)/normalisation;
879 else sum += ch/normalisation;
882 fNbTimeBin->Fill(time);
883 if(tracklet->IsStandAlone()) fNbTimeBinStandalone->Fill(time);
884 else fNbTimeBinOffline->Fill(time);
887 sector = AliTRDgeometry::GetSector(detector);
890 fNbTracklets->Fill(detector);
891 if(tracklet->IsStandAlone()) fNbTrackletsStandalone->Fill(detector);
892 else fNbTrackletsOffline->Fill(detector);
894 fNbClusters->Fill(nbclusters);
895 if(tracklet->IsStandAlone()) fNbClustersStandalone->Fill(nbclusters);
896 else fNbClustersOffline->Fill(nbclusters);
899 if((nbclusters > fLow) && (nbclusters < fHigh)){
900 if(fRelativeScale > 0.0) sum = sum/fRelativeScale;
901 fCH2dTest->Fill(sum,detector+0.5);
902 fCH2dSM->Fill(sum,sector+0.5);
903 fCH2dSum->Fill(sum,0.5);
904 Bool_t checknoise = kTRUE;
905 if(fMaxCluster > 0) {
906 if(phtb[0] > fMaxCluster) checknoise = kFALSE;
907 if(fNbTimeBins > fNbMaxCluster) {
908 for(Int_t k = (fNbTimeBins-fNbMaxCluster); k < fNbTimeBins; k++){
909 if(phtb[k] > fMaxCluster) checknoise = kFALSE;
914 for(int ic=0; ic<fNbTimeBins; ic++){
916 fPH2dTest->Fill((Double_t)(ic/10.0),detector+0.5,(Double_t)phtb[ic]);
917 fPH2dSum->Fill((Double_t)(ic/10.0),0.5,(Double_t)phtb[ic]);
918 fPH2dSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[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.0,(Double_t)phtb[ic]);
924 fPH2dSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[ic]);
930 if(detector == 0) FindP1TrackPHtrackletV1Test(tracklet,nbclusters);
932 } // loop on tracklets
937 if(nTRDtrackV1 > 0) {
939 if((status&(AliESDtrack::kTRDout)) && (!(status&(AliESDtrack::kTRDin)))) {
940 ++nbTrdTracksStandalone;
942 if((status&(AliESDtrack::kTRDin))) {
943 ++nbTrdTracksOffline;
946 //delete fFriendTrack;
950 fNbTRDTrack->Fill(nbTrdTracks);
951 fNbTRDTrackStandalone->Fill(nbTrdTracksStandalone);
952 fNbTRDTrackOffline->Fill(nbTrdTracksOffline);
953 fNbTPCTRDtrack->Fill(nbTrdTracks,nbtrackTPC);
957 PostData(1, fListHist);
958 //cout << "AliTRDCalibTask::Exec() OUT" << endl;
961 //________________________________________________________________________
962 void AliTRDCalibTask::Terminate(Option_t *)
968 if(fTRDCalibraFillHisto) fTRDCalibraFillHisto->DestroyDebugStreamer();
972 //_______________________________________________________
973 Bool_t AliTRDCalibTask::Load(const Char_t *filename)
976 // Generic container loader
979 if(!TFile::Open(filename)){
980 //AliWarning(Form("Couldn't open file %s.", filename));
984 if(!(o = (TList*)gFile->Get(GetName()))){
985 //AliWarning("Missing histogram container.");
988 fListHist = (TList*)o->Clone(GetName());
992 //_______________________________________________________
993 Bool_t AliTRDCalibTask::Load(TList *lister)
996 // Generic container loader
999 fListHist = (TList*)lister->Clone(GetName());
1002 //_______________________________________________________________________________________
1003 void AliTRDCalibTask::AddTask(const AliTRDCalibTask * calibTask) {
1009 TList *listcalibTask = calibTask->GetList();
1010 if(!listcalibTask) return;
1012 THnSparseI *histoEntries = (THnSparseI *) listcalibTask->FindObject("NumberOfEntries");
1014 TH1I *nEvents = (TH1I *) listcalibTask->FindObject(Form("NEvents_%s",(const char*)calibTask->GetName()));
1015 TH1I *nEventsInput = (TH1I *) listcalibTask->FindObject(Form("NEventsInput_%s",(const char*)calibTask->GetName()));
1016 TH2F *absoluteGain = (TH2F *) listcalibTask->FindObject(Form("AbsoluteGain_%s",(const char*)calibTask->GetName()));
1018 TH1F *trdTrack = (TH1F *) listcalibTask->FindObject(Form("TRDTrack_%s",(const char*)calibTask->GetName()));
1019 TH1F *trdTrackOffline = (TH1F *) listcalibTask->FindObject(Form("TRDTrackOffline_%s",(const char*)calibTask->GetName()));
1020 TH1F *trdTrackStandalone = (TH1F *) listcalibTask->FindObject(Form("TRDTrackStandalone_%s",(const char*)calibTask->GetName()));
1022 TH2F *tpctrdTrack = (TH2F *) listcalibTask->FindObject(Form("NbTPCTRDtrack_%s",(const char*)calibTask->GetName()));
1024 TH1F *nbTimeBin = (TH1F *) listcalibTask->FindObject(Form("NbTimeBin_%s",(const char*)calibTask->GetName()));
1025 TH1F *nbTimeBinOffline = (TH1F *) listcalibTask->FindObject(Form("NbTimeBinOffline_%s",(const char*)calibTask->GetName()));
1026 TH1F *nbTimeBinStandalone = (TH1F *) listcalibTask->FindObject(Form("NbTimeBinStandalone_%s",(const char*)calibTask->GetName()));
1028 TH1F *nbClusters = (TH1F *) listcalibTask->FindObject(Form("NbClusters_%s",(const char*)calibTask->GetName()));
1029 TH1F *nbClustersOffline = (TH1F *) listcalibTask->FindObject(Form("NbClustersOffline_%s",(const char*)calibTask->GetName()));
1030 TH1F *nbClustersStandalone = (TH1F *) listcalibTask->FindObject(Form("NbClustersStandalone_%s",(const char*)calibTask->GetName()));
1032 TH1F *nbTracklets = (TH1F *) listcalibTask->FindObject(Form("NbTracklets_%s",(const char*)calibTask->GetName()));
1033 TH1F *nbTrackletsOffline = (TH1F *) listcalibTask->FindObject(Form("NbTrackletsOffline_%s",(const char*)calibTask->GetName()));
1034 TH1F *nbTrackletsStandalone = (TH1F *) listcalibTask->FindObject(Form("NbTrackletsStandalone_%s",(const char*)calibTask->GetName()));
1036 TH2I *ch2d = (TH2I *) listcalibTask->FindObject("CH2d");
1037 TProfile2D *ph2d = (TProfile2D *) listcalibTask->FindObject("PH2d");
1038 TProfile2D *prf2d = (TProfile2D *) listcalibTask->FindObject("PRF2d");
1040 TH2I *ch2dSum = (TH2I *) listcalibTask->FindObject(Form("CH2dSum_%s",(const char*)calibTask->GetName()));
1041 TProfile2D *ph2dSum = (TProfile2D *) listcalibTask->FindObject(Form("PH2dSum_%s",(const char*)calibTask->GetName()));
1043 TH2I *ch2dSM = (TH2I *) listcalibTask->FindObject(Form("CH2dSM_%s",(const char*)calibTask->GetName()));
1044 TProfile2D *ph2dSM = (TProfile2D *) listcalibTask->FindObject(Form("PH2dSM_%s",(const char*)calibTask->GetName()));
1046 AliTRDCalibraVdriftLinearFit *linearfit = (AliTRDCalibraVdriftLinearFit *) listcalibTask->FindObject("AliTRDCalibraVdriftLinearFit");
1047 AliTRDCalibraExbAltFit *exbaltfit = (AliTRDCalibraExbAltFit *) listcalibTask->FindObject("AliTRDCalibraExbAltFit");
1048 AliTRDCalibraVector *calibraVector = (AliTRDCalibraVector *) listcalibTask->FindObject("AliTRDCalibraVector");
1052 THnSparseI *inhistoEntries = (THnSparseI *) fListHist->FindObject("NumberOfEntries");
1054 TH1I *inEventsInput = (TH1I *) fListHist->FindObject(Form("NEventsInput_%s",(const char*)fName));
1055 TH1I *inEvents = (TH1I *) fListHist->FindObject(Form("NEvents_%s",(const char*)fName));
1056 TH2F *iabsoluteGain = (TH2F *) fListHist->FindObject(Form("AbsoluteGain_%s",(const char*)fName));
1058 TH1F *itrdTrack = (TH1F *) fListHist->FindObject(Form("TRDTrack_%s",(const char*)fName));
1059 TH1F *itrdTrackOffline = (TH1F *) fListHist->FindObject(Form("TRDTrackOffline_%s",(const char*)fName));
1060 TH1F *itrdTrackStandalone = (TH1F *) fListHist->FindObject(Form("TRDTrackStandalone_%s",(const char*)fName));
1062 TH2F *itpctrdTrack = (TH2F *) fListHist->FindObject(Form("NbTPCTRDtrack_%s",(const char*)fName));
1064 TH1F *inbTimeBin = (TH1F *) fListHist->FindObject(Form("NbTimeBin_%s",(const char*)fName));
1065 TH1F *inbTimeBinOffline = (TH1F *) fListHist->FindObject(Form("NbTimeBinOffline_%s",(const char*)fName));
1066 TH1F *inbTimeBinStandalone = (TH1F *) fListHist->FindObject(Form("NbTimeBinStandalone_%s",(const char*)fName));
1068 TH1F *inbClusters = (TH1F *) fListHist->FindObject(Form("NbClusters_%s",(const char*)fName));
1069 TH1F *inbClustersOffline = (TH1F *) fListHist->FindObject(Form("NbClustersOffline_%s",(const char*)fName));
1070 TH1F *inbClustersStandalone = (TH1F *) fListHist->FindObject(Form("NbClustersStandalone_%s",(const char*)fName));
1072 TH1F *inbTracklets = (TH1F *) fListHist->FindObject(Form("NbTracklets_%s",(const char*)fName));
1073 TH1F *inbTrackletsOffline = (TH1F *) fListHist->FindObject(Form("NbTrackletsOffline_%s",(const char*)fName));
1074 TH1F *inbTrackletsStandalone = (TH1F *) fListHist->FindObject(Form("NbTrackletsStandalone_%s",(const char*)fName));
1076 TH2I *ich2d = (TH2I *) fListHist->FindObject("CH2d");
1077 TProfile2D *iph2d = (TProfile2D *) fListHist->FindObject("PH2d");
1078 TProfile2D *iprf2d = (TProfile2D *) fListHist->FindObject("PRF2d");
1080 TH2I *ich2dSum = (TH2I *) fListHist->FindObject(Form("CH2dSum_%s",(const char*)fName));
1081 TProfile2D *iph2dSum = (TProfile2D *) fListHist->FindObject(Form("PH2dSum_%s",(const char*)fName));
1083 TH2I *ich2dSM = (TH2I *) fListHist->FindObject(Form("CH2dSM_%s",(const char*)fName));
1084 TProfile2D *iph2dSM = (TProfile2D *) fListHist->FindObject(Form("PH2dSM_%s",(const char*)fName));
1086 AliTRDCalibraVdriftLinearFit *ilinearfit = (AliTRDCalibraVdriftLinearFit *) fListHist->FindObject("AliTRDCalibraVdriftLinearFit");
1087 AliTRDCalibraExbAltFit *iexbaltfit = (AliTRDCalibraExbAltFit *) fListHist->FindObject("AliTRDCalibraExbAltFit");
1088 AliTRDCalibraVector *icalibraVector = (AliTRDCalibraVector *) fListHist->FindObject("AliTRDCalibraVector");
1094 if(inhistoEntries) {
1095 inhistoEntries->Add(histoEntries);
1096 //printf("Add Events\n");
1099 //printf("Create new Events\n");
1100 inhistoEntries = (THnSparseI *) histoEntries->Clone();
1101 fListHist->Add(inhistoEntries);
1107 inEventsInput->Add(nEventsInput);
1108 //printf("Add Events\n");
1111 //printf("Create new Events\n");
1112 inEventsInput = new TH1I(*nEventsInput);
1113 fListHist->Add(inEventsInput);
1119 inEvents->Add(nEvents);
1120 //printf("Add Events\n");
1123 //printf("Create new Events\n");
1124 inEvents = new TH1I(*nEvents);
1125 fListHist->Add(inEvents);
1130 if(iabsoluteGain) iabsoluteGain->Add(absoluteGain);
1132 iabsoluteGain = new TH2F(*absoluteGain);
1133 fListHist->Add(iabsoluteGain);
1138 if(itrdTrack) itrdTrack->Add(trdTrack);
1140 itrdTrack = new TH1F(*trdTrack);
1141 fListHist->Add(itrdTrack);
1145 if(trdTrackOffline) {
1146 if(itrdTrackOffline) itrdTrackOffline->Add(trdTrackOffline);
1148 itrdTrackOffline = new TH1F(*trdTrackOffline);
1149 fListHist->Add(itrdTrackOffline);
1153 if(trdTrackStandalone) {
1154 if(itrdTrackStandalone) itrdTrackStandalone->Add(trdTrackStandalone);
1156 itrdTrackStandalone = new TH1F(*trdTrackStandalone);
1157 fListHist->Add(itrdTrackStandalone);
1162 if(itpctrdTrack) itpctrdTrack->Add(tpctrdTrack);
1164 itpctrdTrack = new TH2F(*tpctrdTrack);
1165 fListHist->Add(itpctrdTrack);
1170 if(inbTimeBin) inbTimeBin->Add(nbTimeBin);
1172 inbTimeBin = new TH1F(*inbTimeBin);
1173 fListHist->Add(inbTimeBin);
1177 if(nbTimeBinOffline) {
1178 if(inbTimeBinOffline) inbTimeBinOffline->Add(nbTimeBinOffline);
1180 inbTimeBinOffline = new TH1F(*nbTimeBinOffline);
1181 fListHist->Add(inbTimeBinOffline);
1185 if(nbTimeBinStandalone) {
1186 if(inbTimeBinStandalone) inbTimeBinStandalone->Add(nbTimeBinStandalone);
1188 inbTimeBinStandalone = new TH1F(*nbTimeBinStandalone);
1189 fListHist->Add(inbTimeBinStandalone);
1194 if(inbClusters) inbClusters->Add(nbClusters);
1196 inbClusters = new TH1F(*nbClusters);
1197 fListHist->Add(inbClusters);
1201 if(nbClustersOffline) {
1202 if(inbClustersOffline) inbClustersOffline->Add(nbClustersOffline);
1204 inbClustersOffline = new TH1F(*nbClustersOffline);
1205 fListHist->Add(inbClustersOffline);
1209 if(nbClustersStandalone) {
1210 if(inbClustersStandalone) inbClustersStandalone->Add(nbClustersStandalone);
1212 inbClustersStandalone = new TH1F(*nbClustersStandalone);
1213 fListHist->Add(inbClustersStandalone);
1218 if(inbTracklets) inbTracklets->Add(nbTracklets);
1220 inbTracklets = new TH1F(*nbTracklets);
1221 fListHist->Add(inbTracklets);
1225 if(nbTrackletsOffline) {
1226 if(inbTrackletsOffline) inbTrackletsOffline->Add(nbTrackletsOffline);
1228 inbTrackletsOffline = new TH1F(*nbTrackletsOffline);
1229 fListHist->Add(inbTrackletsOffline);
1233 if(nbTrackletsStandalone) {
1234 if(inbTrackletsStandalone) inbTrackletsStandalone->Add(nbTrackletsStandalone);
1236 inbTrackletsStandalone = new TH1F(*nbTrackletsStandalone);
1237 fListHist->Add(inbTrackletsStandalone);
1242 if(ich2d) ich2d->Add(ch2d);
1244 ich2d = new TH2I(*ch2d);
1245 fListHist->Add(ich2d);
1250 if(iph2d) iph2d->Add(ph2d);
1252 iph2d = new TProfile2D(*ph2d);
1253 fListHist->Add(iph2d);
1258 if(iprf2d) iprf2d->Add(prf2d);
1260 iprf2d = new TProfile2D(*prf2d);
1261 fListHist->Add(iprf2d);
1266 if(ich2dSum) ich2dSum->Add(ch2dSum);
1268 ich2dSum = new TH2I(*ch2dSum);
1269 fListHist->Add(ich2dSum);
1274 if(iph2dSum) iph2dSum->Add(ph2dSum);
1276 iph2dSum = new TProfile2D(*ph2dSum);
1277 fListHist->Add(iph2dSum);
1282 if(ich2dSM) ich2dSM->Add(ch2dSM);
1284 ich2dSM = new TH2I(*ch2dSM);
1285 fListHist->Add(ich2dSM);
1290 if(iph2dSM) iph2dSM->Add(ph2dSM);
1292 iph2dSM = new TProfile2D(*ph2dSM);
1293 fListHist->Add(iph2dSM);
1298 if(ilinearfit) ilinearfit->Add(linearfit);
1300 ilinearfit = new AliTRDCalibraVdriftLinearFit(*linearfit);
1301 fListHist->Add(ilinearfit);
1306 if(iexbaltfit) iexbaltfit->Add(exbaltfit);
1308 iexbaltfit = new AliTRDCalibraExbAltFit(*exbaltfit);
1309 fListHist->Add(iexbaltfit);
1314 if(icalibraVector) icalibraVector->Add(calibraVector);
1316 icalibraVector = new AliTRDCalibraVector(*calibraVector);
1317 fListHist->Add(icalibraVector);
1322 //________________________________________________________________________________
1323 Long64_t AliTRDCalibTask::Merge(TCollection *li) {
1329 TIterator* iter = li->MakeIterator();
1330 AliTRDCalibTask* cal = 0;
1332 while ((cal = (AliTRDCalibTask*)iter->Next())) {
1333 if (!cal->InheritsFrom(AliTRDCalibTask::Class())) {
1334 Error("Merge","Attempt to add object of class %s to a %s", cal->ClassName(), this->ClassName());
1338 // add histograms here...
1346 //_____________________________________________________
1347 Bool_t AliTRDCalibTask::SetVersionSubversion(){
1349 // Load Chamber Gain factors into the Tender supply
1352 //printf("SetVersionSubversion\n");
1354 //find previous entry from the UserInfo
1355 TTree *tree=((TChain*)GetInputData(0))->GetTree();
1357 AliError("Tree not found in ESDhandler");
1361 TList *userInfo=(TList*)tree->GetUserInfo();
1363 AliError("No UserInfo found in tree");
1367 TList *cdbList=(TList*)userInfo->FindObject("cdbList");
1369 AliError("No cdbList found in UserInfo");
1370 if (AliLog::GetGlobalLogLevel()>=AliLog::kError) userInfo->Print();
1374 TIter nextCDB(cdbList);
1376 while ( (os=(TObjString*)nextCDB()) ){
1377 if(os->GetString().Contains("TRD/Calib/ChamberGainFactor")){
1378 // Get Old gain calibration
1379 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1380 fFirstRunGain = id->GetFirstRun();
1381 fVersionGainUsed = id->GetVersion();
1382 fSubVersionGainUsed = id->GetSubVersion();
1383 } else if(os->GetString().Contains("TRD/Calib/ChamberVdrift")){
1384 // Get Old drift velocity calibration
1385 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1386 fFirstRunVdrift = id->GetFirstRun();
1387 fVersionVdriftUsed = id->GetVersion();
1388 fSubVersionVdriftUsed = id->GetSubVersion();
1389 } else if(os->GetString().Contains("TRD/Calib/LocalGainFactor")){
1390 // Get Old drift velocity calibration
1391 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1392 fFirstRunGainLocal = id->GetFirstRun();
1393 fVersionGainLocalUsed = id->GetVersion();
1394 fSubVersionGainLocalUsed = id->GetSubVersion();
1395 } else if((os->GetString().Contains("TRD/Calib/ChamberExB")) && (!os->GetString().Contains("TRD/Calib/ChamberExBAlt"))){
1396 // Get Old drift velocity calibration
1397 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1398 fFirstRunExB = id->GetFirstRun();
1399 fVersionExBUsed = id->GetVersion();
1400 fSubVersionExBUsed = id->GetSubVersion();
1401 //printf("Version %d and subversion %d\n",fVersionExBUsed,fSubVersionExBUsed);
1405 //printf("VersionGain %d, SubversionGain %d, VersionLocalGain %d, Subversionlocalgain %d, Versionvdrift %d, Subversionvdrift %d\n",fVersionGainUsed,fSubVersionGainUsed,fVersionGainLocalUsed,fSubVersionGainLocalUsed,fVersionVdriftUsed,fSubVersionVdriftUsed);
1408 if((fFirstRunGain < 0) ||
1409 (fFirstRunGainLocal < 0) ||
1410 (fFirstRunVdrift < 0) ||
1411 (fVersionGainUsed < 0) ||
1412 (fVersionGainLocalUsed < 0) ||
1413 (fSubVersionGainUsed < 0) ||
1414 (fSubVersionGainLocalUsed < 0) ||
1415 (fVersionVdriftUsed < 0) ||
1416 (fSubVersionVdriftUsed < 0)) {
1417 AliError("No recent calibration found");
1423 //_________________________________________________________________________________________________________________________
1424 Bool_t AliTRDCalibTask::ParticleGood(int i) const {
1427 // Definition of good tracks
1431 AliESDtrack *track = fESD->GetTrack(i);
1432 if (!track->IsOn(AliESDtrack::kTPCrefit)) return 0; // TPC refit
1433 if (track->GetTPCNcls() < 90) return 0; // number of TPC clusters
1434 if (fabs(track->Eta())>0.8) return 0; // fiducial pseudorapidity
1436 track->GetImpactParametersTPC(r,z);
1437 if (fabs(z)>2.0) return 0; // impact parameter in z
1438 if (fabs(r)>2.0) return 0; // impact parameter in xy
1444 //______________________________________________________________________________________________________________________
1445 Bool_t AliTRDCalibTask::FindP1TrackPHtrackletV1Test(const AliTRDseedV1 *tracklet, Int_t nbclusters)
1448 // Drift velocity calibration:
1449 // Fit the clusters with a straight line
1450 // From the slope find the drift velocity
1453 ////////////////////////////////////////////////
1454 //Number of points: if less than 3 return kFALSE
1455 /////////////////////////////////////////////////
1456 if(nbclusters <= 2) return kFALSE;
1461 // results of the linear fit
1462 Double_t dydt = 0.0; // dydt tracklet after straight line fit
1463 Double_t errorpar = 0.0; // error after straight line fit on dy/dt
1464 Double_t pointError = 0.0; // error after straight line fit
1465 // pad row problemes: avoid tracklet that cross pad rows, tilting angle in the constant
1466 Int_t crossrow = 0; // if it crosses a pad row
1467 Int_t rowp = -1; // if it crosses a pad row
1468 Float_t tnt = tracklet->GetTilt(); // tan tiltingangle
1469 TLinearFitter linearFitterTracklet(2,"pol1");
1470 linearFitterTracklet.StoreData(kTRUE);
1473 ///////////////////////////////////////////
1474 // Take the parameters of the track
1475 //////////////////////////////////////////
1476 // take now the snp, tnp and tgl from the track
1477 Double_t snp = tracklet->GetSnp(); // sin dy/dx at the end of the chamber
1478 Double_t tnp = 0.0; // dy/dx at the end of the chamber
1479 if( TMath::Abs(snp) < 1.){
1480 tnp = snp / TMath::Sqrt((1.-snp)*(1.+snp));
1482 Double_t tgl = tracklet->GetTgl(); // dz/dl
1483 Double_t dzdx = tgl*TMath::Sqrt(1+tnp*tnp); // dz/dx calculated from dz/dl
1485 //Double_t tnp = tracklet->GetYref(1); // dy/dx at the entrance of the chamber
1486 //Double_t tgl = tracklet->GetZref(1); // dz/dl at the entrance of the chamber
1487 //Double_t dzdx = tgl; //*TMath::Sqrt(1+tnp*tnp); // dz/dx from dz/dl
1488 // at the end with correction due to linear fit
1489 //Double_t tnp = tracklet->GetYfit(1); // dy/dx at the end of the chamber after fit correction
1490 //Double_t tgl = tracklet->GetZfit(1); // dz/dl at the end of the chamber after fit correction
1493 ////////////////////////////
1494 // loop over the clusters
1495 ////////////////////////////
1497 AliTRDcluster *cl = 0x0;
1498 //////////////////////////////
1499 // Check no shared clusters
1500 //////////////////////////////
1501 for(int icc=AliTRDseedV1::kNtb; icc<AliTRDseedV1::kNclusters; icc++){
1502 cl = tracklet->GetClusters(icc);
1503 if(cl) crossrow = 1;
1505 //////////////////////////////////
1507 //////////////////////////////////
1508 for(int ic=0; ic<AliTRDseedV1::kNtb; ic++){
1509 if(!(cl = tracklet->GetClusters(ic))) continue;
1510 //if((fLimitChargeIntegration) && (!cl->IsInChamber())) continue;
1512 Double_t ycluster = cl->GetY();
1513 Int_t time = cl->GetPadTime();
1514 Double_t timeis = time/10.0;
1515 //See if cross two pad rows
1516 Int_t row = cl->GetPadRow();
1517 if(rowp==-1) rowp = row;
1518 if(row != rowp) crossrow = 1;
1520 linearFitterTracklet.AddPoint(&timeis,ycluster,1);
1526 ////////////////////////////////////
1527 // Do the straight line fit now
1528 ///////////////////////////////////
1530 linearFitterTracklet.ClearPoints();
1534 linearFitterTracklet.Eval();
1535 linearFitterTracklet.GetParameters(pars);
1536 pointError = TMath::Sqrt(linearFitterTracklet.GetChisquare()/(nbli-2));
1537 errorpar = linearFitterTracklet.GetParError(1)*pointError;
1539 //printf("chis %f, nbli %d, pointError %f, parError %f, errorpar %f\n",linearFitterTracklet->GetChisquare(),nbli,pointError,linearFitterTracklet->GetParError(1),errorpar);
1540 linearFitterTracklet.ClearPoints();
1542 /////////////////////////
1544 ////////////////////////
1546 if(nbclusters < fLow) return kFALSE;
1547 if(nbclusters > fHigh) return kFALSE;
1548 if(pointError >= 0.3) return kFALSE;
1549 if(crossrow == 1) return kTRUE;
1551 ///////////////////////
1553 //////////////////////
1556 //Add to the linear fitter of the detector
1557 if( TMath::Abs(snp) < 1.){
1558 Double_t x = tnp-dzdx*tnt;
1559 //if(!fLinearVdriftTest) printf("Not there\n");
1560 Double_t nbentries = fLinearVdriftTest->GetEntries();
1561 if(nbentries < (5.0*32767)) fLinearVdriftTest->Fill(x,dydt);