#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
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
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.
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;
}
//
// 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;
}
// 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 {
// 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 ;
}
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 ;
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);
};
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 ;
{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
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 ;
{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;}
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 ;
{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
#include "AliESDv0.h"
#include "AliESDtrack.h"
#include "AliCFPair.h"
+#include "AliAODv0.h"
+#include "AliVEvent.h"
+#include "AliAODEvent.h"
ClassImp(AliCFV0TopoCuts)
fMaxDcaDaughters(1.e99),
fMinDcaNeg(0),
fMinDcaPos(0),
- fMinCosP(0)
+ fMinCosP(0),
+ fEvent(0x0)
{
//
//default constructor
fMaxDcaDaughters(1.e99),
fMinDcaNeg(0),
fMinDcaPos(0),
- fMinCosP(0)
+ fMinCosP(0),
+ fEvent(0x0)
{
//
}
fMaxDcaDaughters(c.fMaxDcaDaughters),
fMinDcaNeg(c.fMinDcaNeg),
fMinDcaPos(c.fMinDcaPos),
- fMinCosP(c.fMinCosP)
+ fMinCosP(c.fMinCosP),
+ fEvent(c.fEvent)
{
//
// copy constructor
fMinDcaNeg = c.fMinDcaNeg ;
fMinDcaPos = c.fMinDcaPos ;
fMinCosP = c.fMinCosP ;
+ fEvent = c.fEvent ;
}
return *this ;
}
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 ;
}
#include "AliCFCutBase.h"
class TObject;
+class AliVEvent;
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;}
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);
};