AOD support for track pairs.
authorrvernet <rvernet@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 25 Aug 2008 17:01:51 +0000 (17:01 +0000)
committerrvernet <rvernet@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 25 Aug 2008 17:01:51 +0000 (17:01 +0000)
CORRFW/AliCFPair.cxx
CORRFW/AliCFPair.h
CORRFW/AliCFPairIsPrimaryCuts.cxx
CORRFW/AliCFPairIsPrimaryCuts.h
CORRFW/AliCFPairPidCut.cxx
CORRFW/AliCFPairPidCut.h
CORRFW/AliCFPairQualityCuts.cxx
CORRFW/AliCFPairQualityCuts.h
CORRFW/AliCFV0TopoCuts.cxx
CORRFW/AliCFV0TopoCuts.h

index 1fde08b..ca29ff0 100755 (executable)
 #include "AliESDv0.h"
 #include "AliESDEvent.h"
 #include "TMath.h"
+#include "AliAODv0.h"
 
 ClassImp(AliCFPair)
 
-AliCFPair::AliCFPair(AliESDtrack*t1, AliESDtrack*t2) :
+AliCFPair::AliCFPair(AliVParticle* t1, AliVParticle* t2) :
   AliVParticle(),
   fIsV0(0),
   fTrackNeg(t1),
   fTrackPos(t2),
-  fV0(0x0)
+  fESDV0(0x0),
+  fAODV0(0x0),
+  fLabel(-1),
+  fV0PDG(0)
 {
   //  
   // 2-track ctor
@@ -47,7 +51,24 @@ AliCFPair::AliCFPair(AliESDv0* v0, AliESDEvent* esd) :
   fIsV0(1),
   fTrackNeg(esd->GetTrack(v0->GetNindex())),
   fTrackPos(esd->GetTrack(v0->GetPindex())),
-  fV0(v0)
+  fESDV0(v0),
+  fAODV0(0x0),
+  fLabel(-1),
+  fV0PDG(0)
+{
+  //  
+  // V0 ctor
+  //
+}
+AliCFPair::AliCFPair(AliAODv0* v0) :
+  AliVParticle(),
+  fIsV0(1),
+  fTrackNeg((AliVParticle*)v0->GetSecondaryVtx()->GetDaughter(1)),
+  fTrackPos((AliVParticle*)v0->GetSecondaryVtx()->GetDaughter(0)),
+  fESDV0(0x0),
+  fAODV0(v0),
+  fLabel(-1),
+  fV0PDG(0)
 {
   //  
   // V0 ctor
@@ -58,7 +79,10 @@ AliCFPair::AliCFPair(const AliCFPair& c) :
   fIsV0(c.fIsV0),
   fTrackNeg(c.fTrackNeg),
   fTrackPos(c.fTrackPos),
-  fV0(c.fV0)
+  fESDV0(c.fESDV0),
+  fAODV0(c.fAODV0),
+  fLabel(c.fLabel),
+  fV0PDG(c.fV0PDG)
 {
   // 
   // Copy constructor.
@@ -74,7 +98,10 @@ AliCFPair& AliCFPair::operator=(const AliCFPair& c) {
     fIsV0 = c.fIsV0;
     fTrackNeg = c.fTrackNeg ;
     fTrackPos = c.fTrackPos ;
-    fV0 = c.fV0 ;
+    fESDV0 = c.fESDV0 ;
+    fAODV0 = c.fAODV0 ;
+    fLabel = c.fLabel ;
+    fV0PDG = c.fV0PDG ;
   }
   return *this;
 }
@@ -82,16 +109,17 @@ Bool_t AliCFPair::PxPyPz(Double_t p[3]) const {
   //
   // sets pair total momentum in vector p
   //
-  if (fIsV0) 
-    fV0->GetPxPyPz(p[0],p[1],p[2]);
-  else {
-    Double32_t p1[3], p2[3];
-    fTrackNeg->PxPyPz(p1);
-    fTrackPos->PxPyPz(p2);
-    p[0]=p1[0]+p2[0];
-    p[1]=p1[1]+p2[1];
-    p[2]=p1[2]+p2[2];
+  if (fIsV0) {
+    if      (fESDV0) fESDV0->GetPxPyPz(p[0],p[1],p[2]);
+    else if (fAODV0) fAODV0->PxPyPz(p);
+    else Error("PxPyPz","Pointer to V0 not found");
+  }
+  else if (fTrackNeg && fTrackPos) {
+    p[0]=fTrackNeg->Px()+fTrackPos->Px();
+    p[1]=fTrackNeg->Py()+fTrackPos->Py();
+    p[2]=fTrackNeg->Pz()+fTrackPos->Pz();
   }
+  else Error("PxPyPz","Could not find V0 nor track pointers");
   return kTRUE;
 }
 
@@ -151,16 +179,15 @@ Bool_t AliCFPair::XvYvZv(Double_t x[3]) const {
   // since this class is designed for resonances, the assumed pair position
   // should be the same for both tracks. neg track position is kept here
   //
-  if (fIsV0) 
-    fV0->GetXYZ(x[0],x[1],x[2]);
-  else {
-    Double32_t x1[3];
-    fTrackNeg->PxPyPz(x1);
-    x[0]=x1[0];
-    x[1]=x1[1];
-    x[2]=x1[2];
+  
+  if (fIsV0) {
+    if      (fESDV0) fESDV0->GetXYZ(x[0],x[1],x[2]);
+    else if (fAODV0) fAODV0->XvYvZv(x);
+    else Error("PxPyPz","Pointer to V0 not found");
   }
+  else if (fTrackNeg) fTrackNeg->PxPyPz(x);
+  else Error("PxPyPz","Could not find V0 nor track pointers");
+
   return kTRUE;
 }
 Double32_t AliCFPair::Xv() const {
@@ -233,13 +260,29 @@ Double32_t AliCFPair::M() const {
   // otherwise returns ESD-calculated mass
   //
 
-  Double32_t minv ;
+  Double32_t minv = 0. ;
 
-  if (fIsV0) minv = (Double32_t)fV0->GetEffMass();
-  else {
+  if (fIsV0) {
+    if      (fESDV0) {
+      fESDV0->ChangeMassHypothesis(fV0PDG);
+      minv = (Double32_t)fESDV0->GetEffMass();
+    }
+    else if (fAODV0) {
+      switch (fV0PDG) {
+      case 310  : minv = fAODV0->MassK0Short()    ; break ;
+      case 3122 : minv = fAODV0->MassLambda()     ; break ;
+      case -3122: minv = fAODV0->MassAntiLambda() ; break ;
+      default:    minv = -1.              ; break ;
+      }
+    }
+    else Error("PxPyPz","Pointer to V0 not found");
+  }
+  else if (fTrackNeg && fTrackPos) {
     Double32_t p  = P() ;
     Double32_t e = fTrackNeg->E() + fTrackPos->E() ;
     minv = TMath::Sqrt(e*e-p*p);
   }
+  else Error("M","Could not find V0 nor track pointers");
+  
   return minv ;
 }
index ce5442d..9e95174 100755 (executable)
 class AliESDtrack ;
 class AliESDv0;
 class AliESDEvent;
+class AliAODv0;
 
 class AliCFPair : public AliVParticle {
 
  public:
-  AliCFPair(AliESDtrack* t1, AliESDtrack* t2);
+  AliCFPair(AliVParticle* t1, AliVParticle* t2);
   AliCFPair(AliESDv0* v0, AliESDEvent* esd);
+  AliCFPair(AliAODv0* v0);
   AliCFPair(const AliCFPair& c);
   AliCFPair& operator=(const AliCFPair& c);
   virtual ~AliCFPair(){};
 
-  AliESDtrack* GetNeg() const {return fTrackNeg;}
-  AliESDtrack* GetPos() const {return fTrackPos;}
-  AliESDv0*    GetV0()  const {return fV0;}
+  AliVParticle* GetNeg() const {return fTrackNeg;}
+  AliVParticle* GetPos() const {return fTrackPos;}
+  AliESDv0*    GetESDV0()  const {return fESDV0;}
+  AliAODv0*    GetAODV0()  const {return fAODV0;}
+  void         SetV0PDG(Int_t pdg) {fV0PDG=pdg;}
   virtual Bool_t       PxPyPz(Double_t p[3]) const ;
   virtual Double32_t   P()  const ;
   virtual Double32_t   Pt() const ;
@@ -64,16 +68,20 @@ class AliCFPair : public AliVParticle {
   virtual Double32_t Eta() const ;
   virtual Double32_t Y() const ;
   virtual Short_t    Charge() const {return 0;} // returns 0 because opposite charge tracks... maybe to extend to all kinds of pairs
-
+  virtual Int_t      GetLabel() const {return fLabel;}
+  virtual void       SetLabel(Int_t label) {fLabel=label;}
   // PID
   virtual const Double_t *PID() const {return 0;} // return PID object (to be defined, still)
 
 
  private:
   Bool_t fIsV0;            // true if V0 passed to the constructor
-  AliESDtrack* fTrackNeg;  // pointer to the negative track
-  AliESDtrack* fTrackPos;  // pointer to the positive track
-  AliESDv0*    fV0;        // pointer to the V0 if V0 is passed to the constructor
+  AliVParticle* fTrackNeg; // pointer to the negative track 
+  AliVParticle* fTrackPos; // pointer to the positive track 
+  AliESDv0*    fESDV0;     // pointer to the ESD V0 if AliESDv0 is passed to the constructor
+  AliAODv0*    fAODV0;     // pointer to the AOD V0 if AliAODv0 is passed to the constructor
+  Int_t        fLabel;     // associated MC label
+  Int_t        fV0PDG;     // assumed V0 PDG
   
   ClassDef(AliCFPair,0);
 };
index e7db821..d73a735 100755 (executable)
@@ -85,8 +85,8 @@ Bool_t AliCFPairIsPrimaryCuts::IsSelected(TObject* obj) {
 
   AliCFPair* pair = dynamic_cast<AliCFPair*>(obj);
 
-  AliESDtrack* tneg = pair->GetNeg();
-  AliESDtrack* tpos = pair->GetPos();
+  AliVParticle* tneg = pair->GetNeg();
+  AliVParticle* tpos = pair->GetPos();
   if (!tneg || !tpos) return kFALSE ;
 
   if ( ! fCutNeg->IsSelected((TObject*)tneg) || ! fCutPos->IsSelected((TObject*)tpos) ) return kFALSE ;
index 893a599..2113cd7 100755 (executable)
@@ -42,8 +42,12 @@ class AliCFPairIsPrimaryCuts : public AliCFCutBase
   {fCutNeg->SetMaxNSigmaToVertex(neg); fCutPos->SetMaxNSigmaToVertex(pos);}
   void SetRequireSigmaToVertex(Bool_t b1, Bool_t b2)
   {fCutNeg->SetRequireSigmaToVertex(b1); fCutPos->SetRequireSigmaToVertex(b2);}
+  void SetAcceptKinkDaughters(Bool_t b1, Bool_t b2)
+  {fCutNeg->SetAcceptKinkDaughters(b1); fCutPos->SetAcceptKinkDaughters(b2);}
+  void SetAODType(Char_t typeNeg, Char_t typePos)
+  {fCutNeg->SetAODType(typeNeg); fCutPos->SetAODType(typePos);}
 
-  ClassDef(AliCFPairIsPrimaryCuts,1);
+  ClassDef(AliCFPairIsPrimaryCuts,2);
 
  private :
   AliCFTrackIsPrimaryCuts *fCutNeg ; // isprimary cut on negative daughter
index 8cfcfa6..d18bfd5 100755 (executable)
@@ -83,8 +83,8 @@ Bool_t AliCFPairPidCut::IsSelected(TObject* obj) {
 
   AliCFPair* pair = dynamic_cast<AliCFPair*>(obj);
 
-  AliESDtrack* tneg = pair->GetNeg();
-  AliESDtrack* tpos = pair->GetPos();
+  AliVParticle* tneg = pair->GetNeg();
+  AliVParticle* tpos = pair->GetPos();
 
   if (!tneg || !tpos) return kFALSE ;
   if ( ! fCutNeg->IsSelected(tneg) || ! fCutPos->IsSelected(tpos) ) return kFALSE ;
index 86fcacc..fb4e2d7 100755 (executable)
@@ -52,6 +52,7 @@ class AliCFPairPidCut : public AliCFCutBase
   {fCutNeg->SetMinDiffResp(check1,mindiff1); fCutPos->SetMinDiffResp(check2,mindiff2);}     //set checking at det. response level
   void SetMinDiffProb(Bool_t check1, Double_t mindiff1, Bool_t check2, Double_t mindiff2)
   {fCutNeg->SetMinDiffProb(check1,mindiff1); fCutPos->SetMinDiffProb(check2,mindiff2);}  //set checking at probability level
+  void SetAODmode(Bool_t mode) {fCutNeg->SetAODmode(mode); fCutPos->SetAODmode(mode);}
 
   Bool_t IsSelected(TObject *obj); //boolean for detectors
   Bool_t IsSelected(TList* /*list*/) {return kTRUE;}
index e27393b..dbc18bd 100755 (executable)
@@ -84,8 +84,8 @@ Bool_t AliCFPairQualityCuts::IsSelected(TObject* obj) {
 
   AliCFPair* pair = dynamic_cast<AliCFPair*>(obj);
 
-  AliESDtrack* tneg = pair->GetNeg();
-  AliESDtrack* tpos = pair->GetPos();
+  AliVParticle* tneg = pair->GetNeg();
+  AliVParticle* tpos = pair->GetPos();
   if (!tneg || !tpos) return kFALSE ;
 
   if ( ! fCutNeg->IsSelected((TObject*)tneg) || ! fCutPos->IsSelected((TObject*)tpos) ) return kFALSE ;
index 85e0222..2e66688 100755 (executable)
@@ -48,22 +48,17 @@ class AliCFPairQualityCuts : public AliCFCutBase
   {fCutNeg->SetMaxChi2PerClusterTPC(chi2Neg); fCutPos->SetMaxChi2PerClusterTPC(chi2Pos);}
   virtual void SetMaxChi2PerClusterITS(Double32_t chi2Neg, Double32_t chi2Pos) 
   {fCutNeg->SetMaxChi2PerClusterITS(chi2Neg); fCutPos->SetMaxChi2PerClusterITS(chi2Pos);}
-  virtual void SetRequireTPCRefit(Bool_t neg, Bool_t pos) 
-  {fCutNeg->SetRequireTPCRefit(neg); fCutPos->SetRequireTPCRefit(pos);}
-  virtual void SetRequireITSRefit(Bool_t neg, Bool_t pos) 
-  {fCutNeg->SetRequireITSRefit(neg); fCutPos->SetRequireITSRefit(pos);}
-  virtual void SetMaxCovDiagonalElements(Double32_t* neg/*[5]*/, Double32_t* pos/*[5]*/) { 
+  virtual void SetMaxCovDiagonalElements(Double32_t* neg/*[5]*/, Double32_t* pos/*[5]*/) {
     fCutNeg->SetMaxCovDiagonalElements(neg[0],neg[1],neg[2],neg[3],neg[4]); 
     fCutPos->SetMaxCovDiagonalElements(pos[0],pos[1],pos[2],pos[3],pos[4]); }
-
-  
-
-  ClassDef(AliCFPairQualityCuts,1);
+  virtual void SetStatus(ULong_t statusNeg, ULong_t statusPos) 
+  {fCutNeg->SetStatus(statusNeg); fCutPos->SetStatus(statusPos);}
 
  private :
   AliCFTrackQualityCuts *fCutNeg ; // quality cut on negative daughter
   AliCFTrackQualityCuts *fCutPos ; // quality cut on positive daughter
 
+  ClassDef(AliCFPairQualityCuts,2);
 };
 
 #endif
index d301727..0214f9e 100755 (executable)
@@ -30,6 +30,9 @@
 #include "AliESDv0.h"
 #include "AliESDtrack.h"
 #include "AliCFPair.h"
+#include "AliAODv0.h"
+#include "AliVEvent.h"
+#include "AliAODEvent.h"
 
 ClassImp(AliCFV0TopoCuts)
 
@@ -39,7 +42,8 @@ AliCFV0TopoCuts::AliCFV0TopoCuts() :
   fMaxDcaDaughters(1.e99),
   fMinDcaNeg(0),
   fMinDcaPos(0),
-  fMinCosP(0)
+  fMinCosP(0),
+  fEvent(0x0)
 {
   //
   //default constructor
@@ -52,7 +56,8 @@ AliCFV0TopoCuts::AliCFV0TopoCuts(const Char_t* name, const Char_t* title) :
   fMaxDcaDaughters(1.e99),
   fMinDcaNeg(0),
   fMinDcaPos(0),
-  fMinCosP(0)
+  fMinCosP(0),
+  fEvent(0x0)
 {
   //
 }
@@ -63,7 +68,8 @@ AliCFV0TopoCuts::AliCFV0TopoCuts(const AliCFV0TopoCuts& c) :
   fMaxDcaDaughters(c.fMaxDcaDaughters),
   fMinDcaNeg(c.fMinDcaNeg),
   fMinDcaPos(c.fMinDcaPos),
-  fMinCosP(c.fMinCosP)
+  fMinCosP(c.fMinCosP),
+  fEvent(c.fEvent)
 {
   //
   // copy constructor
@@ -83,6 +89,7 @@ AliCFV0TopoCuts& AliCFV0TopoCuts::operator=(const AliCFV0TopoCuts& c)
     fMinDcaNeg       = c.fMinDcaNeg ;
     fMinDcaPos       = c.fMinDcaPos ;
     fMinCosP         = c.fMinCosP ;
+    fEvent           = c.fEvent ;
   }
   return *this ;
 }
@@ -102,25 +109,41 @@ Bool_t AliCFV0TopoCuts::IsSelected(TObject *obj) {
     return kFALSE ;
   }
 
-  AliCFPair * pair = dynamic_cast<AliCFPair*>(obj);
-  AliESDv0    * v0          = pair->GetV0();
-  AliESDtrack * negDaughter = pair->GetNeg();
-  AliESDtrack * posDaughter = pair->GetPos();
-
-  if (v0->GetDcaV0Daughters() > fMaxDcaDaughters)  return kFALSE ;
-  if (v0->GetV0CosineOfPointingAngle() < fMinCosP) return kFALSE ;
-
-
-  Float_t tDca[2];
-  if (negDaughter) negDaughter->GetImpactParameters(tDca[0],tDca[1]);
-  else { tDca[0]=1.e99;  tDca[1]=1.e99;}
-  Double32_t negDca = TMath::Sqrt(tDca[0]*tDca[0]+tDca[1]*tDca[1]);
-  if (posDaughter) posDaughter->GetImpactParameters(tDca[0],tDca[1]);
-  else { tDca[0]=1.e99;  tDca[1]=1.e99;}
-  Double32_t posDca = TMath::Sqrt(tDca[0]*tDca[0]+tDca[1]*tDca[1]);
+  AliCFPair    * pair        = dynamic_cast<AliCFPair*>(obj);
+  AliESDv0     * esdV0       = pair->GetESDV0();
+  AliAODv0     * aodV0       = pair->GetAODV0();
+  AliVParticle * negDaughter = pair->GetNeg();
+  AliVParticle * posDaughter = pair->GetPos();
+
+  Double32_t dcaDaughters = 0. ;
+  Double32_t cosP   = 0. ;
+  Double32_t negDca = 0. ;
+  Double32_t posDca = 0. ;
+
+  if (esdV0) {
+    dcaDaughters = esdV0->GetDcaV0Daughters() ;
+    cosP         = esdV0->GetV0CosineOfPointingAngle() ;
+
+    Float_t tDca[2];
+    if (negDaughter) ((AliESDtrack*)negDaughter)->GetImpactParameters(tDca[0],tDca[1]);
+    else { tDca[0]=1.e99;  tDca[1]=1.e99;}
+    negDca = TMath::Sqrt(tDca[0]*tDca[0]+tDca[1]*tDca[1]);
+    if (posDaughter) ((AliESDtrack*)posDaughter)->GetImpactParameters(tDca[0],tDca[1]);
+    else { tDca[0]=1.e99;  tDca[1]=1.e99;}
+    posDca = TMath::Sqrt(tDca[0]*tDca[0]+tDca[1]*tDca[1]);
+  }
+  else if (aodV0) {
+    dcaDaughters = aodV0->DcaV0Daughters() ;
+    negDca       = aodV0->DcaNegToPrimVertex() ;
+    posDca       = aodV0->DcaPosToPrimVertex() ;
+    cosP         = aodV0->CosPointingAngle(((AliAODEvent*)fEvent)->GetPrimaryVertex()) ;
+  }
+  else Error("IsSelected","No V0 pointer available");
 
-  if (negDca < fMinDcaNeg) return kFALSE ;
-  if (posDca < fMinDcaPos) return kFALSE ; 
+  if (dcaDaughters > fMaxDcaDaughters) return kFALSE ;
+  if (cosP         < fMinCosP        ) return kFALSE ;
+  if (negDca       < fMinDcaNeg      ) return kFALSE ;
+  if (posDca       < fMinDcaPos      ) return kFALSE ; 
 
   return kTRUE ;
 }
index c470c67..b189039 100755 (executable)
@@ -32,6 +32,7 @@
 #include "AliCFCutBase.h"
 
 class TObject;
+class AliVEvent;
 
 class AliCFV0TopoCuts : public AliCFCutBase 
 {
@@ -43,6 +44,7 @@ class AliCFV0TopoCuts : public AliCFCutBase
   virtual ~AliCFV0TopoCuts() { } ;
   Bool_t IsSelected(TObject* v0) ;
   Bool_t IsSelected(TList* /*list*/) {return kTRUE;}
+  void   SetEvtInfo(TObject* evt) {fEvent = (AliVEvent*)evt;}
   void   SetMaxDcaDaughters (Double32_t dca)  {fMaxDcaDaughters = dca;}
   void   SetMinDcaNeg       (Double32_t dca)  {fMinDcaNeg = dca;}
   void   SetMinDcaPos       (Double32_t dca)  {fMinDcaPos = dca;}
@@ -53,6 +55,7 @@ class AliCFV0TopoCuts : public AliCFCutBase
   Double32_t   fMinDcaNeg ;       // min impact parameter (aka dca to prim. vertex) of neg. daughter
   Double32_t   fMinDcaPos ;       // min impact parameter (aka dca to prim. vertex) of pos. daughter
   Double32_t   fMinCosP ;         // min cosine of pointing angle
+  AliVEvent*   fEvent;            // pointer to current event (needed for cuts related to PV position)
   
   ClassDef(AliCFV0TopoCuts,0);
 };