remove option C for Clear for trigger array for the moment, causes malloc error
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnCutBetheBloch.cxx
index 7bcc0832d993babe572134267ec8566077af8069..329426f2dab142c7c4a8429cc273e4aa85889418 100644 (file)
@@ -17,8 +17,7 @@
 //
 #include "TMath.h"
 
-#include "AliLog.h"
-#include "AliESDtrack.h"
+#include "AliExternalTrackParam.h"
 
 #include "AliRsnDaughter.h"
 #include "AliRsnCutBetheBloch.h"
@@ -27,10 +26,10 @@ ClassImp(AliRsnCutBetheBloch)
 
 //_________________________________________________________________________________________________
 AliRsnCutBetheBloch::AliRsnCutBetheBloch() :
-  AliRsnCut(),
+  AliRsnCut("dummyBBCut", AliRsnTarget::kDaughter),
   fCorrect(kTRUE),
-  fMass(1.0),
-  fMIP(50.0)
+  fMIP(50.0),
+  fType(AliPID::kUnknown)
 {
 //
 // Default constructor.
@@ -39,32 +38,13 @@ AliRsnCutBetheBloch::AliRsnCutBetheBloch() :
   fConst[0] = fConst[1] = fConst[2] = fConst[3] = fConst[4] = 0.0;
 }
 
-//_________________________________________________________________________________________________
-AliRsnCutBetheBloch::AliRsnCutBetheBloch
-(const char *name, Double_t fractionRange, Double_t mass, Double_t mip, Bool_t correct) :
-  AliRsnCut(name, -fractionRange, fractionRange),
-  fCorrect(correct),
-  fMass(mass),
-  fMIP(mip)
-{
-//
-// Main constructor.
-// the cut range is the relative fraction of the value:
-// BB*(1-fraction) < TPC < BB*(1+fraction)
-// which means:
-// -fraction < (TPC - BB)/BB < fraction
-//
-
-  fConst[0] = fConst[1] = fConst[2] = fConst[3] = fConst[4] = 0.0;
-}
-
 //_________________________________________________________________________________________________
 AliRsnCutBetheBloch::AliRsnCutBetheBloch
 (const char *name, Double_t fractionRange, AliPID::EParticleType type, Double_t mip, Bool_t correct) :
-  AliRsnCut(name, -fractionRange, fractionRange),
+  AliRsnCut(name, AliRsnCut::kDaughter, 0.0, fractionRange),
   fCorrect(correct),
-  fMass(0.0),
-  fMIP(mip)
+  fMIP(mip),
+  fType(type)
 {
 //
 // Main constructor.
@@ -74,12 +54,11 @@ AliRsnCutBetheBloch::AliRsnCutBetheBloch
 // -fraction < (TPC - BB)/BB < fraction
 //
 
-  SetMass(type);
   fConst[0] = fConst[1] = fConst[2] = fConst[3] = fConst[4] = 0.0;
 }
 
 //_____________________________________________________________________________
-Double_t AliRsnCutBetheBloch::BetheBloch(AliRsnDaughter *track)
+Double_t AliRsnCutBetheBloch::BetheBloch(AliRsnDaughter * const trackRef)
 {
 //
 // Computes the theoretical dE/dx according to
@@ -92,7 +71,13 @@ Double_t AliRsnCutBetheBloch::BetheBloch(AliRsnDaughter *track)
 // The value is computed in MIP units, multiplied by 50 to have it in energy.
 //
 
-  Double_t betaGamma = track->P() / fMass;
+  AliPID pid;
+  Double_t mass = pid.ParticleMass(fType);
+
+  // get the track momentum at the inner wall of TPC: if absent cut is not passed
+  AliExternalTrackParam track(*trackRef->GetRefESDtrack()->GetInnerParam());
+
+  Double_t betaGamma = track.P() / mass;
   Double_t beta = betaGamma / TMath::Sqrt(1.0 + betaGamma * betaGamma);
   Double_t aa = TMath::Power(beta, fConst[3]);
   Double_t bb = TMath::Power(1.0 / betaGamma, fConst[4]);
@@ -101,8 +86,7 @@ Double_t AliRsnCutBetheBloch::BetheBloch(AliRsnDaughter *track)
 
   Double_t out = (fConst[1] - aa - bb) * fConst[0] / aa;
 
-  if (fCorrect)
-  {
+  if (fCorrect) {
     Double_t kMeanCorr = 0.1;
     Double_t meanCorr = (1 + (out - 1) * kMeanCorr);
     out *= meanCorr;
@@ -111,71 +95,51 @@ Double_t AliRsnCutBetheBloch::BetheBloch(AliRsnDaughter *track)
   return out * fMIP;
 }
 
+//_____________________________________________________________________________
+Double_t AliRsnCutBetheBloch::RelDiff(AliRsnDaughter *track)
+{
+//
+// Relative difference between BB value and TPC signal
+//
+
+  if (!track->GetRefESDtrack()) return -99999.9;
+
+  // compute Bethe-Bloch with the given mass hypothesis
+  Double_t bb = BetheBloch(track);
+  return TMath::Abs((track->GetRefESDtrack()->GetTPCsignal() - bb) / bb);
+}
+
 //_________________________________________________________________________________________________
-Bool_t AliRsnCutBetheBloch::IsSelected(ETarget tgt, AliRsnDaughter *track)
+Bool_t AliRsnCutBetheBloch::IsSelected(TObject *object)
 {
 //
 // Cut checker.
 //
 
-  // coherence check
-  if (tgt != AliRsnCut::kParticle)
-  {
-    AliError(Form("Wrong target. Skipping cut", GetName()));
-    return kTRUE;
-  }
+  // dynamic cast the object into AliRsnDaughter
+  if (!TargetOK(object)) return kFALSE;
 
   // retrieve the TPC signal
-  AliVParticle *vpart = track->GetRef();
-  AliESDtrack *esd = dynamic_cast<AliESDtrack*>(vpart);
+  AliRsnDaughter *track = fDaughter;
+  
+  // if track is meaningful, retrieve its ESD format
+  AliESDtrack    *esd   = track->GetRefESDtrack();
   if (!esd) {
     AliError("ESD information unavailable");
     return kTRUE;
   }
-
-  // compute Bethe-Bloch with the given mass hypothesis
-  Double_t bb = BetheBloch(track);
+  if (!track->GetRefESDtrack()->GetInnerParam()) {
+    AliDebug(AliLog::kDebug+2, "Rejecting a track with no info at the TPC inner wall");
+    return kFALSE;
+  }
 
   // the cut range is the relative fraction of the value:
   // BB*(1-fraction) < TPC < BB*(1+fraction)
   // which means:
   // -fraction < (TPC - BB)/BB < fraction
   // so we must compute the cut value accordingly
-  fCutValueD = (esd->GetTPCsignal() - bb) / bb;
+  fCutValueD = RelDiff(track);
 
   // then, this cut is checked inside the range
-  return OkRange();
-}
-
-//_________________________________________________________________________________________________
-Bool_t AliRsnCutBetheBloch::IsSelected(ETarget /*tgt*/, AliRsnPairParticle* /*pair*/)
-{
-//
-// Cut checker
-//
-
-  AliWarning("Cannot apply this cut to pairs");
-  return kTRUE;
-}
-
-//_________________________________________________________________________________________________
-Bool_t AliRsnCutBetheBloch::IsSelected(ETarget /*tgt*/, AliRsnEvent* /*event*/)
-{
-//
-// Cut checker
-//
-
-  AliWarning("Cannot apply this cut to events");
-  return kTRUE;
-}
-
-//_________________________________________________________________________________________________
-Bool_t AliRsnCutBetheBloch::IsSelected(ETarget /*tgt*/, AliRsnEvent* /*ev1*/, AliRsnEvent* /*ev2*/)
-{
-//
-// Cut checker
-//
-
-  AliWarning("Cannot apply this cut to event mixing");
-  return kTRUE;
+  return OkRangeD();
 }