]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG2/RESONANCES/AliRsnCutStd.cxx
remove option C for Clear for trigger array for the moment, causes malloc error
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnCutStd.cxx
index ae51e00b8e52fefcd1e04286f21d3678607ecdba..3c5fbb5e829cf1e423fc8096269097a3a9b837a8 100644 (file)
 //          Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
 //
 
-#include "TParticle.h"
-#include "TMath.h"
+#include <TMath.h>
+#include <TLorentzVector.h>
 
+#include "AliStack.h"
+#include "AliMCEvent.h"
 #include "AliRsnDaughter.h"
+#include "AliRsnMother.h"
 #include "AliRsnEvent.h"
-#include "AliRsnPairParticle.h"
 
 #include "AliRsnCutStd.h"
 
@@ -29,9 +31,10 @@ ClassImp(AliRsnCutStd)
 
 //_________________________________________________________________________________________________
 AliRsnCutStd::AliRsnCutStd() :
-    AliRsnCut(),
-    fType(kLastType),
-    fUseMC(kFALSE)
+  AliRsnCut(),
+  fType(kLastType),
+  fUseMC(kFALSE),
+  fMass(0.0)
 {
 //
 // Default constructor.
@@ -40,65 +43,53 @@ AliRsnCutStd::AliRsnCutStd() :
 
 //_________________________________________________________________________________________________
 AliRsnCutStd::AliRsnCutStd
-(const char *name, EType type, Int_t val1, Int_t val2, Bool_t useMC) :
-    AliRsnCut(name, val1, val2),
-    fType(type),
-    fUseMC(useMC)
+(const char *name, ETarget target, EType type, Int_t val1, Int_t val2, Bool_t useMC) :
+  AliRsnCut(name, target, val1, val2),
+  fType(type),
+  fUseMC(useMC),
+  fMass(0.0)
 {
 //
 // Main constructor.
 // Checks also that cut values are given in the correct type,
 // in order to avoid that one passes, for example, a value which should be double
-// but is interpreted as integer due to the overloading of constructors
+// but is interpreted as integer due to the overloading of constructors.
 //
 
-  switch (fType) {
+  switch (fType) 
+  {
     // int
-  case kMult:
-  case kMultDiff:
-  case kKink:
-  case kKinkMother:
-  case kAssignedPID:
-  case kTruePID:
-  case kRequiredPID:
-  case kCharge:
-    break;
-    // ulong
-  case kStatus:
-    if (fVarType != kULong) {
-      AliWarning(Form("[INT CONSTRUCTOR] Cut '%s' is based on ULONG. Casting values to ULONG", GetName()));
-      SetRange((ULong_t)val1, (ULong_t)val2);
-      AliWarning(Form("[INT CONSTRUCTOR] Cut '%s' ULONG range = %d, %d", GetName(), fMinU, fMaxU));
-    }
-    break;
+    case kMult:
+    case kCharge:
+      break;
     // double
-  case kP:
-  case kPt:
-  case kEta:
-  case kThetaDeg:
-  case kDr:
-  case kDz:
-  case kTPCsignal:
-  case kMultDiffRel:
-  case kVzDiff:
-    if (fVarType != kDouble) {
-      AliWarning(Form("[INT CONSTRUCTOR] Cut '%s' is based on DOUBLE. Casting values to DOUBLE", GetName()));
-      SetRange((Double_t)val1, (Double_t)val2);
-      AliWarning(Form("[INT CONSTRUCTOR] Cut '%s' DOUBLE range = %f, %f", GetName(), fMinD, fMaxD));
-    }
-    break;
+    case kP:
+    case kPt:
+    case kPtLeading:
+    case kEta:
+    case kY:
+    case kDipAngle:
+    case kThetaDeg:
+      if (fVarType != kDouble) 
+      {
+        AliWarning(Form("[INT CONSTRUCTOR] Cut '%s' is based on DOUBLE. Casting values to DOUBLE", GetName()));
+        SetRange((Double_t)val1, (Double_t)val2);
+        AliWarning(Form("[INT CONSTRUCTOR] Cut '%s' DOUBLE range = %f, %f", GetName(), fMinD, fMaxD));
+      }
+      break;
     // other cuts are not based on a value, so no problem
-  default:
-    break;
+    default:
+      break;
   }
 }
 
 //_________________________________________________________________________________________________
 AliRsnCutStd::AliRsnCutStd
-(const char *name, EType type, ULong_t val1, ULong_t val2, Bool_t useMC) :
-    AliRsnCut(name, val1, val2),
-    fType(type),
-    fUseMC(useMC)
+(const char *name, ETarget target, EType type, Double_t val1, Double_t val2, Bool_t useMC) :
+  AliRsnCut(name, target, val1, val2),
+  fType(type),
+  fUseMC(useMC),
+  fMass(0.0)
 {
 //
 // Main constructor.
@@ -107,270 +98,188 @@ AliRsnCutStd::AliRsnCutStd
 // but is interpreted as integer due to the overloading of constructors
 //
 
-  switch (fType) {
+  switch (fType) 
+  {
     // int
-  case kMult:
-  case kMultDiff:
-  case kKink:
-  case kKinkMother:
-  case kAssignedPID:
-  case kTruePID:
-  case kRequiredPID:
-  case kCharge:
-    if (fVarType != kInt) {
-      AliWarning(Form("[ULONG CONSTRUCTOR] Cut '%s' is based on INT. Casting values to INT", GetName()));
-      SetRange((Int_t)val1, (Int_t)val2);
-      AliWarning(Form("[ULONG CONSTRUCTOR] Cut '%s' INT range = %d, %d", GetName(), fMinI, fMaxI));
-    }
-    break;
-    // ulong
-  case kStatus:
-    break;
+    case kMult:
+    case kCharge:
+      if (fVarType != kInt) 
+      {
+        AliWarning(Form("[DOUBLE CONSTRUCTOR] Cut '%s' is based on INT. Casting values to INT", GetName()));
+        SetRange((Int_t)val1, (Int_t)val2);
+        AliWarning(Form("[DOUBLE CONSTRUCTOR] Cut '%s' INT range = %d, %d", GetName(), fMinI, fMaxI));
+      }
+      break;
     // double
-  case kP:
-  case kPt:
-  case kEta:
-  case kThetaDeg:
-  case kDr:
-  case kDz:
-  case kTPCsignal:
-  case kMultDiffRel:
-  case kVzDiff:
-    if (fVarType != kDouble) {
-      AliWarning(Form("[ULONG CONSTRUCTOR] Cut '%s' is based on DOUBLE. Casting values to DOUBLE", GetName()));
-      SetRange((Double_t)val1, (Double_t)val2);
-      AliWarning(Form("[ULONG CONSTRUCTOR] Cut '%s' DOUBLE range = %f, %f", GetName(), fMinD, fMaxD));
-    }
-    break;
+    case kP:
+    case kPt:
+    case kPtLeading:
+    case kEta:
+    case kY:
+    case kDipAngle:
+    case kThetaDeg:
+      break;
     // other cuts are not based on a value, so no problem
-  default:
-    break;
+    default:
+      break;
   }
 }
 
 //_________________________________________________________________________________________________
-AliRsnCutStd::AliRsnCutStd
-(const char *name, EType type, Double_t val1, Double_t val2, Bool_t useMC) :
-    AliRsnCut(name, val1, val2),
-    fType(type),
-    fUseMC(useMC)
+AliRsnCut::EVarType AliRsnCutStd::CheckType()
 {
 //
-// Main constructor.
-// Checks also that cut values are given in the correct type,
-// in order to avoid that one passes, for example, a value which should be double
-// but is interpreted as integer due to the overloading of constructors
+// Returns the variable type expected for the selected cut type
 //
 
-  switch (fType) {
-    // int
-  case kMult:
-  case kMultDiff:
-  case kKink:
-  case kKinkMother:
-  case kAssignedPID:
-  case kTruePID:
-  case kRequiredPID:
-  case kCharge:
-    if (fVarType != kInt) {
-      AliWarning(Form("[DOUBLE CONSTRUCTOR] Cut '%s' is based on INT. Casting values to INT", GetName()));
-      SetRange((Int_t)val1, (Int_t)val2);
-      AliWarning(Form("[DOUBLE CONSTRUCTOR] Cut '%s' INT range = %d, %d", GetName(), fMinI, fMaxI));
-    }
-    break;
-    // ulong
-  case kStatus:
-    if (fVarType != kULong) {
-      AliWarning(Form("[DOUBLE CONSTRUCTOR] Cut '%s' is based on ULONG. Casting values to ULONG", GetName()));
-      SetRange((ULong_t)val1, (ULong_t)val2);
-      AliWarning(Form("[DOUBLE CONSTRUCTOR] Cut '%s' ULONG range = %d, %d", GetName(), fMinU, fMaxU));
-    }
-    break;
-    // double
-  case kP:
-  case kPt:
-  case kEta:
-  case kThetaDeg:
-  case kDr:
-  case kDz:
-  case kTPCsignal:
-  case kMultDiffRel:
-  case kVzDiff:
-    break;
+  switch (fType) 
+  {
+    // integer cuts
+    case kMult:
+    case kCharge:
+      return kInt;
+    // double couts
+    case kP:
+    case kPt:
+    case kPtLeading:
+    case kEta:
+    case kY:
+    case kDipAngle:
+    case kThetaDeg:
+      return kDouble;
     // other cuts are not based on a value, so no problem
-  default:
-    break;
+    default:
+      return kNoVar;
   }
 }
 
 //_________________________________________________________________________________________________
-Bool_t AliRsnCutStd::IsSelected(ETarget tgt, AliRsnDaughter * const track)
+Bool_t AliRsnCutStd::IsSelected(TObject *obj1, TObject *obj2)
 {
-//
-// Cut checker.
-//
-
-  // coherence check
-  if (tgt != AliRsnCut::kParticle) {
-    AliError(Form("Wrong target. Skipping cut", GetName()));
-    return kTRUE;
-  }
-
-
-  // if MC info is required, try to retrieve the TParticle:
-  // if it is not present, the cut is skipped
-  // this avoids to raise a seg-fault when accessing the NULL TParticle object
-  TParticle *part = 0x0;
-  if (fUseMC) {
-    part = track->GetParticle();
-    if (!part) {
-      AliError("Required MC info but it is not present. Cut Skipped.");
-      return kTRUE;
-    }
-  }
-
-  // loop on allowed possibilities
-  switch (fType) {
-  case kP:
-    fCutValueD = fUseMC ? part->P() : track->P();
-    return OkRange();
-  case kPt:
-    fCutValueD = fUseMC ? part->Pt() : track->Pt();
-    return OkRange();
-  case kThetaDeg:
-    fCutValueD = track->ThetaDeg();
-    return OkRange();
-  case kEta:
-    fCutValueD = fUseMC ? part->Eta() : track->Eta();
-    return OkRange();
-  case kDr:
-    fCutValueD = track->Dr();
-    return OkRange();
-  case kDz:
-    fCutValueD = track->Dz();
-    return OkRange();
-  case kStatus:
-    fCutValueU = track->GetStatus();
-    return OkValue();
-  case kKink:
-    fCutValueI = track->IsKink();
-    return OkValue();
-  case kKinkMother:
-    fCutValueI = track->IsKinkMother();
-    return OkValue();
-  case kCharge:
-    fCutValueI = (Int_t)track->Charge();
-    return OkValue();
-  case kTruePID:
-    fCutValueI = (Int_t)track->PerfectPID();
-    return OkValue();
-  case kAssignedPID:
-    fCutValueI = (Int_t)track->AssignedPID();
-    return OkValue();
-  case kRequiredPID:
-    fCutValueI = (Int_t)track->RequiredPID();
-    return OkValue();
-  case kRealisticPID:
-    fCutValueI = (Int_t)track->RealisticPID();
-  case kTruePIDMatch:
-    return (track->PerfectPID() == track->RequiredPID());
-  case kRealisticPIDMatch:
-    return (track->RealisticPID() == track->RequiredPID());
-  default:
-    AliWarning(Form("Value %d is not included in available cuts for DAUGHTER. Cut skipped.", fType));
+  // coherence check using the mother class method
+  if (!TargetOK(obj1, obj2)) 
+  {
+    AliError("Wrong target. Skipping cut");
     return kTRUE;
   }
+  
+  // if coherence check is OK, only one of the following
+  // dynamic casts will be successful, and it will trigger
+  // the correct internal method to check the cut
+  AliRsnDaughter *objD = dynamic_cast<AliRsnDaughter*>(obj1);
+  AliRsnMother   *objM = dynamic_cast<AliRsnMother*>(obj1);
+  AliRsnEvent    *objE = dynamic_cast<AliRsnEvent*>(obj1);  
+  if (objD) return IsDaughterSelected(objD);
+  else if (objM) return IsMotherSelected(objM);
+  else if (objE) return IsEventSelected(objE);
+  else return kTRUE;
 }
 
 //_________________________________________________________________________________________________
-Bool_t AliRsnCutStd::IsSelected(ETarget tgt, AliRsnPairParticle * const pair)
+Bool_t AliRsnCutStd::IsDaughterSelected(AliRsnDaughter *daughter)
 {
 //
-// Cut checker
+// Cut checker.
 //
 
-  // coherence check
-  if (tgt != AliRsnCut::kPair) {
-    AliError(Form("Wrong target. Skipping cut", GetName()));
-    return kTRUE;
-  }
+  // get the correct reference object for kinematic cuts
+  // and check that this reference is not NULL, to avoid segfaults
+  AliVParticle *ref = fUseMC ? daughter->GetRefMC() : daughter->GetRef();
 
   // loop on allowed possibilities
-  switch (fType) {
-  case kP:
-    fCutValueD = (fUseMC ? pair->GetPMC() : pair->GetP());
-    return OkRange();
-  case kPt:
-    fCutValueD = (fUseMC ? pair->GetPtMC() : pair->GetPt());
-    return OkRange();
-  case kEta:
-    fCutValueD = (fUseMC ? pair->GetEtaMC() : pair->GetEta());
-    return OkRange();
-  case kSameLabel:
-    return pair->IsLabelEqual();
-  case kTruePair:
-    fCutValueI = TMath::Abs(pair->CommonMother());
-    return OkValue();
-  default:
-    AliWarning(Form("Value %d is not included in available cuts for PAIR. Cut skipped.", fType));
-    return kTRUE;
+  switch (fType) 
+  {
+    case kP:
+      fCutValueD = ref->P();
+      return OkRange();
+    case kPt:
+      fCutValueD = ref->Pt();
+      return OkRange();
+    case kThetaDeg:
+      fCutValueD = ref->Theta() * TMath::RadToDeg();
+      return OkRange();
+    case kEta:
+      fCutValueD = ref->Eta();
+      return OkRange();
+    case kCharge:
+      fCutValueI = (Int_t)ref->Charge();
+      return OkValue();
+    case kPhysPrimary:
+      if (!fEvent->GetRefMC()) return kFALSE;
+      else
+      {
+        return fEvent->GetRefMCESD()->Stack()->IsPhysicalPrimary(TMath::Abs(((AliVTrack*)ref)->GetLabel()));
+      }
+    default:
+      AliWarning(Form("Value %d is not included in available cuts for DAUGHTER. Cut skipped.", fType));
+      return kTRUE;
   }
 }
 
 //_________________________________________________________________________________________________
-Bool_t AliRsnCutStd::IsSelected(ETarget tgt, AliRsnEvent * const event)
+Bool_t AliRsnCutStd::IsMotherSelected(AliRsnMother * const mother)
 {
 //
 // Cut checker
 //
-
-  // coherence check
-  if (tgt != AliRsnCut::kEvent) {
-    AliError(Form("Wrong target. Skipping cut", GetName()));
-    return kTRUE;
-  }
-
+  
+  // use MC flag if required
+  TLorentzVector &sum = fUseMC ? mother->SumMC() : mother->Sum();
+  TLorentzVector &ref = fUseMC ? mother->RefMC() : mother->Ref();
+  
   // loop on allowed possibilities
-  switch (fType) {
-  case kMult:
-    fCutValueI = event->GetMultiplicity();
-    return OkRange();
-  default:
-    AliWarning(Form("Value %d is not included in available cuts for EVENT. Cut skipped.", fType));
-    return kTRUE;
+  switch (fType) 
+  {
+    case kP:
+      fCutValueD = sum.P();
+      return OkRange();
+    case kPt:
+      fCutValueD = sum.Perp();
+      return OkRange();
+    case kEta:
+      fCutValueD = sum.Eta();
+      return OkRange();
+    case kY:
+      fCutValueD = ref.Rapidity();
+      return OkRange();
+    case kDipAngle:
+      fCutValueD = mother->GetDaughter(0)->Prec().Angle(mother->GetDaughter(1)->Prec().Vect());
+      fCutValueD = TMath::Abs(TMath::ACos(fCutValueD));
+      return OkRangeD();
+    case kSameLabel:
+      return mother->IsLabelEqual();
+    default:
+      AliWarning(Form("Value %d is not included in available cuts for PAIR. Cut skipped.", fType));
+      return kTRUE;
   }
 }
 
 //_________________________________________________________________________________________________
-Bool_t AliRsnCutStd::IsSelected(ETarget tgt, AliRsnEvent * const ev1, AliRsnEvent * const ev2)
+Bool_t AliRsnCutStd::IsEventSelected(AliRsnEvent * const event)
 {
 //
 // Cut checker
 //
 
-  // coherence check
-  if (tgt != AliRsnCut::kMixEvent) {
-    AliError(Form("Wrong target. Skipping cut", GetName()));
-    return kTRUE;
-  }
-
   // loop on allowed possibilities
-  Double_t mult1, mult2;
-  switch (fType) {
-  case kMultDiff:
-    fCutValueI = TMath::Abs(ev1->GetMultiplicity() - ev2->GetMultiplicity());
-    return OkRange();
-  case kMultDiffRel:
-    mult1 = (Double_t)ev1->GetMultiplicity();
-    mult2 = (Double_t)ev2->GetMultiplicity();
-    if (mult1 == 0.0  && mult2 == 0.0) return kTRUE;
-    fCutValueD = 100.0 * TMath::Abs(mult1 - mult2) / TMath::Max(mult1, mult2); // in %
-    return OkRange();
-  case kVzDiff:
-    fCutValueD = TMath::Abs(ev1->GetVz() - ev2->GetVz());
-    return OkRange();
-  default:
-    AliWarning(Form("Value %d is not included in available cuts for MIXEVENT. Cut skipped.", fType));
-    return kTRUE;
+  switch (fType) 
+  {
+    case kMult:
+      fCutValueI = event->GetMultiplicity();
+      return OkRange();
+    case kPtLeading:
+    {
+      int leadingID = event->SelectLeadingParticle(0);
+      if(leadingID >= 0) {
+         AliRsnDaughter leadingPart = event->GetDaughter(leadingID);
+         AliVParticle *ref = fUseMC ? leadingPart.GetRefMC() : leadingPart.GetRef();
+         fCutValueD = ref->Pt();
+      }
+      else fCutValueD = 0;
+      return OkRange();
+    }
+    default:
+      AliWarning(Form("Value %d is not included in available cuts for EVENT. Cut skipped.", fType));
+      return kTRUE;
   }
 }