#include "TChain.h" #include "TTree.h" #include "TH1F.h" #include "TH2F.h" #include "TList.h" #include "TClonesArray.h" #include "TCanvas.h" #include "TStyle.h" #include "TLine.h" #include "TText.h" #include "TFile.h" #include "TBenchmark.h" #include "AliAnalysisTask.h" #include "AliAnalysisManager.h" #include "AliLog.h" #include "AliVEvent.h" #include "AliESDEvent.h" #include "AliMCEvent.h" #include "AliESDtrack.h" #include "AliTrackReference.h" #include "AliMCComparisonTrack.h" #include "AliTRDComparisonTask.h" ClassImp(AliTRDComparisonTask) AliTRDComparisonTask::AliTRDComparisonTask() : AliAnalysisTaskSE("AliTRDComparisonTask"), fListOfHistos(0), hgood(0), hfound(0), hfake(0), hp(0), hl(0), hpt(0), hmpt(0), he(0), hep(0), hgoodPhi(0), hfoundPhi(0), hz(0), hc(0) { // Default constructor AliInfo("Default constructor AliTRDComparisonTask"); // Define input and output slots here // Input slot #0 works with a TChain DefineInput(0, TChain::Class()); // Output slot #1 TList DefineOutput(1, TList::Class()); } AliTRDComparisonTask::AliTRDComparisonTask(const char* name) : AliAnalysisTaskSE(name), fListOfHistos(0), hgood(0), hfound(0), hfake(0), hp(0), hl(0), hpt(0), hmpt(0), he(0), hep(0), hgoodPhi(0), hfoundPhi(0), hz(0), hc(0) { // Constructor AliInfo("Constructor AliTRDComparisonTask"); // Define input and output slots here // Input slot #0 works with a TChain DefineInput(0, TChain::Class()); // Output slot #1 TList DefineOutput(1, TList::Class()); } void AliTRDComparisonTask::UserCreateOutputObjects() { // Create histograms // Called once AliInfo("AliTRDComparisonTask::UserCreateOutputObjects"); // Create output container fListOfHistos = new TList(); hgood = new TH1F("hgood", "Pt for good tracks", 34, 0.2, 7.0); hfound = new TH1F("hfound", "Pt for found tracks", 34, 0.2, 7.0); hfake = new TH1F("hfake", "Pt for fake tracks", 34, 0.2, 7.0); hp = new TH1F("hp", "PHI resolution", 50, -20., 20.); hl = new TH1F("hl", "LAMBDA resolution", 50, -20., 20.); hpt = new TH1F("hpt", "Relative Pt resolution", 30, -10., 10.); hmpt = new TH1F("hmpt", "Y and Z resolution", 30, -30., 30.); he = new TH1F("he", "dE/dX for pions with 0.4
Add(hgood);
fListOfHistos->Add(hfound);
fListOfHistos->Add(hfake);
fListOfHistos->Add(hp);
fListOfHistos->Add(hl);
fListOfHistos->Add(hpt);
fListOfHistos->Add(hmpt);
fListOfHistos->Add(he);
fListOfHistos->Add(hep);
fListOfHistos->Add(hgoodPhi);
fListOfHistos->Add(hfoundPhi);
fListOfHistos->Add(hz);
fListOfHistos->Add(hc);
}
void AliTRDComparisonTask::UserExec(Option_t *)
{
// Main loop
// Called for each event
// MC information
AliMCEvent* mcEvent = MCEvent();
if (!mcEvent) {
Printf("ERROR: Could not retrieve MC event");
return;
}
Int_t nt = 0;
TClonesArray dummy("AliMCComparisonTrack",1000), *refs=&dummy;
// Loop over all MC tracks and select "good" tracks
for (Int_t iTracks = 0; iTracks < mcEvent->GetNumberOfTracks(); iTracks++) {
AliMCParticle* track = mcEvent->GetTrack(iTracks);
if (!track) {
Printf("ERROR: Could not receive track %d (mc loop)", iTracks);
continue;
}
// Track selection
if (track->Pt() < 0.2) continue;
if (track->Pt() > 7.0) continue;
if (TMath::Abs(track->Pz()/track->Pt()) > 0.999) continue;
Double_t vx = track->Xv(), vy = track->Yv(), vz = track->Zv();
if (TMath::Sqrt(vx*vx+vy*vy) > 3.5) continue;
if (TMath::Abs(vz) > 50.) continue;
// Check TRD information
Int_t nRefs = track->GetNumberOfTrackReferences();
if (nRefs <= 1) continue;
AliTrackReference* trackRef0 = 0;
for (Int_t iTrackRef = 0; iTrackRef < nRefs; iTrackRef++) {
trackRef0 = track->GetTrackReference(iTrackRef);
if(trackRef0) {
Int_t detectorId = trackRef0->DetectorId();
if (detectorId == AliTrackReference::kTRD) {
break;
}
trackRef0 = 0;
}
}
if (!trackRef0) continue;
if (trackRef0->LocalX() > 300.) continue;
AliTrackReference* trackRef = 0;
for (Int_t iTrackRef = nRefs - 1; iTrackRef >= 0; --iTrackRef) {
trackRef = track->GetTrackReference(iTrackRef);
if (!trackRef) continue;
if (trackRef->LocalX() > 363. &&
trackRef->DetectorId() == AliTrackReference::kTRD) break;
trackRef = 0;
}
if (!trackRef) continue;
if (TMath::Abs(trackRef0->Alpha() - trackRef->Alpha()) > 1e-5) continue;
// Check TPC information
Bool_t LabelTPC = kFALSE;
for (Int_t iTrackRef = 0; iTrackRef < nRefs; iTrackRef++) {
trackRef = track->GetTrackReference(iTrackRef);
if(trackRef) {
Int_t detectorId = trackRef->DetectorId();
if (detectorId == AliTrackReference::kTPC) {
LabelTPC = kTRUE;
break;
}
}
} // track references loop
// "Good" tracks
if (LabelTPC) {
AliMCComparisonTrack* ref = new((*refs)[nt]) AliMCComparisonTrack();
ref->SetLabel(iTracks);
TParticle* particle = track->Particle();
Int_t pdg = particle->GetPdgCode();
ref->SetPDG(pdg);
ref->SetPz(trackRef->Pz());
Float_t Pt = trackRef->Pt();
ref->SetPt(Pt);
hgood->Fill(Pt);
Float_t phig = trackRef->Phi();
ref->SetPhi(phig);
hgoodPhi->Fill(phig);
ref->SetLocalX(trackRef->LocalX());
ref->SetLocalY(trackRef->LocalY());
ref->SetZ(trackRef->Z());
nt++;
}
} // track loop
// ESD information
AliVEvent* event = InputEvent();
if (!event) {
Printf("ERROR: Could not retrieve event");
return;
}
AliESDEvent* esd = dynamic_cast