* add tuned on data functionality for TOF (non-gaussian tails)
authormorsch <morsch@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 28 Mar 2013 14:01:38 +0000 (14:01 +0000)
committermorsch <morsch@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 28 Mar 2013 14:01:38 +0000 (14:01 +0000)
Pietro Antonioli <pietro.antonioli@bo.infn.it>
* Patch to be able to compute the fraction of
shared clusters on AOD tracks.
This way we could use the old AODs where the HybridTracks are not exactly what they are on ESD level.
 Salvatore Aiola <salvoaiola@gmail.com>

15 files changed:
STEER/AOD/AliAODHandler.cxx
STEER/AOD/AliAODTrack.cxx
STEER/AOD/AliAODTrack.h
STEER/AOD/AliAODpidUtil.cxx
STEER/AOD/AliAODpidUtil.h
STEER/ESD/AliESDCaloCluster.h
STEER/ESD/AliESDpid.cxx
STEER/ESD/AliESDpid.h
STEER/ESD/AliESDtrack.cxx
STEER/ESD/AliESDtrack.h
STEER/STEERBase/AliPIDResponse.cxx
STEER/STEERBase/AliPIDResponse.h
STEER/STEERBase/AliTOFPIDResponse.cxx
STEER/STEERBase/AliTOFPIDResponse.h
STEER/STEERBase/AliVTrack.h

index 87a0c4c..b10e87e 100644 (file)
@@ -386,6 +386,7 @@ void AliAODHandler::StoreMCParticles(){
 
   // AODTracks
   TClonesArray* tracks = fAODEvent->GetTracks();
+  Int_t tofLabel[3];
   if(tracks){
     for(int it = 0; it < fAODEvent->GetNTracks();++it){
       AliAODTrack *track = fAODEvent->GetTrack(it);
@@ -396,7 +397,7 @@ void AliAODHandler::StoreMCParticles(){
        label *= -1;
        sign  = -1;
       }
-
+      
       if (label >= AliMCEvent::BgLabelOffset()) label =  mcEvent->BgLabelToIndex(label);
       if(label > np || track->GetLabel() == 0){
        AliWarning(Form("Wrong ESD track label %5d (%5d)",track->GetLabel(), label));
@@ -405,6 +406,23 @@ void AliAODHandler::StoreMCParticles(){
        AliWarning(Form("New label not found for %5d (%5d)",track->GetLabel(), label));
       }
       track->SetLabel(sign*fMCEventH->GetNewLabel(label));
+      
+      track->GetTOFLabel(tofLabel);
+      
+      for (Int_t i =0; i < 3; i++) {
+       label  = tofLabel[i]; // esd label
+       Int_t nlabel = label; // new label
+       if (label < 0) continue;
+       if (label >= AliMCEvent::BgLabelOffset()) nlabel =  mcEvent->BgLabelToIndex(label);
+       if(nlabel > np || label == 0) {
+         AliWarning(Form("Wrong TOF label %5d (%5d)", label, nlabel));
+       }
+       if(fMCEventH->GetNewLabel(label) == 0){
+         AliWarning(Form("New TOF label not found for %5d",label ));
+       }
+       tofLabel[i] = fMCEventH->GetNewLabel(label);
+      } 
+      track->SetTOFLabel(tofLabel);
     }
   }
   
index cddaff2..11de9d1 100644 (file)
@@ -41,6 +41,7 @@ AliAODTrack::AliAODTrack() :
   fChi2MatchTrigger(0.),
   fFlags(0),
   fLabel(-999),
+  fTOFLabel(),
   fITSMuonClusterMap(0),
   fMUONtrigHitsMapTrg(0),
   fMUONtrigHitsMapTrk(0),
@@ -61,6 +62,7 @@ AliAODTrack::AliAODTrack() :
   fTrackPhiOnEMCal(-999),
   fTrackEtaOnEMCal(-999),
   fTPCsignalTuned(0),
+  fTOFsignalTuned(99999),
   fAODEvent(NULL)
 {
   // default constructor
@@ -70,6 +72,7 @@ AliAODTrack::AliAODTrack() :
   SetXYAtDCA(-999., -999.);
   SetPxPyPzAtDCA(-999., -999., -999.);
   SetPID((Float_t*)NULL);
+  for (Int_t i = 0; i < 3; i++) {fTOFLabel[i] = -1;}
 }
 
 //______________________________________________________________________________
@@ -95,6 +98,7 @@ AliAODTrack::AliAODTrack(Short_t id,
   fChi2MatchTrigger(0.),
   fFlags(0),
   fLabel(label),
+  fTOFLabel(),
   fITSMuonClusterMap(0),
   fMUONtrigHitsMapTrg(0),
   fMUONtrigHitsMapTrk(0),
@@ -115,6 +119,7 @@ AliAODTrack::AliAODTrack(Short_t id,
   fTrackPhiOnEMCal(-999),
   fTrackEtaOnEMCal(-999),
   fTPCsignalTuned(0),
+  fTOFsignalTuned(99999),
   fAODEvent(NULL)
 {
   // constructor
@@ -128,6 +133,7 @@ AliAODTrack::AliAODTrack(Short_t id,
   if(covMatrix) SetCovMatrix(covMatrix);
   SetPID(pid);
   SetITSClusterMap(itsClusMap);
+  for (Int_t i=0;i<3;i++) {fTOFLabel[i]=-1;}
 }
 
 //______________________________________________________________________________
@@ -153,6 +159,7 @@ AliAODTrack::AliAODTrack(Short_t id,
   fChi2MatchTrigger(0.),
   fFlags(0),
   fLabel(label),
+  fTOFLabel(),
   fITSMuonClusterMap(0),
   fMUONtrigHitsMapTrg(0),
   fMUONtrigHitsMapTrk(0),
@@ -173,6 +180,7 @@ AliAODTrack::AliAODTrack(Short_t id,
   fTrackPhiOnEMCal(-999),
   fTrackEtaOnEMCal(-999),
   fTPCsignalTuned(0),
+  fTOFsignalTuned(99999),
   fAODEvent(NULL)
 {
   // constructor
@@ -186,6 +194,7 @@ AliAODTrack::AliAODTrack(Short_t id,
   if(covMatrix) SetCovMatrix(covMatrix);
   SetPID(pid);
   SetITSClusterMap(itsClusMap);
+  for (Int_t i=0;i<3;i++) {fTOFLabel[i]=-1;}
 }
 
 //______________________________________________________________________________
@@ -206,6 +215,7 @@ AliAODTrack::AliAODTrack(const AliAODTrack& trk) :
   fChi2MatchTrigger(trk.fChi2MatchTrigger),
   fFlags(trk.fFlags),
   fLabel(trk.fLabel),
+  fTOFLabel(),
   fITSMuonClusterMap(trk.fITSMuonClusterMap),
   fMUONtrigHitsMapTrg(trk.fMUONtrigHitsMapTrg),
   fMUONtrigHitsMapTrk(trk.fMUONtrigHitsMapTrk),
@@ -226,6 +236,7 @@ AliAODTrack::AliAODTrack(const AliAODTrack& trk) :
   fTrackPhiOnEMCal(trk.fTrackPhiOnEMCal),
   fTrackEtaOnEMCal(trk.fTrackEtaOnEMCal),
   fTPCsignalTuned(trk.fTPCsignalTuned),
+  fTOFsignalTuned(trk.fTOFsignalTuned),
   fAODEvent(trk.fAODEvent)
 {
   // Copy constructor
@@ -240,6 +251,7 @@ AliAODTrack::AliAODTrack(const AliAODTrack& trk) :
   if(trk.fDetPid) fDetPid=new AliAODPid(*trk.fDetPid);
   SetPID(trk.fPID);
   if (trk.fDetectorPID) fDetectorPID = new AliDetectorPID(*trk.fDetectorPID);
+  for (Int_t i = 0; i < 3; i++) {fTOFLabel[i] = trk.fTOFLabel[i];}  
 }
 
 //______________________________________________________________________________
@@ -276,6 +288,7 @@ AliAODTrack& AliAODTrack::operator=(const AliAODTrack& trk)
     fTrackPhiOnEMCal   = trk.fTrackPhiOnEMCal;
     fTrackEtaOnEMCal   = trk.fTrackEtaOnEMCal;
     fTPCsignalTuned    = trk.fTPCsignalTuned;
+    fTOFsignalTuned    = trk.fTOFsignalTuned;
 
     delete fCovMatrix;
     if(trk.fCovMatrix) fCovMatrix=new AliAODRedCov<6>(*trk.fCovMatrix);
@@ -295,6 +308,7 @@ AliAODTrack& AliAODTrack::operator=(const AliAODTrack& trk)
     delete fDetectorPID;
     fDetectorPID=0x0;
     if (trk.fDetectorPID) fDetectorPID = new AliDetectorPID(*trk.fDetectorPID);
+    for (Int_t i = 0; i < 3; i++) {fTOFLabel[i] = trk.fTOFLabel[i];}  
   }
 
   return *this;
@@ -402,6 +416,17 @@ Double_t AliAODTrack::Y(Double_t m) const
   }
 }
 
+void AliAODTrack::SetTOFLabel(const Int_t *p) {  
+  // Sets  (in TOF)
+  for (Int_t i = 0; i < 3; i++) fTOFLabel[i]=p[i];
+}
+
+//_______________________________________________________________________
+void AliAODTrack::GetTOFLabel(Int_t *p) const {
+  // Gets (in TOF)
+  for (Int_t i=0; i<3; i++) p[i]=fTOFLabel[i];
+}
+
 //______________________________________________________________________________
 AliAODTrack::AODTrkPID_t AliAODTrack::GetMostProbablePID() const 
 {
index d429f41..98d7d40 100644 (file)
@@ -127,12 +127,20 @@ class AliAODTrack : public AliVTrack {
   virtual Bool_t   XvYvZv(Double_t x[3]) const { x[0] = Xv(); x[1] = Yv(); x[2] = Zv(); return kTRUE; }
 
   Double_t Chi2perNDF()  const { return fChi2perNDF; }
-  UShort_t GetTPCNcls()  const { 
-    UShort_t cl = fTPCFitMap.CountBits();
-    if(cl==0)cl = fTPCClusterMap.CountBits();// backward compatibility
+
+  UShort_t GetTPCnclsS(Int_t i0=0,Int_t i1=159)  const { 
+    UShort_t cl = fTPCSharedMap.CountBits(i0)-fTPCSharedMap.CountBits(i1);
     return cl;
   }
   
+  UShort_t GetTPCncls(Int_t i0=0,Int_t i1=159)  const { 
+    UShort_t cl = fTPCFitMap.CountBits(i0)-fTPCFitMap.CountBits(i1);
+    if(cl==0)cl = fTPCClusterMap.CountBits(i0)-fTPCClusterMap.CountBits(i1);// backward compatibility
+    return cl;
+  }
+  
+  UShort_t GetTPCNcls()  const { return GetTPCncls(); }
+
   virtual Double_t M() const { return M(GetMostProbablePID()); }
   Double_t M(AODTrkPID_t pid) const;
   virtual Double_t E() const { return E(GetMostProbablePID()); }
@@ -168,6 +176,9 @@ class AliAODTrack : public AliVTrack {
 
   Int_t   GetID() const { return (Int_t)fID; }
   Int_t   GetLabel() const { return fLabel; } 
+  void    GetTOFLabel(Int_t *p) const;
+
+
   Char_t  GetType() const { return fType;}
   Bool_t  IsPrimaryCandidate() const;
   Bool_t  GetUsedForVtxFit() const { return TestBit(kUsedForVtxFit); }
@@ -284,6 +295,8 @@ class AliAODTrack : public AliVTrack {
   virtual AliTPCdEdxInfo* GetTPCdEdxInfo() const {return fDetPid?fDetPid->GetTPCdEdxInfo():0;}
   Double_t  GetTPCmomentum()     const { return fDetPid?fDetPid->GetTPCmomentum():0.;  }
   Double_t  GetTOFsignal()       const { return fDetPid?fDetPid->GetTOFsignal():0.;    }
+  Double_t  GetTOFsignalTunedOnData() const { return fTOFsignalTuned;}
+  void      SetTOFsignalTunedOnData(Double_t signal) {fTOFsignalTuned = signal;}
   Double_t  GetHMPIDsignal()     const; 
   Double_t  GetHMPIDoccupancy()  const;
 
@@ -321,7 +334,7 @@ class AliAODTrack : public AliVTrack {
 
   void SetID(Short_t id) { fID = id; }
   void SetLabel(Int_t label) { fLabel = label; }
-
+  void SetTOFLabel(const Int_t* p);
   template <typename T> void SetPosition(const T *x, Bool_t isDCA = kFALSE);
   void SetDCA(Double_t d, Double_t z);
   void SetUsedForVtxFit(Bool_t used = kTRUE) { used ? SetBit(kUsedForVtxFit) : ResetBit(kUsedForVtxFit); }
@@ -406,7 +419,7 @@ class AliAODTrack : public AliVTrack {
 
   ULong_t       fFlags;             // reconstruction status flags 
   Int_t         fLabel;             // track label, points back to MC track
-  
+  Int_t         fTOFLabel[3];       // TOF label   
   UInt_t        fITSMuonClusterMap; // map of ITS and muon clusters, one bit per layer
                                     // (ITS: bit 1-8, muon trigger: bit 9-16, muon tracker: bit 17-26, muon match trigger: bit 31-32) 
   UInt_t        fMUONtrigHitsMapTrg; // Muon trigger hits map from trigger
@@ -437,10 +450,11 @@ class AliAODTrack : public AliVTrack {
   Double_t      fTrackEtaOnEMCal;   // eta of track after being propagated to 430cm
 
   Double_t      fTPCsignalTuned;    //! TPC signal tuned on data when using MC
+  Double_t      fTOFsignalTuned;    //! TOF signal tuned on data when using MC
 
   const AliAODEvent* fAODEvent;     //! 
 
-  ClassDef(AliAODTrack, 19);
+  ClassDef(AliAODTrack, 20);
 };
 
 inline Bool_t  AliAODTrack::IsPrimaryCandidate() const
index 7e160fa..f5d31fb 100644 (file)
@@ -103,6 +103,17 @@ Float_t AliAODpidUtil::GetTPCsignalTunedOnData(const AliVTrack *t) const {
     track->SetTPCsignalTunedOnData(dedx);
     return dedx;
 }
+//_________________________________________________________________________
+Float_t AliAODpidUtil::GetTOFsignalTunedOnData(const AliVTrack *t) const {
+    AliAODTrack *track = (AliAODTrack *) t;
+    Double_t tofSignal = track->GetTOFsignalTunedOnData();
+
+    if(tofSignal <  99999) return (Float_t)tofSignal; // it has been already set
+    AliAODPid *pidObj = track->GetDetPid();
+    tofSignal = pidObj->GetTOFsignal() + fTOFResponse.GetTailRandomValue();
+    track->SetTOFsignalTunedOnData(tofSignal);
+    return (Float_t)tofSignal;
+}
 
 //_________________________________________________________________________
 Float_t AliAODpidUtil::GetSignalDeltaTOFold(const AliVParticle *vtrack, AliPID::EParticleType type, Bool_t ratio/*=kFALSE*/) const
@@ -112,10 +123,11 @@ Float_t AliAODpidUtil::GetSignalDeltaTOFold(const AliVParticle *vtrack, AliPID::
   //
   
   AliAODTrack *track=(AliAODTrack*)vtrack;
-  
   AliAODPid *pidObj = track->GetDetPid();
   if (!pidObj) return -9999.;
-  Double_t tofTime=pidObj->GetTOFsignal();
+  Double_t tofTime = 99999;
+  if (fTuneMConData && ((fTuneMConDataMask & kDetTOF) == kDetTOF) ) tofTime = (Double_t)this->GetTOFsignalTunedOnData((AliVTrack*)vtrack);
+  else tofTime=pidObj->GetTOFsignal();
   const Double_t expTime=fTOFResponse.GetExpectedSignal((AliVTrack*)vtrack,type);
   Double_t sigmaTOFPid[AliPID::kSPECIES];
   pidObj->GetTOFpidResolution(sigmaTOFPid);
@@ -151,7 +163,9 @@ Float_t AliAODpidUtil::GetNumberOfSigmasTOFold(const AliVParticle *vtrack, AliPI
   Double_t sigTOF=0.;
   AliAODPid *pidObj = track->GetDetPid();
   if (!pidObj) return -999.;
-  Double_t tofTime=pidObj->GetTOFsignal();
+  Double_t tofTime = 99999;
+  if (fTuneMConData && ((fTuneMConDataMask & kDetTOF) == kDetTOF) ) tofTime = (Double_t)this->GetTOFsignalTunedOnData((AliVTrack*)vtrack);
+  else tofTime=pidObj->GetTOFsignal();
   Double_t expTime=fTOFResponse.GetExpectedSignal((AliVTrack*)vtrack,type);
   Double_t sigmaTOFPid[AliPID::kSPECIES];
   pidObj->GetTOFpidResolution(sigmaTOFPid);
index a212ae7..db765c5 100644 (file)
@@ -34,6 +34,7 @@ public:
 
 
   Float_t GetTPCsignalTunedOnData(const AliVTrack *t) const;
+  Float_t GetTOFsignalTunedOnData(const AliVTrack *t) const;
 
 protected:
   virtual Float_t GetSignalDeltaTOFold(const AliVParticle *track, AliPID::EParticleType type, Bool_t ratio=kFALSE) const;
index eed1737..1fe02e2 100644 (file)
@@ -92,10 +92,16 @@ class AliESDCaloCluster : public AliVCluster
     else *fTracksMatched = array;
   }
   void AddLabels(TArrayI & array)         { 
-    if(!fLabels)fLabels = new TArrayI(array) ; 
+    if(!fLabels)fLabels = new TArrayI(array) ;
     else *fLabels = array;
   }
   
+  void SetLabel(Int_t *array, UInt_t size)
+  {
+    if(fLabels) delete fLabels ;
+    fLabels = new TArrayI(size,array);
+  }
+
   TArrayI * GetTracksMatched() const  {return  fTracksMatched;}
   TArrayI * GetLabelsArray() const    {return  fLabels;}
   Int_t   * GetLabels() const         {if (fLabels) return  fLabels->GetArray(); else return 0;}
index 584e1e7..7c39219 100644 (file)
@@ -135,6 +135,17 @@ Float_t AliESDpid::GetTPCsignalTunedOnData(const AliVTrack *t) const {
     return dedx;
 }
 //_________________________________________________________________________
+Float_t AliESDpid::GetTOFsignalTunedOnData(const AliVTrack *t) const {
+    AliESDtrack *track = (AliESDtrack *) t;
+    Double_t tofSignal = track->GetTOFsignalTunedOnData();
+
+    if(tofSignal <  99999) return (Float_t)tofSignal; // it has been already set
+
+    tofSignal = t->GetTOFsignal() + fTOFResponse.GetTailRandomValue();
+    track->SetTOFsignalTunedOnData(tofSignal);
+    return (Float_t)tofSignal;
+}
+//_________________________________________________________________________
 void AliESDpid::MakeTPCPID(AliESDtrack *track) const
 {
   //
@@ -419,7 +430,10 @@ Float_t AliESDpid::GetSignalDeltaTOFold(const AliVParticle *track, AliPID::EPart
   AliVTrack *vtrack=(AliVTrack*)track;
   
   const Double_t expTime = fTOFResponse.GetExpectedSignal(vtrack,type);
-  const Double_t tofTime=vtrack->GetTOFsignal() - fTOFResponse.GetStartTime(vtrack->P());
+  Double_t tofTime = 99999;
+  if (fTuneMConData && ((fTuneMConDataMask & kDetTOF) == kDetTOF) ) tofTime = (Double_t)this->GetTOFsignalTunedOnData((AliVTrack*)vtrack);
+  else tofTime=vtrack->GetTOFsignal();
+  tofTime = tofTime  - fTOFResponse.GetStartTime(vtrack->P());
   Double_t delta=-9999.;
 
   if (!ratio) delta=tofTime-expTime;
@@ -436,7 +450,10 @@ Float_t AliESDpid::GetNumberOfSigmasTOFold(const AliVParticle *track, AliPID::EP
   //
 
   AliVTrack *vtrack=(AliVTrack*)track;
+  Double_t tofTime = 99999;
+  if (fTuneMConData && ((fTuneMConDataMask & kDetTOF) == kDetTOF) ) tofTime = (Double_t)this->GetTOFsignalTunedOnData((AliVTrack*)vtrack);
+  else tofTime=vtrack->GetTOFsignal();
   
   Double_t expTime = fTOFResponse.GetExpectedSignal(vtrack,type);
-  return (vtrack->GetTOFsignal() - fTOFResponse.GetStartTime(vtrack->P()) - expTime)/fTOFResponse.GetExpectedSigma(vtrack->P(),expTime,AliPID::ParticleMassZ(type));
+  return (tofTime - fTOFResponse.GetStartTime(vtrack->P()) - expTime)/fTOFResponse.GetExpectedSigma(vtrack->P(),expTime,AliPID::ParticleMassZ(type));
 }
index cce9f15..414649f 100644 (file)
@@ -47,6 +47,7 @@ AliESDpid(const AliESDpid&a): AliPIDResponse(a), fRangeTOFMismatch(a.fRangeTOFMi
   Float_t GetNMaxSigmaTOFTPCMismatch() const {return fRangeTOFMismatch;}
 
   Float_t GetTPCsignalTunedOnData(const AliVTrack *t) const;
+  Float_t GetTOFsignalTunedOnData(const AliVTrack *t) const;
 
   void SetEventHandler(AliVEventHandler *event){fEventHandler=event;};
 protected:
index c876213..82ea2cb 100644 (file)
@@ -208,6 +208,7 @@ AliESDtrack::AliESDtrack() :
   fTRDQuality(0),
   fTRDBudget(0),
   fTOFsignal(99999),
+  fTOFsignalTuned(99999),
   fTOFsignalToT(99999),
   fTOFsignalRaw(99999),
   fTOFsignalDz(999),
@@ -324,6 +325,7 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   fTRDQuality(track.fTRDQuality),
   fTRDBudget(track.fTRDBudget),
   fTOFsignal(track.fTOFsignal),
+  fTOFsignalTuned(track.fTOFsignalTuned),
   fTOFsignalToT(track.fTOFsignalToT),
   fTOFsignalRaw(track.fTOFsignalRaw),
   fTOFsignalDz(track.fTOFsignalDz),
@@ -453,6 +455,7 @@ AliESDtrack::AliESDtrack(const AliVTrack *track) :
   fTRDQuality(0),
   fTRDBudget(0),
   fTOFsignal(99999),
+  fTOFsignalTuned(99999),
   fTOFsignalToT(99999),
   fTOFsignalRaw(99999),
   fTOFsignalDz(999),
@@ -642,6 +645,7 @@ AliESDtrack::AliESDtrack(TParticle * part) :
   fTRDQuality(0),
   fTRDBudget(0),
   fTOFsignal(99999),
+  fTOFsignalTuned(99999),
   fTOFsignalToT(99999),
   fTOFsignalRaw(99999),
   fTOFsignalDz(999),
@@ -993,6 +997,7 @@ AliESDtrack &AliESDtrack::operator=(const AliESDtrack &source){
   fTRDQuality =   source.fTRDQuality;     
   fTRDBudget  =   source.fTRDBudget;      
   fTOFsignal  =   source.fTOFsignal;     
+  fTOFsignalTuned  = source.fTOFsignalTuned;
   fTOFsignalToT = source.fTOFsignalToT;   
   fTOFsignalRaw = source.fTOFsignalRaw;  
   fTOFsignalDz  = source.fTOFsignalDz;      
index 68177e8..15fa5d3 100644 (file)
@@ -325,6 +325,8 @@ public:
   Int_t   GetTOFcluster() const {return fTOFindex;}
   void    SetTOFcluster(Int_t index) {fTOFindex=index;}
   void    SetTOFCalChannel(Int_t index) {fTOFCalChannel=index;}
+  void    SetTOFsignalTunedOnData(Double_t signal){fTOFsignalTuned=signal;}
+  Double_t GetTOFsignalTunedOnData() const {return fTOFsignalTuned;}
 
 // HMPID methodes +++++++++++++++++++++++++++++++++ (kir)
   void    SetHMPIDsignal(Double_t theta) {fHMPIDsignal=theta;}
@@ -498,6 +500,7 @@ protected:
   Double32_t fTRDBudget;      // trd material budget
 
   Double32_t fTOFsignal;      // detector's PID signal
+  Double32_t fTOFsignalTuned; //! detector's PID signal tuned on data when using MC
   Double32_t fTOFsignalToT;   // detector's ToT signal
   Double32_t fTOFsignalRaw;   // detector's uncorrected time signal
   Double32_t fTOFsignalDz;    // local z  of track's impact on the TOF pad 
@@ -550,7 +553,7 @@ protected:
   static bool fgkOnlineMode; //! indicate the online mode to skip some of the functionality
 
   AliESDtrack & operator=(const AliESDtrack & );
-  ClassDef(AliESDtrack,66)  //ESDtrack 
+  ClassDef(AliESDtrack,67)  //ESDtrack 
 };
 
 
index 345b294..df92c4f 100644 (file)
@@ -87,7 +87,8 @@ fHMPIDPIDParams(NULL),
 fEMCALPIDParams(NULL),
 fCurrentEvent(NULL),
 fCurrCentrality(0.0),
-fTuneMConData(kFALSE)
+fTuneMConData(kFALSE),
+fTuneMConDataMask(kDetTOF|kDetTPC)
 {
   //
   // default ctor
@@ -147,7 +148,8 @@ fHMPIDPIDParams(NULL),
 fEMCALPIDParams(NULL),
 fCurrentEvent(NULL),
 fCurrCentrality(0.0),
-fTuneMConData(kFALSE)
+fTuneMConData(kFALSE),
+fTuneMConDataMask(kDetTOF|kDetTPC)
 {
   //
   // copy ctor
@@ -891,7 +893,7 @@ void AliPIDResponse::SetTPCEtaMaps(Double_t refineFactorMapX, Double_t refineFac
   }
 
   Int_t recopass = fRecoPass;
-  if (fTuneMConData)
+  if (fTuneMConData && ((fTuneMConDataMask & kDetTPC) == kDetTPC) )
     recopass = fRecoPassUser;
   
   TString defaultObj = Form("Default_%s_pass%d", dataType.Data(), recopass);
@@ -1097,7 +1099,7 @@ void AliPIDResponse::SetTPCParametrisation()
   if (fIsMC && !fTuneMConData) period=fMCperiodTPC;
 
   Int_t recopass = fRecoPass;
-  if(fTuneMConData) recopass = fRecoPassUser;
+  if (fTuneMConData && ((fTuneMConDataMask & kDetTPC) == kDetTPC) ) recopass = fRecoPassUser;
     
   AliInfo(Form("Searching splines for: %s %s PASS%d %s",datatype.Data(),period.Data(),recopass,fBeamType.Data()));
   Bool_t found=kFALSE;
@@ -1802,8 +1804,7 @@ Float_t AliPIDResponse::GetNumberOfSigmasTPC(const AliVParticle *vtrack, AliPID:
   // the following call is needed in order to fill the transient data member
   // fTPCsignalTuned which is used in the TPCPIDResponse to judge
   // if using tuned on data
-  if (fTuneMConData)
-    this->GetTPCsignalTunedOnData(track);
+  if (fTuneMConData && ((fTuneMConDataMask & kDetTPC) == kDetTPC) ) this->GetTPCsignalTunedOnData(track);
   
   return fTPCResponse.GetNumberOfSigmas(track, type, AliTPCPIDResponse::kdEdxDefault, fUseTPCEtaCorrection);
 }
@@ -1884,7 +1885,7 @@ AliPIDResponse::EDetPidStatus AliPIDResponse::GetSignalDeltaTPC(const AliVPartic
   // the following call is needed in order to fill the transient data member
   // fTPCsignalTuned which is used in the TPCPIDResponse to judge
   // if using tuned on data
-  if (fTuneMConData)
+  if (fTuneMConData && ((fTuneMConDataMask & kDetTPC) == kDetTPC) ) 
     this->GetTPCsignalTunedOnData(track);
   
   val=fTPCResponse.GetSignalDelta(track, type, AliTPCPIDResponse::kdEdxDefault, fUseTPCEtaCorrection, ratio);
@@ -1900,7 +1901,6 @@ AliPIDResponse::EDetPidStatus AliPIDResponse::GetSignalDeltaTOF(const AliVPartic
   //
   AliVTrack *track=(AliVTrack*)vtrack;
   val=GetSignalDeltaTOFold(track, type, ratio);
-  
   return GetTOFPIDStatus(track);
 }
 
@@ -2004,7 +2004,7 @@ AliPIDResponse::EDetPidStatus AliPIDResponse::GetComputeTPCProbability  (const A
   Double_t dedx=track->GetTPCsignal();
   Bool_t mismatch=kTRUE/*, heavy=kTRUE*/;
   
-  if(fTuneMConData) dedx = this->GetTPCsignalTunedOnData(track);
+  if (fTuneMConData && ((fTuneMConDataMask & kDetTPC) == kDetTPC) ) dedx = this->GetTPCsignalTunedOnData(track);
   
   Double_t bethe = 0.;
   Double_t sigma = 0.;
index b9820e4..97cbe5d 100644 (file)
@@ -155,8 +155,11 @@ public:
   void SetTOFResponse(AliVEvent *vevent,EStartTimeType_t option);
 
   virtual Float_t GetTPCsignalTunedOnData(const AliVTrack *t) const {return t->GetTPCsignal();};
+  virtual Float_t GetTOFsignalTunedOnData(const AliVTrack *t) const {return t->GetTOFsignal();};
   Bool_t IsTunedOnData() const {return fTuneMConData;};
   void SetTunedOnData(Bool_t flag=kTRUE,Int_t recoPass=0){fTuneMConData = flag; if(recoPass>0) fRecoPassUser = recoPass;};
+  Int_t GetTunedOnDataMask() const {return fTuneMConDataMask;};
+  void SetTunedOnDataMask(Int_t detMask) {fTuneMConDataMask = detMask;}
 
   AliPIDResponse(const AliPIDResponse &other);
   AliPIDResponse& operator=(const AliPIDResponse &other);
@@ -180,6 +183,10 @@ protected:
   EDetPidStatus GetComputeTRDProbability  (const AliVTrack *track, Int_t nSpecies, Double_t p[],AliTRDPIDResponse::ETRDPIDMethod PIDmethod=AliTRDPIDResponse::kLQ1D) const;
   EDetPidStatus GetTOFPIDStatus(const AliVTrack *track) const;
 
+  Bool_t fTuneMConData;                // switch to force the MC to be similar to data
+  Int_t fTuneMConDataMask;             // select for which detectors enable MC tuning on data
+
+
 private:
   Bool_t fIsMC;                        //  If we run on MC data
   Bool_t fCachePID;
@@ -218,7 +225,6 @@ private:
 
   Float_t fCurrCentrality;             //! current centrality
   
-  Bool_t fTuneMConData;                // switch to force the MC to be similar to data (dE/dx)
   
   void ExecNewRun();
   
index cc32e09..bafccab 100644 (file)
 
 #include "TMath.h"
 #include "AliLog.h"
+#include "TF1.h"
 
 #include "AliTOFPIDResponse.h"
 
 ClassImp(AliTOFPIDResponse)
 
+TF1 *AliTOFPIDResponse::fTOFtailResponse = NULL; // function to generate a TOF tail
+
 //_________________________________________________________________________
 AliTOFPIDResponse::AliTOFPIDResponse(): 
   fSigma(0),
@@ -38,6 +41,16 @@ AliTOFPIDResponse::AliTOFPIDResponse():
   fPar[2] = 0.002;
   fPar[3] = 40.0;
 
+  if(!fTOFtailResponse){
+    fTOFtailResponse = new TF1("fTOFtail","[0]*TMath::Exp(-(x-[1])*(x-[1])/2/[2]/[2])* (x < [1]+[3]*[2]) + (x > [1]+[3]*[2])*[0]*TMath::Exp(-(x-[1]-[3]*[2]*0.5)*[3]/[2] * 0.0111)*0.01818",-1000,1000);
+    fTOFtailResponse->SetParameter(0,1);
+    fTOFtailResponse->SetParameter(1,-25);
+    fTOFtailResponse->SetParameter(2,1);
+    fTOFtailResponse->SetParameter(3,1.1);
+    fTOFtailResponse->SetNpx(10000);
+  }
+    
+
   // Reset T0 info
   ResetT0info();
   SetMomBoundary();
@@ -194,3 +207,11 @@ Int_t AliTOFPIDResponse::GetStartTimeMask(Float_t mom) const {
   return GetT0binMask(ibin);
 
 }
+//_________________________________________________________________________
+Double_t AliTOFPIDResponse::GetTailRandomValue() const // generate a random value to add a tail to TOF time (for MC analyses)
+{
+  if(fTOFtailResponse)
+    return fTOFtailResponse->GetRandom();
+  else
+    return 0.0;
+}
index 4648cb6..6e7cdd2 100644 (file)
@@ -15,6 +15,7 @@
 #include "AliVTrack.h"
 
 class AliTOFPIDParams;
+class TF1;
 
 class AliTOFPIDResponse : public TObject {
 public:
@@ -36,6 +37,8 @@ public:
 
   Double_t GetMismatchProbability(Double_t p,Double_t mass) const;
 
+  Double_t GetTailRandomValue() const; // generate a random value to add a tail to TOF time (for MC analyses)
+
   void     SetT0event(Float_t *t0event){for(Int_t i=0;i < fNmomBins;i++) fT0event[i] = t0event[i];};
   void     SetT0resolution(Float_t *t0resolution){for(Int_t i=0;i < fNmomBins;i++) fT0resolution[i] = t0resolution[i];};
   void     ResetT0info(){ for(Int_t i=0;i < fNmomBins;i++){ fT0event[i] = 0.0; fT0resolution[i] = 0.0; fMaskT0[i] = 0;} };
@@ -76,7 +79,9 @@ public:
   Int_t fMaskT0[fNmomBins]; // mask withthe T0 used (0x1=T0-TOF,0x2=T0A,0x3=TOC) for p bins
   Float_t fPar[4]; // parameter for expected times resolution
 
-  ClassDef(AliTOFPIDResponse,4)   // TOF PID class
+  static TF1 *fTOFtailResponse; // function to generate a TOF tail
+
+  ClassDef(AliTOFPIDResponse,5)   // TOF PID class
 };
 
 #endif
index c954912..711c0f6 100644 (file)
@@ -91,6 +91,7 @@ public:
   virtual UShort_t  GetTPCsignalN()      const {return 0 ;}
   virtual Double_t  GetTPCmomentum()     const {return 0.;}
   virtual Double_t  GetTOFsignal()       const {return 0.;}
+  virtual Double_t  GetTOFsignalTunedOnData() const {return 0.;}
   virtual Double_t  GetHMPIDsignal()     const {return 0.;}
   virtual Double_t  GetTRDsignal()       const {return 0.;}