From 59a8e85312898a5c9af5938cb8507910745a4e71 Mon Sep 17 00:00:00 2001 From: hristov Date: Tue, 4 Oct 2011 12:40:30 +0000 Subject: [PATCH] Changes for #87282 Request for committing to trunk + port to v5-01 (TRD PID with AODs) --- ANALYSIS/AliAnalysisTaskESDfilter.cxx | 8 +++-- PWG3/hfe/AliHFEextraCuts.cxx | 5 +-- PWG3/hfe/AliHFEpidTRD.cxx | 18 ++-------- PWG3/hfe/AliHFEpidTRD.h | 3 +- PWG3/vertexingHF/AliAODPidHF.cxx | 9 ++--- STEER/AOD/AliAODPid.cxx | 21 ++++++++---- STEER/AOD/AliAODPid.h | 47 +++++++++++++++++++++++++-- STEER/AOD/AliAODTrack.cxx | 24 +++++++------- STEER/AOD/AliAODTrack.h | 1 + STEER/STEERBase/AliPIDResponse.cxx | 24 +++++++++++--- 10 files changed, 104 insertions(+), 56 deletions(-) diff --git a/ANALYSIS/AliAnalysisTaskESDfilter.cxx b/ANALYSIS/AliAnalysisTaskESDfilter.cxx index 5018603044e..d8b6e62111a 100644 --- a/ANALYSIS/AliAnalysisTaskESDfilter.cxx +++ b/ANALYSIS/AliAnalysisTaskESDfilter.cxx @@ -1983,7 +1983,7 @@ void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtr //n TRD planes = 6 Int_t nslices = track->GetNumberOfTRDslices()*6; - Double_t *trdslices = new Double_t[nslices]; + TArrayD trdslices(nslices); for(Int_t iSl =0; iSl < track->GetNumberOfTRDslices(); iSl++) { for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl); } @@ -1994,8 +1994,12 @@ void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtr aodpid->SetTRDmomentum(iPl,trdmom); } - aodpid->SetTRDsignal(track->GetNumberOfTRDslices()*6,trdslices); + aodpid->SetTRDsignal(track->GetNumberOfTRDslices()*6,trdslices.GetArray()); + //TRD clusters and tracklets + aodpid->SetTRDncls(track->GetTRDncls()); + aodpid->SetTRDntrackletsPID(track->GetTRDntrackletsPID()); + //TOF PID Double_t times[AliAODPid::kSPECIES]; track->GetIntegratedTimes(times); aodpid->SetIntegratedTimes(times); diff --git a/PWG3/hfe/AliHFEextraCuts.cxx b/PWG3/hfe/AliHFEextraCuts.cxx index 0bf37e89ebb..11d8df3713c 100644 --- a/PWG3/hfe/AliHFEextraCuts.cxx +++ b/PWG3/hfe/AliHFEextraCuts.cxx @@ -515,10 +515,7 @@ Int_t AliHFEextraCuts::GetTRDnTrackletsPID(AliVTrack *track){ // this is normally NOT the way to do this, but due to limitation in the // AOD track it is not possible in a different way if(pidobject){ - Float_t *trdmom = pidobject->GetTRDmomentum(); - for(Int_t ily = 0; ily < 6; ily++){ - if(trdmom[ily] > -1) nTracklets++; - } + nTracklets = pidobject->GetTRDntrackletsPID(); } else nTracklets = 6; // No Cut possible } return nTracklets; diff --git a/PWG3/hfe/AliHFEpidTRD.cxx b/PWG3/hfe/AliHFEpidTRD.cxx index 272031383bc..b8d017c739f 100644 --- a/PWG3/hfe/AliHFEpidTRD.cxx +++ b/PWG3/hfe/AliHFEpidTRD.cxx @@ -348,25 +348,11 @@ Double_t AliHFEpidTRD::GetChargeLayer(const AliVParticle *track, UInt_t layer, A } //___________________________________________________________________ -void AliHFEpidTRD::GetTRDmomenta(const AliVParticle *track, AliHFEpidObject::AnalysisType_t anaType, Double_t *mom) const { +void AliHFEpidTRD::GetTRDmomenta(const AliVTrack*track, Double_t *mom) const { // // Fill Array with momentum information at the TRD tracklet // - if(anaType == AliHFEpidObject::kESDanalysis){ - const AliESDtrack *esdtrack = dynamic_cast(track); - if(esdtrack) - for(Int_t itl = 0; itl < 6; itl++) - mom[itl] = esdtrack->GetTRDmomentum(itl); - } else { - const AliAODTrack *aodtrack = dynamic_cast(track); - AliAODPid *aoddetpid = aodtrack ? aodtrack->GetDetPid() : NULL; - if(aoddetpid){ - Float_t *trdmom = aoddetpid->GetTRDmomentum(); - for(Int_t itl = 0; itl < 6; itl++){ - mom[itl] = trdmom[itl]; - } - } - } + for(Int_t itl = 0; itl < 6; itl++) mom[itl] = track->GetTRDmomentum(itl); } //___________________________________________________________________ diff --git a/PWG3/hfe/AliHFEpidTRD.h b/PWG3/hfe/AliHFEpidTRD.h index 88a0d39cb8e..ef0066fbd24 100644 --- a/PWG3/hfe/AliHFEpidTRD.h +++ b/PWG3/hfe/AliHFEpidTRD.h @@ -30,6 +30,7 @@ class AliESDtrack; class AliHFEcollection; class AliMCParticle; class AliVParticle; +class AliVTrack; class TList; class TH2F; @@ -73,7 +74,7 @@ class AliHFEpidTRD : public AliHFEpidBase{ void CalculateTRDSignals(Bool_t docalc) { SetBit(kTRDsignals, docalc); } Double_t GetElectronLikelihood(const AliVParticle *track, AliHFEpidObject::AnalysisType_t anaType) const; - void GetTRDmomenta(const AliVParticle *track, AliHFEpidObject::AnalysisType_t anaType, Double_t *mom) const; + void GetTRDmomenta(const AliVTrack *track,Double_t *mom) const; Double_t GetP(const AliVParticle *track, AliHFEpidObject::AnalysisType_t anaType) const; Double_t GetTRDthresholds(Double_t electronEff, Double_t p) const; Double_t GetChargeLayer(const AliVParticle *track, UInt_t layer, AliHFEpidObject::AnalysisType_t anatype) const; diff --git a/PWG3/vertexingHF/AliAODPidHF.cxx b/PWG3/vertexingHF/AliAODPidHF.cxx index 53f7c7c2bc4..22a3fb49d21 100644 --- a/PWG3/vertexingHF/AliAODPidHF.cxx +++ b/PWG3/vertexingHF/AliAODPidHF.cxx @@ -506,13 +506,8 @@ Bool_t AliAODPidHF::CheckStatus(AliAODTrack *track,TString detectors) const{ if(detectors.Contains("TRD")){ if ((track->GetStatus()&AliESDtrack::kTRDout )==0) return kFALSE; - AliAODPid *pidObj = track->GetDetPid(); - Float_t *mom=pidObj->GetTRDmomentum(); - Int_t ntracklets=0; - for(Int_t iPl=0;iPl<6;iPl++){ - if(mom[iPl]>0.) ntracklets++; - } - if(ntracklets<4) return kFALSE; + UChar_t ntracklets = track->GetTRDntrackletsPID(); + if(ntracklets<4) return kFALSE; } return kTRUE; diff --git a/STEER/AOD/AliAODPid.cxx b/STEER/AOD/AliAODPid.cxx index cce95986d07..a8cc9dd2b0f 100644 --- a/STEER/AOD/AliAODPid.cxx +++ b/STEER/AOD/AliAODPid.cxx @@ -35,6 +35,7 @@ AliAODPid::AliAODPid(): fTPCsignalN(0), fTPCmomentum(0), fTRDnSlices(0), + fTRDntls(0), fTRDslices(0x0), fTOFesdsignal(0), fHMPIDsignal(0) @@ -44,10 +45,12 @@ AliAODPid::AliAODPid(): for(Int_t i=0; i<5; i++) fHMPIDprobs[i] = 0.; for(Int_t i=0; i<3; i++) fEMCALPosition[i] = 0.; for(Int_t i=0; i<5; i++) fTOFpidResolution[i] = 0.; - for(Int_t i=0; i<6; i++) fTRDmomentum[i] = 0.; + for(Int_t i=0; i<6; i++) { + fTRDmomentum[i] = 0.; + fTRDncls[i] = 0; + } for(Int_t i=0; i<3; i++) fEMCALMomentum[i] = 0.; for(Int_t i=0; i<4; i++) fITSdEdxSamples[i] = 0.; - } //______________________________________________________________________________ @@ -67,20 +70,23 @@ AliAODPid::AliAODPid(const AliAODPid& pid) : fTPCsignalN(pid.fTPCsignalN), fTPCmomentum(pid.fTPCmomentum), fTRDnSlices(pid.fTRDnSlices), + fTRDntls(pid.fTRDntls), fTRDslices(0x0), fTOFesdsignal(pid.fTOFesdsignal), fHMPIDsignal(pid.fHMPIDsignal) { // Copy constructor - fTRDslices = new Double32_t[fTRDnSlices]; - for(Int_t i=0; i< fTRDnSlices; i++) fTRDslices[i]=pid.fTRDslices[i]; + SetTRDsignal(fTRDnSlices, pid.fTRDslices); for(Int_t i=0; i 5) return 0; return fTRDncls[layer];} + inline UChar_t GetTRDncls() const; + UChar_t GetTRDntrackletsPID() const {return fTRDntls;} Double_t GetTOFsignal() const {return fTOFesdsignal;} Double_t GetHMPIDsignal() const {return fHMPIDsignal;} void GetHMPIDprobs(Double_t *p) const; @@ -66,6 +71,8 @@ class AliAODPid : public TObject { UShort_t fTPCsignalN; // number of points used for TPC dE/dx Double_t fTPCmomentum; // momentum at the inner wall of TPC; Int_t fTRDnSlices; // N slices used for PID in the TRD + UChar_t fTRDntls; // number of tracklets used for PID calculation + UChar_t fTRDncls[6]; // number of clusters used for dE/dx calculation Double32_t* fTRDslices; //[fTRDnSlices] Float_t fTRDmomentum[6]; // momentum at the TRD layers Double32_t fTOFesdsignal; // TOF signal - t0 (T0 interaction time) @@ -78,7 +85,41 @@ class AliAODPid : public TObject { Double32_t fEMCALMomentum[3]; // momentum of track // extrapolated to EMCAL surface - ClassDef(AliAODPid, 7); + ClassDef(AliAODPid, 8); }; +//_____________________________________________________________ +void AliAODPid::SetTRDsignal(Int_t nslices, const Double_t * const trdslices) { + // + // Set TRD dE/dx slices and the number of dE/dx slices per track + // + if(fTRDslices && fTRDnSlices != nslices) { + delete [] fTRDslices; fTRDslices = NULL; + }; + if(!fTRDslices) fTRDslices = new Double32_t[nslices]; + fTRDnSlices = nslices; + for(Int_t is = 0; is < fTRDnSlices; is++) fTRDslices[is] = trdslices[is]; +} + +//_____________________________________________________________ +void AliAODPid::SetTRDncls(UChar_t ncls, Int_t layer) { + // + // Set the number of clusters / tracklet + // If no layer is specified the full number of clusters will be put in layer 0 + // + if(layer > 5) return; + if(layer < 0) fTRDncls[0] = ncls; + else fTRDncls[layer] = ncls; +} + +//_____________________________________________________________ +UChar_t AliAODPid::GetTRDncls() const{ + // + // Get number of clusters per track + // Calculated as sum of the number of clusters per tracklet + // + UChar_t ncls = 0; + for(Int_t ily = 0; ily < 6; ily++) ncls += fTRDncls[ily]; + return ncls; +} #endif diff --git a/STEER/AOD/AliAODTrack.cxx b/STEER/AOD/AliAODTrack.cxx index 0df437540c1..eaff40c7948 100644 --- a/STEER/AOD/AliAODTrack.cxx +++ b/STEER/AOD/AliAODTrack.cxx @@ -658,19 +658,17 @@ UChar_t AliAODTrack::GetTRDntrackletsPID() const{ // return number of tracklets calculated from the slices // if(!fDetPid) return -1; + return fDetPid->GetTRDntrackletsPID(); +} - Int_t ntracklets = 0, // Number of tracklets / track - nSlicesTracklet = fDetPid->GetTRDnSlices()/kTRDnPlanes, // Number of slices per tracklet - nSlicesNonZero = 0; // Number of slices containing a dE/dx measurement - for(Int_t ily = 0; ily < kTRDnPlanes; ily++){ - // a tracklet is found if it has at least one slice containing a dE/dx measurement - nSlicesNonZero = 0; - for(Int_t islice = 0; islice < nSlicesTracklet; islice++){ - if(fDetPid->GetTRDsignal()[nSlicesTracklet * ily + islice] > 0.01) nSlicesNonZero++; - } - if(nSlicesNonZero) ntracklets++; - } - return ntracklets; +//______________________________________________________________________________ +UChar_t AliAODTrack::GetTRDncls(Int_t layer) const { + // + // return number of TRD clusters + // + if(!fDetPid || layer > 5) return -1; + if(layer < 0) return fDetPid->GetTRDncls(); + else return fDetPid->GetTRDncls(layer); } //______________________________________________________________________________ @@ -680,7 +678,7 @@ Double_t AliAODTrack::GetTRDmomentum(Int_t plane, Double_t */*sp*/) const // in TRD layer "plane". if (!fDetPid) return -1; - Float_t *trdMomentum=fDetPid->GetTRDmomentum(); + const Float_t *trdMomentum=fDetPid->GetTRDmomentum(); if (!trdMomentum) { return -1.; diff --git a/STEER/AOD/AliAODTrack.h b/STEER/AOD/AliAODTrack.h index b3c84cf08bf..8970297952a 100644 --- a/STEER/AOD/AliAODTrack.h +++ b/STEER/AOD/AliAODTrack.h @@ -262,6 +262,7 @@ class AliAODTrack : public AliVTrack { void GetIntegratedTimes(Double_t *times) const {if (fDetPid) fDetPid->GetIntegratedTimes(times); } Double_t GetTRDslice(Int_t plane, Int_t slice) const; Double_t GetTRDmomentum(Int_t plane, Double_t */*sp*/=0x0) const; + UChar_t GetTRDncls(Int_t layer = -1) const; UChar_t GetTRDntrackletsPID() const; void GetHMPIDpid(Double_t *p) const { if (fDetPid) fDetPid->GetHMPIDprobs(p); } diff --git a/STEER/STEERBase/AliPIDResponse.cxx b/STEER/STEERBase/AliPIDResponse.cxx index 2274207e5f6..1d2e7e4bc8d 100644 --- a/STEER/STEERBase/AliPIDResponse.cxx +++ b/STEER/STEERBase/AliPIDResponse.cxx @@ -739,12 +739,28 @@ void AliPIDResponse::SetTRDPidResponseMaster() if(fTRDPIDParams) return; AliOADBContainer contParams("contParams"); - contParams.InitFromFile(Form("%s/COMMON/PID/data/TRDPIDParams.root", fOADBPath.Data()), "AliTRDPIDParams"); - fTRDPIDParams = (TObjArray *)contParams.GetObject(fRun); + Int_t statusPars = contParams.InitFromFile(Form("%s/COMMON/PID/data/TRDPIDParams.root", fOADBPath.Data()), "AliTRDPIDParams"); + if(statusPars){ + AliError("Failed initializing PID Params from OADB"); + } else { + AliInfo(Form("Loading TRD Params from %s/COMMON/PID/data/TRDPIDParams.root", fOADBPath.Data())); + fTRDPIDParams = dynamic_cast(contParams.GetObject(fRun)); + if(!fTRDPIDParams){ + AliError(Form("TRD Params not found in run %d", fRun)); + } + } AliOADBContainer contRefs("contRefs"); - contRefs.InitFromFile(Form("%s/COMMON/PID/data/TRDPIDReferenceLQ1D.root", fOADBPath.Data()), "AliTRDPIDReference"); - fTRDPIDReference = (AliTRDPIDReference *)contRefs.GetObject(fRun); + Int_t statusRefs = contRefs.InitFromFile(Form("%s/COMMON/PID/data/TRDPIDReferenceLQ1D.root", fOADBPath.Data()), "AliTRDPIDReference"); + if(statusRefs){ + AliInfo("Failed Loading References for TRD"); + } else { + AliInfo(Form("Loading TRD References from %s/COMMON/PID/data/TRDPIDReferenceLQ1D.root", fOADBPath.Data())); + fTRDPIDReference = dynamic_cast(contRefs.GetObject(fRun)); + if(!fTRDPIDReference){ + AliError(Form("TRD References not found in OADB Container for run %d", fRun)); + } + } } //______________________________________________________________________________ -- 2.39.3