//------------------------------------------------------------------------- // // This is the PROOF-enabled version of ITS/AliITSComparisonV2.C macro. // Origin: Andrei.Zalite@cern.ch // //------------------------------------------------------------------------- #include "TChain.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 "AliLog.h" #include "AliVEvent.h" #include "AliESDEvent.h" #include "AliMCEvent.h" #include "AliESDtrack.h" #include "AliTrackReference.h" #include "AliMCComparisonTrack.h" #include "AliITSComparisonTask.h" ClassImp(AliITSComparisonTask) extern TStyle *gStyle; AliITSComparisonTask::AliITSComparisonTask() : AliAnalysisTaskSE("AliITSComaprisonTask"), fListOfHistos(0), fGood(0), fFound(0), fFake(0), fP(0), fL(0), fPt(0), fTip(0), fE(0), fEp(0), fGoodPhi(0), fFoundPhi(0), fLip(0) { // Default constructor AliInfo("Default constructor AliITSComparisonTask"); // 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()); } AliITSComparisonTask::AliITSComparisonTask(const char* name) : AliAnalysisTaskSE(name), fListOfHistos(0), fGood(0), fFound(0), fFake(0), fP(0), fL(0), fPt(0), fTip(0), fE(0), fEp(0), fGoodPhi(0), fFoundPhi(0), fLip(0) { // Constructor AliInfo("Constructor AliITSComparisonTask"); // 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 AliITSComparisonTask::UserCreateOutputObjects() { // Create histograms // Called once AliInfo("AliITSComparisonTask::UserCreateOutputObjects"); // Create output container fListOfHistos = new TList(); fGood = new TH1F("fGood", "Pt for good tracks", 34, 0.2, 7.0); fFound = new TH1F("fFound", "Pt for found tracks", 34, 0.2, 7.0); fFake = new TH1F("fFake", "Pt for fake tracks", 34, 0.2, 7.0); fP = new TH1F("fP", "PHI resolution", 50, -20., 20.); fL = new TH1F("fL", "LAMBDA resolution", 50, -20., 20.); fPt = new TH1F("fPt", "Relative Pt resolution", 30, -10., 10.); fTip = new TH1F("fTip", "Transverse impact parameter", 40, -800., 800.); fE = new TH1F("fE", "dE/dX for pions with 0.4
Add(fGood);
fListOfHistos->Add(fFound);
fListOfHistos->Add(fFake);
fListOfHistos->Add(fP);
fListOfHistos->Add(fL);
fListOfHistos->Add(fPt);
fListOfHistos->Add(fTip);
fListOfHistos->Add(fE);
fListOfHistos->Add(fEp);
fListOfHistos->Add(fGoodPhi);
fListOfHistos->Add(fFoundPhi);
fListOfHistos->Add(fLip);
}
void AliITSComparisonTask::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 = (AliMCParticle*)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;
// Loop over Track References
Bool_t labelTPC = kFALSE;
AliTrackReference* trackRef = 0;
UInt_t iTSLayerMap = 0;
for (Int_t iTrackRef = 0; iTrackRef < track->GetNumberOfTrackReferences(); iTrackRef++) {
trackRef = track->GetTrackReference(iTrackRef);
if(trackRef) {
Int_t detectorId = trackRef->DetectorId();
if (detectorId == AliTrackReference::kITS) {
Float_t radius = trackRef->R();
if (radius > 2.5 && radius < 5.5)
iTSLayerMap |= 1;
else if (radius > 5.5 && radius < 8.5)
iTSLayerMap |= 1 << 1;
else if (radius > 13.5 && radius < 16.5)
iTSLayerMap |= 1 << 2;
else if (radius > 22. && radius < 26.)
iTSLayerMap |= 1 << 3;
else if (radius > 36. && radius < 41.)
iTSLayerMap |= 1 << 4;
else if (radius > 42. && radius < 46.)
iTSLayerMap |= 1 << 5;
else {
Printf("Wrong radius %f ", radius);
return;
}
}
if (detectorId == AliTrackReference::kTPC) {
labelTPC = kTRUE;
break;
}
}
} // track references loop
// Skip tracks that passed not all ITS layers
if (iTSLayerMap != 0x3F) continue;
// "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(track->Pz());
Float_t pt = track->Pt();
ref->SetPt(pt);
fGood->Fill(pt);
Float_t phig = track->Phi();
ref->SetPhi(phig);
fGoodPhi->Fill(phig);
nt++;
}
} // track loop
// ESD information
AliVEvent* event = InputEvent();
if (!event) {
Printf("ERROR: Could not retrieve event");
return;
}
AliESDEvent* esd = dynamic_cast