#include "AliLog.h"
#include "AliESDtrack.h"
#include "AliTrackReference.h"
+#include "AliAnalysisManager.h"
#include "AliTRDReconstructor.h"
#include "AliTRDtrackV1.h"
#include "AliTRDseedV1.h"
#include "AliTRDpidRefMaker.h"
+#include "AliTRDinfoGen.h"
+#include "info/AliTRDeventInfo.h"
#include "info/AliTRDv0Info.h"
#include "info/AliTRDpidInfo.h"
//________________________________________________________________________
AliTRDpidRefMaker::AliTRDpidRefMaker()
:AliTRDrecoTask()
- ,fReconstructor(NULL)
,fV0s(NULL)
,fData(NULL)
,fInfo(NULL)
,fPIDdataArray(NULL)
- ,fRefPID(kMC)
- ,fRefP(kMC)
+ ,fRefPID(kV0)
+ ,fRefP(kRec)
,fFreq(1.)
,fP(-1.)
,fPthreshold(0.)
//________________________________________________________________________
AliTRDpidRefMaker::AliTRDpidRefMaker(const char *name, const char *title)
:AliTRDrecoTask(name, title)
- ,fReconstructor(NULL)
,fV0s(NULL)
,fData(NULL)
,fInfo(NULL)
,fPIDdataArray(NULL)
- ,fRefPID(kMC)
- ,fRefP(kMC)
+ ,fRefPID(kV0)
+ ,fRefP(kRec)
,fFreq(1.)
,fP(-1.)
,fPthreshold(0.5)
// Default constructor
//
- fReconstructor = new AliTRDReconstructor();
- fReconstructor->SetRecoParam(AliTRDrecoParam::GetLowFluxParam());
- memset(fdEdx, 0, 10*sizeof(Float_t));
+ memset(fdEdx, 0, AliTRDpidUtil::kNNslices*sizeof(Float_t));
memset(fPID, 0, AliPID::kSPECIES*sizeof(Float_t));
- DefineInput(2, TObjArray::Class()); // v0 list
- DefineInput(3, TObjArray::Class()); // pid info list
+ DefineInput(3, TObjArray::Class()); // v0 list
+ DefineInput(4, TObjArray::Class()); // pid info list
DefineOutput(2, TTree::Class());
}
AliTRDpidRefMaker::~AliTRDpidRefMaker()
{
if(fPIDdataArray) delete fPIDdataArray;
- if(fReconstructor) delete fReconstructor;
}
//________________________________________________________________________
h2->GetYaxis()->SetTitle("P bins");
h2->GetYaxis()->SetNdivisions(511);
fContainer->AddAt(h2, 0);
+ PostData(1, fContainer);
+ OpenFile(2);
fData = new TTree("RefPID", "Reference data for PID");
fData->Branch("data", &fPIDdataArray);
+ PostData(2, fData);
}
//________________________________________________________________________
{
// Main loop
// Called for each event
+ Int_t ev((Int_t)AliAnalysisManager::GetAnalysisManager()->GetCurrentEntry());
+ if(!(fTracks = dynamic_cast<TObjArray*>(GetInputData(1)))){
+ AliDebug(3, Form("Missing tracks container in ev %d", ev));
+ return;
+ }
+ if(!(fEvent = dynamic_cast<AliTRDeventInfo*>(GetInputData(2)))){
+ AliDebug(3, Form("Missing Event Info container in ev %d", ev));
+ return;
+ }
+ if(!(fV0s = dynamic_cast<TObjArray*>(GetInputData(3)))){
+ AliDebug(3, Form("Missing v0 container in ev %d", ev));
+ return;
+ }
+ if(!(fInfo = dynamic_cast<TObjArray*>(GetInputData(4)))){
+ AliDebug(3, Form("Missing pid info container in ev %d", ev));
+ return;
+ }
- if(!(fTracks = dynamic_cast<TObjArray*>(GetInputData(1)))) return;
- if(!(fV0s = dynamic_cast<TObjArray*>(GetInputData(2)))) return;
- if(!(fInfo = dynamic_cast<TObjArray*>(GetInputData(3)))) return;
-
- AliDebug(1, Form("Entries: Tracks[%d] V0[%d] PID[%d]", fTracks->GetEntriesFast(), fV0s->GetEntriesFast(), fInfo->GetEntriesFast()));
+ AliDebug(1, Form("Entries: Ev[%d] Tracks[%d] V0[%d] PID[%d]", ev, fTracks->GetEntriesFast(), fV0s->GetEntriesFast(), fInfo->GetEntriesFast()));
AliTRDtrackInfo *track = NULL;
- AliTRDtrackV1 *trackTRD = NULL;
+ //AliTRDtrackV1 *trackTRD = NULL;
AliTrackReference *ref = NULL;
const AliTRDtrackInfo::AliESDinfo *infoESD = NULL;
for(Int_t itrk=0; itrk<fTracks->GetEntriesFast(); itrk++){
track = (AliTRDtrackInfo*)fTracks->UncheckedAt(itrk);
if(!track->HasESDtrack()) continue;
- trackTRD = track->GetTrack();
+ //trackTRD = track->GetTrack();
infoESD = track->GetESDinfo();
Double32_t *infoPID = infoESD->GetSliceIter();
Int_t n = infoESD->GetNSlices() - AliTRDgeometry::kNlayer;
if(!(status&AliESDtrack::kTRDpid)) continue;
// fill the pid information
- SetRefPID(fRefPID, track, fPID);
+ SetRefPID(fRefPID, track, infoESD, fPID);
// get particle type
- Int_t idx(TMath::LocMax(AliPID::kSPECIES, fPID));
- if(idx == 0 && fPID[0]<1.e-5) continue;
-
+ Int_t idx(TMath::Max(Long64_t(0), TMath::LocMax(AliPID::kSPECIES, fPID)));
+ if(fPID[idx]<1.e-5) continue;
+
// prepare PID data array
if(!fPIDdataArray){
fPIDdataArray = new AliTRDpidInfo();
for(Int_t ily = 0; ily < AliTRDgeometry::kNlayer; ily++){
// fill P & dE/dx information
- if(HasFriends()){ // from TRD track
- if(!trackTRD) continue;
- AliTRDseedV1 *trackletTRD(NULL);
- trackTRD -> SetReconstructor(fReconstructor);
- if(!(trackletTRD = trackTRD -> GetTracklet(ily))) continue;
- if(!CheckQuality(trackletTRD)) continue;
- if(!CookdEdx(trackletTRD)) continue;
-
- // fill momentum information
- fP = 0.;
- switch(fRefP){
- case kMC:
- if(!(ref = track->GetTrackRef(trackletTRD))) continue;
- fP = ref->P();
- break;
- case kRec:
- fP = trackletTRD->GetMomentum();
- break;
- default: continue;
- }
- } else { // from ESD track
- // fill momentum information
- switch(fRefP){
- case kMC:
- if(!(ref = track->GetTrackRef(ily))) continue;
- fP = ref->P();
- break;
- case kRec:
- fP = p[ily];
- break;
- default: continue;
- }
- Double32_t *it = &infoPID[ily*AliTRDCalPID::kNSlicesNN];
- for(Int_t is=AliTRDCalPID::kNSlicesNN; is--; it++) fdEdx[is] = (*it);
+ switch(fRefP){
+ case kMC:
+ if(!(ref = track->GetTrackRef(ily))) continue;
+ fP = ref->P();
+ break;
+ case kRec:
+ fP = p[ily];
+ break;
+ default:
+ continue;
}
-
+ Double32_t *it = &infoPID[ily*AliTRDCalPID::kNSlicesNN];
+ for(Int_t is=AliTRDCalPID::kNSlicesNN; is--; it++) fdEdx[is] = (*it);
+
// momentum threshold
if(fP < fPthreshold) continue;
Fill();
}
-
- PostData(1, fContainer);
- PostData(2, fData);
}
}
//________________________________________________________________________
-void AliTRDpidRefMaker::SetRefPID(ETRDpidRefMakerSource select, AliTRDtrackInfo *track, Float_t *pid)
+void AliTRDpidRefMaker::SetRefPID(ETRDpidRefMakerSource select, AliTRDtrackInfo *track, const AliTRDtrackInfo::AliESDinfo *infoESD, Float_t *pid)
{
// Fill the reference PID values "pid" from "source" object
// according to the option "select". Possible options are
AliError("No trackInfo found");
return;
}
- memset(fPID, 0, AliPID::kSPECIES*sizeof(Float_t));
+ memset(pid, 0, AliPID::kSPECIES*sizeof(Float_t));
switch(select){
case kV0:
{
- //Get V0 PID decisions from the AliTRDv0Info for all particle species (implemented so far : electrons from conversions, pions from K0s and protons from Lambdas) :
- AliTRDv0Info *v0(NULL);
- for(Int_t iv(0); iv<fV0s->GetEntriesFast(); iv++){
- if(!(v0 = (AliTRDv0Info*)fV0s->At(iv))) continue;
- if(!v0->HasTrack(track)) continue;
- for(Int_t is=AliPID::kSPECIES; is--;) fPID[is] = v0->GetPID(is, track);
- break;
- }
+ //Get V0 PID decisions for all particle species (implemented so far : electrons from conversions, pions from K0s and protons from Lambdas) :
+ if(!infoESD->HasV0()) return;
+ const Int_t *v0pid=infoESD->GetV0pid();
+ for(Int_t is=AliPID::kSPECIES; is--;){ pid[is] = (Float_t)v0pid[is];}
}
break;
case kMC:
switch(track->GetPDG()){
case kElectron:
case kPositron:
- fPID[AliPID::kElectron] = 1.;
+ pid[AliPID::kElectron] = 1.;
break;
case kMuonPlus:
case kMuonMinus:
- fPID[AliPID::kMuon] = 1.;
+ pid[AliPID::kMuon] = 1.;
break;
case kPiPlus:
case kPiMinus:
- fPID[AliPID::kPion] = 1.;
+ pid[AliPID::kPion] = 1.;
break;
case kKPlus:
case kKMinus:
- fPID[AliPID::kKaon] = 1.;
+ pid[AliPID::kKaon] = 1.;
break;
case kProton:
case kProtonBar:
- fPID[AliPID::kProton] = 1.;
+ pid[AliPID::kProton] = 1.;
break;
}
break;
case kRec:
{
AliTRDtrackV1 *trackTRD = track->GetTrack();
- trackTRD -> SetReconstructor(fReconstructor);
+ trackTRD -> SetReconstructor(AliTRDinfoGen::Reconstructor());
//fReconstructor -> SetOption("nn");
trackTRD -> CookPID();
for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
AliWarning("PID reference source not implemented");
return;
}
- AliDebug(4, Form("Ref PID [%] : %s[%5.2f] %s[%5.2f] %s[%5.2f] %s[%5.2f] %s[%5.2f]"
- ,AliPID::ParticleShortName(0), 1.e2*fPID[0]
- ,AliPID::ParticleShortName(1), 1.e2*fPID[1]
- ,AliPID::ParticleShortName(2), 1.e2*fPID[2]
- ,AliPID::ParticleShortName(3), 1.e2*fPID[3]
- ,AliPID::ParticleShortName(4), 1.e2*fPID[4]
+ AliDebug(4, Form("Ref PID : %s[%5.2f] %s[%5.2f] %s[%5.2f] %s[%5.2f] %s[%5.2f]"
+ ,AliPID::ParticleShortName(0), 1.e2*pid[0]
+ ,AliPID::ParticleShortName(1), 1.e2*pid[1]
+ ,AliPID::ParticleShortName(2), 1.e2*pid[2]
+ ,AliPID::ParticleShortName(3), 1.e2*pid[3]
+ ,AliPID::ParticleShortName(4), 1.e2*pid[4]
));
}