//
#include <Riostream.h>
-#include <TObjArray.h>
+#include <TList.h>
#include "AliLog.h"
+#include "AliRsnMother.h"
+#include "AliRsnEvent.h"
#include "AliRsnFunction.h"
-#include "AliRsnPairParticle.h"
+#include "AliRsnCutSet.h"
+#include "AliRsnCutStd.h"
+#include "AliRsnValue.h"
+#include "AliRsnCutManager.h"
#include "AliRsnPair.h"
ClassImp(AliRsnPair)
//_____________________________________________________________________________
-AliRsnPair::AliRsnPair(EPairType type, AliRsnPairDef *def) :
- TObject(),
+AliRsnPair::AliRsnPair(const char *name, AliRsnPairDef *def) :
+ TNamed(name, ""),
+ fOnlyTrue(kFALSE),
+ fCheckDecay(kFALSE),
fIsMixed(kFALSE),
- fPairType(type),
- fPIDMethod(AliRsnDaughter::kRealistic),
fPairDef(def),
- fCutMgr(0),
- fFunctions("AliRsnFunction", 0)
+ fCutManager(),
+ fMother(),
+ fEvent(0x0)
{
//
// Default constructor
//
- SetUp(type);
-}
-//_____________________________________________________________________________
-AliRsnPair::~AliRsnPair()
-{
-//
-// Destructor
-//
+ AliDebug(AliLog::kDebug+2,"<-");
+ AliDebug(AliLog::kDebug+2,"->");
}
//_____________________________________________________________________________
-void AliRsnPair::SetUp(EPairType type)
+AliRsnPair::AliRsnPair(const AliRsnPair& copy) :
+ TNamed(copy),
+ fOnlyTrue(copy.fOnlyTrue),
+ fCheckDecay(copy.fCheckDecay),
+ fIsMixed(copy.fIsMixed),
+ fPairDef(copy.fPairDef),
+ fCutManager(copy.fCutManager),
+ fMother(copy.fMother),
+ fEvent(0x0)
{
//
-// Sets up flag values by the pair types
+// Default constructor
//
- switch (type)
- {
- case kNoPID:
- SetAllFlags(AliRsnDaughter::kNoPID, kFALSE);
- break;
- case kNoPIDMix:
- SetAllFlags(AliRsnDaughter::kNoPID, kTRUE);
- break;
- case kRealisticPID:
- SetAllFlags(AliRsnDaughter::kRealistic, kFALSE);
- break;
- case kRealisticPIDMix:
- SetAllFlags(AliRsnDaughter::kRealistic, kTRUE);
- break;
- case kPerfectPID:
- SetAllFlags (AliRsnDaughter::kPerfect, kFALSE);
- break;
- case kPerfectPIDMix:
- SetAllFlags (AliRsnDaughter::kPerfect, kTRUE);
- break;
- default :
- AliWarning("Wrong type selected: setting up for realistic PID - no mixing.");
- SetAllFlags(AliRsnDaughter::kRealistic, kFALSE);
- break;
- }
+ AliDebug(AliLog::kDebug+2,"<-");
+ AliDebug(AliLog::kDebug+2,"->");
}
//_____________________________________________________________________________
-void AliRsnPair::Print(Option_t* /*option*/) const
+AliRsnPair& AliRsnPair::operator=(const AliRsnPair& copy)
{
-//
-// Prints info about pair
-//
-
- AliInfo(Form("%s", GetPairHistTitle(0x0).Data()));
- AliInfo(Form("PDG %d %d", AliRsnPID::PDGCode(fPairDef->GetType(0)),
- AliRsnPID::PDGCode(fPairDef->GetType(1))));
- AliInfo(Form("Masses %f %f", fPairDef->GetMass(0), fPairDef->GetMass(1)));
- AliInfo(Form("Number of functions %d", fFunctions.GetEntries()));
+ fOnlyTrue = copy.fOnlyTrue;
+ fCheckDecay = copy.fCheckDecay;
+ fIsMixed = copy.fIsMixed;
+ fPairDef = copy.fPairDef;
+ fMother = copy.fMother;
+ fCutManager = copy.fCutManager;
+ fEvent = 0x0;
- switch(fPIDMethod)
- {
- case AliRsnDaughter::kNoPID:
- AliInfo("PID method: none");
- break;
- case AliRsnDaughter::kRealistic:
- AliInfo("PID method: realistic");
- break;
- case AliRsnDaughter::kPerfect:
- AliInfo("PID method: perfect");
- break;
- default:
- AliInfo("PID method: undefined");
- }
+ return (*this);
}
//_____________________________________________________________________________
-void AliRsnPair::ProcessPair(AliRsnEvent *ev1, AliRsnEvent *ev2)
+AliRsnPair::~AliRsnPair()
{
//
-// Fills the functions' histograms using tracks from passed events.
-// What tracks are taken in each event depend from the order of
-// track types defined in the AliRsnPairDef for this object:
-// - tracks of type 0 are the ones stored as pairDef data members with index [0]
-// ---> taken from first argument (ev1)
-// - tracks of type 1 are the ones stored as pairDef data members with index [1]
-// ---> taken from second argument (ev2)
-//
-// When doing single-event analysis (e.g. signal, like-sign), second argument
-// can be NULL, and it will be forced to point to the same object of first one.
+// Destructor
//
- if (!ev2) ev2 = ev1;
-
- TArrayI *array1 = ev1->GetTracksArray(fPIDMethod, fPairDef->GetCharge(0), fPairDef->GetType(0));
- TArrayI *array2 = ev2->GetTracksArray(fPIDMethod, fPairDef->GetCharge(1), fPairDef->GetType(1));
-
- LoopPair(ev1, array1, ev2, array2);
+ AliDebug(AliLog::kDebug+2,"<-");
+ AliDebug(AliLog::kDebug+2,"->");
}
//_____________________________________________________________________________
-void AliRsnPair::LoopPair
-(AliRsnEvent * ev1, TArrayI * a1, AliRsnEvent * ev2, TArrayI * a2)
+void AliRsnPair::Print(Option_t* /*option*/) const
{
//
-// Loop on all pairs of tracks of the defined types/charges,
-// using the arrays of indexes and the events containing them.
-// This method is private, for safety reasons.
+// Prints info about pair
//
- if (!a1) {AliDebug(4, "No TArrayI 1 from currentEvent->GetTracksArray(...)"); return;}
- if (!a2) {AliDebug(4, "No TArrayI 2 from currentEvent->GetTracksArray(...)"); return;}
-
- // cuts on events
- if (!CutPass(ev1) || !CutPass(ev2)) return;
-
- AliRsnDaughter::SetPIDMethod(fPIDMethod);
- AliRsnDaughter *daughter1 = 0;
- AliRsnDaughter *daughter2 = 0;
- AliRsnFunction *fcn = 0;
-
- Bool_t isLikeSign = fPairDef->IsLikeSign();
- Int_t j, startj = 0;
+ AliDebug(AliLog::kDebug+2,"<-");
+ AliInfo(Form("PDG %d %d", AliPID::ParticleCode(fPairDef->GetPID(0)), AliPID::ParticleCode(fPairDef->GetPID(1))));
+ AliInfo(Form("Masses %f %f", fPairDef->GetMass(0), fPairDef->GetMass(1)));
- for (Int_t i = 0; i < a1->GetSize(); i++)
- {
- // get track #1
- daughter1 = (AliRsnDaughter *) ev1->GetTrack(a1->At(i));
- if (!daughter1) continue;
- // assign PID and mass of particle of type #1
- daughter1->AssignPID(fPairDef->GetType(0));
- // cuts on track #1
- if (!CutPass(daughter1)) continue;
- // get track #2
- daughter2 = 0;
- // check starting index for searching the event:
- // for like-sign pairs we avoid duplicating the pairs
- if (isLikeSign) startj = i+1; else startj = 0;
- // AliInfo(Form("%d",startj));
- // loop on event for all track #2 to be combined with the found track #1
- for (j = startj; j < a2->GetSize(); j++)
- {
- daughter2 = (AliRsnDaughter *) ev2->GetTrack(a2->At(j));
- if (!daughter2) continue;
- // assign PID and mass of particle of type #2
- daughter2->AssignPID(fPairDef->GetType(0));
- // cuts on track #2
- if (!CutPass(daughter2)) continue;
- // make pair
- AliRsnPairParticle pairParticle;
- pairParticle.SetPair(daughter1, daughter2);
- // cuts on pair
- if (!CutPass(&pairParticle)) continue;
- // fill all histograms
- TObjArrayIter nextFcn(&fFunctions);
- while ( (fcn = (AliRsnFunction*)nextFcn()) ) {
- fcn->Fill(&pairParticle, fPairDef);
- }
- /*
- while ( (fnew = (AliRsnFunction*)nextFcn()) ) {
- fnew->Fill(&pairParticle, fPairDef);
- }
- */
- }
- }
+ AliDebug(AliLog::kDebug+2,"->");
}
//_____________________________________________________________________________
-TList * AliRsnPair::GenerateHistograms(TString prefix)
-{
-//
-// Generates needed histograms, giving them a name based on
-// the flags defined here, on the pair definition, and attaches
-// a prefix to it, according to the argument.
-//
-// All generated histograms are stored into the output TList.
-//
-
- TList *list = new TList();
- list->SetName(GetPairHistName(0x0).Data());
-
- Char_t hName[255], hTitle[255];
- AliRsnFunction *fcn = 0;
- for (Int_t i=0;i< fFunctions.GetEntries();i++)
+Bool_t AliRsnPair::Fill
+(AliRsnDaughter *daughter0, AliRsnDaughter *daughter1, AliRsnEvent *ev0, AliRsnEvent *ev1)
+{
+//
+// Sets the two passed daughters to the AliRsnMother data member of this object
+// which is used to perform all computations to fill the value list.
+// This operation is done successfully only when the first passed object matches
+// the required object type (track/V0) and the required charge for first element in pair def,
+// and the second passed object does the same w.r. to the second element in pair def.
+// Moreover, all cuts are checked and the operation fails if a cut check is unsuccessful.
+// Finally, if a true pair is required, this is checked at the end.
+//
+
+ AliDebug(AliLog::kDebug+2,"<-");
+
+ // first of all, compute the 4-momenta of the daughters
+ // and that of the mother, according to current pair def
+ // this could be needed for some cuts
+ fMother.SetDaughters(daughter0, fPairDef->GetMass(0), daughter1, fPairDef->GetMass(1));
+
+ // check for correct type-charge match for first element
+ if (daughter0->RefType() != fPairDef->GetDaughterType(0)) return kFALSE;
+ if (daughter0->ChargeChar() != fPairDef->GetCharge(0)) return kFALSE;
+
+ // check for correct type-charge match for second element
+ if (daughter1->RefType() != fPairDef->GetDaughterType(1)) return kFALSE;
+ if (daughter1->ChargeChar() != fPairDef->GetCharge(1)) return kFALSE;
+
+ // cuts on track #1 & common
+ fCutManager.SetEvent(ev0);
+ if (!fCutManager.PassDaughter1Cuts(daughter0))
{
- fcn = (AliRsnFunction*)fFunctions.At(i);
- sprintf(hName, "%s_%s", prefix.Data(), GetPairHistName(fcn).Data());
- sprintf(hTitle, "%s", GetPairHistTitle(fcn).Data());
- TList *histos = fcn->Init(hName, hTitle);
- //histos->Print();
- list->Add(histos);
- }
-
- return list;
-}
-
-//_____________________________________________________________________________
-void AliRsnPair::GenerateHistograms(TString prefix, TList *tgt)
-{
-//
-// Generates needed histograms, giving them a name based on
-// the flags defined here, on the pair definition, and attaches
-// a prefix to it, according to the argument.
-//
-// All generated histograms are stored into the TList passed as argument
-//
-
- if (!tgt) {
- AliError("NULL target list!");
- return;
+ AliDebug(AliLog::kDebug+2, "Specific cuts for track #1 not passed");
+ return kFALSE;
}
-
- Char_t hName[255], hTitle[255];
- AliRsnFunction *fcn = 0;
- for (Int_t i=0;i< fFunctions.GetEntries();i++)
+ if (!fCutManager.PassCommonDaughterCuts(daughter0))
{
- fcn = (AliRsnFunction*)fFunctions.At(i);
- sprintf(hName, "%s_%s", prefix.Data(), GetPairHistName(fcn).Data());
- sprintf(hTitle, "%s", GetPairHistTitle(fcn).Data());
- fcn->Init(hName, hTitle, tgt);
+ AliDebug(AliLog::kDebug+2, "Common cuts for track #1 not passed");
+ return kFALSE;
}
-}
-
-//_____________________________________________________________________________
-TString AliRsnPair::GetPairTypeName(EPairType type) const
-{
-//
-// Returns type name, made with particle names ant chosen PID
-//
-
- switch (type)
+
+ // cuts on track #2 & common
+ fCutManager.SetEvent(ev1);
+ if (!fCutManager.PassDaughter2Cuts(daughter1))
{
- case kNoPID : return ("NOPID_");break;
- case kNoPIDMix : return ("NOPIDMIX_");break;
- case kRealisticPID : return ("REALISTIC_");break;
- case kRealisticPIDMix : return ("REALISTICMIX_");break;
- case kPerfectPID : return ("PERFECT_");break;
- case kPerfectPIDMix : return ("PERFECTMIX_");break;
- default:
- AliWarning("Unrecognized value of EPairTypeName argument");
- break;
+ AliDebug(AliLog::kDebug+2, "Specific cuts for track #2 not passed");
+ return kFALSE;
}
-
- return "NOTYPE";
-}
-
-//_____________________________________________________________________________
-TString AliRsnPair::GetPairName() const
-{
-//
-// Retruns pair name
-//
-
- TString sName;
- sName += GetPairTypeName(fPairType);
- sName += fPairDef->GetPairName();
-
- return sName;
-}
-
-//_____________________________________________________________________________
-TString AliRsnPair::GetPairHistName(AliRsnFunction *fcn, TString text) const
-{
-//
-// Returns definitive histogram name
-//
-
- TString sName;
- if (fcn)
+ if (!fCutManager.PassCommonDaughterCuts(daughter1))
{
- sName = fcn->GetFcnName();
- sName += "_";
+ AliDebug(AliLog::kDebug+2, "Common cuts for track #2 not passed");
+ return kFALSE;
}
- sName += GetPairName();
- sName += "_";
- if (fCutMgr) sName += fCutMgr->GetName();
- sName += text;
-
- return sName;
-}
-
-//_____________________________________________________________________________
-TString AliRsnPair::GetPairHistTitle(AliRsnFunction *fcn, TString text) const
-{
-//
-// Returns definitive histogram title
-//
-
- TString sTitle;
- if (fcn)
+
+ // point to first event as reference
+ fEvent = ev0;
+
+ // define pair & check
+ fCutManager.SetEvent(fEvent);
+ if (!fCutManager.PassMotherCuts(&fMother)) return kFALSE;
+
+ // if required a true pair, check this here and eventually return a fail message
+ if (fOnlyTrue)
{
- sTitle = fcn->GetFcnTitle();
- sTitle += " ";
+ // are the daughters really secondaries (in MC)?
+ Int_t m0, m1;
+ if (!fMother.CommonMother(m0, m1)) return kFALSE;
+ if (m0 < 0 || m1 < 0) return kFALSE;
+
+ //cout << "Checking a true pair..." << endl;
+
+ // if they do, is this mother the correct type?
+ Int_t mpdg0 = TMath::Abs(daughter0->GetMotherPDG());
+ Int_t mpdg1 = TMath::Abs(daughter1->GetMotherPDG());
+ Int_t mpdg = TMath::Abs(fPairDef->GetMotherPDG());
+ if (mpdg0 != mpdg) return kFALSE; //{cout << "Mother of d0 is " << mpdg0 << " instead of " << mpdg << endl; return kFALSE;}
+ if (mpdg1 != mpdg) return kFALSE; //{cout << "Mother of d1 is " << mpdg1 << " instead of " << mpdg << endl; return kFALSE;}
+
+ // do they match the expected decay channel (that is, are they the expected types)?
+ if (fCheckDecay)
+ {
+ //cout << "Checking decay tree..." << endl;
+ Int_t pdg0 = TMath::Abs(daughter0->GetPDG());
+ Int_t pdg1 = TMath::Abs(daughter1->GetPDG());
+ if (AliPID::ParticleCode(fPairDef->GetPID(0)) != pdg0) return kFALSE; // {cout << "PDG0 is " << pdg0 << " instead of " << fPairDef->GetPID(0) << endl; return kFALSE;};
+ if (AliPID::ParticleCode(fPairDef->GetPID(1)) != pdg1) return kFALSE; // {cout << "PDG1 is " << pdg1 << " instead of " << fPairDef->GetPID(1) << endl; return kFALSE;};
+ //cout << "Decay tree accepted!" << endl;
+ }
+
+ // ok... if we arrive here that must really be a true pair! :-)
+ //cout << "Pair accepted!" << endl;
}
- sTitle += GetPairName();
- sTitle +=" ";
- if (fCutMgr) sTitle += fCutMgr->GetTitle();
- sTitle += text;
- return sTitle;
+ AliDebug(AliLog::kDebug+2,"->");
+
+ return kTRUE;
}
//_____________________________________________________________________________
-void AliRsnPair::AddFunction(AliRsnFunction *fcn)
+void AliRsnPair::Compute()
{
//
-// Adds a new computing function
+// Virtual method to compute pair quantities of interest
//
- Int_t size = fFunctions.GetEntries();
- new (fFunctions[size]) AliRsnFunction(*fcn);
+ AliWarning("Implement this method in derived classes");
}
-
-//________________________________________________________________________________________
-Bool_t AliRsnPair::CutPass(AliRsnDaughter *d)
-{
-//
-// Check if the AliRsnDaughter argument pass its cuts.
-// If the cut data member is not initialized for it, returns kTRUE.
-//
-
- if (!fCutMgr) return kTRUE;
- else return fCutMgr->IsSelected(AliRsnCut::kParticle, d);
-}
-
-//________________________________________________________________________________________
-Bool_t AliRsnPair::CutPass(AliRsnPairParticle *p)
-{
-//
-// Check if the AliRsnPairParticle argument pass its cuts.
-// If the cut data member is not initialized for it, returns kTRUE.
-//
-
- if (!fCutMgr) return kTRUE;
- else return fCutMgr->IsSelected(AliRsnCut::kPair, p);
-}
-
-//________________________________________________________________________________________
-Bool_t AliRsnPair::CutPass(AliRsnEvent *e)
+//_____________________________________________________________________________
+void AliRsnPair::Init(const char* /*prefix*/, TList* /*list*/)
{
//
-// Check if the AliRsnEvent argument pass its cuts.
-// If the cut data member is not initialized for it, returns kTRUE.
+// Virtual method to compute pair quantities of interest
//
- if (!fCutMgr) return kTRUE;
- else return fCutMgr->IsSelected(AliRsnCut::kEvent, e);
+ AliWarning("Implement this method in derived classes");
}