From d99d5e309712806c4fc7842fb1974fb26217b8c3 Mon Sep 17 00:00:00 2001 From: kkanaki Date: Mon, 28 Mar 2011 16:04:24 +0000 Subject: [PATCH] - added centrality information and the vertex Z coordinate in the track THnSparse - created options for adjusting the size of the THnSparse depending on the beam type - removed the DCAr and DCAz of the HLT ESD (it is not the one we want to look at the way it is filled at the moment) - added new plots for the event properties, V0 centrality and multiplicity vs. number of contributors - added run info and date in the names of all canvases - added option to create and fill only those canvases with quantities filled by the CB task --- .../tasks/AliAnalysisTaskHLTCentralBarrel.cxx | 159 ++++--- .../tasks/AliAnalysisTaskHLTCentralBarrel.h | 14 +- HLT/QA/tasks/macros/drawTHnSparse.C | 399 ++++++++++-------- 3 files changed, 326 insertions(+), 246 deletions(-) diff --git a/HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.cxx b/HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.cxx index 556864e2931..b14ebe253b4 100644 --- a/HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.cxx +++ b/HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.cxx @@ -47,7 +47,7 @@ ClassImp(AliAnalysisTaskHLTCentralBarrel) AliAnalysisTaskHLTCentralBarrel::AliAnalysisTaskHLTCentralBarrel() :AliAnalysisTaskSE() ,fUseHLTTrigger(kFALSE) - ,fUseCentrality(kFALSE) + ,fCentrality() ,fBeamType() ,fOutputList(0) ,fEventOFF(0) @@ -69,7 +69,7 @@ AliAnalysisTaskHLTCentralBarrel::AliAnalysisTaskHLTCentralBarrel() AliAnalysisTaskHLTCentralBarrel::AliAnalysisTaskHLTCentralBarrel(const char *name) :AliAnalysisTaskSE(name) ,fUseHLTTrigger(kFALSE) - ,fUseCentrality(kFALSE) + ,fCentrality() ,fBeamType() ,fOutputList(0) ,fEventOFF(0) @@ -99,39 +99,50 @@ void AliAnalysisTaskHLTCentralBarrel::UserCreateOutputObjects(){ fOutputList = new TList(); fOutputList->SetOwner(); fOutputList->SetName(GetName()); - - static const int sizeEvent = 6; - - int binsEvent[sizeEvent] = { 50, 50, 250, 100, 100, 2 }; - double minEvent [sizeEvent] = { -1, -1, -30, 0, 0, 0 }; - double maxEvent [sizeEvent] = { 1, 1, 30, 10000, 10000, 2 }; - fEventHLT = CreateEventTHnSparse("fEventHLT",sizeEvent,binsEvent,minEvent,maxEvent); - fEventOFF = CreateEventTHnSparse("fEventOFF",sizeEvent,binsEvent,minEvent,maxEvent); + if(fBeamType.Contains("Pb")){ // in case of a Pb+Pb run the V0 centrality is added to the THnSparse + static const int sizeEvent = 7; + // 0 1 2 3 4 5 6 + // x y z #contr mult vertexStatus V0centrality + int binsEvent[sizeEvent] = { 100, 100, 60, 200, 200, 2, 100 }; // binning + double minEvent [sizeEvent] = { -1, -1, -20, 0, 3, 0, 0 }; // min x + double maxEvent [sizeEvent] = { 1, 1, 20, 2000, 2000, 2, 100 }; // max x + fEventHLT = CreateEventTHnSparse("fEventHLT",sizeEvent,binsEvent,minEvent,maxEvent); + fEventOFF = CreateEventTHnSparse("fEventOFF",sizeEvent,binsEvent,minEvent,maxEvent); + } + else { + static const int sizeEvent = 6; + // 0 1 2 3 4 5 + // x y z #contr mult vertexStatus + int binsEvent[sizeEvent] = { 100, 100, 60, 200, 200, 2 }; // binning + double minEvent [sizeEvent] = { -1, -1, -20, 0, 3, 0 }; // min x + double maxEvent [sizeEvent] = { 1, 1, 20, 2000, 2000, 2 }; // max x + fEventHLT = CreateEventTHnSparse("fEventHLT",sizeEvent,binsEvent,minEvent,maxEvent); + fEventOFF = CreateEventTHnSparse("fEventOFF",sizeEvent,binsEvent,minEvent,maxEvent); + } - if(fBeamType.Contains("Pb")){ - static const int sizeTrack = 15; - // pt TPCcl theta eta phi DCAr DCAz charge DCArSG DCAzSG ITScl mult vertex status vertexZ centrality - Int_t binsTrack[sizeTrack] = {1500, 200, 200, 200, 200, 800, 400, 3, 400, 400, 10, 2000, 2, 250, 100 }; - Double_t minTrack [sizeTrack] = { 0, 0, -1, -3, -1, -40, -100, -1.5, -100, -100, 0, 0, 0, -30, 0 }; - Double_t maxTrack [sizeTrack] = { 150, 200, 4, 3, 7, 40, 100, 1.5, 100, 100, 10, 20000, 2, -30, 100 }; - + if(fBeamType.Contains("Pb")){ // in case of a Pb+Pb run the V0 centrality is added to the THnSparse + static const int sizeTrack = 13; + // 0 1 2 3 4 5 6 7 8 9 10 11 12 + // pt TPCcl theta eta phi DCAr DCAz charge ITScl mult vertex status vertexZ V0centrality + Int_t binsTrack[sizeTrack] = { 200, 200, 200, 200, 200, 100, 100, 3, 10, 1000, 2, 60, 100 }; // binning + Double_t minTrack [sizeTrack] = { 0, 0, -1, -2, -1, -10, -10, -1.5, 0, 3, 0, -20, 0 }; // min x + Double_t maxTrack [sizeTrack] = { 5, 200, 4, 2, 7, 10, -10, 1.5, 10, 10000, 2, 20, 100 }; // max x fTrackHLT = CreateTrackTHnSparse("fTrackHLT",sizeTrack,binsTrack,minTrack,maxTrack); fTrackOFF = CreateTrackTHnSparse("fTrackOFF",sizeTrack,binsTrack,minTrack,maxTrack); } else { - static const int sizeTrack = 14; - // pt TPCcl theta eta phi DCAr DCAz charge DCArSG DCAzSG ITScl mult vertex status vertexZ - Int_t binsTrack[sizeTrack] = {1500, 200, 200, 200, 200, 800, 400, 3, 400, 400, 10, 1000, 2, 250 }; - Double_t minTrack [sizeTrack] = { 0, 0, -1, -3, -1, -40, -100, -1.5, -100, -100, 0, 0, 0, -30 }; - Double_t maxTrack [sizeTrack] = { 150, 200, 4, 3, 7, 40, 100, 1.5, 100, 100, 10, 10000, 2, -30 }; - + static const int sizeTrack = 12; + // 0 1 2 3 4 5 6 7 8 9 10 11 + // pt TPCcl theta eta phi DCAr DCAz charge ITScl mult vertex status vertexZ + Int_t binsTrack[sizeTrack] = {200, 200, 200, 200, 200, 100, 100, 3, 10, 1000, 2, 60 }; // binning + Double_t minTrack [sizeTrack] = { 0, 0, -1, -2, -1, -10, -10, -1.5, 0, 3, 0, -20 }; // min x + Double_t maxTrack [sizeTrack] = { 5, 200, 4, 2, 7, 10, 10, 1.5, 10, 10000, 2, 20 }; // max x fTrackHLT = CreateTrackTHnSparse("fTrackHLT",sizeTrack,binsTrack,minTrack,maxTrack); fTrackOFF = CreateTrackTHnSparse("fTrackOFF",sizeTrack,binsTrack,minTrack,maxTrack); } fTextBox = new TText(); - fOutputList->Add(fEventOFF); fOutputList->Add(fEventHLT); fOutputList->Add(fTrackOFF); @@ -178,22 +189,23 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){ Double_t bfield = esdOFF->GetMagneticField(); Int_t nr_tracksOFF = 0; - if(esdOFF->GetEventSpecie()==16) return; + if(esdOFF->GetEventSpecie()==16) return; // skip calibration events - AliCentrality *cent = esdOFF->GetCentrality(); - - for(Int_t i=0; iGetNumberOfTracks(); i++){ - AliESDtrack *esdTrackOFF = esdOFF->GetTrack(i); - if (!esdTrackOFF) continue; - if(!(esdTrackOFF->GetStatus()&AliESDtrack::kTPCin)) continue; - nr_tracksOFF++; + if(fBeamType.Contains("Pb")){ + fCentrality = esdOFF->GetCentrality(); + // this information is only available from the offline ESD for 2011, the V0 info was not stored in the HLTesd (23.03.11,Kelly) + if(!fCentrality){ + printf("Centrality pointer is empty\n"); + return; + } } - + for(Int_t i=0; iGetNumberOfTracks(); i++){ AliESDtrack *esdTrackOFF = esdOFF->GetTrack(i); if (!esdTrackOFF) continue; if(!(esdTrackOFF->GetStatus()&AliESDtrack::kTPCin)) continue; + nr_tracksOFF++; //DCA calculations(from offline) Double_t x[3]; @@ -212,10 +224,9 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){ dca[0]=-99; dca[1]=-99; } - //else ?????? why doesn't it work with pp???? esdTrackOFF->GetImpactParametersTPC(dca,cov); - Float_t DCAr =-99, DCAz = -99.; + //Float_t DCAr =-99, DCAz = -99.; if(fBeamType.Contains("Pb")){ Double_t trackOFF[] = { @@ -227,14 +238,14 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){ ,dca[0] ,dca[1] ,esdTrackOFF->Charge() - ,DCAr - ,DCAz + //,DCAr + //,DCAz ,esdTrackOFF->GetNcls(0) ,nr_tracksOFF ,vertOFF->GetStatus() ,vertOFF->GetZ() - ,cent->GetCentralityPercentile("V0M") - }; + ,fCentrality->GetCentralityPercentile("V0M") + }; if(fOptions.Contains("track-off")) fTrackOFF->Fill(trackOFF); } else { Double_t trackOFF[] = { @@ -246,8 +257,8 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){ ,dca[0] ,dca[1] ,esdTrackOFF->Charge() - ,DCAr - ,DCAz + //,DCAr + //,DCAz ,esdTrackOFF->GetNcls(0) ,nr_tracksOFF ,vertOFF->GetStatus() @@ -257,36 +268,35 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){ } } // end of track loop - Double_t eventOFF[] = { vertOFF->GetX(), vertOFF->GetY(), vertOFF->GetZ(), vertOFF->GetNContributors(), nr_tracksOFF, vertOFF->GetStatus()}; - if(fOptions.Contains("event-off")) fEventOFF->Fill(eventOFF); - - + if(fBeamType.Contains("Pb")){ + Double_t eventOFF[] = { vertOFF->GetX(), vertOFF->GetY(), vertOFF->GetZ(), vertOFF->GetNContributors(), nr_tracksOFF, vertOFF->GetStatus(),fCentrality->GetCentralityPercentile("V0M")}; + if(fOptions.Contains("event-off")) fEventOFF->Fill(eventOFF); + } + else { + Double_t eventOFF[] = { vertOFF->GetX(), vertOFF->GetY(), vertOFF->GetZ(), vertOFF->GetNContributors(), nr_tracksOFF, vertOFF->GetStatus()}; + if(fOptions.Contains("event-off")) fEventOFF->Fill(eventOFF); + } + // Inspite of the different options to fill event or track properties, all the loops are being executed. + // The options influence only whether the respective THnSparse is filled or not. + // Can definitely be improved to save processing time in unnecessary loops that won't fill anything at the end. //======================================== HLT ==========================================// Int_t nr_tracksHLT = 0; - if(esdHLT->GetEventSpecie()==16) return; - const AliESDVertex *vertHLT = esdHLT->GetPrimaryVertexTracks(); - - for(Int_t i=0; iGetNumberOfTracks(); i++){ - AliESDtrack *esdTrackHLT = esdHLT->GetTrack(i); - if (!esdTrackHLT) continue; - if(!(esdTrackHLT->GetStatus()&AliESDtrack::kTPCin)) continue; - nr_tracksHLT++; - } + if(esdHLT->GetEventSpecie()==16) return; // skip calibration events - Double_t eventHLT[] = { vertHLT->GetX(), vertHLT->GetY(), vertHLT->GetZ(), vertHLT->GetNContributors(), nr_tracksHLT, vertHLT->GetStatus()}; - if(fOptions.Contains("event-hlt")) fEventHLT->Fill(eventHLT); - + const AliESDVertex *vertHLT = esdHLT->GetPrimaryVertexTracks(); + for(Int_t i=0; iGetNumberOfTracks(); i++){ AliESDtrack *esdTrackHLT = esdHLT->GetTrack(i); if(!esdTrackHLT) continue; if(!(esdTrackHLT->GetStatus()&AliESDtrack::kTPCin)) continue; + nr_tracksHLT++; //DCA calculations - Float_t DCAr=-99; - Float_t DCAz=-99; + //Float_t DCAr=-99; // for the DCA of the HLTesd + //Float_t DCAz=-99; Float_t dca[2]; if(vertHLT->GetX()==0 && vertHLT->GetY()==0 && vertHLT->GetZ() ==0 ){ dca[0]=-99; @@ -296,7 +306,7 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){ //Calculating DCA "old" fashion esdTrackHLT->GetDZ(esdHLT->GetPrimaryVertex()->GetXv(), esdHLT->GetPrimaryVertex()->GetYv(), esdHLT->GetPrimaryVertex()->GetZv(), bfield, dca); // plotting the DCA calculated by Sergey - esdTrackHLT->GetImpactParametersTPC(DCAr,DCAz); + //esdTrackHLT->GetImpactParametersTPC(DCAr,DCAz); } if(fBeamType.Contains("Pb")){ @@ -309,13 +319,13 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){ ,dca[0] ,dca[1] ,esdTrackHLT->Charge() - ,DCAr - ,DCAz + //,DCAr + //,DCAz ,esdTrackHLT->GetNcls(0) ,nr_tracksHLT ,vertHLT->GetStatus() ,vertHLT->GetZ() - ,cent->GetCentralityPercentile("V0M") + ,fCentrality->GetCentralityPercentile("V0M") }; if(fOptions.Contains("track-hlt")) fTrackHLT->Fill(trackHLT); } else { @@ -328,8 +338,8 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){ ,dca[0] ,dca[1] ,esdTrackHLT->Charge() - ,DCAr - ,DCAz + //,DCAr + //,DCAz ,esdTrackHLT->GetNcls(0) ,nr_tracksHLT ,vertHLT->GetStatus() @@ -337,7 +347,17 @@ void AliAnalysisTaskHLTCentralBarrel::UserExec(Option_t *){ }; if(fOptions.Contains("track-hlt")) fTrackHLT->Fill(trackHLT); } - } // end of track loop + } // end of track loop + + if(fBeamType.Contains("Pb")){ + Double_t eventHLT[] = { vertHLT->GetX(), vertHLT->GetY(), vertHLT->GetZ(), vertHLT->GetNContributors(), nr_tracksHLT, vertHLT->GetStatus(),fCentrality->GetCentralityPercentile("V0M")}; + if(fOptions.Contains("event-hlt")) fEventHLT->Fill(eventHLT); + } + else{ + Double_t eventHLT[] = { vertHLT->GetX(), vertHLT->GetY(), vertHLT->GetZ(), vertHLT->GetNContributors(), nr_tracksHLT, vertHLT->GetStatus()}; + if(fOptions.Contains("event-hlt")) fEventHLT->Fill(eventHLT); + } + // Post output data. PostData(1, fOutputList); } @@ -356,6 +376,7 @@ THnSparseF* AliAnalysisTaskHLTCentralBarrel::CreateEventTHnSparse(const char* na thn->GetAxis(3)->SetTitle("number of contributors"); thn->GetAxis(4)->SetTitle("track multiplicity"); thn->GetAxis(5)->SetTitle("vertex status"); + if(fBeamType.Contains("Pb")) thn->GetAxis(6)->SetTitle("V0 centrality"); return thn; } @@ -371,9 +392,9 @@ THnSparseF* AliAnalysisTaskHLTCentralBarrel::CreateTrackTHnSparse(const char* na thn->GetAxis(5)->SetTitle("DCAr"); thn->GetAxis(6)->SetTitle("DCAz"); thn->GetAxis(7)->SetTitle("polarity"); - thn->GetAxis(8)->SetTitle("DCArSG"); - thn->GetAxis(9)->SetTitle("DCAzSG"); - thn->GetAxis(10)->SetTitle("ITS clusters/track"); + //thn->GetAxis(8)->SetTitle("DCArSG"); + //thn->GetAxis(9)->SetTitle("DCAzSG"); + thn->GetAxis(8)->SetTitle("ITS clusters/track"); return thn; } diff --git a/HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.h b/HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.h index e96d8d1d0e8..1028d70aead 100644 --- a/HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.h +++ b/HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.h @@ -18,6 +18,7 @@ class TList; class TText; class TString; class AliESDEvent; +class AliCentrality; #include "THnSparse.h" #include "AliAnalysisTaskSE.h" @@ -37,8 +38,6 @@ class AliAnalysisTaskHLTCentralBarrel : public AliAnalysisTaskSE { // function to select only HLT triggered events //void SetUseHLTTriggerDecision(Bool_t useHLT = kFALSE) { fUseHLTTrigger = useHLT; } - // function to select centrality - void SetUseCentrality(Bool_t useCentrality = kFALSE) { fUseCentrality = useCentrality; } // function to set the beam type void SetBeamType(TString beamType) { fBeamType = beamType; } // function to create the THnSparse and name the axis @@ -57,9 +56,9 @@ class AliAnalysisTaskHLTCentralBarrel : public AliAnalysisTaskSE { /** assignment operator */ AliAnalysisTaskHLTCentralBarrel& operator=(const AliAnalysisTaskHLTCentralBarrel&); - Bool_t fUseHLTTrigger; // Use HLT Trigger Decision - Bool_t fUseCentrality; // Include centrality - TString fBeamType; // beam type, p-p, Pb-Pb, No beam + Bool_t fUseHLTTrigger; // Use HLT Trigger Decision + AliCentrality *fCentrality; // Centrality holder + TString fBeamType; // beam type: p-p, Pb-Pb, No beam TList *fOutputList; // list of output THnSparse objects @@ -69,9 +68,8 @@ class AliAnalysisTaskHLTCentralBarrel : public AliAnalysisTaskSE { THnSparse *fTrackOFF; //! offline track properties THnSparse *fTrackHLT; //! HLT track properties - TString fOptions; //! - - TText *fTextBox; //! TText box + TString fOptions; //! options for filling event and/or track properties for hlt and/or offline + TText *fTextBox; //! TText box containing run number info and date ClassDef(AliAnalysisTaskHLTCentralBarrel, 0); }; diff --git a/HLT/QA/tasks/macros/drawTHnSparse.C b/HLT/QA/tasks/macros/drawTHnSparse.C index 7da3aa14401..3a3f6a2d692 100644 --- a/HLT/QA/tasks/macros/drawTHnSparse.C +++ b/HLT/QA/tasks/macros/drawTHnSparse.C @@ -3,7 +3,7 @@ * Drawing macro for reading the THnSparse output of the * HLT/QA/tasks/AliAnalysisTaskHLTCentralBarrel.cxx task. * - * The cuts are user defined in lines 167-168 as arguments of the + * The cuts are user defined in lines 188-190 as arguments of the * function cutStsudies(...). * * The input file contains information about the run number @@ -41,16 +41,11 @@ #include "TLegend.h" #include "TStyle.h" #include "TPad.h" - #include -//#include #include - -//using std::stringstream; using std::endl; #endif - //---------- forward declerations ---------------// TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder, @@ -62,21 +57,24 @@ TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder, double minDCAz, double maxDCAz, int minTPCclus, int maxTPCclus, int minITSclus, int maxITSclus, - int vertexStatus + int vs, float vz, + float minCent, float maxCent ); void printStats(TH1D *hlt, TH1D *off); void defineYaxisMax(TH1D *hlt, TH1D *off); void printLegend(TLegend *l, TH1D *hlt, TH1D *off); -void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* hText, TH1D *hlt, TH1D *off, TLegend *l, int size); -void plot2D(TCanvas* can, THnSparse* h, - double minEta, double maxEta, - double minPt, double maxPt, - double minDCAr, double maxDCAr, - double minDCAz, double maxDCAz, - int minTPCclus, int maxTPCclus, - int minITSclus, int maxITSclus, - int minTrackMult, int maxTrackMult - ); +void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* hText, TH1D *hlt, TH1D *off, TLegend *l); +void plot2D( TCanvas* can, THnSparse* h, + double minEta, double maxEta, + double minPt, double maxPt, + double minDCAr, double maxDCAr, + double minDCAz, double maxDCAz, + int minTPCclus, int maxTPCclus, + int minITSclus, int maxITSclus, + int minTrackMult, int maxTrackMult, + int vs, float vz, + float minCent, float maxCent + ); void plotEventQuantities(TCanvas* can, THnSparse* heventHLT, THnSparse* heventOFF, TText* hText); TString fix1DTitle(const char* c); TString fix2DTitle(const char* c1, const char* c2); @@ -87,9 +85,10 @@ TString cutsToString( double minEta, double maxEta, int minTPCclus, int maxTPCclus, int minITSclus, int maxITSclus, int minTrackMult, int maxTrackMult, - int VS + int vs, float vz + //float minCent, float maxCent ); -void plotTrackQuantities( TCanvas* can, THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText, +void plotTrackQuantities( TCanvas* can, THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText, double minEta, double maxEta, double minPt, double maxPt, double minDCAr, double maxDCAr, @@ -97,18 +96,20 @@ void plotTrackQuantities( TCanvas* can, THnSparse* htrackHLT, THnSparse* htrackO int minTPCclus, int maxTPCclus, int minITSclus, int maxITSclus, int minTrackMult, int maxTrackMult, - int VS + int vs, float vz, + float minCent, float maxCent ); vector outputNames; //------------------------------------------------------------------// -void drawTHnSparse(TString inputFile){ +void drawTHnSparse(TString inputFile="HLT-OFFLINE-CentralBarrel-comparison.root"){ gROOT->SetStyle("Plain"); gStyle->SetPalette(1); gStyle->SetOptStat(10); + gStyle->SetTitleX(gStyle->GetPadLeftMargin()); TH1::AddDirectory(kFALSE); TFile *file = TFile::Open(inputFile); @@ -116,20 +117,20 @@ void drawTHnSparse(TString inputFile){ printf("Error: No file %s in folder.\n", inputFile.Data()); return; } - TList *list = static_cast(file->Get("esd_thnsparse")); if(!list){ printf("Error: No List contained in file %s.\n", inputFile.Data()); return; } - THnSparseF *heventHLT = (THnSparseF*)list->FindObject("fEventHLT"); if(!heventHLT){ printf("Error: There is no HLT THnSparse object in file %s\n", inputFile.Data()); + return; } THnSparseF *heventOFF = (THnSparseF*)list->FindObject("fEventOFF"); if(!heventOFF){ printf("Error: There is no OFF THnSparse object in file %s\n", inputFile.Data()); + return; } THnSparseF *htrackHLT = (THnSparseF*)list->FindObject("fTrackHLT"); if(!htrackHLT){ @@ -145,8 +146,6 @@ void drawTHnSparse(TString inputFile){ TText *hText = (TText*)list->FindObject("text"); if(!hText) printf("No hText\n"); - TString t = "event properties for "; - t+=hText->GetTitle(); TString folder = hText->GetTitle(); folder.ReplaceAll(" ",""); @@ -154,65 +153,90 @@ void drawTHnSparse(TString inputFile){ folder.Remove(6,15); gSystem->Exec("mkdir "+folder); + TString canvasTitle =""; - TCanvas *can0 = new TCanvas("can0",t, 900,600); can0->Divide(3,2); - TCanvas *can1 = new TCanvas("can1","track properties", 1100,900); can1->Divide(4,3); - TCanvas *can2 = new TCanvas("can2","2-D HLT track correlations",1200,800); can2->Divide(4,2); - TCanvas *can3 = new TCanvas("can3","2-D OFF track correlations",1200,800); can3->Divide(4,2); - - plotEventQuantities(can0,heventHLT,heventOFF,hText); - can0->SaveAs(folder+"/event_properties.root"); - can0->SaveAs(folder+"/event_properties.png"); - - TString s = ""; // eta mult pt DCAr DCAz TPCclus ITSclus vertexStatus - s = cutStudies(can1, can2, can3, folder, htrackHLT, htrackOFF, hText, -2, 2, 0, 20000, 0, 200, -20, 20, -20, 20, 0, 200, 0, 6, 2); outputNames.push_back(s); - //s = cutStudies(can1, can2, can3, folder, htrackHLT, htrackOFF, hText, -2, 2, 0, 20000, 0, 200, -20, 20, -20, 20, 0, 200, 1, 6, 2); outputNames.push_back(s); - - TCanvas *ov = new TCanvas("ov","overlaid histograms of track properties",1100,900); - ov->Divide(4,3); - - TCanvas *ca[outputNames.size()]; - TFile *ff[outputNames.size()]; - TPad *pad[12]; - TH1D *g[outputNames.size()]; + if(heventHLT->GetEntries()>0 || heventOFF->GetEntries()>0){ + // create and fill the canvas only if the respective THnSparse with event properties has been filled + canvasTitle = "event properties for "; + canvasTitle+=hText->GetTitle(); + TCanvas *can0 = new TCanvas("can0",canvasTitle, 900,600); + can0->Divide(4,2); + plotEventQuantities(can0,heventHLT,heventOFF,hText); + can0->SaveAs(folder+"/event_properties.root"); + can0->SaveAs(folder+"/event_properties.png"); + } - for(int j=1; j<12; j++){ // not 13, last pad is empty (TODO) - for(UInt_t i=0; iIsZombie()){ - printf("Non-existent, corrupted or zombie file %s\n", outputNames[i].Data()); - return; - } - ca[i] = (TCanvas*)ff[i]->GetObjectUnchecked("can1"); - if(!ca[i]){ - printf("Empty canvas in file %s.\n", outputNames[i].Data()); - continue; - } - pad[j] = (TPad*)ca[i]->GetListOfPrimitives()->FindObject(Form("can1_%d",j)); - if(!pad[j]){ - printf("Empty pad in canvas %s.\n", ca[i]->GetName()); - continue; - } - g[i] =(TH1D*)pad[j]->FindObject(Form("fTrackHLT_proj_%d",j-1)); - if(!g[i]){ - printf("Empty histogram for i=%d, file %s.\n", i, outputNames[i].Data()); - continue; - } + if(htrackHLT->GetEntries()>0 || htrackOFF->GetEntries()>0){ + // create and fill the canvas only if the respective THnSparse with track properties has been filled + canvasTitle = "track properties for "; + canvasTitle+=hText->GetTitle(); + TCanvas *can1 = new TCanvas("can1",canvasTitle,1100,900); can1->Divide(3,3); // the first 9 variables filled in the THnSparse + + canvasTitle = "2-D HLT track distributions for "; + canvasTitle+=hText->GetTitle(); + TCanvas *can2 = new TCanvas("can2",canvasTitle,1200,800); can2->Divide(4,2); + + canvasTitle = "2-D OFF track distributions for "; + canvasTitle+=hText->GetTitle(); + TCanvas *can3 = new TCanvas("can3",canvasTitle,1200,800); can3->Divide(4,2); + + int counter=0; + // counts how many times the function cutStudies() is called + // if more than once, then it creates and fills the canvas with the overlapping hlt distributions for the various sets of cuts + + TString s = ""; // eta mult pt DCAr DCAz TPCclus ITSclus vertexStatus vertexZ + s = cutStudies(can1, can2, can3, folder, htrackHLT, htrackOFF, hText, -1, 1, 0, 2000, 0, 5, -10, 10, -10, 10, 0, 200, 0, 6, 2, 10, 0, 100); outputNames.push_back(s); counter++; + + if(counter>=2){ - ov->cd(j); - if(i==0) g[i]->Draw(); - else { - g[i]->SetLineColor(i+1); - defineYaxisMax(g[0], g[i]); - g[i]->Draw("sames"); - } - ff[i]->Close(); - } - } + canvasTitle = "overlaid HLT track distributions for "; + canvasTitle+=hText->GetTitle(); + TCanvas *ov = new TCanvas("ov",canvasTitle,1100,900); + ov->Divide(3,3); + + TCanvas *ca; TFile *ff; TPad *pad; + TH1D *g[outputNames.size()]; + + for(int j=1; j<10; j++){// loop over the pads of the canvas "ov" with dimension 3x3 + for(UInt_t i=0; iIsZombie()){ + printf("Non-existent, corrupted or zombie file %s\n", outputNames[i].Data()); + return; + } + ca = (TCanvas*)ff->GetObjectUnchecked("can1"); + if(!ca){ + printf("Empty canvas in file %s.\n", outputNames[i].Data()); + continue; + } + pad = (TPad*)ca->GetListOfPrimitives()->FindObject(Form("can1_%d",j)); + if(!pad){ + printf("Empty pad in canvas %s.\n", ca->GetName()); + continue; + } + g[i] =(TH1D*)pad->FindObject(Form("fTrackHLT_proj_%d",j-1)); + if(!g[i]){ + printf("Empty histogram for i=%d, file %s.\n", i, outputNames[i].Data()); + continue; + } + ov->cd(j); + if(i==0) g[i]->Draw(); + else { + g[i]->SetLineColor(i+1); + defineYaxisMax(g[0], g[i]); + g[i]->Draw("sames"); + } + ff->Close(); + } + } + } + } file->Close(); } +// ============== main function for filling the track properties, 1D and 2D ================ // + TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder, THnSparse* htrackHLT, THnSparse* htrackOFF, TText* hText, double minEta, double maxEta, @@ -222,18 +246,20 @@ TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder, double minDCAz, double maxDCAz, int minTPCclus, int maxTPCclus, int minITSclus, int maxITSclus, - int vertexStatus - ) -{ + int vs, float vz, + float minCent, float maxCent + ){ plotTrackQuantities(can1, htrackHLT, htrackOFF, hText, - minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus); + minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vs, vz, + minCent, maxCent); - plot2D(can2, htrackHLT, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult); - - plot2D(can3, htrackOFF, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult); + plot2D(can2, htrackHLT, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vs, vz, + minCent, maxCent); + plot2D(can3, htrackOFF, minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vs, vz, + minCent, maxCent); TString cuts = cutsToString(minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, - minITSclus, maxITSclus, minTrackMult, maxTrackMult, vertexStatus); + minITSclus, maxITSclus, minTrackMult, maxTrackMult, vs, vz); can1->SaveAs(folder+"/track_properties_"+cuts+".root"); can1->SaveAs(folder+"/track_properties_"+cuts+".png"); @@ -245,35 +271,7 @@ TString cutStudies( TCanvas* can1, TCanvas* can2, TCanvas* can3, TString folder, return folder+"/track_properties_"+cuts+".root"; } -void printStats(TH1D *hlt, TH1D *off){ - gPad->Update(); - TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats"); - st1->SetLineColor(0); - - gPad->Update(); - TPaveStats *st2 = (TPaveStats*)off->FindObject("stats"); - st2->SetY2NDC(st1->GetY1NDC()-0.05); - st2->SetY1NDC(st2->GetY2NDC()-TMath::Abs(st1->GetY1NDC()-st1->GetY2NDC())); - st2->SetLineColor(0); - st2->SetTextColor(off->GetLineColor()); - st2->SetFillStyle(0); - st2->Draw(); -} - -void defineYaxisMax(TH1D *hlt, TH1D *off){ - if(hlt->GetMaximum() > off->GetMaximum()) off->SetMaximum(1.1*hlt->GetMaximum()); - else hlt->SetMaximum(1.1*off->GetMaximum()); -} - -void printLegend(TLegend *l, TH1D *hlt, TH1D *off){ - l->SetFillColor(10); - l->SetLineColor(10); - l->AddEntry(hlt, "HLT", "l"); - l->AddEntry(off, "OFF", "l"); - l->Draw("same"); -} - -//====================== for 1D distributions ===============================// +//====================== for 1D track distributions ===============================// void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, TH1D *hlt, TH1D *off, TLegend *l, int size, double minEta, double maxEta, @@ -283,7 +281,8 @@ void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, T int minTPCclus, int maxTPCclus, int minITSclus, int maxITSclus, int minTrackMult, int maxTrackMult, - int VS + int vs, float vz, + float minCent, float maxCent ) { hHLT->GetAxis(0)->SetRangeUser(minPt,maxPt); @@ -291,23 +290,27 @@ void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, T hHLT->GetAxis(3)->SetRangeUser(minEta, maxEta); hHLT->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr); hHLT->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz); - hHLT->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus); - hHLT->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult); - if(VS!=2) hHLT->GetAxis(12)->SetRangeUser(VS,VS); + hHLT->GetAxis(8)->SetRangeUser(minITSclus, maxITSclus); + hHLT->GetAxis(9)->SetRangeUser(minTrackMult, maxTrackMult); + if(vs!=2) hHLT->GetAxis(10)->SetRangeUser(vs,vs); + hHLT->GetAxis(11)->SetRangeUser(-TMath::Abs(vz), TMath::Abs(vz)); + if(hHLT->GetNdimensions()==13) hHLT->GetAxis(12)->SetRangeUser(minCent, maxCent); hOFF->GetAxis(0)->SetRangeUser(minPt,maxPt); hOFF->GetAxis(1)->SetRangeUser(minTPCclus,maxTPCclus); hOFF->GetAxis(3)->SetRangeUser(minEta, maxEta); hOFF->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr); hOFF->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz); - hOFF->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus); - hOFF->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult); - if(VS!=2) hOFF->GetAxis(12)->SetRangeUser(VS,VS); + hOFF->GetAxis(8)->SetRangeUser(minITSclus, maxITSclus); + hOFF->GetAxis(9)->SetRangeUser(minTrackMult, maxTrackMult); + if(vs!=2) hOFF->GetAxis(10)->SetRangeUser(vs,vs); + hOFF->GetAxis(11)->SetRangeUser(-TMath::Abs(vz), TMath::Abs(vz)); + if(hOFF->GetNdimensions()==13) hOFF->GetAxis(12)->SetRangeUser(minCent, maxCent); for(int i=0; iProjection(i); if(!hlt){ printf("plotAid: empty HLT histogram\n"); continue; } - off = hOFF->Projection(i); if(!off){ printf("plotAid: empty OFF histogram\n"); continue; } + hlt = hHLT->Projection(i); if(!hlt){ printf("plotAid for track properties: empty HLT histogram\n"); continue; } + off = hOFF->Projection(i); if(!off){ printf("plotAid for track properties: empty OFF histogram\n"); continue; } hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle())); @@ -346,23 +349,25 @@ void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, T s=""; s+=minDCAz; s+=" < DCAz (cm) < "; s+=maxDCAz; pave->AddText(s); s=""; s+=minTPCclus; s+=" < TPC clusters/track < "; s+=maxTPCclus; pave->AddText(s); s=""; s+=minITSclus; s+=" < ITS clusters/track < "; s+=maxITSclus; pave->AddText(s); - if(VS!=2) { s=""; s+="vertex status "; s+=VS; pave->AddText(s); } + if(vs!=2) { s=""; s+="vertex status "; s+=vs; pave->AddText(s); } pave->Draw(); can->Update(); } } } -//====================== for 2D distributions ===============================// +//====================== for 2D track distributions ===============================// -void plot2D(TCanvas* can, THnSparse* h, +void plot2D(TCanvas* can, THnSparse* h, double minEta, double maxEta, double minPt, double maxPt, double minDCAr, double maxDCAr, double minDCAz, double maxDCAz, int minTPCclus, int maxTPCclus, int minITSclus, int maxITSclus, - int minTrackMult, int maxTrackMult + int minTrackMult, int maxTrackMult, + int vs, float vz, + float minCent, float maxCent ) { h->GetAxis(0)->SetRangeUser(minPt,maxPt); @@ -370,11 +375,14 @@ void plot2D(TCanvas* can, THnSparse* h, h->GetAxis(3)->SetRangeUser(minEta, maxEta); h->GetAxis(5)->SetRangeUser(minDCAr, maxDCAr); h->GetAxis(6)->SetRangeUser(minDCAz, maxDCAz); - h->GetAxis(10)->SetRangeUser(minITSclus, maxITSclus); - h->GetAxis(11)->SetRangeUser(minTrackMult, maxTrackMult); + h->GetAxis(8)->SetRangeUser(minITSclus, maxITSclus); + h->GetAxis(9)->SetRangeUser(minTrackMult, maxTrackMult); + if(vs!=2) h->GetAxis(10)->SetRangeUser(vs,vs); + h->GetAxis(11)->SetRangeUser(-TMath::Abs(vz), TMath::Abs(vz)); + if(h->GetNdimensions()==13) h->GetAxis(12)->SetRangeUser(minCent, maxCent); can->cd(1); - TH2D *ht = h->Projection(1,0); + TH2D *ht = h->Projection(1,0); // TPC clusters/track vs. pt ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(0)->GetTitle())); TString s = ""; @@ -383,77 +391,99 @@ void plot2D(TCanvas* can, THnSparse* h, ht->Draw("colz"); can->cd(2); - ht = h->Projection(1,3); + ht = h->Projection(1,3); // TPC clusters/track vs. eta ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(3)->GetTitle())); ht->Draw("colz"); can->cd(3); - ht = h->Projection(1,5); + ht = h->Projection(1,5); // TPC clusters/track vs. DCAr ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(5)->GetTitle())); s = fix1DTitle(h->Projection(5)->GetTitle())+" (cm)"; ht->SetXTitle(s); ht->Draw("colz"); can->cd(4); - ht = h->Projection(1,6); + ht = h->Projection(1,6); // TPC clusters/track vs. DCAz ht->SetTitle(fix2DTitle(h->Projection(1)->GetTitle(), h->Projection(6)->GetTitle())); s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)"; ht->SetXTitle(s); ht->Draw("colz"); can->cd(5); - ht = h->Projection(6,0); - ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(0)->GetTitle())); + ht = h->Projection(5,0); // DCAr vs. pt + ht->SetTitle(fix2DTitle(h->Projection(5)->GetTitle(), h->Projection(0)->GetTitle())); s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)"; ht->SetXTitle(s); - s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)"; + s = fix1DTitle(h->Projection(5)->GetTitle())+" (cm)"; ht->SetYTitle(s); ht->Draw("colz"); can->cd(6); - ht = h->Projection(6,3); + ht = h->Projection(6,3); // DCAz vs. pt ht->SetTitle(fix2DTitle(h->Projection(6)->GetTitle(), h->Projection(3)->GetTitle())); s = fix1DTitle(h->Projection(6)->GetTitle())+" (cm)"; ht->SetYTitle(s); ht->Draw("colz"); can->cd(7); - ht = h->Projection(3,0); + ht = h->Projection(3,0); // eta vs. pt ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(0)->GetTitle())); s = fix1DTitle(h->Projection(0)->GetTitle())+" (GeV/c)"; ht->SetXTitle(s); ht->Draw("colz"); can->cd(8); - ht = h->Projection(3,4); + ht = h->Projection(3,4); // eta vs. phi ht->SetTitle(fix2DTitle(h->Projection(3)->GetTitle(), h->Projection(4)->GetTitle())); s = fix1DTitle(h->Projection(4)->GetTitle())+" (rad)"; ht->SetXTitle(s); ht->Draw("colz"); } -void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, TH1D *hlt, TH1D *off, TLegend *l, int size){ - - for(int i=0; iProjection(i); - off = hOFF->Projection(i); - hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle())); - TString s = hlt->GetTitle(); - if(s.Contains("primary")){ - s+=" (cm)"; - hlt->SetXTitle(s); - } +// ================== for event properties ==================== // + +void plotAid(TCanvas* can, THnSparse* hHLT, THnSparse* hOFF, TText* /*hText*/, TH1D *hlt, TH1D *off, TLegend *l){ + + int size=0; + if(hHLT->GetNdimensions()==6 || hOFF->GetNdimensions()==6) size = 6; + else size = 7; + for(int i=0; iGetAxis(5)->SetRangeUser(1,1); // select events with found primary vertex + hOFF->GetAxis(5)->SetRangeUser(1,1); - defineYaxisMax(hlt, off); - off->SetLineColor(2); + hlt = hHLT->Projection(i); if(!hlt){ printf("plotAid for event properties: empty HLT histogram\n"); continue; } + off = hOFF->Projection(i); if(!off){ printf("plotAid for event properties: empty OFF histogram\n"); continue; } + hlt->SetTitle(fix1DTitle(hHLT->Projection(i)->GetTitle())); + off->SetTitle(fix1DTitle(hOFF->Projection(i)->GetTitle())); + TString s = hlt->GetTitle(); + if(s.Contains("primary")){ + s+=" (cm)"; + hlt->SetXTitle(s); + off->SetXTitle(s); + } + + defineYaxisMax(hlt, off); + off->SetLineColor(2); + + can->cd(i+1); + hlt->Draw(); + off->Draw("sames"); + printStats(hlt, off); - can->cd(i+1); - hlt->Draw(); - off->Draw("sames"); - printStats(hlt, off); - - if(i==0) printLegend(l,hlt,off); - } + if(i==0) printLegend(l,hlt,off); + } + can->cd(7); + TH2D *h = hHLT->Projection(3,4); + TString s1 = fix2DTitle(hHLT->Projection(3)->GetTitle(), hHLT->Projection(4)->GetTitle()); s1+=" (HLT)"; + h->SetTitle(s1); + h->Draw("colz"); + + can->cd(8); + TH2D *o = hOFF->Projection(3,4); + TString s2 = fix2DTitle(hOFF->Projection(3)->GetTitle(), hOFF->Projection(4)->GetTitle()); s2+=" (OFF)"; + o->SetTitle(s2); + o->Draw("colz"); } void plotEventQuantities(TCanvas* can, THnSparse* heventHLT, THnSparse* heventOFF, TText* hText){ @@ -463,7 +493,7 @@ void plotEventQuantities(TCanvas* can, THnSparse* heventHLT, THnSparse* heventOF TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8); - plotAid(can, heventHLT, heventOFF, hText, hlt, off, leg1, 6); + plotAid(can, heventHLT, heventOFF, hText, hlt, off, leg1); return; } @@ -475,15 +505,17 @@ void plotTrackQuantities( TCanvas* can, THnSparse* htrackHLT, THnSparse* htrackO int minTPCclus, int maxTPCclus, int minITSclus, int maxITSclus, int minTrackMult, int maxTrackMult, - int VS + int vs, float vz, + float minCent, float maxCent ) { TH1D *hlt = NULL; TH1D *off = NULL; TLegend *leg1 = new TLegend(0.6,0.6,0.8,0.8); - plotAid(can, htrackHLT, htrackOFF, hText, hlt, off, leg1, 11, - minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, VS); + + plotAid(can, htrackHLT, htrackOFF, hText, hlt, off, leg1, 9, + minEta, maxEta, minPt, maxPt, minDCAr, maxDCAr, minDCAz, maxDCAz, minTPCclus, maxTPCclus, minITSclus, maxITSclus, minTrackMult, maxTrackMult, vs, vz, minCent, maxCent); return; } @@ -505,18 +537,47 @@ TString cutsToString( double minEta, double maxEta, int minTPCclus, int maxTPCclus, int minITSclus, int maxITSclus, int minTrackMult, int maxTrackMult, - int VS + int vs, float vz +// float minCent, float maxCent ) { TString cuts = ""; - char s[300]; sprintf(s, "eta%2g_%2g_Pt%2g_%2g_TM%d_%d_DCAr%2g_%2g_DCAz%2g_%2g_TPCclus%d_%d_ITSclus%d_%d", - minEta,maxEta,minPt,maxPt,minTrackMult,maxTrackMult,minDCAr,maxDCAr,minDCAz,maxDCAz,minTPCclus,maxTPCclus,minITSclus,maxITSclus); + char s[300]; sprintf(s, "eta%2g_%2g_Pt%2g_%2g_TM%d_%d_DCAr%2g_%2g_DCAz%2g_%2g_TPCclus%d_%d_ITSclus%d_%d_Zvertex%2g", + minEta,maxEta,minPt,maxPt,minTrackMult,maxTrackMult,minDCAr,maxDCAr,minDCAz,maxDCAz,minTPCclus,maxTPCclus,minITSclus,maxITSclus,vz); cuts = s; cuts.ReplaceAll(" ",""); - if(VS!=2){ + if(vs!=2){ char v[10]; - sprintf(v, "_VS%d",VS); + sprintf(v, "_VS%d",vs); cuts+=v; } return cuts; } + +void printStats(TH1D *hlt, TH1D *off){ + gPad->Update(); + TPaveStats *st1 = (TPaveStats*)hlt->FindObject("stats"); + st1->SetLineColor(0); + + gPad->Update(); + TPaveStats *st2 = (TPaveStats*)off->FindObject("stats"); + st2->SetY2NDC(st1->GetY1NDC()-0.05); + st2->SetY1NDC(st2->GetY2NDC()-TMath::Abs(st1->GetY1NDC()-st1->GetY2NDC())); + st2->SetLineColor(0); + st2->SetTextColor(off->GetLineColor()); + st2->SetFillStyle(0); + st2->Draw(); +} + +void defineYaxisMax(TH1D *hlt, TH1D *off){ + if(hlt->GetMaximum() > off->GetMaximum()) off->SetMaximum(1.1*hlt->GetMaximum()); + else hlt->SetMaximum(1.1*off->GetMaximum()); +} + +void printLegend(TLegend *l, TH1D *hlt, TH1D *off){ + l->SetFillColor(10); + l->SetLineColor(10); + l->AddEntry(hlt, "HLT", "l"); + l->AddEntry(off, "OFF", "l"); + l->Draw("same"); +} -- 2.43.0