Add a draw class for the CORRFW (produces a warning, will be fixed
[u/mrichter/AliRoot.git] / PWG3 / dielectron / AliDielectronVarManager.h
index c57f34db475da4c72a3ead95aa907f78b5a942b2..7e82f2c9b13486a528a6c07ef8f346e6fefe60b1 100644 (file)
@@ -12,7 +12,7 @@
 //#   Anton     Andronic, GSI / A.Andronic@gsi.de             #
 //#   Ionut C.  Arsene,   GSI / I.C.Arsene@gsi.de             #
 //#   Julian    Book,     Uni Ffm / Julian.Book@cern.ch       #
-//#   Frederick Kramer,   Uni Ffm, / Frederick.Kramer@cern.ch #
+//#   Frederick Kramer,   Uni Ffm / Frederick.Kramer@cern.ch  #
 //#   Magnus    Mager,    CERN / Magnus.Mager@cern.ch         #
 //#   WooJin J. Park,     GSI / W.J.Park@gsi.de               #
 //#   Jens      Wiechula, Uni HD / Jens.Wiechula@cern.ch      #
 
 #include <AliVEvent.h>
 #include <AliESDEvent.h>
+#include <AliAODEvent.h>
+#include <AliMCEvent.h>
+#include <AliVVertex.h>
+#include <AliESDVertex.h>
 
 #include <AliVParticle.h>
-#include <AliExternalTrackParam.h>
 #include <AliESDtrack.h>
 #include <AliAODTrack.h>
 #include <AliKFParticle.h>
@@ -34,6 +37,9 @@
 #include <AliAODMCParticle.h>
 #include <AliVTrack.h>  // ?
 
+#include <AliExternalTrackParam.h>
+#include <AliESDpid.h>
+
 #include "AliDielectronPair.h"
 
 class AliVEvent;
@@ -74,6 +80,7 @@ public:
     kPdgCode,                // PDG code
     kPIn,                    // momentum at inner wall of TPC (if available), used for PID
     kTPCsignal,              // TPC dE/dx signal
+    kTPCnSigmaEle,           // number of sigmas to the dE/dx electron line in the TPC
     kParticleMax,             //
     // TODO: kRNClusters ??
   // AliDielectronPair specific variables
@@ -86,14 +93,15 @@ public:
     kPairType,               // type of the pair, like like sign ++ unlikesign ...
     kPairMax,                 //
   // Event specific variables
-    kXvPrim=kPairMax,        // TODO: prim vertex
-    kYvPrim,                 // TODO: prim vertex
-    kZvPrim,                 // TODO: prim vertex
-    kXRes,                   // primary vertex x-resolution (AliESDVertex)
-    kYRes,                   // primary vertex y-resolution (AliESDVertex)
-    kZRes,                   // primary vertex z-resolution (AliESDVertex)
+    kXvPrim=kPairMax,        // prim vertex
+    kYvPrim,                 // prim vertex
+    kZvPrim,                 // prim vertex
+    kXRes,                   // primary vertex x-resolution
+    kYRes,                   // primary vertex y-resolution
+    kZRes,                   // primary vertex z-resolution
     kNTrk,                   // number of tracks (or tracklets)
-    kTracks,                 // ESD tracks (AliESDEvent)
+    kTracks,                 // ESD tracks
+    kNevents,                // event counter
     kNMaxValues              //
     // TODO: (for A+A) ZDCEnergy, impact parameter, Iflag??
   };
@@ -104,6 +112,9 @@ public:
   virtual ~AliDielectronVarManager();
   static void Fill(const TObject* particle, Double_t * const values);
 
+  static void InitESDpid(Int_t type=0);
+  static void SetEvent(AliVEvent * const ev) { fgEvent = ev; }
+
   static const char* GetValueName(Int_t i) { return (i>=0&&i<kNMaxValues)?fgkParticleNames[i]:""; }
 private:
 
@@ -112,9 +123,16 @@ private:
   static void FillVarVParticle(const AliVParticle *particle,         Double_t * const values);
   static void FillVarESDtrack(const AliESDtrack *particle,           Double_t * const values);
   static void FillVarAODTrack(const AliAODTrack *particle,           Double_t * const values);
-  static  void FillVarMCParticle(const AliMCParticle *particle,       Double_t * const values);
+  static  void FillVarMCParticle(const AliMCParticle *particle,      Double_t * const values);
   static void FillVarAODMCParticle(const AliAODMCParticle *particle, Double_t * const values);
   static void FillVarDielectronPair(const AliDielectronPair *pair,   Double_t * const values);
+  static void FillVarVEvent(const AliVEvent *event,                  Double_t * const values);
+  static void FillVarESDEvent(const AliESDEvent *event,              Double_t * const values);
+  static void FillVarAODEvent(const AliAODEvent *event,              Double_t * const values);
+  static void FillVarMCEvent(const AliMCEvent *event,                Double_t * const values);
+
+  static AliESDpid* fgESDpid;                 // ESD pid object
+  static AliVEvent* fgEvent;                  // current event pointer
 
   AliDielectronVarManager(const AliDielectronVarManager &c);
   AliDielectronVarManager &operator=(const AliDielectronVarManager &c);
@@ -124,18 +142,25 @@ private:
 
 
 //Inline functions
-inline void AliDielectronVarManager::Fill(const TObject* particle, Double_t * const values)
+inline void AliDielectronVarManager::Fill(const TObject* object, Double_t * const values)
 {
   //
   // Main function to fill all available variables according to the type of particle
   //
 
-  if      (particle->IsA() == AliESDtrack::Class())       FillVarESDtrack(static_cast<const AliESDtrack*>(particle), values);
-  else if (particle->IsA() == AliAODTrack::Class())       FillVarAODTrack(static_cast<const AliAODTrack*>(particle), values);
-  else if (particle->IsA() == AliMCParticle::Class())     FillVarMCParticle(static_cast<const AliMCParticle*>(particle), values);
-  else if (particle->IsA() == AliAODMCParticle::Class())  FillVarAODMCParticle(static_cast<const AliAODMCParticle*>(particle), values);
-  else if (particle->IsA() == AliDielectronPair::Class()) FillVarDielectronPair(static_cast<const AliDielectronPair*>(particle), values);
-//   else Error("Fill",Form("Type %s is not supported by AliDielectronVarManager!", particle->ClassName())); //TODO: implement without object needed
+  if      (object->IsA() == AliESDtrack::Class())       FillVarESDtrack(static_cast<const AliESDtrack*>(object), values);
+  else if (object->IsA() == AliAODTrack::Class())       FillVarAODTrack(static_cast<const AliAODTrack*>(object), values);
+  else if (object->IsA() == AliMCParticle::Class())     FillVarMCParticle(static_cast<const AliMCParticle*>(object), values);
+  else if (object->IsA() == AliAODMCParticle::Class())  FillVarAODMCParticle(static_cast<const AliAODMCParticle*>(object), values);
+  else if (object->IsA() == AliDielectronPair::Class()) FillVarDielectronPair(static_cast<const AliDielectronPair*>(object), values);
+
+  // Main function to fill all available variables according to the type of event
+  
+  else if (object->IsA() == AliVEvent::Class())         FillVarVEvent(static_cast<const AliVEvent*>(object), values);
+  else if (object->IsA() == AliESDEvent::Class())       FillVarESDEvent(static_cast<const AliESDEvent*>(object), values);
+  else if (object->IsA() == AliAODEvent::Class())       FillVarAODEvent(static_cast<const AliAODEvent*>(object), values);
+  else if (object->IsA() == AliMCEvent::Class())        FillVarMCEvent(static_cast<const AliMCEvent*>(object), values);
+//   else Error("Fill",Form("Type %s is not supported by AliDielectronVarManager!", object->ClassName())); //TODO: implement without object needed
 }
 
 inline void AliDielectronVarManager::FillVarVParticle(const AliVParticle *particle, Double_t * const values)
@@ -162,6 +187,8 @@ inline void AliDielectronVarManager::FillVarVParticle(const AliVParticle *partic
   values[AliDielectronVarManager::kE]         = particle->E();
   values[AliDielectronVarManager::kM]         = particle->M();
   values[AliDielectronVarManager::kCharge]    = particle->Charge();
+
+  if ( fgEvent ) AliDielectronVarManager::Fill(fgEvent, values);
 }
 
 inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle, Double_t * const values)
@@ -188,14 +215,16 @@ inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle
   values[AliDielectronVarManager::kImpactParZ]    = impactParZ;
 
   values[AliDielectronVarManager::kTrackLength]   = particle->GetIntegratedLength();
-
   //dEdx information
   Double_t mom = particle->GetP();
   const AliExternalTrackParam *in=particle->GetInnerParam();
   if (in) mom = in->GetP();
   values[AliDielectronVarManager::kPIn]=mom;
   values[AliDielectronVarManager::kTPCsignal]=particle->GetTPCsignal();
-  
+  // nsigma to Electron band
+  // TODO: for the moment we set the bethe bloch parameters manually
+  //       this should be changed in future!
+  values[AliDielectronVarManager::kTPCnSigmaEle]=fgESDpid->NumberOfSigmasTPC(particle,AliPID::kElectron);
 }
 
 inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle, Double_t * const values)
@@ -257,6 +286,92 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa
   values[AliDielectronVarManager::kPairType]     = pair->GetType();
 }
 
+
+inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Double_t * const values)
+{
+  //
+  // Fill event information available for histogramming into an array
+  //
+  const AliVVertex *primVtx = event->GetPrimaryVertex();
+  values[AliDielectronVarManager::kXvPrim]       = primVtx->GetX();
+  values[AliDielectronVarManager::kYvPrim]       = primVtx->GetY();
+  values[AliDielectronVarManager::kZvPrim]       = primVtx->GetZ();
+  values[AliDielectronVarManager::kChi2NDF]      = primVtx->GetChi2perNDF();
+
+  values[AliDielectronVarManager::kNTrk]         = event->GetNumberOfTracks();
+  values[AliDielectronVarManager::kNevents]      = 0; //always fill bin 0;
+}
+
+inline void AliDielectronVarManager::FillVarESDEvent(const AliESDEvent *event, Double_t * const values)
+{
+  //
+  // Fill event information available for histogramming into an array
+  // 
+  
+  // Fill common AliVEvent interface information
+  FillVarVEvent(event, values);
+  // Fill AliESDEvent interface specific information
+  const AliESDVertex *primVtx = event->GetPrimaryVertex();
+  values[AliDielectronVarManager::kXRes]       = primVtx->GetXRes();
+  values[AliDielectronVarManager::kYRes]       = primVtx->GetYRes();
+  values[AliDielectronVarManager::kZRes]       = primVtx->GetZRes();
+}
+  
+inline void AliDielectronVarManager::FillVarAODEvent(const AliAODEvent *event, Double_t * const values)
+{
+  //
+  // Fill event information available for histogramming into an array
+  //   
+
+  // Fill common AliVEvent interface information
+  FillVarVEvent(event, values);
+
+  // Fill AliAODEvent interface specific information
+}
+  
+inline void AliDielectronVarManager::FillVarMCEvent(const AliMCEvent *event, Double_t * const values)
+{ 
+  //
+  // Fill event information available for histogramming into an array
+  //   
+        
+  // Fill common AliVEvent interface information
+  FillVarVEvent(event, values);
+
+  // Fill AliMCEvent interface specific information
+} 
+  
+inline void AliDielectronVarManager::InitESDpid(Int_t type)
+{
+  //
+  // initialize PID parameters
+  // type=0 is simulation
+  // type=1 is data
+
+  Double_t alephParameters[5];
+  // simulation
+  alephParameters[0] = 2.15898e+00/50.;
+  alephParameters[1] = 1.75295e+01;
+  alephParameters[2] = 3.40030e-09;
+  alephParameters[3] = 1.96178e+00;
+  alephParameters[4] = 3.91720e+00;
+  
+  // data
+  if (type==1){
+    alephParameters[0] = 0.0283086;
+    alephParameters[1] = 2.63394e+01;
+    alephParameters[2] = 5.04114e-11;
+    alephParameters[3] = 2.12543e+00;
+    alephParameters[4] = 4.88663e+00;
+  }
+
+  fgESDpid->GetTPCResponse().SetBetheBlochParameters(
+    alephParameters[0],alephParameters[1],alephParameters[2],
+    alephParameters[3],alephParameters[4]);
+  
+}
+
 /*
 inline void AliDielectronVarManager::FillValues(const TParticle *particle, Double_t *values)
 {