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 "AliCDBManager.h"
25 #include "AliTOFcalib.h"
26 #include "AliTOFT0maker.h"
27 #include "AliTOFT0v1.h"
28 #include "AliAnalysisTaskTOFqaID.h"
29 #include "AliAnalysisFilter.h"
30 #include "AliESDtrackCuts.h"
32 #include "AliTOFRawStream.h"
33 #include "AliTOFGeometry.h"
35 ClassImp(AliAnalysisTaskTOFqaID)
37 //________________________________________________________________________
38 AliAnalysisTaskTOFqaID::AliAnalysisTaskTOFqaID() :
44 fESDpid(new AliESDpid()),
45 fTOFT0v1(new AliTOFT0v1(fESDpid)),
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()),
95 fTOFT0v1(new AliTOFT0v1(fESDpid)),
97 fEnableAdvancedCheck(kFALSE),
98 fExpTimeBinWidth(24.4),
99 fExpTimeRangeMin(-25010.),
100 fExpTimeRangeMax(25010.),
101 fExpTimeSmallRangeMin(-5002.),
102 fExpTimeSmallRangeMax(5002.),
104 fnExpTimeSmallBins(1),
105 fMyTimeZeroTOF(1e20),
106 fMyTimeZeroTOFsigma(1e20),
107 fMyTimeZeroTOFtracks(-1),
116 fMatchingMomCut(1.0),
125 // Define input and output slots here
126 Info("AliAnalysisTaskTOFqaID","Calling Constructor");
128 for (Int_t j=0;j<5;j++ ) {
137 // Input slot #0 works with a TChain
138 DefineInput(0, TChain::Class());
140 // Output slot #0 writes into a TH1 container
141 // Output slot #1 writes into a user defined container
142 DefineOutput(1, TList::Class());
143 DefineOutput(2, TList::Class());
144 DefineOutput(3, TList::Class());
145 DefineOutput(4, TList::Class());
146 DefineOutput(5, TList::Class());
150 //________________________________________________________________________
151 AliAnalysisTaskTOFqaID::AliAnalysisTaskTOFqaID(const AliAnalysisTaskTOFqaID& copy)
152 : AliAnalysisTaskSE(),
153 fRunNumber(copy.fRunNumber),
155 fMCevent(copy.fMCevent),
156 fTrackFilter(copy.fTrackFilter),
157 fVertex(copy.fVertex),
158 fESDpid(copy.fESDpid),
159 fTOFT0v1(copy.fTOFT0v1),
160 fTOFHeader(copy.fTOFHeader),
161 fEnableAdvancedCheck(copy.fEnableAdvancedCheck),
162 fExpTimeBinWidth(copy.fExpTimeBinWidth),
163 fExpTimeRangeMin(copy.fExpTimeRangeMin),
164 fExpTimeRangeMax(copy.fExpTimeRangeMax),
165 fExpTimeSmallRangeMin(copy.fExpTimeSmallRangeMin),
166 fExpTimeSmallRangeMax(copy.fExpTimeSmallRangeMax),
167 fnExpTimeBins(copy.fnExpTimeBins),
168 fnExpTimeSmallBins(copy.fnExpTimeSmallBins),
169 fMyTimeZeroTOF(copy.fMyTimeZeroTOF),
170 fMyTimeZeroTOFsigma(copy.fMyTimeZeroTOFsigma),
171 fMyTimeZeroTOFtracks(copy.fMyTimeZeroTOFtracks),
173 fSelectedPdg(copy.fSelectedPdg),
178 fTPCOuterPhi(copy.fTPCOuterPhi),
180 fMatchingMomCut(copy.fMatchingMomCut),
183 fHlistTimeZero(copy.fHlistTimeZero),
184 fHlistPID(copy.fHlistPID),
185 fHlistTRD(copy.fHlistTRD),
186 fHlistTrigger(copy.fHlistTrigger)
189 for (Int_t j=0;j<5;j++ ) {
192 fNTOFtracks[j]=copy.fNTOFtracks[j];
194 fSigmaSpecie[j]=copy.fSigmaSpecie[j];
195 fTrkExpTimes[j]=copy.fTrkExpTimes[j];
196 fThExpTimes[j]=copy.fThExpTimes[j];
202 //___________________________________________________________________________
203 AliAnalysisTaskTOFqaID& AliAnalysisTaskTOFqaID::operator=(const AliAnalysisTaskTOFqaID& copy)
206 // Assignment operator
209 AliAnalysisTaskSE::operator=(copy) ;
210 fRunNumber=copy.fRunNumber;
212 fMCevent=copy.fMCevent;
213 fTrackFilter=copy.fTrackFilter;
214 fVertex=copy.fVertex;
215 fESDpid=copy.fESDpid;
216 fTOFT0v1=copy.fTOFT0v1;
217 fTOFHeader=copy.fTOFHeader;
218 fEnableAdvancedCheck=copy.fEnableAdvancedCheck;
219 fExpTimeBinWidth=copy.fExpTimeBinWidth;
220 fExpTimeRangeMin=copy.fExpTimeRangeMin;
221 fExpTimeRangeMax=copy.fExpTimeRangeMax;
222 fExpTimeSmallRangeMin=copy.fExpTimeSmallRangeMin;
223 fExpTimeSmallRangeMax=copy.fExpTimeSmallRangeMax;
224 fnExpTimeBins=copy.fnExpTimeBins;
225 fnExpTimeSmallBins=copy.fnExpTimeSmallBins;
226 fMyTimeZeroTOF=copy.fMyTimeZeroTOF;
227 fMyTimeZeroTOFsigma=copy.fMyTimeZeroTOFsigma;
228 fMyTimeZeroTOFtracks=copy.fMyTimeZeroTOFtracks;
229 for (Int_t j=0;j<5;j++ ) {
232 fNTOFtracks[j]=copy.fNTOFtracks[j];
234 fSigmaSpecie[j]=copy.fSigmaSpecie[j];
235 fTrkExpTimes[j]=copy.fTrkExpTimes[j];
236 fThExpTimes[j]=copy.fThExpTimes[j];
239 fSelectedPdg=copy.fSelectedPdg;
244 fTPCOuterPhi=copy.fTPCOuterPhi;
246 fMatchingMomCut=copy.fMatchingMomCut;
249 fHlistTimeZero=copy.fHlistTimeZero;
250 fHlistPID=copy.fHlistPID;
251 fHlistTRD=copy.fHlistTRD;
252 fHlistTrigger=copy.fHlistTrigger;
257 //___________________________________________________________________________
258 AliAnalysisTaskTOFqaID::~AliAnalysisTaskTOFqaID() {
263 Info("~AliAnalysisTaskTOFqaID","Calling Destructor");
264 if (fESDpid) delete fESDpid;
265 if (fTOFHeader) delete fTOFHeader;
266 if (fTOFT0v1) delete fTOFT0v1;
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()
296 //Defines output objects and histograms
297 Info("CreateOutputObjects","CreateOutputObjects (TList) of task %s", GetName());
299 if (!fHlist) fHlist = new TList();
300 fHlist->SetOwner(kTRUE);
301 if (!fHlistTimeZero) fHlistTimeZero = new TList();
302 fHlistTimeZero->SetOwner(kTRUE);
303 if (!fHlistPID) fHlistPID = new TList();
304 fHlistPID->SetOwner(kTRUE);
305 if (!fHlistTRD) fHlistTRD = new TList();
306 fHlistTRD->SetOwner(kTRUE);
307 if (!fHlistTrigger) fHlistTrigger = new TList();
308 fHlistTrigger->SetOwner(kTRUE);
310 if (fExpTimeRangeMax<fExpTimeRangeMin) {
311 SetExpTimeHistoRange(-25010.,25010.);
313 fnExpTimeBins = TMath::Nint((fExpTimeRangeMax - fExpTimeRangeMin)/fExpTimeBinWidth);//ps
314 fExpTimeRangeMax=fExpTimeRangeMin+fnExpTimeBins*fExpTimeBinWidth;//ps
316 if (fExpTimeSmallRangeMax<fExpTimeSmallRangeMin) {
317 SetExpTimeHistoSmallRange(-5002.,5002.);
319 fnExpTimeSmallBins = TMath::Nint((fExpTimeSmallRangeMax - fExpTimeSmallRangeMin)/fExpTimeBinWidth);//ps
320 fExpTimeSmallRangeMax=fExpTimeSmallRangeMin+fnExpTimeSmallBins*fExpTimeBinWidth;//ps
322 //add plots for start time QA
323 AddStartTimeHisto(fHlistTimeZero,"");
325 //add plots for base TOF quantities
326 AddTofBaseHisto(fHlist, 1, "");
327 AddTofBaseHisto(fHlist, -1, "");
329 //add plots for matching efficiency
330 AddMatchingEffHisto(fHlist, 1, "");
331 AddMatchingEffHisto(fHlist, -1, "");
333 //add plots for PID checks
334 AddPidHisto(fHlistPID, 1, "");
335 AddPidHisto(fHlistPID, -1, "");
338 if (fEnableAdvancedCheck) {
343 PostData(2, fHlistTimeZero);
344 PostData(3, fHlistPID);
345 PostData(4, fHlistTRD);
346 PostData(5, fHlistTrigger);
348 //________________________________________________________________________
349 void AliAnalysisTaskTOFqaID::UserExec(Option_t *)
351 /* Main - executed for each event.
352 It extracts event information and track information after selecting
353 primary tracks via standard cuts. */
355 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
357 AliError("ERROR: Could not get ESDInputHandler");
360 fESD = (AliESDEvent*) esdH->GetEvent();
364 AliError("ERROR: fESD not available");
368 //access MC event handler for MC truth information
370 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
372 AliError("ERROR: Could not get MCeventHandler");
375 fMCevent = (AliMCEvent *) mcH->MCEvent();
377 AliError("Trying to retrieve an invalid MC event.");
384 Int_t runNb = fESD->GetRunNumber();
385 if (runNb>0) fRunNumber = runNb;
386 //reset matched track counters
387 for (Int_t j=0;j<3;j++){fNTOFtracks[j]=0;}
389 //Get vertex info and apply vertex cut
390 if (!IsEventSelected(fESD)) return;
392 //set response tof_t0 for all other checks
393 fESDpid->SetTOFResponse(fESD,AliESDpid::kTOF_T0);//(fill_t0, tof_t0, t0_t0, best_t0)
395 Printf("Momentum cut for eta and phi distributions set: Pt>%3.2f", fMatchingMomCut);
397 // loop over ESD tracks
398 for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
399 AliESDtrack* track = fESD->GetTrack(iTracks);
401 Printf("ERROR: Could not receive track %d", iTracks);
405 //primary tracks selection: kTPCrefit and std cuts
407 if(!fTrackFilter->IsSelected(track)) continue;
409 Printf("No track filter found, skipping the track loop");
413 //select specie if MC
415 (!SelectMCspecies(fMCevent, track))) {
416 AliDebug(4, Form("MC tracks selection: Track=%i label=%i Not Accepted", iTracks, track->GetLabel()));
420 //apply cut for eta acceptance
422 if (TMath::Abs(fEta)>0.8) continue;
424 //get other track variables
427 fPhi = track->Phi()*TMath::RadToDeg();
428 fTPCOuterPhi = GetPhiAtTPCouterRadius(track);
429 fL = track->GetIntegratedLength();
430 track->GetIntegratedTimes(fTrkExpTimes);
432 Int_t charge = track->Charge();
434 FillPrimaryTrkHisto(charge,"");
435 if (IsTPCTOFMatched(track)) {
436 fTof=track->GetTOFsignal()*1E-3;//in ps
437 //increment track counters
439 if (charge>0) fNTOFtracks[1]++;
440 if (charge<0) fNTOFtracks[2]++;
442 FillTofBaseHisto(track, charge,"");
443 FillMatchedTrkHisto(charge,"");
444 FillPidHisto(track, charge, "");
446 if (fEnableAdvancedCheck) FillTrdHisto(track, charge);
447 }//end loop on tracks
449 //fill time zero histos
450 FillStartTimeHisto("");
451 ((TH1F*)fHlist->FindObject("hTOFmulti_pos"))->Fill(fNTOFtracks[1]);
452 ((TH1F*)fHlist->FindObject("hTOFmulti_neg"))->Fill(fNTOFtracks[2]);
454 //fill TOF trg histos from infos in TOF header
455 fTOFHeader=(AliTOFHeader*)fESD->GetTOFHeader();
457 AliWarning("Cannot get TOF header: no TOF trigger info available");
463 PostData(2, fHlistTimeZero);
464 PostData(3, fHlistPID);
465 PostData(4, fHlistTRD);
466 PostData(5, fHlistTrigger);
470 //________________________________________________________________________
471 void AliAnalysisTaskTOFqaID::Terminate(Option_t *)
473 //check on output validity
474 fHlist = dynamic_cast<TList*> (GetOutputData(1));
476 Printf("ERROR: lists not available");
480 // TH1D*hDummy = ((TH1D*)fHlist->FindObject("hTOFmatchedESDPt"));
481 // TH1D*hMatchingEff = (TH1D*) hDummy->Clone("hMatchingEff");
482 // hMatchingEff->SetTitle("Matching efficiency");
483 // hMatchingEff->Divide((TH1F*) fHlist->FindObject("hESDprimaryTrackPt"));
484 // TCanvas *c1 = new TCanvas("AliAnalysisTaskTOFqaID","Matching vs Pt",10,10,510,510);
485 // c1->cd(1)->SetLogy();
486 // hMatchingEff->DrawCopy("E");
487 // fHlist->AddLast(hMatchingEff);
488 ComputeMatchingEfficiency(fHlist, "pt");
489 ComputeMatchingEfficiency(fHlist, "eta");
490 ComputeMatchingEfficiency(fHlist, "phi");
495 //---------------------------------------------------------------
496 Int_t AliAnalysisTaskTOFqaID::GetStripIndex(const Int_t * const in)
498 /* return tof strip index between 0 and 91 */
500 Int_t nStripA = AliTOFGeometry::NStripA();
501 Int_t nStripB = AliTOFGeometry::NStripB();
502 Int_t nStripC = AliTOFGeometry::NStripC();
504 Int_t iplate = in[1];
505 Int_t istrip = in[2];
507 Int_t stripOffset = 0;
513 stripOffset = nStripC;
516 stripOffset = nStripC+nStripB;
519 stripOffset = nStripC+nStripB+nStripA;
522 stripOffset = nStripC+nStripB+nStripA+nStripB;
529 if (stripOffset<0 || stripOffset>92) return -1;
531 return (stripOffset+istrip);
534 //-----------------------------------------------------------------
535 Double_t AliAnalysisTaskTOFqaID::GetPhiAtTPCouterRadius(AliESDtrack * track)
537 //get track phi at TPC outer radius
538 if (!track) return 1e10;
539 Double_t tpcoutcoord[3]={0.,0.,0.};
540 track->GetOuterXYZ(tpcoutcoord);
541 Double_t phiOuterTPC=TMath::ATan2(tpcoutcoord[1],tpcoutcoord[0])*TMath::RadToDeg();
543 phiOuterTPC+= (2*TMath::Pi()*TMath::RadToDeg());
546 //-----------------------------------------------------------------
547 Bool_t AliAnalysisTaskTOFqaID::IsEventSelected(AliESDEvent * event)
549 //select event based on primary vertex
551 AliError("Invalid ESD event");
554 fVertex = (AliESDVertex*) event->GetPrimaryVertexTracks();
555 if(fVertex->GetNContributors()<1) {
557 fVertex = (AliESDVertex*) event->GetPrimaryVertexSPD();
558 if(fVertex->GetNContributors()<1) fVertex = 0x0;
560 if (!fVertex) return kFALSE;
561 if (TMath::Abs(fVertex->GetZv())<10.0) return kTRUE;
565 //-----------------------------------------------------------------
566 Bool_t AliAnalysisTaskTOFqaID::IsTPCTOFMatched(AliESDtrack * track)
568 //defines TOF matching
570 AliWarning("Invalid track object");
574 if ( (track->IsOn(AliESDtrack::kTOFout)) &&
575 (track->IsOn(AliESDtrack::kTIME)) &&
576 (track->IsOn(AliESDtrack::kTPCout)) )
581 //-----------------------------------------------------------------
582 Bool_t AliAnalysisTaskTOFqaID::IsInTRD(AliESDtrack * track)
584 //defines cut to select particles in/out TRD
586 AliWarning("Invalid track object");
590 if ( track->IsOn(AliESDtrack::kTPCout)
591 && track->IsOn(AliESDtrack::kTRDout) )
596 //-----------------------------------------------------------------
597 void AliAnalysisTaskTOFqaID::FillStartTimeMaskHisto(TString suffix)
599 /* set pid response to use best_T0 and for each
600 accepted track fills the histogram with the
604 //set response best_t0
605 //fESDpid->SetTOFResponse(fESD,AliESDpid::kBest_T0);
607 for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
608 AliESDtrack* track = fESD->GetTrack(iTracks);
610 Printf("ERROR: Could not receive track %d", iTracks);
613 //primary tracks selection: kTPCrefit and std cuts
615 if(!fTrackFilter->IsSelected(track)) continue;
618 Printf("No track filter found, skipping the track loop");
621 if (TMath::Abs(track->Eta())>0.8) continue; //cut for acceptance
623 Int_t StartTimeBit = fESDpid->GetTOFResponse().GetStartTimeMask(track->P());
624 ((TH2F*)fHlistTimeZero->FindObject(Form("hStartTimeMask%s",suffix.Data())))->Fill(track->P(),StartTimeBit);
626 //matched tracks selection: kTOFout and kTIME
627 if ( (track->IsOn(AliESDtrack::kTOFout)) &&
628 (track->IsOn(AliESDtrack::kTIME)) &&
629 (track->IsOn(AliESDtrack::kTPCout)) ) {
630 ((TH2F*)fHlistTimeZero->FindObject(Form("hStartTimeMaskMatched%s",suffix.Data())))->Fill(track->P(),StartTimeBit);
636 //----------------------------------------------------
637 Bool_t AliAnalysisTaskTOFqaID::ComputeTimeZeroByTOF1GeV()
639 /* compute T0-TOF for tracks within momentum range [0.95, 1.05] */
641 fTOFT0v1->Init(fESD);
642 //AliTOFT0v1 *fTOFT0v1 = new AliTOFT0v1(fESDpid);
643 fTOFT0v1->DefineT0("all", 0.95, 1.05);
644 fMyTimeZeroTOF = -1000. * fTOFT0v1->GetResult(0);
645 fMyTimeZeroTOFsigma = 1000. * fTOFT0v1->GetResult(1);
646 fMyTimeZeroTOFtracks = fTOFT0v1->GetResult(3);
647 Bool_t hasTimeZeroTOF = kFALSE;
648 /* check T0-TOF sigma */
649 if (fMyTimeZeroTOFsigma < 250.)
650 hasTimeZeroTOF = kTRUE;
651 return hasTimeZeroTOF;
654 //------------------------------------------------------
655 TString AliAnalysisTaskTOFqaID::GetSpeciesName(Int_t absPdgCode)
657 //returns name of selected specie
682 //-----------------------------------------------
683 Bool_t AliAnalysisTaskTOFqaID::SelectMCspecies(AliMCEvent * ev, AliESDtrack * track)
686 //Retrieves particle true ID from MC and selects the desired species
688 if ((!ev) || (!track)) {
689 AliError("SelectMCspecies - Invalid object set as argument");
693 if (fSelectedPdg==0) return kTRUE; //if fSelectedPdg==0, no species selection is applied
695 Long_t label = track->GetLabel();
696 if (label<0) return kFALSE;
698 // get number of particles
699 Long_t nMC = ev->GetNumberOfTracks();
700 // if label too large --> failed
702 AliWarning(Form("Stack overflow: track label = %li -- stack maximum = %li", label, nMC));
706 AliMCParticle *mcPart = (AliMCParticle *)ev->GetTrack(label);
707 if (!mcPart) {// if particle = NULL --> failed
708 AliWarning(Form("Stack discontinuity: label %li refers to a NULL object", label));
712 Int_t pdgCode = mcPart->PdgCode();
713 if (!(TMath::Abs(pdgCode)==fSelectedPdg))
715 else //Printf("Found particle with selected pdg code = %i", pdgCode);
719 //----------------------------------------------------------------------------------
720 Bool_t AliAnalysisTaskTOFqaID::ComputeMatchingEfficiency(TList* list, TString variable)
722 //computes matching efficiency from previously filled histos
723 // to be called in terminate function
724 if (!list) return kFALSE;
726 TString matchedName, primaryName, xAxisTitle;
727 if (variable.Contains("pt")) {
728 matchedName = "hTOFmatchedESDPt";
729 primaryName = "hESDprimaryTrackPt";
730 xAxisTitle = "p_{T} (GeV/c)";
732 if (variable.Contains("eta")) {
733 matchedName = "hTOFmatchedESDeta";
734 primaryName = "hTOFprimaryESDeta";
737 if (variable.Contains("phi")) {
738 matchedName = "hTOFmatchedESDphi";
739 primaryName = "hTOFprimaryESDphi";
740 xAxisTitle = "#phi_vtx (deg)";
744 TH1D*hDummy = ((TH1D*)list->FindObject(matchedName.Data()));
745 if (!hDummy) return 0;
746 TH1D*hMatchingEff = (TH1D*) hDummy->Clone("hMatchingEff");
747 hMatchingEff->SetNameTitle(Form("hMatchingEff_%s", variable.Data()),Form("Matching efficiency vs %s", variable.Data()));
748 hMatchingEff->Divide((TH1F*) list->FindObject(primaryName.Data()));
749 hMatchingEff->GetXaxis()->SetTitle(xAxisTitle.Data());
750 hMatchingEff->GetYaxis()->SetRangeUser(0.0,1.0);
751 hMatchingEff->GetYaxis()->SetTitle("#epsilon_{match}");
752 list->AddLast(hMatchingEff);
755 //----------------------------------------------------------------------------------
756 void AliAnalysisTaskTOFqaID::HistogramMakeUp(TH1* hist, Color_t color, Int_t markerStyle, TString drawOpt, TString newName, TString newTitle, TString xTitle, TString yTitle)
758 //set histogram style and axes style at once
760 if (!newName.IsNull()) hist->SetName(newName.Data());
761 if (!newTitle.IsNull()) hist->SetTitle(newTitle.Data());
762 if (!xTitle.IsNull()) hist->GetXaxis()->SetTitle(xTitle.Data());
763 if (!yTitle.IsNull()) hist->GetYaxis()->SetTitle(yTitle.Data());
764 hist->SetLineColor(color);
765 hist->SetMarkerColor(color);
766 hist->SetMarkerStyle(markerStyle);
767 hist->SetMarkerSize(0.7);
768 hist->SetDrawOption(drawOpt.Data());
773 //----------------------------------------------------------------------------------
774 void AliAnalysisTaskTOFqaID::AddTofBaseHisto(TList *list, Int_t charge, TString suffix)
776 //Creates histograms for monitoring TOF signal, time alignement and matching-related quantities
778 AliError("Invalid list passed as argument.");
783 if (charge<0) cLabel.Form("neg");
785 if (charge>0) cLabel.Form("pos");
786 else cLabel.Form("all");
788 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);
789 HistogramMakeUp(hTOFmulti, ((charge>0)? kRed : kBlue+2), 1, "E1", "","", "N","events");
790 list->AddLast(hTOFmulti);
792 TH1F* hTOFtime = new TH1F(Form("hTime%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk TOF signal", cLabel.Data()), 250, 0., 610. ) ;
793 HistogramMakeUp(hTOFtime,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "t (ns)","tracks");
794 list->AddLast(hTOFtime);
796 TH1F* hTOFrawTime = new TH1F(Form("hRawTime%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk TOF raw signal", cLabel.Data()), 250, 0., 610. ) ;
797 HistogramMakeUp(hTOFrawTime,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "t_{raw} (ns)","tracks");
798 list->AddLast(hTOFrawTime);
800 TH1F* hTOFtot = new TH1F(Form("hTot%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk ToT", cLabel.Data()), 50, 0., 50. ) ;
801 HistogramMakeUp(hTOFtot,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "ToT (ns)","tracks");
802 list->AddLast(hTOFtot);
804 TH1F* hMatchedL = new TH1F(Form("hMatchedL%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk lenght", cLabel.Data()), 1200, -400., 800) ;
805 HistogramMakeUp(hMatchedL,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "L (cm)","tracks");
806 list->AddLast(hMatchedL);
808 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.) ;
809 HistogramMakeUp(hMatchedDxVsPt,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "GeV/c (p_{T})","dx (cm)");
810 list->AddLast(hMatchedDxVsPt);
812 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.) ;
813 HistogramMakeUp(hMatchedDzVsStrip,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "strip","dz (cm)");
814 list->AddLast(hMatchedDzVsStrip) ;
816 TProfile *hMatchedDxVsCh = new TProfile(Form("hMatchedDxVsCh%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk dx vs. channel", cLabel.Data()), 157248., 0.,157248.);
817 HistogramMakeUp(hMatchedDxVsCh,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "channel","dx (cm)");
818 list->AddLast(hMatchedDxVsCh);
820 TProfile *hMatchedDzVsCh = new TProfile(Form("hMatchedDzVsCh%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk dz vs. channel", cLabel.Data()), 157248., 0.,157248.);
821 HistogramMakeUp(hMatchedDzVsCh,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "channel","dz (cm)");
822 list->AddLast(hMatchedDzVsCh);
827 //----------------------------------------------------------------------------------
828 void AliAnalysisTaskTOFqaID::AddMatchingEffHisto(TList *list, Int_t charge, TString suffix)
831 AliError("Invalid list passed as argument.");
835 if (charge<0) cLabel.Form("neg"); else if (charge>0) cLabel.Form("pos"); else cLabel.Form("all");
837 TH1F* hMatchedP = new TH1F(Form("hMatchedP%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p", cLabel.Data()), 1000,0.,10.) ;
838 HistogramMakeUp(hMatchedP,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "L (cm)","tracks");
839 list->AddLast(hMatchedP) ;
841 TH1F* hMatchedPt = new TH1F(Form("hMatchedPt%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p_{T}", cLabel.Data()), 1000,0.,10.) ;
842 HistogramMakeUp(hMatchedPt,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "p_{T} (GeV/c)","tracks");
843 list->AddLast(hMatchedPt) ;
845 TH1F* hMatchedEta = new TH1F(Form("hMatchedEta%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #eta", cLabel.Data()), 200, -1., 1.) ;
846 HistogramMakeUp(hMatchedEta,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "#eta","tracks");
847 list->AddLast(hMatchedEta) ;
849 TH1F* hMatchedPhi = new TH1F(Form("hMatchedPhi%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #phi_{vtx}", cLabel.Data()), 72, 0., 360.) ;
850 HistogramMakeUp(hMatchedPhi,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "#phi_{vtx} (deg)","tracks");
851 list->AddLast(hMatchedPhi) ;
853 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.) ;
854 HistogramMakeUp(hMatchedPtVsOutPhi,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "#phi_{TPC out} (deg)","p_{T} (GeV/c)");
855 list->AddLast(hMatchedPtVsOutPhi) ;
857 TH1F* hPrimaryP = new TH1F(Form("hPrimaryP%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p", cLabel.Data()), 1000,0.,10.) ;
858 HistogramMakeUp(hPrimaryP,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "L (cm)","tracks");
859 list->AddLast(hPrimaryP) ;
861 TH1F* hPrimaryPt = new TH1F(Form("hPrimaryPt%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk p_{T}", cLabel.Data()), 1000,0.,10.) ;
862 HistogramMakeUp(hPrimaryPt,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "p_{T} (GeV/c)","tracks");
863 list->AddLast(hPrimaryPt) ;
865 TH1F* hPrimaryEta = new TH1F(Form("hPrimaryEta%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #eta", cLabel.Data()), 200, -1., 1.) ;
866 HistogramMakeUp(hPrimaryEta,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "#eta","tracks");
867 list->AddLast(hPrimaryEta) ;
869 TH1F* hPrimaryPhi = new TH1F(Form("hPrimaryPhi%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched trk #phi_{vtx}", cLabel.Data()), 72, 0., 360.) ;
870 HistogramMakeUp(hPrimaryPhi,((charge>0)? kRed+2 : kBlue+2), 1, "E1", "","", "#phi_{vtx} (deg)","tracks");
871 list->AddLast(hPrimaryPhi) ;
873 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.) ;
874 HistogramMakeUp(hPrimaryPtVsOutPhi,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "#phi_{TPC out} (deg)","p_{T} (GeV/c)");
875 list->AddLast(hPrimaryPtVsOutPhi) ;
879 //----------------------------------------------------------------------------------
880 void AliAnalysisTaskTOFqaID::AddPidHisto(TList *list, Int_t charge, TString suffix)
882 //Creates histograms for monitoring TOF PID
884 AliError("Invalid list passed as argument.");
888 if (charge<0) cLabel.Form("neg"); else if (charge>0) cLabel.Form("pos"); else cLabel.Form("all");
890 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) ;
891 HistogramMakeUp(hMatchedBetaVsP,((charge>0)? kRed+2 : kBlue+2), 1, "colz", "","", "p (GeV/c)","#beta");
892 list->AddLast(hMatchedBetaVsP);
894 TH1F* hMatchedMass= new TH1F(Form("hMatchedMass%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched p.le M", cLabel.Data()), 500, 0., 5. );
895 HistogramMakeUp(hMatchedMass,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "M (GeV/c^{2})","entries");
896 list->AddLast(hMatchedMass);
898 TH1F* hMatchedMass2= new TH1F(Form("hMatchedMass2%s_%s",suffix.Data(),cLabel.Data()), Form("%s matched p.le M^{2}", cLabel.Data()), 500, 0., 10. );
899 HistogramMakeUp(hMatchedMass2,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "M^{2} (GeV^{2}/c^{4})","entries");
900 list->AddLast(hMatchedMass2);
902 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) ;
903 HistogramMakeUp(hExpTimePiVsStrip,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "strip (#eta)","t_{TOF}-t_{#pi,exp} [ps]");
904 list->AddLast(hExpTimePiVsStrip);
906 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) ;
907 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}");
908 list->AddLast(hExpTimePiT0Sub1GeV) ;
910 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) ;
911 HistogramMakeUp(hExpTimePi,((charge>0)? kRed+2 : kBlue+2), 1, "", "","", "t_{TOF}-t_{#pi,exp} [ps]","tracks");
912 list->AddLast(hExpTimePi);
914 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) ;
915 HistogramMakeUp(hExpTimePiVsP,kRed+2, 1, "colz", "","", "p (GeV/c)","t_{TOF}-t_{#pi,exp} [ps]");
916 list->AddLast(hExpTimePiVsP);
918 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) ;
919 HistogramMakeUp(hExpTimeKaVsP,kBlue+2, 1, "colz", "","", "p (GeV/c)","t_{TOF}-t_{K,exp} [ps]");
920 list->AddLast(hExpTimeKaVsP);
922 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) ;
923 HistogramMakeUp(hExpTimeProVsP,kGreen+2, 1, "colz", "","", "p (GeV/c)","t_{TOF}-t_{p,exp} [ps]");
924 list->AddLast(hExpTimeProVsP);
926 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. ) ;
927 HistogramMakeUp(hTOFpidSigmaPi,kRed+2, 1, "colz", "","", "p (GeV/c)","n#sigma_{#pi,exp} [ps]");
928 list->AddLast(hTOFpidSigmaPi) ;
930 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. ) ;
931 HistogramMakeUp(hTOFpidSigmaKa,kBlue+2, 1, "colz", "","", "p (GeV/c)","n#sigma_{K,exp} [ps]");
932 list->AddLast(hTOFpidSigmaKa) ;
934 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. ) ;
935 HistogramMakeUp(hTOFpidSigmaPro,kGreen+2, 1, "colz", "","","p (GeV/c)","n#sigma_{p,exp} [ps]");
936 list->AddLast(hTOFpidSigmaPro);
938 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) ;
939 HistogramMakeUp(hExpTimePiT0SubVsP,kRed+2, 1, "colz", "","","p (GeV/c)","t_{TOF}-t_{#pi,exp}-t_{0}^{TOF}");
940 list->AddLast(hExpTimePiT0SubVsP) ;
942 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) ;
943 HistogramMakeUp(hExpTimeKaT0SubVsP,kBlue+2, 1, "colz", "","","p (GeV/c)","t_{TOF}-t_{K,exp}-t_{0}^{TOF}");
944 list->AddLast(hExpTimeKaT0SubVsP) ;
946 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) ;
947 HistogramMakeUp(hExpTimeProT0SubVsP,kGreen+2, 1, "colz", "","","p (GeV/c)","t_{TOF}-t_{p,exp}-t_{0}^{TOF}");
948 list->AddLast(hExpTimeProT0SubVsP) ;
950 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) ;
951 HistogramMakeUp(hExpTimePiVsOutPhi,kRed+2, 1, "colz", "","", "#phi_{TPC out} (deg)","t_{TOF}-t_{#pi,exp} [ps]");
952 list->AddLast(hExpTimePiVsOutPhi);
954 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) ;
955 HistogramMakeUp(hExpTimeKaVsOutPhi,kBlue+2, 1, "colz", "","", "#phi_{TPC out} (deg)","t_{TOF}-t_{K,exp} [ps]");
956 list->AddLast(hExpTimeKaVsOutPhi);
958 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) ;
959 HistogramMakeUp(hExpTimeProVsOutPhi,kGreen+2, 1, "colz", "","", "#phi_{TPC out} (deg)","t_{TOF}-t_{p,exp} [ps]");
960 list->AddLast(hExpTimeProVsOutPhi);
964 //----------------------------------------------------------------------------------
965 void AliAnalysisTaskTOFqaID::AddStartTimeHisto(TList *list, TString suffix)
967 //Creates histograms for monitoring T0 signal and start-time related quantities
969 AliError("Invalid list passed as argument.");
972 TH1D* hT0AC = new TH1D(Form("hT0AC%s",suffix.Data()), "Event timeZero from T0A&C; t_{0,AC} [ps]; events", 1000, -25000., 25000. ) ;
973 HistogramMakeUp(hT0AC, kRed+2, 20, "", "","","","");
974 list->AddLast(hT0AC);
976 TH1D* hT0A = new TH1D(Form("hT0A%s",suffix.Data()), "Event timeZero from T0A; t_{0,A} [ps]; events", 1000, -25000., 25000. ) ;
977 HistogramMakeUp(hT0A, kBlue+2, 25, "", "","","","");
980 TH1D* hT0C = new TH1D(Form("hT0C%s",suffix.Data()), "Event timeZero from T0C; t_{0,C} [ps]; events", 1000, -25000., 25000. ) ;
981 HistogramMakeUp(hT0C, kGreen+2, 28, "", "","","","");
984 TH1D* hT0DetRes = new TH1D(Form("hT0DetRes%s",suffix.Data()), "T0 detector (T0A-T0C)/2; (T0A-T0C)/2 [ps]; events", 200, -500.,500. ) ;
985 HistogramMakeUp(hT0DetRes, kMagenta+1, 1, "", "","","","");
986 list->AddLast(hT0DetRes) ;
988 TH1F* hT0fill = new TH1F(Form("hT0fill%s",suffix.Data()), "Event timeZero of fill; t_{0,fill} [ps]; events", 1000, -25000., 25000. ) ;
989 HistogramMakeUp(hT0fill, kOrange+1, 25, "", "","","","");
990 list->AddLast(hT0fill) ;
992 TH1F* hT0TOF = new TH1F(Form("hT0TOF%s",suffix.Data()), "Event timeZero estimated by TOF; t0 [ps]; events", 1000, -25000., 25000. ) ;
993 HistogramMakeUp(hT0TOF, kTeal-5, 21, "", "","","","");
994 list->AddLast(hT0TOF) ;
996 TH1F* hT0T0 = new TH1F(Form("hT0T0%s",suffix.Data()), "Best timeZero between AC, A, C; t_{0} [ps]; events", 1000, -25000.,25000. ) ;
997 HistogramMakeUp(hT0T0, kAzure+7, 26, "", "","","","");
998 list->AddLast(hT0T0) ;
1000 TH1F* hT0best = new TH1F(Form("hT0best%s",suffix.Data()), "Event timeZero estimated as T0best; t0 [ps]; events", 1000, -25000.,25000. ) ;
1001 HistogramMakeUp(hT0best, kBlack, 20, "", "","","","");
1002 list->AddLast(hT0best) ;
1004 TH1F* hT0fillRes = new TH1F(Form("hT0fillRes%s",suffix.Data()), "Resolution of fillT0; #sigma_{fillT0} [ps];events", 250, 0.,250. ) ;
1005 HistogramMakeUp(hT0fillRes, kOrange+1, 25, "", "","","","");
1006 list->AddLast(hT0fillRes) ;
1008 TH1F* hT0TOFRes = new TH1F(Form("hT0TOFRes%s",suffix.Data()), "Resolution of timeZero from TOF; #sigma_{TOFT0} [ps];events", 250, 0.,250. ) ;
1009 HistogramMakeUp(hT0TOFRes, kTeal-5, 21, "", "","","","");
1010 list->AddLast(hT0TOFRes) ;
1012 TH1F* hT0T0Res = new TH1F(Form("hT0T0Res%s",suffix.Data()), "Resolution of timeZero from T0;#sigma_{T0T0} [ps];events", 250, -0., 250. ) ;
1013 HistogramMakeUp(hT0T0Res, kAzure+7, 26, "", "","","","");
1014 list->AddLast(hT0T0Res) ;
1016 TH1F* hT0bestRes = new TH1F(Form("hT0bestRes%s",suffix.Data()), "Resolution of bestT0; #sigma_{bestT0} [ps];events", 250, 0.,250. ) ;
1017 HistogramMakeUp(hT0bestRes, kBlack, 20, "", "","","","");
1018 list->AddLast(hT0bestRes) ;
1020 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. ) ;
1021 HistogramMakeUp(hT0TOFvsNtrk, kTeal-5, 1, "colz", "","","","");
1022 list->AddLast(hT0TOFvsNtrk) ;
1024 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. ) ;
1025 HistogramMakeUp(hEventT0MeanVsVtx, kBlue+2, 1, "colz", "","","","");
1026 list->AddLast(hEventT0MeanVsVtx) ;
1028 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. ) ;
1029 HistogramMakeUp(hEventV0MeanVsVtx, kBlack, 1, "colz", "","","","");
1030 list->AddLast(hEventV0MeanVsVtx) ;
1032 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.};
1034 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.);
1035 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(1,"fill_t0");
1036 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(2,"tof_t0");
1037 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(3,"T0AC");
1038 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(4,"T0AC & tof_t0");
1039 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(5,"T0A");
1040 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(6,"T0A & tof_t0");
1041 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(7,"T0C");
1042 hStartTimeMaskMatched->GetYaxis()->SetBinLabel(8,"T0C & tof_t0");
1043 HistogramMakeUp(hStartTimeMaskMatched, kRed+2, 1, "colz", "","","","");
1044 list->AddLast(hStartTimeMaskMatched);
1046 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.);
1047 hStartTimeMask->GetYaxis()->SetBinLabel(1,"fill_t0");
1048 hStartTimeMask->GetYaxis()->SetBinLabel(2,"tof_t0");
1049 hStartTimeMask->GetYaxis()->SetBinLabel(3,"T0AC");
1050 hStartTimeMask->GetYaxis()->SetBinLabel(4,"T0AC & tof_t0");
1051 hStartTimeMask->GetYaxis()->SetBinLabel(5,"T0A");
1052 hStartTimeMask->GetYaxis()->SetBinLabel(6,"T0A & tof_t0");
1053 hStartTimeMask->GetYaxis()->SetBinLabel(7,"T0C");
1054 hStartTimeMask->GetYaxis()->SetBinLabel(8,"T0C & tof_t0");
1055 HistogramMakeUp(hStartTimeMask, kRed+2, 1, "colz", "","","","");
1056 list->AddLast(hStartTimeMask);
1060 //----------------------------------------------------------------------------------
1061 void AliAnalysisTaskTOFqaID::AddTrdHisto()
1063 //Creates histograms for monitoring TOF base quantities wrt TRD/no TRD selection
1065 AliError("Invalid TRD list");
1069 AddMatchingEffHisto(fHlistTRD, 1, "_noTrd");
1070 AddMatchingEffHisto(fHlistTRD, -1, "_noTrd");
1071 AddMatchingEffHisto(fHlistTRD, 1, "_Trd");
1072 AddMatchingEffHisto(fHlistTRD, -1, "_Trd");
1074 AddPidHisto(fHlistTRD, 1, "_noTrd");
1075 AddPidHisto(fHlistTRD, -1, "_noTrd");
1076 AddPidHisto(fHlistTRD, 1, "_Trd");
1077 AddPidHisto(fHlistTRD, -1, "_Trd");
1082 //----------------------------------------------------------------------------------
1083 void AliAnalysisTaskTOFqaID::AddTofTrgHisto(TString suffix)
1085 //defines histo with trigger info
1086 if (!fHlistTrigger){
1087 AliError("Invalid TOF trigger list");
1091 TH1I* hFiredMaxipad = new TH1I(Form("hFiredMaxipad%s",suffix.Data()), Form("Fired maxipad per event"), 1584, 0, 1584);
1092 HistogramMakeUp(hFiredMaxipad, kBlue+2, 1, "E1", "","", "N_{maxipad}","events");
1093 fHlistTrigger->AddLast(hFiredMaxipad);
1095 TH1I* hFiredReadoutPad = new TH1I(Form("hFiredReadoutPad%s",suffix.Data()), Form("Fired readout pad per event"), 153000, 0, 153000);
1096 HistogramMakeUp(hFiredReadoutPad, kRed+2, 1, "E1", "","", "N_{pad}","events");
1097 fHlistTrigger->AddLast(hFiredReadoutPad);
1099 TH1I* hFiredReadoutTrgPad = new TH1I(Form("hFiredReadoutTrgPad%s",suffix.Data()), Form("Fired readout pad in trg window"), 153000, 0, 153000);
1100 HistogramMakeUp(hFiredReadoutTrgPad, kBlack, 1, "E1", "","", "N_{pad} in trg window","events");
1101 fHlistTrigger->AddLast(hFiredReadoutTrgPad);
1103 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);
1104 HistogramMakeUp(hFiredMaxipadVsTrgPad, kBlue+2, 1, "colz", "","", "N_{pad} in trg window","N_{maxipad}");
1105 fHlistTrigger->AddLast(hFiredMaxipadVsTrgPad);
1107 TH2I* hTrgMap = new TH2I(Form("hTrgMap%s",suffix.Data()), Form("Map of fired maxipads"), 72, 0, 72, 22, 0, 22);
1108 HistogramMakeUp(hTrgMap, kBlue+2, 1, "colz", "","", "LTM","maxipad");
1109 fHlistTrigger->AddLast(hTrgMap);
1114 //----------------------------------------------------------------------------------
1115 void AliAnalysisTaskTOFqaID::FillTofBaseHisto(AliESDtrack * track, Int_t charge, TString suffix)
1117 //fill histo with TOF base quantities
1120 // Double_t tofTime=track->GetTOFsignal();//in ps
1121 Double_t tofTimeRaw=track->GetTOFsignalRaw();//in ps
1122 Double_t tofToT=track->GetTOFsignalToT(); //in ps
1123 Int_t channel=track->GetTOFCalChannel();
1124 Int_t volId[5]; //(sector, plate,strip,padZ,padX)
1125 AliTOFGeometry::GetVolumeIndices(channel,volId);
1126 TString cLabel; if (charge<0) cLabel.Form("neg"); else if (charge>0) cLabel.Form("pos"); else cLabel.Form("all");
1128 ((TH1F*)fHlist->FindObject(Form("hTime%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTof); //ns
1129 ((TH1F*)fHlist->FindObject(Form("hRawTime%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofTimeRaw*1E-3); //ns
1130 ((TH1F*)fHlist->FindObject(Form("hTot%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofToT);
1131 ((TH1F*)fHlist->FindObject(Form("hMatchedL%s_%s", suffix.Data(), cLabel.Data())))->Fill(fL);
1132 ((TH2F*)fHlist->FindObject(Form("hMatchedDxVsPt%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt,track->GetTOFsignalDx());
1133 ((TH2F*)fHlist->FindObject(Form("hMatchedDzVsStrip%s_%s",suffix.Data(),cLabel.Data())))->Fill((Int_t)GetStripIndex(volId),track->GetTOFsignalDz());
1134 ((TProfile*)fHlist->FindObject(Form("hMatchedDxVsCh%s_%s",suffix.Data(),cLabel.Data())))->Fill(channel,track->GetTOFsignalDx());
1135 ((TProfile*)fHlist->FindObject(Form("hMatchedDzVsCh%s_%s",suffix.Data(),cLabel.Data())))->Fill(channel,track->GetTOFsignalDz());
1139 //----------------------------------------------------------------------------------
1140 void AliAnalysisTaskTOFqaID::FillPrimaryTrkHisto(Int_t charge, TString suffix)
1142 // fill histos with primary tracks info
1143 // => denominator for matching efficiency
1146 TList * list = new TList();
1147 if (suffix.Contains("Trd")) list = fHlistTRD;
1150 if (charge<0) cLabel.Form("neg"); else if (charge>0) cLabel.Form("pos"); else cLabel.Form("all");
1151 ((TH1F*)list->FindObject(Form("hPrimaryP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP);
1152 ((TH1F*)list->FindObject(Form("hPrimaryPt%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt);
1153 if (fPt>=fMatchingMomCut) {
1154 ((TH1F*)list->FindObject(Form("hPrimaryEta%s_%s",suffix.Data(),cLabel.Data())))->Fill(fEta);
1155 ((TH1F*)list->FindObject(Form("hPrimaryPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPhi);
1156 ((TH2F*)list->FindObject(Form("hPrimaryPtVsOutPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,fPt);
1160 //----------------------------------------------------------------------------------
1161 void AliAnalysisTaskTOFqaID::FillMatchedTrkHisto(Int_t charge, TString suffix)
1163 //get matched tracks variables (matching cut to be applied externally)
1164 //=> numerator for matching efficiency
1167 TList * list = new TList();
1168 if (suffix.Contains("Trd")) list = fHlistTRD;
1171 if (charge<0) cLabel.Form("neg");
1173 if (charge>0) cLabel.Form("pos");
1174 else cLabel.Form("all");
1176 ((TH1F*)list->FindObject(Form("hMatchedP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP);
1177 ((TH1F*)list->FindObject(Form("hMatchedPt%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt);
1178 if (fPt>=fMatchingMomCut) {
1179 ((TH1F*)list->FindObject(Form("hMatchedEta%s_%s",suffix.Data(),cLabel.Data())))->Fill(fEta);
1180 ((TH1F*)list->FindObject(Form("hMatchedPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPhi);
1181 ((TH2F*)list->FindObject(Form("hMatchedPtVsOutPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,fPt);
1186 //----------------------------------------------------------------------------------
1187 void AliAnalysisTaskTOFqaID::FillPidHisto(AliESDtrack * track, Int_t charge, TString suffix)
1189 //basic PID performance check
1191 printf("WARNING: track with negative TOF time found! Skipping this track for PID checks\n");
1195 printf("WARNING: track with negative length found!Skipping this track for PID checks\n");
1200 TList * list = new TList();
1201 if (suffix.Contains("Trd")) list = fHlistTRD;
1202 else list = fHlistPID;
1205 if (charge<0) cLabel.Form("neg");
1207 if (charge>0) cLabel.Form("pos");
1208 else cLabel.Form("all");
1211 Double_t c=TMath::C()*1.E-9;// m/ns
1212 Double_t mass=0.; //GeV
1213 Double_t length=fL*0.01; // in meters
1214 Double_t tof=fTof*c;
1215 Double_t beta=length/tof;
1216 Double_t fact= (tof/length)*(tof/length) -1.;
1217 Double_t fP2 = fP*fP;
1220 mass = -fP*TMath::Sqrt(-fact);
1222 mass = fP*TMath::Sqrt(fact);
1225 ((TH2F*) list->FindObject(Form("hMatchedBetaVsP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP,beta);
1226 ((TH1F*) list->FindObject(Form("hMatchedMass%s_%s",suffix.Data(),cLabel.Data())))->Fill(mass);
1227 ((TH1F*) list->FindObject(Form("hMatchedMass2%s_%s",suffix.Data(),cLabel.Data())))->Fill(mass*mass);
1230 Bool_t isValidBeta[AliPID::kSPECIES]={0,0,0,0,0};
1231 for (Int_t specie = 0; specie < AliPID::kSPECIES; specie++){
1232 fSigmaSpecie[specie] = fESDpid->GetTOFResponse().GetExpectedSigma(fP, fTrkExpTimes[specie], AliPID::ParticleMass(specie));
1233 beta=1/TMath::Sqrt(1+AliPID::ParticleMass(specie)*AliPID::ParticleMass(specie)/(fP2));
1235 fThExpTimes[specie]=length*1.E3/(beta*c);//ps
1236 isValidBeta[specie]=kTRUE;
1238 fThExpTimes[specie]=1E-10;
1239 isValidBeta[specie]=kFALSE;
1242 Float_t timeZeroTOF = (Float_t) fESDpid->GetTOFResponse().GetStartTime(fPt);
1243 Double_t tofps=fTof*1E3;//ps for t-texp
1244 Int_t channel=track->GetTOFCalChannel();
1245 Int_t volId[5]; //(sector, plate,strip,padZ,padX)
1246 AliTOFGeometry::GetVolumeIndices(channel,volId);
1248 if (isValidBeta[AliPID::kPion]){
1249 ((TH2F*)list->FindObject(Form("hExpTimePiVsStrip%s_%s",suffix.Data(),cLabel.Data())))->Fill((Int_t)GetStripIndex(volId),tofps-fTrkExpTimes[AliPID::kPion]);//ps
1250 ((TH1F*)list->FindObject(Form("hExpTimePi%s_%s",suffix.Data(),cLabel.Data())))->Fill(tofps-fTrkExpTimes[AliPID::kPion]);//ps
1251 ((TH2F*)list->FindObject(Form("hExpTimePiVsP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP, tofps-fTrkExpTimes[AliPID::kPion]);
1252 ((TH2F*)list->FindObject(Form("hTOFpidSigmaPi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt, (tofps-fTrkExpTimes[AliPID::kPion])/fSigmaSpecie[AliPID::kPion]);
1253 ((TH2F*)list->FindObject(Form("hExpTimePiT0SubVsP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP,tofps-fTrkExpTimes[AliPID::kPion]-timeZeroTOF);
1254 ((TH2F*)list->FindObject(Form("hExpTimePiVsOutPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,tofps-fTrkExpTimes[AliPID::kPion]-timeZeroTOF);
1256 if (ComputeTimeZeroByTOF1GeV()){
1257 if ((fPt>0.95)&&(fPt<1.05)){
1258 ((TH2F*)list->FindObject(Form("hExpTimePiT0Sub1GeV%s_%s",suffix.Data(),cLabel.Data())))->Fill(fMyTimeZeroTOFtracks,tofps-fMyTimeZeroTOF-fTrkExpTimes[AliPID::kPion]);
1263 if (isValidBeta[AliPID::kKaon]){
1264 ((TH2F*)list->FindObject(Form("hExpTimeKaVsP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP, tofps-fTrkExpTimes[AliPID::kKaon]);
1265 ((TH2F*)list->FindObject(Form("hTOFpidSigmaKa%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt, (tofps-fTrkExpTimes[AliPID::kKaon])/fSigmaSpecie[AliPID::kKaon]);
1266 ((TH2F*)list->FindObject(Form("hExpTimeKaT0SubVsP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP,tofps-fTrkExpTimes[AliPID::kKaon]-timeZeroTOF);
1267 ((TH2F*)list->FindObject(Form("hExpTimeKaVsOutPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,tofps-fTrkExpTimes[AliPID::kKaon]-timeZeroTOF);
1270 if (isValidBeta[AliPID::kProton]){
1271 ((TH2F*)list->FindObject(Form("hExpTimeProVsP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP, tofps-fTrkExpTimes[AliPID::kProton]);
1272 ((TH2F*)list->FindObject(Form("hTOFpidSigmaPro%s_%s",suffix.Data(),cLabel.Data())))->Fill(fPt, (tofps-fTrkExpTimes[AliPID::kProton])/fSigmaSpecie[AliPID::kProton]);
1273 ((TH2F*)list->FindObject(Form("hExpTimeProT0SubVsP%s_%s",suffix.Data(),cLabel.Data())))->Fill(fP,tofps-fTrkExpTimes[AliPID::kProton]-timeZeroTOF);
1274 ((TH2F*)list->FindObject(Form("hExpTimeProVsOutPhi%s_%s",suffix.Data(),cLabel.Data())))->Fill(fTPCOuterPhi,tofps-fTrkExpTimes[AliPID::kProton]-timeZeroTOF);
1277 // if (fEnableAdvancedCheck && (fPt<1.)) {
1278 // Double_t pos[3]={0.,0.,0.};
1279 // track->GetXYZAt(378.,5.,pos);
1280 // if ((pos[0]==0.)&&(pos[1]==0.)&&(pos[2]==0.))continue;
1282 // Double_t phiTOF=TMath::ATan2(pos[1],pos[0])*TMath::RadToDeg();
1283 // if (phiTOF<0) phiTOF+= (2*TMath::Pi()*TMath::RadToDeg());
1285 // //fill t-texp vs phi@TOF
1286 // if ((phiOuterTPC<=75) || ((phiOuterTPC>=125)&&(phiOuterTPC<=235)) || (phiOuterTPC>=305) ) { //TRD sectors 2012
1287 // if ( ((phiOuterTPC>=85)&&(phiOuterTPC<=115)) || ((phiOuterTPC>=245)&&(phiOuterTPC<=295)) ) {//no TRD sectors 2012
1291 //----------------------------------------------------------------------------------
1292 void AliAnalysisTaskTOFqaID::FillStartTimeHisto(TString suffix)
1294 //fill start time histo
1296 AliError("Invalid event object");
1299 // info from V0 detector QA
1300 AliESDVZERO * vzero = fESD->GetVZEROData();
1301 Float_t V0Atime = vzero->GetV0ATime();
1302 Float_t V0Ctime = vzero->GetV0CTime();
1303 ((TH2F*)fHlistTimeZero->FindObject(Form("hEventV0MeanVsVtx%s",suffix.Data())))->Fill((V0Atime-V0Ctime)*0.5,(V0Atime+V0Ctime)*0.5);
1305 // info from T0 detector QA
1306 for (Int_t j=0;j<3;j++){
1307 fT0[j]= (Float_t) fESD->GetT0TOF(j);//ps
1308 if (fT0[j]>90000.) fT0[j]=99999.;//fix old default values to the new one
1311 Float_t t0cut = 90000.;
1312 //Float_t t0cut =3 * t0spread; //use this cut to check t0 used in tof response
1313 // if(t0cut < 500) t0cut = 500;
1315 if(TMath::Abs(fT0[1]) < t0cut && TMath::Abs(fT0[2]) < t0cut ) {
1316 //&& TMath::Abs(fT0[2]-fT0[1]) < 500) //add this condition to check t0 used in tof response
1317 ((TH1F*)fHlistTimeZero->FindObject(Form("hT0DetRes%s",suffix.Data())))->Fill((fT0[2]-fT0[1])*0.5);
1318 ((TH1F*)fHlistTimeZero->FindObject(Form("hT0AC%s",suffix.Data())))->Fill(fT0[0]);
1319 ((TH2F*)fHlistTimeZero->FindObject(Form("hEventT0MeanVsVtx%s",suffix.Data())))->Fill((fT0[2]-fT0[1])*0.5,(fT0[2]+fT0[1])*0.5);
1321 if(TMath::Abs(fT0[1]) < t0cut){
1322 ((TH1F*)fHlistTimeZero->FindObject(Form("hT0A%s",suffix.Data())))->Fill(fT0[1]);
1324 if(TMath::Abs(fT0[2]) < t0cut){
1325 ((TH1F*)fHlistTimeZero->FindObject(Form("hT0C%s",suffix.Data())))->Fill(fT0[2]);
1328 // event timeZero QA via AliESDpid::SetTOFResponse()
1329 Double_t timeZero[4]={99999.,99999.,99999.,99999.};
1330 Double_t timeZeroRes[4]={99999.,99999.,99999.,99999.};
1332 TString timeZeroHisto[4]={"hT0fill","hT0TOF","hT0T0","hT0best"};
1333 TString timeZeroHistoRes[4]={"hT0fillRes","hT0TOFRes","hT0T0Res","hT0bestRes"};
1334 for (Int_t j=0;j<4;j++){
1335 timeZeroHisto[j].Append(suffix.Data());
1336 timeZeroHistoRes[j].Append(suffix.Data());
1337 fESDpid->SetTOFResponse(fESD, (AliESDpid::EStartTimeType_t) j);//(fill_t0, tof_t0, t0_t0, best_t0)
1338 timeZero[j]=fESDpid->GetTOFResponse().GetStartTime(10.); //timeZero for bin pT>10GeV/c
1339 timeZeroRes[j]=fESDpid->GetTOFResponse().GetStartTimeRes(10.); //timeZero for bin pT>10GeV/c
1340 ((TH1D*)(fHlistTimeZero->FindObject(timeZeroHisto[j].Data())))->Fill(timeZero[j]);
1341 ((TH1D*)(fHlistTimeZero->FindObject(timeZeroHistoRes[j].Data())))->Fill(timeZeroRes[j]);
1343 ((TH2F*)fHlistTimeZero->FindObject("hT0TOFvsNtrk"))->Fill(fNTOFtracks[0],timeZero[AliESDpid::kTOF_T0]);
1345 //response set to best_t0 by previous loop
1346 FillStartTimeMaskHisto(suffix.Data());
1350 //----------------------------------------------------------------------------------
1351 void AliAnalysisTaskTOFqaID::FillTrdHisto(AliESDtrack * track, Int_t charge)
1353 //fill histograms for TRD/noTRD
1355 AliError("Invalid track object");
1359 if (IsInTRD(track)){
1360 FillPrimaryTrkHisto(charge,"_Trd");
1361 if (IsTPCTOFMatched(track)) {
1362 FillMatchedTrkHisto(charge,"_Trd");
1363 FillPidHisto(track,charge, "_Trd");
1366 FillPrimaryTrkHisto(charge,"_noTrd");
1367 if (IsTPCTOFMatched(track)) {
1368 FillMatchedTrkHisto(charge,"_noTrd");
1369 FillPidHisto(track, charge, "_noTrd");
1374 //----------------------------------------------------------------------------------
1375 void AliAnalysisTaskTOFqaID::FillTofTrgHisto(TString suffix)
1377 //fills histo with trigger info
1378 if (!fHlistTrigger){
1379 AliError("Invalid TOF trigger list");
1383 AliWarning("Invalid AliTOFHeader object - cannot fill trg histo");
1387 Int_t nPad = fTOFHeader->GetNumberOfTOFclusters(); // tutti i pad di readout che hanno sparato
1388 Int_t nTrgPad = fTOFHeader->GetNumberOfTOFtrgPads();//i pad di readout che hanno sparato nella finesta di trigger
1389 Int_t nMaxiPad = fTOFHeader->GetNumberOfTOFmaxipad(); // numero di maxipad che hanno sparato
1391 // aggiornare un histo con le mappe di maxipad che hanno sparato
1392 AliTOFTriggerMask *trgMask = fTOFHeader->GetTriggerMask();
1393 for(Int_t j=0;j<72;j++){
1394 for(Int_t i=22;i>=0;i--){
1395 if(trgMask->IsON(j,i))
1396 ((TH1I*)fHlistTrigger->FindObject(Form("hTrgMap%s",suffix.Data())))->Fill(j+1,i+1);
1399 ((TH1I*)fHlistTrigger->FindObject(Form("hFiredMaxipad%s",suffix.Data())))->Fill(nMaxiPad);
1400 ((TH1I*)fHlistTrigger->FindObject(Form("hFiredReadoutPad%s",suffix.Data())))->Fill(nPad);
1401 ((TH1I*)fHlistTrigger->FindObject(Form("hFiredReadoutTrgPad%s",suffix.Data())))->Fill(nTrgPad);
1402 ((TH2I*)fHlistTrigger->FindObject(Form("hFiredMaxipadVsTrgPad%s",suffix.Data())))->Fill(nTrgPad,nMaxiPad);