/************************************************************************* * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /* $Id$ */ /********************************************************** * In this class azimuthal correlators in mixed harmonics * * are implemented in terms of Q-vectors. This approach * * doesn't require evaluation of nested loops. This class * * can be used to: * * * * a) Extract subdominant harmonics (like v1 and v4); * * b) Study flow of two-particle resonances; * * c) Study strong parity violation. * * * * Author: Ante Bilandzic (abilandzic@gmail.com) * *********************************************************/ #define AliFlowAnalysisWithMixedHarmonics_cxx #include "Riostream.h" #include "AliFlowCommonConstants.h" #include "AliFlowCommonHist.h" #include "AliFlowCommonHistResults.h" #include "TMath.h" #include "TFile.h" #include "TList.h" #include "TProfile.h" #include "TProfile2D.h" #include "AliFlowEventSimple.h" #include "AliFlowTrackSimple.h" #include "AliFlowAnalysisWithMixedHarmonics.h" class TH1; class TList; ClassImp(AliFlowAnalysisWithMixedHarmonics) //================================================================================================================ AliFlowAnalysisWithMixedHarmonics::AliFlowAnalysisWithMixedHarmonics(): fHistList(NULL), fHistListName(NULL), fHarmonic(1), fAnalysisLabel(NULL), fAnalysisSettings(NULL), fNoOfMultipicityBins(100), fMultipicityBinWidth(1), fMinMultiplicity(3), fOppositeChargesPOI(kFALSE), fEvaluateDifferential3pCorrelator(kFALSE), fCorrectForDetectorEffects(kFALSE), fPrintOnTheScreen(kTRUE), fCalculateVsM(kFALSE), fShowBinLabelsVsM(kFALSE), fCommonHists(NULL), fnBinsPhi(0), fPhiMin(0), fPhiMax(0), fPhiBinWidth(0), fnBinsPt(0), fPtMin(0), fPtMax(0), fPtBinWidth(0), fnBinsEta(0), fEtaMin(0), fEtaMax(0), fEtaBinWidth(0), fWeightsList(NULL), fUsePhiWeights(kFALSE), fUsePtWeights(kFALSE), fUseEtaWeights(kFALSE), fUseParticleWeights(NULL), fPhiWeights(NULL), fPtWeights(NULL), fEtaWeights(NULL), fReQnk(NULL), fImQnk(NULL), fSpk(NULL), fProfileList(NULL), f3pCorrelatorPro(NULL), f5pCorrelatorPro(NULL), fNonIsotropicTermsPro(NULL), f3pCorrelatorVsMPro(NULL), f3pPOICorrelatorVsM(NULL), fNonIsotropicTermsVsMPro(NULL), f2pCorrelatorCosPsiDiff(NULL), f2pCorrelatorCosPsiSum(NULL), f2pCorrelatorSinPsiDiff(NULL), f2pCorrelatorSinPsiSum(NULL), fResultsList(NULL), f3pCorrelatorHist(NULL), fDetectorBiasHist(NULL), f3pCorrelatorVsMHist(NULL), fDetectorBiasVsMHist(NULL) { // Constructor. // Base list to hold all output objects: fHistList = new TList(); fHistListName = new TString("cobjMH"); fHistList->SetName(fHistListName->Data()); fHistList->SetOwner(kTRUE); // List to hold histograms with phi, pt and eta weights: fWeightsList = new TList(); // List to hold all all-event profiles: fProfileList = new TList(); // List to hold objects with final results: fResultsList = new TList(); // Initialize all arrays: this->InitializeArrays(); } // AliFlowAnalysisWithMixedHarmonics::AliFlowAnalysisWithMixedHarmonics() //================================================================================================================ AliFlowAnalysisWithMixedHarmonics::~AliFlowAnalysisWithMixedHarmonics() { // Destructor. delete fHistList; } // end of AliFlowAnalysisWithMixedHarmonics::~AliFlowAnalysisWithMixedHarmonics() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::Init() { // Initialize and book all objects. // a) Cross check if the user settings make sense before starting; // b) Access all common constants; // c) Book and nest all lists in the base list fHistList; // d) Book common control histograms; // e) Book all event-by-event quantities; // f) Book all all-event quantities; // g) Book and fill histograms to hold phi, pt and eta weights; // h) Store harmonic n used in cos[n*(phi1+phi2-2phi3)] and cos[n*(psi1+psi2-2phi3)]. //save old value and prevent histograms from being added to directory //to avoid name clashes in case multiple analaysis objects are used //in an analysis Bool_t oldHistAddStatus = TH1::AddDirectoryStatus(); TH1::AddDirectory(kFALSE); TH1::SetDefaultSumw2(); this->CrossCheckSettings(); this->AccessConstants(); this->BookAndNestAllLists(); this->BookProfileHoldingSettings(); this->BookCommonHistograms(); this->BookAllEventByEventQuantities(); this->BookAllAllEventQuantities(); this->BookAndFillWeightsHistograms(); this->StoreHarmonic(); TH1::AddDirectory(oldHistAddStatus); } // end of void AliFlowAnalysisWithMixedHarmonics::Init() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::Make(AliFlowEventSimple* anEvent) { // Running over data only in this method. // a) Check all pointers used in this method; // b) Define local variables; // c) Fill common control histograms; // d) Loop over data and calculate e-b-e quantities Q_{n,k} and S_{p,k}; // e) Calculate 3-p azimuthal correlator cos[n(phi1+phi2-2*phi3)] and non-isotropic terms in terms of Q_{n,k} and S_{p,k}; // f) Calculate differential 3-p azimuthal correlator cos[n(psi1+psi2-2*phi3)] in terms of Q_{2n} and p_{n}: // g) Reset all event-by-event quantities. // a) Check all pointers used in this method: this->CheckPointersUsedInMake(); // b) Define local variables: Double_t dPhi = 0.; // azimuthal angle in the laboratory frame Double_t dPt = 0.; // transverse momentum Double_t dEta = 0.; // pseudorapidity Double_t wPhi = 1.; // phi weight Double_t wPt = 1.; // pt weight Double_t wEta = 1.; // eta weight AliFlowTrackSimple *aftsTrack = NULL; // simple track // c) Fill common control histograms: fCommonHists->FillControlHistograms(anEvent); // d) Loop over data and calculate e-b-e quantities: Int_t nPrim = anEvent->NumberOfTracks(); // nPrim = total number of primary tracks, i.e. nPrim = nRP + nPOI // nRP = # of particles used to determine the reaction plane ("Reference Particles"); // nPOI = # of particles of interest for a detailed flow analysis ("Particles of Interest"); Int_t nRefMult = anEvent->GetReferenceMultiplicity(); // Start loop over data: for(Int_t i=0;iGetTrack(i); if(aftsTrack) { if(!(aftsTrack->InRPSelection() || aftsTrack->InPOISelection())) continue; // consider only tracks which are either RPs or POIs Int_t n = fHarmonic; if(aftsTrack->InRPSelection()) // checking RP condition: { dPhi = aftsTrack->Phi(); dPt = aftsTrack->Pt(); dEta = aftsTrack->Eta(); if(fUsePhiWeights && fPhiWeights && fnBinsPhi) // determine phi-weight for this particle: { wPhi = fPhiWeights->GetBinContent(1+(Int_t)(TMath::Floor(dPhi*fnBinsPhi/TMath::TwoPi()))); } if(fUsePtWeights && fPtWeights && fnBinsPt) // determine pt-weight for this particle: { wPt = fPtWeights->GetBinContent(1+(Int_t)(TMath::Floor((dPt-fPtMin)/fPtBinWidth))); } if(fUseEtaWeights && fEtaWeights && fEtaBinWidth) // determine eta-weight for this particle: { wEta = fEtaWeights->GetBinContent(1+(Int_t)(TMath::Floor((dEta-fEtaMin)/fEtaBinWidth))); } // Calculate Re[Q_{m,k}] and Im[Q_{m,k}], (m = 1,2,3,4,5,6 and k = 0,1,2,3) for this event: for(Int_t m=0;m<6;m++) { for(Int_t k=0;k<4;k++) // to be improved (what is the maximum k that I need?) { (*fReQnk)(m,k)+=pow(wPhi*wPt*wEta,k)*TMath::Cos((m+1)*n*dPhi); (*fImQnk)(m,k)+=pow(wPhi*wPt*wEta,k)*TMath::Sin((m+1)*n*dPhi); } } // Calculate partially S_{p,k} for this event (final calculation of S_{p,k} follows after the loop over data bellow): for(Int_t p=0;p<4;p++) // to be improved (what is maximum p that I need?) { for(Int_t k=0;k<4;k++) // to be improved (what is maximum k that I need?) { (*fSpk)(p,k)+=pow(wPhi*wPt*wEta,k); } } } // end of if(aftsTrack->InRPSelection()) // POIs: if(fEvaluateDifferential3pCorrelator) { if(aftsTrack->InPOISelection()) // 1st POI { Double_t dPsi1 = aftsTrack->Phi(); Double_t dPt1 = aftsTrack->Pt(); Double_t dEta1 = aftsTrack->Eta(); Int_t iCharge1 = aftsTrack->Charge(); Bool_t b1stPOIisAlsoRP = kFALSE; if(aftsTrack->InRPSelection()){b1stPOIisAlsoRP = kTRUE;} for(Int_t j=0;jGetTrack(j); if(aftsTrack->InPOISelection()) // 2nd POI { Double_t dPsi2 = aftsTrack->Phi(); Double_t dPt2 = aftsTrack->Pt(); Double_t dEta2 = aftsTrack->Eta(); Int_t iCharge2 = aftsTrack->Charge(); if(fOppositeChargesPOI && iCharge1 == iCharge2){continue;} Bool_t b2ndPOIisAlsoRP = kFALSE; if(aftsTrack->InRPSelection()){b2ndPOIisAlsoRP = kTRUE;} // Fill:Pt fRePEBE[0]->Fill((dPt1+dPt2)/2.,TMath::Cos(n*(dPsi1+dPsi2)),1.); fImPEBE[0]->Fill((dPt1+dPt2)/2.,TMath::Sin(n*(dPsi1+dPsi2)),1.); fRePEBE[1]->Fill(TMath::Abs(dPt1-dPt2),TMath::Cos(n*(dPsi1+dPsi2)),1.); fImPEBE[1]->Fill(TMath::Abs(dPt1-dPt2),TMath::Sin(n*(dPsi1+dPsi2)),1.); // Fill:Eta fReEtaEBE[0]->Fill((dEta1+dEta2)/2.,TMath::Cos(n*(dPsi1+dPsi2)),1.); fImEtaEBE[0]->Fill((dEta1+dEta2)/2.,TMath::Sin(n*(dPsi1+dPsi2)),1.); fReEtaEBE[1]->Fill(TMath::Abs(dEta1-dEta2),TMath::Cos(n*(dPsi1+dPsi2)),1.); fImEtaEBE[1]->Fill(TMath::Abs(dEta1-dEta2),TMath::Sin(n*(dPsi1+dPsi2)),1.); //2particle correlator f2pCorrelatorCosPsiDiff->Fill(TMath::Abs(dPt1-dPt2),TMath::Cos(n*(dPsi1-dPsi2))); f2pCorrelatorCosPsiSum->Fill(TMath::Abs(dPt1-dPt2),TMath::Cos(n*(dPsi1+dPsi2))); f2pCorrelatorSinPsiDiff->Fill(TMath::Abs(dPt1-dPt2),TMath::Sin(n*(dPsi1-dPsi2))); f2pCorrelatorSinPsiSum->Fill(TMath::Abs(dPt1-dPt2),TMath::Sin(n*(dPsi1+dPsi2))); if(b1stPOIisAlsoRP) { fOverlapEBE[0][0]->Fill((dPt1+dPt2)/2.,TMath::Cos(n*(dPsi1-dPsi2)),1.); fOverlapEBE[0][1]->Fill(TMath::Abs(dPt1-dPt2),TMath::Cos(n*(dPsi1-dPsi2)),1.); fOverlapEBE2[0][0]->Fill((dEta1+dEta2)/2.,TMath::Cos(n*(dPsi1-dPsi2)),1.); fOverlapEBE2[0][1]->Fill(TMath::Abs(dEta1-dEta2),TMath::Cos(n*(dPsi1-dPsi2)),1.); } if(b2ndPOIisAlsoRP) { fOverlapEBE[1][0]->Fill((dPt1+dPt2)/2.,TMath::Cos(n*(dPsi1-dPsi2)),1.); fOverlapEBE[1][1]->Fill(TMath::Abs(dPt1-dPt2),TMath::Cos(n*(dPsi1-dPsi2)),1.); fOverlapEBE2[1][0]->Fill((dEta1+dEta2)/2.,TMath::Cos(n*(dPsi1-dPsi2)),1.); fOverlapEBE2[1][1]->Fill(TMath::Abs(dEta1-dEta2),TMath::Cos(n*(dPsi1-dPsi2)),1.); } } // end of if(aftsTrack->InPOISelection()) // 2nd POI } // end of for(Int_t j=i+1;jInPOISelection()) // 1st POI } // end of if(fEvaluateDifferential3pCorrelator) } else // to if(aftsTrack) { cout<GetEventNSelTracksRP() >= 3) { this->Calculate3pCorrelator(); this->CalculateNonIsotropicTerms(); if(anEvent->GetEventNSelTracksRP() >= 5) { this->Calculate5pCorrelator(); } // end of if(anEvent->GetEventNSelTracksRP() >= 5) } // end of if(anEvent->GetEventNSelTracksRP() >= 3) // f) Calculate differential 3-p azimuthal correlator cos[n(psi1+psi2-2*phi3)] in terms of Q_{2n} and p_{n}: if(fEvaluateDifferential3pCorrelator && anEvent->GetEventNSelTracksRP() >= 1) { Double_t gIntegrated3pCorrelator = 0.; this->CalculateDifferential3pCorrelator(gIntegrated3pCorrelator); // to be improved - add relevant if statements for the min # POIs as well //3particle correlator vs ref. mult if(fCalculateVsM) f3pPOICorrelatorVsM->Fill(nRefMult,gIntegrated3pCorrelator); } // g) Reset all event-by-event quantities: this->ResetEventByEventQuantities(); } // end of AliFlowAnalysisWithMixedHarmonics::Make(AliFlowEventSimple* anEvent) //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::Finish() { // Calculate the final results. // a) Check all pointers used in this method; // b) Access settings for analysis with mixed harmonics; // c) Correct for detector effects; // d) Print on the screen the final results. this->CheckPointersUsedInFinish(); this->AccessSettings(); this->CorrectForDetectorEffects(); if(fCalculateVsM){this->CorrectForDetectorEffectsVsM();} if(fPrintOnTheScreen){this->PrintOnTheScreen();} } // end of AliFlowAnalysisWithMixedHarmonics::Finish() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::GetOutputHistograms(TList *outputListHistos) { // Get pointers to all objects saved in the output file. // a) Get pointers for common control histograms. if(outputListHistos) { this->SetHistList(outputListHistos); if(!fHistList) { cout<GetPointersForBaseHistograms(); this->GetPointersForCommonHistograms(); this->GetPointersForAllEventProfiles(); this->GetPointersForResultsHistograms(); } else { cout<(fHistList->FindObject(analysisSettingsName.Data())); if(analysisSettings) { this->SetAnalysisSettings(analysisSettings); } else { cout<(fHistList->FindObject(commonHistsName.Data())); if(commonHist) { this->SetCommonHists(commonHist); } else { cout<(fHistList->FindObject("Profiles")); if(!profileList) { cout<(profileList->FindObject(s3pCorrelatorProName.Data())); if(p3pCorrelatorPro) { this->Set3pCorrelatorPro(p3pCorrelatorPro); } TString s3pCorrelatorVsMProName = "f3pCorrelatorVsMPro"; TProfile *p3pCorrelatorVsMPro = dynamic_cast(profileList->FindObject(s3pCorrelatorVsMProName.Data())); if(p3pCorrelatorVsMPro) { this->Set3pCorrelatorVsMPro(p3pCorrelatorVsMPro); } TString s3pPOICorrelatorVsMName = "f3pPOICorrelatorVsM"; TProfile *p3pPOICorrelatorVsM = dynamic_cast(profileList->FindObject(s3pPOICorrelatorVsMName.Data())); if(p3pPOICorrelatorVsM) { this->Set3pPOICorrelatorVsM(p3pPOICorrelatorVsM); } TString nonIsotropicTermsProName = "fNonIsotropicTermsPro"; TProfile *nonIsotropicTermsPro = dynamic_cast(profileList->FindObject(nonIsotropicTermsProName.Data())); if(nonIsotropicTermsPro) { this->SetNonIsotropicTermsPro(nonIsotropicTermsPro); } TString nonIsotropicTermsVsMProName = "fNonIsotropicTermsVsMPro"; TProfile2D *nonIsotropicTermsVsMPro = dynamic_cast(profileList->FindObject(nonIsotropicTermsVsMProName.Data())); if(nonIsotropicTermsVsMPro) { this->SetNonIsotropicTermsVsMPro(nonIsotropicTermsVsMPro); } TString psdFlag[2] = {"PtSum","PtDiff"}; for(Int_t sd=0;sd<2;sd++) { TProfile *p3pCorrelatorVsPtSumDiffPro = dynamic_cast(profileList->FindObject(Form("f3pCorrelatorVs%sPro",psdFlag[sd].Data()))); if(p3pCorrelatorVsPtSumDiffPro) { this->Set3pCorrelatorVsPtSumDiffPro(p3pCorrelatorVsPtSumDiffPro,sd); } } TProfile *g2pCorrelatorCosPsiDiff = dynamic_cast(profileList->FindObject("f2pCorrelatorCosPsiDiff")); if(g2pCorrelatorCosPsiDiff) this->Set2pCorrelatorCosPsiDiff(g2pCorrelatorCosPsiDiff); TProfile *g2pCorrelatorCosPsiSum = dynamic_cast(profileList->FindObject("f2pCorrelatorCosPsiSum")); if(g2pCorrelatorCosPsiSum) this->Set2pCorrelatorCosPsiSum(g2pCorrelatorCosPsiSum); TProfile *g2pCorrelatorSinPsiDiff = dynamic_cast(profileList->FindObject("f2pCorrelatorSinPsiDiff")); if(g2pCorrelatorSinPsiDiff) this->Set2pCorrelatorSinPsiDiff(g2pCorrelatorSinPsiDiff); TProfile *g2pCorrelatorSinPsiSum = dynamic_cast(profileList->FindObject("f2pCorrelatorSinPsiSum")); if(g2pCorrelatorSinPsiSum) this->Set2pCorrelatorSinPsiSum(g2pCorrelatorSinPsiSum); TString s5pCorrelatorProName = "f5pCorrelatorPro"; TProfile *p5pCorrelatorPro = dynamic_cast(profileList->FindObject(s5pCorrelatorProName.Data())); if(p5pCorrelatorPro) { this->Set5pCorrelatorPro(p5pCorrelatorPro); } } // end of void AliFlowAnalysisWithMixedHarmonics::GetPointersForAllEventProfiles() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::GetPointersForResultsHistograms() { // Get pointers to histograms holding final results. TList *resultsList = NULL; resultsList = dynamic_cast(fHistList->FindObject("Results")); if(!resultsList) { cout<(resultsList->FindObject(s3pCorrelatorHistName.Data())); if(h3pCorrelatorHist) { this->Set3pCorrelatorHist(h3pCorrelatorHist); } TString s3pCorrelatorVsMHistName = "f3pCorrelatorVsMHist"; TH1D *h3pCorrelatorVsMHist = dynamic_cast(resultsList->FindObject(s3pCorrelatorVsMHistName.Data())); if(h3pCorrelatorVsMHist) { this->Set3pCorrelatorVsMHist(h3pCorrelatorVsMHist); } TString detectorBiasHistName = "fDetectorBiasHist"; TH1D *detectorBiasHist = dynamic_cast(resultsList->FindObject(detectorBiasHistName.Data())); if(detectorBiasHist) { this->SetDetectorBiasHist(detectorBiasHist); } TString detectorBiasVsMHistName = "fDetectorBiasVsMHist"; TH1D *detectorBiasVsMHist = dynamic_cast(resultsList->FindObject(detectorBiasVsMHistName.Data())); if(detectorBiasVsMHist) { this->SetDetectorBiasVsMHist(detectorBiasVsMHist); } } // end of void AliFlowAnalysisWithMixedHarmonics::GetPointersForResultsHistograms() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::WriteHistograms(TString outputFileName) { // Store the final results in output .root file. TFile *output = new TFile(outputFileName.Data(),"RECREATE"); fHistList->Write(fHistList->GetName(),TObject::kSingleKey); delete output; } //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::WriteHistograms(TDirectoryFile *outputFileName) { // Store the final results in output .root file. fHistList->SetName("cobjMH"); fHistList->SetOwner(kTRUE); outputFileName->Add(fHistList); outputFileName->Write(outputFileName->GetName(),TObject::kSingleKey); } //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::StoreHarmonic() { // Store harmonic n used in cos[n*(phi1+phi2-2phi3)] and cos[n*(psi1+psi2-2phi3)]. (fCommonHists->GetHarmonic())->Fill(0.5,fHarmonic); } // end of void AliFlowAnalysisWithMixedHarmonics::StoreHarmonic() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::InitializeArrays() { // Initialize arrays. for(Int_t sd=0;sd<2;sd++) { fRePEBE[sd] = NULL; fImPEBE[sd] = NULL; fReEtaEBE[sd] = NULL; fImEtaEBE[sd] = NULL; f3pCorrelatorVsPtSumDiffPro[sd] = NULL; f3pCorrelatorVsEtaSumDiffPro[sd] = NULL; } for(Int_t fs=0;fs<2;fs++) // 1st/2nd POI which is also RP { for(Int_t sd=0;sd<2;sd++) { fOverlapEBE[fs][sd] = NULL; fOverlapEBE2[fs][sd] = NULL; } } } // end of AliFlowAnalysisWithMixedHarmonics::InitializeArrays() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::BookAndNestAllLists() { // Book and nest all list in base list fHistList. // Weights: fWeightsList->SetName("Weights"); fWeightsList->SetOwner(kTRUE); fHistList->Add(fWeightsList); // Profiles: fProfileList->SetName("Profiles"); fProfileList->SetOwner(kTRUE); fHistList->Add(fProfileList); // Results: fResultsList->SetName("Results"); fResultsList->SetOwner(kTRUE); fHistList->Add(fResultsList); } // end of void AliFlowAnalysisWithMixedHarmonics::BookAndNestAllLists() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::BookProfileHoldingSettings() { // Book profile to hold all analysis settings. TString analysisSettingsName = "fAnalysisSettings"; fAnalysisSettings = new TProfile(analysisSettingsName.Data(),"Settings for analysis with mixed harmonics",10,0,10); fAnalysisSettings->SetStats(kFALSE); fAnalysisSettings->GetXaxis()->SetLabelSize(0.03); fAnalysisSettings->GetXaxis()->SetBinLabel(1,"Corr. for det. effects?"); fAnalysisSettings->Fill(0.5,(Int_t)fCorrectForDetectorEffects); fAnalysisSettings->GetXaxis()->SetBinLabel(2,"# of mult. bins"); fAnalysisSettings->Fill(1.5,fNoOfMultipicityBins); fAnalysisSettings->GetXaxis()->SetBinLabel(3,"Width of mult. bins"); fAnalysisSettings->Fill(2.5,fMultipicityBinWidth); fAnalysisSettings->GetXaxis()->SetBinLabel(4,"Minimal mult."); fAnalysisSettings->Fill(3.5,fMinMultiplicity); fAnalysisSettings->GetXaxis()->SetBinLabel(5,"Print on the screen?"); fAnalysisSettings->Fill(4.5,(Int_t)fPrintOnTheScreen); fAnalysisSettings->GetXaxis()->SetBinLabel(6,"fHarmonic"); fAnalysisSettings->Fill(5.5,(Int_t)fHarmonic); fAnalysisSettings->GetXaxis()->SetBinLabel(7,"fOppositeChargesPOI"); fAnalysisSettings->Fill(6.5,(Int_t)fOppositeChargesPOI); fAnalysisSettings->GetXaxis()->SetBinLabel(8,"fEvaluateDifferential3pCorrelator"); fAnalysisSettings->Fill(7.5,(Int_t)fOppositeChargesPOI); fAnalysisSettings->GetXaxis()->SetBinLabel(9,"fCalculateVsM"); fAnalysisSettings->Fill(8.5,(Int_t)fCalculateVsM); fAnalysisSettings->GetXaxis()->SetBinLabel(10,"fShowBinLabelsVsM"); fAnalysisSettings->Fill(9.5,(Int_t)fShowBinLabelsVsM); fHistList->Add(fAnalysisSettings); } // end of void AliFlowAnalysisWithMixedHarmonics::BookProfileHoldingSettings() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::BookCommonHistograms() { // Book common control histograms and common histograms for final results. TString commonHistsName = "AliFlowCommonHistMH"; fCommonHists = new AliFlowCommonHist(commonHistsName.Data()); fHistList->Add(fCommonHists); } // end of void AliFlowAnalysisWithMixedHarmonics::BookCommonHistograms() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::BookAllEventByEventQuantities() { // Book all event-by-event quantitites. // Q_{n,k} and S{p,k}: fReQnk = new TMatrixD(6,9); // to be improved (check bound on k!) fImQnk = new TMatrixD(6,9); // to be improved (check bound on k!) fSpk = new TMatrixD(4,4); // to be improved (check bound on p and k!) // p_n vs [(p1+p2)/2,|p1-p2|] if(!fEvaluateDifferential3pCorrelator){return;} TString psdFlag[2] = {"PtSum","PtDiff"}; TString p2sdFlag[2] = {"PtSum","PtDiff"}; TString fsFlag[2] = {"1st","2nd"}; for(Int_t sd=0;sd<2;sd++) { fRePEBE[sd] = new TProfile(Form("fRePEBE%s",psdFlag[sd].Data()),"",fnBinsPt,0.,fPtMax); fImPEBE[sd] = new TProfile(Form("fImPEBE%s",psdFlag[sd].Data()),"",fnBinsPt,0.,fPtMax); fReEtaEBE[sd] = new TProfile(Form("fReEtaEBE%s",p2sdFlag[sd].Data()),"",fnBinsEta,fEtaMin,fEtaMax); fImEtaEBE[sd] = new TProfile(Form("fImEtaEBE%s",p2sdFlag[sd].Data()),"",fnBinsEta,fEtaMin,fEtaMax); } for(Int_t fs=0;fs<2;fs++) { for(Int_t sd=0;sd<2;sd++) { fOverlapEBE[fs][sd] = new TProfile(Form("%s POI, %s",fsFlag[sd].Data(),psdFlag[sd].Data()),"",fnBinsPt,0.,fPtMax); fOverlapEBE2[fs][sd] = new TProfile(Form("%s POI 2, %s",fsFlag[sd].Data(),p2sdFlag[sd].Data()),"",fnBinsEta,fEtaMin,fEtaMax); } } } // end fo void AliFlowAnalysisWithMixedHarmonics::BookAllEventByEventQuantities() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::BookAllAllEventQuantities() { // Book all all-event quantitites. // a) Book histos and profiles without any binning in multiplicity, pt or eta; // b) Book quantites with multiplicity binning; // c) Book quantites with binning in (p1+p2)/2 and |p1-p2|. this->BookDefault(); if(fCalculateVsM){this->BookVsM();} if(fEvaluateDifferential3pCorrelator){this->BookDifferential();} } // end of void AliFlowAnalysisWithMixedHarmonics::BookAllAllEventQuantities() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::BookDefault() { // Book histos and profiles without any binning in multiplicity, pt or eta. // a) 3-p correlator <> for all events (not corrected for detector effects); // b) Non-isotropic terms in the decomposition of <>; // c) 3-p correlator <> corrected for detector effects; // d) Histogram which quantifies bias coming from detector inefficiencies to 3-p correlator <>; // e) 5-p correlator <> for all events (not corrected for detector effects - not supported yet). // a) 3-p correlator <> for all events (not corrected for detector effects); TString s3pCorrelatorProName = "f3pCorrelatorPro"; f3pCorrelatorPro = new TProfile(s3pCorrelatorProName.Data(),"",1,0,1); f3pCorrelatorPro->SetStats(kFALSE); f3pCorrelatorPro->GetXaxis()->SetLabelOffset(0.01); f3pCorrelatorPro->GetXaxis()->SetLabelSize(0.05); if(fHarmonic == 1) { f3pCorrelatorPro->GetXaxis()->SetBinLabel(1,"#LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT"); } else { f3pCorrelatorPro->GetXaxis()->SetBinLabel(1,Form("#LT#LTcos[%i(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT",fHarmonic)); } fProfileList->Add(f3pCorrelatorPro); // b) Non-isotropic terms in the decomposition of <>: TString nonIsotropicTermsProName = "fNonIsotropicTermsPro"; fNonIsotropicTermsPro = new TProfile(nonIsotropicTermsProName.Data(),"",8,0,8); fNonIsotropicTermsPro->SetStats(kFALSE); if(fHarmonic == 1) { fNonIsotropicTermsPro->SetTitle("Non-isotropic terms in decomposition of #LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT"); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(1,"cos(#phi_{1})"); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(2,"sin(#phi_{1})"); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(3,"cos(2#phi_{1})"); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(4,"sin(2#phi_{1})"); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(5,"cos(#phi_{1}+#phi_{2})"); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(6,"sin(#phi_{1}+#phi_{2})"); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(7,"cos(2#phi_{1}-#phi_{2})"); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(8,"sin(2#phi_{1}-#phi_{2})"); // fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(9,"cos(#phi_{1}-#phi_{2}-#phi_{3})"); // not needed // fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(10,"sin(#phi_{1}-#phi_{2}-#phi_{3})"); // not needed } else { fNonIsotropicTermsPro->SetTitle(Form("Non-isotropic terms in decomposition of #LT#LTcos[%i(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT",fHarmonic)); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(1,Form("cos(%d#phi_{1})",fHarmonic)); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(2,Form("sin(%d#phi_{1})",fHarmonic)); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(3,Form("cos(%d#phi_{1})",2*fHarmonic)); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(4,Form("sin(%d#phi_{1})",2*fHarmonic)); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(5,Form("cos[%d(#phi_{1}+#phi_{2})]",fHarmonic)); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(6,Form("sin[%d(#phi_{1}+#phi_{2})]",fHarmonic)); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(7,Form("cos[%d(2#phi_{1}-#phi_{2})]",fHarmonic)); fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(8,Form("sin[%d(2#phi_{1}-#phi_{2})]",fHarmonic)); // fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(9,Form("cos(%d(#phi_{1}-#phi_{2}-#phi_{3}))",fHarmonic)); // not needed // fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(10,Form("sin(%d(#phi_{1}-#phi_{2}-#phi_{3}))",fHarmonic)); // not needed } fProfileList->Add(fNonIsotropicTermsPro); // c) 3-p correlator <> corrected for detector effects: TString s3pCorrelatorHistName = "f3pCorrelatorHist"; f3pCorrelatorHist = new TH1D(s3pCorrelatorHistName.Data(),"",1,0,1); f3pCorrelatorHist->SetStats(kFALSE); f3pCorrelatorHist->GetXaxis()->SetLabelOffset(0.01); f3pCorrelatorHist->GetXaxis()->SetLabelSize(0.05); if(fHarmonic == 1) { f3pCorrelatorHist->GetXaxis()->SetBinLabel(1,"#LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT"); } else { f3pCorrelatorHist->GetXaxis()->SetBinLabel(1,Form("#LT#LTcos[%i(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT",fHarmonic)); } fResultsList->Add(f3pCorrelatorHist); // d) Histogram which quantifies bias coming from detector inefficiencies to 3-p correlator <>: TString detectorBiasHistName = "fDetectorBiasHist"; fDetectorBiasHist = new TH1D(detectorBiasHistName.Data(),"Bias coming from detector inefficiences",1,0,1); fDetectorBiasHist->SetStats(kFALSE); if(fHarmonic == 1) { fDetectorBiasHist->GetXaxis()->SetBinLabel(1,"#frac{corrected}{measured} #LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT"); } else { fDetectorBiasHist->GetXaxis()->SetBinLabel(1,Form("#frac{corrected}{measured} #LT#LTcos[%i(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT",fHarmonic)); } fResultsList->Add(fDetectorBiasHist); // e) 5-p correlator <> for all events (not corrected for detector effects - not supported yet): TString s5pCorrelatorProName = "f5pCorrelatorPro"; f5pCorrelatorPro = new TProfile(s5pCorrelatorProName.Data(),"",1,0,1); f5pCorrelatorPro->SetStats(kFALSE); f5pCorrelatorPro->GetXaxis()->SetLabelOffset(0.01); f5pCorrelatorPro->GetXaxis()->SetLabelSize(0.05); if(fHarmonic == 1) { f5pCorrelatorPro->GetXaxis()->SetBinLabel(1,"#LT#LTcos(2#phi_{1}+2#phi_{2}+2#phi_{3}-3#phi_{4}-3#phi_{5})#GT#GT"); } else { f5pCorrelatorPro->GetXaxis()->SetBinLabel(1,Form("#LT#LTcos[%i(2#phi_{1}+2#phi_{2}+2#phi_{3}-3#phi_{4}-3#phi_{5})]#GT#GT",fHarmonic)); } fProfileList->Add(f5pCorrelatorPro); } // end of void AliFlowAnalysisWithMixedHarmonics::BookDefault() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::BookVsM() { // Book histos and profiles holding results vs multiplicity. // a) 3-p correlator <> for all events (not corrected for detector effects) vs M; // b) Non-isotropic terms in the decomposition of <> vs M; // c) 3-p correlator <> corrected for detector effects vs M; // d) Histogram which quantifies bias coming from detector inefficiencies to 3-p correlator <> vs M. // a) 3-p correlator <> for all events (not corrected for detector effects) vs M: TString s3pCorrelatorVsMProName = "f3pCorrelatorVsMPro"; f3pCorrelatorVsMPro = new TProfile(s3pCorrelatorVsMProName.Data(),"",fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2); f3pCorrelatorVsMPro->SetStats(kFALSE); if(fHarmonic == 1) { f3pCorrelatorVsMPro->SetTitle("#LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT #font[72]{vs} M"); } else { f3pCorrelatorVsMPro->SetTitle(Form("#LT#LTcos[%d(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT #font[72]{vs} M",fHarmonic)); } if(fShowBinLabelsVsM) { f3pCorrelatorVsMPro->GetXaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity)); for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++) { f3pCorrelatorVsMPro->GetXaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth))); } f3pCorrelatorVsMPro->GetXaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth))); } else { f3pCorrelatorVsMPro->GetXaxis()->SetTitle("M"); } fProfileList->Add(f3pCorrelatorVsMPro); TString s3pPOICorrelatorVsMName = "f3pPOICorrelatorVsM"; f3pPOICorrelatorVsM = new TProfile(s3pPOICorrelatorVsMName.Data(),"",fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2); f3pPOICorrelatorVsM->SetStats(kFALSE); if(fHarmonic == 1) { f3pPOICorrelatorVsM->SetTitle("#LT#LTcos(#psi_{1}+#psi_{2}-2#phi_{3})#GT#GT #font[72]{vs} M"); } else { f3pPOICorrelatorVsM->SetTitle(Form("#LT#LTcos[%d(#psi_{1}+#psi_{2}-2#phi_{3})]#GT#GT #font[72]{vs} M",fHarmonic)); } if(fShowBinLabelsVsM) { f3pPOICorrelatorVsM->GetXaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity)); for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++) { f3pPOICorrelatorVsM->GetXaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth))); } f3pPOICorrelatorVsM->GetXaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth))); } else { f3pPOICorrelatorVsM->GetXaxis()->SetTitle("M"); } fProfileList->Add(f3pPOICorrelatorVsM); // b) Non-isotropic terms in the decomposition of <> vs M: TString s3pCorrelatorVsMHistName = "f3pCorrelatorVsMHist"; f3pCorrelatorVsMHist = new TH1D(s3pCorrelatorVsMHistName.Data(),"",fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2); f3pCorrelatorVsMHist->SetStats(kFALSE); if(fHarmonic == 1) { f3pCorrelatorVsMHist->SetTitle("cos(#phi_{1}+#phi_{2}-2#phi_{3}) #font[72]{vs} M"); } else { f3pCorrelatorVsMHist->SetTitle(Form("cos[%d(#phi_{1}+#phi_{2}-2#phi_{3})] #font[72]{vs} M",fHarmonic)); } if(fShowBinLabelsVsM) { f3pCorrelatorVsMHist->GetXaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity)); for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++) { f3pCorrelatorVsMHist->GetXaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth))); } f3pCorrelatorVsMHist->GetXaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth))); } else { f3pCorrelatorVsMHist->GetXaxis()->SetTitle("M"); } fResultsList->Add(f3pCorrelatorVsMHist); // c) 3-p correlator <> corrected for detector effects vs M: TString nonIsotropicTermsVsMProName = "fNonIsotropicTermsVsMPro"; fNonIsotropicTermsVsMPro = new TProfile2D(nonIsotropicTermsVsMProName.Data(),"",8,0,8,fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2); fNonIsotropicTermsVsMPro->SetStats(kFALSE); if(fHarmonic == 1) { fNonIsotropicTermsVsMPro->SetTitle("Non-isotropic terms in decomposition of #LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT #font[72]{vs} M"); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(1,"cos(#phi_{1})"); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(2,"sin(#phi_{1})"); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(3,"cos(2#phi_{1})"); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(4,"sin(2#phi_{1})"); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(5,"cos(#phi_{1}+#phi_{2})"); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(6,"sin(#phi_{1}+#phi_{2})"); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(7,"cos(2#phi_{1}-#phi_{2})"); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(8,"sin(2#phi_{1}-#phi_{2})"); // fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(9,"cos(#phi_{1}-#phi_{2}-#phi_{3})"); // not needed // fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(10,"sin(#phi_{1}-#phi_{2}-#phi_{3})"); // not needed } else { fNonIsotropicTermsVsMPro->SetTitle(Form("Non-isotropic terms in decomposition of #LT#LTcos[%d(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT",fHarmonic)); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(1,Form("cos(%d#phi_{1})",fHarmonic)); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(2,Form("sin(%d#phi_{1})",fHarmonic)); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(3,Form("cos(%d#phi_{1})",2*fHarmonic)); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(4,Form("sin(%d#phi_{1})",2*fHarmonic)); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(5,Form("cos[%d(#phi_{1}+#phi_{2})]",fHarmonic)); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(6,Form("sin[%d(#phi_{1}+#phi_{2})]",fHarmonic)); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(7,Form("cos[%d(2#phi_{1}-#phi_{2})]",fHarmonic)); fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(8,Form("sin[%d(2#phi_{1}-#phi_{2})]",fHarmonic)); // fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(9,Form("cos(%d(#phi_{1}-#phi_{2}-#phi_{3}))",fHarmonic)); // not needed // fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(10,Form("sin(%d(#phi_{1}-#phi_{2}-#phi_{3}))",fHarmonic)); // not needed } if(fShowBinLabelsVsM) { fNonIsotropicTermsVsMPro->GetYaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity)); for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++) { fNonIsotropicTermsVsMPro->GetYaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth))); } fNonIsotropicTermsVsMPro->GetYaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth))); } else { fNonIsotropicTermsVsMPro->GetYaxis()->SetTitle("M"); } fProfileList->Add(fNonIsotropicTermsVsMPro); // d) Histogram which quantifies bias coming from detector inefficiencies to 3-p correlator <> vs M: TString detectorBiasVsMHistName = "fDetectorBiasVsMHist"; fDetectorBiasVsMHist = new TH1D(detectorBiasVsMHistName.Data(),"",fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2); fDetectorBiasVsMHist->SetStats(kFALSE); if(fHarmonic == 1) { fDetectorBiasVsMHist->SetTitle("#frac{corrected}{measured} #LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT #font[72]{vs} M"); } else { fDetectorBiasVsMHist->SetTitle(Form("#frac{corrected}{measured} #LT#LTcos[%d(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT #font[72]{vs} M",fHarmonic)); } if(fShowBinLabelsVsM) { fDetectorBiasVsMHist->GetXaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity)); for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++) { fDetectorBiasVsMHist->GetXaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth))); } fDetectorBiasVsMHist->GetXaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth))); } else { fDetectorBiasVsMHist->GetXaxis()->SetTitle("M"); } fResultsList->Add(fDetectorBiasVsMHist); } // end of void AliFlowAnalysisWithMixedHarmonics::BookVsM() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::BookDifferential() { // Book histos and profiles holding results vs (p1+p2)/2 and |p1-p2|. TString psdFlag[2] = {"PtSum","PtDiff"}; TString psdTitleFlag[2] = {"(p_{T,1}+ p_{T,2})/2","#left|p_{T,1}- p_{T,2}#right|"}; TString psdFlag2[2] = {"EtaSum","EtaDiff"}; TString psdTitleFlag2[2] = {"(#eta_{1}+ #eta_{2})/2","#left|#eta_{1}- #eta_{2}#right|"}; //TString s3pCorrelatorVsPtSumDiffProName = "f3pCorrelatorVsPtSumDiffPro"; for(Int_t sd=0;sd<2;sd++) { f3pCorrelatorVsPtSumDiffPro[sd] = new TProfile(Form("f3pCorrelatorVs%sPro",psdFlag[sd].Data()),"",fnBinsPt,0.,fPtMax); f3pCorrelatorVsPtSumDiffPro[sd]->SetStats(kFALSE); f3pCorrelatorVsEtaSumDiffPro[sd] = new TProfile(Form("f3pCorrelatorVs%sPro",psdFlag2[sd].Data()),"",fnBinsEta,fEtaMin,fEtaMax); f3pCorrelatorVsEtaSumDiffPro[sd]->SetStats(kFALSE); //f3pCorrelatorVsPtSumDiffPro[sd]->SetLabelSize(0.05); //f3pCorrelatorVsPtSumDiffPro[sd]->SetMarkerStyle(25); if(fHarmonic == 1) { f3pCorrelatorVsPtSumDiffPro[sd]->SetTitle(Form("#LT#LTcos(#psi_{1}+#psi_{2}-2#phi_{3})#GT#GT #font[72]{vs} %s",psdTitleFlag[sd].Data())); f3pCorrelatorVsEtaSumDiffPro[sd]->SetTitle(Form("#LT#LTcos(#psi_{1}+#psi_{2}-2#phi_{3})#GT#GT #font[72]{vs} %s",psdTitleFlag2[sd].Data())); } else { f3pCorrelatorVsPtSumDiffPro[sd]->SetTitle(Form("#LT#LTcos[%d(#psi_{1}+#psi_{2}-2#phi_{3})]#GT#GT #font[72]{vs} %s",fHarmonic,psdTitleFlag[sd].Data())); f3pCorrelatorVsEtaSumDiffPro[sd]->SetTitle(Form("#LT#LTcos[%d(#psi_{1}+#psi_{2}-2#phi_{3})]#GT#GT #font[72]{vs} %s",fHarmonic,psdTitleFlag2[sd].Data())); } f3pCorrelatorVsPtSumDiffPro[sd]->GetXaxis()->SetTitle(psdTitleFlag[sd].Data()); fProfileList->Add(f3pCorrelatorVsPtSumDiffPro[sd]); f3pCorrelatorVsEtaSumDiffPro[sd]->GetXaxis()->SetTitle(psdTitleFlag2[sd].Data()); fProfileList->Add(f3pCorrelatorVsEtaSumDiffPro[sd]); } f2pCorrelatorCosPsiDiff = new TProfile("f2pCorrelatorCosPsiDiff","",fnBinsPt,0.,fPtMax); f2pCorrelatorCosPsiDiff->SetStats(kFALSE); f2pCorrelatorCosPsiSum = new TProfile("f2pCorrelatorCosPsiSum","",fnBinsPt,0.,fPtMax); f2pCorrelatorCosPsiSum->SetStats(kFALSE); f2pCorrelatorSinPsiDiff = new TProfile("f2pCorrelatorSinPsiDiff","",fnBinsPt,0.,fPtMax); f2pCorrelatorSinPsiDiff->SetStats(kFALSE); f2pCorrelatorSinPsiSum = new TProfile("f2pCorrelatorSinPsiSum","",fnBinsPt,0.,fPtMax); f2pCorrelatorSinPsiSum->SetStats(kFALSE); if(fHarmonic == 1) { f2pCorrelatorCosPsiDiff->SetTitle(Form("#LT#LTcos(#psi_{1}-#psi_{2})#GT#GT #font[72]{vs} %s",psdTitleFlag[1].Data())); f2pCorrelatorCosPsiSum->SetTitle(Form("#LT#LTcos(#psi_{1}+#psi_{2})#GT#GT #font[72]{vs} %s",psdTitleFlag[1].Data())); f2pCorrelatorSinPsiDiff->SetTitle(Form("#LT#LTsin(#psi_{1}-#psi_{2})#GT#GT #font[72]{vs} %s",psdTitleFlag[1].Data())); f2pCorrelatorSinPsiSum->SetTitle(Form("#LT#LTsin(#psi_{1}+#psi_{2})#GT#GT #font[72]{vs} %s",psdTitleFlag[1].Data())); } else { f2pCorrelatorCosPsiDiff->SetTitle(Form("#LT#LTcos[%d(#psi_{1}-#psi_{2})]#GT#GT #font[72]{vs} %s",fHarmonic,psdTitleFlag2[1].Data())); f2pCorrelatorCosPsiSum->SetTitle(Form("#LT#LTcos[%d(#psi_{1}+#psi_{2})]#GT#GT #font[72]{vs} %s",fHarmonic,psdTitleFlag2[1].Data())); f2pCorrelatorSinPsiDiff->SetTitle(Form("#LT#LTsin[%d(#psi_{1}-#psi_{2})]#GT#GT #font[72]{vs} %s",fHarmonic,psdTitleFlag2[1].Data())); f2pCorrelatorSinPsiSum->SetTitle(Form("#LT#LTsin[%d(#psi_{1}+#psi_{2})]#GT#GT #font[72]{vs} %s",fHarmonic,psdTitleFlag2[1].Data())); } fProfileList->Add(f2pCorrelatorCosPsiDiff); fProfileList->Add(f2pCorrelatorCosPsiSum); fProfileList->Add(f2pCorrelatorSinPsiDiff); fProfileList->Add(f2pCorrelatorSinPsiSum); } // end of void AliFlowAnalysisWithMixedHarmonics::BookDifferential() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::AccessConstants() { // Access needed common constants from AliFlowCommonConstants. fnBinsPhi = AliFlowCommonConstants::GetMaster()->GetNbinsPhi(); fPhiMin = AliFlowCommonConstants::GetMaster()->GetPhiMin(); fPhiMax = AliFlowCommonConstants::GetMaster()->GetPhiMax(); if(fnBinsPhi) fPhiBinWidth = (fPhiMax-fPhiMin)/fnBinsPhi; fnBinsPt = AliFlowCommonConstants::GetMaster()->GetNbinsPt(); fPtMin = AliFlowCommonConstants::GetMaster()->GetPtMin(); fPtMax = AliFlowCommonConstants::GetMaster()->GetPtMax(); if(fnBinsPt) fPtBinWidth = (fPtMax-fPtMin)/fnBinsPt; fnBinsEta = AliFlowCommonConstants::GetMaster()->GetNbinsEta(); fEtaMin = AliFlowCommonConstants::GetMaster()->GetEtaMin(); fEtaMax = AliFlowCommonConstants::GetMaster()->GetEtaMax(); if(fnBinsEta) fEtaBinWidth = (fEtaMax-fEtaMin)/fnBinsEta; } // end of void AliFlowAnalysisWithMixedHarmonics::AccessConstants() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::CrossCheckSettings() { // Cross-check if the user settings make sense. // ... } // end of void AliFlowAnalysisWithMixedHarmonics::CrossCheckSettings() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::BookAndFillWeightsHistograms() { // Book and fill (by accessing file "weights.root") histograms which hold phi, pt and eta weights. if(!fWeightsList) { cout<SetStats(kFALSE); fUseParticleWeights->SetLabelSize(0.06); (fUseParticleWeights->GetXaxis())->SetBinLabel(1,"w_{#phi}"); (fUseParticleWeights->GetXaxis())->SetBinLabel(2,"w_{p_{T}}"); (fUseParticleWeights->GetXaxis())->SetBinLabel(3,"w_{#eta}"); fUseParticleWeights->Fill(0.5,(Int_t)fUsePhiWeights); fUseParticleWeights->Fill(1.5,(Int_t)fUsePtWeights); fUseParticleWeights->Fill(2.5,(Int_t)fUseEtaWeights); fWeightsList->Add(fUseParticleWeights); // Phi-weights: if(fUsePhiWeights) { if(fWeightsList->FindObject("phi_weights")) { fPhiWeights = dynamic_cast(fWeightsList->FindObject("phi_weights")); if (!fPhiWeights) { printf("WARNING: no phi weights. bye!\n"); exit(0); } if(TMath::Abs(fPhiWeights->GetBinWidth(1)-fPhiBinWidth)>pow(10.,-6.)) { cout<FindObject(\"phi_weights\") is NULL in BookAndFillWeightsHistograms() !!!!"<FindObject("pt_weights")) { fPtWeights = dynamic_cast(fWeightsList->FindObject("pt_weights")); if (!fPtWeights) { printf("WARNING: no pt weights. bye!\n"); exit(0); } if(TMath::Abs(fPtWeights->GetBinWidth(1)-fPtBinWidth)>pow(10.,-6.)) { cout<FindObject(\"pt_weights\") is NULL in BookAndFillWeightsHistograms() !!!!"<FindObject("eta_weights")) { fEtaWeights = dynamic_cast(fWeightsList->FindObject("eta_weights")); if (!fEtaWeights) { printf("WARNING: no pt weights. bye!\n"); exit(0); } if(TMath::Abs(fEtaWeights->GetBinWidth(1)-fEtaBinWidth)>pow(10.,-6.)) { cout<FindObject(\"eta_weights\") is NULL in BookAndFillWeightsHistograms() !!!!"<>: Double_t d3pCorrelator = 0.; Double_t d3pCorrelatorError = 0.; if(!fCorrectForDetectorEffects) { d3pCorrelator = f3pCorrelatorPro->GetBinContent(1); d3pCorrelatorError = f3pCorrelatorPro->GetBinError(1); } else { d3pCorrelator = f3pCorrelatorHist->GetBinContent(1); d3pCorrelatorError = f3pCorrelatorHist->GetBinError(1); } // <>: Double_t d3pCorrelatorPoi = 0.; Double_t d3pCorrelatorPoiError = 0.; if(fEvaluateDifferential3pCorrelator) { GetCorrelatorAndError(f3pCorrelatorVsPtSumDiffPro[0], d3pCorrelatorPoi, d3pCorrelatorPoiError); } cout< = "<<(Double_t)fCommonHists->GetHistMultRP()->GetMean()<GetBinContent(1); fNoOfMultipicityBins = (Int_t)fAnalysisSettings->GetBinContent(2); fMultipicityBinWidth = (Double_t)fAnalysisSettings->GetBinContent(3); fMinMultiplicity = (Double_t)fAnalysisSettings->GetBinContent(4); fPrintOnTheScreen = (Bool_t)fAnalysisSettings->GetBinContent(5); fHarmonic = (Int_t)fAnalysisSettings->GetBinContent(6); fOppositeChargesPOI = (Bool_t)fAnalysisSettings->GetBinContent(7); fEvaluateDifferential3pCorrelator = (Bool_t)fAnalysisSettings->GetBinContent(8); fCalculateVsM = (Bool_t)fAnalysisSettings->GetBinContent(9); fShowBinLabelsVsM = (Bool_t)fAnalysisSettings->GetBinContent(10); } // end of AliFlowAnalysisWithMixedHarmonics::AccessSettings() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::CorrectForDetectorEffects() { // Correct measured 3-p correlator cos[n(phi1+phi2-2phi3)] for detector effects. Double_t measured3pCorrelator = f3pCorrelatorPro->GetBinContent(1); // biased by detector effects Double_t corrected3pCorrelator = 0.; // corrected for detector effects Double_t nonIsotropicTerms[10] = {0.}; // there are 10 distinct non-isotropic terms for(Int_t nit=0;nit<10;nit++) { nonIsotropicTerms[nit] = fNonIsotropicTermsPro->GetBinContent(nit+1); } // Calculate corrected 3-p correlator: corrected3pCorrelator = measured3pCorrelator - nonIsotropicTerms[2]*nonIsotropicTerms[4] - nonIsotropicTerms[3]*nonIsotropicTerms[5] - 2.*nonIsotropicTerms[0]*nonIsotropicTerms[6] - 2.*nonIsotropicTerms[1]*nonIsotropicTerms[7] + 2.*nonIsotropicTerms[2]*(pow(nonIsotropicTerms[0],2.)-pow(nonIsotropicTerms[1],2.)) + 4.*nonIsotropicTerms[3]*nonIsotropicTerms[0]*nonIsotropicTerms[1]; // Store corrected correlator: if(fCorrectForDetectorEffects) { f3pCorrelatorHist->SetBinContent(1,corrected3pCorrelator); f3pCorrelatorHist->SetBinError(1,f3pCorrelatorPro->GetBinError(1)); // to be improved (propagate error for non-isotropic terms) } // Quantify bias from detector inefficiences to 3-p correlator. Remark: Bias is quantified as a // ratio between corrected and measured 3-p correlator: // bias = corrected/measured // This bias is stored in histogram fDetectorBias. Double_t bias = 0.; if(TMath::Abs(measured3pCorrelator)>1.e-44) { bias = corrected3pCorrelator/measured3pCorrelator; fDetectorBiasHist->SetBinContent(1,bias); } } // end of AliFlowAnalysisWithMixedHarmonics::CorrectForDetectorEffects() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::CorrectForDetectorEffectsVsM() { // Correct measured 3-p correlator cos[n(phi1+phi2-2phi3)] vs M for detector effects. for(Int_t b=1;b<=fNoOfMultipicityBins+2;b++) { Double_t measured3pCorrelator = f3pCorrelatorVsMPro->GetBinContent(b); // biased by detector effects Double_t corrected3pCorrelator = 0.; // corrected for detector effects Double_t nonIsotropicTerms[10] = {0.}; // there are 10 distinct non-isotropic terms for(Int_t nit=0;nit<10;nit++) { nonIsotropicTerms[nit] = fNonIsotropicTermsVsMPro->GetBinContent(fNonIsotropicTermsVsMPro->GetBin(nit+1,b)); } // Calculate corrected 3-p correlator: corrected3pCorrelator = measured3pCorrelator - nonIsotropicTerms[2]*nonIsotropicTerms[4] - nonIsotropicTerms[3]*nonIsotropicTerms[5] - 2.*nonIsotropicTerms[0]*nonIsotropicTerms[6] - 2.*nonIsotropicTerms[1]*nonIsotropicTerms[7] + 2.*nonIsotropicTerms[2]*(pow(nonIsotropicTerms[0],2.)-pow(nonIsotropicTerms[1],2.)) + 4.*nonIsotropicTerms[3]*nonIsotropicTerms[0]*nonIsotropicTerms[1]; // Store corrected correlator: if(fCorrectForDetectorEffects) { f3pCorrelatorVsMHist->SetBinContent(b,corrected3pCorrelator); f3pCorrelatorVsMHist->SetBinError(b,f3pCorrelatorVsMPro->GetBinError(b)); // to be improved (propagate error for non-isotropic terms) } // Quantify bias from detector inefficiences to 3-p correlator. Remark: Bias is quantified as a // ratio between corrected and measured 3-p correlator: // bias = corrected/measured // This bias is stored in histogram fDetectorBias. Double_t bias = 0.; if(measured3pCorrelator) { bias = corrected3pCorrelator/measured3pCorrelator; fDetectorBiasVsMHist->SetBinContent(b,bias); } } // end of for(Int_t b=1;b<=fNoOfMultipicityBins;b++) } // end of AliFlowAnalysisWithMixedHarmonics::CorrectForDetectorEffectsVsM() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::ResetEventByEventQuantities() { // Reset all event-by-event quantities. fReQnk->Zero(); fImQnk->Zero(); fSpk->Zero(); if(!fEvaluateDifferential3pCorrelator){return;} for(Int_t sd=0;sd<2;sd++) { fRePEBE[sd]->Reset(); fImPEBE[sd]->Reset(); fReEtaEBE[sd]->Reset(); fImEtaEBE[sd]->Reset(); } for(Int_t fs=0;fs<2;fs++) { for(Int_t sd=0;sd<2;sd++) { fOverlapEBE[fs][sd]->Reset(); fOverlapEBE2[fs][sd]->Reset(); } } } // end of void AliFlowAnalysisWithMixedHarmonics::ResetEventByEventQuantities() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::Calculate3pCorrelator() { // Calculate 3-p azimuthal correlator cos[n(phi1+phi2-2phi3)] in terms of Q_{n,k} and S_{p,k}. // a) Calculate 3-p correlator without using particle weights; // b) Calculate 3-p correlator with using particle weights. // a) Calculate 3-p correlator without using particle weights: if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)) { // Multiplicity (number of RPs): Double_t dMult = (*fSpk)(0,0); // Real and imaginary parts of non-weighted Q-vectors (Q_{n,0}) evaluated in harmonics n and 2n: Double_t dReQ1n = (*fReQnk)(0,0); Double_t dReQ2n = (*fReQnk)(1,0); Double_t dImQ1n = (*fImQnk)(0,0); Double_t dImQ2n = (*fImQnk)(1,0); // 3-particle azimuthal correlator : Double_t three1n1n2n = (pow(dReQ1n,2.)*dReQ2n + 2.*dReQ1n*dImQ1n*dImQ2n - pow(dImQ1n,2.)*dReQ2n - 2.*(pow(dReQ1n,2.)+pow(dImQ1n,2.)) - (pow(dReQ2n,2.)+pow(dImQ2n,2.))+2.*dMult) / (dMult*(dMult-1.)*(dMult-2.)); // Fill all-events profile: f3pCorrelatorPro->Fill(0.5,three1n1n2n,dMult*(dMult-1.)*(dMult-2.)); // 3-particle azimuthal correlator vs multiplicity: if(fCalculateVsM) { if(dMultFill(0.5,three1n1n2n,dMult*(dMult-1.)*(dMult-2.)); } else if(dMult>=fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth) { f3pCorrelatorVsMPro->Fill(0.5+fNoOfMultipicityBins+1,three1n1n2n,dMult*(dMult-1.)*(dMult-2.)); } else { f3pCorrelatorVsMPro->Fill(1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),three1n1n2n,dMult*(dMult-1.)*(dMult-2.)); } } // end of if(fCalculateVsM) } // end of if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)) // b) Calculate 3-p correlator with using particle weights: if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights) { // ... } // end of if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights) } // end of void AliFlowAnalysisWithMixedHarmonics::Calculate3pCorrelator() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::Calculate5pCorrelator() { // Calculate 5-p azimuthal correlator cos[n(2phi1+2phi2+2phi3-3phi4-3phi5)] in terms of Q_{n,k} and S_{p,k}. // a) Calculate 5-p correlator without using particle weights; // b) Calculate 5-p correlator with using particle weights. // a) Calculate 5-p correlator without using particle weights: if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)) { // Multiplicity (number of RPs): Double_t dMult = (*fSpk)(0,0); // Real and imaginary parts of non-weighted Q-vectors (Q_{n,0}) evaluated in harmonics n,2n,...,6n: Double_t dReQ1n = (*fReQnk)(0,0); Double_t dReQ2n = (*fReQnk)(1,0); Double_t dReQ3n = (*fReQnk)(2,0); Double_t dReQ4n = (*fReQnk)(3,0); //Double_t dReQ5n = (*fReQnk)(4,0); // not needed Double_t dReQ6n = (*fReQnk)(5,0); Double_t dImQ1n = (*fImQnk)(0,0); Double_t dImQ2n = (*fImQnk)(1,0); Double_t dImQ3n = (*fImQnk)(2,0); Double_t dImQ4n = (*fImQnk)(3,0); //Double_t dImQ5n = (*fImQnk)(4,0); // not needed Double_t dImQ6n = (*fImQnk)(5,0); // 5-particle azimuthal correlator: Double_t five2n2n2n3n3n = 0.; // Double_t reQ2nQ2nQ2nQ3nstarQ3nstar = pow(dReQ2n,3.)*pow(dReQ3n,2.) - 3.*dReQ2n*pow(dReQ3n,2.)*pow(dImQ2n,2.) + 6.*pow(dReQ2n,2.)*dReQ3n*dImQ2n*dImQ3n - 2.*dReQ3n*pow(dImQ2n,3.)*dImQ3n-pow(dReQ2n,3.)*pow(dImQ3n,2.) + 3.*dReQ2n*pow(dImQ2n,2.)*pow(dImQ3n,2.); Double_t reQ2nQ2nQ2nQ6nstar = dReQ6n*pow(dReQ2n,3)-3.*dReQ2n*dReQ6n*pow(dImQ2n,2) + 3.*dImQ2n*dImQ6n*pow(dReQ2n,2)-dImQ6n*pow(dImQ2n,3); Double_t reQ4nQ2nQ3nstarQ3nstar = (dReQ4n*dReQ2n-dImQ4n*dImQ2n)*(dReQ3n*dReQ3n-dImQ3n*dImQ3n) + 2.*(dReQ4n*dImQ2n+dImQ4n*dReQ2n)*dReQ3n*dImQ3n; Double_t reQ2nQ2nQ1nstarQ3nstar = (pow(dReQ2n,2.)-pow(dImQ2n,2.))*(dReQ3n*dReQ1n-dImQ3n*dImQ1n) + 2.*dReQ2n*dImQ2n*(dReQ3n*dImQ1n+dImQ3n*dReQ1n); Double_t reQ6nQ3nstarQ3nstar = pow(dReQ3n,2.)*dReQ6n + 2.*dReQ3n*dImQ3n*dImQ6n - pow(dImQ3n,2.)*dReQ6n; Double_t reQ4nQ2nQ6nstar = dReQ6n*dReQ4n*dReQ2n-dReQ6n*dImQ4n*dImQ2n+dImQ6n*dReQ4n*dImQ2n + dImQ6n*dImQ4n*dReQ2n; Double_t reQ4nQ1nstarQ3nstar = dReQ4n*(dReQ3n*dReQ1n-dImQ3n*dImQ1n)+dImQ4n*(dReQ3n*dImQ1n+dImQ3n*dReQ1n); Double_t reQ2nQ2nQ4nstar = pow(dReQ2n,2.)*dReQ4n+2.*dReQ2n*dImQ2n*dImQ4n-pow(dImQ2n,2.)*dReQ4n; Double_t reQ2nQ1nQ3nstar = dReQ3n*dReQ2n*dReQ1n-dReQ3n*dImQ2n*dImQ1n+dImQ3n*dReQ2n*dImQ1n + dImQ3n*dImQ2n*dReQ1n; Double_t reQ2nQ1nstarQ1nstar = pow(dReQ1n,2.)*dReQ2n + 2.*dReQ1n*dImQ1n*dImQ2n - pow(dImQ1n,2.)*dReQ2n; // Analytic expression for 5-particle azimuthal correlator: five2n2n2n3n3n = (reQ2nQ2nQ2nQ3nstarQ3nstar-reQ2nQ2nQ2nQ6nstar-3.*reQ4nQ2nQ3nstarQ3nstar - 6.*reQ2nQ2nQ1nstarQ3nstar+2.*reQ6nQ3nstarQ3nstar+3.*reQ4nQ2nQ6nstar + 6.*reQ4nQ1nstarQ3nstar+6.*reQ2nQ2nQ4nstar + 12.*reQ2nQ1nQ3nstar+6.*reQ2nQ1nstarQ1nstar - 2.*((pow(dReQ6n,2.)+pow(dImQ6n,2.)) + 3.*(pow(dReQ4n,2.)+pow(dImQ4n,2.)) + 6.*(pow(dReQ3n,2.)+pow(dImQ3n,2.)) + 9.*(pow(dReQ2n,2.)+pow(dImQ2n,2.)) + 6.*(pow(dReQ1n,2.)+pow(dImQ1n,2.))-12.*dMult)) /(dMult*(dMult-1.)*(dMult-2.)*(dMult-3.)*(dMult-4.)); // Fill all-events profile: f5pCorrelatorPro->Fill(0.5,five2n2n2n3n3n,dMult*(dMult-1.)*(dMult-2.)*(dMult-3.)*(dMult-4.)); } // end of if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)) // b) Calculate 5-p correlator with using particle weights: if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights) { // ... } // end of if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights) } // end of void AliFlowAnalysisWithMixedHarmonics::Calculate5pCorrelator() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::CalculateNonIsotropicTerms() { // Calculate non-isotropic terms which appear in the decomposition of 3-p correlator . // a) Calculate without using particle weights; // b) Calculate using particle weights. // For detector with uniform acceptance all these terms vanish. These non-isotropic terms are stored in fNonIsotropicTermsPro. // Binning of fNonIsotropicTermsPro is organized as follows: // 1st bin: <> // 2nd bin: <> // 3rd bin: <> // 4th bin: <> // 5th bin: <> // 6th bin: <> // 7th bin: <> // 8th bin: <> // 9th bin: <> // not needed // 10th bin: <> // not needed // a) Calculate without using particle weights: if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)) { // Multiplicity (number of RPs): Double_t dMult = (*fSpk)(0,0); // Real and imaginary parts of non-weighted Q-vectors (Q_{n,0}) evaluated in harmonics n and 2n: Double_t dReQ1n = (*fReQnk)(0,0); Double_t dReQ2n = (*fReQnk)(1,0); Double_t dImQ1n = (*fImQnk)(0,0); Double_t dImQ2n = (*fImQnk)(1,0); // 1-particle terms: Double_t cosP1n = 0.; // Double_t sinP1n = 0.; // Double_t cosP2n = 0.; // Double_t sinP2n = 0.; // if(dMult>0) { cosP1n = dReQ1n/dMult; sinP1n = dImQ1n/dMult; cosP2n = dReQ2n/dMult; sinP2n = dImQ2n/dMult; // All-event avarages: fNonIsotropicTermsPro->Fill(0.5,cosP1n,dMult); // <> fNonIsotropicTermsPro->Fill(1.5,sinP1n,dMult); // <> fNonIsotropicTermsPro->Fill(2.5,cosP2n,dMult); // <> fNonIsotropicTermsPro->Fill(3.5,sinP2n,dMult); // <> // All-event avarages vs M: if(fCalculateVsM) { if(dMultFill(0.5,0.5,cosP1n,dMult); // <> fNonIsotropicTermsVsMPro->Fill(1.5,0.5,sinP1n,dMult); // <> fNonIsotropicTermsVsMPro->Fill(2.5,0.5,cosP2n,dMult); // <> fNonIsotropicTermsVsMPro->Fill(3.5,0.5,sinP2n,dMult); // <> } else if(dMult>=fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth) { fNonIsotropicTermsVsMPro->Fill(0.5,0.5+fNoOfMultipicityBins+1,cosP1n,dMult); // <> fNonIsotropicTermsVsMPro->Fill(1.5,0.5+fNoOfMultipicityBins+1,sinP1n,dMult); // <> fNonIsotropicTermsVsMPro->Fill(2.5,0.5+fNoOfMultipicityBins+1,cosP2n,dMult); // <> fNonIsotropicTermsVsMPro->Fill(3.5,0.5+fNoOfMultipicityBins+1,sinP2n,dMult); // <> } else { fNonIsotropicTermsVsMPro->Fill(0.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),cosP1n,dMult); // <> fNonIsotropicTermsVsMPro->Fill(1.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),sinP1n,dMult); // <> fNonIsotropicTermsVsMPro->Fill(2.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),cosP2n,dMult); // <> fNonIsotropicTermsVsMPro->Fill(3.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),sinP2n,dMult); // <> } } // end of if(fCalculateVsM) } // end of if(dMult>0) // 2-particle terms: Double_t cosP1nP1n = 0.; // Double_t sinP1nP1n = 0.; // Double_t cosP2nM1n = 0.; // Double_t sinP2nM1n = 0.; // if(dMult>1) { cosP1nP1n = (pow(dReQ1n,2)-pow(dImQ1n,2)-dReQ2n)/(dMult*(dMult-1)); sinP1nP1n = (2.*dReQ1n*dImQ1n-dImQ2n)/(dMult*(dMult-1)); cosP2nM1n = (dReQ2n*dReQ1n+dImQ2n*dImQ1n-dReQ1n)/(dMult*(dMult-1)); sinP2nM1n = (dImQ2n*dReQ1n-dReQ2n*dImQ1n-dImQ1n)/(dMult*(dMult-1)); // All-event avarages: fNonIsotropicTermsPro->Fill(4.5,cosP1nP1n,dMult*(dMult-1.)); // <> fNonIsotropicTermsPro->Fill(5.5,sinP1nP1n,dMult*(dMult-1.)); // <> fNonIsotropicTermsPro->Fill(6.5,cosP2nM1n,dMult*(dMult-1.)); // <> fNonIsotropicTermsPro->Fill(7.5,sinP2nM1n,dMult*(dMult-1.)); // <> // All-event avarages vs M: if(fCalculateVsM) { if(dMultFill(4.5,0.5,cosP1nP1n,dMult*(dMult-1.)); // <> fNonIsotropicTermsVsMPro->Fill(5.5,0.5,sinP1nP1n,dMult*(dMult-1.)); // <> fNonIsotropicTermsVsMPro->Fill(6.5,0.5,cosP2nM1n,dMult*(dMult-1.)); // <> fNonIsotropicTermsVsMPro->Fill(7.5,0.5,sinP2nM1n,dMult*(dMult-1.)); // <> } else if(dMult>=fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth) { fNonIsotropicTermsVsMPro->Fill(4.5,0.5+fNoOfMultipicityBins+1,cosP1nP1n,dMult*(dMult-1.)); // <> fNonIsotropicTermsVsMPro->Fill(5.5,0.5+fNoOfMultipicityBins+1,sinP1nP1n,dMult*(dMult-1.)); // <> fNonIsotropicTermsVsMPro->Fill(6.5,0.5+fNoOfMultipicityBins+1,cosP2nM1n,dMult*(dMult-1.)); // <> fNonIsotropicTermsVsMPro->Fill(7.5,0.5+fNoOfMultipicityBins+1,sinP2nM1n,dMult*(dMult-1.)); // <> } else { fNonIsotropicTermsVsMPro->Fill(4.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),cosP1nP1n,dMult*(dMult-1.)); // <> fNonIsotropicTermsVsMPro->Fill(5.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),sinP1nP1n,dMult*(dMult-1.)); // <> fNonIsotropicTermsVsMPro->Fill(6.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),cosP2nM1n,dMult*(dMult-1.)); // <> fNonIsotropicTermsVsMPro->Fill(7.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),sinP2nM1n,dMult*(dMult-1.)); // <> } } // end of if(fCalculateVsM) } // end of if(dMult>1) // 3-particle: correct and ready but not needed, hence commented out. /* Double_t cosP1nM1nM1n = 0.; // Double_t sinP1nM1nM1n = 0.; // if(dMult>2) { cosP1nM1nM1n = (dReQ1n*(pow(dReQ1n,2)+pow(dImQ1n,2))-dReQ1n*dReQ2n-dImQ1n*dImQ2n-2.*(dMult-1)*dReQ1n) / (dMult*(dMult-1)*(dMult-2)); sinP1nM1nM1n = (-dImQ1n*(pow(dReQ1n,2)+pow(dImQ1n,2))+dReQ1n*dImQ2n-dImQ1n*dReQ2n+2.*(dMult-1)*dImQ1n) / (dMult*(dMult-1)*(dMult-2)); // All-events avarages: fNonIsotropicTermsPro->Fill(8.5,cosP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <> fNonIsotropicTermsPro->Fill(9.5,sinP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <> // All-events avarages vs M: if(fCalculateVsM) { if(dMultFill(8.5,0.5,cosP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <> fNonIsotropicTermsVsMPro->Fill(9.5,0.5,sinP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <> } else if(dMult>=fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth) { fNonIsotropicTermsVsMPro->Fill(8.5,0.5+fNoOfMultipicityBins+1,cosP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <> fNonIsotropicTermsVsMPro->Fill(9.5,0.5+fNoOfMultipicityBins+1,sinP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <> } else { fNonIsotropicTermsVsMPro->Fill(8.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth), cosP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <> fNonIsotropicTermsVsMPro->Fill(9.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth), sinP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <> } } // end of if(fCalculateVsM) } // end of if(dMult>2) */ } // end of if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)) // b) Calculate using particle weights: if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights) { // ... } // end of if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights) } // end of void AliFlowAnalysisWithMixedHarmonics::CalculateNonIsotropicTerms() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::CalculateDifferential3pCorrelator(Double_t &gIntegratedValue) { // Calculate differential 3-p azimuthal correlator cos[n(psi1+psi2-2phi3)] in terms of Q_{2n}, p_{n}, q1_{n} and q2_{n}. // a) Calculate differential 3-p correlator without using particle weights; // b) Calculate differential 3-p correlator with using particle weights. // a) Calculate differential 3-p correlator without using particle weights: if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)) { Int_t iBinCounter = 0; Double_t gSumBinContentTimesWeight = 0., gSumWeight = 0.; Double_t gSumBinContentTimesWeightSquared = 0.; // Multiplicity (number of RPs): Double_t dMult = (*fSpk)(0,0); // Real and imaginary parts of non-weighted Q-vectors (Q_{n,0}) evaluated in harmonic 2n: Double_t dReQ2n = (*fReQnk)(1,0); Double_t dImQ2n = (*fImQnk)(1,0); for(Int_t sd=0;sd<2;sd++) { // [(p1+p2)/2,|p1-p2|] // looping over all bins and calculating reduced correlations: for(Int_t b=1;b<=fnBinsPt;b++) { // real and imaginary parts of p_{n}: Double_t p1nRe = fRePEBE[sd]->GetBinContent(b)*fRePEBE[sd]->GetBinEntries(b); Double_t p1nIm = fImPEBE[sd]->GetBinContent(b)*fImPEBE[sd]->GetBinEntries(b); // overlap 1: to be improved (terminology) Double_t overlap1 = fOverlapEBE[0][sd]->GetBinContent(b)*fOverlapEBE[0][sd]->GetBinEntries(b); // overlap 2: to be improved (terminology) Double_t overlap2 = fOverlapEBE[1][sd]->GetBinContent(b)*fOverlapEBE[1][sd]->GetBinEntries(b); // number of pairs of POIs in particular (p1+p2)/2 or |p1-p2| bin: Double_t mp = fRePEBE[sd]->GetBinEntries(b); // number of pairs of POI1/RP and POI2 in particular (p1+p2)/2 or |p1-p2| bin: Double_t mOverlap1 = fOverlapEBE[0][sd]->GetBinEntries(b); // number of pairs of POI2/RP and POI1 in particular (p1+p2)/2 or |p1-p2| bin: Double_t mOverlap2 = fOverlapEBE[1][sd]->GetBinEntries(b); // e-b-e weight for cos[n(psi1+psi2-2phi3)]: Double_t weight = mp*dMult-mOverlap1-mOverlap2; Double_t cosP2nphi1M1npsi2M1npsi2 = 0; // cos[n(psi1+psi2-2phi3)] if(weight>0.) { cosP2nphi1M1npsi2M1npsi2 = (p1nRe*dReQ2n+p1nIm*dImQ2n-overlap1-overlap2)/(weight); } f3pCorrelatorVsPtSumDiffPro[sd]->Fill(fPtMin+(b-1)*fPtBinWidth,cosP2nphi1M1npsi2M1npsi2,weight); if(sd == 0) { iBinCounter += 1; gSumBinContentTimesWeight += f3pCorrelatorVsPtSumDiffPro[sd]->GetBinContent(b)*f3pCorrelatorVsPtSumDiffPro[sd]->GetBinEntries(b); gSumWeight += f3pCorrelatorVsPtSumDiffPro[sd]->GetBinEntries(b); gSumBinContentTimesWeightSquared += TMath::Power(gSumBinContentTimesWeight,2); } } // end of for(Int_t b=1;b<=fnBinsPt;b++) // [(eta1+eta2)/2,|eta1-eta2|] // looping over all bins and calculating reduced correlations: for(Int_t k=1;k<=fnBinsEta;k++) { // real and imaginary parts of p_{n}: Double_t p1nRe = fReEtaEBE[sd]->GetBinContent(k)*fReEtaEBE[sd]->GetBinEntries(k); Double_t p1nIm = fImEtaEBE[sd]->GetBinContent(k)*fImEtaEBE[sd]->GetBinEntries(k); // overlap 1: to be improved (terminology) Double_t overlap1 = fOverlapEBE2[0][sd]->GetBinContent(k)*fOverlapEBE2[0][sd]->GetBinEntries(k); // overlap 2: to be improved (terminology) Double_t overlap2 = fOverlapEBE2[1][sd]->GetBinContent(k)*fOverlapEBE2[1][sd]->GetBinEntries(k); // number of pairs of POIs in particular (eta1+eta2)/2 or |eta1-eta2| bin: Double_t mp = fReEtaEBE[sd]->GetBinEntries(k); // number of pairs of POI1/RP and POI2 in particular (eta1+eta2)/2 or |eta1-eta2| bin: Double_t mOverlap1 = fOverlapEBE2[0][sd]->GetBinEntries(k); // number of pairs of POI2/RP and POI1 in particular (eta1+eta2)/2 or |eta1-eta2| bin: Double_t mOverlap2 = fOverlapEBE2[1][sd]->GetBinEntries(k); // e-b-e weight for cos[n(psi1+psi2-2phi3)]: Double_t weight = mp*dMult-mOverlap1-mOverlap2; Double_t cosP2nphi1M1npsi2M1npsi2 = 0; // cos[n(psi1+psi2-2phi3)] if(weight>0.) { cosP2nphi1M1npsi2M1npsi2 = (p1nRe*dReQ2n+p1nIm*dImQ2n-overlap1-overlap2)/(weight); } f3pCorrelatorVsEtaSumDiffPro[sd]->Fill(fEtaMin+(k-1)*fEtaBinWidth,cosP2nphi1M1npsi2M1npsi2,weight); } // end of for(Int_t k=1;k<=fnBinsEta;k++) } // end of for(Int_t sd=0;sd<2;sd++) gIntegratedValue = -1000.; if((gSumWeight)&&(iBinCounter)) gIntegratedValue = gSumBinContentTimesWeight/gSumWeight; } // end of if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)) // b) Calculate differential 3-p correlator by using particle weights: if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights) { // ... } // end of if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights) } // end of void AliFlowAnalysisWithMixedHarmonics::CalculateDifferential3pCorrelator() //================================================================================================================ void AliFlowAnalysisWithMixedHarmonics::GetCorrelatorAndError(TProfile *g3pCorrelatorVsPt, Double_t &g3pCorrelatorValue, Double_t &g3pCorrelatorError) { //Retrieves the 3p correlator <> //and its error 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.; for(Int_t iBin = 1; iBin <= g3pCorrelatorVsPt->GetNbinsX(); 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); } 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)); } //================================================================================================================