fESDtrackCuts(0x0),
fMiniEvent(0x0),
fBigOutput(kFALSE),
- fMixPrintRefresh(-1)
+ fMixPrintRefresh(-1),
+ fMaxNDaughters(-1),
+ fCheckP(kFALSE)
{
//
// Dummy constructor ALWAYS needed for I/O.
fESDtrackCuts(0x0),
fMiniEvent(0x0),
fBigOutput(kFALSE),
- fMixPrintRefresh(-1)
+ fMixPrintRefresh(-1),
+ fMaxNDaughters(-1),
+ fCheckP(kFALSE)
{
//
// Default constructor.
fESDtrackCuts(copy.fESDtrackCuts),
fMiniEvent(0x0),
fBigOutput(copy.fBigOutput),
- fMixPrintRefresh(copy.fMixPrintRefresh)
+ fMixPrintRefresh(copy.fMixPrintRefresh),
+ fMaxNDaughters(copy.fMaxNDaughters),
+ fCheckP(copy.fCheckP)
{
//
// Copy constructor.
fESDtrackCuts = copy.fESDtrackCuts;
fBigOutput = copy.fBigOutput;
fMixPrintRefresh = copy.fMixPrintRefresh;
+ fMaxNDaughters = copy.fMaxNDaughters;
+ fCheckP = copy.fCheckP;
return (*this);
}
//get mother pdg code
if (part->Particle()->GetPdgCode() != def->GetMotherPDG()) continue;
// check that daughters match expected species
- if (part->Particle()->GetNDaughters() < 2) continue;
+ if (part->Particle()->GetNDaughters() < 2) continue;
+ if (fMaxNDaughters > 0 && part->Particle()->GetNDaughters() > fMaxNDaughters) continue;
label1 = part->Particle()->GetDaughter(0);
label2 = part->Particle()->GetDaughter(1);
daughter1 = (AliMCParticle *)fMCEvent->GetTrack(label1);
p2.SetXYZM(daughter2->Px(), daughter2->Py(), daughter2->Pz(), def->GetMass(0));
}
if (!okMatch) continue;
+ if(fCheckP && (TMath::Abs(part->Px()-(daughter1->Px()+daughter2->Px()))/(TMath::Abs(part->Px())+1.e-13)) > 0.00001 &&
+ (TMath::Abs(part->Py()-(daughter1->Py()+daughter2->Py()))/(TMath::Abs(part->Py())+1.e-13)) > 0.00001 &&
+ (TMath::Abs(part->Pz()-(daughter1->Pz()+daughter2->Pz()))/(TMath::Abs(part->Pz())+1.e-13)) > 0.00001 ) continue;
// assign momenta to computation object
miniPair.Sum(0) = miniPair.Sum(1) = (p1 + p2);
miniPair.FillRef(def->GetMotherMass());
if (part->GetPdgCode() != def->GetMotherPDG()) continue;
// check that daughters match expected species
if (part->GetNDaughters() < 2) continue;
+ if (fMaxNDaughters > 0 && part->GetNDaughters() > fMaxNDaughters) continue;
label1 = part->GetDaughter(0);
label2 = part->GetDaughter(1);
daughter1 = (AliAODMCParticle *)list->At(label1);
p2.SetXYZM(daughter2->Px(), daughter2->Py(), daughter2->Pz(), def->GetMass(0));
}
if (!okMatch) continue;
- // assign momenta to computation object
+ if(fCheckP && (TMath::Abs(part->Px()-(daughter1->Px()+daughter2->Px()))/(TMath::Abs(part->Px())+1.e-13)) > 0.00001 &&
+ (TMath::Abs(part->Py()-(daughter1->Py()+daughter2->Py()))/(TMath::Abs(part->Py())+1.e-13)) > 0.00001 &&
+ (TMath::Abs(part->Pz()-(daughter1->Pz()+daughter2->Pz()))/(TMath::Abs(part->Pz())+1.e-13)) > 0.00001 ) continue;
+
+ // assign momenta to computation object
miniPair.Sum(0) = miniPair.Sum(1) = (p1 + p2);
miniPair.FillRef(def->GetMotherMass());
// do computations
void SetMaxDiffAngle(Double_t val) {fMaxDiffAngle = val;}
void SetEventCuts(AliRsnCutSet *cuts) {fEventCuts = cuts;}
void SetMixPrintRefresh(Int_t n) {fMixPrintRefresh = n;}
+ void SetMaxNDaughters(Short_t n) {fMaxNDaughters = n;}
+ void SetCheckMomentumConservation(Bool_t checkP) {fCheckP = checkP;}
Int_t AddTrackCuts(AliRsnCutSet *cuts);
TClonesArray *Outputs() {return &fHistograms;}
TClonesArray *Values() {return &fValues;}
+ Short_t GetMaxNDaughters() {return fMaxNDaughters;}
void SetEventQAHist(TString type,TH2F *histo);
void UseBigOutput(Bool_t b=kTRUE) { fBigOutput = b; }
AliRsnMiniEvent *fMiniEvent; //! mini-event cursor
Bool_t fBigOutput; // flag if open file for output list
Int_t fMixPrintRefresh; // how often info in mixing part is printed
+ Short_t fMaxNDaughters; // maximum number of allowed mother's daughter
+ Bool_t fCheckP; // flag to set in order to check the momentum conservation for mothers
- ClassDef(AliRsnMiniAnalysisTask, 6); // AliRsnMiniAnalysisTask
+ ClassDef(AliRsnMiniAnalysisTask, 7); // AliRsnMiniAnalysisTask
};
#include "AliRsnMiniParticle.h"
#include "AliRsnMiniPair.h"
#include "AliRsnMiniEvent.h"
+#include "AliAODEvent.h"
#include "AliLog.h"
#include "AliRsnCutSet.h"
fList(0x0),
fSel1(0),
fSel2(0),
+ fMaxNSisters(-1),
+ fCheckP(kFALSE),
fCheckHistRange(kTRUE)
{
//
fList(0x0),
fSel1(0),
fSel2(0),
+ fMaxNSisters(-1),
+ fCheckP(kFALSE),
fCheckHistRange(kTRUE)
{
//
fList(0x0),
fSel1(0),
fSel2(0),
+ fMaxNSisters(-1),
+ fCheckP(kFALSE),
fCheckHistRange(kTRUE)
{
//
fList(copy.fList),
fSel1(0),
fSel2(0),
+ fMaxNSisters(-1),
+ fCheckP(kFALSE),
fCheckHistRange(copy.fCheckHistRange)
{
//
fSel1.Set(0);
fSel2.Set(0);
+ fMaxNSisters = copy.fMaxNSisters;
+ fCheckP = copy.fCheckP;
fCheckHistRange = copy.fCheckHistRange;
return (*this);
if (p2->PDGAbs() == AliRsnDaughter::SpeciesPDG(fDaughter[0]) && p1->PDGAbs() == AliRsnDaughter::SpeciesPDG(fDaughter[1]))
decayMatch = kTRUE;
if (!decayMatch) continue;
+ if( (fMaxNSisters>0) && (p1->NTotSisters()==p2->NTotSisters()) && (p1->NTotSisters()>fMaxNSisters)) continue;
}
// check pair against cuts
if (fPairCuts) {
// -- definition of output histogram
//
+#include "AliRsnEvent.h"
#include "AliRsnDaughter.h"
#include "AliRsnMiniParticle.h"
Int_t GetMotherPDG() const {return fMotherPDG;}
Double_t GetMotherMass() const {return fMotherMass;}
Bool_t GetFillHistogramOnlyInRange() { return fCheckHistRange; }
+ Short_t GetMaxNSisters() {return fMaxNSisters;}
void SetOutputType(EOutputType type) {fOutputType = type;}
void SetComputation(EComputation src) {fComputation = src;}
void SetMotherMass(Double_t mass) {fMotherMass = mass;}
void SetPairCuts(AliRsnCutSet *set) {fPairCuts = set;}
void SetFillHistogramOnlyInRange(Bool_t fillInRangeOnly) { fCheckHistRange = fillInRangeOnly; }
+ void SetMaxNSisters(Short_t n) {fMaxNSisters = n;}
+ void SetCheckMomentumConservation(Bool_t checkP) {fCheckP = checkP;}
void AddAxis(Int_t id, Int_t nbins, Double_t min, Double_t max);
void AddAxis(Int_t id, Double_t min, Double_t max, Double_t step);
TList *fList; //! pointer to the TList containing the output
TArrayI fSel1; //! list of selected particles for definition 1
TArrayI fSel2; //! list of selected particles for definition 2
-
+ Short_t fMaxNSisters; // maximum number of allowed mother's daughter
+ Bool_t fCheckP; // flag to set in order to check the momentum conservation for daughters
Bool_t fCheckHistRange; // check if values is in histogram range
- ClassDef(AliRsnMiniOutput,2) // AliRsnMiniOutput class
+ ClassDef(AliRsnMiniOutput, 3) // AliRsnMiniOutput class
};
#endif
fSum[i] = fP1[i] + fP2[i];
fRef[i].SetXYZM(fSum[i].X(), fSum[i].Y(), fSum[i].Z(), refMass);
}
+
+ fNSisters=-1;
+ if (p1->NTotSisters()==p2->NTotSisters()) fNSisters = p1->NTotSisters();
}
//__________________________________________________________________________________________________
class AliRsnMiniPair : public TObject {
public:
- AliRsnMiniPair() : fDCA1(0), fDCA2(0), fMother(-1), fMotherPDG(0), fNsisters(-1) { }
+ AliRsnMiniPair() : fDCA1(0), fDCA2(0), fMother(-1), fMotherPDG(0), fNSisters(-1) { }
Int_t &Mother() {return fMother;}
Int_t &MotherPDG() {return fMotherPDG;}
Double_t DaughterDCA(Int_t daughterId);
Double_t DCAProduct();
void DaughterPxPyPz(Int_t daughterId, Bool_t mc, Double_t *pxpypz);
- Short_t Nsisters() {return fNsisters;}
- void SetNsisters(Short_t value) {fNsisters=value;}
+ Short_t NSisters() {return fNSisters;}
private:
Int_t fMother; // label of mothers (when common)
Int_t fMotherPDG; // PDG code of mother (when common)
- Short_t fNsisters; // total number of mother's daughters in the MC stack
+ Short_t fNSisters; // total number of mother's daughters in the MC stack
ClassDef(AliRsnMiniPair,2)
};
#include "AliAODEvent.h"
#include "AliRsnEvent.h"
+#include "AliRsnMiniEvent.h"
#include "AliRsnMiniParticle.h"
ClassImp(AliRsnMiniParticle)
fPDG = 0;
fMother = -1;
fMotherPDG = 0;
+ fNTotSisters = -1;
fCutBits = 0x0;
fPsim[0] = fPrec[0] = fPsim[1] = fPrec[1] = fPsim[2] = fPrec[2] = 0.0;
}
AliRsnEvent *event = (AliRsnEvent *) daughter->GetOwnerEvent();
- if (event && event->IsAOD()){
+ if (!event) {
+ AliWarning("Invalid reference event: cannot copy DCA nor Nsisters.");
+ return;
+ }
+ if (event->IsAOD()){
+ // DCA to Primary Vertex for AOD
AliAODTrack *track = (AliAODTrack*) daughter->Ref2AODtrack();
AliAODEvent *aodEvent = (AliAODEvent*) event->GetRefAOD();
if (track && aodEvent) {
fDCA = b[0];
}
}
+ // Number of Daughters from MC
+ if (event->GetRefMC()) {
+ TClonesArray * list = event->GetAODList();
+ AliAODMCParticle *part = (AliAODMCParticle *)list->At(fMother);
+ if (part) fNTotSisters = part->GetNDaughters();
+ }
} else {
- AliWarning("DCA not implemented for ESDs");
+ if (event->IsESD()){
+ //DCA to Primary Vertex for ESD
+ AliESDtrack *track = (AliESDtrack*) daughter->Ref2ESDtrack();
+ AliESDEvent *esdEvent = (AliESDEvent*) event->GetRefESD();
+ if (track && esdEvent) {
+ AliVVertex *vertex = (AliVVertex*) esdEvent->GetPrimaryVertex();
+ Double_t b[2], cov[3];
+ if (vertex) {
+ track->PropagateToDCA(vertex, esdEvent->GetMagneticField(), kVeryBig, b, cov);
+ fDCA = b[0];
+ }
+ }
+ // Number of Daughters from MC
+ if (event->GetRefMC()) {
+ AliMCParticle *part = (AliMCParticle *)event->GetRefMC()->GetTrack(fMother);
+ if(part)fNTotSisters = part->Particle()->GetNDaughters();
+ }
+ }
}
-
}
//__________________________________________________________________________________________________
class AliRsnMiniParticle : public TObject {
public:
- AliRsnMiniParticle() : fIndex(-1), fCharge(0), fPDG(0), fMother(0), fMotherPDG(0), fDCA(0), fCutBits(0x0) {Int_t i = 3; while (i--) fPsim[i] = fPrec[i] = 0.0;}
+ AliRsnMiniParticle() : fIndex(-1), fCharge(0), fPDG(0), fMother(0), fMotherPDG(0), fDCA(0), fNTotSisters(0), fCutBits(0x0) {Int_t i = 3; while (i--) fPsim[i] = fPrec[i] = 0.0;}
Int_t &Index() {return fIndex;}
Char_t &Charge() {return fCharge;}
Short_t &MotherPDG() {return fMotherPDG;}
UShort_t &CutBits() {return fCutBits;}
Double_t DCA() {return fDCA;}
+ Short_t NTotSisters() {return fNTotSisters;}
Bool_t HasCutBit(Int_t i) {UShort_t bit = 1 << i; return ((fCutBits & bit) != 0);}
void SetCutBit(Int_t i) {UShort_t bit = 1 << i; fCutBits |= bit;}
void ClearCutBit(Int_t i) {UShort_t bit = 1 << i; fCutBits &= (~bit);}
Int_t fMother; // index of mother in its container
Short_t fMotherPDG; // PDG code of mother
Double_t fDCA; // DCA of the particle
+ Short_t fNTotSisters; // number of daughters of the particle
UShort_t fCutBits; // list of bits used to know what cuts were passed by this track
- ClassDef(AliRsnMiniParticle,3)
+ ClassDef(AliRsnMiniParticle,4)
};
#endif
case kDCAproduct: return "DaughterDCAproduct";
case kFirstDaughterDCA: return "FirstDaughterDCA";
case kSecondDaughterDCA: return "SecondDaughterDCA";
+ case kNSisters: return "NumberOfSisters";
default: return "Undefined";
}
}
return pair->DaughterDCA(0);
case kSecondDaughterDCA:
return pair->DaughterDCA(1);
+ case kNSisters:
+ return pair->NSisters();
default:
AliError("Invalid value type");
return 1E20;
kDCAproduct, // product of the daughter's dca to PV (same in AliRsnValuePair)
kFirstDaughterDCA, //DCA to PV of the first daughter of the pair
kSecondDaughterDCA, //DCA to PV of the second daughter of the pair
+ kNSisters, // number of daughters (only for MC)
kTypes // -- general limit ----------------------------------------------------------
};
track2->PropagateToDCA(vertex, aodEvent->GetMagneticField(), kVeryBig, b2, cov2);
fDCAproduct = b1[0]*b2[0];
} else {
- AliWarning("DCA product not implemented for ESDs");
- fDCAproduct=0.0;
+ AliESDEvent *esdEvent = (AliESDEvent*)event1->GetRefESD();
+ if (!esdEvent) return 0.0;
+ AliESDtrack *track1 = (AliESDtrack*)fDaughter[0]->Ref2ESDtrack();
+ AliESDtrack *track2 = (AliESDtrack*)fDaughter[1]->Ref2ESDtrack();
+ const AliVVertex *vertex = esdEvent->GetPrimaryVertex();
+ if (!vertex || !track1 || track2) return 0.0;
+
+ Double_t b1[2], cov1[3], b2[2], cov2[3];
+ track1->PropagateToDCA(vertex, esdEvent->GetMagneticField(), kVeryBig, b1, cov1);
+ track2->PropagateToDCA(vertex, esdEvent->GetMagneticField(), kVeryBig, b2, cov2);
+ fDCAproduct = b1[0]*b2[0];
}
return fDCAproduct;
}
case kPt: return "SingleTrackPt";
case kPtpc: return "SingleTrackPtpc";
case kEta: return "SingleTrackEta";
+ case kY: return "SingleTrackY";
case kMass: return "SingleTrackMass";
case kITSsignal: return "SingleTrackITSsignal";
case kTPCsignal: return "SingleTrackTPCsignal";
case kEta:
fComputedValue = (fUseMCInfo ? refMC->Eta() : ref->Eta());
return kTRUE;
+
+ case kY:
+ fComputedValue = (fUseMCInfo ? refMC->Y() : ref->Y());
+ return kTRUE;
case kMass:
fComputedValue = (fUseMCInfo ? refMC->M() : ref->M());
kPt, // transverse momentum
kPtpc, // total momentum in the TPC inner wall
kEta, // pseudo-rapidity
+ kY, // rapidity
kMass, // mass
kITSsignal, // ITS signal
kTPCsignal, // TPC signal