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(100),
138 fSelectTrigger(kTRUE),
139 fSelectedTrigger(new TObjArray()),
142 fRequirePrimaryVertex(kFALSE),
145 fMinNbContributors(0),
146 fRangePrimaryVertexZ(9999999.0),
148 fMaxNbTracks(999999999),
149 fCutWithVdriftCalib(kFALSE),
150 fMinNbTRDtracklets(0),
152 fScaleGainWithTPCSignal(kFALSE),
156 fNormalizeNbOfCluster(kFALSE),
160 fOfflineTracks(kFALSE),
161 fStandaloneTracks(kFALSE),
163 fVersionGainUsed(-1),
164 fSubVersionGainUsed(-1),
165 fFirstRunGainLocal(-1),
166 fVersionGainLocalUsed(-1),
167 fSubVersionGainLocalUsed(-1),
169 fVersionVdriftUsed(-1),
170 fSubVersionVdriftUsed(-1),
173 fSubVersionExBUsed(-1),
180 // Default constructor
192 // Define input and output slots here
193 // Input slot #0 works with a TChain
194 DefineInput(0, TChain::Class());
196 // Output slot #0 writes into a TList container
197 DefineOutput(1, TList::Class());
201 //____________________________________________________________________________________
202 AliTRDCalibTask::~AliTRDCalibTask()
205 // AliTRDCalibTask destructor
209 if(fNEvents) delete fNEvents;
210 if(fNEventsInput) delete fNEventsInput;
211 if(fNbTRDTrack) delete fNbTRDTrack;
212 if(fNbTRDTrackOffline) delete fNbTRDTrackOffline;
213 if(fNbTRDTrackStandalone) delete fNbTRDTrackStandalone;
214 if(fNbTPCTRDtrack) delete fNbTPCTRDtrack;
215 if(fNbGoodTracks) delete fNbGoodTracks;
216 if(fNbTimeBin) delete fNbTimeBin;
217 if(fNbTimeBinOffline) delete fNbTimeBinOffline;
218 if(fNbTimeBinStandalone) delete fNbTimeBinStandalone;
219 if(fNbClusters) delete fNbClusters;
220 if(fNbClustersOffline) delete fNbClustersOffline;
221 if(fNbClustersStandalone) delete fNbClustersStandalone;
222 if(fNbTracklets) delete fNbTracklets;
223 if(fNbTrackletsOffline) delete fNbTrackletsOffline;
224 if(fNbTrackletsStandalone) delete fNbTrackletsStandalone;
225 if(fAbsoluteGain) delete fAbsoluteGain;
226 if(fCH2dSum) delete fCH2dSum;
227 if(fPH2dSum) delete fPH2dSum;
228 if(fCH2dSM) delete fCH2dSM;
229 if(fPH2dSM) delete fPH2dSM;
230 if(fCH2dTest) delete fCH2dTest;
231 if(fPH2dTest) delete fPH2dTest;
232 if(fLinearVdriftTest) delete fLinearVdriftTest;
234 AliTRDdEdxCalibUtils::DeleteHistArray();
237 if(fCalDetGain) delete fCalDetGain;
239 if(fSelectedTrigger) {
240 fSelectedTrigger->Delete();
241 delete fSelectedTrigger;
244 delete fEsdTrackCuts;
247 if(fTRDChamberStatus) delete fTRDChamberStatus;
251 //________________________________________________________________________
252 void AliTRDCalibTask::UserCreateOutputObjects()
257 //cout << "AliTRDCalibTask::CreateOutputObjects() IN" << endl;
259 // Number of time bins
261 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
262 fNbTimeBins = cal->GetNumberOfTimeBinsDCS();
263 if(fNbTimeBins <= 0){
264 AliWarning(Form("No of TimeBins from DB [%d] use default [30]", fNbTimeBins));
270 fListHist = new TList();
271 fListHist->SetOwner();
273 // init chamber status
274 fTRDChamberStatus = new AliTRDCalibChamberStatus();
275 fTRDChamberStatus->Init();
276 fListHist->Add(fTRDChamberStatus->GetSparseI());
278 // instance calibration
279 fTRDCalibraFillHisto = AliTRDCalibraFillHisto::Instance();
281 fTRDCalibraFillHisto->SetNumberBinCharge(fNumberBinCharge); // set number of bin of the charge distribution
282 fTRDCalibraFillHisto->SetCutWithVdriftCalib(fCutWithVdriftCalib); // cut vdrift
283 fTRDCalibraFillHisto->SetMinNbTRDtracklets(fMinNbTRDtracklets); // min number of TRD tracklets
284 fTRDCalibraFillHisto->SetMinTRDMomentum(fMinTRDMomentum); // min TRD momentum
285 fTRDCalibraFillHisto->SetHisto2d(fHisto2d); // choose to use histograms
286 fTRDCalibraFillHisto->SetVector2d(fVector2d); // choose to use vectors
287 fTRDCalibraFillHisto->SetCH2dOn(); // choose to calibrate the gain
288 fTRDCalibraFillHisto->SetPH2dOn(); // choose to calibrate the drift velocity
289 fTRDCalibraFillHisto->SetPRF2dOn(); // choose to look at the PRF
290 fTRDCalibraFillHisto->SetLinearFitterOn(fVdriftLinear); // Other possibility vdrift VDRIFT
291 fTRDCalibraFillHisto->SetLinearFitterDebugOn(fVdriftLinear); // Other possibility vdrift
292 fTRDCalibraFillHisto->SetExbAltFitOn(fExbAlt); // Alternative method for exb
293 fTRDCalibraFillHisto->SetScaleWithTPCSignal(fScaleGainWithTPCSignal); // Scale Gain with TPC signal
294 for(Int_t k = 0; k < 3; k++){
295 if(((fNz[k] != 10) && (fNrphi[k] != 10)) && ((fNz[k] != 100) && (fNrphi[k] != 100))) {
296 fTRDCalibraFillHisto->SetNz(k,fNz[k]); // Mode calibration
297 fTRDCalibraFillHisto->SetNrphi(k,fNrphi[k]); // Mode calibration
300 if((fNz[k] == 100) && (fNrphi[k] == 100)) {
301 if(fVector2d) AliInfo("The mode all together is not supported by the vector method");
302 fTRDCalibraFillHisto->SetAllTogether(k);
304 if((fNz[k] == 10) && (fNrphi[k] == 10)) {
305 if(fVector2d) AliInfo("The mode per supermodule is not supported by the vector method");
306 fTRDCalibraFillHisto->SetPerSuperModule(k);
310 // Variables for how to fill
311 fTRDCalibraFillHisto->SetFillWithZero(fFillZero);
312 fTRDCalibraFillHisto->SetNormalizeNbOfCluster(fNormalizeNbOfCluster);
313 fTRDCalibraFillHisto->SetMaxCluster(fMaxCluster);
314 fTRDCalibraFillHisto->SetNbMaxCluster(fNbMaxCluster);
316 // Init with 30 timebins
317 fTRDCalibraFillHisto->Init2Dhistos(fNbTimeBins); // initialise the histos
318 fTRDCalibraFillHisto->SetNumberClusters(fLow); // At least 11 clusters
319 fTRDCalibraFillHisto->SetNumberClustersf(fHigh); // At least 11 clusters
322 fTRDCalibraFillHisto->SetDebugLevel(fDebugLevelTRDCalibraFillHisto); //debug stuff
325 fListHist->Add(fTRDCalibraFillHisto->GetCH2d());
326 fListHist->Add(fTRDCalibraFillHisto->GetPH2d());
327 fListHist->Add(fTRDCalibraFillHisto->GetPRF2d());
330 AliTRDCalibraVdriftLinearFit *fvdl = fTRDCalibraFillHisto->GetVdriftLinearFit();
332 fvdl->SetNbBindx(fVdBindx);
333 fvdl->SetNbBindy(fVdBindy);
334 fvdl->SetRangedx(fVdRangex);
335 fvdl->SetRangedy(fVdRangey);
337 fListHist->Add((TObject *)fTRDCalibraFillHisto->GetVdriftLinearFit());
339 if(fVector2d) fListHist->Add((TObject *) fTRDCalibraFillHisto->GetCalibraVector()); //calibra vector
340 if(fExbAlt) fListHist->Add((TObject *)fTRDCalibraFillHisto->GetExbAltFit());
342 fRelativeScale = fTRDCalibraFillHisto->GetRelativeScale(); // Get the relative scale for the gain
344 fNEvents = new TH1I(Form("NEvents_%s",(const char*)fName),"NEvents", 2, 0, 2);
345 fListHist->Add(fNEvents);
346 fNEventsInput = new TH1I(Form("NEventsInput_%s",(const char*)fName),"NEventsInput", 2, 0, 2);
347 fListHist->Add(fNEventsInput);
349 // absolute gain calibration even without AliESDfriend
351 Double_t minPt = 0.001;
352 Double_t maxPt = 10.0;
354 Double_t *binLimLogPt = new Double_t[nBinsPt+1];
355 Double_t *binLimPt = new Double_t[nBinsPt+1];
356 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 ;
357 for(Int_t i=0; i<=nBinsPt; i++) binLimPt[i]=(Double_t)TMath::Power(10,binLimLogPt[i]);
359 fAbsoluteGain = new TH2F(Form("AbsoluteGain_%s",(const char*)fName),"AbsoluteGain", 200, 0.0, 700.0, nBinsPt, binLimPt);
360 fAbsoluteGain->SetYTitle("Momentum at TRD");
361 fAbsoluteGain->SetXTitle("charge deposit [a.u]");
362 fAbsoluteGain->SetZTitle("counts");
363 fAbsoluteGain->SetStats(0);
364 fAbsoluteGain->Sumw2();
365 fListHist->Add(fAbsoluteGain);
368 printf("\n AliTRDCalibTask PHQ is on!! \n\n");
369 AliTRDdEdxBaseUtils::PrintControl();
370 AliTRDdEdxCalibUtils::IniHistArray(fListHist, kTRUE);
373 printf("\n AliTRDCalibTask PHQ is off!! \n\n");
376 /////////////////////////////////////////
378 ///////////////////////////////////////
381 fLinearVdriftTest = new TH2S(Form("LFDV0testversion_%s",(const char*)fName),"LFDV0testversion",36,-0.9,0.9,48,-1.2,1.2);
382 fLinearVdriftTest->SetXTitle("tan(phi_{track})");
383 fLinearVdriftTest->SetYTitle("dy/dt");
384 fLinearVdriftTest->SetZTitle("Number of tracklets");
385 fLinearVdriftTest->SetStats(0);
386 fLinearVdriftTest->SetDirectory(0);
388 // Standart with AliESDfriend
389 fPH2dTest = new TProfile2D(Form("PH2dTest_%s",(const char*)fName),"Nz0Nrphi0"
390 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
392 fPH2dTest->SetYTitle("Det/pad groups");
393 fPH2dTest->SetXTitle("time [#mus]");
394 fPH2dTest->SetZTitle("<PH> [a.u.]");
395 fPH2dTest->SetStats(0);
397 fCH2dTest = new TH2I(Form("CH2dTest_%s",(const char*)fName),"Nz0Nrphi0",50,0,300,540,0,540);
398 fCH2dTest->SetYTitle("Det/pad groups");
399 fCH2dTest->SetXTitle("charge deposit [a.u]");
400 fCH2dTest->SetZTitle("counts");
401 fCH2dTest->SetStats(0);
405 fPH2dSM = new TProfile2D(Form("PH2dSM_%s",(const char*)fName),"Nz10Nrphi10"
406 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
408 fPH2dSM->SetYTitle("Det/pad groups");
409 fPH2dSM->SetXTitle("time [#mus]");
410 fPH2dSM->SetZTitle("<PH> [a.u.]");
411 fPH2dSM->SetStats(0);
413 fCH2dSM = new TH2I(Form("CH2dSM_%s",(const char*)fName),"Nz10Nrphi10",50,0,300,18,0,18);
414 fCH2dSM->SetYTitle("Det/pad groups");
415 fCH2dSM->SetXTitle("charge deposit [a.u]");
416 fCH2dSM->SetZTitle("counts");
417 fCH2dSM->SetStats(0);
420 fPH2dSum = new TProfile2D(Form("PH2dSum_%s",(const char*)fName),"Nz100Nrphi100"
421 ,fNbTimeBins,-0.05,(Double_t)((fNbTimeBins-0.5)/10.0)
423 fPH2dSum->SetYTitle("Det/pad groups");
424 fPH2dSum->SetXTitle("time [#mus]");
425 fPH2dSum->SetZTitle("<PH> [a.u.]");
426 fPH2dSum->SetStats(0);
428 fCH2dSum = new TH2I(Form("CH2dSum_%s",(const char*)fName),"Nz100Nrphi100",50,0,300,1,0,1);
429 fCH2dSum->SetYTitle("Det/pad groups");
430 fCH2dSum->SetXTitle("charge deposit [a.u]");
431 fCH2dSum->SetZTitle("counts");
432 fCH2dSum->SetStats(0);
437 fListHist->Add(fLinearVdriftTest);
438 fListHist->Add(fPH2dTest);
439 fListHist->Add(fCH2dTest);
440 fListHist->Add(fPH2dSM);
441 fListHist->Add(fCH2dSM);
442 fListHist->Add(fPH2dSum);
443 fListHist->Add(fCH2dSum);
447 /////////////////////////////////////////
448 // Second debug level
449 ///////////////////////////////////////
452 fNbGoodTracks = new TH2F(Form("NbGoodTracks_%s",(const char*)fName),"NbGoodTracks",500,0.0,2500.0,200,0.0,100.0);
453 fNbGoodTracks->SetXTitle("Nb of good tracks");
454 fNbGoodTracks->SetYTitle("Centrality");
455 fNbGoodTracks->SetStats(0);
457 fNbTRDTrack = new TH1F(Form("TRDTrack_%s",(const char*)fName),"TRDTrack",50,0,50);
458 fNbTRDTrack->Sumw2();
459 fNbTRDTrackOffline = new TH1F(Form("TRDTrackOffline_%s",(const char*)fName),"TRDTrackOffline",50,0,50);
460 fNbTRDTrackOffline->Sumw2();
461 fNbTRDTrackStandalone = new TH1F(Form("TRDTrackStandalone_%s",(const char*)fName),"TRDTrackStandalone",50,0,50);
462 fNbTRDTrackStandalone->Sumw2();
463 fNbTPCTRDtrack = new TH2F(Form("NbTPCTRDtrack_%s",(const char*)fName),"NbTPCTRDtrack",100,0,100,100,0,100);
464 fNbTPCTRDtrack->Sumw2();
466 fNbTimeBin = new TH1F(Form("NbTimeBin_%s",(const char*)fName),"NbTimeBin",35,0,35);
468 fNbTimeBinOffline = new TH1F(Form("NbTimeBinOffline_%s",(const char*)fName),"NbTimeBinOffline",35,0,35);
469 fNbTimeBinOffline->Sumw2();
470 fNbTimeBinStandalone = new TH1F(Form("NbTimeBinStandalone_%s",(const char*)fName),"NbTimeBinStandalone",35,0,35);
471 fNbTimeBinStandalone->Sumw2();
473 fNbClusters = new TH1F(Form("NbClusters_%s",(const char*)fName),"",35,0,35);
474 fNbClusters->Sumw2();
475 fNbClustersOffline = new TH1F(Form("NbClustersOffline_%s",(const char*)fName),"",35,0,35);
476 fNbClustersOffline->Sumw2();
477 fNbClustersStandalone = new TH1F(Form("NbClustersStandalone_%s",(const char*)fName),"",35,0,35);
478 fNbClustersStandalone->Sumw2();
480 fNbTracklets = new TH1F(Form("NbTracklets_%s",(const char*)fName),"NbTracklets",540,0.,540.);
481 fNbTracklets->Sumw2();
482 fNbTrackletsOffline = new TH1F(Form("NbTrackletsOffline_%s",(const char*)fName),"NbTrackletsOffline",540,0.,540.);
483 fNbTrackletsOffline->Sumw2();
484 fNbTrackletsStandalone = new TH1F(Form("NbTrackletsStandalone_%s",(const char*)fName),"NbTrackletsStandalone",540,0.,540.);
485 fNbTrackletsStandalone->Sumw2();
487 fListHist->Add(fNbGoodTracks);
489 fListHist->Add(fNbTRDTrack);
490 fListHist->Add(fNbTRDTrackOffline);
491 fListHist->Add(fNbTRDTrackStandalone);
492 fListHist->Add(fNbTPCTRDtrack);
494 fListHist->Add(fNbTimeBin);
495 fListHist->Add(fNbTimeBinOffline);
496 fListHist->Add(fNbTimeBinStandalone);
497 fListHist->Add(fNbClusters);
498 fListHist->Add(fNbClustersOffline);
499 fListHist->Add(fNbClustersStandalone);
500 fListHist->Add(fNbTracklets);
501 fListHist->Add(fNbTrackletsOffline);
502 fListHist->Add(fNbTrackletsStandalone);
506 delete [] binLimLogPt;
509 PostData(1,fListHist);
511 //cout << "AliTRDCalibTask::UserCreateOutputObjects() OUT" << endl;
515 //________________________________________________________________________
516 void AliTRDCalibTask::UserExec(Option_t *)
519 // Filling of the histos
521 //cout << "AliTRDCalibTask::Exec() IN" << endl;
523 // Init Versions and subversions used
524 if((fFirstRunGain==-1) || (fVersionGainUsed==-1) || (fSubVersionGainUsed==-1) || (fFirstRunGainLocal==-1) || (fVersionGainLocalUsed==-1) || (fSubVersionGainLocalUsed==-1) || (fFirstRunVdrift==-1) || (fVersionVdriftUsed==-1) || (fSubVersionVdriftUsed==-1)) {
525 if(!SetVersionSubversion()) {
526 PostData(1, fListHist);
532 fTRDCalibraFillHisto->SetFirstRunGain(fFirstRunGain); // Gain Used
533 fTRDCalibraFillHisto->SetVersionGainUsed(fVersionGainUsed); // Gain Used
534 fTRDCalibraFillHisto->SetSubVersionGainUsed(fSubVersionGainUsed); // Gain Used
535 fTRDCalibraFillHisto->SetFirstRunGainLocal(fFirstRunGainLocal); // Gain Used
536 fTRDCalibraFillHisto->SetVersionGainLocalUsed(fVersionGainLocalUsed); // Gain Used
537 fTRDCalibraFillHisto->SetSubVersionGainLocalUsed(fSubVersionGainLocalUsed); // Gain Used
538 fTRDCalibraFillHisto->SetFirstRunVdrift(fFirstRunVdrift); // Vdrift Used
539 fTRDCalibraFillHisto->SetVersionVdriftUsed(fVersionVdriftUsed); // Vdrift Used
540 fTRDCalibraFillHisto->SetSubVersionVdriftUsed(fSubVersionVdriftUsed); // Vdrift Used
541 if((fFirstRunExB != -1) && (fVersionExBUsed != -1) && (fSubVersionExBUsed != -1)){
542 fTRDCalibraFillHisto->SetFirstRunExB(fFirstRunExB); // ExB Used
543 fTRDCalibraFillHisto->SetVersionExBUsed(fVersionExBUsed); // ExB Used
544 fTRDCalibraFillHisto->SetSubVersionExBUsed(fSubVersionExBUsed); // ExB Used
546 fTRDCalibraFillHisto->InitCalDet();
551 name += fVersionGainUsed;
553 name += fSubVersionGainUsed;
555 name += fFirstRunGain;
557 fCH2dTest->SetTitle(name);
559 TString namee("Ver");
560 namee += fVersionVdriftUsed;
562 namee += fSubVersionVdriftUsed;
564 namee += fFirstRunVdrift;
565 namee += "Nz0Nrphi0";
566 fPH2dTest->SetTitle(namee);
570 // AliLog::SetGlobalLogLevel(AliLog::kError);
571 // cout << "AliTRDCalibTask::Exec() 1" << endl;
572 fESD = dynamic_cast<AliESDEvent*>(fInputEvent);
574 AliError("ESD Event missing");
575 PostData(1, fListHist);
579 const char* type = fESD->GetBeamType();
582 //printf("Counter %d\n",fCounter);
585 fNEventsInput->Fill(1);
587 //cout << "maxEvent = " << fMaxEvent << endl;
588 //if(fCounter%100==0) cout << "fCounter = " << fCounter << endl;
589 if((fMaxEvent != 0) && (fMaxEvent < fCounter)) {
590 PostData(1, fListHist);
593 //if(fCounter%100==0) cout << "fCounter1 = " << fCounter << endl;
594 //cout << "event = " << fCounter << endl;
596 //printf("Counter %d\n",fCounter);
603 if (fSelectTrigger) {
605 //printf("Will check the triggers\n");
607 Int_t numberOfTriggerSelected = fSelectedTrigger->GetEntriesFast();
608 //printf("numberofTriggerSelected %d\n",numberOfTriggerSelected);
611 for(Int_t k = 0; k < numberOfTriggerSelected; k++){
612 const TObjString *const obString=(TObjString*)fSelectedTrigger->At(k);
613 const TString tString=obString->GetString();
614 if(fESD->IsTriggerClassFired((const char*)tString)) {
621 for(Int_t k = 0; k < numberOfTriggerSelected; k++){
622 const TObjString *const obString=(TObjString*)fSelectedTrigger->At(k);
623 const TString tString=obString->GetString();
624 if(fESD->IsTriggerClassFired((const char*)tString)) {
630 PostData(1, fListHist);
636 //printf("Class Fired %s\n",(const char*)fESD->GetFiredTriggerClasses());
637 //printf("Trigger passed\n");
639 ///////////////////////////////
640 // Require a primary vertex
641 //////////////////////////////
642 if(fRequirePrimaryVertex) {
643 const AliESDVertex* vtxESD = 0x0;
644 if (fVtxTPC) vtxESD = fESD->GetPrimaryVertexTPC() ;
645 else if (fVtxSPD) vtxESD = fESD->GetPrimaryVertexSPD() ;
646 else vtxESD = fESD->GetPrimaryVertexTracks() ;
648 PostData(1, fListHist);
651 Int_t nCtrb = vtxESD->GetNContributors();
652 if(nCtrb < fMinNbContributors) {
653 PostData(1, fListHist);
656 Double_t zPosition = vtxESD->GetZ();
657 if(TMath::Abs(zPosition) > fRangePrimaryVertexZ) {
658 PostData(1, fListHist);
664 //printf("Primary vertex passed\n");
666 //////////////////////////////////////
667 // Requirement on number of good tracks
668 //////////////////////////////////////
669 Int_t nGoodParticles = 0;
670 Double_t nbTracks = fESD->GetNumberOfTracks();
671 for(Int_t itrack = 0; itrack < nbTracks; itrack++) {
672 if(ParticleGood(itrack)) nGoodParticles++;
676 AliCentrality *esdCentrality = fESD->GetCentrality();
677 Float_t centrality = esdCentrality->GetCentralityPercentile("V0M");
678 //Float_t centralityb = esdCentrality->GetCentralityPercentile("CL1");
679 fNbGoodTracks->Fill(nGoodParticles,centrality);
680 //printf("centrality %f, centralityb %f\n",centrality,centralityb);
683 //printf("Beam type %s\n",(const char*)type);
684 if (!strstr(type,"p-p")) {
685 //if (strstr(type,"A-A")) {
686 //printf("Will check the number of good tracks %f %f %f\n",nGoodParticles,fMinNbTracks,fMaxNbTracks);
687 if((nGoodParticles < fMinNbTracks) || (nGoodParticles > fMaxNbTracks)) {
688 PostData(1, fListHist);
696 Int_t nbTrdTracks = 0;
698 Int_t nbTrdTracksStandalone = 0;
700 Int_t nbTrdTracksOffline = 0;
702 Int_t nbtrackTPC = 0;
706 if (nbTracks <= 0.0) {
709 fNbTRDTrack->Fill(nbTrdTracks);
710 fNbTRDTrackStandalone->Fill(nbTrdTracksStandalone);
711 fNbTRDTrackOffline->Fill(nbTrdTracksOffline);
713 PostData(1, fListHist);
718 fESDfriend = dynamic_cast<AliESDfriend*> (fESD->FindListObject("AliESDfriend"));
720 AliError("fESDfriend not available");
721 PostData(1, fListHist);
725 if(fESDfriend->TestSkipBit()) {
726 PostData(1, fListHist);
730 //printf("has friends\n");
732 /////////////////////////////////////
733 // Loop on AliESDtrack
734 ////////////////////////////////////
735 //printf("Nb of tracks %f\n",nbTracks);
736 Int_t nbTracksfriends = fESDfriend->GetNumberOfTracks();
737 for(int itrk=0; itrk < nbTracksfriends; ++itrk){
740 fkEsdTrack = fESD->GetTrack(itrk);
741 if(!fkEsdTrack) continue;
742 ULong_t status = fkEsdTrack->GetStatus();
743 if(status&(AliESDtrack::kTPCout)) ++nbtrackTPC;
745 // Fix suggested by Alex
746 fFriendTrack = fESDfriend->GetTrack(itrk);
747 //printf("itrk %d\n",itrk);
748 //fFriendTrack = (fESDfriend->GetNumberOfTracks()>itrk)?fESDfriend->GetTrack(itrk):NULL;
750 //printf("No friend track %d\n",itrk);
757 Bool_t standalonetrack = kFALSE;
758 Bool_t offlinetrack = kFALSE;
759 //ULong_t status = fkEsdTrack->GetStatus();
761 //////////////////////////////////////
762 // Loop on calibration objects
763 //////////////////////////////////////
766 while((fCalibObject = (TObject *)(fFriendTrack->GetCalibObject(icalib++)))){
767 //printf("Name %s\n",fCalibObject->IsA()->GetName());
768 if(strcmp(fCalibObject->IsA()->GetName(), "AliTRDtrackV1") != 0) continue;
769 //printf("Find the calibration object\n");
772 if((status&(AliESDtrack::kTRDout)) && (!(status&(AliESDtrack::kTRDin)))) {
773 standalonetrack = kTRUE;
775 if((status&(AliESDtrack::kTRDin))) {
776 offlinetrack = kTRUE;
783 else if(fStandaloneTracks){
784 if(!standalonetrack){
789 fTrdTrack = (AliTRDtrackV1 *)fCalibObject;
790 // process chamberstatus
791 fTRDChamberStatus->ProcessTrack(fTrdTrack);
794 // Quality cuts on the AliESDtrack
795 if((fEsdTrackCuts) && (!fEsdTrackCuts->IsSelected((AliVParticle *)fkEsdTrack))) {
796 //printf("Not a good track\n");
800 // First Absolute gain calibration
801 Int_t trdNTracklets = (Int_t) fkEsdTrack->GetTRDntracklets();
802 Int_t trdNTrackletsPID = (Int_t) fkEsdTrack->GetTRDntrackletsPID();
803 //printf("Number of trd tracklets %d and PID trd tracklets %d\n",trdNTracklets,trdNTrackletsPID);
804 if((trdNTracklets > 0) && (trdNTrackletsPID > 0)) {
805 for(Int_t iPlane = 0; iPlane < 6; ++iPlane){
806 //Double_t slide = fkEsdTrack->GetTRDslice(iPlane);
807 //printf("Number of slide %d\n",fkEsdTrack->GetNumberOfTRDslices());
808 //Double_t momentum = fkEsdTrack->GetTRDmomentum(iPlane);
809 //printf("momentum %f, slide %f\n",momentum,slide);
810 if(fkEsdTrack->GetTRDslice(iPlane) > 0.0)
811 fAbsoluteGain->Fill(fkEsdTrack->GetTRDslice(iPlane)*8.0/100.0,
812 fkEsdTrack->GetTRDmomentum(iPlane));
817 if(!fTrdTrack) continue;
819 if(good && fOnInstance) {
820 //cout << "good" << endl;
821 fTRDCalibraFillHisto->UpdateHistogramsV1(fTrdTrack,fkEsdTrack);
822 //printf("Fill fTRDCalibraFillHisto\n");
826 const Double_t mag = AliTRDdEdxBaseUtils::IsExBOn() ? fESD->GetMagneticField() : -1;
827 const Int_t charge = AliTRDdEdxBaseUtils::IsExBOn() ? fkEsdTrack->Charge() : -1;
828 const Double_t toTPCscale = AliTRDdEdxCalibUtils::GetCalibTPCscale(fkEsdTrack->GetTPCncls(), fkEsdTrack->GetTPCsignal());
830 AliTRDdEdxCalibUtils::FillHist(fTrdTrack, 0, mag, charge, toTPCscale);
834 //////////////////////////////////
836 ////////////////////////////////
840 //printf("Enter debug\n");
842 Int_t nbtracklets = 0;
845 Bool_t standalonetracklet = kFALSE;
846 const AliTRDseedV1 *tracklet = 0x0;
847 //////////////////////////////////////
849 /////////////////////////////////////
851 Double_t phtb[AliTRDseedV1::kNtb];
852 memset(phtb, 0, AliTRDseedV1::kNtb*sizeof(Double_t));
854 Float_t normalisation = 1.13;
857 for(Int_t itr = 0; itr < 6; ++itr){
859 if(!(tracklet = fTrdTrack->GetTracklet(itr))) continue;
860 if(!tracklet->IsOK()) continue;
862 standalonetracklet = kFALSE;
863 if(tracklet->IsStandAlone()) standalonetracklet = kTRUE;
866 memset(phtb, 0, AliTRDseedV1::kNtb*sizeof(Double_t));
870 //Int_t crossrow = 0;
872 // Check no shared clusters
873 //for(int icc=AliTRDseedV1::kNtb; icc<AliTRDseedV1::kNclusters; icc++){
874 // if((fcl = tracklet->GetClusters(icc))) crossrow = 1;
881 for(int ic=0; ic<AliTRDseedV1::kNtb; ++ic){
883 if(!(fCl = tracklet->GetClusters(ic))) continue;
885 time = fCl->GetPadTime();
886 //ch = tracklet->GetdQdl(ic);
887 ch = tracklet->GetQperTB(ic);
888 qcl = TMath::Abs(fCl->GetQ());
889 detector = fCl->GetDetector();
890 // Add the charge if shared cluster
891 if((ic+AliTRDseedV1::kNtb) < AliTRDseedV1::kNclusters) {
892 if((fCl = tracklet->GetClusters(ic+AliTRDseedV1::kNtb))) {
893 qcl += TMath::Abs(fCl->GetQ());
894 //printf("Add the cluster charge\n");
897 if((time>-1) && (time<fNbTimeBins)) phtb[time]=qcl;
898 if((fCalDetGain) && (fCalDetGain->GetValue(detector) > 0.0)) sum += ch*fCalDetGain->GetValue(detector)/normalisation;
899 else sum += ch/normalisation;
902 fNbTimeBin->Fill(time);
903 if(tracklet->IsStandAlone()) fNbTimeBinStandalone->Fill(time);
904 else fNbTimeBinOffline->Fill(time);
907 sector = AliTRDgeometry::GetSector(detector);
910 fNbTracklets->Fill(detector);
911 if(tracklet->IsStandAlone()) fNbTrackletsStandalone->Fill(detector);
912 else fNbTrackletsOffline->Fill(detector);
914 fNbClusters->Fill(nbclusters);
915 if(tracklet->IsStandAlone()) fNbClustersStandalone->Fill(nbclusters);
916 else fNbClustersOffline->Fill(nbclusters);
919 if((nbclusters > fLow) && (nbclusters < fHigh)){
920 if(fRelativeScale > 0.0) sum = sum/fRelativeScale;
921 fCH2dTest->Fill(sum,detector+0.5);
922 fCH2dSM->Fill(sum,sector+0.5);
923 fCH2dSum->Fill(sum,0.5);
924 Bool_t checknoise = kTRUE;
925 if(fMaxCluster > 0) {
926 if(phtb[0] > fMaxCluster) checknoise = kFALSE;
927 if(fNbTimeBins > fNbMaxCluster) {
928 for(Int_t k = (fNbTimeBins-fNbMaxCluster); k < fNbTimeBins; k++){
929 if(phtb[k] > fMaxCluster) checknoise = kFALSE;
934 for(int ic=0; ic<fNbTimeBins; ic++){
936 fPH2dTest->Fill((Double_t)(ic/10.0),detector+0.5,(Double_t)phtb[ic]);
937 fPH2dSum->Fill((Double_t)(ic/10.0),0.5,(Double_t)phtb[ic]);
938 fPH2dSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[ic]);
942 fPH2dTest->Fill((Double_t)(ic/10.0),detector+0.5,(Double_t)phtb[ic]);
943 fPH2dSum->Fill((Double_t)(ic/10.0),0.0,(Double_t)phtb[ic]);
944 fPH2dSM->Fill((Double_t)(ic/10.0),sector+0.5,(Double_t)phtb[ic]);
950 if(detector == 0) FindP1TrackPHtrackletV1Test(tracklet,nbclusters);
952 } // loop on tracklets
957 if(nTRDtrackV1 > 0) {
959 if((status&(AliESDtrack::kTRDout)) && (!(status&(AliESDtrack::kTRDin)))) {
960 ++nbTrdTracksStandalone;
962 if((status&(AliESDtrack::kTRDin))) {
963 ++nbTrdTracksOffline;
966 //delete fFriendTrack;
970 fNbTRDTrack->Fill(nbTrdTracks);
971 fNbTRDTrackStandalone->Fill(nbTrdTracksStandalone);
972 fNbTRDTrackOffline->Fill(nbTrdTracksOffline);
973 fNbTPCTRDtrack->Fill(nbTrdTracks,nbtrackTPC);
977 PostData(1, fListHist);
978 //cout << "AliTRDCalibTask::Exec() OUT" << endl;
981 //________________________________________________________________________
982 void AliTRDCalibTask::Terminate(Option_t *)
988 if(fTRDCalibraFillHisto) fTRDCalibraFillHisto->DestroyDebugStreamer();
992 //_______________________________________________________
993 Bool_t AliTRDCalibTask::Load(const Char_t *filename)
996 // Generic container loader
999 if(!TFile::Open(filename)){
1000 //AliWarning(Form("Couldn't open file %s.", filename));
1004 if(!(o = (TList*)gFile->Get(GetName()))){
1005 //AliWarning("Missing histogram container.");
1008 fListHist = (TList*)o->Clone(GetName());
1012 //_______________________________________________________
1013 Bool_t AliTRDCalibTask::Load(TList *lister)
1016 // Generic container loader
1019 fListHist = (TList*)lister->Clone(GetName());
1022 //_______________________________________________________________________________________
1023 void AliTRDCalibTask::AddTask(const AliTRDCalibTask * calibTask) {
1029 TList *listcalibTask = calibTask->GetList();
1030 if(!listcalibTask) return;
1032 THnSparseI *histoEntries = (THnSparseI *) listcalibTask->FindObject("NumberOfEntries");
1034 TH1I *nEvents = (TH1I *) listcalibTask->FindObject(Form("NEvents_%s",(const char*)calibTask->GetName()));
1035 TH1I *nEventsInput = (TH1I *) listcalibTask->FindObject(Form("NEventsInput_%s",(const char*)calibTask->GetName()));
1036 TH2F *absoluteGain = (TH2F *) listcalibTask->FindObject(Form("AbsoluteGain_%s",(const char*)calibTask->GetName()));
1038 TH1F *trdTrack = (TH1F *) listcalibTask->FindObject(Form("TRDTrack_%s",(const char*)calibTask->GetName()));
1039 TH1F *trdTrackOffline = (TH1F *) listcalibTask->FindObject(Form("TRDTrackOffline_%s",(const char*)calibTask->GetName()));
1040 TH1F *trdTrackStandalone = (TH1F *) listcalibTask->FindObject(Form("TRDTrackStandalone_%s",(const char*)calibTask->GetName()));
1042 TH2F *tpctrdTrack = (TH2F *) listcalibTask->FindObject(Form("NbTPCTRDtrack_%s",(const char*)calibTask->GetName()));
1044 TH1F *nbTimeBin = (TH1F *) listcalibTask->FindObject(Form("NbTimeBin_%s",(const char*)calibTask->GetName()));
1045 TH1F *nbTimeBinOffline = (TH1F *) listcalibTask->FindObject(Form("NbTimeBinOffline_%s",(const char*)calibTask->GetName()));
1046 TH1F *nbTimeBinStandalone = (TH1F *) listcalibTask->FindObject(Form("NbTimeBinStandalone_%s",(const char*)calibTask->GetName()));
1048 TH1F *nbClusters = (TH1F *) listcalibTask->FindObject(Form("NbClusters_%s",(const char*)calibTask->GetName()));
1049 TH1F *nbClustersOffline = (TH1F *) listcalibTask->FindObject(Form("NbClustersOffline_%s",(const char*)calibTask->GetName()));
1050 TH1F *nbClustersStandalone = (TH1F *) listcalibTask->FindObject(Form("NbClustersStandalone_%s",(const char*)calibTask->GetName()));
1052 TH1F *nbTracklets = (TH1F *) listcalibTask->FindObject(Form("NbTracklets_%s",(const char*)calibTask->GetName()));
1053 TH1F *nbTrackletsOffline = (TH1F *) listcalibTask->FindObject(Form("NbTrackletsOffline_%s",(const char*)calibTask->GetName()));
1054 TH1F *nbTrackletsStandalone = (TH1F *) listcalibTask->FindObject(Form("NbTrackletsStandalone_%s",(const char*)calibTask->GetName()));
1056 TH2I *ch2d = (TH2I *) listcalibTask->FindObject("CH2d");
1057 TProfile2D *ph2d = (TProfile2D *) listcalibTask->FindObject("PH2d");
1058 TProfile2D *prf2d = (TProfile2D *) listcalibTask->FindObject("PRF2d");
1060 TH2I *ch2dSum = (TH2I *) listcalibTask->FindObject(Form("CH2dSum_%s",(const char*)calibTask->GetName()));
1061 TProfile2D *ph2dSum = (TProfile2D *) listcalibTask->FindObject(Form("PH2dSum_%s",(const char*)calibTask->GetName()));
1063 TH2I *ch2dSM = (TH2I *) listcalibTask->FindObject(Form("CH2dSM_%s",(const char*)calibTask->GetName()));
1064 TProfile2D *ph2dSM = (TProfile2D *) listcalibTask->FindObject(Form("PH2dSM_%s",(const char*)calibTask->GetName()));
1066 AliTRDCalibraVdriftLinearFit *linearfit = (AliTRDCalibraVdriftLinearFit *) listcalibTask->FindObject("AliTRDCalibraVdriftLinearFit");
1067 AliTRDCalibraExbAltFit *exbaltfit = (AliTRDCalibraExbAltFit *) listcalibTask->FindObject("AliTRDCalibraExbAltFit");
1068 AliTRDCalibraVector *calibraVector = (AliTRDCalibraVector *) listcalibTask->FindObject("AliTRDCalibraVector");
1072 THnSparseI *inhistoEntries = (THnSparseI *) fListHist->FindObject("NumberOfEntries");
1074 TH1I *inEventsInput = (TH1I *) fListHist->FindObject(Form("NEventsInput_%s",(const char*)fName));
1075 TH1I *inEvents = (TH1I *) fListHist->FindObject(Form("NEvents_%s",(const char*)fName));
1076 TH2F *iabsoluteGain = (TH2F *) fListHist->FindObject(Form("AbsoluteGain_%s",(const char*)fName));
1078 TH1F *itrdTrack = (TH1F *) fListHist->FindObject(Form("TRDTrack_%s",(const char*)fName));
1079 TH1F *itrdTrackOffline = (TH1F *) fListHist->FindObject(Form("TRDTrackOffline_%s",(const char*)fName));
1080 TH1F *itrdTrackStandalone = (TH1F *) fListHist->FindObject(Form("TRDTrackStandalone_%s",(const char*)fName));
1082 TH2F *itpctrdTrack = (TH2F *) fListHist->FindObject(Form("NbTPCTRDtrack_%s",(const char*)fName));
1084 TH1F *inbTimeBin = (TH1F *) fListHist->FindObject(Form("NbTimeBin_%s",(const char*)fName));
1085 TH1F *inbTimeBinOffline = (TH1F *) fListHist->FindObject(Form("NbTimeBinOffline_%s",(const char*)fName));
1086 TH1F *inbTimeBinStandalone = (TH1F *) fListHist->FindObject(Form("NbTimeBinStandalone_%s",(const char*)fName));
1088 TH1F *inbClusters = (TH1F *) fListHist->FindObject(Form("NbClusters_%s",(const char*)fName));
1089 TH1F *inbClustersOffline = (TH1F *) fListHist->FindObject(Form("NbClustersOffline_%s",(const char*)fName));
1090 TH1F *inbClustersStandalone = (TH1F *) fListHist->FindObject(Form("NbClustersStandalone_%s",(const char*)fName));
1092 TH1F *inbTracklets = (TH1F *) fListHist->FindObject(Form("NbTracklets_%s",(const char*)fName));
1093 TH1F *inbTrackletsOffline = (TH1F *) fListHist->FindObject(Form("NbTrackletsOffline_%s",(const char*)fName));
1094 TH1F *inbTrackletsStandalone = (TH1F *) fListHist->FindObject(Form("NbTrackletsStandalone_%s",(const char*)fName));
1096 TH2I *ich2d = (TH2I *) fListHist->FindObject("CH2d");
1097 TProfile2D *iph2d = (TProfile2D *) fListHist->FindObject("PH2d");
1098 TProfile2D *iprf2d = (TProfile2D *) fListHist->FindObject("PRF2d");
1100 TH2I *ich2dSum = (TH2I *) fListHist->FindObject(Form("CH2dSum_%s",(const char*)fName));
1101 TProfile2D *iph2dSum = (TProfile2D *) fListHist->FindObject(Form("PH2dSum_%s",(const char*)fName));
1103 TH2I *ich2dSM = (TH2I *) fListHist->FindObject(Form("CH2dSM_%s",(const char*)fName));
1104 TProfile2D *iph2dSM = (TProfile2D *) fListHist->FindObject(Form("PH2dSM_%s",(const char*)fName));
1106 AliTRDCalibraVdriftLinearFit *ilinearfit = (AliTRDCalibraVdriftLinearFit *) fListHist->FindObject("AliTRDCalibraVdriftLinearFit");
1107 AliTRDCalibraExbAltFit *iexbaltfit = (AliTRDCalibraExbAltFit *) fListHist->FindObject("AliTRDCalibraExbAltFit");
1108 AliTRDCalibraVector *icalibraVector = (AliTRDCalibraVector *) fListHist->FindObject("AliTRDCalibraVector");
1114 if(inhistoEntries) {
1115 inhistoEntries->Add(histoEntries);
1116 //printf("Add Events\n");
1119 //printf("Create new Events\n");
1120 inhistoEntries = (THnSparseI *) histoEntries->Clone();
1121 fListHist->Add(inhistoEntries);
1127 inEventsInput->Add(nEventsInput);
1128 //printf("Add Events\n");
1131 //printf("Create new Events\n");
1132 inEventsInput = new TH1I(*nEventsInput);
1133 fListHist->Add(inEventsInput);
1139 inEvents->Add(nEvents);
1140 //printf("Add Events\n");
1143 //printf("Create new Events\n");
1144 inEvents = new TH1I(*nEvents);
1145 fListHist->Add(inEvents);
1150 if(iabsoluteGain) iabsoluteGain->Add(absoluteGain);
1152 iabsoluteGain = new TH2F(*absoluteGain);
1153 fListHist->Add(iabsoluteGain);
1158 if(itrdTrack) itrdTrack->Add(trdTrack);
1160 itrdTrack = new TH1F(*trdTrack);
1161 fListHist->Add(itrdTrack);
1165 if(trdTrackOffline) {
1166 if(itrdTrackOffline) itrdTrackOffline->Add(trdTrackOffline);
1168 itrdTrackOffline = new TH1F(*trdTrackOffline);
1169 fListHist->Add(itrdTrackOffline);
1173 if(trdTrackStandalone) {
1174 if(itrdTrackStandalone) itrdTrackStandalone->Add(trdTrackStandalone);
1176 itrdTrackStandalone = new TH1F(*trdTrackStandalone);
1177 fListHist->Add(itrdTrackStandalone);
1182 if(itpctrdTrack) itpctrdTrack->Add(tpctrdTrack);
1184 itpctrdTrack = new TH2F(*tpctrdTrack);
1185 fListHist->Add(itpctrdTrack);
1190 if(inbTimeBin) inbTimeBin->Add(nbTimeBin);
1192 inbTimeBin = new TH1F(*inbTimeBin);
1193 fListHist->Add(inbTimeBin);
1197 if(nbTimeBinOffline) {
1198 if(inbTimeBinOffline) inbTimeBinOffline->Add(nbTimeBinOffline);
1200 inbTimeBinOffline = new TH1F(*nbTimeBinOffline);
1201 fListHist->Add(inbTimeBinOffline);
1205 if(nbTimeBinStandalone) {
1206 if(inbTimeBinStandalone) inbTimeBinStandalone->Add(nbTimeBinStandalone);
1208 inbTimeBinStandalone = new TH1F(*nbTimeBinStandalone);
1209 fListHist->Add(inbTimeBinStandalone);
1214 if(inbClusters) inbClusters->Add(nbClusters);
1216 inbClusters = new TH1F(*nbClusters);
1217 fListHist->Add(inbClusters);
1221 if(nbClustersOffline) {
1222 if(inbClustersOffline) inbClustersOffline->Add(nbClustersOffline);
1224 inbClustersOffline = new TH1F(*nbClustersOffline);
1225 fListHist->Add(inbClustersOffline);
1229 if(nbClustersStandalone) {
1230 if(inbClustersStandalone) inbClustersStandalone->Add(nbClustersStandalone);
1232 inbClustersStandalone = new TH1F(*nbClustersStandalone);
1233 fListHist->Add(inbClustersStandalone);
1238 if(inbTracklets) inbTracklets->Add(nbTracklets);
1240 inbTracklets = new TH1F(*nbTracklets);
1241 fListHist->Add(inbTracklets);
1245 if(nbTrackletsOffline) {
1246 if(inbTrackletsOffline) inbTrackletsOffline->Add(nbTrackletsOffline);
1248 inbTrackletsOffline = new TH1F(*nbTrackletsOffline);
1249 fListHist->Add(inbTrackletsOffline);
1253 if(nbTrackletsStandalone) {
1254 if(inbTrackletsStandalone) inbTrackletsStandalone->Add(nbTrackletsStandalone);
1256 inbTrackletsStandalone = new TH1F(*nbTrackletsStandalone);
1257 fListHist->Add(inbTrackletsStandalone);
1262 if(ich2d) ich2d->Add(ch2d);
1264 ich2d = new TH2I(*ch2d);
1265 fListHist->Add(ich2d);
1270 if(iph2d) iph2d->Add(ph2d);
1272 iph2d = new TProfile2D(*ph2d);
1273 fListHist->Add(iph2d);
1278 if(iprf2d) iprf2d->Add(prf2d);
1280 iprf2d = new TProfile2D(*prf2d);
1281 fListHist->Add(iprf2d);
1286 if(ich2dSum) ich2dSum->Add(ch2dSum);
1288 ich2dSum = new TH2I(*ch2dSum);
1289 fListHist->Add(ich2dSum);
1294 if(iph2dSum) iph2dSum->Add(ph2dSum);
1296 iph2dSum = new TProfile2D(*ph2dSum);
1297 fListHist->Add(iph2dSum);
1302 if(ich2dSM) ich2dSM->Add(ch2dSM);
1304 ich2dSM = new TH2I(*ch2dSM);
1305 fListHist->Add(ich2dSM);
1310 if(iph2dSM) iph2dSM->Add(ph2dSM);
1312 iph2dSM = new TProfile2D(*ph2dSM);
1313 fListHist->Add(iph2dSM);
1318 if(ilinearfit) ilinearfit->Add(linearfit);
1320 ilinearfit = new AliTRDCalibraVdriftLinearFit(*linearfit);
1321 fListHist->Add(ilinearfit);
1326 if(iexbaltfit) iexbaltfit->Add(exbaltfit);
1328 iexbaltfit = new AliTRDCalibraExbAltFit(*exbaltfit);
1329 fListHist->Add(iexbaltfit);
1334 if(icalibraVector) icalibraVector->Add(calibraVector);
1336 icalibraVector = new AliTRDCalibraVector(*calibraVector);
1337 fListHist->Add(icalibraVector);
1342 //________________________________________________________________________________
1343 Long64_t AliTRDCalibTask::Merge(TCollection *li) {
1349 TIterator* iter = li->MakeIterator();
1350 AliTRDCalibTask* cal = 0;
1352 while ((cal = (AliTRDCalibTask*)iter->Next())) {
1353 if (!cal->InheritsFrom(AliTRDCalibTask::Class())) {
1354 Error("Merge","Attempt to add object of class %s to a %s", cal->ClassName(), this->ClassName());
1358 // add histograms here...
1366 //_____________________________________________________
1367 Bool_t AliTRDCalibTask::SetVersionSubversion(){
1369 // Load Chamber Gain factors into the Tender supply
1372 //printf("SetVersionSubversion\n");
1374 //find previous entry from the UserInfo
1375 TTree *tree=((TChain*)GetInputData(0))->GetTree();
1377 AliError("Tree not found in ESDhandler");
1381 TList *userInfo=(TList*)tree->GetUserInfo();
1383 AliError("No UserInfo found in tree");
1387 TList *cdbList=(TList*)userInfo->FindObject("cdbList");
1389 AliError("No cdbList found in UserInfo");
1390 if (AliLog::GetGlobalLogLevel()>=AliLog::kError) userInfo->Print();
1394 TIter nextCDB(cdbList);
1396 while ( (os=(TObjString*)nextCDB()) ){
1397 if(os->GetString().Contains("TRD/Calib/ChamberGainFactor")){
1398 // Get Old gain calibration
1399 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1400 fFirstRunGain = id->GetFirstRun();
1401 fVersionGainUsed = id->GetVersion();
1402 fSubVersionGainUsed = id->GetSubVersion();
1403 } else if(os->GetString().Contains("TRD/Calib/ChamberVdrift")){
1404 // Get Old drift velocity calibration
1405 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1406 fFirstRunVdrift = id->GetFirstRun();
1407 fVersionVdriftUsed = id->GetVersion();
1408 fSubVersionVdriftUsed = id->GetSubVersion();
1409 } else if(os->GetString().Contains("TRD/Calib/LocalGainFactor")){
1410 // Get Old drift velocity calibration
1411 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1412 fFirstRunGainLocal = id->GetFirstRun();
1413 fVersionGainLocalUsed = id->GetVersion();
1414 fSubVersionGainLocalUsed = id->GetSubVersion();
1415 } else if((os->GetString().Contains("TRD/Calib/ChamberExB")) && (!os->GetString().Contains("TRD/Calib/ChamberExBAlt"))){
1416 // Get Old drift velocity calibration
1417 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
1418 fFirstRunExB = id->GetFirstRun();
1419 fVersionExBUsed = id->GetVersion();
1420 fSubVersionExBUsed = id->GetSubVersion();
1421 //printf("Version %d and subversion %d\n",fVersionExBUsed,fSubVersionExBUsed);
1425 //printf("VersionGain %d, SubversionGain %d, VersionLocalGain %d, Subversionlocalgain %d, Versionvdrift %d, Subversionvdrift %d\n",fVersionGainUsed,fSubVersionGainUsed,fVersionGainLocalUsed,fSubVersionGainLocalUsed,fVersionVdriftUsed,fSubVersionVdriftUsed);
1428 if((fFirstRunGain < 0) ||
1429 (fFirstRunGainLocal < 0) ||
1430 (fFirstRunVdrift < 0) ||
1431 (fVersionGainUsed < 0) ||
1432 (fVersionGainLocalUsed < 0) ||
1433 (fSubVersionGainUsed < 0) ||
1434 (fSubVersionGainLocalUsed < 0) ||
1435 (fVersionVdriftUsed < 0) ||
1436 (fSubVersionVdriftUsed < 0)) {
1437 AliError("No recent calibration found");
1443 //_________________________________________________________________________________________________________________________
1444 Bool_t AliTRDCalibTask::ParticleGood(int i) const {
1447 // Definition of good tracks
1451 AliESDtrack *track = fESD->GetTrack(i);
1452 if (!track->IsOn(AliESDtrack::kTPCrefit)) return 0; // TPC refit
1453 if (track->GetTPCNcls() < 90) return 0; // number of TPC clusters
1454 if (fabs(track->Eta())>0.8) return 0; // fiducial pseudorapidity
1456 track->GetImpactParametersTPC(r,z);
1457 if (fabs(z)>2.0) return 0; // impact parameter in z
1458 if (fabs(r)>2.0) return 0; // impact parameter in xy
1464 //______________________________________________________________________________________________________________________
1465 Bool_t AliTRDCalibTask::FindP1TrackPHtrackletV1Test(const AliTRDseedV1 *tracklet, Int_t nbclusters)
1468 // Drift velocity calibration:
1469 // Fit the clusters with a straight line
1470 // From the slope find the drift velocity
1473 ////////////////////////////////////////////////
1474 //Number of points: if less than 3 return kFALSE
1475 /////////////////////////////////////////////////
1476 if(nbclusters <= 2) return kFALSE;
1481 // results of the linear fit
1482 Double_t dydt = 0.0; // dydt tracklet after straight line fit
1483 Double_t errorpar = 0.0; // error after straight line fit on dy/dt
1484 Double_t pointError = 0.0; // error after straight line fit
1485 // pad row problemes: avoid tracklet that cross pad rows, tilting angle in the constant
1486 Int_t crossrow = 0; // if it crosses a pad row
1487 Int_t rowp = -1; // if it crosses a pad row
1488 Float_t tnt = tracklet->GetTilt(); // tan tiltingangle
1489 TLinearFitter linearFitterTracklet(2,"pol1");
1490 linearFitterTracklet.StoreData(kTRUE);
1493 ///////////////////////////////////////////
1494 // Take the parameters of the track
1495 //////////////////////////////////////////
1496 // take now the snp, tnp and tgl from the track
1497 Double_t snp = tracklet->GetSnp(); // sin dy/dx at the end of the chamber
1498 Double_t tnp = 0.0; // dy/dx at the end of the chamber
1499 if( TMath::Abs(snp) < 1.){
1500 tnp = snp / TMath::Sqrt((1.-snp)*(1.+snp));
1502 Double_t tgl = tracklet->GetTgl(); // dz/dl
1503 Double_t dzdx = tgl*TMath::Sqrt(1+tnp*tnp); // dz/dx calculated from dz/dl
1505 //Double_t tnp = tracklet->GetYref(1); // dy/dx at the entrance of the chamber
1506 //Double_t tgl = tracklet->GetZref(1); // dz/dl at the entrance of the chamber
1507 //Double_t dzdx = tgl; //*TMath::Sqrt(1+tnp*tnp); // dz/dx from dz/dl
1508 // at the end with correction due to linear fit
1509 //Double_t tnp = tracklet->GetYfit(1); // dy/dx at the end of the chamber after fit correction
1510 //Double_t tgl = tracklet->GetZfit(1); // dz/dl at the end of the chamber after fit correction
1513 ////////////////////////////
1514 // loop over the clusters
1515 ////////////////////////////
1517 AliTRDcluster *cl = 0x0;
1518 //////////////////////////////
1519 // Check no shared clusters
1520 //////////////////////////////
1521 for(int icc=AliTRDseedV1::kNtb; icc<AliTRDseedV1::kNclusters; icc++){
1522 cl = tracklet->GetClusters(icc);
1523 if(cl) crossrow = 1;
1525 //////////////////////////////////
1527 //////////////////////////////////
1528 for(int ic=0; ic<AliTRDseedV1::kNtb; ic++){
1529 if(!(cl = tracklet->GetClusters(ic))) continue;
1530 //if((fLimitChargeIntegration) && (!cl->IsInChamber())) continue;
1532 Double_t ycluster = cl->GetY();
1533 Int_t time = cl->GetPadTime();
1534 Double_t timeis = time/10.0;
1535 //See if cross two pad rows
1536 Int_t row = cl->GetPadRow();
1537 if(rowp==-1) rowp = row;
1538 if(row != rowp) crossrow = 1;
1540 linearFitterTracklet.AddPoint(&timeis,ycluster,1);
1546 ////////////////////////////////////
1547 // Do the straight line fit now
1548 ///////////////////////////////////
1550 linearFitterTracklet.ClearPoints();
1554 linearFitterTracklet.Eval();
1555 linearFitterTracklet.GetParameters(pars);
1556 pointError = TMath::Sqrt(linearFitterTracklet.GetChisquare()/(nbli-2));
1557 errorpar = linearFitterTracklet.GetParError(1)*pointError;
1559 //printf("chis %f, nbli %d, pointError %f, parError %f, errorpar %f\n",linearFitterTracklet->GetChisquare(),nbli,pointError,linearFitterTracklet->GetParError(1),errorpar);
1560 linearFitterTracklet.ClearPoints();
1562 /////////////////////////
1564 ////////////////////////
1566 if(nbclusters < fLow) return kFALSE;
1567 if(nbclusters > fHigh) return kFALSE;
1568 if(pointError >= 0.3) return kFALSE;
1569 if(crossrow == 1) return kTRUE;
1571 ///////////////////////
1573 //////////////////////
1576 //Add to the linear fitter of the detector
1577 if( TMath::Abs(snp) < 1.){
1578 Double_t x = tnp-dzdx*tnt;
1579 //if(!fLinearVdriftTest) printf("Not there\n");
1580 Double_t nbentries = fLinearVdriftTest->GetEntries();
1581 if(nbentries < (5.0*32767)) fLinearVdriftTest->Fill(x,dydt);