Adding flatenning to V0A,V0C and total V0 in addition to the existing ring-by-ring...
authorcvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 22 Mar 2012 21:13:45 +0000 (21:13 +0000)
committercvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 22 Mar 2012 21:13:45 +0000 (21:13 +0000)
ANALYSIS/AliVZEROEPSelectionTask.cxx
ANALYSIS/AliVZEROEPSelectionTask.h
STEER/AOD/AliAODEvent.h
STEER/ESD/AliESDEvent.h
STEER/STEERBase/AliEventplane.cxx
STEER/STEERBase/AliEventplane.h
STEER/STEERBase/AliVEvent.h

index 8ee3a43..248937a 100644 (file)
@@ -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));
index 2825e85..663e6e7 100644 (file)
@@ -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
index 960105d..faf0cac 100644 (file)
@@ -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);}
index 685b021..2d62f5f 100644 (file)
@@ -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;}
 
index db88796..c08e643 100644 (file)
@@ -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;
index fb27a3d..50bb448 100644 (file)
@@ -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
index 2b9e46c..d654de1 100644 (file)
@@ -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