#include "AliAODEvent.h"
#include "AliVCuts.h"
#include "AliMCEvent.h"
+#include "AliAODpidUtil.h"
ClassImp(AliAODInputHandler)
fEvent(0),
fMCEvent(new AliMCEvent()),
fFriends(new TList()),
+ fAODpidUtil(0x0),
fMergeEvents(kFALSE),
fFriendsConnected(kFALSE),
fFileToMerge(0),
fEvent(0),
fMCEvent(new AliMCEvent()),
fFriends(new TList()),
+ fAODpidUtil(0x0),
fMergeEvents(kFALSE),
fFriendsConnected(kFALSE),
fFileToMerge(0),
delete fHistStatistics[1];
fHistStatistics[1] = 0;
}
+ delete fAODpidUtil;
}
//______________________________________________________________________________
fFriendsConnected = kTRUE;
}
+//______________________________________________________________________________
+void AliAODInputHandler::CreatePIDResponse(Bool_t isMC/*=kFALSE*/)
+{
+ //
+ // create the pid response object if it does not exist yet
+ //
+ if (fAODpidUtil) return;
+ fAODpidUtil=new AliAODpidUtil(isMC);
+
+}
+
class AliMCEvent;
class TH2F;
class AliMCEvent;
+class AliAODpidUtil;
+class AliPIDResponse;
class AliAODInputHandler : public AliInputEventHandler {
Bool_t GetMergeEvents() const {return fMergeEvents;}
AliAODEvent* GetEventToMerge() {return fAODEventToMerge;}
void SetMergeOffset(Int_t ioff) {fMergeOffset = ioff;}
+
+ //PID response
+ virtual AliPIDResponse* GetPIDResponse() {return (AliPIDResponse*)fAODpidUtil;}
+ virtual void CreatePIDResponse(Bool_t isMC=kFALSE);
+ AliAODpidUtil *GetAODpidUtil() const { return fAODpidUtil; }
+
private:
void ConnectFriends();
AliAODInputHandler(const AliAODInputHandler& handler);
private:
AliAODEvent *fEvent; //! Pointer to the event
AliMCEvent *fMCEvent; //! Pointer to the MCEvent
- TList *fFriends; // List of friend trees
+ TList *fFriends; // List of friend trees
+ AliAODpidUtil *fAODpidUtil; //! Pointer to PID information
+
// Support for merged events
Bool_t fMergeEvents; // Flag for event merging
Bool_t fFriendsConnected;// Friends are connected
p[0]=Px(); p[1]=Py(); p[2]=Pz();
return kTRUE;
}
+
+//______________________________________________________________________________
+Float_t AliAODTrack::GetTPCClusterInfo(Int_t nNeighbours/*=3*/, Int_t type/*=0*/, Int_t row0, Int_t row1) const
+{
+ //
+ // TPC cluster information
+ // type 0: get fraction of found/findable clusters with neighbourhood definition
+ // 1: findable clusters with neighbourhood definition
+ // 2: found clusters
+ //
+ // definition of findable clusters:
+ // a cluster is defined as findable if there is another cluster
+ // within +- nNeighbours pad rows. The idea is to overcome threshold
+ // effects with a very simple algorithm.
+ //
+
+ if (type==2) return fTPCClusterMap.CountBits();
+
+ Int_t found=0;
+ Int_t findable=0;
+ Int_t last=-nNeighbours;
+
+ for (Int_t i=row0; i<row1; ++i){
+ //look to current row
+ if (fTPCClusterMap[i]) {
+ last=i;
+ ++found;
+ ++findable;
+ continue;
+ }
+ //look to nNeighbours before
+ if ((i-last)<=nNeighbours) {
+ ++findable;
+ continue;
+ }
+ //look to nNeighbours after
+ for (Int_t j=i+1; j<i+1+nNeighbours; ++j){
+ if (fTPCClusterMap[j]){
+ ++findable;
+ break;
+ }
+ }
+ }
+ if (type==1) return findable;
+
+ if (type==0){
+ Float_t fraction=0;
+ if (findable>0)
+ fraction=(Float_t)found/(Float_t)findable;
+ else
+ fraction=0;
+ return fraction;
+ }
+ return 0; // undefined type - default value
+}
UInt_t GetFilterMap(){return fFilterMap;}
const TBits& GetTPCClusterMap() const {return fTPCClusterMap;}
+ Float_t GetTPCClusterInfo(Int_t nNeighbours=3, Int_t type=0, Int_t row0=0, Int_t row1=159) const;
+
const TBits& GetTPCSharedMap() const {return fTPCSharedMap;}
void SetTPCClusterMap(const TBits amap) {fTPCClusterMap = amap;}
void SetTPCSharedMap(const TBits amap) {fTPCSharedMap = amap;}
UShort_t GetTPCNclsF() const { return fTPCnclsF;}
+ //pid signal interface
+ Double_t GetITSsignal() const { return fDetPid?fDetPid->GetITSsignal():0.; }
+ Double_t GetTPCsignal() const { return fDetPid?fDetPid->GetTPCsignal():0.; }
+ UShort_t GetTPCsignalN() const { return fDetPid?fDetPid->GetTPCsignalN():0; }
+ Double_t GetTPCmomentum() const { return fDetPid?fDetPid->GetTPCmomentum():0.; }
+ Double_t GetTOFsignal() const { return fDetPid?fDetPid->GetTOFsignal():0.; }
+
+
AliAODPid *GetDetPid() const { return fDetPid; }
AliAODVertex *GetProdVertex() const { return (AliAODVertex*)fProdVertex.GetObject(); }
fTRDResponse.GetResponse(pidObj->GetTRDnSlices(),dedx,mom,p,norm);
return;
}
-
-//_________________________________________________________________________
-Float_t AliAODpidUtil::NumberOfSigmasTPC(const AliAODTrack *track, AliPID::EParticleType type) const {
-
- Double_t mom = 0.0;
- AliAODPid *pidObj = 0x0;
- if (track) {
- mom = track->P();
- pidObj = track->GetDetPid();
- }
- UShort_t nTPCClus=0;
- Double_t tpcSignal=0.0;
- if (pidObj) {
- nTPCClus=pidObj->GetTPCsignalN();
- mom = pidObj->GetTPCmomentum();
- tpcSignal = pidObj->GetTPCsignal();
- }
- return fTPCResponse.GetNumberOfSigmas(mom,tpcSignal,nTPCClus,type);
-}
-
-//_________________________________________________________________________
-Float_t AliAODpidUtil::NumberOfSigmasTOF(const AliAODTrack *track, AliPID::EParticleType type) const {
- Double_t times[AliPID::kSPECIES]={0.};
- Double_t sigmaTOFPid[AliPID::kSPECIES]={0.};
- AliAODPid *pidObj = 0x0;
- Double_t mom = 0.0;
- if (track) {
- pidObj = track->GetDetPid();
- mom = track->P();
- }
- Double_t tofSignal = 0.0;
- if (pidObj) {
- pidObj->GetIntegratedTimes(times);
- pidObj->GetTOFpidResolution(sigmaTOFPid);
- tofSignal = pidObj->GetTOFsignal();
- }
- if (sigmaTOFPid[type]>0) return (tofSignal - times[type])/sigmaTOFPid[type];
- else return (tofSignal - times[type])/fTOFResponse.GetExpectedSigma(mom,times[type],AliPID::ParticleMass(type));
-}
-
-//_________________________________________________________________________
-Float_t AliAODpidUtil::NumberOfSigmasITS(const AliAODTrack *track, AliPID::EParticleType type) const {
- AliAODPid *pidObj = 0x0;
- UChar_t clumap=0;
- Float_t mom=0.0;
- UShort_t nTPCClus=0;
- if (track) {
- pidObj = track->GetDetPid();
- clumap=track->GetITSClusterMap();
- mom=track->P();
- nTPCClus=track->GetTPCNcls();
- }
- Int_t nPointsForPid=0;
- for(Int_t i=2; i<6; i++){
- if(clumap&(1<<i)) ++nPointsForPid;
- }
- Float_t dEdx=0.0;
- if (pidObj) dEdx=pidObj->GetITSsignal();
- Bool_t isSA=kTRUE;
- if(nTPCClus>0) isSA=kFALSE;
- return fITSResponse.GetNumberOfSigmas(mom,dEdx,type,nPointsForPid,isSA);
-}
// Combined PID class
// for the AOD class
// Origin: Rosa Romita, GSI, r.romita@gsi.de
+// Modified: Jens Wiechula, Uni Tuebingen, jens.wiechula@cern.ch
//-------------------------------------------------------
#include <Rtypes.h>
#include <TMatrixD.h>
#include "AliAODTrack.h" // Needed for inline functions
#include "AliAODPid.h" // Needed for inline functions
-#include "AliTPCPIDResponse.h"
-#include "AliITSPIDResponse.h"
-#include "AliTOFPIDResponse.h"
-#include "AliTRDPIDResponse.h"
//#include "HMPID/AliHMPID.h"
+#include "AliPIDResponse.h"
+
class AliAODEvent;
+class AliVParticle;
-class AliAODpidUtil {
+class AliAODpidUtil : public AliPIDResponse {
public:
-
- AliAODpidUtil(Bool_t isMC = kFALSE): fRange(5.), fTPCResponse(), fITSResponse(isMC), fTOFResponse(), fTRDResponse() {;}
+ //TODO: isMC???
+ AliAODpidUtil(Bool_t isMC = kFALSE): AliPIDResponse(isMC), fRange(5.) {;}
virtual ~AliAODpidUtil() {;}
-
Int_t MakePID(AliAODTrack *track,Double_t *p) const;
void MakeTPCPID(const AliAODTrack *track,Double_t *p) const;
void MakeITSPID(const AliAODTrack *track,Double_t *p) const;
// void MakeHMPIDPID(AliESDtrack *track);
void MakeTRDPID(const AliAODTrack *track,Double_t *p) const;
- Float_t NumberOfSigmasTPC(const AliAODTrack *track, AliPID::EParticleType type) const;
- Float_t NumberOfSigmasTOF(const AliAODTrack *track, AliPID::EParticleType type) const;
- Float_t NumberOfSigmasITS(const AliAODTrack *track, AliPID::EParticleType type) const;
-
- AliITSPIDResponse &GetITSResponse() {return fITSResponse;}
- AliTPCPIDResponse &GetTPCResponse() {return fTPCResponse;}
- AliTOFPIDResponse &GetTOFResponse() {return fTOFResponse;}
-
+ virtual Float_t NumberOfSigmasTOF(const AliVParticle *vtrack, AliPID::EParticleType type) const;
+
private:
Float_t fRange; // nSigma max in likelihood
- AliTPCPIDResponse fTPCResponse; // TPC Response
- AliITSPIDResponse fITSResponse; // ITS Response
- AliTOFPIDResponse fTOFResponse; // TOF Response
- AliTRDPIDResponse fTRDResponse; // TRD Response
- ClassDef(AliAODpidUtil,1) // PID calculation class
+ ClassDef(AliAODpidUtil,2) // PID calculation class
};
+inline Float_t AliAODpidUtil::NumberOfSigmasTOF(const AliVParticle *vtrack, AliPID::EParticleType type) const {
+ AliAODTrack *track=(AliAODTrack*)vtrack;
+ Double_t times[AliPID::kSPECIES];
+ Double_t sigmaTOFPid[AliPID::kSPECIES];
+ AliAODPid *pidObj = track->GetDetPid();
+ if (!pidObj) return -999.;
+ pidObj->GetIntegratedTimes(times);
+ pidObj->GetTOFpidResolution(sigmaTOFPid);
+ if (sigmaTOFPid[type]>0) return (pidObj->GetTOFsignal() - times[type])/sigmaTOFPid[type];
+ else return (pidObj->GetTOFsignal() - times[type])/fTOFResponse.GetExpectedSigma(track->P(),times[type],AliPID::ParticleMass(type));
+}
+
#endif
#include "AliRunTag.h"
#include "AliEventTag.h"
#include "AliLog.h"
+#include "AliESDpid.h"
ClassImp(AliESDInputHandler)
{
// destructor
if (fRunTag) delete fRunTag;
+ delete fESDpid;
}
//______________________________________________________________________________
if (opt=="BIN0") return fEventCuts->GetStatistics("BIN0");
else return fEventCuts->GetStatistics("ALL");
}
+
+//______________________________________________________________________________
+void AliESDInputHandler::CreatePIDResponse(Bool_t isMC/*=kFALSE*/)
+{
+ //
+ // create the pid response object if it does not exist yet
+ //
+ if (fESDpid) return;
+ fESDpid=new AliESDpid(isMC);
+
+}
+
class AliESDfriend;
class AliESDpid;
class AliESDEvent;
+class AliPIDResponse;
class AliESDInputHandler : public AliInputEventHandler {
void SetReadHLT() {fUseHLT = kTRUE;}
// Friends&Co
AliESDfriend *GetESDfriend() const {return fFriend;}
- AliESDpid *GetESDpid() const {return fESDpid;}
- void SetESDpid(AliESDpid* pid) {fESDpid = pid;}
void SetReadFriends(Bool_t flag) {fReadFriends = flag;}
void SetFriendFileName(const char *fname) {fFriendFileName = fname;}
// Tag analysis
const AliEventTag *GetEventTag() const {return fEventTag;}
// Get the statistics object (currently TH2). Option can be BIN0.
virtual TObject *GetStatistics(Option_t *option="") const;
+
+ //PID response
+ virtual AliPIDResponse* GetPIDResponse() {return (AliPIDResponse*)fESDpid;}
+ virtual void CreatePIDResponse(Bool_t isMC=kFALSE);
+ AliESDpid *GetESDpid() const {return fESDpid;}
+ void SetESDpid(AliESDpid* pid) {fESDpid = pid;}
+
private:
AliESDInputHandler(const AliESDInputHandler& handler);
AliESDInputHandler& operator=(const AliESDInputHandler& handler);
class AliTRDPIDResponse : public TObject {
public:
enum ETRDPIDResponseStatus {
- kIsOwner = BIT(14),
+ kIsOwner = BIT(14)
};
enum ETRDPIDResponseDef {
kNlayer = 6