ROOT logo
//
// Class AliRsnCutPIDTOF
//
// Implements the PID check with TOF detector,
// computed as a compatibility within a given range
// expressed in number of sigmas w.r. to expected time.
// Uses the default cut checking facilities of AliRsnCut
// to check this.
//
// authors: Martin Vala (martin.vala@cern.ch)
//          Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
//

#include "AliAnalysisManager.h"
#include "AliESDInputHandler.h"
#include "AliESDtrack.h"
#include "AliESDpid.h"
#include "AliAODTrack.h"
#include "AliAODpidUtil.h"

#include "AliRsnCutPIDTOF.h"

ClassImp(AliRsnCutPIDTOF)

//_________________________________________________________________________________________________
AliRsnCutPIDTOF::AliRsnCutPIDTOF
(const char *name, AliPID::EParticleType ref, Double_t min, Double_t max, Bool_t rejectUnmatched) :
   AliRsnCut(name, AliRsnCut::kDaughter, min, max),
   fRejectUnmatched(rejectUnmatched),
   fRefType(AliPID::kUnknown),
   fRefMass(0.0),
   fESDpid(0x0),
   fAODpid(0x0)
{
//
// Default constructor.
// To set the reference PID type, calls the SetRefType method,
// which sets the mass accordingly and coherently.
//

   SetRefType(ref);
}

//_________________________________________________________________________________________________
AliRsnCutPIDTOF::AliRsnCutPIDTOF(const AliRsnCutPIDTOF &copy) :
   AliRsnCut(copy),
   fRejectUnmatched(copy.fRejectUnmatched),
   fRefType(AliPID::kUnknown),
   fRefMass(0.0),
   fESDpid(copy.fESDpid),
   fAODpid(copy.fAODpid)
{
//
// Copy constructor.
// To set the reference PID type, calls the SetRefType method,
// which sets the mass accordingly and coherently.
//

   SetRefType(copy.fRefType);
}

//_________________________________________________________________________________________________
AliRsnCutPIDTOF &AliRsnCutPIDTOF::operator=(const AliRsnCutPIDTOF &copy)
{
//
// Assignment operator.
// To set the reference PID type, calls the SetRefType method,
// which sets the mass accordingly and coherently.
//
   if (this == &copy)
      return *this;

   fRejectUnmatched = copy.fRejectUnmatched;
   fESDpid          = copy.fESDpid;
   fAODpid          = copy.fAODpid;

   SetRefType(copy.fRefType);

   return (*this);
}

//_________________________________________________________________________________________________
Bool_t AliRsnCutPIDTOF::IsSelected(TObject *object)
{
//
// Cut checker.
//

   // coherence check
   if (!TargetOK(object)) return kFALSE;

   // reject always non-track objects
   AliVTrack *vtrack = fDaughter->Ref2Vtrack();
   if (!vtrack) {
      AliDebug(AliLog::kDebug + 2, Form("Impossible to process an object of type '%s'. Cut applicable only to ESD/AOD tracks", fDaughter->GetRef()->ClassName()));
      return kFALSE;
   }

   // checks that track is matched in TOF:
   // if not, the track is accepted or rejected
   // depending on the 'fRejectUnmatched' data member:
   // -- kTRUE  --> all unmatched tracks are rejected
   // -- kFALSE --> all unmatched tracks are accepted (it is assumed that other PIDs are done)
   if (!IsMatched(vtrack)) {
      AliDebug(AliLog::kDebug + 2, "Track is not matched with TOF");
      if (fRejectUnmatched) return kFALSE;
   }

   // retrieve real object type and
   // prepare some useful variables
   Double_t     tof, sigma, times[AliPID::kSPECIESC];
   Double_t    &ref = times[(Int_t)fRefType];
   AliESDtrack *esdTrack = fDaughter->Ref2ESDtrack();
   AliAODTrack *aodTrack = fDaughter->Ref2AODtrack();

   // cut check depends on the object type
   if (esdTrack) {
      // setup the ESD PID object
      AliESDEvent *esd = 0x0;
      if (fEvent) esd = fEvent->GetRefESD();
      if (!esd) {
         AliError("Processing an ESD track, but target is not an ESD event");
         return kFALSE;
      }
      if (!fESDpid) fESDpid = new AliESDpid;
      fESDpid->SetTOFResponse(esd, AliESDpid::kTOF_T0);

      // get time of flight, reference times and sigma
      esdTrack->GetIntegratedTimes(times,AliPID::kSPECIESC);
      tof   = (Double_t)(esdTrack->GetTOFsignal() - fESDpid->GetTOFResponse().GetStartTime(esdTrack->P()));
      sigma = (Double_t)fESDpid->GetTOFResponse().GetExpectedSigma(esdTrack->P(), ref, fRefMass);

      // port values to standard AliRsnCut checker
      fCutValueD = (tof - ref) / sigma;
      return OkRangeD();
   } else if (aodTrack) {
      // for AOD tracks, all operations are done by the AOD PID utility
      if (!fAODpid) fAODpid = new AliAODpidUtil;
      fCutValueD = (Double_t)fAODpid->NumberOfSigmasTOF(aodTrack, fRefType);
      return OkRangeD();
   } else {
      AliDebug(AliLog::kDebug + 2, Form("Impossible to process an object of type '%s'. Cut applicable only to ESD/AOD tracks", fDaughter->GetRef()->ClassName()));
      return kFALSE;
   }
}

//_________________________________________________________________________________________________
void AliRsnCutPIDTOF::Print(const Option_t *) const
{
//
// Print information on this cut
//

   AliInfo(Form("Cut name, type            : %s %s", GetName(), ClassName()));
   AliInfo(Form("TOF PID cut range (sigmas): %.3f %.3f", fMinD, fMaxD));
   AliInfo(Form("Unmatched tracks are      : %s", (fRejectUnmatched ? "rejected" : "accepted")));
}

 AliRsnCutPIDTOF.cxx:1
 AliRsnCutPIDTOF.cxx:2
 AliRsnCutPIDTOF.cxx:3
 AliRsnCutPIDTOF.cxx:4
 AliRsnCutPIDTOF.cxx:5
 AliRsnCutPIDTOF.cxx:6
 AliRsnCutPIDTOF.cxx:7
 AliRsnCutPIDTOF.cxx:8
 AliRsnCutPIDTOF.cxx:9
 AliRsnCutPIDTOF.cxx:10
 AliRsnCutPIDTOF.cxx:11
 AliRsnCutPIDTOF.cxx:12
 AliRsnCutPIDTOF.cxx:13
 AliRsnCutPIDTOF.cxx:14
 AliRsnCutPIDTOF.cxx:15
 AliRsnCutPIDTOF.cxx:16
 AliRsnCutPIDTOF.cxx:17
 AliRsnCutPIDTOF.cxx:18
 AliRsnCutPIDTOF.cxx:19
 AliRsnCutPIDTOF.cxx:20
 AliRsnCutPIDTOF.cxx:21
 AliRsnCutPIDTOF.cxx:22
 AliRsnCutPIDTOF.cxx:23
 AliRsnCutPIDTOF.cxx:24
 AliRsnCutPIDTOF.cxx:25
 AliRsnCutPIDTOF.cxx:26
 AliRsnCutPIDTOF.cxx:27
 AliRsnCutPIDTOF.cxx:28
 AliRsnCutPIDTOF.cxx:29
 AliRsnCutPIDTOF.cxx:30
 AliRsnCutPIDTOF.cxx:31
 AliRsnCutPIDTOF.cxx:32
 AliRsnCutPIDTOF.cxx:33
 AliRsnCutPIDTOF.cxx:34
 AliRsnCutPIDTOF.cxx:35
 AliRsnCutPIDTOF.cxx:36
 AliRsnCutPIDTOF.cxx:37
 AliRsnCutPIDTOF.cxx:38
 AliRsnCutPIDTOF.cxx:39
 AliRsnCutPIDTOF.cxx:40
 AliRsnCutPIDTOF.cxx:41
 AliRsnCutPIDTOF.cxx:42
 AliRsnCutPIDTOF.cxx:43
 AliRsnCutPIDTOF.cxx:44
 AliRsnCutPIDTOF.cxx:45
 AliRsnCutPIDTOF.cxx:46
 AliRsnCutPIDTOF.cxx:47
 AliRsnCutPIDTOF.cxx:48
 AliRsnCutPIDTOF.cxx:49
 AliRsnCutPIDTOF.cxx:50
 AliRsnCutPIDTOF.cxx:51
 AliRsnCutPIDTOF.cxx:52
 AliRsnCutPIDTOF.cxx:53
 AliRsnCutPIDTOF.cxx:54
 AliRsnCutPIDTOF.cxx:55
 AliRsnCutPIDTOF.cxx:56
 AliRsnCutPIDTOF.cxx:57
 AliRsnCutPIDTOF.cxx:58
 AliRsnCutPIDTOF.cxx:59
 AliRsnCutPIDTOF.cxx:60
 AliRsnCutPIDTOF.cxx:61
 AliRsnCutPIDTOF.cxx:62
 AliRsnCutPIDTOF.cxx:63
 AliRsnCutPIDTOF.cxx:64
 AliRsnCutPIDTOF.cxx:65
 AliRsnCutPIDTOF.cxx:66
 AliRsnCutPIDTOF.cxx:67
 AliRsnCutPIDTOF.cxx:68
 AliRsnCutPIDTOF.cxx:69
 AliRsnCutPIDTOF.cxx:70
 AliRsnCutPIDTOF.cxx:71
 AliRsnCutPIDTOF.cxx:72
 AliRsnCutPIDTOF.cxx:73
 AliRsnCutPIDTOF.cxx:74
 AliRsnCutPIDTOF.cxx:75
 AliRsnCutPIDTOF.cxx:76
 AliRsnCutPIDTOF.cxx:77
 AliRsnCutPIDTOF.cxx:78
 AliRsnCutPIDTOF.cxx:79
 AliRsnCutPIDTOF.cxx:80
 AliRsnCutPIDTOF.cxx:81
 AliRsnCutPIDTOF.cxx:82
 AliRsnCutPIDTOF.cxx:83
 AliRsnCutPIDTOF.cxx:84
 AliRsnCutPIDTOF.cxx:85
 AliRsnCutPIDTOF.cxx:86
 AliRsnCutPIDTOF.cxx:87
 AliRsnCutPIDTOF.cxx:88
 AliRsnCutPIDTOF.cxx:89
 AliRsnCutPIDTOF.cxx:90
 AliRsnCutPIDTOF.cxx:91
 AliRsnCutPIDTOF.cxx:92
 AliRsnCutPIDTOF.cxx:93
 AliRsnCutPIDTOF.cxx:94
 AliRsnCutPIDTOF.cxx:95
 AliRsnCutPIDTOF.cxx:96
 AliRsnCutPIDTOF.cxx:97
 AliRsnCutPIDTOF.cxx:98
 AliRsnCutPIDTOF.cxx:99
 AliRsnCutPIDTOF.cxx:100
 AliRsnCutPIDTOF.cxx:101
 AliRsnCutPIDTOF.cxx:102
 AliRsnCutPIDTOF.cxx:103
 AliRsnCutPIDTOF.cxx:104
 AliRsnCutPIDTOF.cxx:105
 AliRsnCutPIDTOF.cxx:106
 AliRsnCutPIDTOF.cxx:107
 AliRsnCutPIDTOF.cxx:108
 AliRsnCutPIDTOF.cxx:109
 AliRsnCutPIDTOF.cxx:110
 AliRsnCutPIDTOF.cxx:111
 AliRsnCutPIDTOF.cxx:112
 AliRsnCutPIDTOF.cxx:113
 AliRsnCutPIDTOF.cxx:114
 AliRsnCutPIDTOF.cxx:115
 AliRsnCutPIDTOF.cxx:116
 AliRsnCutPIDTOF.cxx:117
 AliRsnCutPIDTOF.cxx:118
 AliRsnCutPIDTOF.cxx:119
 AliRsnCutPIDTOF.cxx:120
 AliRsnCutPIDTOF.cxx:121
 AliRsnCutPIDTOF.cxx:122
 AliRsnCutPIDTOF.cxx:123
 AliRsnCutPIDTOF.cxx:124
 AliRsnCutPIDTOF.cxx:125
 AliRsnCutPIDTOF.cxx:126
 AliRsnCutPIDTOF.cxx:127
 AliRsnCutPIDTOF.cxx:128
 AliRsnCutPIDTOF.cxx:129
 AliRsnCutPIDTOF.cxx:130
 AliRsnCutPIDTOF.cxx:131
 AliRsnCutPIDTOF.cxx:132
 AliRsnCutPIDTOF.cxx:133
 AliRsnCutPIDTOF.cxx:134
 AliRsnCutPIDTOF.cxx:135
 AliRsnCutPIDTOF.cxx:136
 AliRsnCutPIDTOF.cxx:137
 AliRsnCutPIDTOF.cxx:138
 AliRsnCutPIDTOF.cxx:139
 AliRsnCutPIDTOF.cxx:140
 AliRsnCutPIDTOF.cxx:141
 AliRsnCutPIDTOF.cxx:142
 AliRsnCutPIDTOF.cxx:143
 AliRsnCutPIDTOF.cxx:144
 AliRsnCutPIDTOF.cxx:145
 AliRsnCutPIDTOF.cxx:146
 AliRsnCutPIDTOF.cxx:147
 AliRsnCutPIDTOF.cxx:148
 AliRsnCutPIDTOF.cxx:149
 AliRsnCutPIDTOF.cxx:150
 AliRsnCutPIDTOF.cxx:151
 AliRsnCutPIDTOF.cxx:152
 AliRsnCutPIDTOF.cxx:153
 AliRsnCutPIDTOF.cxx:154
 AliRsnCutPIDTOF.cxx:155
 AliRsnCutPIDTOF.cxx:156
 AliRsnCutPIDTOF.cxx:157
 AliRsnCutPIDTOF.cxx:158