1 /* created by fbellini@cern.ch on 29/04/2013 */
2 /* last modified by fbellini on 19/08/2013 */
5 #ifndef ALIANALYSISTASKTOFQAID_CXX
6 #define ALIANALYSISTASKTOFQAID_CXX
14 #include "AliAnalysisTaskSE.h"
15 #include "AliAnalysisManager.h"
16 #include "AliVEvent.h"
17 #include "AliVTrack.h"
18 #include "AliESDEvent.h"
19 #include "AliMCEvent.h"
20 #include "AliMCParticle.h"
21 #include "AliESDInputHandler.h"
22 #include "AliMCEventHandler.h"
23 #include "AliESDpid.h"
24 #include "AliTOFPIDParams.h"
25 #include "AliCDBManager.h"
26 #include "AliTOFcalib.h"
27 #include "AliTOFT0maker.h"
28 #include "AliTOFT0v1.h"
29 #include "AliAnalysisTaskTOFqaID.h"
30 #include "AliAnalysisFilter.h"
31 #include "AliESDtrackCuts.h"
33 #include "AliTOFRawStream.h"
34 #include "AliTOFGeometry.h"
36 ClassImp(AliAnalysisTaskTOFqaID)
38 //________________________________________________________________________
39 AliAnalysisTaskTOFqaID::AliAnalysisTaskTOFqaID() :
45 fESDpid(new AliESDpid()),
47 fEnableAdvancedCheck(kFALSE),
48 fEnableChargeSplit(kFALSE),
49 fExpTimeBinWidth(24.4),
50 fExpTimeRangeMin(-25010.),
51 fExpTimeRangeMax(25010.),
52 fExpTimeSmallRangeMin(-5002.),
53 fExpTimeSmallRangeMax(5002.),
55 fnExpTimeSmallBins(1),
57 fMyTimeZeroTOFsigma(1e20),
58 fMyTimeZeroTOFtracks(-1),
67 fMatchingMomCut(1e10),
75 // Default constructor
77 for (Int_t j=0;j<3;j++ ) {
87 //________________________________________________________________________
88 AliAnalysisTaskTOFqaID::AliAnalysisTaskTOFqaID(const char *name) :
89 AliAnalysisTaskSE(name),
95 fESDpid(new AliESDpid()),
97 fEnableAdvancedCheck(kFALSE),
98 fEnableChargeSplit(kFALSE),
99 fExpTimeBinWidth(24.4),
100 fExpTimeRangeMin(-25010.),
101 fExpTimeRangeMax(25010.),
102 fExpTimeSmallRangeMin(-5002.),
103 fExpTimeSmallRangeMax(5002.),
105 fnExpTimeSmallBins(1),
106 fMyTimeZeroTOF(1e20),
107 fMyTimeZeroTOFsigma(1e20),
108 fMyTimeZeroTOFtracks(-1),
117 fMatchingMomCut(1.0),
126 // Define input and output slots here
127 Info("AliAnalysisTaskTOFqaID","Calling Constructor");
129 for (Int_t j=0;j<5;j++ ) {
138 // Input slot #0 works with a TChain
139 DefineInput(0, TChain::Class());
141 // Output slot #0 writes into a TH1 container
142 // Output slot #1 writes into a user defined container
143 DefineOutput(1, TList::Class());
144 DefineOutput(2, TList::Class());
145 DefineOutput(3, TList::Class());
146 DefineOutput(4, TList::Class());
147 DefineOutput(5, TList::Class());
151 //________________________________________________________________________
152 AliAnalysisTaskTOFqaID::AliAnalysisTaskTOFqaID(const AliAnalysisTaskTOFqaID& copy)
153 : AliAnalysisTaskSE(),
154 fRunNumber(copy.fRunNumber),
156 fMCevent(copy.fMCevent),
157 fTrackFilter(copy.fTrackFilter),
158 fVertex(copy.fVertex),
159 fESDpid(copy.fESDpid),
160 fTOFHeader(copy.fTOFHeader),
161 fEnableAdvancedCheck(copy.fEnableAdvancedCheck),
162 fEnableChargeSplit(copy.fEnableChargeSplit),
163 fExpTimeBinWidth(copy.fExpTimeBinWidth),
164 fExpTimeRangeMin(copy.fExpTimeRangeMin),
165 fExpTimeRangeMax(copy.fExpTimeRangeMax),
166 fExpTimeSmallRangeMin(copy.fExpTimeSmallRangeMin),
167 fExpTimeSmallRangeMax(copy.fExpTimeSmallRangeMax),
168 fnExpTimeBins(copy.fnExpTimeBins),
169 fnExpTimeSmallBins(copy.fnExpTimeSmallBins),
170 fMyTimeZeroTOF(copy.fMyTimeZeroTOF),
171 fMyTimeZeroTOFsigma(copy.fMyTimeZeroTOFsigma),
172 fMyTimeZeroTOFtracks(copy.fMyTimeZeroTOFtracks),
174 fSelectedPdg(copy.fSelectedPdg),
179 fTPCOuterPhi(copy.fTPCOuterPhi),
181 fMatchingMomCut(copy.fMatchingMomCut),
184 fHlistTimeZero(copy.fHlistTimeZero),
185 fHlistPID(copy.fHlistPID),
186 fHlistTRD(copy.fHlistTRD),
187 fHlistTrigger(copy.fHlistTrigger)
190 for (Int_t j=0;j<5;j++ ) {
193 fNTOFtracks[j]=copy.fNTOFtracks[j];
195 fSigmaSpecie[j]=copy.fSigmaSpecie[j];
196 fTrkExpTimes[j]=copy.fTrkExpTimes[j];
197 fThExpTimes[j]=copy.fThExpTimes[j];
203 //___________________________________________________________________________
204 AliAnalysisTaskTOFqaID& AliAnalysisTaskTOFqaID::operator=(const AliAnalysisTaskTOFqaID& copy)
207 // Assignment operator
210 AliAnalysisTaskSE::operator=(copy) ;
211 fRunNumber=copy.fRunNumber;
213 fMCevent=copy.fMCevent;
214 fTrackFilter=copy.fTrackFilter;
215 fVertex=copy.fVertex;
216 fESDpid=copy.fESDpid;
217 fTOFHeader=copy.fTOFHeader;
218 fEnableAdvancedCheck=copy.fEnableAdvancedCheck;
219 fEnableChargeSplit=copy.fEnableChargeSplit;
220 fExpTimeBinWidth=copy.fExpTimeBinWidth;
221 fExpTimeRangeMin=copy.fExpTimeRangeMin;
222 fExpTimeRangeMax=copy.fExpTimeRangeMax;
223 fExpTimeSmallRangeMin=copy.fExpTimeSmallRangeMin;
224 fExpTimeSmallRangeMax=copy.fExpTimeSmallRangeMax;
225 fnExpTimeBins=copy.fnExpTimeBins;
226 fnExpTimeSmallBins=copy.fnExpTimeSmallBins;
227 fMyTimeZeroTOF=copy.fMyTimeZeroTOF;
228 fMyTimeZeroTOFsigma=copy.fMyTimeZeroTOFsigma;
229 fMyTimeZeroTOFtracks=copy.fMyTimeZeroTOFtracks;
230 for (Int_t j=0;j<5;j++ ) {
233 fNTOFtracks[j]=copy.fNTOFtracks[j];
235 fSigmaSpecie[j]=copy.fSigmaSpecie[j];
236 fTrkExpTimes[j]=copy.fTrkExpTimes[j];
237 fThExpTimes[j]=copy.fThExpTimes[j];
240 fSelectedPdg=copy.fSelectedPdg;
245 fTPCOuterPhi=copy.fTPCOuterPhi;
247 fMatchingMomCut=copy.fMatchingMomCut;
250 fHlistTimeZero=copy.fHlistTimeZero;
251 fHlistPID=copy.fHlistPID;
252 fHlistTRD=copy.fHlistTRD;
253 fHlistTrigger=copy.fHlistTrigger;
258 //___________________________________________________________________________
259 AliAnalysisTaskTOFqaID::~AliAnalysisTaskTOFqaID() {
264 Info("~AliAnalysisTaskTOFqaID","Calling Destructor");
265 if (fESDpid) delete fESDpid;
266 if (fTOFHeader) delete fTOFHeader;
267 if (fVertex) delete fVertex;
268 if (fTrackFilter) delete fTrackFilter;
269 if (AliAnalysisManager::GetAnalysisManager()->IsProofMode()) return;
275 if (fHlistTimeZero) {
276 delete fHlistTimeZero;
288 delete fHlistTrigger;
293 //________________________________________________________________________
294 void AliAnalysisTaskTOFqaID::UserCreateOutputObjects()
297 //Define output objects and histograms
300 //retrieve PID response object
301 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
302 if (!man) AliFatal("Analysis manager needed");
303 AliInputEventHandler *inputHandler=dynamic_cast<AliInputEventHandler*>(man->GetInputEventHandler());
304 if (!inputHandler) AliFatal("Input handler needed");
305 //pid response object
306 fESDpid=(AliESDpid*)inputHandler->GetPIDResponse();
307 if (!fESDpid) AliError("PIDResponse object was not created");
308 //fESDpid->SetOADBPath("$ALICE_ROOT/OADB");
310 Info("CreateOutputObjects","CreateOutputObjects (TList) of task %s", GetName());
313 if (!fHlist) fHlist = new TList();
314 fHlist->SetOwner(kTRUE);
315 fHlist->SetName("base");
317 if (!fHlistTimeZero) fHlistTimeZero = new TList();
318 fHlistTimeZero->SetOwner(kTRUE);
319 fHlistTimeZero->SetName("startTime");
321 if (!fHlistPID) fHlistPID = new TList();
322 fHlistPID->SetOwner(kTRUE);
323 fHlistPID->SetName("pid");
325 if (!fHlistTRD) fHlistTRD = new TList();
326 fHlistTRD->SetOwner(kTRUE);
327 fHlistTRD->SetName("TRD");
329 if (!fHlistTrigger) fHlistTrigger = new TList();
330 fHlistTrigger->SetOwner(kTRUE);
331 fHlistTrigger->SetName("trigger");
333 if (fExpTimeRangeMax<fExpTimeRangeMin) {
334 SetExpTimeHistoRange(-25010.,25010.);
336 fnExpTimeBins = TMath::Nint((fExpTimeRangeMax - fExpTimeRangeMin)/fExpTimeBinWidth);//ps
337 fExpTimeRangeMax=fExpTimeRangeMin+fnExpTimeBins*fExpTimeBinWidth;//ps
339 if (fExpTimeSmallRangeMax<fExpTimeSmallRangeMin) {
340 SetExpTimeHistoSmallRange(-5002.,5002.);
342 fnExpTimeSmallBins = TMath::Nint((fExpTimeSmallRangeMax - fExpTimeSmallRangeMin)/fExpTimeBinWidth);//ps
343 fExpTimeSmallRangeMax=fExpTimeSmallRangeMin+fnExpTimeSmallBins*fExpTimeBinWidth;//ps
345 //add plots for start time QA
346 AddStartTimeHisto(fHlistTimeZero,"");
348 //add plots for base TOF quantities
349 if (fEnableChargeSplit) {
350 AddTofBaseHisto(fHlist, 1, "");
351 AddTofBaseHisto(fHlist, -1, "");
353 AddTofBaseHisto(fHlist, 0, "");
355 //add plots for matching efficiency
356 if (fEnableChargeSplit) {
357 AddMatchingEffHisto(fHlist, 1, "");
358 AddMatchingEffHisto(fHlist, -1, "");
360 AddMatchingEffHisto(fHlist, 0, "");
362 //add plots for PID checks
363 if (fEnableChargeSplit) {
364 AddPidHisto(fHlistPID, 1, "");
365 AddPidHisto(fHlistPID, -1, "");
367 AddPidHisto(fHlistPID, 0, "");
370 if (fEnableAdvancedCheck) {
377 PostData(2, fHlistTimeZero);
378 PostData(3, fHlistPID);
379 PostData(4, fHlistTRD);
380 PostData(5, fHlistTrigger);
382 //________________________________________________________________________
383 void AliAnalysisTaskTOFqaID::UserExec(Option_t *)
385 /* Main - executed for each event.
386 It extracts event information and track information after selecting
387 primary tracks via standard cuts. */
389 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
391 AliError("ERROR: Could not get ESDInputHandler");
394 fESD = (AliESDEvent*) esdH->GetEvent();
398 fESD=(AliESDEvent*)InputEvent();
400 AliError("fESD event not available");
405 AliError("PID object fESDpid not available");
409 //retrieve default start time type from PIDresponse
410 AliPIDResponse::EStartTimeType_t startTimeMethodDefault = AliPIDResponse::kBest_T0;
411 if (fESDpid->GetTOFPIDParams()) { // during reconstruction OADB not yet available
412 startTimeMethodDefault = ((AliTOFPIDParams *)fESDpid->GetTOFPIDParams())->GetStartTimeMethod();
415 //access MC event handler for MC truth information
417 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
419 AliError("Cannot get MCeventHandler");
422 fMCevent = (AliMCEvent *) mcH->MCEvent();
424 AliError("Trying to retrieve an invalid MC event.");
431 Int_t runNb = fESD->GetRunNumber();
432 if (runNb>0) fRunNumber = runNb;
434 //reset matched track counters
435 for (Int_t j=0;j<3;j++){fNTOFtracks[j]=0;}
437 //Get vertex info and apply vertex cut
438 if (!IsEventSelected(fESD)) return;
440 //set response tof_t0 for all other checks
441 fESDpid->SetTOFResponse(fESD,AliESDpid::kTOF_T0);//(fill_t0, tof_t0, t0_t0, best_t0)
443 AliDebug(3, Form("Momentum cut for eta and phi distributions set: Pt>%3.2f", fMatchingMomCut));
445 //check existence of track filter
447 AliInfo("No track filter found, skipping the track loop");
451 // loop over ESD tracks
452 for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
453 AliESDtrack* track = fESD->GetTrack(iTracks);
455 AliInfo(Form("Cannot receive track %d", iTracks));
459 //primary tracks selection: kTPCrefit and std cuts
460 if (!fTrackFilter->IsSelected(track)) continue;
462 //select specie if MC
464 (!SelectMCspecies(fMCevent, track))) {
465 AliDebug(4, Form("MC tracks selection: Track=%i label=%i Not Accepted", iTracks, track->GetLabel()));
469 //apply cut for eta acceptance
471 if (TMath::Abs(fEta)>0.8) continue;
473 //get other track variables
476 fPhi = track->Phi()*TMath::RadToDeg();
477 fTPCOuterPhi = GetPhiAtTPCouterRadius(track);
478 fL = track->GetIntegratedLength();
479 track->GetIntegratedTimes(fTrkExpTimes);
482 if (fEnableChargeSplit) charge = track->Charge();
484 //Fill histograms for primary particles
485 FillPrimaryTrkHisto(charge,"");
487 if (IsTPCTOFMatched(track)) {
488 fTof=track->GetTOFsignal()*1E-3;//in ps
489 //increment track counters
491 if (charge>0) fNTOFtracks[1]++;
492 if (charge<0) fNTOFtracks[2]++;
494 FillTofBaseHisto(track, charge,"");
495 FillMatchedTrkHisto(charge,"");
496 FillPidHisto(track, charge, "");
498 if (fEnableAdvancedCheck) FillTrdHisto(track, charge);
499 }//end loop on tracks
501 //fill time zero histos
502 FillStartTimeHisto("");
503 if (fEnableChargeSplit) {
504 ((TH1F*)fHlist->FindObject("hTOFmulti_pos"))->Fill(fNTOFtracks[1]);
505 ((TH1F*)fHlist->FindObject("hTOFmulti_neg"))->Fill(fNTOFtracks[2]);
507 ((TH1F*)fHlist->FindObject("hTOFmulti_all"))->Fill(fNTOFtracks[0]);
509 //fill TOF trg histos from infos in TOF header
510 fTOFHeader=(AliTOFHeader*)fESD->GetTOFHeader();
512 AliWarning("Cannot get TOF header: no TOF trigger info available");
517 //restore value set by AliPIDResponseTask for subsequent wagons
518 fESDpid->SetTOFResponse(fESD,startTimeMethodDefault);
521 PostData(2, fHlistTimeZero);
522 PostData(3, fHlistPID);
523 PostData(4, fHlistTRD);
524 PostData(5, fHlistTrigger);
528 //________________________________________________________________________
529 void AliAnalysisTaskTOFqaID::Terminate(Option_t *)
531 //check on output validity
532 fHlist = dynamic_cast<TList*> (GetOutputData(1));
534 AliError("Base histograms list not available");
538 // TH1F*hDummy = ((TH1F*)fHlist->FindObject("hTOFmatchedESDPt"));
539 // TH1F*hMatchingEff = (TH1F*) hDummy->Clone("hMatchingEff");
540 // hMatchingEff->SetTitle("Matching efficiency");
541 // hMatchingEff->Divide((TH1F*) fHlist->FindObject("hESDprimaryTrackPt"));
542 // TCanvas *c1 = new TCanvas("AliAnalysisTaskTOFqaID","Matching vs Pt",10,10,510,510);
543 // c1->cd(1)->SetLogy();
544 // hMatchingEff->DrawCopy("E");
545 // fHlist->AddLast(hMatchingEff);
546 ComputeMatchingEfficiency(fHlist, "pt");
547 ComputeMatchingEfficiency(fHlist, "eta");
548 ComputeMatchingEfficiency(fHlist, "phi");
553 //---------------------------------------------------------------
554 Int_t AliAnalysisTaskTOFqaID::GetStripIndex(const Int_t * in)
556 /* return tof strip index between 0 and 91 */
558 Int_t nStripA = AliTOFGeometry::NStripA();
559 Int_t nStripB = AliTOFGeometry::NStripB();
560 Int_t nStripC = AliTOFGeometry::NStripC();
562 Int_t iplate = in[1];
563 Int_t istrip = in[2];
565 Int_t stripOffset = 0;
571 stripOffset = nStripC;
574 stripOffset = nStripC+nStripB;
577 stripOffset = nStripC+nStripB+nStripA;
580 stripOffset = nStripC+nStripB+nStripA+nStripB;
587 if (stripOffset<0 || stripOffset>92) return -1;
589 return (stripOffset+istrip);
592 //-----------------------------------------------------------------
593 Double_t AliAnalysisTaskTOFqaID::GetPhiAtTPCouterRadius(AliESDtrack * track)
595 //get track phi at TPC outer radius
596 if (!track) return 1e10;
597 Double_t tpcoutcoord[3]={0.,0.,0.};
598 track->GetOuterXYZ(tpcoutcoord);
599 Double_t phiOuterTPC=TMath::ATan2(tpcoutcoord[1],tpcoutcoord[0])*TMath::RadToDeg();
601 phiOuterTPC+= (2*TMath::Pi()*TMath::RadToDeg());
604 //-----------------------------------------------------------------
605 Bool_t AliAnalysisTaskTOFqaID::IsEventSelected(AliESDEvent * event)
607 //select event based on primary vertex
609 AliError("Invalid ESD event");
612 fVertex = (AliESDVertex*) event->GetPrimaryVertexTracks();
613 if(fVertex->GetNContributors()<1) {
615 fVertex = (AliESDVertex*) event->GetPrimaryVertexSPD();
616 if(fVertex->GetNContributors()<1) fVertex = 0x0;
618 if (!fVertex) return kFALSE;
619 if (TMath::Abs(fVertex->GetZv())<10.0) return kTRUE;
623 //-----------------------------------------------------------------
624 Bool_t AliAnalysisTaskTOFqaID::IsTPCTOFMatched(AliESDtrack * track)
626 //defines TOF matching
628 AliWarning("Invalid track object");
632 if ( (track->IsOn(AliESDtrack::kTOFout)) &&
633 (track->IsOn(AliESDtrack::kTIME)) &&
634 (track->IsOn(AliESDtrack::kTPCout)) )
639 //-----------------------------------------------------------------
640 Bool_t AliAnalysisTaskTOFqaID::IsInTRD(AliESDtrack * track)
642 //defines cut to select particles in/out TRD
644 AliWarning("Invalid track object");
648 if ( track->IsOn(AliESDtrack::kTPCout)
649 && track->IsOn(AliESDtrack::kTRDout) )
654 //-----------------------------------------------------------------
655 void AliAnalysisTaskTOFqaID::FillStartTimeMaskHisto(TString suffix)
657 /* set pid response to use best_T0 and for each
658 accepted track fills the histogram with the
662 //set response best_t0
663 //fESDpid->SetTOFResponse(fESD,AliESDpid::kBest_T0);
665 for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
666 AliESDtrack* track = fESD->GetTrack(iTracks);
668 AliInfo(Form("Cannot receive track %d", iTracks));
671 //primary tracks selection: kTPCrefit and std cuts
673 if(!fTrackFilter->IsSelected(track)) continue;
676 AliInfo("No track filter found, skipping the track loop");
679 if (TMath::Abs(track->Eta())>0.8) continue; //cut for acceptance
681 Int_t StartTimeBit = fESDpid->GetTOFResponse().GetStartTimeMask(track->P());
682 ((TH2F*)fHlistTimeZero->FindObject(Form("hStartTimeMask%s",suffix.Data())))->Fill(track->P(),StartTimeBit);
684 //matched tracks selection: kTOFout and kTIME
685 if ( (track->IsOn(AliESDtrack::kTOFout)) &&
686 (track->IsOn(AliESDtrack::kTIME)) &&
687 (track->IsOn(AliESDtrack::kTPCout)) ) {
688 ((TH2F*)fHlistTimeZero->FindObject(Form("hStartTimeMaskMatched%s",suffix.Data())))->Fill(track->P(),StartTimeBit);
694 //----------------------------------------------------
695 Bool_t AliAnalysisTaskTOFqaID::ComputeTimeZeroByTOF1GeV()
697 /* compute T0-TOF for tracks within momentum range [0.95, 1.05] */
699 AliTOFT0v1 *fTOFT0v1 = new AliTOFT0v1(fESDpid); // TOF-T0 v1
700 fTOFT0v1->Init(fESD);
701 fTOFT0v1->DefineT0("all", 0.95, 1.05);
702 fMyTimeZeroTOF = -1000. * fTOFT0v1->GetResult(0);
703 fMyTimeZeroTOFsigma = 1000. * fTOFT0v1->GetResult(1);
704 fMyTimeZeroTOFtracks = fTOFT0v1->GetResult(3);
705 Bool_t hasTimeZeroTOF = kFALSE;
706 /* check T0-TOF sigma */
707 if (fMyTimeZeroTOFsigma < 250.)
708 hasTimeZeroTOF = kTRUE;
709 return hasTimeZeroTOF;
712 //------------------------------------------------------
713 TString AliAnalysisTaskTOFqaID::GetSpeciesName(Int_t absPdgCode)
715 //returns name of selected specie
740 //-----------------------------------------------
741 Bool_t AliAnalysisTaskTOFqaID::SelectMCspecies(AliMCEvent * ev, AliESDtrack * track)
744 //Retrieves particle true ID from MC and selects the desired species
746 if ((!ev) || (!track)) {
747 AliError("SelectMCspecies - Invalid object set as argument");
751 if (fSelectedPdg==0) return kTRUE; //if fSelectedPdg==0, no species selection is applied
753 Long_t label = track->GetLabel();
754 if (label<0) return kFALSE;
756 // get number of particles
757 Long_t nMC = ev->GetNumberOfTracks();
758 // if label too large --> failed
760 AliWarning(Form("Stack overflow: track label = %li -- stack maximum = %li", label, nMC));
764 AliMCParticle *mcPart = (AliMCParticle *)ev->GetTrack(label);
765 if (!mcPart) {// if particle = NULL --> failed
766 AliWarning(Form("Stack discontinuity: label %li refers to a NULL object", label));
770 Int_t pdgCode = mcPart->PdgCode();
771 if (!(TMath::Abs(pdgCode)==fSelectedPdg))
777 //----------------------------------------------------------------------------------
778 Bool_t AliAnalysisTaskTOFqaID::ComputeMatchingEfficiency(TList* list, TString variable)
780 //computes matching efficiency from previously filled histos
781 // to be called in terminate function
782 if (!list) return kFALSE;
784 TString matchedName, primaryName, xAxisTitle;
785 if (variable.Contains("pt")) {
786 matchedName = "hTOFmatchedESDPt";
787 primaryName = "hESDprimaryTrackPt";
788 xAxisTitle = "p_{T} (GeV/c)";
790 if (variable.Contains("eta")) {
791 matchedName = "hTOFmatchedESDeta";
792 primaryName = "hTOFprimaryESDeta";
795 if (variable.Contains("phi")) {
796 matchedName = "hTOFmatchedESDphi";
797 primaryName = "hTOFprimaryESDphi";
798 xAxisTitle = "#phi_vtx (deg)";
801 TH1F*hDummy = ((TH1F*)list->FindObject(matchedName.Data()));
802 if (!hDummy) return 0;
804 TH1F*hMatchingEff = (TH1F*) hDummy->Clone("hMatchingEff");
805 hMatchingEff->SetNameTitle(Form("hMatchingEff_%s", variable.Data()),Form("Matching efficiency vs %s", variable.Data()));
806 hMatchingEff->Divide((TH1F*) list->FindObject(primaryName.Data()));
807 hMatchingEff->GetXaxis()->SetTitle(xAxisTitle.Data());
808 hMatchingEff->GetYaxis()->SetRangeUser(0.0,1.0);
809 hMatchingEff->GetYaxis()->SetTitle("#epsilon_{match}");
810 list->AddLast(hMatchingEff);
813 //----------------------------------------------------------------------------------
814 void AliAnalysisTaskTOFqaID::HistogramMakeUp(TH1* hist, Color_t color, Int_t markerStyle, TString drawOpt, TString newName, TString newTitle, TString xTitle, TString yTitle)
816 //set histogram style and axes style at once
818 if (!newName.IsNull()) hist->SetName(newName.Data());
819 if (!newTitle.IsNull()) hist->SetTitle(newTitle.Data());
820 if (!xTitle.IsNull()) hist->GetXaxis()->SetTitle(xTitle.Data());
821 if (!yTitle.IsNull()) hist->GetYaxis()->SetTitle(yTitle.Data());
822 hist->SetLineColor(color);
823 hist->SetMarkerColor(color);
824 hist->SetMarkerStyle(markerStyle);
825 hist->SetMarkerSize(0.7);
826 hist->SetDrawOption(drawOpt.Data());
831 //----------------------------------------------------------------------------------
832 void AliAnalysisTaskTOFqaID::AddTofBaseHisto(TList *list, Int_t charge, TString suffix)
834 //Creates histograms for monitoring TOF signal, time alignement and matching-related quantities
836 AliError("Invalid list passed as argument.");
841 if (charge == 0) cLabel.Form("all");
843 if (charge<0) cLabel.Form("neg");
845 if (charge>0) cLabel.Form("pos");
848 TH1I* hTOFmulti = new TH1I(Form("hTOFmulti%s_%s",suffix.Data(), cLabel.Data()), Form("%s matched trk per event (|#eta|#leq0.8, p_{T}#geq0.3 GeV/c)", cLabel.Data()), 100, 0, 100);
849 HistogramMakeUp(hTOFmulti, ((charge>0)? kRed : kBlue+2), 1, "E1", "","", "N","events");
850 list->AddLast(hTOFmulti);
852 TH1F* hTOFtime = new TH1F(Form("hTime%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk TOF signal", cLabel.Data()), 250, 0., 610. ) ;
853 HistogramMakeUp(hTOFtime,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "t (ns)","tracks");
854 list->AddLast(hTOFtime);
856 TH1F* hTOFrawTime = new TH1F(Form("hRawTime%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk TOF raw signal", cLabel.Data()), 250, 0., 610. ) ;
857 HistogramMakeUp(hTOFrawTime,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "t_{raw} (ns)","tracks");
858 list->AddLast(hTOFrawTime);
860 TH1F* hTOFtot = new TH1F(Form("hTot%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk ToT", cLabel.Data()), 50, 0., 50. ) ;
861 HistogramMakeUp(hTOFtot,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "ToT (ns)","tracks");
862 list->AddLast(hTOFtot);
864 TH1F* hMatchedL = new TH1F(Form("hMatchedL%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk lenght", cLabel.Data()), 900, -100., 800) ;
865 HistogramMakeUp(hMatchedL,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "L (cm)","tracks");
866 list->AddLast(hMatchedL);
868 const Int_t nBinsPt = 300;
869 Double_t xBins[nBinsPt+1];
870 for (Int_t j=0;j<nBinsPt+1; j++) {
871 if (j<200) xBins[j] = j*0.025;
872 else xBins[j] = 5.0 + (j-200)*0.050;
875 TH2F* hMatchedDxVsPt = new TH2F(Form("hMatchedDxVsPt%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk dx vs.p_{T}", cLabel.Data()), nBinsPt, xBins, 200, -10., 10.);
876 HistogramMakeUp(hMatchedDxVsPt,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "p_{T} (GeV/c)","dx (cm)");
877 list->AddLast(hMatchedDxVsPt);
879 TH2F* hMatchedDzVsStrip = new TH2F(Form("hMatchedDzVsStrip%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk dz vs. strip (#eta)", cLabel.Data()), 92, 0., 92., 200, -10., 10.) ;
880 HistogramMakeUp(hMatchedDzVsStrip,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "strip index","dz (cm)");
881 list->AddLast(hMatchedDzVsStrip) ;
883 TProfile *hMatchedDxVsCh = new TProfile(Form("hMatchedDxVsCh%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk dx vs. channel", cLabel.Data()), 157248., 0.,157248.);
884 HistogramMakeUp(hMatchedDxVsCh,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "channel index","dx (cm)");
885 list->AddLast(hMatchedDxVsCh);
887 TProfile *hMatchedDzVsCh = new TProfile(Form("hMatchedDzVsCh%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk dz vs. channel", cLabel.Data()), 157248., 0.,157248.);
888 HistogramMakeUp(hMatchedDzVsCh,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "channel index","dz (cm)");
889 list->AddLast(hMatchedDzVsCh);
894 //----------------------------------------------------------------------------------
895 void AliAnalysisTaskTOFqaID::AddMatchingEffHisto(TList *list, Int_t charge, TString suffix)
898 AliError("Invalid list passed as argument.");
902 if (charge == 0) cLabel.Form("all");
904 if (charge<0) cLabel.Form("neg");
906 if (charge>0) cLabel.Form("pos");
908 const Int_t nBinsX = 300;
909 Double_t xBins[nBinsX+1];
910 for (Int_t j=0;j<nBinsX+1; j++) {
911 if (j<200) xBins[j] = j*0.025;
912 else xBins[j] = 5.0 + (j-200)*0.050;
915 TH1F* hMatchedP = new TH1F(Form("hMatchedP%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p", cLabel.Data()), nBinsX, xBins);// 1000,0.,10.) ;
916 HistogramMakeUp(hMatchedP,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "p (GeV/c)","tracks");
917 list->AddLast(hMatchedP) ;
919 TH1F* hMatchedPt = new TH1F(Form("hMatchedPt%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p_{T}", cLabel.Data()), nBinsX, xBins);// 1000,0.,10.) ;
920 HistogramMakeUp(hMatchedPt,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "p_{T} (GeV/c)","tracks");
921 list->AddLast(hMatchedPt) ;
923 TH1F* hMatchedEta = new TH1F(Form("hMatchedEta%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #eta", cLabel.Data()), 200, -1., 1.) ;
924 HistogramMakeUp(hMatchedEta,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "#eta","tracks");
925 list->AddLast(hMatchedEta) ;
927 TH1F* hMatchedPhi = new TH1F(Form("hMatchedPhi%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #phi_{vtx}", cLabel.Data()), 72, 0., 360.) ;
928 HistogramMakeUp(hMatchedPhi,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "#phi_{vtx} (deg)","tracks");
929 list->AddLast(hMatchedPhi) ;
931 TH2F* hMatchedPtVsOutPhi = new TH2F(Form("hMatchedPtVsOutPhi%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p_{T} vs. #phi_{TPC out}", cLabel.Data()), 72, 0.0, 360.0, nBinsX, xBins);// 1000,0.,10.) ;
932 HistogramMakeUp(hMatchedPtVsOutPhi,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "#phi_{TPC out} (deg)","p_{T} (GeV/c)");
933 list->AddLast(hMatchedPtVsOutPhi) ;
935 TH1F* hPrimaryP = new TH1F(Form("hPrimaryP%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p", cLabel.Data()), nBinsX, xBins);// 1000,0.,10.) ;
936 HistogramMakeUp(hPrimaryP,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "p (GeV/c)","tracks");
937 list->AddLast(hPrimaryP) ;
939 TH1F* hPrimaryPt = new TH1F(Form("hPrimaryPt%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p_{T}", cLabel.Data()), nBinsX, xBins);// 1000,0.,10.) ;
940 HistogramMakeUp(hPrimaryPt,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "p_{T} (GeV/c)","tracks");
941 list->AddLast(hPrimaryPt) ;
943 TH1F* hPrimaryEta = new TH1F(Form("hPrimaryEta%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #eta", cLabel.Data()), 200, -1., 1.) ;
944 HistogramMakeUp(hPrimaryEta,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "#eta","tracks");
945 list->AddLast(hPrimaryEta) ;
947 TH1F* hPrimaryPhi = new TH1F(Form("hPrimaryPhi%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #phi_{vtx}", cLabel.Data()), 72, 0., 360.) ;
948 HistogramMakeUp(hPrimaryPhi,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "#phi_{vtx} (deg)","tracks");
949 list->AddLast(hPrimaryPhi) ;
951 TH2F* hPrimaryPtVsOutPhi = new TH2F(Form("hPrimaryPtVsOutPhi%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p_{T} vs. #phi_{TPC out}", cLabel.Data()), 72, 0.0, 360.0, nBinsX, xBins);// 1000,0.,10.) ;
952 HistogramMakeUp(hPrimaryPtVsOutPhi,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "#phi_{TPC out} (deg)","p_{T} (GeV/c)");
953 list->AddLast(hPrimaryPtVsOutPhi) ;
957 //----------------------------------------------------------------------------------
958 void AliAnalysisTaskTOFqaID::AddPidHisto(TList *list, Int_t charge, TString suffix)
960 //Creates histograms for monitoring TOF PID
962 AliError("Invalid list passed as argument.");
966 if (charge == 0) cLabel.Form("all");
968 if (charge<0) cLabel.Form("neg");
970 if (charge>0) cLabel.Form("pos");
972 const Int_t nBinsX = 300;
973 Double_t xBins[nBinsX+1];
974 for (Int_t j=0;j<nBinsX+1; j++) {
975 if (j<200) xBins[j] = j*0.025;
976 else xBins[j] = 5.0 + (j-200)*0.050;
979 TH2F* hMatchedBetaVsP = new TH2F(Form("hMatchedBetaVsP%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #beta vs. p", cLabel.Data()), nBinsX, xBins, 150, 0., 1.5) ;
980 HistogramMakeUp(hMatchedBetaVsP,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "p (GeV/c)","#beta");
981 list->AddLast(hMatchedBetaVsP);
983 TH1F* hMatchedMass= new TH1F(Form("hMatchedMass%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched p.le M", cLabel.Data()), 500, 0., 5. );
984 HistogramMakeUp(hMatchedMass,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "M (GeV/c^{2})","entries");
985 list->AddLast(hMatchedMass);
987 TH1F* hMatchedMass2= new TH1F(Form("hMatchedMass2%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched p.le M^{2}", cLabel.Data()), 500, 0., 10. );
988 HistogramMakeUp(hMatchedMass2,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "M^{2} (GeV^{2}/c^{4})","entries");
989 list->AddLast(hMatchedMass2);
991 TH2F* hExpTimePiVsStrip = new TH2F(Form("hExpTimePiVsStrip%s_%s",suffix.Data(),cLabel.Data()),Form("%s matched trk t_{TOF}-t_{#pi,exp} vs strip",cLabel.Data()), 92, 0, 92, fnExpTimeSmallBins, fExpTimeSmallRangeMin, fExpTimeSmallRangeMax) ;
992 HistogramMakeUp(hExpTimePiVsStrip,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "strip (#eta)","t_{TOF}-t_{#pi,exp} [ps]");
993 list->AddLast(hExpTimePiVsStrip);
995 TH2F* hExpTimePiT0Sub1GeV = new TH2F(Form("hExpTimePiT0Sub1GeV%s_%s",suffix.Data(),cLabel.Data()), Form("%s trk (0.95#leq p_{T}#leq 1.05 GeV/c) t_{TOF}-t_{#pi,exp}-t_{0}^{TOF}",cLabel.Data()), 500, 0., 500., fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
996 HistogramMakeUp(hExpTimePiT0Sub1GeV,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","","n. tracks used for t_{0}^{TOF}","t_{TOF}-t_{#pi,exp}-t_{0}^{TOF}");
997 list->AddLast(hExpTimePiT0Sub1GeV) ;
999 TH1F* hExpTimePiFillSub = new TH1F(Form("hExpTimePiFillSub%s_%s",suffix.Data(),cLabel.Data()), Form("%s trk t_{TOF}-t_{#pi,exp}-t_{0,fill}",cLabel.Data()), fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
1000 HistogramMakeUp(hExpTimePiFillSub,((charge>0)? kRed+2 : kBlue+2), 1, "", "","","t_{TOF}-t_{#pi,exp} -t_{0,fill} [ps]","entries");
1001 list->AddLast(hExpTimePiFillSub) ;
1003 TH1F* hExpTimePi = new TH1F(Form("hExpTimePi%s_%s",suffix.Data(),cLabel.Data()),Form("%s matched trk t_{TOF}-t_{#pi,exp}",cLabel.Data()), fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
1004 HistogramMakeUp(hExpTimePi,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "t_{TOF}-t_{#pi,exp} [ps]","tracks");
1005 list->AddLast(hExpTimePi);
1007 TH2F* hExpTimePiVsP = new TH2F(Form("hExpTimePiVsP%s_%s",suffix.Data(),cLabel.Data()),Form("%s matched trk t_{TOF}-t_{#pi,exp}",cLabel.Data()), nBinsX, xBins, fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
1008 HistogramMakeUp(hExpTimePiVsP,kRed+2, 1, "colz", "","", "p (GeV/c)","t_{TOF}-t_{#pi,exp} [ps]");
1009 list->AddLast(hExpTimePiVsP);
1011 TH2F* hExpTimeKaVsP = new TH2F(Form("hExpTimeKaVsP%s_%s",suffix.Data(),cLabel.Data()),Form("%s matched trk t_{TOF}-t_{K,exp}",cLabel.Data()), nBinsX, xBins, fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
1012 HistogramMakeUp(hExpTimeKaVsP,kBlue+2, 1, "colz", "","", "p (GeV/c)","t_{TOF}-t_{K,exp} [ps]");
1013 list->AddLast(hExpTimeKaVsP);
1015 TH2F* hExpTimeProVsP = new TH2F(Form("hExpTimeProVsP%s_%s",suffix.Data(),cLabel.Data()),Form("%s matched trk t_{TOF}-t_{p,exp}",cLabel.Data()), nBinsX, xBins, fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
1016 HistogramMakeUp(hExpTimeProVsP,kGreen+2, 1, "colz", "","", "p (GeV/c)","t_{TOF}-t_{p,exp} [ps]");
1017 list->AddLast(hExpTimeProVsP);
1019 TH2F* hTOFpidSigmaPi = new TH2F(Form("hTOFpidSigmaPi%s_%s",suffix.Data(),cLabel.Data()), Form("%s trk n#sigma^{TOF}_{#pi} vs p_{T}",cLabel.Data()), 500,0.,5.,200, -10., 10. ) ;
1020 HistogramMakeUp(hTOFpidSigmaPi,kRed+2, 1, "colz", "","", "p (GeV/c)","n#sigma_{#pi,exp} [ps]");
1021 list->AddLast(hTOFpidSigmaPi) ;
1023 TH2F* hTOFpidSigmaKa = new TH2F(Form("hTOFpidSigmaKa%s_%s",suffix.Data(),cLabel.Data()), Form("%s trk n#sigma^{TOF}_{K} vs p_{T}",cLabel.Data()), 500, 0.,5.,200, -10., 10. ) ;
1024 HistogramMakeUp(hTOFpidSigmaKa,kBlue+2, 1, "colz", "","", "p (GeV/c)","n#sigma_{K,exp} [ps]");
1025 list->AddLast(hTOFpidSigmaKa) ;
1027 TH2F* hTOFpidSigmaPro = new TH2F(Form("hTOFpidSigmaPro%s_%s",suffix.Data(),cLabel.Data()), Form("%s trk TOF n#sigma^{TOF}_{p} vs p_{T}",cLabel.Data()), 500, 0.,5.,200, -10., 10. ) ;
1028 HistogramMakeUp(hTOFpidSigmaPro,kGreen+2, 1, "colz", "","","p (GeV/c)","n#sigma_{p,exp} [ps]");
1029 list->AddLast(hTOFpidSigmaPro);
1031 TH2F* hExpTimePiT0SubVsP = new TH2F(Form("hExpTimePiT0SubVsP%s_%s",suffix.Data(),cLabel.Data()), Form("%s trk t_{TOF}-t_{#pi,exp}-t_{0}^{TOF}",cLabel.Data()), nBinsX, xBins, fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
1032 HistogramMakeUp(hExpTimePiT0SubVsP,kRed+2, 1, "colz", "","","p (GeV/c)","t_{TOF}-t_{#pi,exp}-t_{0}^{TOF}");
1033 list->AddLast(hExpTimePiT0SubVsP) ;
1035 TH2F* hExpTimeKaT0SubVsP = new TH2F(Form("hExpTimeKaT0SubVsP%s_%s",suffix.Data(),cLabel.Data()), Form("%s trk t_{TOF}-t_{K,exp}-t_{0}^{TOF}",cLabel.Data()), nBinsX, xBins, fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
1036 HistogramMakeUp(hExpTimeKaT0SubVsP,kBlue+2, 1, "colz", "","","p (GeV/c)","t_{TOF}-t_{K,exp}-t_{0}^{TOF}");
1037 list->AddLast(hExpTimeKaT0SubVsP) ;
1039 TH2F* hExpTimeProT0SubVsP = new TH2F(Form("hExpTimeProT0SubVsP%s_%s",suffix.Data(),cLabel.Data()), Form("%s trk t_{TOF}-t_{p,exp}-t_{0}^{TOF}",cLabel.Data()), nBinsX, xBins, fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
1040 HistogramMakeUp(hExpTimeProT0SubVsP,kGreen+2, 1, "colz", "","","p (GeV/c)","t_{TOF}-t_{p,exp}-t_{0}^{TOF}");
1041 list->AddLast(hExpTimeProT0SubVsP) ;
1043 TH2F* hExpTimePiVsOutPhi = new TH2F(Form("hExpTimePiVsOutPhi%s_%s",suffix.Data(),cLabel.Data()),Form("%s matched trk t_{TOF}-t_{#pi,exp} vs #phi_{TPC out}",cLabel.Data()), 72, 0.0, 360.0, fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
1044 HistogramMakeUp(hExpTimePiVsOutPhi,kRed+2, 1, "colz", "","", "#phi_{TPC out} (deg)","t_{TOF}-t_{#pi,exp} [ps]");
1045 list->AddLast(hExpTimePiVsOutPhi);
1047 TH2F* hExpTimeKaVsOutPhi = new TH2F(Form("hExpTimeKaVsOutPhi%s_%s",suffix.Data(),cLabel.Data()),Form("%s matched trk t_{TOF}-t_{K,exp} vs #phi_{TPC out}",cLabel.Data()), 72, 0.0, 360.0, fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
1048 HistogramMakeUp(hExpTimeKaVsOutPhi,kBlue+2, 1, "colz", "","", "#phi_{TPC out} (deg)","t_{TOF}-t_{K,exp} [ps]");
1049 list->AddLast(hExpTimeKaVsOutPhi);
1051 TH2F* hExpTimeProVsOutPhi = new TH2F(Form("hExpTimeProVsOutPhi%s_%s",suffix.Data(),cLabel.Data()),Form("%s matched trk t_{TOF}-t_{p,exp} vs #phi_{TPC out}",cLabel.Data()), 72, 0.0, 360.0, fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
1052 HistogramMakeUp(hExpTimeProVsOutPhi,kGreen+2, 1, "colz", "","", "#phi_{TPC out} (deg)","t_{TOF}-t_{p,exp} [ps]");
1053 list->AddLast(hExpTimeProVsOutPhi);
1057 //----------------------------------------------------------------------------------
1058 void AliAnalysisTaskTOFqaID::AddStartTimeHisto(TList *list, TString suffix)
1060 //Creates histograms for monitoring T0 signal and start-time related quantities
1062 AliError("Invalid list passed as argument.");
1065 TH1F* hT0AC = new TH1F(Form("hT0AC%s",suffix.Data()), "Event timeZero from T0A&C; t_{0,AC} [ps]; events", 1000, -12500., 12500.) ;
1066 HistogramMakeUp(hT0AC, kRed+2, 20, "", "","","","");
1067 list->AddLast(hT0AC);
1069 TH1F* hT0A = new TH1F(Form("hT0A%s",suffix.Data()), "Event timeZero from T0A; t_{0,A} [ps]; events", 1000, -12500., 12500.) ;
1070 HistogramMakeUp(hT0A, kBlue+2, 25, "", "","","","");
1071 list->AddLast(hT0A);
1073 TH1F* hT0C = new TH1F(Form("hT0C%s",suffix.Data()), "Event timeZero from T0C; t_{0,C} [ps]; events", 1000, -12500., 12500.) ;
1074 HistogramMakeUp(hT0C, kGreen+2, 28, "", "","","","");
1075 list->AddLast(hT0C);
1077 TH1F* hT0DetRes = new TH1F(Form("hT0DetRes%s",suffix.Data()), "T0 detector (T0A-T0C)/2; (T0A-T0C)/2 [ps]; events", 200, -500.,500. ) ;
1078 HistogramMakeUp(hT0DetRes, kMagenta+1, 1, "", "","","","");
1079 list->AddLast(hT0DetRes) ;
1081 TH1F* hT0fill = new TH1F(Form("hT0fill%s",suffix.Data()), "Event timeZero of fill; t_{0,fill} [ps]; events", 1000, -12500., 12500. ) ;
1082 HistogramMakeUp(hT0fill, kOrange+1, 25, "", "","","","");
1083 list->AddLast(hT0fill) ;
1085 TH1F* hT0TOF = new TH1F(Form("hT0TOF%s",suffix.Data()), "Event timeZero estimated by TOF; t0 [ps]; events", 1000, -12500., 12500. ) ;
1086 HistogramMakeUp(hT0TOF, kTeal-5, 21, "", "","","","");
1087 list->AddLast(hT0TOF) ;
1089 TH1F* hT0T0 = new TH1F(Form("hT0T0%s",suffix.Data()), "Best timeZero between AC, A, C; t_{0} [ps]; events", 1000, -12500., 12500. ) ;
1090 HistogramMakeUp(hT0T0, kAzure+7, 26, "", "","","","");
1091 list->AddLast(hT0T0) ;
1093 TH1F* hT0best = new TH1F(Form("hT0best%s",suffix.Data()), "Event timeZero estimated as T0best; t0 [ps]; events", 1000, -12500., 12500.) ;
1094 HistogramMakeUp(hT0best, kBlack, 20, "", "","","","");
1095 list->AddLast(hT0best) ;
1097 TH1F* hT0fillRes = new TH1F(Form("hT0fillRes%s",suffix.Data()), "Resolution of fillT0; #sigma_{fillT0} [ps];events", 250, 0.,250. ) ;
1098 HistogramMakeUp(hT0fillRes, kOrange+1, 25, "", "","","","");
1099 list->AddLast(hT0fillRes) ;
1101 TH1F* hT0TOFRes = new TH1F(Form("hT0TOFRes%s",suffix.Data()), "Resolution of timeZero from TOF; #sigma_{TOFT0} [ps];events", 250, 0.,250. ) ;
1102 HistogramMakeUp(hT0TOFRes, kTeal-5, 21, "", "","","","");
1103 list->AddLast(hT0TOFRes) ;
1105 TH1F* hT0T0Res = new TH1F(Form("hT0T0Res%s",suffix.Data()), "Resolution of timeZero from T0;#sigma_{T0T0} [ps];events", 250, -0., 250. ) ;
1106 HistogramMakeUp(hT0T0Res, kAzure+7, 26, "", "","","","");
1107 list->AddLast(hT0T0Res) ;
1109 TH1F* hT0bestRes = new TH1F(Form("hT0bestRes%s",suffix.Data()), "Resolution of bestT0; #sigma_{bestT0} [ps];events", 250, 0.,250. ) ;
1110 HistogramMakeUp(hT0bestRes, kBlack, 20, "", "","","","");
1111 list->AddLast(hT0bestRes) ;
1113 TH2F* hT0TOFvsNtrk = new TH2F(Form("hT0TOFvsNtrk%s",suffix.Data()), "Event timeZero estimated by TOF vs. number of tracks in event;TOF-matching tracks; t0 [ps]", 100, 0., 100., 500,-2500.,2500. ) ;
1114 HistogramMakeUp(hT0TOFvsNtrk, kTeal-5, 1, "colz", "","","","");
1115 list->AddLast(hT0TOFvsNtrk) ;
1117 TH2F* hEventT0MeanVsVtx = new TH2F(Form("hEventT0MeanVsVtx%s",suffix.Data()), "T0 detector: mean vs vertex ; (t0_{A}-t0_{C})/2 [ns]; (t0_{A}+t0_{C})/2 [ns]; events", 50, -25., 25., 50, -25., 25. ) ;
1118 HistogramMakeUp(hEventT0MeanVsVtx, kBlue+2, 1, "colz", "","","","");
1119 list->AddLast(hEventT0MeanVsVtx) ;
1121 TH2F* hEventV0MeanVsVtx = new TH2F(Form("hEventV0MeanVsVtx%s",suffix.Data()), "V0 detector: mean vs vertex ; (V0_{A}-V0_{C})/2 [ns]; (V0_{A}+V0_{C})/2 [ns]; events", 50, -25., 25., 50, -25., 25.) ;
1122 HistogramMakeUp(hEventV0MeanVsVtx, kBlack, 1, "colz", "","","","");
1123 list->AddLast(hEventV0MeanVsVtx) ;
1125 const Double_t startTimeMomBins[13]={ 0.0, 0.3, 0.5, 0.6, 0.7, 0.8, 0.9, 1., 1.2, 1.5, 2., 3., 10.};
1127 TH2F* hStartTimeMaskMatched = new TH2F(Form("hStartTimeMaskMatched%s",suffix.Data()),"Start Time Mask vs p bin for matched tracks; p(GeV/c);", 12, startTimeMomBins, 8,0.,8.);
1128 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(1,"fill_t0");
1129 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(2,"tof_t0");
1130 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(3,"T0AC");
1131 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(4,"T0AC & tof_t0");
1132 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(5,"T0A");
1133 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(6,"T0A & tof_t0");
1134 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(7,"T0C");
1135 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(8,"T0C & tof_t0");
1136 HistogramMakeUp(hStartTimeMaskMatched, kRed+2, 1, "colz", "","","","");
1137 list->AddLast(hStartTimeMaskMatched);
1139 TH2F* hStartTimeMask = new TH2F(Form("hStartTimeMask%s",suffix.Data()),"Start Time Mask vs p bin for primary tracks; p(GeV/c);", 12, startTimeMomBins, 8,0.,8.);
1140 hStartTimeMask->GetYaxis()->SetBinLabel(1,"fill_t0");
1141 hStartTimeMask->GetYaxis()->SetBinLabel(2,"tof_t0");
1142 hStartTimeMask->GetYaxis()->SetBinLabel(3,"T0AC");
1143 hStartTimeMask->GetYaxis()->SetBinLabel(4,"T0AC & tof_t0");
1144 hStartTimeMask->GetYaxis()->SetBinLabel(5,"T0A");
1145 hStartTimeMask->GetYaxis()->SetBinLabel(6,"T0A & tof_t0");
1146 hStartTimeMask->GetYaxis()->SetBinLabel(7,"T0C");
1147 hStartTimeMask->GetYaxis()->SetBinLabel(8,"T0C & tof_t0");
1148 HistogramMakeUp(hStartTimeMask, kRed+2, 1, "colz", "","","","");
1149 list->AddLast(hStartTimeMask);
1153 //----------------------------------------------------------------------------------
1154 void AliAnalysisTaskTOFqaID::AddTrdHisto()
1156 //Creates histograms for monitoring TOF base quantities wrt TRD/no TRD selection
1158 AliError("Invalid TRD list");
1162 if (fEnableChargeSplit) {
1163 AddMatchingEffHisto(fHlistTRD, 1, "_noTrd");
1164 AddMatchingEffHisto(fHlistTRD, -1, "_noTrd");
1165 AddMatchingEffHisto(fHlistTRD, 1, "_Trd");
1166 AddMatchingEffHisto(fHlistTRD, -1, "_Trd");
1168 AddPidHisto(fHlistTRD, 1, "_noTrd");
1169 AddPidHisto(fHlistTRD, -1, "_noTrd");
1170 AddPidHisto(fHlistTRD, 1, "_Trd");
1171 AddPidHisto(fHlistTRD, -1, "_Trd");
1173 AddMatchingEffHisto(fHlistTRD, 0, "_noTrd");
1174 AddMatchingEffHisto(fHlistTRD, 0, "_Trd");
1175 AddPidHisto(fHlistTRD, 0, "_noTrd");
1176 AddPidHisto(fHlistTRD, 0, "_Trd");
1183 //----------------------------------------------------------------------------------
1184 void AliAnalysisTaskTOFqaID::AddTofTrgHisto(TString suffix)
1186 //defines histo with trigger info
1187 if (!fHlistTrigger){
1188 AliError("Invalid TOF trigger list");
1192 TH1I* hFiredMaxipad = new TH1I(Form("hFiredMaxipad%s",suffix.Data()), Form("Fired maxipad per event"), 1584, 0, 1584);
1193 HistogramMakeUp(hFiredMaxipad, kBlue+2, 1, "E1", "","", "N_{maxipad}","events");
1194 fHlistTrigger->AddLast(hFiredMaxipad);
1196 TH1I* hFiredReadoutPad = new TH1I(Form("hFiredReadoutPad%s",suffix.Data()), Form("Fired readout pad per event"), 153000, 0, 153000);
1197 HistogramMakeUp(hFiredReadoutPad, kRed+2, 1, "E1", "","", "N_{pad}","events");
1198 fHlistTrigger->AddLast(hFiredReadoutPad);
1200 TH1I* hFiredReadoutTrgPad = new TH1I(Form("hFiredReadoutTrgPad%s",suffix.Data()), Form("Fired readout pad in trg window"), 153000, 0, 153000);
1201 HistogramMakeUp(hFiredReadoutTrgPad, kBlack, 1, "E1", "","", "N_{pad} in trg window","events");
1202 fHlistTrigger->AddLast(hFiredReadoutTrgPad);
1204 TH2I* hFiredMaxipadVsTrgPad = new TH2I(Form("hFiredMaxipadVsTrgPad%s",suffix.Data()), Form("Fired maxipad vs pads in trg window per event"), 100, 0, 100, 100, 0, 100);
1205 HistogramMakeUp(hFiredMaxipadVsTrgPad, kBlue+2, 1, "colz", "","", "N_{pad} in trg window","N_{maxipad}");
1206 fHlistTrigger->AddLast(hFiredMaxipadVsTrgPad);
1208 TH2I* hTrgMap = new TH2I(Form("hTrgMap%s",suffix.Data()), Form("Map of fired maxipads"), 72, 0, 72, 23, 0, 23);
1209 HistogramMakeUp(hTrgMap, kBlue+2, 1, "colz", "","", "LTM","maxipad");
1210 fHlistTrigger->AddLast(hTrgMap);
1215 //----------------------------------------------------------------------------------
1216 void AliAnalysisTaskTOFqaID::FillTofBaseHisto(AliESDtrack * track, Int_t charge, TString suffix)
1218 //fill histo with TOF base quantities
1221 // Double_t tofTime=track->GetTOFsignal();//in ps
1222 Double_t tofTimeRaw=track->GetTOFsignalRaw();//in ps
1223 Double_t tofToT=track->GetTOFsignalToT(); //in ps
1224 Int_t channel=track->GetTOFCalChannel();
1225 Int_t volId[5]; //(sector, plate,strip,padZ,padX)
1226 AliTOFGeometry::GetVolumeIndices(channel,volId);
1228 if (charge == 0) cLabel.Form("all");
1230 if (charge<0) cLabel.Form("neg");
1232 if (charge>0) cLabel.Form("pos");
1234 ((TH1F*)fHlist->FindObject(Form("hTime%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTof); //ns
1235 ((TH1F*)fHlist->FindObject(Form("hRawTime%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofTimeRaw*1E-3); //ns
1236 ((TH1F*)fHlist->FindObject(Form("hTot%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofToT);
1237 ((TH1F*)fHlist->FindObject(Form("hMatchedL%s_%s", suffix.Data(), cLabel.Data())))->Fill(fL);
1238 ((TH2F*)fHlist->FindObject(Form("hMatchedDxVsPt%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt,track->GetTOFsignalDx());
1239 ((TH2F*)fHlist->FindObject(Form("hMatchedDzVsStrip%s_%s",suffix.Data(),cLabel.Data())))->Fill((Int_t)GetStripIndex(volId),track->GetTOFsignalDz());
1240 ((TProfile*)fHlist->FindObject(Form("hMatchedDxVsCh%s_%s",suffix.Data(),cLabel.Data())))->Fill(channel,track->GetTOFsignalDx());
1241 ((TProfile*)fHlist->FindObject(Form("hMatchedDzVsCh%s_%s",suffix.Data(),cLabel.Data())))->Fill(channel,track->GetTOFsignalDz());
1245 //----------------------------------------------------------------------------------
1246 void AliAnalysisTaskTOFqaID::FillPrimaryTrkHisto(Int_t charge, TString suffix)
1248 // fill histos with primary tracks info
1249 // => denominator for matching efficiency
1251 if (charge == 0) cLabel.Form("all");
1253 if (charge<0) cLabel.Form("neg");
1255 if (charge>0) cLabel.Form("pos");
1257 if (suffix.Contains("Trd")) {
1258 ((TH1F*)fHlistTRD->FindObject(Form("hPrimaryP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP);
1259 ((TH1F*)fHlistTRD->FindObject(Form("hPrimaryPt%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt);
1260 ((TH2F*)fHlistTRD->FindObject(Form("hPrimaryPtVsOutPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,fPt);
1261 if (fPt>=fMatchingMomCut) {
1262 ((TH1F*)fHlistTRD->FindObject(Form("hPrimaryEta%s_%s",suffix.Data(),cLabel.Data())))->Fill(fEta);
1263 ((TH1F*)fHlistTRD->FindObject(Form("hPrimaryPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPhi);
1266 ((TH1F*)fHlist->FindObject(Form("hPrimaryP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP);
1267 ((TH1F*)fHlist->FindObject(Form("hPrimaryPt%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt);
1268 ((TH2F*)fHlist->FindObject(Form("hPrimaryPtVsOutPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,fPt);
1269 if (fPt>=fMatchingMomCut) {
1270 ((TH1F*)fHlist->FindObject(Form("hPrimaryEta%s_%s",suffix.Data(),cLabel.Data())))->Fill(fEta);
1271 ((TH1F*)fHlist->FindObject(Form("hPrimaryPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPhi);
1276 //----------------------------------------------------------------------------------
1277 void AliAnalysisTaskTOFqaID::FillMatchedTrkHisto(Int_t charge, TString suffix)
1279 //get matched tracks variables (matching cut to be applied externally)
1280 //=> numerator for matching efficiency
1282 if (charge == 0) cLabel.Form("all");
1284 if (charge<0) cLabel.Form("neg");
1286 if (charge>0) cLabel.Form("pos");
1288 if (suffix.Contains("Trd")) {
1289 ((TH1F*)fHlistTRD->FindObject(Form("hMatchedP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP);
1290 ((TH1F*)fHlistTRD->FindObject(Form("hMatchedPt%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt);
1291 ((TH2F*)fHlistTRD->FindObject(Form("hMatchedPtVsOutPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,fPt);
1292 if (fPt>=fMatchingMomCut) {
1293 ((TH1F*)fHlistTRD->FindObject(Form("hMatchedEta%s_%s",suffix.Data(),cLabel.Data())))->Fill(fEta);
1294 ((TH1F*)fHlistTRD->FindObject(Form("hMatchedPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPhi);
1297 ((TH1F*)fHlist->FindObject(Form("hMatchedP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP);
1298 ((TH1F*)fHlist->FindObject(Form("hMatchedPt%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt);
1299 ((TH2F*)fHlist->FindObject(Form("hMatchedPtVsOutPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,fPt);
1300 if (fPt>=fMatchingMomCut) {
1301 ((TH1F*)fHlist->FindObject(Form("hMatchedEta%s_%s",suffix.Data(),cLabel.Data())))->Fill(fEta);
1302 ((TH1F*)fHlist->FindObject(Form("hMatchedPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPhi);
1308 //----------------------------------------------------------------------------------
1309 void AliAnalysisTaskTOFqaID::FillPidHisto(AliESDtrack * track, Int_t charge, TString suffix)
1311 //basic PID performance check
1313 printf("WARNING: track with negative TOF time found! Skipping this track for PID checks\n");
1317 printf("WARNING: track with negative length found!Skipping this track for PID checks\n");
1323 if (charge == 0) cLabel.Form("all");
1325 if (charge<0) cLabel.Form("neg");
1327 if (charge>0) cLabel.Form("pos");
1330 Double_t c=TMath::C()*1.E-9;// m/ns
1331 Double_t mass=0.; //GeV
1332 Double_t length=fL*0.01; // in meters
1333 Double_t tof=fTof*c;
1334 Double_t beta=length/tof;
1335 Double_t fact= (tof/length)*(tof/length) -1.;
1336 Double_t fP2 = fP*fP;
1339 mass = -fP*TMath::Sqrt(-fact);
1341 mass = fP*TMath::Sqrt(fact);
1344 if (suffix.Contains("Trd")) {
1345 ((TH2F*) fHlistTRD->FindObject(Form("hMatchedBetaVsP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP,beta);
1346 ((TH1F*) fHlistTRD->FindObject(Form("hMatchedMass%s_%s",suffix.Data(),cLabel.Data())))->Fill(mass);
1347 ((TH1F*) fHlistTRD->FindObject(Form("hMatchedMass2%s_%s",suffix.Data(),cLabel.Data())))->Fill(mass*mass);
1349 ((TH2F*) fHlistPID->FindObject(Form("hMatchedBetaVsP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP,beta);
1350 ((TH1F*) fHlistPID->FindObject(Form("hMatchedMass%s_%s",suffix.Data(),cLabel.Data())))->Fill(mass);
1351 ((TH1F*) fHlistPID->FindObject(Form("hMatchedMass2%s_%s",suffix.Data(),cLabel.Data())))->Fill(mass*mass);
1355 Bool_t isValidBeta[AliPID::kSPECIES]={0,0,0,0,0};
1356 for (Int_t specie = 0; specie < AliPID::kSPECIES; specie++){
1357 fSigmaSpecie[specie] = fESDpid->GetTOFResponse().GetExpectedSigma(fP, fTrkExpTimes[specie], AliPID::ParticleMass(specie));
1358 beta=1/TMath::Sqrt(1+AliPID::ParticleMass(specie)*AliPID::ParticleMass(specie)/(fP2));
1360 fThExpTimes[specie]=length*1.E3/(beta*c);//ps
1361 isValidBeta[specie]=kTRUE;
1363 fThExpTimes[specie]=1E-10;
1364 isValidBeta[specie]=kFALSE;
1367 Float_t timeZeroTOF = (Float_t) fESDpid->GetTOFResponse().GetStartTime(fPt);
1368 Double_t tofps=fTof*1E3;//ps for t-texp
1369 Int_t channel=track->GetTOFCalChannel();
1370 Int_t volId[5]; //(sector, plate,strip,padZ,padX)
1371 AliTOFGeometry::GetVolumeIndices(channel,volId);
1372 Char_t partName[3][4] = {"Pi","Ka","Pro"};
1374 if (suffix.Contains("Trd")) {
1375 //fill histos for pion only
1376 ((TH2F*)fHlistTRD->FindObject(Form("hExpTimePiVsStrip%s_%s",suffix.Data(),cLabel.Data())))->Fill((Int_t)GetStripIndex(volId),tofps-fTrkExpTimes[AliPID::kPion]);//ps
1377 ((TH1F*)fHlistTRD->FindObject(Form("hExpTimePi%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofps-fTrkExpTimes[AliPID::kPion]);//ps
1378 if (ComputeTimeZeroByTOF1GeV() && (fPt>0.95) && (fPt<1.05) ){
1379 ((TH2F*)fHlistTRD->FindObject(Form("hExpTimePiT0Sub1GeV%s_%s",suffix.Data(),cLabel.Data())))->Fill(fMyTimeZeroTOFtracks,tofps-fMyTimeZeroTOF-fTrkExpTimes[AliPID::kPion]);
1381 //fill sigmas and deltas for each specie
1382 for (Int_t specie = AliPID::kPion; specie <= AliPID::kProton; specie++){
1383 if (isValidBeta[specie]){
1384 ((TH2F*)fHlistTRD->FindObject(Form("hExpTime%sVsP%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fP, tofps-fTrkExpTimes[specie]);
1385 ((TH2F*)fHlistTRD->FindObject(Form("hTOFpidSigma%s%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fPt, (tofps-fTrkExpTimes[specie])/fSigmaSpecie[specie]);
1386 ((TH2F*)fHlistTRD->FindObject(Form("hExpTime%sT0SubVsP%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fP,tofps-fTrkExpTimes[specie]-timeZeroTOF);
1387 ((TH2F*)fHlistTRD->FindObject(Form("hExpTime%sVsOutPhi%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,tofps-fTrkExpTimes[specie]-timeZeroTOF);
1389 }// end check on beta
1393 //fill histos for pion only
1394 ((TH2F*)fHlistPID->FindObject(Form("hExpTimePiVsStrip%s_%s",suffix.Data(),cLabel.Data())))->Fill((Int_t)GetStripIndex(volId),tofps-fTrkExpTimes[AliPID::kPion]);//ps
1395 ((TH1F*)fHlistPID->FindObject(Form("hExpTimePi%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofps-fTrkExpTimes[AliPID::kPion]);//ps
1396 if (ComputeTimeZeroByTOF1GeV() && (fPt>0.95) && (fPt<1.05) ){
1397 ((TH2F*)fHlistPID->FindObject(Form("hExpTimePiT0Sub1GeV%s_%s",suffix.Data(),cLabel.Data())))->Fill(fMyTimeZeroTOFtracks,tofps-fMyTimeZeroTOF-fTrkExpTimes[AliPID::kPion]);
1399 //fill sigmas and deltas for each specie
1400 for (Int_t specie = AliPID::kPion; specie <= AliPID::kProton; specie++){
1401 if (isValidBeta[specie]){
1402 ((TH2F*)fHlistPID->FindObject(Form("hExpTime%sVsP%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fP, tofps-fTrkExpTimes[specie]);
1403 ((TH2F*)fHlistPID->FindObject(Form("hTOFpidSigma%s%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fPt, (tofps-fTrkExpTimes[specie])/fSigmaSpecie[specie]);
1404 ((TH2F*)fHlistPID->FindObject(Form("hExpTime%sT0SubVsP%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fP,tofps-fTrkExpTimes[specie]-timeZeroTOF);
1405 ((TH2F*)fHlistPID->FindObject(Form("hExpTime%sVsOutPhi%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,tofps-fTrkExpTimes[specie]-timeZeroTOF);
1406 }// end check on beta
1411 //re-set response kFILL_T0 to check post-alignment wih OADB
1412 fESDpid->SetTOFResponse(fESD,AliESDpid::kFILL_T0);//(fill_t0, tof_t0, t0_t0, best_t0)
1413 Float_t startTimeFill=fESDpid->GetTOFResponse().GetStartTime(fP); //timeZero for bin pT>10GeV/c
1414 if (suffix.Contains("Trd"))
1415 ((TH1F*)fHlistTRD->FindObject(Form("hExpTimePiFillSub%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofps-fTrkExpTimes[AliPID::kPion]-startTimeFill);//ps
1417 ((TH1F*)fHlistPID->FindObject(Form("hExpTimePiFillSub%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofps-fTrkExpTimes[AliPID::kPion]-startTimeFill);//ps
1419 // if (fEnableAdvancedCheck && (fPt<1.)) {
1420 // Double_t pos[3]={0.,0.,0.};
1421 // track->GetXYZAt(378.,5.,pos);
1422 // if ((pos[0]==0.)&&(pos[1]==0.)&&(pos[2]==0.))continue;
1424 // Double_t phiTOF=TMath::ATan2(pos[1],pos[0])*TMath::RadToDeg();
1425 // if (phiTOF<0) phiTOF+= (2*TMath::Pi()*TMath::RadToDeg());
1427 // //fill t-texp vs phi@TOF
1428 // if ((phiOuterTPC<=75) || ((phiOuterTPC>=125)&&(phiOuterTPC<=235)) || (phiOuterTPC>=305) ) { //TRD sectors 2012
1429 // if ( ((phiOuterTPC>=85)&&(phiOuterTPC<=115)) || ((phiOuterTPC>=245)&&(phiOuterTPC<=295)) ) {//no TRD sectors 2012
1433 //----------------------------------------------------------------------------------
1434 void AliAnalysisTaskTOFqaID::FillStartTimeHisto(TString suffix)
1436 //fill start time histo
1438 AliError("Invalid event object");
1441 // info from V0 detector QA
1442 AliESDVZERO * vzero = fESD->GetVZEROData();
1443 Float_t V0Atime = vzero->GetV0ATime();
1444 Float_t V0Ctime = vzero->GetV0CTime();
1445 ((TH2F*)fHlistTimeZero->FindObject(Form("hEventV0MeanVsVtx%s",suffix.Data())))->Fill((V0Atime-V0Ctime)*0.5,(V0Atime+V0Ctime)*0.5);
1447 // info from T0 detector QA
1448 for (Int_t j=0;j<3;j++){
1449 fT0[j]= (Float_t) fESD->GetT0TOF(j);//ps
1450 if (fT0[j]>90000.) fT0[j]=99999.;//fix old default values to the new one
1453 Float_t t0cut = 90000.;
1454 //Float_t t0cut =3 * t0spread; //use this cut to check t0 used in tof response
1455 // if(t0cut < 500) t0cut = 500;
1457 if(TMath::Abs(fT0[1]) < t0cut && TMath::Abs(fT0[2]) < t0cut ) {
1458 //&& TMath::Abs(fT0[2]-fT0[1]) < 500) //add this condition to check t0 used in tof response
1459 ((TH1F*)fHlistTimeZero->FindObject(Form("hT0DetRes%s",suffix.Data())))->Fill((fT0[2]-fT0[1])*0.5);
1460 ((TH1F*)fHlistTimeZero->FindObject(Form("hT0AC%s",suffix.Data())))->Fill(fT0[0]);
1461 ((TH2F*)fHlistTimeZero->FindObject(Form("hEventT0MeanVsVtx%s",suffix.Data())))->Fill( ((fT0[2]-fT0[1])*0.5e-3), ((fT0[2]+fT0[1])*0.5e-3) );
1463 if(TMath::Abs(fT0[1]) < t0cut){
1464 ((TH1F*)fHlistTimeZero->FindObject(Form("hT0A%s",suffix.Data())))->Fill(fT0[1]);
1466 if(TMath::Abs(fT0[2]) < t0cut){
1467 ((TH1F*)fHlistTimeZero->FindObject(Form("hT0C%s",suffix.Data())))->Fill(fT0[2]);
1470 // event timeZero QA via AliESDpid::SetTOFResponse()
1471 Double_t timeZero[4]={99999.,99999.,99999.,99999.};
1472 Double_t timeZeroRes[4]={99999.,99999.,99999.,99999.};
1474 TString timeZeroHisto[4]={"hT0fill","hT0TOF","hT0T0","hT0best"};
1475 TString timeZeroHistoRes[4]={"hT0fillRes","hT0TOFRes","hT0T0Res","hT0bestRes"};
1476 for (Int_t j=0;j<4;j++){
1477 timeZeroHisto[j].Append(suffix.Data());
1478 timeZeroHistoRes[j].Append(suffix.Data());
1479 fESDpid->SetTOFResponse(fESD, (AliESDpid::EStartTimeType_t) j);//(fill_t0, tof_t0, t0_t0, best_t0)
1480 timeZero[j]=fESDpid->GetTOFResponse().GetStartTime(10.); //timeZero for bin pT>10GeV/c
1481 timeZeroRes[j]=fESDpid->GetTOFResponse().GetStartTimeRes(10.); //timeZero for bin pT>10GeV/c
1482 ((TH1F*)(fHlistTimeZero->FindObject(timeZeroHisto[j].Data())))->Fill(timeZero[j]);
1483 ((TH1F*)(fHlistTimeZero->FindObject(timeZeroHistoRes[j].Data())))->Fill(timeZeroRes[j]);
1485 ((TH2F*)fHlistTimeZero->FindObject("hT0TOFvsNtrk"))->Fill(fNTOFtracks[0],timeZero[AliESDpid::kTOF_T0]);
1487 //response set to best_t0 by previous loop
1488 FillStartTimeMaskHisto(suffix.Data());
1492 //----------------------------------------------------------------------------------
1493 void AliAnalysisTaskTOFqaID::FillTrdHisto(AliESDtrack * track, Int_t charge)
1495 //fill histograms for TRD/noTRD
1497 AliError("Invalid track object");
1501 if (IsInTRD(track)){
1502 FillPrimaryTrkHisto(charge,"_Trd");
1503 if (IsTPCTOFMatched(track)) {
1504 FillMatchedTrkHisto(charge,"_Trd");
1505 FillPidHisto(track,charge, "_Trd");
1508 FillPrimaryTrkHisto(charge,"_noTrd");
1509 if (IsTPCTOFMatched(track)) {
1510 FillMatchedTrkHisto(charge,"_noTrd");
1511 FillPidHisto(track, charge, "_noTrd");
1516 //----------------------------------------------------------------------------------
1517 void AliAnalysisTaskTOFqaID::FillTofTrgHisto(TString suffix)
1519 //fills histo with trigger info
1520 if (!fHlistTrigger){
1521 AliError("Invalid TOF trigger list");
1525 AliWarning("Invalid AliTOFHeader object - cannot fill trg histo");
1529 Int_t nPad = fTOFHeader->GetNumberOfTOFclusters(); //all fired readout pads
1530 Int_t nTrgPad = fTOFHeader->GetNumberOfTOFtrgPads();// fired readout pads in the trigger window
1531 Int_t nMaxiPad = fTOFHeader->GetNumberOfTOFmaxipad(); //fired maxipads
1533 // update histo with fired macropads
1534 AliTOFTriggerMask *trgMask = fTOFHeader->GetTriggerMask();
1535 for(Int_t j=0;j<72;j++){
1536 for(Int_t i=22;i>=0;i--){
1537 if(trgMask->IsON(j,i))
1538 ((TH1I*)fHlistTrigger->FindObject(Form("hTrgMap%s",suffix.Data())))->Fill(j+1,i+1);
1541 ((TH1I*)fHlistTrigger->FindObject(Form("hFiredMaxipad%s",suffix.Data())))->Fill(nMaxiPad);
1542 ((TH1I*)fHlistTrigger->FindObject(Form("hFiredReadoutPad%s",suffix.Data())))->Fill(nPad);
1543 ((TH1I*)fHlistTrigger->FindObject(Form("hFiredReadoutTrgPad%s",suffix.Data())))->Fill(nTrgPad);
1544 ((TH2I*)fHlistTrigger->FindObject(Form("hFiredMaxipadVsTrgPad%s",suffix.Data())))->Fill(nTrgPad,nMaxiPad);