#include "TPDGCode.h"
#include "TFile.h"
#include "TTree.h"
#include "TEventList.h"
#include "TObjArray.h"
#include "TH2.h"
#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"
ClassImp(AliTRDpidRefMaker)
AliTRDpidRefMaker::AliTRDpidRefMaker()
:AliTRDrecoTask()
,fV0s(NULL)
,fData(NULL)
,fInfo(NULL)
,fPIDdataArray(NULL)
,fRefPID(kV0)
,fRefP(kRec)
,fFreq(1.)
,fP(-1.)
,fPthreshold(0.)
{
SetNameTitle("PIDrefMaker", "PID Reference Maker");
}
AliTRDpidRefMaker::AliTRDpidRefMaker(const char *name, const char *title)
:AliTRDrecoTask(name, title)
,fV0s(NULL)
,fData(NULL)
,fInfo(NULL)
,fPIDdataArray(NULL)
,fRefPID(kV0)
,fRefP(kRec)
,fFreq(1.)
,fP(-1.)
,fPthreshold(0.5)
{
memset(fdEdx, 0, AliTRDpidUtil::kNNslices*sizeof(Float_t));
memset(fPID, 0, AliPID::kSPECIES*sizeof(Float_t));
DefineInput(3, TObjArray::Class());
DefineInput(4, TObjArray::Class());
DefineOutput(2, TTree::Class());
}
AliTRDpidRefMaker::~AliTRDpidRefMaker()
{
if(fPIDdataArray) delete fPIDdataArray;
}
Bool_t AliTRDpidRefMaker::CheckQuality(AliTRDseedV1* )
{
return kTRUE;
}
Float_t* AliTRDpidRefMaker::CookdEdx(AliTRDseedV1 *trklt)
{
trklt->CookdEdx(AliTRDpidUtil::kNNslices);
memcpy(fdEdx, trklt->GetdEdx(), AliTRDpidUtil::kNNslices*sizeof(Float_t));
return fdEdx;
}
void AliTRDpidRefMaker::UserCreateOutputObjects()
{
fContainer = new TObjArray();
fContainer->SetName(Form("Moni%s", GetName()));
TH2 *h2 = new TH2I("hPDG","Particle abundance", AliPID::kSPECIES, -0.5, 4.5, AliTRDCalPID::kNMom, -0.5, AliTRDCalPID::kNMom-0.5);
TAxis *ax = h2->GetXaxis();
ax->SetNdivisions(505);
ax->SetTitle("Particle species");
for(Int_t is=AliPID::kSPECIES; is--;) ax->SetBinLabel(is+1, AliPID::ParticleShortName(is));
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);
}
void AliTRDpidRefMaker::UserExec(Option_t *)
{
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;
}
AliDebug(1, Form("Entries: Ev[%d] Tracks[%d] V0[%d] PID[%d]", ev, fTracks->GetEntriesFast(), fV0s->GetEntriesFast(), fInfo->GetEntriesFast()));
AliTRDtrackInfo *track = 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;
infoESD = track->GetESDinfo();
Double32_t *infoPID = infoESD->GetSliceIter();
Int_t n = infoESD->GetNSlices() - AliTRDgeometry::kNlayer;
if(n==0){
AliWarning(Form("dEdx info missing in ESD track %d", itrk));
continue;
}
Double32_t *p = &infoPID[n];
AliDebug(4, Form("n[%d] p[GeV/c]{%6.2f %6.2f %6.2f %6.2f %6.2f %6.2f}", n, p[0], p[1], p[2], p[3], p[4], p[5]));
ULong_t status = track->GetStatus();
if(!(status&AliESDtrack::kTRDpid)) continue;
SetRefPID(fRefPID, track, infoESD, fPID);
Int_t idx(TMath::Max(Long64_t(0), TMath::LocMax(AliPID::kSPECIES, fPID)));
if(fPID[idx]<1.e-5) continue;
if(!fPIDdataArray){
fPIDdataArray = new AliTRDpidInfo();
} else fPIDdataArray->Reset();
fPIDdataArray->SetPID(idx);
for(Int_t ily = 0; ily < AliTRDgeometry::kNlayer; ily++){
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);
if(fP < fPthreshold) continue;
fPIDdataArray->PushBack(ily, AliTRDpidUtil::GetMomentumBin(fP), fdEdx);
}
Fill();
}
}
void AliTRDpidRefMaker::Fill()
{
if(!fPIDdataArray->GetNtracklets()) return;
fData->Fill();
for(Int_t itrklt=fPIDdataArray->GetNtracklets(); itrklt--;){
Int_t pBin = fPIDdataArray->GetData(itrklt)->Momentum();
((TH2*)fContainer->At(0))->Fill(fPIDdataArray->GetPID(), pBin);
}
}
void AliTRDpidRefMaker::LinkPIDdata()
{
fData->SetBranchAddress("data", &fPIDdataArray);
}
void AliTRDpidRefMaker::SetRefPID(ETRDpidRefMakerSource select, AliTRDtrackInfo *track, const AliTRDtrackInfo::AliESDinfo *infoESD, Float_t *pid)
{
if(!track){
AliError("No trackInfo found");
return;
}
memset(pid, 0, AliPID::kSPECIES*sizeof(Float_t));
switch(select){
case kV0:
{
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:
if(!HasMCdata()){
AliError("Could not retrive reference PID from MC");
return;
}
switch(track->GetPDG()){
case kElectron:
case kPositron:
pid[AliPID::kElectron] = 1.;
break;
case kMuonPlus:
case kMuonMinus:
pid[AliPID::kMuon] = 1.;
break;
case kPiPlus:
case kPiMinus:
pid[AliPID::kPion] = 1.;
break;
case kKPlus:
case kKMinus:
pid[AliPID::kKaon] = 1.;
break;
case kProton:
case kProtonBar:
pid[AliPID::kProton] = 1.;
break;
}
break;
case kRec:
{
AliTRDtrackV1 *trackTRD = track->GetTrack();
trackTRD -> SetReconstructor(AliTRDinfoGen::Reconstructor());
trackTRD -> CookPID();
for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
pid[iPart] = trackTRD -> GetPID(iPart);
AliDebug(4, Form("PDG is (in V0info) %d %f", iPart, pid[iPart]));
}
}
break;
default:
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*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]
));
}
void AliTRDpidRefMaker::SetAbundance(Float_t train)
{
if(train<0. || train >1.){
AliWarning("The input data should be in the interval [0, 1]");
return;
}
fFreq = train;
}
AliTRDpidRefMaker.cxx:100 AliTRDpidRefMaker.cxx:101 AliTRDpidRefMaker.cxx:102 AliTRDpidRefMaker.cxx:103 AliTRDpidRefMaker.cxx:104 AliTRDpidRefMaker.cxx:105 AliTRDpidRefMaker.cxx:106 AliTRDpidRefMaker.cxx:107 AliTRDpidRefMaker.cxx:108 AliTRDpidRefMaker.cxx:109 AliTRDpidRefMaker.cxx:110 AliTRDpidRefMaker.cxx:111 AliTRDpidRefMaker.cxx:112 AliTRDpidRefMaker.cxx:113 AliTRDpidRefMaker.cxx:114 AliTRDpidRefMaker.cxx:115 AliTRDpidRefMaker.cxx:116 AliTRDpidRefMaker.cxx:117 AliTRDpidRefMaker.cxx:118 AliTRDpidRefMaker.cxx:119 AliTRDpidRefMaker.cxx:120 AliTRDpidRefMaker.cxx:121 AliTRDpidRefMaker.cxx:122 AliTRDpidRefMaker.cxx:123 AliTRDpidRefMaker.cxx:124 AliTRDpidRefMaker.cxx:125 AliTRDpidRefMaker.cxx:126 AliTRDpidRefMaker.cxx:127 AliTRDpidRefMaker.cxx:128 AliTRDpidRefMaker.cxx:129 AliTRDpidRefMaker.cxx:130 AliTRDpidRefMaker.cxx:131 AliTRDpidRefMaker.cxx:132 AliTRDpidRefMaker.cxx:133 AliTRDpidRefMaker.cxx:134 AliTRDpidRefMaker.cxx:135 AliTRDpidRefMaker.cxx:136 AliTRDpidRefMaker.cxx:137 AliTRDpidRefMaker.cxx:138 AliTRDpidRefMaker.cxx:139 AliTRDpidRefMaker.cxx:140 AliTRDpidRefMaker.cxx:141 AliTRDpidRefMaker.cxx:142 AliTRDpidRefMaker.cxx:143 AliTRDpidRefMaker.cxx:144 AliTRDpidRefMaker.cxx:145 AliTRDpidRefMaker.cxx:146 AliTRDpidRefMaker.cxx:147 AliTRDpidRefMaker.cxx:148 AliTRDpidRefMaker.cxx:149 AliTRDpidRefMaker.cxx:150 AliTRDpidRefMaker.cxx:151 AliTRDpidRefMaker.cxx:152 AliTRDpidRefMaker.cxx:153 AliTRDpidRefMaker.cxx:154 AliTRDpidRefMaker.cxx:155 AliTRDpidRefMaker.cxx:156 AliTRDpidRefMaker.cxx:157 AliTRDpidRefMaker.cxx:158 AliTRDpidRefMaker.cxx:159 AliTRDpidRefMaker.cxx:160 AliTRDpidRefMaker.cxx:161 AliTRDpidRefMaker.cxx:162 AliTRDpidRefMaker.cxx:163 AliTRDpidRefMaker.cxx:164 AliTRDpidRefMaker.cxx:165 AliTRDpidRefMaker.cxx:166 AliTRDpidRefMaker.cxx:167 AliTRDpidRefMaker.cxx:168 AliTRDpidRefMaker.cxx:169 AliTRDpidRefMaker.cxx:170 AliTRDpidRefMaker.cxx:171 AliTRDpidRefMaker.cxx:172 AliTRDpidRefMaker.cxx:173 AliTRDpidRefMaker.cxx:174 AliTRDpidRefMaker.cxx:175 AliTRDpidRefMaker.cxx:176 AliTRDpidRefMaker.cxx:177 AliTRDpidRefMaker.cxx:178 AliTRDpidRefMaker.cxx:179 AliTRDpidRefMaker.cxx:180 AliTRDpidRefMaker.cxx:181 AliTRDpidRefMaker.cxx:182 AliTRDpidRefMaker.cxx:183 AliTRDpidRefMaker.cxx:184 AliTRDpidRefMaker.cxx:185 AliTRDpidRefMaker.cxx:186 AliTRDpidRefMaker.cxx:187 AliTRDpidRefMaker.cxx:188 AliTRDpidRefMaker.cxx:189 AliTRDpidRefMaker.cxx:190 AliTRDpidRefMaker.cxx:191 AliTRDpidRefMaker.cxx:192 AliTRDpidRefMaker.cxx:193 AliTRDpidRefMaker.cxx:194 AliTRDpidRefMaker.cxx:195 AliTRDpidRefMaker.cxx:196 AliTRDpidRefMaker.cxx:197 AliTRDpidRefMaker.cxx:198 AliTRDpidRefMaker.cxx:199 AliTRDpidRefMaker.cxx:200 AliTRDpidRefMaker.cxx:201 AliTRDpidRefMaker.cxx:202 AliTRDpidRefMaker.cxx:203 AliTRDpidRefMaker.cxx:204 AliTRDpidRefMaker.cxx:205 AliTRDpidRefMaker.cxx:206 AliTRDpidRefMaker.cxx:207 AliTRDpidRefMaker.cxx:208 AliTRDpidRefMaker.cxx:209 AliTRDpidRefMaker.cxx:210 AliTRDpidRefMaker.cxx:211 AliTRDpidRefMaker.cxx:212 AliTRDpidRefMaker.cxx:213 AliTRDpidRefMaker.cxx:214 AliTRDpidRefMaker.cxx:215 AliTRDpidRefMaker.cxx:216 AliTRDpidRefMaker.cxx:217 AliTRDpidRefMaker.cxx:218 AliTRDpidRefMaker.cxx:219 AliTRDpidRefMaker.cxx:220 AliTRDpidRefMaker.cxx:221 AliTRDpidRefMaker.cxx:222 AliTRDpidRefMaker.cxx:223 AliTRDpidRefMaker.cxx:224 AliTRDpidRefMaker.cxx:225 AliTRDpidRefMaker.cxx:226 AliTRDpidRefMaker.cxx:227 AliTRDpidRefMaker.cxx:228 AliTRDpidRefMaker.cxx:229 AliTRDpidRefMaker.cxx:230 AliTRDpidRefMaker.cxx:231 AliTRDpidRefMaker.cxx:232 AliTRDpidRefMaker.cxx:233 AliTRDpidRefMaker.cxx:234 AliTRDpidRefMaker.cxx:235 AliTRDpidRefMaker.cxx:236 AliTRDpidRefMaker.cxx:237 AliTRDpidRefMaker.cxx:238 AliTRDpidRefMaker.cxx:239 AliTRDpidRefMaker.cxx:240 AliTRDpidRefMaker.cxx:241 AliTRDpidRefMaker.cxx:242 AliTRDpidRefMaker.cxx:243 AliTRDpidRefMaker.cxx:244 AliTRDpidRefMaker.cxx:245 AliTRDpidRefMaker.cxx:246 AliTRDpidRefMaker.cxx:247 AliTRDpidRefMaker.cxx:248 AliTRDpidRefMaker.cxx:249 AliTRDpidRefMaker.cxx:250 AliTRDpidRefMaker.cxx:251 AliTRDpidRefMaker.cxx:252 AliTRDpidRefMaker.cxx:253 AliTRDpidRefMaker.cxx:254 AliTRDpidRefMaker.cxx:255 AliTRDpidRefMaker.cxx:256 AliTRDpidRefMaker.cxx:257 AliTRDpidRefMaker.cxx:258 AliTRDpidRefMaker.cxx:259 AliTRDpidRefMaker.cxx:260 AliTRDpidRefMaker.cxx:261 AliTRDpidRefMaker.cxx:262 AliTRDpidRefMaker.cxx:263 AliTRDpidRefMaker.cxx:264 AliTRDpidRefMaker.cxx:265 AliTRDpidRefMaker.cxx:266 AliTRDpidRefMaker.cxx:267 AliTRDpidRefMaker.cxx:268 AliTRDpidRefMaker.cxx:269 AliTRDpidRefMaker.cxx:270 AliTRDpidRefMaker.cxx:271 AliTRDpidRefMaker.cxx:272 AliTRDpidRefMaker.cxx:273 AliTRDpidRefMaker.cxx:274 AliTRDpidRefMaker.cxx:275 AliTRDpidRefMaker.cxx:276 AliTRDpidRefMaker.cxx:277 AliTRDpidRefMaker.cxx:278 AliTRDpidRefMaker.cxx:279 AliTRDpidRefMaker.cxx:280 AliTRDpidRefMaker.cxx:281 AliTRDpidRefMaker.cxx:282 AliTRDpidRefMaker.cxx:283 AliTRDpidRefMaker.cxx:284 AliTRDpidRefMaker.cxx:285 AliTRDpidRefMaker.cxx:286 AliTRDpidRefMaker.cxx:287 AliTRDpidRefMaker.cxx:288 AliTRDpidRefMaker.cxx:289 AliTRDpidRefMaker.cxx:290 AliTRDpidRefMaker.cxx:291 AliTRDpidRefMaker.cxx:292 AliTRDpidRefMaker.cxx:293 AliTRDpidRefMaker.cxx:294 AliTRDpidRefMaker.cxx:295 AliTRDpidRefMaker.cxx:296 AliTRDpidRefMaker.cxx:297 AliTRDpidRefMaker.cxx:298 AliTRDpidRefMaker.cxx:299 AliTRDpidRefMaker.cxx:300 AliTRDpidRefMaker.cxx:301 AliTRDpidRefMaker.cxx:302 AliTRDpidRefMaker.cxx:303 AliTRDpidRefMaker.cxx:304 AliTRDpidRefMaker.cxx:305 AliTRDpidRefMaker.cxx:306 AliTRDpidRefMaker.cxx:307 AliTRDpidRefMaker.cxx:308 AliTRDpidRefMaker.cxx:309 AliTRDpidRefMaker.cxx:310 AliTRDpidRefMaker.cxx:311 AliTRDpidRefMaker.cxx:312 AliTRDpidRefMaker.cxx:313 AliTRDpidRefMaker.cxx:314 AliTRDpidRefMaker.cxx:315 AliTRDpidRefMaker.cxx:316 AliTRDpidRefMaker.cxx:317 AliTRDpidRefMaker.cxx:318 AliTRDpidRefMaker.cxx:319 AliTRDpidRefMaker.cxx:320 AliTRDpidRefMaker.cxx:321 AliTRDpidRefMaker.cxx:322 AliTRDpidRefMaker.cxx:323 AliTRDpidRefMaker.cxx:324 AliTRDpidRefMaker.cxx:325 AliTRDpidRefMaker.cxx:326 AliTRDpidRefMaker.cxx:327 AliTRDpidRefMaker.cxx:328 AliTRDpidRefMaker.cxx:329 AliTRDpidRefMaker.cxx:330