From cc4d0e9c477655f8d4f14548732b2b7c1d188a03 Mon Sep 17 00:00:00 2001 From: cvetan Date: Thu, 22 Mar 2012 21:13:45 +0000 Subject: [PATCH] Adding flatenning to V0A,V0C and total V0 in addition to the existing ring-by-ring parameters. Adding an AliVEvent method to set the equalization factors which could be used in order to integrate the Alex's framework for LHC10h. --- ANALYSIS/AliVZEROEPSelectionTask.cxx | 12 ++-- ANALYSIS/AliVZEROEPSelectionTask.h | 10 ++-- STEER/AOD/AliAODEvent.h | 2 + STEER/ESD/AliESDEvent.h | 2 +- STEER/STEERBase/AliEventplane.cxx | 83 ++++++++++++++++++++++++---- STEER/STEERBase/AliEventplane.h | 17 +++--- STEER/STEERBase/AliVEvent.h | 1 + 7 files changed, 96 insertions(+), 31 deletions(-) diff --git a/ANALYSIS/AliVZEROEPSelectionTask.cxx b/ANALYSIS/AliVZEROEPSelectionTask.cxx index 8ee3a43ff11..248937ad362 100644 --- a/ANALYSIS/AliVZEROEPSelectionTask.cxx +++ b/ANALYSIS/AliVZEROEPSelectionTask.cxx @@ -50,7 +50,7 @@ AliAnalysisTaskSE(), // Default constructor // Initialize pointers AliInfo("VZERO Event Plane Selection enabled."); - for(Int_t i = 0; i < 8; ++i) fX2In[i] = fY2In[i] = fX2Y2In[i] = fCos8PsiIn[i] = NULL; + for(Int_t i = 0; i < 11; ++i) fX2In[i] = fY2In[i] = fX2Y2In[i] = fCos8PsiIn[i] = NULL; } //________________________________________________________________________ @@ -64,7 +64,7 @@ AliVZEROEPSelectionTask::AliVZEROEPSelectionTask(const char *name): // Default constructor // Initialize pointers AliInfo("Event Plane Selection enabled."); - for(Int_t i = 0; i < 8; ++i) fX2In[i] = fY2In[i] = fX2Y2In[i] = fCos8PsiIn[i] = NULL; + for(Int_t i = 0; i < 11; ++i) fX2In[i] = fY2In[i] = fX2Y2In[i] = fCos8PsiIn[i] = NULL; } //________________________________________________________________________ @@ -73,7 +73,7 @@ AliVZEROEPSelectionTask::~AliVZEROEPSelectionTask() // Destructor // ... if (fUserParams) { - for(Int_t i = 0; i < 8; ++i) { + for(Int_t i = 0; i < 11; ++i) { delete fX2In[i]; fX2In[i] = NULL; delete fY2In[i]; @@ -146,11 +146,11 @@ void AliVZEROEPSelectionTask::SetEventplaneParams(AliEventplane *esdEP,Float_t p AliFatal("No event plane received"); if (percentile < 0 || percentile > 100) { - for(Int_t ring = 0; ring < 8; ++ring) esdEP->SetVZEROEPParams(ring,0.,0.,1.,1.,0.,0.,0.); + for(Int_t ring = 0; ring < 11; ++ring) esdEP->SetVZEROEPParams(ring,0.,0.,1.,1.,0.,0.,0.); return; } - for(Int_t ring = 0; ring < 8; ++ring) { + for(Int_t ring = 0; ring < 11; ++ring) { Int_t ibin = fX2In[ring]->FindBin(percentile); if (fX2In[ring]->GetBinEntries(ibin) == 0) { esdEP->SetVZEROEPParams(ring,0.,0.,1.,1.,0.,0.,0.); @@ -208,7 +208,7 @@ void AliVZEROEPSelectionTask::SetHistograms(TList *list) // Set the flatenning parameters // histograms from a given list - for(Int_t i = 0; i < 8; ++i) { + for(Int_t i = 0; i < 11; ++i) { fX2In[i] = (TProfile*)list->FindObject(Form("fX2_%d",i))->Clone(Form("fX2In_%d",i)); fX2In[i]->SetDirectory(0); fY2In[i] = (TProfile*)list->FindObject(Form("fY2_%d",i))->Clone(Form("fY2In_%d",i)); diff --git a/ANALYSIS/AliVZEROEPSelectionTask.h b/ANALYSIS/AliVZEROEPSelectionTask.h index 2825e85ff6e..663e6e73cd4 100644 --- a/ANALYSIS/AliVZEROEPSelectionTask.h +++ b/ANALYSIS/AliVZEROEPSelectionTask.h @@ -48,12 +48,12 @@ class AliVZEROEPSelectionTask : public AliAnalysisTaskSE { Bool_t fUseVZEROCentrality; // use VZERO centrality estimator instead of SPD AliOADBContainer* fVZEROEPContainer; // VZERO event-plane OADB Container - TProfile *fX2In[8]; // Profile histogram for Q^2_x (read from input file) - TProfile *fY2In[8]; // Profile histogram for Q^2_y (read from input file) - TProfile *fX2Y2In[8]; // Profile histogram for Q^2_x*Q^2_y (read from input file) - TProfile *fCos8PsiIn[8]; // Profile histogram for Cos(8*Psi) (read from input file) + TProfile *fX2In[11]; // Profile histogram for Q^2_x (read from input file) + TProfile *fY2In[11]; // Profile histogram for Q^2_y (read from input file) + TProfile *fX2Y2In[11]; // Profile histogram for Q^2_x*Q^2_y (read from input file) + TProfile *fCos8PsiIn[11]; // Profile histogram for Cos(8*Psi) (read from input file) - ClassDef(AliVZEROEPSelectionTask,1) + ClassDef(AliVZEROEPSelectionTask,2) }; #endif diff --git a/STEER/AOD/AliAODEvent.h b/STEER/AOD/AliAODEvent.h index 960105d78f6..faf0cacc15a 100644 --- a/STEER/AOD/AliAODEvent.h +++ b/STEER/AOD/AliAODEvent.h @@ -274,6 +274,8 @@ class AliAODEvent : public AliVEvent { AliAODVZERO *GetVZEROData() const { return fAODVZERO; } virtual const Float_t* GetVZEROEqFactors() const {return fHeader?fHeader->GetVZEROEqFactors():0x0;} virtual Float_t GetVZEROEqMultiplicity(Int_t i) const; + virtual void SetVZEROEqFactors(Float_t factors[64]) const { + SetVZEROEqFactors(&factors[0]);} void SetVZEROEqFactors(const Float_t *factors) const { if(fHeader && factors) fHeader->SetVZEROEqFactors(factors);} diff --git a/STEER/ESD/AliESDEvent.h b/STEER/ESD/AliESDEvent.h index 685b021d339..2d62f5f37a4 100644 --- a/STEER/ESD/AliESDEvent.h +++ b/STEER/ESD/AliESDEvent.h @@ -168,7 +168,7 @@ public: // Bool_t InitMagneticField() const {return fESDRun?fESDRun->InitMagneticField():kFALSE;} void SetT0spread(Float_t *t) const {if(fESDRun) fESDRun->SetT0spread(t);} - void SetVZEROEqFactors(Float_t factors[64]) const {if(fESDRun) fESDRun->SetVZEROEqFactors(factors);} + virtual void SetVZEROEqFactors(Float_t factors[64]) const {if(fESDRun) fESDRun->SetVZEROEqFactors(factors);} // HEADER AliESDHeader* GetHeader() const {return fHeader;} diff --git a/STEER/STEERBase/AliEventplane.cxx b/STEER/STEERBase/AliEventplane.cxx index db887961bd2..c08e6439197 100644 --- a/STEER/STEERBase/AliEventplane.cxx +++ b/STEER/STEERBase/AliEventplane.cxx @@ -50,7 +50,7 @@ AliEventplane::AliEventplane() : TNamed("Eventplane", "Eventplane"), fQContributionYsub1 = new TArrayF(0); fQContributionXsub2 = new TArrayF(0); fQContributionYsub2 = new TArrayF(0); - for(Int_t i = 0; i < 8; ++i) { + for(Int_t i = 0; i < 11; ++i) { fMeanX2[i]=fMeanY2[i]=0.; fAPlus[i]=fAMinus[i]=1.; fLambdaPlus[i]=fLambdaMinus[i]=0.; @@ -112,7 +112,7 @@ void AliEventplane::CopyEP(AliEventplane& ep) const if (fQsubRes) target.fQsubRes = fQsubRes; - for(Int_t i = 0; i < 8; ++i) { + for(Int_t i = 0; i < 11; ++i) { target.fMeanX2[i]=fMeanX2[i]; target.fMeanY2[i]=fMeanY2[i]; target.fAPlus[i]=fAPlus[i]; @@ -174,15 +174,17 @@ Double_t AliEventplane::GetEventplane(const char *x, const AliVEvent *event, Int TString method = x; Double_t qx = 0, qy = 0; if(method.CompareTo("Q")==0) return fEventplaneQ; - else if(method.CompareTo("V0A")==0) return CalculateVZEROEventPlane(event, 4, 7, harmonic, qx, qy); - else if(method.CompareTo("V0C")==0) return CalculateVZEROEventPlane(event, 0, 3, harmonic, qx, qy); - else if(method.CompareTo("V0")==0) return CalculateVZEROEventPlane(event, 0, 7, harmonic, qx, qy); + else if(method.CompareTo("V0A")==0) return CalculateVZEROEventPlane(event, 8, harmonic, qx, qy); + else if(method.CompareTo("V0C")==0) return CalculateVZEROEventPlane(event, 9, harmonic, qx, qy); + else if(method.CompareTo("V0")==0) return CalculateVZEROEventPlane(event,10, harmonic, qx, qy); return -1000.; } Double_t AliEventplane::CalculateVZEROEventPlane(const AliVEvent * event, Int_t firstRing, Int_t lastRing, Int_t harmonic, Double_t &qxTot, Double_t &qyTot) const { + // Calculate the VZERO event-plane by summing rings + // The flatenning is done on every ring separately if(!event) { AliError("No Event received"); return -1000.; @@ -202,11 +204,6 @@ Double_t AliEventplane::CalculateVZEROEventPlane(const AliVEvent * event, Int_t Double_t totMult = 0.; for(Int_t ring = firstRing; ring <=lastRing; ++ring) { qx=qy=0.; - Double_t trans[2][2]; - trans[0][0] = 1./(1.-fLambdaPlus[ring]*fLambdaMinus[ring]); - trans[0][1] = -fLambdaMinus[ring]/(1.-fLambdaPlus[ring]*fLambdaMinus[ring]); - trans[1][0] = -fLambdaPlus[ring]/(1.-fLambdaPlus[ring]*fLambdaMinus[ring]); - trans[1][1] = 1./(1.-fLambdaPlus[ring]*fLambdaMinus[ring]); Double_t multRing = 0.; for(Int_t iCh = ring*8; iCh < (ring+1)*8; ++iCh) { Double_t phi = TMath::Pi()/8. + TMath::Pi()/4.*(iCh%8); @@ -224,6 +221,11 @@ Double_t AliEventplane::CalculateVZEROEventPlane(const AliVEvent * event, Int_t Double_t qxPrime = qx - fMeanX2[ring]; Double_t qyPrime = qy - fMeanY2[ring]; // Twist + Double_t trans[2][2]; + trans[0][0] = 1./(1.-fLambdaPlus[ring]*fLambdaMinus[ring]); + trans[0][1] = -fLambdaMinus[ring]/(1.-fLambdaPlus[ring]*fLambdaMinus[ring]); + trans[1][0] = -fLambdaPlus[ring]/(1.-fLambdaPlus[ring]*fLambdaMinus[ring]); + trans[1][1] = 1./(1.-fLambdaPlus[ring]*fLambdaMinus[ring]); Double_t qxSeconde = trans[0][0]*qxPrime + trans[0][1]*qyPrime; Double_t qySeconde = trans[1][0]*qxPrime + trans[1][1]*qyPrime; // Rescaling @@ -249,6 +251,65 @@ Double_t AliEventplane::CalculateVZEROEventPlane(const AliVEvent * event, Int_t return (TMath::ATan2(qyTot,qxTot)/harmonic); } +Double_t AliEventplane::CalculateVZEROEventPlane(const AliVEvent * event, Int_t ring, Int_t harmonic, Double_t &qx, Double_t &qy) const +{ + // Calculate the VZERO event-plane from an individual ring + // Ring 8 - total V0A (rings 4-7), Ring 9 - total V0C (rings 0-3) + // Ring 10 - total V0 (rings 0-7) + if(!event) { + AliError("No Event received"); + return -1000.; + } + AliVVZERO *vzeroData = event->GetVZEROData(); + if(!vzeroData) { + AliError("Enable to get VZERO Data"); + return -1000.; + } + if(harmonic <= 0) { + AliError("Required harmonic is less or equal to 0"); + return -1000.; + } + + qx=qy=0.; + Double_t multRing = 0.; + for(Int_t iCh = ring*8; iCh < (ring+1)*8; ++iCh) { + Double_t phi = TMath::Pi()/8. + TMath::Pi()/4.*(iCh%8); + Double_t mult = event->GetVZEROEqMultiplicity(iCh); + qx += mult*TMath::Cos(harmonic*phi); + qy += mult*TMath::Sin(harmonic*phi); + multRing += mult; + } + + // In case of no hits return an invalid event-plane angle + if (multRing < 1e-6) return -999; + + if (harmonic == 2) { + // Recentering + Double_t qxPrime = qx - fMeanX2[ring]; + Double_t qyPrime = qy - fMeanY2[ring]; + // Twist + Double_t trans[2][2]; + trans[0][0] = 1./(1.-fLambdaPlus[ring]*fLambdaMinus[ring]); + trans[0][1] = -fLambdaMinus[ring]/(1.-fLambdaPlus[ring]*fLambdaMinus[ring]); + trans[1][0] = -fLambdaPlus[ring]/(1.-fLambdaPlus[ring]*fLambdaMinus[ring]); + trans[1][1] = 1./(1.-fLambdaPlus[ring]*fLambdaMinus[ring]); + Double_t qxSeconde = trans[0][0]*qxPrime + trans[0][1]*qyPrime; + Double_t qySeconde = trans[1][0]*qxPrime + trans[1][1]*qyPrime; + // Rescaling + Double_t qxTierce = qxSeconde/fAPlus[ring]; + Double_t qyTierce = qySeconde/fAMinus[ring]; + // 4th Fourier momenta in order to flatten the EP within a sector + Double_t psi = TMath::ATan2(qyTierce,qxTierce)/harmonic; + Double_t deltaPsi = (fCos8Psi[ring]*TMath::Sin(2.*4.*psi))/2.; + Double_t qxQuarte = qxTierce*TMath::Cos(2.*deltaPsi) - qyTierce*TMath::Sin(2.*deltaPsi); + Double_t qyQuarte = qxTierce*TMath::Sin(2.*deltaPsi) + qyTierce*TMath::Cos(2.*deltaPsi); + qx = qxQuarte; + qy = qyQuarte; + } + + return (TMath::ATan2(qy,qx)/harmonic); +} + void AliEventplane::SetVZEROEPParams(Int_t ring, Double_t meanX2, Double_t meanY2, Double_t aPlus, Double_t aMinus, @@ -257,7 +318,7 @@ void AliEventplane::SetVZEROEPParams(Int_t ring, { // Set the VZERO event-plane // flatenning parameters - if (ring < 0 || ring >=8) AliFatal(Form("Bad ring index (%d)",ring)); + if (ring < 0 || ring >= 11) AliFatal(Form("Bad ring index (%d)",ring)); fMeanX2[ring] = meanX2; fMeanY2[ring] = meanY2; diff --git a/STEER/STEERBase/AliEventplane.h b/STEER/STEERBase/AliEventplane.h index fb27a3d53a0..50bb448403b 100644 --- a/STEER/STEERBase/AliEventplane.h +++ b/STEER/STEERBase/AliEventplane.h @@ -53,6 +53,7 @@ class AliEventplane : public TNamed Double_t GetQsubRes(); Bool_t IsEventInEventplaneClass(Double_t a, Double_t b, const char *method); Double_t CalculateVZEROEventPlane(const AliVEvent *event, Int_t firstRing, Int_t lastRing, Int_t harmonic, Double_t &qxTot, Double_t &qyTot) const; + Double_t CalculateVZEROEventPlane(const AliVEvent * event, Int_t ring, Int_t harmonic, Double_t &qx, Double_t &qy) const; void SetVZEROEPParams(Int_t ring, Double_t meanX2, Double_t meanY2, Double_t aPlus, Double_t aMinus, @@ -73,14 +74,14 @@ class AliEventplane : public TNamed TVector2* fQsub1; // Q-Vector of subevent 1 TVector2* fQsub2; // Q-Vector of subevent 2 Double_t fQsubRes; // Difference of EP angles of subevents - Double_t fMeanX2[8]; // Mean Q^2_X for VZERO EP - Double_t fMeanY2[8]; // Mean Q^2_Y for VZERO EP - Double_t fAPlus[8]; // Q^2_X rescaling parameter for VZERO EP - Double_t fAMinus[8]; // Q^2_Y rescaling parameter for VZERO EP - Double_t fLambdaPlus[8]; // Q^2_X twisting parameter for VZERO EP - Double_t fLambdaMinus[8]; // Q^2_Y twisting parameter for VZERO EP - Double_t fCos8Psi[8]; // 4th Fourier momenta used to flatten VZERO EP within a sector + Double_t fMeanX2[11]; // Mean Q^2_X for VZERO EP + Double_t fMeanY2[11]; // Mean Q^2_Y for VZERO EP + Double_t fAPlus[11]; // Q^2_X rescaling parameter for VZERO EP + Double_t fAMinus[11]; // Q^2_Y rescaling parameter for VZERO EP + Double_t fLambdaPlus[11]; // Q^2_X twisting parameter for VZERO EP + Double_t fLambdaMinus[11]; // Q^2_Y twisting parameter for VZERO EP + Double_t fCos8Psi[11]; // 4th Fourier momenta used to flatten VZERO EP within a sector - ClassDef(AliEventplane, 4) + ClassDef(AliEventplane, 5) }; #endif //ALIEVENTPLANE_H diff --git a/STEER/STEERBase/AliVEvent.h b/STEER/STEERBase/AliVEvent.h index 2b9e46c044a..d654de1ea9a 100644 --- a/STEER/STEERBase/AliVEvent.h +++ b/STEER/STEERBase/AliVEvent.h @@ -173,6 +173,7 @@ public: virtual AliVVZERO *GetVZEROData() const = 0; virtual const Float_t* GetVZEROEqFactors() const {return NULL;} virtual Float_t GetVZEROEqMultiplicity(Int_t /* i */) const {return -1;} + virtual void SetVZEROEqFactors(Float_t /* factors */[64]) const {return;} virtual AliVZDC *GetZDCData() const = 0; ClassDef(AliVEvent,2) // base class for AliEvent data -- 2.39.3