//=====================================================// //Macro that reads the output of the flow analysis and //retrieves the QC and the MH containers. //The macro produces an output called outputMH.root //that contains the four histograms related to the //3 particle correlator and the two integrated v2{2,QC} //and v2{4,QC} //Author: Panos.Christakoglou@cern.ch const Int_t nCentralityBins = 9; TString strCentralityBins[nCentralityBins] = {"0-5","5-10","10-20", "20-30","30-40","40-50", "50-60","60-70","70-80"}; void plotMHCentrality(const char* filename = "AnalysisResults.root", const char* systemType = "PbPb", Bool_t isPID = kTRUE, Int_t charge = 1) { gStyle->SetPalette(1,0); //---------------------------------------------------------- // >>>>>>>>>>> Load libraries <<<<<<<<<<<<<< //---------------------------------------------------------- gSystem->AddIncludePath("-I$ROOTSYS/include"); gSystem->Load("libGeom"); gSystem->Load("libVMC"); gSystem->Load("libXMLIO"); gSystem->Load("libPhysics"); gSystem->AddIncludePath("-I$ALICE_ROOT/include"); gSystem->Load("libANALYSIS.so"); gSystem->Load("libANALYSISalice.so"); gSystem->Load("libPWGflowBase.so"); gSystem->Load("libPWGflowTasks.so"); AliFlowTrackCuts::PIDsource sourcePID = AliFlowTrackCuts::kTOFbayesian; AliPID::EParticleType particleType=AliPID::kPion; //---------------------------------------------------------- // >>>>>>>>>>> Open file - Get objects <<<<<<<<<<<<<< //---------------------------------------------------------- TFile *fInput = TFile::Open(filename); if(!fInput) { Printf("File not found!!!"); break; } //fInput->ls(); //Get the TList of the MH TList *listMH = GetMHResults(fInput,systemType,isPID, sourcePID,particleType,charge); //Get the TList of the QC TList *listQC = GetQCResults(fInput,systemType,isPID, sourcePID,particleType,charge); //Get the TList of the SP //TList *listSP = GetSPResults(fInput,systemType,isPID, //sourcePID,particleType,charge); TFile *fOutput = TFile::Open("outputMH.root","recreate"); listMH->Write(); listQC->Write(); listSP->Write(); fOutput->Close(); } //____________________________________________________________// TList *GetSPResults(TFile *fInput, const char* systemType = 0x0, Bool_t isPID = kTRUE, AliFlowTrackCuts::PIDsource sourcePID = AliFlowTrackCuts::kTOFbayesian, AliPID::EParticleType particleType=AliPID::kPion, Int_t charge = 0) { //Function that reads the TDirectoryFile of the MH //and returns a TList with the relevant plots. TList *listOutput = new TList(); listOutput->SetName("listSP"); //______________________________________________________________// //Global variables AliFlowCommonHistResults *commonHistRes; TString gAliFlowCommonHistName; //______________________________________________________________// //Get the TDirectoryFile TString directoryNameSP = 0; directoryNameSP = "outputSPanalysis"; TDirectoryFile *outputSPanalysis = dynamic_cast<TDirectoryFile *>(fInput->Get(directoryNameSP.Data())); if(!outputSPanalysis) { Printf("SP directory not found!!!"); break; } //outputSPanalysis->ls(); //______________________________________________________________// //Get the TList TString listNameSP = 0; TList *cobjSP; for(Int_t iCentralityBin = 0; iCentralityBin < nCentralityBins; iCentralityBin++) { //for(Int_t iCentralityBin = 0; iCentralityBin < 1; iCentralityBin++) { listNameSP = "cobjSP_"; listNameSP += systemType; listNameSP += "_"; listNameSP += strCentralityBins[iCentralityBin]; if(isPID) { listNameSP += AliFlowTrackCuts::PIDsourceName(sourcePID); listNameSP += "_"; listNameSP += AliPID::ParticleName(particleType); } else { listNameSP += "AllCharged"; } if (charge < 0) listNameSP += "-"; if (charge > 0) listNameSP += "+" ; cobjSP = dynamic_cast<TList *>(outputSPanalysis->Get(listNameSP.Data())); if(!cobjSP) { Printf("SP object list not found!!!"); break; } //Common hist for SP Double_t nAnalyzedEvents = 0.; AliFlowCommonHist *commonHistSP = dynamic_cast<AliFlowCommonHist *>(cobjSP->FindObject("AliFlowCommonHistSP")); if(commonHistSP) { TList *clistSPCommonHist = dynamic_cast<TList *>(commonHistSP->GetHistList()); if(clistSPCommonHist) { TH1F *gHistMultRPSP = dynamic_cast<TH1F *>(clistSPCommonHist->FindObject("Control_Flow_MultRP_AliFlowCommonHistSP")); if(gHistMultRPSP) nAnalyzedEvents = gHistMultRPSP->GetEntries(); } } //Integrated flow RP gAliFlowCommonHistName = "AliFlowCommonHistResultsSP"; commonHistRes = dynamic_cast<AliFlowCommonHistResults *>(cobjSP->FindObject(gAliFlowCommonHistName.Data())); //Printf("AliFlowCommonHist name %s",gAliFlowCommonHistName[0].Data()); TH1D *histSP = commonHistRes->GetHistIntFlowRP(); histSP->SetName("fHistIntegratedFlowRPSP"); //______________________________________________________________// //Print the results Printf("\n============================================================"); Printf("Analyzed events: %d",(Int_t)nAnalyzedEvents); Printf("v2(SP): %lf +- %lf",histSP->GetBinContent(1), histSP->GetBinError(1)); Printf("============================================================"); TList *dirOutput = new TList(); dirOutput->SetName(listNameSP.Data()); dirOutput->Add(histSP); listOutput->Add(dirOutput); }//loop over centrality bins TLists return listOutput; } //____________________________________________________________// TList *GetQCResults(TFile *fInput, const char* systemType = 0x0, Bool_t isPID = kTRUE, AliFlowTrackCuts::PIDsource sourcePID = AliFlowTrackCuts::kTOFbayesian, AliPID::EParticleType particleType=AliPID::kPion, Int_t charge = 0) { //Function that reads the TDirectoryFile of the QC //and returns a TList with the relevant plots. TList *listOutput = new TList(); listOutput->SetName("listQC"); //______________________________________________________________// //Global variables const Int_t nQCMethods = 4; AliFlowCommonHistResults *commonHistRes[nQCMethods]; TString methodIntegratedFlowQC[nQCMethods] = {"2ndOrderQC", "4thOrderQC", "6thOrderQC", "8thOrderQC"}; TString gAliFlowCommonHistName[nQCMethods]; //______________________________________________________________// //Get the TDirectoryFile TString directoryNameQC = 0; directoryNameQC = "outputQCanalysis"; TDirectoryFile *outputQCanalysis = dynamic_cast<TDirectoryFile *>(fInput->Get(directoryNameQC.Data())); if(!outputQCanalysis) { Printf("QC directory not found!!!"); break; } //outputQCanalysis->ls(); //______________________________________________________________// //Get the TList TString listNameQC = 0; TList *cobjQC; for(Int_t iCentralityBin = 0; iCentralityBin < nCentralityBins; iCentralityBin++) { //for(Int_t iCentralityBin = 0; iCentralityBin < 1; iCentralityBin++) { listNameQC = "cobjQC_"; listNameQC += systemType; listNameQC += "_"; listNameQC += strCentralityBins[iCentralityBin]; if(isPID) { listNameQC += AliFlowTrackCuts::PIDsourceName(sourcePID); listNameQC += "_"; listNameQC += AliPID::ParticleName(particleType); } else { listNameQC += "AllCharged"; } if (charge < 0) listNameQC += "-"; if (charge > 0) listNameQC += "+"; cobjQC = dynamic_cast<TList *>(outputQCanalysis->Get(listNameQC.Data())); if(!cobjQC) { Printf("QC object list not found!!!"); break; } //Common hist for QC Double_t nAnalyzedEvents = 0.; AliFlowCommonHist *commonHistQC = dynamic_cast<AliFlowCommonHist *>(cobjQC->FindObject("AliFlowCommonHistQC")); if(commonHistQC) { TList *clistQCCommonHist = dynamic_cast<TList *>(commonHistQC->GetHistList()); if(clistQCCommonHist) { TH1F *gHistMultRPQC = dynamic_cast<TH1F *>(clistQCCommonHist->FindObject("Control_Flow_MultRP_AliFlowCommonHistQC")); if(gHistMultRPQC) nAnalyzedEvents = gHistMultRPQC->GetEntries(); } } //2nd order QC gAliFlowCommonHistName[0] = "AliFlowCommonHistResults"; gAliFlowCommonHistName[0] += methodIntegratedFlowQC[0].Data(); commonHistRes[0] = dynamic_cast<AliFlowCommonHistResults *>(cobjQC->FindObject(gAliFlowCommonHistName[0].Data())); //Printf("AliFlowCommonHist name %s",gAliFlowCommonHistName[0].Data()); TH1D *histQC_2 = commonHistRes[0]->GetHistIntFlowRP(); histQC_2->SetName("fHistIntegratedFlowRPQC_2"); //4th order QC gAliFlowCommonHistName[1] = "AliFlowCommonHistResults"; gAliFlowCommonHistName[1] += methodIntegratedFlowQC[1].Data(); commonHistRes[1] = dynamic_cast<AliFlowCommonHistResults *>(cobjQC->FindObject(gAliFlowCommonHistName[1].Data())); //Printf("AliFlowCommonHist name %s",gAliFlowCommonHistName[1].Data()); TH1D *histQC_4 = commonHistRes[1]->GetHistIntFlowRP(); histQC_4->SetName("fHistIntegratedFlowRPQC_4"); //6th order QC gAliFlowCommonHistName[2] = "AliFlowCommonHistResults"; gAliFlowCommonHistName[2] += methodIntegratedFlowQC[2].Data(); commonHistRes[2] = dynamic_cast<AliFlowCommonHistResults *>(cobjQC->FindObject(gAliFlowCommonHistName[2].Data())); //Printf("AliFlowCommonHist name %s",gAliFlowCommonHistName[2].Data()); TH1D *histQC_6 = commonHistRes[2]->GetHistIntFlowRP(); histQC_6->SetName("fHistIntegratedFlowRPQC_6"); //8th order QC gAliFlowCommonHistName[3] = "AliFlowCommonHistResults"; gAliFlowCommonHistName[3] += methodIntegratedFlowQC[3].Data(); commonHistRes[3] = dynamic_cast<AliFlowCommonHistResults *>(cobjQC->FindObject(gAliFlowCommonHistName[3].Data())); //Printf("AliFlowCommonHist name %s",gAliFlowCommonHistName[3].Data()); TH1D *histQC_8 = commonHistRes[3]->GetHistIntFlowRP(); histQC_8->SetName("fHistIntegratedFlowRPQC_8"); TString gHistEventsName = "gHistEvents"; gHistEventsName += strCentralityBins[iCentralityBin]; TH1D *gHistEvents = new TH1D(gHistEventsName.Data(), ";;N_{analyzed events}", 1,0.5,1.5); gHistEvents->SetBinContent(1,nAnalyzedEvents); //______________________________________________________________// //Print the results Printf("\n============================================================"); Printf("Analyzed events: %d",(Int_t)nAnalyzedEvents); Printf("v2(2,QC): %lf +- %lf",histQC_2->GetBinContent(1), histQC_2->GetBinError(1)); Printf("v2(4,QC): %lf +- %lf",histQC_4->GetBinContent(1), histQC_4->GetBinError(1)); Printf("v2(6,QC): %lf +- %lf",histQC_6->GetBinContent(1), histQC_6->GetBinError(1)); Printf("v2(8,QC): %lf +- %lf",histQC_8->GetBinContent(1), histQC_8->GetBinError(1)); Printf("============================================================"); TList *dirOutput = new TList(); dirOutput->SetName(listNameQC.Data()); dirOutput->Add(histQC_2); dirOutput->Add(histQC_4); dirOutput->Add(histQC_6); dirOutput->Add(histQC_8); dirOutput->Add(gHistEvents); listOutput->Add(dirOutput); }//loop over centrality bins TLists return listOutput; } //____________________________________________________________// TList *GetMHResults(TFile *fInput, const char* systemType = 0x0, Bool_t isPID = kTRUE, AliFlowTrackCuts::PIDsource sourcePID = AliFlowTrackCuts::kTOFbayesian, AliPID::EParticleType particleType=AliPID::kPion, Int_t charge = 0) { //Function that reads the TDirectoryFile of the MH //and returns a TList with the relevant plots. TList *listOutput = new TList(); listOutput->SetName("listMH"); //______________________________________________________________// //Get the TDirectoryFile TString directoryNameMH = 0; directoryNameMH = "outputMHanalysis"; TDirectoryFile *outputMHanalysis = dynamic_cast<TDirectoryFile *>(fInput->Get(directoryNameMH.Data())); if(!outputMHanalysis) { Printf("MH directory not found!!!"); break; } //outputMHanalysis->ls(); //______________________________________________________________// //Get the TList TString listNameMH = 0; TList *cobjMH; TCanvas *c[nCentralityBins]; for(Int_t iCentralityBin = 0; iCentralityBin < nCentralityBins; iCentralityBin++) { //for(Int_t iCentralityBin = 0; iCentralityBin < 1; iCentralityBin++) { listNameMH = "cobjMH_"; listNameMH += systemType; listNameMH += "_"; listNameMH += strCentralityBins[iCentralityBin]; if(isPID) { listNameMH += AliFlowTrackCuts::PIDsourceName(sourcePID); listNameMH += "_"; listNameMH += AliPID::ParticleName(particleType); } else { listNameMH += "AllCharged"; } if (charge < 0) listNameMH += "-"; if (charge > 0) listNameMH += "+"; //Printf("%s",listNameMH.Data()); cobjMH = dynamic_cast<TList *>(outputMHanalysis->Get(listNameMH.Data())); if(!cobjMH) { Printf("MH object list not found!!!"); break; } //cobjMH->ls(); //______________________________________________________________// //Get the daughter TLists TList *listWeights = dynamic_cast<TList *>(cobjMH->FindObject("Weights")); //listWeights->ls(); TList *listProfiles = dynamic_cast<TList *>(cobjMH->FindObject("Profiles")); //listProfiles->ls(); TList *listResults = dynamic_cast<TList *>(cobjMH->FindObject("Results")); //listResults->ls(); if((!listWeights)||(!listProfiles)||(!listResults)) { Printf("MH output lists not found!!!"); break; } //______________________________________________________________// TProfile *fAnalysisSettings = dynamic_cast<TProfile *>(cobjMH->FindObject("fAnalysisSettings")); //______________________________________________________________// //Get the objects from the Results list TH1D *f3pCorrelatorHist = dynamic_cast<TH1D *>(listResults->FindObject("f3pCorrelatorHist")); TH1D *fDetectorBiasHist = dynamic_cast<TH1D *>(listResults->FindObject("fDetectorBiasHist")); TH1D *f3pCorrelatorVsMHist = dynamic_cast<TH1D *>(listResults->FindObject("f3pCorrelatorVsMHist")); TH1D *fDetectorBiasVsMHist = dynamic_cast<TH1D *>(listResults->FindObject("fDetectorBiasVsMHist")); //______________________________________________________________// //Get the objects from the Profile list TProfile *f3pCorrelatorPro = dynamic_cast<TProfile *>(listProfiles->FindObject("f3pCorrelatorPro")); TProfile *fNonIsotropicTermsPro = dynamic_cast<TProfile *>(listProfiles->FindObject("fNonIsotropicTermsPro")); TProfile *f3pCorrelatorVsMPro = dynamic_cast<TProfile *>(listProfiles->FindObject("f3pCorrelatorVsMPro")); TProfile2D *fNonIsotropicTermsVsMPro = dynamic_cast<TProfile2D *>(listProfiles->FindObject("fNonIsotropicTermsVsMPro")); TProfile *f3pCorrelatorVsPtSumPro = dynamic_cast<TProfile *>(listProfiles->FindObject("f3pCorrelatorVsPtSumPro")); TProfile *f3pCorrelatorVsPtDiffPro = dynamic_cast<TProfile *>(listProfiles->FindObject("f3pCorrelatorVsPtDiffPro")); Double_t g3pCorrelatorValue = 0., g3pCorrelatorError = 0.; GetCorrelatorAndError(f3pCorrelatorVsPtSumPro, g3pCorrelatorValue, g3pCorrelatorError,1,17); TString g3pHistName = "g3pHistName"; g3pHistName += strCentralityBins[iCentralityBin]; TH1D *g3pHist = new TH1D(g3pHistName, ";;#LT#LTcos(#psi_{1}+#psi_{2}-2#phi_{3}#GT#GT", 1,0.5,1.5); g3pHist->SetBinContent(1,g3pCorrelatorValue); g3pHist->SetBinError(1,g3pCorrelatorError); //______________________________________________________________// //Draw the differential 3p correlator c[iCentralityBin] = new TCanvas(listNameMH.Data(),listNameMH.Data(), iCentralityBin*50, iCentralityBin*50, 500,500); c[iCentralityBin]->SetHighLightColor(10); c[iCentralityBin]->SetFillColor(10); f3pCorrelatorVsPtDiffPro->DrawCopy("E"); //if(iCentralityBin == 8) { //for(Int_t iBin = 1; iBin <= f3pCorrelatorVsPtDiffPro->GetNbinsX(); iBin++) { //if(f3pCorrelatorVsPtDiffPro->GetBinContent(iBin) != 0.) //Printf("Entries: %lf - Error: %lf - Value: %lf", //f3pCorrelatorVsPtDiffPro->GetBinEntries(iBin), //f3pCorrelatorVsPtDiffPro->GetBinError(iBin), //f3pCorrelatorVsPtDiffPro->GetBinContent(iBin)); //} //} //______________________________________________________________// //Print the results Printf("============================================================"); Printf("=========================Bin: %s=========================",strCentralityBins[iCentralityBin].Data()); cout<<"<cos(psi1 + psi2 - 2phi3)>: "<< g3pCorrelatorValue << " +- " << g3pCorrelatorError << endl; cout<<"<cos(phi1 + phi2 - 2phi3)>: "<< f3pCorrelatorHist->GetBinContent(1) << " +- " << f3pCorrelatorHist->GetBinError(1)<<endl; Printf("============================================================"); TList *dirOutput = new TList(); dirOutput->SetName(listNameMH.Data()); dirOutput->Add(f3pCorrelatorHist); //dirOutput->Add(f3pCorrelatorVsMHist); dirOutput->Add(f3pCorrelatorVsPtSumPro); dirOutput->Add(f3pCorrelatorVsPtDiffPro); dirOutput->Add(g3pHist); listOutput->Add(dirOutput); }//loop over centrality bins TLists //listOutput->ls(); return listOutput; } //____________________________________________________________// void GetCorrelatorAndError(TProfile *g3pCorrelatorVsPt, Double_t &g3pCorrelatorValue, Double_t &g3pCorrelatorError, Int_t iBinLow = 0, Int_t iBinHigh = 0) { //Function to return the average value of the 3p correlator //<cos(psi1 + psi2 - 2phi3)> and its error. //The first argument is one of the 3p TProfile objects vs pt. //The second and third argument give the integral and its error. //The fourth and fifth, if specified, indicate the lowest and //highest bin the calculation should be performed for. Int_t gBinLow = 1, gBinHigh = g3pCorrelatorVsPt->GetNbinsX(); if(iBinLow) gBinLow = iBinLow; if(iBinHigh) gBinHigh = iBinHigh; Double_t gSumXi = 0.; Double_t gSumYi = 0.; Double_t gSumXiYi = 0.; Double_t gSumXiYi2 = 0.; Double_t gSumXi2Yi2 = 0.; Double_t gSumDeltaXi2 = 0.; Double_t gSumYi2DeltaXi2 = 0.; Double_t dError = 0.; //Flow code driven error calculation Double_t kSumBi = 0., kSumBi2DeltaYi2 = 0.; Double_t kSumYiBi = 0., kSumYi2DeltaBi2 = 0.; Double_t kSumDeltaBi2 = 0.; for(Int_t iBin = gBinLow; iBin <= gBinHigh; iBin++) { gSumXi += g3pCorrelatorVsPt->GetBinEntries(iBin); gSumYi += g3pCorrelatorVsPt->GetBinContent(iBin); gSumXiYi += g3pCorrelatorVsPt->GetBinEntries(iBin)*g3pCorrelatorVsPt->GetBinContent(iBin); gSumXiYi2 += g3pCorrelatorVsPt->GetBinEntries(iBin)*TMath::Power(g3pCorrelatorVsPt->GetBinContent(iBin),2); gSumXi2Yi2 += TMath::Power(g3pCorrelatorVsPt->GetBinEntries(iBin)*g3pCorrelatorVsPt->GetBinContent(iBin),2); gSumDeltaXi2 += TMath::Power(g3pCorrelatorVsPt->GetBinError(iBin),2); gSumYi2DeltaXi2 += TMath::Power(g3pCorrelatorVsPt->GetBinContent(iBin),2) + TMath::Power(g3pCorrelatorVsPt->GetBinError(iBin),2); dError += g3pCorrelatorVsPt->GetBinEntries(iBin)*g3pCorrelatorVsPt->GetBinEntries(iBin)*g3pCorrelatorVsPt->GetBinError(iBin)*g3pCorrelatorVsPt->GetBinError(iBin); //new error calculation kSumBi += g3pCorrelatorVsPt->GetBinEntries(iBin); kSumYiBi += g3pCorrelatorVsPt->GetBinEntries(iBin)*g3pCorrelatorVsPt->GetBinContent(iBin); kSumBi2DeltaYi2 += TMath::Power(g3pCorrelatorVsPt->GetBinEntries(iBin),2)*TMath::Power(g3pCorrelatorVsPt->GetBinError(iBin),2); kSumYi2DeltaBi2 += TMath::Power(g3pCorrelatorVsPt->GetBinContent(iBin),2)*TMath::Power(TMath::Sqrt(g3pCorrelatorVsPt->GetBinEntries(iBin)),2); kSumDeltaBi2 += TMath::Power(TMath::Sqrt(g3pCorrelatorVsPt->GetBinEntries(iBin)),2); } g3pCorrelatorValue = -1000.; g3pCorrelatorError = 1000.; if(gSumXi != 0.) g3pCorrelatorValue = gSumXiYi/gSumXi; if((gSumXi != 0.)&&(gSumXiYi != 0.)) g3pCorrelatorError = TMath::Abs((gSumXiYi/gSumXi))*TMath::Sqrt(TMath::Power((TMath::Sqrt(gSumYi2DeltaXi2)/gSumXiYi),2) + TMath::Power((gSumDeltaXi2/gSumXi),2)); //g3pCorrelatorError = TMath::Sqrt((1./TMath::Power(kSumBi,2))*(kSumBi2DeltaYi2 + kSumYi2DeltaBi2 + TMath::Power(kSumYiBi,2)*kSumDeltaBi2/TMath::Power(kSumBi,2))); if(gSumXi != 0.) dError /= TMath::Power(gSumXi,2); dError = TMath::Sqrt(dError); g3pCorrelatorError = dError; return; }