1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 #include <TClonesArray.h>
18 #include <TObjArray.h>
21 #include <TGraphErrors.h>
26 #include <TParticle.h>
29 #include "AliAnalysisManager.h"
30 #include "AliESDEvent.h"
31 #include "AliESDkink.h"
32 #include "AliMCEvent.h"
33 #include "AliESDInputHandler.h"
34 #include "AliMCEventHandler.h"
36 #include "AliESDtrack.h"
37 #include "AliMCParticle.h"
40 #include "AliTrackReference.h"
41 #include "AliTRDgeometry.h"
43 #include "AliTRDcheckESD.h"
45 ClassImp(AliTRDcheckESD)
47 const Float_t AliTRDcheckESD::xTPC = 290.;
48 const Float_t AliTRDcheckESD::xTOF = 365.;
50 //____________________________________________________________________
51 AliTRDcheckESD::AliTRDcheckESD():
52 AliAnalysisTask("ESDchecker", "TRD checker @ ESD level")
59 // Default constructor
62 DefineInput(0, TChain::Class());
63 DefineOutput(0, TObjArray::Class());
66 //____________________________________________________________________
67 AliTRDcheckESD::~AliTRDcheckESD()
75 //____________________________________________________________________
76 void AliTRDcheckESD::ConnectInputData(Option_t *)
79 // Link the Input Data
81 TTree *tree = dynamic_cast<TChain*>(GetInputData(0));
82 if(tree) tree->SetBranchStatus("Tracks", 1);
84 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
85 fESD = esdH ? esdH->GetEvent() : 0x0;
88 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler*>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
89 fMC = mcH ? mcH->MCEvent() : 0x0;
92 //____________________________________________________________________
93 void AliTRDcheckESD::CreateOutputObjects()
96 // Create Output Containers (TObjectArray containing 1D histograms)
98 OpenFile(0, "RECREATE");
99 fHistos = new TObjArray(5);
100 //fHistos->SetOwner(kTRUE);
104 // clusters per tracklet
105 if(!(h = (TH1I*)gROOT->FindObject("hNCl"))){
106 h = new TH1I("hNCl", "Clusters per TRD track", 100, 0., 200.);
107 h->GetXaxis()->SetTitle("N_{cl}^{TRD}");
108 h->GetYaxis()->SetTitle("entries");
110 fHistos->AddAt(h, kNCl);
112 // status bits histogram
113 if(!(h = (TH2I*)gROOT->FindObject("hTRDstat"))){
114 h = new TH2I("hTRDstat", "TRD status bits", 100, 0., 20., kNbits, .5, kNbits+.5);
115 h->GetXaxis()->SetTitle("p_{T} [GeV/c]");
116 h->GetYaxis()->SetTitle("status bits");
117 h->GetZaxis()->SetTitle("entries");
119 fHistos->AddAt(h, kTRDstat);
122 TObjArray *res = new TObjArray();
123 res->SetName("Results");
124 fHistos->AddAt(res, kResults);
127 //____________________________________________________________________
128 void AliTRDcheckESD::Exec(Option_t *){
133 AliError("ESD event missing.");
137 // Get MC information if available
138 AliStack * fStack = 0x0;
140 AliWarning("MC event missing");
143 if(!(fStack = fMC->Stack())){
144 AliWarning("MC stack missing");
148 Bool_t TRDin(0), TRDout(0), TRDpid(0);
150 AliESDtrack *esdTrack = 0x0;
151 for(Int_t itrk = 0; itrk < fESD->GetNumberOfTracks(); itrk++){
152 TRDin=0;TRDout=0;TRDpid=0;
153 esdTrack = fESD->GetTrack(itrk);
155 // if(esdTrack->GetNcls(1)) nTPC++;
156 // if(esdTrack->GetNcls(2)) nTRD++;
159 ULong_t status = esdTrack->GetStatus();
161 // define TPC out tracks
162 if(!Bool_t(status & AliESDtrack::kTPCout)) continue;
163 if(esdTrack->GetKinkIndex(0) > 0) continue;
166 Double_t p[AliPID::kSPECIES]; esdTrack->GetTRDpid(p);
168 esdTrack->GetTRDpidQuality();
170 // look at external track param
171 const AliExternalTrackParam *op = esdTrack->GetOuterParam();
175 op->Global2LocalPosition(xyz, op->GetAlpha());
176 //printf("op @ X[%7.3f]\n", xyz[0]);
180 if(!HasMC()) continue;
182 Int_t fLabel = esdTrack->GetLabel();
183 if(TMath::Abs(fLabel) > fStack->GetNtrack()) continue;
186 AliMCParticle *mcParticle = 0x0;
187 if(!(mcParticle = fMC->GetTrack(TMath::Abs(fLabel)))){
188 AliWarning(Form("MC particle missing. Label[ %d].", fLabel));
192 AliTrackReference *ref = 0x0;
193 Int_t nRefs = mcParticle->GetNumberOfTrackReferences();
195 AliWarning(Form("Track refs missing. Label[%d].", fLabel));
200 ref = mcParticle->GetTrackReference(iref);
201 if(ref->LocalX() > xTPC) break;
206 TParticle *tParticle = mcParticle->Particle();
207 //Int_t fPdg = tParticle->GetPdgCode();
208 // reject secondaries
209 //if(!tParticle->IsPrimary()) continue;
212 if(ref->LocalX() > xTOF){ // track skipping TRD fiducial volume
213 ref = mcParticle->GetTrackReference(TMath::Max(iref-1, 0));
216 if(esdTrack->GetNcls(2)) TRDout=1;
217 if(esdTrack->GetTRDpidQuality()) TRDpid=1;
219 } else { // track stopped in TPC
220 ref = mcParticle->GetTrackReference(TMath::Max(iref-1, 0));
223 Float_t pt = ref->Pt();
225 TH2 *h = (TH2I*)fHistos->At(kTRDstat);
226 if(status & AliESDtrack::kTPCout) h->Fill(pt, kTPCout);
227 if(/*status & AliESDtrack::k*/TRDin) h->Fill(pt, kTRDin);
228 if(/*status & AliESDtrack::k*/TRDout){
229 ((TH1*)fHistos->At(kNCl))->Fill(esdTrack->GetNcls(2));
230 h->Fill(pt, kTRDout);
232 if(status & AliESDtrack::kTRDpid) h->Fill(pt, kTRDpid);
234 PostData(0, fHistos);
238 //____________________________________________________________________
239 void AliTRDcheckESD::Terminate(Option_t *)
241 TH2I *h2 = (TH2I*)fHistos->At(kTRDstat);
242 TAxis *ax = h2->GetXaxis();
243 TObjArray *res = (TObjArray*)fHistos->At(kResults);
245 TH1 *h1[2] = {0x0, 0x0};
246 TGraphErrors *g = 0x0;
248 Int_t n1 = 0, n2 = 0, ip=0;
251 // geometrical efficiency
252 h1[0] = h2->ProjectionX("px0", kTPCout, kTPCout);
253 h1[1] = h2->ProjectionX("px1", kTRDin, kTRDin);
254 res->Add(g = new TGraphErrors());
255 g->SetNameTitle("geom", "TRD geometrical efficiency (TRDin/TPCout)");
256 for(Int_t ib=1; ib<=ax->GetNbins(); ib++){
257 if(!(n1 = (Int_t)h1[0]->GetBinContent(ib))) continue;
258 n2 = (Int_t)h1[1]->GetBinContent(ib);
259 eff = n2/Float_t(n1);
262 g->SetPoint(ip, ax->GetBinCenter(ib), eff);
263 g->SetPointError(ip, 0., n2 ? eff*TMath::Sqrt(1./n1+1./n2) : 0.);
266 // tracking efficiency
267 h1[0] = h2->ProjectionX("px0", kTRDin, kTRDin);
268 h1[1] = h2->ProjectionX("px1", kTRDout, kTRDout);
269 res->Add(g = new TGraphErrors());
270 g->SetNameTitle("tracking", "TRD tracking efficiency (TRDout/TRDin)");
271 for(Int_t ib=1; ib<=ax->GetNbins(); ib++){
272 if(!(n1 = (Int_t)h1[0]->GetBinContent(ib))) continue;
273 n2 = (Int_t)h1[1]->GetBinContent(ib);
274 eff = n2/Float_t(n1);
277 g->SetPoint(ip, ax->GetBinCenter(ib), eff);
278 g->SetPointError(ip, 0., n2 ? eff*TMath::Sqrt(1./n1+1./n2) : 0.);
282 h1[0] = h2->ProjectionX("px0", kTRDin, kTRDin);
283 h1[1] = h2->ProjectionX("px1", kTRDpid, kTRDpid);
284 res->Add(g = new TGraphErrors());
285 g->SetNameTitle("PID", "TRD PID efficiency (TRDpid/TRDin)");
286 for(Int_t ib=1; ib<=ax->GetNbins(); ib++){
287 if(!(n1 = (Int_t)h1[0]->GetBinContent(ib))) continue;
288 n2 = (Int_t)h1[1]->GetBinContent(ib);
289 eff = n2/Float_t(n1);
292 g->SetPoint(ip, ax->GetBinCenter(ib), eff);
293 g->SetPointError(ip, 0., n2 ? eff*TMath::Sqrt(1./n1+1./n2) : 0.);
297 // if(TRDin && !TRDout){
298 // printf("[%c] x[%2d]=%7.2f pt[%7.3f] id[%d] kink[%d] label[%d] in[%d] out[%d] pdg[%d]\n", tParticle->IsPrimary() ? 'P' : 'S', iref, ref->LocalX(), pt, esdTrack->GetID(), esdTrack->GetKinkIndex(0), fLabel, TRDin, TRDout, tParticle->GetPdgCode());
299 // printf("\tstatus ITS[%d %d] TPC[%d %d %d] \n"
300 // ,Bool_t(status & AliESDtrack::kITSin)
301 // ,Bool_t(status & AliESDtrack::kITSout)
302 // ,Bool_t(status & AliESDtrack::kTPCin)
303 // ,Bool_t(status & AliESDtrack::kTPCout)
304 // ,Bool_t(status & AliESDtrack::kTPCrefit)
306 // printf("clusters ITS[%d] TPC[%d] TRD[%d]\n", esdTrack->GetNcls(0), esdTrack->GetNcls(1), esdTrack->GetNcls(2));
307 // if(esdTrack->GetKinkIndex(0) != 0){
308 // AliESDkink *kink = fESD->GetKink(TMath::Abs(esdTrack->GetKinkIndex(0)));
309 // if(kink) printf("index[%d %d] label[%d %d]\n", kink->GetIndex(0), kink->GetIndex(1), kink->GetLabel(0), kink->GetLabel(1));