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 fExpTimeBinWidth(24.4),
49 fExpTimeRangeMin(-25010.),
50 fExpTimeRangeMax(25010.),
51 fExpTimeSmallRangeMin(-5002.),
52 fExpTimeSmallRangeMax(5002.),
54 fnExpTimeSmallBins(1),
56 fMyTimeZeroTOFsigma(1e20),
57 fMyTimeZeroTOFtracks(-1),
66 fMatchingMomCut(1e10),
74 // Default constructor
76 for (Int_t j=0;j<3;j++ ) {
86 //________________________________________________________________________
87 AliAnalysisTaskTOFqaID::AliAnalysisTaskTOFqaID(const char *name) :
88 AliAnalysisTaskSE(name),
94 fESDpid(new AliESDpid()),
96 fEnableAdvancedCheck(kFALSE),
97 fExpTimeBinWidth(24.4),
98 fExpTimeRangeMin(-25010.),
99 fExpTimeRangeMax(25010.),
100 fExpTimeSmallRangeMin(-5002.),
101 fExpTimeSmallRangeMax(5002.),
103 fnExpTimeSmallBins(1),
104 fMyTimeZeroTOF(1e20),
105 fMyTimeZeroTOFsigma(1e20),
106 fMyTimeZeroTOFtracks(-1),
115 fMatchingMomCut(1.0),
124 // Define input and output slots here
125 Info("AliAnalysisTaskTOFqaID","Calling Constructor");
127 for (Int_t j=0;j<5;j++ ) {
136 // Input slot #0 works with a TChain
137 DefineInput(0, TChain::Class());
139 // Output slot #0 writes into a TH1 container
140 // Output slot #1 writes into a user defined container
141 DefineOutput(1, TList::Class());
142 DefineOutput(2, TList::Class());
143 DefineOutput(3, TList::Class());
144 DefineOutput(4, TList::Class());
145 DefineOutput(5, TList::Class());
149 //________________________________________________________________________
150 AliAnalysisTaskTOFqaID::AliAnalysisTaskTOFqaID(const AliAnalysisTaskTOFqaID& copy)
151 : AliAnalysisTaskSE(),
152 fRunNumber(copy.fRunNumber),
154 fMCevent(copy.fMCevent),
155 fTrackFilter(copy.fTrackFilter),
156 fVertex(copy.fVertex),
157 fESDpid(copy.fESDpid),
158 fTOFHeader(copy.fTOFHeader),
159 fEnableAdvancedCheck(copy.fEnableAdvancedCheck),
160 fExpTimeBinWidth(copy.fExpTimeBinWidth),
161 fExpTimeRangeMin(copy.fExpTimeRangeMin),
162 fExpTimeRangeMax(copy.fExpTimeRangeMax),
163 fExpTimeSmallRangeMin(copy.fExpTimeSmallRangeMin),
164 fExpTimeSmallRangeMax(copy.fExpTimeSmallRangeMax),
165 fnExpTimeBins(copy.fnExpTimeBins),
166 fnExpTimeSmallBins(copy.fnExpTimeSmallBins),
167 fMyTimeZeroTOF(copy.fMyTimeZeroTOF),
168 fMyTimeZeroTOFsigma(copy.fMyTimeZeroTOFsigma),
169 fMyTimeZeroTOFtracks(copy.fMyTimeZeroTOFtracks),
171 fSelectedPdg(copy.fSelectedPdg),
176 fTPCOuterPhi(copy.fTPCOuterPhi),
178 fMatchingMomCut(copy.fMatchingMomCut),
181 fHlistTimeZero(copy.fHlistTimeZero),
182 fHlistPID(copy.fHlistPID),
183 fHlistTRD(copy.fHlistTRD),
184 fHlistTrigger(copy.fHlistTrigger)
187 for (Int_t j=0;j<5;j++ ) {
190 fNTOFtracks[j]=copy.fNTOFtracks[j];
192 fSigmaSpecie[j]=copy.fSigmaSpecie[j];
193 fTrkExpTimes[j]=copy.fTrkExpTimes[j];
194 fThExpTimes[j]=copy.fThExpTimes[j];
200 //___________________________________________________________________________
201 AliAnalysisTaskTOFqaID& AliAnalysisTaskTOFqaID::operator=(const AliAnalysisTaskTOFqaID& copy)
204 // Assignment operator
207 AliAnalysisTaskSE::operator=(copy) ;
208 fRunNumber=copy.fRunNumber;
210 fMCevent=copy.fMCevent;
211 fTrackFilter=copy.fTrackFilter;
212 fVertex=copy.fVertex;
213 fESDpid=copy.fESDpid;
214 fTOFHeader=copy.fTOFHeader;
215 fEnableAdvancedCheck=copy.fEnableAdvancedCheck;
216 fExpTimeBinWidth=copy.fExpTimeBinWidth;
217 fExpTimeRangeMin=copy.fExpTimeRangeMin;
218 fExpTimeRangeMax=copy.fExpTimeRangeMax;
219 fExpTimeSmallRangeMin=copy.fExpTimeSmallRangeMin;
220 fExpTimeSmallRangeMax=copy.fExpTimeSmallRangeMax;
221 fnExpTimeBins=copy.fnExpTimeBins;
222 fnExpTimeSmallBins=copy.fnExpTimeSmallBins;
223 fMyTimeZeroTOF=copy.fMyTimeZeroTOF;
224 fMyTimeZeroTOFsigma=copy.fMyTimeZeroTOFsigma;
225 fMyTimeZeroTOFtracks=copy.fMyTimeZeroTOFtracks;
226 for (Int_t j=0;j<5;j++ ) {
229 fNTOFtracks[j]=copy.fNTOFtracks[j];
231 fSigmaSpecie[j]=copy.fSigmaSpecie[j];
232 fTrkExpTimes[j]=copy.fTrkExpTimes[j];
233 fThExpTimes[j]=copy.fThExpTimes[j];
236 fSelectedPdg=copy.fSelectedPdg;
241 fTPCOuterPhi=copy.fTPCOuterPhi;
243 fMatchingMomCut=copy.fMatchingMomCut;
246 fHlistTimeZero=copy.fHlistTimeZero;
247 fHlistPID=copy.fHlistPID;
248 fHlistTRD=copy.fHlistTRD;
249 fHlistTrigger=copy.fHlistTrigger;
254 //___________________________________________________________________________
255 AliAnalysisTaskTOFqaID::~AliAnalysisTaskTOFqaID() {
260 Info("~AliAnalysisTaskTOFqaID","Calling Destructor");
261 if (fESDpid) delete fESDpid;
262 if (fTOFHeader) delete fTOFHeader;
263 if (fVertex) delete fVertex;
264 if (fTrackFilter) delete fTrackFilter;
265 if (AliAnalysisManager::GetAnalysisManager()->IsProofMode()) return;
271 if (fHlistTimeZero) {
272 delete fHlistTimeZero;
284 delete fHlistTrigger;
289 //________________________________________________________________________
290 void AliAnalysisTaskTOFqaID::UserCreateOutputObjects()
293 //Define output objects and histograms
296 //retrieve PID response object
297 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
298 if (!man) AliFatal("Analysis manager needed");
299 AliInputEventHandler *inputHandler=dynamic_cast<AliInputEventHandler*>(man->GetInputEventHandler());
300 if (!inputHandler) AliFatal("Input handler needed");
301 //pid response object
302 fESDpid=(AliESDpid*)inputHandler->GetPIDResponse();
303 if (!fESDpid) AliError("PIDResponse object was not created");
304 // fESDpid->SetOADBPath("$ALICE_ROOT/OADB");
306 Info("CreateOutputObjects","CreateOutputObjects (TList) of task %s", GetName());
309 if (!fHlist) fHlist = new TList();
310 fHlist->SetOwner(kTRUE);
311 fHlist->SetName("base");
313 if (!fHlistTimeZero) fHlistTimeZero = new TList();
314 fHlistTimeZero->SetOwner(kTRUE);
315 fHlistTimeZero->SetName("startTime");
317 if (!fHlistPID) fHlistPID = new TList();
318 fHlistPID->SetOwner(kTRUE);
319 fHlistPID->SetName("pid");
321 if (!fHlistTRD) fHlistTRD = new TList();
322 fHlistTRD->SetOwner(kTRUE);
323 fHlistTRD->SetName("TRD");
325 if (!fHlistTrigger) fHlistTrigger = new TList();
326 fHlistTrigger->SetOwner(kTRUE);
327 fHlistTrigger->SetName("trigger");
329 if (fExpTimeRangeMax<fExpTimeRangeMin) {
330 SetExpTimeHistoRange(-25010.,25010.);
332 fnExpTimeBins = TMath::Nint((fExpTimeRangeMax - fExpTimeRangeMin)/fExpTimeBinWidth);//ps
333 fExpTimeRangeMax=fExpTimeRangeMin+fnExpTimeBins*fExpTimeBinWidth;//ps
335 if (fExpTimeSmallRangeMax<fExpTimeSmallRangeMin) {
336 SetExpTimeHistoSmallRange(-5002.,5002.);
338 fnExpTimeSmallBins = TMath::Nint((fExpTimeSmallRangeMax - fExpTimeSmallRangeMin)/fExpTimeBinWidth);//ps
339 fExpTimeSmallRangeMax=fExpTimeSmallRangeMin+fnExpTimeSmallBins*fExpTimeBinWidth;//ps
341 //add plots for start time QA
342 AddStartTimeHisto(fHlistTimeZero,"");
344 //add plots for base TO quantities
345 AddTofBaseHisto(fHlist, 1, "");
346 AddTofBaseHisto(fHlist, -1, "");
348 //add plots for matching efficiency
349 AddMatchingEffHisto(fHlist, 1, "");
350 AddMatchingEffHisto(fHlist, -1, "");
352 //add plots for PID checks
353 AddPidHisto(fHlistPID, 1, "");
354 AddPidHisto(fHlistPID, -1, "");
357 if (fEnableAdvancedCheck) {
362 PostData(2, fHlistTimeZero);
363 PostData(3, fHlistPID);
364 PostData(4, fHlistTRD);
365 PostData(5, fHlistTrigger);
367 //________________________________________________________________________
368 void AliAnalysisTaskTOFqaID::UserExec(Option_t *)
370 /* Main - executed for each event.
371 It extracts event information and track information after selecting
372 primary tracks via standard cuts. */
374 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
376 AliError("ERROR: Could not get ESDInputHandler");
379 fESD = (AliESDEvent*) esdH->GetEvent();
383 fESD=(AliESDEvent*)InputEvent();
385 Printf("ERROR: fESD not available");
390 Printf("ERROR: fESDpid not available");
394 //retrieve default start time type from PIDresponse
395 AliPIDResponse::EStartTimeType_t startTimeMethodDefault = AliPIDResponse::kBest_T0;
396 if (fESDpid->GetTOFPIDParams()) { // during reconstruction OADB not yet available
397 startTimeMethodDefault = ((AliTOFPIDParams *)fESDpid->GetTOFPIDParams())->GetStartTimeMethod();
400 //access MC event handler for MC truth information
402 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
404 AliError("ERROR: Could not get MCeventHandler");
407 fMCevent = (AliMCEvent *) mcH->MCEvent();
409 AliError("Trying to retrieve an invalid MC event.");
416 Int_t runNb = fESD->GetRunNumber();
417 if (runNb>0) fRunNumber = runNb;
419 //reset matched track counters
420 for (Int_t j=0;j<3;j++){fNTOFtracks[j]=0;}
422 //Get vertex info and apply vertex cut
423 if (!IsEventSelected(fESD)) return;
425 //set response tof_t0 for all other checks
426 fESDpid->SetTOFResponse(fESD,AliESDpid::kTOF_T0);//(fill_t0, tof_t0, t0_t0, best_t0)
428 Printf("Momentum cut for eta and phi distributions set: Pt>%3.2f", fMatchingMomCut);
430 // loop over ESD tracks
431 for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
432 AliESDtrack* track = fESD->GetTrack(iTracks);
434 Printf("ERROR: Could not receive track %d", iTracks);
438 //primary tracks selection: kTPCrefit and std cuts
440 if(!fTrackFilter->IsSelected(track)) continue;
442 Printf("No track filter found, skipping the track loop");
446 //select specie if MC
448 (!SelectMCspecies(fMCevent, track))) {
449 AliDebug(4, Form("MC tracks selection: Track=%i label=%i Not Accepted", iTracks, track->GetLabel()));
453 //apply cut for eta acceptance
455 if (TMath::Abs(fEta)>0.8) continue;
457 //get other track variables
460 fPhi = track->Phi()*TMath::RadToDeg();
461 fTPCOuterPhi = GetPhiAtTPCouterRadius(track);
462 fL = track->GetIntegratedLength();
463 track->GetIntegratedTimes(fTrkExpTimes);
465 Int_t charge = track->Charge();
467 FillPrimaryTrkHisto(charge,"");
468 if (IsTPCTOFMatched(track)) {
469 fTof=track->GetTOFsignal()*1E-3;//in ps
470 //increment track counters
472 if (charge>0) fNTOFtracks[1]++;
473 if (charge<0) fNTOFtracks[2]++;
475 FillTofBaseHisto(track, charge,"");
476 FillMatchedTrkHisto(charge,"");
477 FillPidHisto(track, charge, "");
479 if (fEnableAdvancedCheck) FillTrdHisto(track, charge);
480 }//end loop on tracks
482 //fill time zero histos
483 FillStartTimeHisto("");
484 ((TH1F*)fHlist->FindObject("hTOFmulti_pos"))->Fill(fNTOFtracks[1]);
485 ((TH1F*)fHlist->FindObject("hTOFmulti_neg"))->Fill(fNTOFtracks[2]);
487 //fill TOF trg histos from infos in TOF header
488 fTOFHeader=(AliTOFHeader*)fESD->GetTOFHeader();
490 AliWarning("Cannot get TOF header: no TOF trigger info available");
495 //restore value set by AliPIDResponseTask for subsequent wagons
496 fESDpid->SetTOFResponse(fESD,startTimeMethodDefault);
499 PostData(2, fHlistTimeZero);
500 PostData(3, fHlistPID);
501 PostData(4, fHlistTRD);
502 PostData(5, fHlistTrigger);
506 //________________________________________________________________________
507 void AliAnalysisTaskTOFqaID::Terminate(Option_t *)
509 //check on output validity
510 fHlist = dynamic_cast<TList*> (GetOutputData(1));
512 Printf("ERROR: lists not available");
516 // TH1D*hDummy = ((TH1D*)fHlist->FindObject("hTOFmatchedESDPt"));
517 // TH1D*hMatchingEff = (TH1D*) hDummy->Clone("hMatchingEff");
518 // hMatchingEff->SetTitle("Matching efficiency");
519 // hMatchingEff->Divide((TH1F*) fHlist->FindObject("hESDprimaryTrackPt"));
520 // TCanvas *c1 = new TCanvas("AliAnalysisTaskTOFqaID","Matching vs Pt",10,10,510,510);
521 // c1->cd(1)->SetLogy();
522 // hMatchingEff->DrawCopy("E");
523 // fHlist->AddLast(hMatchingEff);
524 ComputeMatchingEfficiency(fHlist, "pt");
525 ComputeMatchingEfficiency(fHlist, "eta");
526 ComputeMatchingEfficiency(fHlist, "phi");
531 //---------------------------------------------------------------
532 Int_t AliAnalysisTaskTOFqaID::GetStripIndex(const Int_t * in)
534 /* return tof strip index between 0 and 91 */
536 Int_t nStripA = AliTOFGeometry::NStripA();
537 Int_t nStripB = AliTOFGeometry::NStripB();
538 Int_t nStripC = AliTOFGeometry::NStripC();
540 Int_t iplate = in[1];
541 Int_t istrip = in[2];
543 Int_t stripOffset = 0;
549 stripOffset = nStripC;
552 stripOffset = nStripC+nStripB;
555 stripOffset = nStripC+nStripB+nStripA;
558 stripOffset = nStripC+nStripB+nStripA+nStripB;
565 if (stripOffset<0 || stripOffset>92) return -1;
567 return (stripOffset+istrip);
570 //-----------------------------------------------------------------
571 Double_t AliAnalysisTaskTOFqaID::GetPhiAtTPCouterRadius(AliESDtrack * track)
573 //get track phi at TPC outer radius
574 if (!track) return 1e10;
575 Double_t tpcoutcoord[3]={0.,0.,0.};
576 track->GetOuterXYZ(tpcoutcoord);
577 Double_t phiOuterTPC=TMath::ATan2(tpcoutcoord[1],tpcoutcoord[0])*TMath::RadToDeg();
579 phiOuterTPC+= (2*TMath::Pi()*TMath::RadToDeg());
582 //-----------------------------------------------------------------
583 Bool_t AliAnalysisTaskTOFqaID::IsEventSelected(AliESDEvent * event)
585 //select event based on primary vertex
587 AliError("Invalid ESD event");
590 fVertex = (AliESDVertex*) event->GetPrimaryVertexTracks();
591 if(fVertex->GetNContributors()<1) {
593 fVertex = (AliESDVertex*) event->GetPrimaryVertexSPD();
594 if(fVertex->GetNContributors()<1) fVertex = 0x0;
596 if (!fVertex) return kFALSE;
597 if (TMath::Abs(fVertex->GetZv())<10.0) return kTRUE;
601 //-----------------------------------------------------------------
602 Bool_t AliAnalysisTaskTOFqaID::IsTPCTOFMatched(AliESDtrack * track)
604 //defines TOF matching
606 AliWarning("Invalid track object");
610 if ( (track->IsOn(AliESDtrack::kTOFout)) &&
611 (track->IsOn(AliESDtrack::kTIME)) &&
612 (track->IsOn(AliESDtrack::kTPCout)) )
617 //-----------------------------------------------------------------
618 Bool_t AliAnalysisTaskTOFqaID::IsInTRD(AliESDtrack * track)
620 //defines cut to select particles in/out TRD
622 AliWarning("Invalid track object");
626 if ( track->IsOn(AliESDtrack::kTPCout)
627 && track->IsOn(AliESDtrack::kTRDout) )
632 //-----------------------------------------------------------------
633 void AliAnalysisTaskTOFqaID::FillStartTimeMaskHisto(TString suffix)
635 /* set pid response to use best_T0 and for each
636 accepted track fills the histogram with the
640 //set response best_t0
641 //fESDpid->SetTOFResponse(fESD,AliESDpid::kBest_T0);
643 for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
644 AliESDtrack* track = fESD->GetTrack(iTracks);
646 Printf("ERROR: Could not receive track %d", iTracks);
649 //primary tracks selection: kTPCrefit and std cuts
651 if(!fTrackFilter->IsSelected(track)) continue;
654 Printf("No track filter found, skipping the track loop");
657 if (TMath::Abs(track->Eta())>0.8) continue; //cut for acceptance
659 Int_t StartTimeBit = fESDpid->GetTOFResponse().GetStartTimeMask(track->P());
660 ((TH2F*)fHlistTimeZero->FindObject(Form("hStartTimeMask%s",suffix.Data())))->Fill(track->P(),StartTimeBit);
662 //matched tracks selection: kTOFout and kTIME
663 if ( (track->IsOn(AliESDtrack::kTOFout)) &&
664 (track->IsOn(AliESDtrack::kTIME)) &&
665 (track->IsOn(AliESDtrack::kTPCout)) ) {
666 ((TH2F*)fHlistTimeZero->FindObject(Form("hStartTimeMaskMatched%s",suffix.Data())))->Fill(track->P(),StartTimeBit);
672 //----------------------------------------------------
673 Bool_t AliAnalysisTaskTOFqaID::ComputeTimeZeroByTOF1GeV()
675 /* compute T0-TOF for tracks within momentum range [0.95, 1.05] */
677 AliTOFT0v1 *fTOFT0v1 = new AliTOFT0v1(fESDpid); // TOF-T0 v1
678 fTOFT0v1->Init(fESD);
679 fTOFT0v1->DefineT0("all", 0.95, 1.05);
680 fMyTimeZeroTOF = -1000. * fTOFT0v1->GetResult(0);
681 fMyTimeZeroTOFsigma = 1000. * fTOFT0v1->GetResult(1);
682 fMyTimeZeroTOFtracks = fTOFT0v1->GetResult(3);
683 Bool_t hasTimeZeroTOF = kFALSE;
684 /* check T0-TOF sigma */
685 if (fMyTimeZeroTOFsigma < 250.)
686 hasTimeZeroTOF = kTRUE;
687 return hasTimeZeroTOF;
690 //------------------------------------------------------
691 TString AliAnalysisTaskTOFqaID::GetSpeciesName(Int_t absPdgCode)
693 //returns name of selected specie
718 //-----------------------------------------------
719 Bool_t AliAnalysisTaskTOFqaID::SelectMCspecies(AliMCEvent * ev, AliESDtrack * track)
722 //Retrieves particle true ID from MC and selects the desired species
724 if ((!ev) || (!track)) {
725 AliError("SelectMCspecies - Invalid object set as argument");
729 if (fSelectedPdg==0) return kTRUE; //if fSelectedPdg==0, no species selection is applied
731 Long_t label = track->GetLabel();
732 if (label<0) return kFALSE;
734 // get number of particles
735 Long_t nMC = ev->GetNumberOfTracks();
736 // if label too large --> failed
738 AliWarning(Form("Stack overflow: track label = %li -- stack maximum = %li", label, nMC));
742 AliMCParticle *mcPart = (AliMCParticle *)ev->GetTrack(label);
743 if (!mcPart) {// if particle = NULL --> failed
744 AliWarning(Form("Stack discontinuity: label %li refers to a NULL object", label));
748 Int_t pdgCode = mcPart->PdgCode();
749 if (!(TMath::Abs(pdgCode)==fSelectedPdg))
751 else //Printf("Found particle with selected pdg code = %i", pdgCode);
755 //----------------------------------------------------------------------------------
756 Bool_t AliAnalysisTaskTOFqaID::ComputeMatchingEfficiency(TList* list, TString variable)
758 //computes matching efficiency from previously filled histos
759 // to be called in terminate function
760 if (!list) return kFALSE;
762 TString matchedName, primaryName, xAxisTitle;
763 if (variable.Contains("pt")) {
764 matchedName = "hTOFmatchedESDPt";
765 primaryName = "hESDprimaryTrackPt";
766 xAxisTitle = "p_{T} (GeV/c)";
768 if (variable.Contains("eta")) {
769 matchedName = "hTOFmatchedESDeta";
770 primaryName = "hTOFprimaryESDeta";
773 if (variable.Contains("phi")) {
774 matchedName = "hTOFmatchedESDphi";
775 primaryName = "hTOFprimaryESDphi";
776 xAxisTitle = "#phi_vtx (deg)";
779 TH1D*hDummy = ((TH1D*)list->FindObject(matchedName.Data()));
780 if (!hDummy) return 0;
782 TH1D*hMatchingEff = (TH1D*) hDummy->Clone("hMatchingEff");
783 hMatchingEff->SetNameTitle(Form("hMatchingEff_%s", variable.Data()),Form("Matching efficiency vs %s", variable.Data()));
784 hMatchingEff->Divide((TH1F*) list->FindObject(primaryName.Data()));
785 hMatchingEff->GetXaxis()->SetTitle(xAxisTitle.Data());
786 hMatchingEff->GetYaxis()->SetRangeUser(0.0,1.0);
787 hMatchingEff->GetYaxis()->SetTitle("#epsilon_{match}");
788 list->AddLast(hMatchingEff);
791 //----------------------------------------------------------------------------------
792 void AliAnalysisTaskTOFqaID::HistogramMakeUp(TH1* hist, Color_t color, Int_t markerStyle, TString drawOpt, TString newName, TString newTitle, TString xTitle, TString yTitle)
794 //set histogram style and axes style at once
796 if (!newName.IsNull()) hist->SetName(newName.Data());
797 if (!newTitle.IsNull()) hist->SetTitle(newTitle.Data());
798 if (!xTitle.IsNull()) hist->GetXaxis()->SetTitle(xTitle.Data());
799 if (!yTitle.IsNull()) hist->GetYaxis()->SetTitle(yTitle.Data());
800 hist->SetLineColor(color);
801 hist->SetMarkerColor(color);
802 hist->SetMarkerStyle(markerStyle);
803 hist->SetMarkerSize(0.7);
804 hist->SetDrawOption(drawOpt.Data());
809 //----------------------------------------------------------------------------------
810 void AliAnalysisTaskTOFqaID::AddTofBaseHisto(TList *list, Int_t charge, TString suffix)
812 //Creates histograms for monitoring TOF signal, time alignement and matching-related quantities
814 AliError("Invalid list passed as argument.");
819 if (charge<0) cLabel.Form("neg");
821 if (charge>0) cLabel.Form("pos");
822 else cLabel.Form("all");
824 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);
825 HistogramMakeUp(hTOFmulti, ((charge>0)? kRed : kBlue+2), 1, "E1", "","", "N","events");
826 list->AddLast(hTOFmulti);
828 TH1F* hTOFtime = new TH1F(Form("hTime%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk TOF signal", cLabel.Data()), 250, 0., 610. ) ;
829 HistogramMakeUp(hTOFtime,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "t (ns)","tracks");
830 list->AddLast(hTOFtime);
832 TH1F* hTOFrawTime = new TH1F(Form("hRawTime%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk TOF raw signal", cLabel.Data()), 250, 0., 610. ) ;
833 HistogramMakeUp(hTOFrawTime,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "t_{raw} (ns)","tracks");
834 list->AddLast(hTOFrawTime);
836 TH1F* hTOFtot = new TH1F(Form("hTot%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk ToT", cLabel.Data()), 50, 0., 50. ) ;
837 HistogramMakeUp(hTOFtot,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "ToT (ns)","tracks");
838 list->AddLast(hTOFtot);
840 TH1F* hMatchedL = new TH1F(Form("hMatchedL%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk lenght", cLabel.Data()), 1200, -400., 800) ;
841 HistogramMakeUp(hMatchedL,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "L (cm)","tracks");
842 list->AddLast(hMatchedL);
844 TH2F* hMatchedDxVsPt = new TH2F(Form("hMatchedDxVsPt%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk dx vs.p_{T}", cLabel.Data()), 1000,0.,10.,200, -10., 10.) ;
845 HistogramMakeUp(hMatchedDxVsPt,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "GeV/c (p_{T})","dx (cm)");
846 list->AddLast(hMatchedDxVsPt);
848 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.) ;
849 HistogramMakeUp(hMatchedDzVsStrip,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "strip","dz (cm)");
850 list->AddLast(hMatchedDzVsStrip) ;
852 TProfile *hMatchedDxVsCh = new TProfile(Form("hMatchedDxVsCh%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk dx vs. channel", cLabel.Data()), 157248., 0.,157248.);
853 HistogramMakeUp(hMatchedDxVsCh,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "channel","dx (cm)");
854 list->AddLast(hMatchedDxVsCh);
856 TProfile *hMatchedDzVsCh = new TProfile(Form("hMatchedDzVsCh%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk dz vs. channel", cLabel.Data()), 157248., 0.,157248.);
857 HistogramMakeUp(hMatchedDzVsCh,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "channel","dz (cm)");
858 list->AddLast(hMatchedDzVsCh);
863 //----------------------------------------------------------------------------------
864 void AliAnalysisTaskTOFqaID::AddMatchingEffHisto(TList *list, Int_t charge, TString suffix)
867 AliError("Invalid list passed as argument.");
871 if (charge<0) cLabel.Form("neg"); else if (charge>0) cLabel.Form("pos"); else cLabel.Form("all");
873 TH1F* hMatchedP = new TH1F(Form("hMatchedP%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p", cLabel.Data()), 1000,0.,10.) ;
874 HistogramMakeUp(hMatchedP,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "L (cm)","tracks");
875 list->AddLast(hMatchedP) ;
877 TH1F* hMatchedPt = new TH1F(Form("hMatchedPt%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p_{T}", cLabel.Data()), 1000,0.,10.) ;
878 HistogramMakeUp(hMatchedPt,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "p_{T} (GeV/c)","tracks");
879 list->AddLast(hMatchedPt) ;
881 TH1F* hMatchedEta = new TH1F(Form("hMatchedEta%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #eta", cLabel.Data()), 200, -1., 1.) ;
882 HistogramMakeUp(hMatchedEta,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "#eta","tracks");
883 list->AddLast(hMatchedEta) ;
885 TH1F* hMatchedPhi = new TH1F(Form("hMatchedPhi%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #phi_{vtx}", cLabel.Data()), 72, 0., 360.) ;
886 HistogramMakeUp(hMatchedPhi,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "#phi_{vtx} (deg)","tracks");
887 list->AddLast(hMatchedPhi) ;
889 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, 1000,0.,10.) ;
890 HistogramMakeUp(hMatchedPtVsOutPhi,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "#phi_{TPC out} (deg)","p_{T} (GeV/c)");
891 list->AddLast(hMatchedPtVsOutPhi) ;
893 TH1F* hPrimaryP = new TH1F(Form("hPrimaryP%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p", cLabel.Data()), 1000,0.,10.) ;
894 HistogramMakeUp(hPrimaryP,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "L (cm)","tracks");
895 list->AddLast(hPrimaryP) ;
897 TH1F* hPrimaryPt = new TH1F(Form("hPrimaryPt%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p_{T}", cLabel.Data()), 1000,0.,10.) ;
898 HistogramMakeUp(hPrimaryPt,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "p_{T} (GeV/c)","tracks");
899 list->AddLast(hPrimaryPt) ;
901 TH1F* hPrimaryEta = new TH1F(Form("hPrimaryEta%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #eta", cLabel.Data()), 200, -1., 1.) ;
902 HistogramMakeUp(hPrimaryEta,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "#eta","tracks");
903 list->AddLast(hPrimaryEta) ;
905 TH1F* hPrimaryPhi = new TH1F(Form("hPrimaryPhi%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #phi_{vtx}", cLabel.Data()), 72, 0., 360.) ;
906 HistogramMakeUp(hPrimaryPhi,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "#phi_{vtx} (deg)","tracks");
907 list->AddLast(hPrimaryPhi) ;
909 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, 1000,0.,10.) ;
910 HistogramMakeUp(hPrimaryPtVsOutPhi,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "#phi_{TPC out} (deg)","p_{T} (GeV/c)");
911 list->AddLast(hPrimaryPtVsOutPhi) ;
915 //----------------------------------------------------------------------------------
916 void AliAnalysisTaskTOFqaID::AddPidHisto(TList *list, Int_t charge, TString suffix)
918 //Creates histograms for monitoring TOF PID
920 AliError("Invalid list passed as argument.");
924 if (charge<0) cLabel.Form("neg"); else if (charge>0) cLabel.Form("pos"); else cLabel.Form("all");
926 TH2F* hMatchedBetaVsP = new TH2F(Form("hMatchedBetaVsP%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #beta vs. p", cLabel.Data()), 1000, 0.0, 10.0, 150, 0., 1.5) ;
927 HistogramMakeUp(hMatchedBetaVsP,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "p (GeV/c)","#beta");
928 list->AddLast(hMatchedBetaVsP);
930 TH1F* hMatchedMass= new TH1F(Form("hMatchedMass%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched p.le M", cLabel.Data()), 500, 0., 5. );
931 HistogramMakeUp(hMatchedMass,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "M (GeV/c^{2})","entries");
932 list->AddLast(hMatchedMass);
934 TH1F* hMatchedMass2= new TH1F(Form("hMatchedMass2%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched p.le M^{2}", cLabel.Data()), 500, 0., 10. );
935 HistogramMakeUp(hMatchedMass2,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "M^{2} (GeV^{2}/c^{4})","entries");
936 list->AddLast(hMatchedMass2);
938 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) ;
939 HistogramMakeUp(hExpTimePiVsStrip,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "strip (#eta)","t_{TOF}-t_{#pi,exp} [ps]");
940 list->AddLast(hExpTimePiVsStrip);
942 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) ;
943 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}");
944 list->AddLast(hExpTimePiT0Sub1GeV) ;
946 TH1F* hExpTimePiFillSub = new TH1F(Form("hExpTimePiFillSub%s_%s",suffix.Data(),cLabel.Data()), "%s trk t_{TOF}-t_{#pi,exp}-t_{0,fill}; t_{TOF}-t_{#pi,exp} -_{0,fill} [ps];entries", fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
947 list->AddLast(hExpTimePiFillSub) ;
949 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) ;
950 HistogramMakeUp(hExpTimePi,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "t_{TOF}-t_{#pi,exp} [ps]","tracks");
951 list->AddLast(hExpTimePi);
953 TH2F* hExpTimePiVsP = new TH2F(Form("hExpTimePiVsP%s_%s",suffix.Data(),cLabel.Data()),Form("%s matched trk t_{TOF}-t_{#pi,exp}",cLabel.Data()), 1000, 0.0, 10.0, fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
954 HistogramMakeUp(hExpTimePiVsP,kRed+2, 1, "colz", "","", "p (GeV/c)","t_{TOF}-t_{#pi,exp} [ps]");
955 list->AddLast(hExpTimePiVsP);
957 TH2F* hExpTimeKaVsP = new TH2F(Form("hExpTimeKaVsP%s_%s",suffix.Data(),cLabel.Data()),Form("%s matched trk t_{TOF}-t_{K,exp}",cLabel.Data()), 1000, 0.0, 10.0, fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
958 HistogramMakeUp(hExpTimeKaVsP,kBlue+2, 1, "colz", "","", "p (GeV/c)","t_{TOF}-t_{K,exp} [ps]");
959 list->AddLast(hExpTimeKaVsP);
961 TH2F* hExpTimeProVsP = new TH2F(Form("hExpTimeProVsP%s_%s",suffix.Data(),cLabel.Data()),Form("%s matched trk t_{TOF}-t_{p,exp}",cLabel.Data()),1000, 0.0, 10.0, fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
962 HistogramMakeUp(hExpTimeProVsP,kGreen+2, 1, "colz", "","", "p (GeV/c)","t_{TOF}-t_{p,exp} [ps]");
963 list->AddLast(hExpTimeProVsP);
965 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. ) ;
966 HistogramMakeUp(hTOFpidSigmaPi,kRed+2, 1, "colz", "","", "p (GeV/c)","n#sigma_{#pi,exp} [ps]");
967 list->AddLast(hTOFpidSigmaPi) ;
969 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. ) ;
970 HistogramMakeUp(hTOFpidSigmaKa,kBlue+2, 1, "colz", "","", "p (GeV/c)","n#sigma_{K,exp} [ps]");
971 list->AddLast(hTOFpidSigmaKa) ;
973 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. ) ;
974 HistogramMakeUp(hTOFpidSigmaPro,kGreen+2, 1, "colz", "","","p (GeV/c)","n#sigma_{p,exp} [ps]");
975 list->AddLast(hTOFpidSigmaPro);
977 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()), 1000, 0.,10., fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
978 HistogramMakeUp(hExpTimePiT0SubVsP,kRed+2, 1, "colz", "","","p (GeV/c)","t_{TOF}-t_{#pi,exp}-t_{0}^{TOF}");
979 list->AddLast(hExpTimePiT0SubVsP) ;
981 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()), 1000, 0.,10., fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
982 HistogramMakeUp(hExpTimeKaT0SubVsP,kBlue+2, 1, "colz", "","","p (GeV/c)","t_{TOF}-t_{K,exp}-t_{0}^{TOF}");
983 list->AddLast(hExpTimeKaT0SubVsP) ;
985 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()), 1000, 0.,10., fnExpTimeBins, fExpTimeRangeMin, fExpTimeRangeMax) ;
986 HistogramMakeUp(hExpTimeProT0SubVsP,kGreen+2, 1, "colz", "","","p (GeV/c)","t_{TOF}-t_{p,exp}-t_{0}^{TOF}");
987 list->AddLast(hExpTimeProT0SubVsP) ;
989 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) ;
990 HistogramMakeUp(hExpTimePiVsOutPhi,kRed+2, 1, "colz", "","", "#phi_{TPC out} (deg)","t_{TOF}-t_{#pi,exp} [ps]");
991 list->AddLast(hExpTimePiVsOutPhi);
993 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) ;
994 HistogramMakeUp(hExpTimeKaVsOutPhi,kBlue+2, 1, "colz", "","", "#phi_{TPC out} (deg)","t_{TOF}-t_{K,exp} [ps]");
995 list->AddLast(hExpTimeKaVsOutPhi);
997 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) ;
998 HistogramMakeUp(hExpTimeProVsOutPhi,kGreen+2, 1, "colz", "","", "#phi_{TPC out} (deg)","t_{TOF}-t_{p,exp} [ps]");
999 list->AddLast(hExpTimeProVsOutPhi);
1003 //----------------------------------------------------------------------------------
1004 void AliAnalysisTaskTOFqaID::AddStartTimeHisto(TList *list, TString suffix)
1006 //Creates histograms for monitoring T0 signal and start-time related quantities
1008 AliError("Invalid list passed as argument.");
1011 TH1D* hT0AC = new TH1D(Form("hT0AC%s",suffix.Data()), "Event timeZero from T0A&C; t_{0,AC} [ps]; events", 1000, -25000., 25000. ) ;
1012 HistogramMakeUp(hT0AC, kRed+2, 20, "", "","","","");
1013 list->AddLast(hT0AC);
1015 TH1D* hT0A = new TH1D(Form("hT0A%s",suffix.Data()), "Event timeZero from T0A; t_{0,A} [ps]; events", 1000, -25000., 25000. ) ;
1016 HistogramMakeUp(hT0A, kBlue+2, 25, "", "","","","");
1017 list->AddLast(hT0A);
1019 TH1D* hT0C = new TH1D(Form("hT0C%s",suffix.Data()), "Event timeZero from T0C; t_{0,C} [ps]; events", 1000, -25000., 25000. ) ;
1020 HistogramMakeUp(hT0C, kGreen+2, 28, "", "","","","");
1021 list->AddLast(hT0C);
1023 TH1D* hT0DetRes = new TH1D(Form("hT0DetRes%s",suffix.Data()), "T0 detector (T0A-T0C)/2; (T0A-T0C)/2 [ps]; events", 200, -500.,500. ) ;
1024 HistogramMakeUp(hT0DetRes, kMagenta+1, 1, "", "","","","");
1025 list->AddLast(hT0DetRes) ;
1027 TH1F* hT0fill = new TH1F(Form("hT0fill%s",suffix.Data()), "Event timeZero of fill; t_{0,fill} [ps]; events", 1000, -25000., 25000. ) ;
1028 HistogramMakeUp(hT0fill, kOrange+1, 25, "", "","","","");
1029 list->AddLast(hT0fill) ;
1031 TH1F* hT0TOF = new TH1F(Form("hT0TOF%s",suffix.Data()), "Event timeZero estimated by TOF; t0 [ps]; events", 1000, -25000., 25000. ) ;
1032 HistogramMakeUp(hT0TOF, kTeal-5, 21, "", "","","","");
1033 list->AddLast(hT0TOF) ;
1035 TH1F* hT0T0 = new TH1F(Form("hT0T0%s",suffix.Data()), "Best timeZero between AC, A, C; t_{0} [ps]; events", 1000, -25000.,25000. ) ;
1036 HistogramMakeUp(hT0T0, kAzure+7, 26, "", "","","","");
1037 list->AddLast(hT0T0) ;
1039 TH1F* hT0best = new TH1F(Form("hT0best%s",suffix.Data()), "Event timeZero estimated as T0best; t0 [ps]; events", 1000, -25000.,25000. ) ;
1040 HistogramMakeUp(hT0best, kBlack, 20, "", "","","","");
1041 list->AddLast(hT0best) ;
1043 TH1F* hT0fillRes = new TH1F(Form("hT0fillRes%s",suffix.Data()), "Resolution of fillT0; #sigma_{fillT0} [ps];events", 250, 0.,250. ) ;
1044 HistogramMakeUp(hT0fillRes, kOrange+1, 25, "", "","","","");
1045 list->AddLast(hT0fillRes) ;
1047 TH1F* hT0TOFRes = new TH1F(Form("hT0TOFRes%s",suffix.Data()), "Resolution of timeZero from TOF; #sigma_{TOFT0} [ps];events", 250, 0.,250. ) ;
1048 HistogramMakeUp(hT0TOFRes, kTeal-5, 21, "", "","","","");
1049 list->AddLast(hT0TOFRes) ;
1051 TH1F* hT0T0Res = new TH1F(Form("hT0T0Res%s",suffix.Data()), "Resolution of timeZero from T0;#sigma_{T0T0} [ps];events", 250, -0., 250. ) ;
1052 HistogramMakeUp(hT0T0Res, kAzure+7, 26, "", "","","","");
1053 list->AddLast(hT0T0Res) ;
1055 TH1F* hT0bestRes = new TH1F(Form("hT0bestRes%s",suffix.Data()), "Resolution of bestT0; #sigma_{bestT0} [ps];events", 250, 0.,250. ) ;
1056 HistogramMakeUp(hT0bestRes, kBlack, 20, "", "","","","");
1057 list->AddLast(hT0bestRes) ;
1059 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.,1000,-25000.,25000. ) ;
1060 HistogramMakeUp(hT0TOFvsNtrk, kTeal-5, 1, "colz", "","","","");
1061 list->AddLast(hT0TOFvsNtrk) ;
1063 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", 500, -25., 25., 500, -25., 25. ) ;
1064 HistogramMakeUp(hEventT0MeanVsVtx, kBlue+2, 1, "colz", "","","","");
1065 list->AddLast(hEventT0MeanVsVtx) ;
1067 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", 500, -50., 50., 500, -50., 50. ) ;
1068 HistogramMakeUp(hEventV0MeanVsVtx, kBlack, 1, "colz", "","","","");
1069 list->AddLast(hEventV0MeanVsVtx) ;
1071 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.};
1073 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.);
1074 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(1,"fill_t0");
1075 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(2,"tof_t0");
1076 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(3,"T0AC");
1077 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(4,"T0AC & tof_t0");
1078 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(5,"T0A");
1079 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(6,"T0A & tof_t0");
1080 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(7,"T0C");
1081 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(8,"T0C & tof_t0");
1082 HistogramMakeUp(hStartTimeMaskMatched, kRed+2, 1, "colz", "","","","");
1083 list->AddLast(hStartTimeMaskMatched);
1085 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.);
1086 hStartTimeMask->GetYaxis()->SetBinLabel(1,"fill_t0");
1087 hStartTimeMask->GetYaxis()->SetBinLabel(2,"tof_t0");
1088 hStartTimeMask->GetYaxis()->SetBinLabel(3,"T0AC");
1089 hStartTimeMask->GetYaxis()->SetBinLabel(4,"T0AC & tof_t0");
1090 hStartTimeMask->GetYaxis()->SetBinLabel(5,"T0A");
1091 hStartTimeMask->GetYaxis()->SetBinLabel(6,"T0A & tof_t0");
1092 hStartTimeMask->GetYaxis()->SetBinLabel(7,"T0C");
1093 hStartTimeMask->GetYaxis()->SetBinLabel(8,"T0C & tof_t0");
1094 HistogramMakeUp(hStartTimeMask, kRed+2, 1, "colz", "","","","");
1095 list->AddLast(hStartTimeMask);
1099 //----------------------------------------------------------------------------------
1100 void AliAnalysisTaskTOFqaID::AddTrdHisto()
1102 //Creates histograms for monitoring TOF base quantities wrt TRD/no TRD selection
1104 AliError("Invalid TRD list");
1108 AddMatchingEffHisto(fHlistTRD, 1, "_noTrd");
1109 AddMatchingEffHisto(fHlistTRD, -1, "_noTrd");
1110 AddMatchingEffHisto(fHlistTRD, 1, "_Trd");
1111 AddMatchingEffHisto(fHlistTRD, -1, "_Trd");
1113 AddPidHisto(fHlistTRD, 1, "_noTrd");
1114 AddPidHisto(fHlistTRD, -1, "_noTrd");
1115 AddPidHisto(fHlistTRD, 1, "_Trd");
1116 AddPidHisto(fHlistTRD, -1, "_Trd");
1121 //----------------------------------------------------------------------------------
1122 void AliAnalysisTaskTOFqaID::AddTofTrgHisto(TString suffix)
1124 //defines histo with trigger info
1125 if (!fHlistTrigger){
1126 AliError("Invalid TOF trigger list");
1130 TH1I* hFiredMaxipad = new TH1I(Form("hFiredMaxipad%s",suffix.Data()), Form("Fired maxipad per event"), 1584, 0, 1584);
1131 HistogramMakeUp(hFiredMaxipad, kBlue+2, 1, "E1", "","", "N_{maxipad}","events");
1132 fHlistTrigger->AddLast(hFiredMaxipad);
1134 TH1I* hFiredReadoutPad = new TH1I(Form("hFiredReadoutPad%s",suffix.Data()), Form("Fired readout pad per event"), 153000, 0, 153000);
1135 HistogramMakeUp(hFiredReadoutPad, kRed+2, 1, "E1", "","", "N_{pad}","events");
1136 fHlistTrigger->AddLast(hFiredReadoutPad);
1138 TH1I* hFiredReadoutTrgPad = new TH1I(Form("hFiredReadoutTrgPad%s",suffix.Data()), Form("Fired readout pad in trg window"), 153000, 0, 153000);
1139 HistogramMakeUp(hFiredReadoutTrgPad, kBlack, 1, "E1", "","", "N_{pad} in trg window","events");
1140 fHlistTrigger->AddLast(hFiredReadoutTrgPad);
1142 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);
1143 HistogramMakeUp(hFiredMaxipadVsTrgPad, kBlue+2, 1, "colz", "","", "N_{pad} in trg window","N_{maxipad}");
1144 fHlistTrigger->AddLast(hFiredMaxipadVsTrgPad);
1146 TH2I* hTrgMap = new TH2I(Form("hTrgMap%s",suffix.Data()), Form("Map of fired maxipads"), 72, 0, 72, 22, 0, 22);
1147 HistogramMakeUp(hTrgMap, kBlue+2, 1, "colz", "","", "LTM","maxipad");
1148 fHlistTrigger->AddLast(hTrgMap);
1153 //----------------------------------------------------------------------------------
1154 void AliAnalysisTaskTOFqaID::FillTofBaseHisto(AliESDtrack * track, Int_t charge, TString suffix)
1156 //fill histo with TOF base quantities
1159 // Double_t tofTime=track->GetTOFsignal();//in ps
1160 Double_t tofTimeRaw=track->GetTOFsignalRaw();//in ps
1161 Double_t tofToT=track->GetTOFsignalToT(); //in ps
1162 Int_t channel=track->GetTOFCalChannel();
1163 Int_t volId[5]; //(sector, plate,strip,padZ,padX)
1164 AliTOFGeometry::GetVolumeIndices(channel,volId);
1165 TString cLabel; if (charge<0) cLabel.Form("neg"); else if (charge>0) cLabel.Form("pos"); else cLabel.Form("all");
1167 ((TH1F*)fHlist->FindObject(Form("hTime%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTof); //ns
1168 ((TH1F*)fHlist->FindObject(Form("hRawTime%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofTimeRaw*1E-3); //ns
1169 ((TH1F*)fHlist->FindObject(Form("hTot%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofToT);
1170 ((TH1F*)fHlist->FindObject(Form("hMatchedL%s_%s", suffix.Data(), cLabel.Data())))->Fill(fL);
1171 ((TH2F*)fHlist->FindObject(Form("hMatchedDxVsPt%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt,track->GetTOFsignalDx());
1172 ((TH2F*)fHlist->FindObject(Form("hMatchedDzVsStrip%s_%s",suffix.Data(),cLabel.Data())))->Fill((Int_t)GetStripIndex(volId),track->GetTOFsignalDz());
1173 ((TProfile*)fHlist->FindObject(Form("hMatchedDxVsCh%s_%s",suffix.Data(),cLabel.Data())))->Fill(channel,track->GetTOFsignalDx());
1174 ((TProfile*)fHlist->FindObject(Form("hMatchedDzVsCh%s_%s",suffix.Data(),cLabel.Data())))->Fill(channel,track->GetTOFsignalDz());
1178 //----------------------------------------------------------------------------------
1179 void AliAnalysisTaskTOFqaID::FillPrimaryTrkHisto(Int_t charge, TString suffix)
1181 // fill histos with primary tracks info
1182 // => denominator for matching efficiency
1185 if (charge<0) cLabel.Form("neg"); else if (charge>0) cLabel.Form("pos"); else cLabel.Form("all");
1186 if (suffix.Contains("Trd")) {
1187 ((TH1F*)fHlistTRD->FindObject(Form("hPrimaryP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP);
1188 ((TH1F*)fHlistTRD->FindObject(Form("hPrimaryPt%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt);
1189 if (fPt>=fMatchingMomCut) {
1190 ((TH1F*)fHlistTRD->FindObject(Form("hPrimaryEta%s_%s",suffix.Data(),cLabel.Data())))->Fill(fEta);
1191 ((TH1F*)fHlistTRD->FindObject(Form("hPrimaryPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPhi);
1192 ((TH2F*)fHlistTRD->FindObject(Form("hPrimaryPtVsOutPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,fPt);
1195 ((TH1F*)fHlist->FindObject(Form("hPrimaryP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP);
1196 ((TH1F*)fHlist->FindObject(Form("hPrimaryPt%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt);
1197 if (fPt>=fMatchingMomCut) {
1198 ((TH1F*)fHlist->FindObject(Form("hPrimaryEta%s_%s",suffix.Data(),cLabel.Data())))->Fill(fEta);
1199 ((TH1F*)fHlist->FindObject(Form("hPrimaryPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPhi);
1200 ((TH2F*)fHlist->FindObject(Form("hPrimaryPtVsOutPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,fPt);
1205 //----------------------------------------------------------------------------------
1206 void AliAnalysisTaskTOFqaID::FillMatchedTrkHisto(Int_t charge, TString suffix)
1208 //get matched tracks variables (matching cut to be applied externally)
1209 //=> numerator for matching efficiency
1212 if (charge<0) cLabel.Form("neg");
1214 if (charge>0) cLabel.Form("pos");
1215 else cLabel.Form("all");
1217 if (suffix.Contains("Trd")) {
1218 ((TH1F*)fHlistTRD->FindObject(Form("hMatchedP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP);
1219 ((TH1F*)fHlistTRD->FindObject(Form("hMatchedPt%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt);
1220 if (fPt>=fMatchingMomCut) {
1221 ((TH1F*)fHlistTRD->FindObject(Form("hMatchedEta%s_%s",suffix.Data(),cLabel.Data())))->Fill(fEta);
1222 ((TH1F*)fHlistTRD->FindObject(Form("hMatchedPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPhi);
1223 ((TH2F*)fHlistTRD->FindObject(Form("hMatchedPtVsOutPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,fPt);
1226 ((TH1F*)fHlist->FindObject(Form("hMatchedP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP);
1227 ((TH1F*)fHlist->FindObject(Form("hMatchedPt%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt);
1228 if (fPt>=fMatchingMomCut) {
1229 ((TH1F*)fHlist->FindObject(Form("hMatchedEta%s_%s",suffix.Data(),cLabel.Data())))->Fill(fEta);
1230 ((TH1F*)fHlist->FindObject(Form("hMatchedPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPhi);
1231 ((TH2F*)fHlist->FindObject(Form("hMatchedPtVsOutPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,fPt);
1237 //----------------------------------------------------------------------------------
1238 void AliAnalysisTaskTOFqaID::FillPidHisto(AliESDtrack * track, Int_t charge, TString suffix)
1240 //basic PID performance check
1242 printf("WARNING: track with negative TOF time found! Skipping this track for PID checks\n");
1246 printf("WARNING: track with negative length found!Skipping this track for PID checks\n");
1252 if (charge<0) cLabel.Form("neg");
1254 if (charge>0) cLabel.Form("pos");
1255 else cLabel.Form("all");
1258 Double_t c=TMath::C()*1.E-9;// m/ns
1259 Double_t mass=0.; //GeV
1260 Double_t length=fL*0.01; // in meters
1261 Double_t tof=fTof*c;
1262 Double_t beta=length/tof;
1263 Double_t fact= (tof/length)*(tof/length) -1.;
1264 Double_t fP2 = fP*fP;
1267 mass = -fP*TMath::Sqrt(-fact);
1269 mass = fP*TMath::Sqrt(fact);
1272 if (suffix.Contains("Trd")) {
1273 ((TH2F*) fHlistTRD->FindObject(Form("hMatchedBetaVsP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP,beta);
1274 ((TH1F*) fHlistTRD->FindObject(Form("hMatchedMass%s_%s",suffix.Data(),cLabel.Data())))->Fill(mass);
1275 ((TH1F*) fHlistTRD->FindObject(Form("hMatchedMass2%s_%s",suffix.Data(),cLabel.Data())))->Fill(mass*mass);
1277 ((TH2F*) fHlistPID->FindObject(Form("hMatchedBetaVsP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP,beta);
1278 ((TH1F*) fHlistPID->FindObject(Form("hMatchedMass%s_%s",suffix.Data(),cLabel.Data())))->Fill(mass);
1279 ((TH1F*) fHlistPID->FindObject(Form("hMatchedMass2%s_%s",suffix.Data(),cLabel.Data())))->Fill(mass*mass);
1283 Bool_t isValidBeta[AliPID::kSPECIES]={0,0,0,0,0};
1284 for (Int_t specie = 0; specie < AliPID::kSPECIES; specie++){
1285 fSigmaSpecie[specie] = fESDpid->GetTOFResponse().GetExpectedSigma(fP, fTrkExpTimes[specie], AliPID::ParticleMass(specie));
1286 beta=1/TMath::Sqrt(1+AliPID::ParticleMass(specie)*AliPID::ParticleMass(specie)/(fP2));
1288 fThExpTimes[specie]=length*1.E3/(beta*c);//ps
1289 isValidBeta[specie]=kTRUE;
1291 fThExpTimes[specie]=1E-10;
1292 isValidBeta[specie]=kFALSE;
1295 Float_t timeZeroTOF = (Float_t) fESDpid->GetTOFResponse().GetStartTime(fPt);
1296 Double_t tofps=fTof*1E3;//ps for t-texp
1297 Int_t channel=track->GetTOFCalChannel();
1298 Int_t volId[5]; //(sector, plate,strip,padZ,padX)
1299 AliTOFGeometry::GetVolumeIndices(channel,volId);
1300 Char_t partName[3][4] = {"Pi","Ka","Pro"};
1302 if (suffix.Contains("Trd")) {
1303 //fill histos for pion only
1304 ((TH2F*)fHlistTRD->FindObject(Form("hExpTimePiVsStrip%s_%s",suffix.Data(),cLabel.Data())))->Fill((Int_t)GetStripIndex(volId),tofps-fTrkExpTimes[AliPID::kPion]);//ps
1305 ((TH1F*)fHlistTRD->FindObject(Form("hExpTimePi%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofps-fTrkExpTimes[AliPID::kPion]);//ps
1306 if (ComputeTimeZeroByTOF1GeV() && (fPt>0.95) && (fPt<1.05) ){
1307 ((TH2F*)fHlistTRD->FindObject(Form("hExpTimePiT0Sub1GeV%s_%s",suffix.Data(),cLabel.Data())))->Fill(fMyTimeZeroTOFtracks,tofps-fMyTimeZeroTOF-fTrkExpTimes[AliPID::kPion]);
1309 //fill sigmas and deltas for each specie
1310 for (Int_t specie = AliPID::kPion; specie <= AliPID::kProton; specie++){
1311 if (isValidBeta[specie]){
1312 ((TH2F*)fHlistTRD->FindObject(Form("hExpTime%sVsP%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fP, tofps-fTrkExpTimes[specie]);
1313 ((TH2F*)fHlistTRD->FindObject(Form("hTOFpidSigma%s%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fPt, (tofps-fTrkExpTimes[specie])/fSigmaSpecie[specie]);
1314 ((TH2F*)fHlistTRD->FindObject(Form("hExpTime%sT0SubVsP%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fP,tofps-fTrkExpTimes[specie]-timeZeroTOF);
1315 ((TH2F*)fHlistTRD->FindObject(Form("hExpTime%sVsOutPhi%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,tofps-fTrkExpTimes[specie]-timeZeroTOF);
1317 }// end check on beta
1321 //fill histos for pion only
1322 ((TH2F*)fHlistPID->FindObject(Form("hExpTimePiVsStrip%s_%s",suffix.Data(),cLabel.Data())))->Fill((Int_t)GetStripIndex(volId),tofps-fTrkExpTimes[AliPID::kPion]);//ps
1323 ((TH1F*)fHlistPID->FindObject(Form("hExpTimePi%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofps-fTrkExpTimes[AliPID::kPion]);//ps
1324 if (ComputeTimeZeroByTOF1GeV() && (fPt>0.95) && (fPt<1.05) ){
1325 ((TH2F*)fHlistPID->FindObject(Form("hExpTimePiT0Sub1GeV%s_%s",suffix.Data(),cLabel.Data())))->Fill(fMyTimeZeroTOFtracks,tofps-fMyTimeZeroTOF-fTrkExpTimes[AliPID::kPion]);
1327 //fill sigmas and deltas for each specie
1328 for (Int_t specie = AliPID::kPion; specie <= AliPID::kProton; specie++){
1329 if (isValidBeta[specie]){
1330 ((TH2F*)fHlistPID->FindObject(Form("hExpTime%sVsP%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fP, tofps-fTrkExpTimes[specie]);
1331 ((TH2F*)fHlistPID->FindObject(Form("hTOFpidSigma%s%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fPt, (tofps-fTrkExpTimes[specie])/fSigmaSpecie[specie]);
1332 ((TH2F*)fHlistPID->FindObject(Form("hExpTime%sT0SubVsP%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fP,tofps-fTrkExpTimes[specie]-timeZeroTOF);
1333 ((TH2F*)fHlistPID->FindObject(Form("hExpTime%sVsOutPhi%s_%s",partName[specie-2], suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,tofps-fTrkExpTimes[specie]-timeZeroTOF);
1334 }// end check on beta
1339 //re-set response kFILL_T0 to check post-alignment wih OADB
1340 fESDpid->SetTOFResponse(fESD,AliESDpid::kFILL_T0);//(fill_t0, tof_t0, t0_t0, best_t0)
1341 Float_t startTimeFill=fESDpid->GetTOFResponse().GetStartTime(fP); //timeZero for bin pT>10GeV/c
1342 if (suffix.Contains("Trd"))
1343 ((TH1F*)fHlistTRD->FindObject(Form("hExpTimePiFillSub%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofps-fTrkExpTimes[AliPID::kPion]-startTimeFill);//ps
1345 ((TH1F*)fHlistPID->FindObject(Form("hExpTimePiFillSub%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofps-fTrkExpTimes[AliPID::kPion]-startTimeFill);//ps
1347 // if (fEnableAdvancedCheck && (fPt<1.)) {
1348 // Double_t pos[3]={0.,0.,0.};
1349 // track->GetXYZAt(378.,5.,pos);
1350 // if ((pos[0]==0.)&&(pos[1]==0.)&&(pos[2]==0.))continue;
1352 // Double_t phiTOF=TMath::ATan2(pos[1],pos[0])*TMath::RadToDeg();
1353 // if (phiTOF<0) phiTOF+= (2*TMath::Pi()*TMath::RadToDeg());
1355 // //fill t-texp vs phi@TOF
1356 // if ((phiOuterTPC<=75) || ((phiOuterTPC>=125)&&(phiOuterTPC<=235)) || (phiOuterTPC>=305) ) { //TRD sectors 2012
1357 // if ( ((phiOuterTPC>=85)&&(phiOuterTPC<=115)) || ((phiOuterTPC>=245)&&(phiOuterTPC<=295)) ) {//no TRD sectors 2012
1361 //----------------------------------------------------------------------------------
1362 void AliAnalysisTaskTOFqaID::FillStartTimeHisto(TString suffix)
1364 //fill start time histo
1366 AliError("Invalid event object");
1369 // info from V0 detector QA
1370 AliESDVZERO * vzero = fESD->GetVZEROData();
1371 Float_t V0Atime = vzero->GetV0ATime();
1372 Float_t V0Ctime = vzero->GetV0CTime();
1373 ((TH2F*)fHlistTimeZero->FindObject(Form("hEventV0MeanVsVtx%s",suffix.Data())))->Fill((V0Atime-V0Ctime)*0.5,(V0Atime+V0Ctime)*0.5);
1375 // info from T0 detector QA
1376 for (Int_t j=0;j<3;j++){
1377 fT0[j]= (Float_t) fESD->GetT0TOF(j);//ps
1378 if (fT0[j]>90000.) fT0[j]=99999.;//fix old default values to the new one
1381 Float_t t0cut = 90000.;
1382 //Float_t t0cut =3 * t0spread; //use this cut to check t0 used in tof response
1383 // if(t0cut < 500) t0cut = 500;
1385 if(TMath::Abs(fT0[1]) < t0cut && TMath::Abs(fT0[2]) < t0cut ) {
1386 //&& TMath::Abs(fT0[2]-fT0[1]) < 500) //add this condition to check t0 used in tof response
1387 ((TH1F*)fHlistTimeZero->FindObject(Form("hT0DetRes%s",suffix.Data())))->Fill((fT0[2]-fT0[1])*0.5);
1388 ((TH1F*)fHlistTimeZero->FindObject(Form("hT0AC%s",suffix.Data())))->Fill(fT0[0]);
1389 ((TH2F*)fHlistTimeZero->FindObject(Form("hEventT0MeanVsVtx%s",suffix.Data())))->Fill((fT0[2]-fT0[1])*0.5,(fT0[2]+fT0[1])*0.5);
1391 if(TMath::Abs(fT0[1]) < t0cut){
1392 ((TH1F*)fHlistTimeZero->FindObject(Form("hT0A%s",suffix.Data())))->Fill(fT0[1]);
1394 if(TMath::Abs(fT0[2]) < t0cut){
1395 ((TH1F*)fHlistTimeZero->FindObject(Form("hT0C%s",suffix.Data())))->Fill(fT0[2]);
1398 // event timeZero QA via AliESDpid::SetTOFResponse()
1399 Double_t timeZero[4]={99999.,99999.,99999.,99999.};
1400 Double_t timeZeroRes[4]={99999.,99999.,99999.,99999.};
1402 TString timeZeroHisto[4]={"hT0fill","hT0TOF","hT0T0","hT0best"};
1403 TString timeZeroHistoRes[4]={"hT0fillRes","hT0TOFRes","hT0T0Res","hT0bestRes"};
1404 for (Int_t j=0;j<4;j++){
1405 timeZeroHisto[j].Append(suffix.Data());
1406 timeZeroHistoRes[j].Append(suffix.Data());
1407 fESDpid->SetTOFResponse(fESD, (AliESDpid::EStartTimeType_t) j);//(fill_t0, tof_t0, t0_t0, best_t0)
1408 timeZero[j]=fESDpid->GetTOFResponse().GetStartTime(10.); //timeZero for bin pT>10GeV/c
1409 timeZeroRes[j]=fESDpid->GetTOFResponse().GetStartTimeRes(10.); //timeZero for bin pT>10GeV/c
1410 ((TH1D*)(fHlistTimeZero->FindObject(timeZeroHisto[j].Data())))->Fill(timeZero[j]);
1411 ((TH1D*)(fHlistTimeZero->FindObject(timeZeroHistoRes[j].Data())))->Fill(timeZeroRes[j]);
1413 ((TH2F*)fHlistTimeZero->FindObject("hT0TOFvsNtrk"))->Fill(fNTOFtracks[0],timeZero[AliESDpid::kTOF_T0]);
1415 //response set to best_t0 by previous loop
1416 FillStartTimeMaskHisto(suffix.Data());
1420 //----------------------------------------------------------------------------------
1421 void AliAnalysisTaskTOFqaID::FillTrdHisto(AliESDtrack * track, Int_t charge)
1423 //fill histograms for TRD/noTRD
1425 AliError("Invalid track object");
1429 if (IsInTRD(track)){
1430 FillPrimaryTrkHisto(charge,"_Trd");
1431 if (IsTPCTOFMatched(track)) {
1432 FillMatchedTrkHisto(charge,"_Trd");
1433 FillPidHisto(track,charge, "_Trd");
1436 FillPrimaryTrkHisto(charge,"_noTrd");
1437 if (IsTPCTOFMatched(track)) {
1438 FillMatchedTrkHisto(charge,"_noTrd");
1439 FillPidHisto(track, charge, "_noTrd");
1444 //----------------------------------------------------------------------------------
1445 void AliAnalysisTaskTOFqaID::FillTofTrgHisto(TString suffix)
1447 //fills histo with trigger info
1448 if (!fHlistTrigger){
1449 AliError("Invalid TOF trigger list");
1453 AliWarning("Invalid AliTOFHeader object - cannot fill trg histo");
1457 Int_t nPad = fTOFHeader->GetNumberOfTOFclusters(); //all fired readout pads
1458 Int_t nTrgPad = fTOFHeader->GetNumberOfTOFtrgPads();// fired readout pads in the trigger window
1459 Int_t nMaxiPad = fTOFHeader->GetNumberOfTOFmaxipad(); //fired maxipads
1461 // update histo with fired macropads
1462 AliTOFTriggerMask *trgMask = fTOFHeader->GetTriggerMask();
1463 for(Int_t j=0;j<72;j++){
1464 for(Int_t i=22;i>=0;i--){
1465 if(trgMask->IsON(j,i))
1466 ((TH1I*)fHlistTrigger->FindObject(Form("hTrgMap%s",suffix.Data())))->Fill(j+1,i+1);
1469 ((TH1I*)fHlistTrigger->FindObject(Form("hFiredMaxipad%s",suffix.Data())))->Fill(nMaxiPad);
1470 ((TH1I*)fHlistTrigger->FindObject(Form("hFiredReadoutPad%s",suffix.Data())))->Fill(nPad);
1471 ((TH1I*)fHlistTrigger->FindObject(Form("hFiredReadoutTrgPad%s",suffix.Data())))->Fill(nTrgPad);
1472 ((TH2I*)fHlistTrigger->FindObject(Form("hFiredMaxipadVsTrgPad%s",suffix.Data())))->Fill(nTrgPad,nMaxiPad);