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-commercialf 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 **************************************************************************/
16 /////////////////////////////////////////////////////
21 // Markus Heide <mheide@uni-muenster.de>
22 //////////////////////////////////////////////////////
24 //#include "TPDGCode.h"
27 #include "TEventList.h"*/
28 #include "TObjArray.h"
34 // #include "TLegend.h"
37 #include "AliESDtrack.h"
39 #include "AliTRDv0Monitor.h"
40 #include "info/AliTRDv0Info.h"
43 ClassImp(AliTRDv0Monitor)
45 //________________________________________________________________________
46 AliTRDv0Monitor::AliTRDv0Monitor()
48 ,fhQualityReductions(NULL)
55 // Default constructor
57 SetNameTitle("TRDv0Monitor", "V0 Monitor for TRD PID");
60 //________________________________________________________________________
61 AliTRDv0Monitor::AliTRDv0Monitor(const char *name)
62 :AliTRDrecoTask(name, "V0 Monitor for TRD PID")
63 ,fhQualityReductions(NULL)
70 // Default constructor
72 DefineInput(2, TObjArray::Class()); // v0 list
73 DefineInput(3, TObjArray::Class()); // pid info list
78 //____________________________________________________________________
79 void AliTRDv0Monitor::MakeSummary(){
80 TCanvas *cOut = new TCanvas("v0MonitorSummary1", "Summary 1 for task V0Monitor", 1024, 768);
83 cOut->SaveAs("V0MonitorSummary.gif");
85 cOut = new TCanvas("v0MonitorSummary2","Summary 2 for task V0Monitor", 1024, 768);
88 cOut->SaveAs("V0MonitorSummary2.gif");
91 //________________________________________________________________________
92 Bool_t AliTRDv0Monitor::GetRefFigure(Int_t /*ifig*/)
95 AliInfo("Implementation on going ...");
99 //________________________________________________________________________
100 TObjArray* AliTRDv0Monitor::Histos()
105 if(fContainer) return fContainer;
107 fContainer = new TObjArray(kNPlots);
108 fContainer->SetName("V0Monitoring");
110 const char *samplename[AliPID::kSPECIES] = {"electrons","muons","pions","kaons","protons"};
111 const char *decayname[AliTRDv0Info::kNDecays] = {"gamma","K0s","Lambda","AntiLambda"};
112 const char *detectorname[kNDets] = {"ITS","TPC","TOF"};
114 fhQualityReductions = new TH1I(Form("fhQualityReductions"),Form("Number of tracks cut out by different quality cut steps"),11,-9,2);
115 fContainer->Add(fhQualityReductions);
117 for(Int_t ipart = 0;ipart < AliPID::kSPECIES; ipart++){
118 fhCutReductions[ipart] = new TH1I(Form("fhCutReductions_%s",samplename[ipart]),Form("Number of tracks cut out by different cut steps for %s",samplename[ipart]),19,-17,2);
119 fContainer->Add(fhCutReductions[ipart]);
120 for(Int_t idetector = 0; idetector < kNDets; idetector++){
121 fhDetPID[idetector][ipart] = new TH2F(Form("fhDetector_%s_%s",detectorname[idetector],samplename[ipart]),Form("%s Likelihood for %s vs. momentum",detectorname[idetector], samplename[ipart]),100,0.,10.,100, 0., 1.);
123 fContainer->Add(fhDetPID[idetector][ipart]);
125 fhComPID[ipart] = new TH2F(Form("fhComPID_%s",samplename[ipart]),Form("Combined TPC/TOF PID: Likelihood for %s",samplename[ipart]),100,0.,10.,100,0.,1.);
127 fContainer->Add(fhComPID[ipart]);
129 for(Int_t cutstep = 0; cutstep < kNCutSteps; cutstep++){
130 fhTPCdEdx[ipart][cutstep] = new TH2F(Form("fhTPCdEdx_%s_[%d]",samplename[ipart],cutstep),Form("TPC dE/dx for %s [%d]",samplename[ipart],cutstep),100,0.,10.,300,0.,300.);
132 fContainer->Add(fhTPCdEdx[ipart][cutstep]);
136 for(Int_t iDecay = 0; iDecay < AliTRDv0Info::kNDecays; iDecay++){
137 for(Int_t cutstep =0; cutstep < kNCutSteps; cutstep++){
138 fhV0Chi2ndf[iDecay][cutstep] = new TH2F(Form("fhV0Chi2ndf_%s_[%d]",decayname[iDecay],cutstep),Form("Chi2/NDF vs. momentum"),100,0.,10.,500, 0., 500.);
140 fContainer->Add(fhV0Chi2ndf[iDecay][cutstep]);
142 fhPsiPair[iDecay][cutstep] = new TH2F(Form("fhV0PsiPair_%s_[%d]",decayname[iDecay],cutstep),Form("Psi_pair vs. momentum"),100,0.,10.,200, 0., 1.6);
144 fContainer->Add(fhPsiPair[iDecay][cutstep]);
146 fhPointAngle[iDecay][cutstep] = new TH2F(Form("fhPointAngle_%s_[%d]",decayname[iDecay],cutstep),Form("Pointing Angle vs. momentum"),100,0.,10.,500, 0., 1.6);
147 fContainer->Add(fhPointAngle[iDecay][cutstep]);
149 fhDCA[iDecay][cutstep] = new TH2F(Form("fhDCA_%s_[%d]",decayname[iDecay],cutstep),Form("V0 Daughter DCA vs. momentum"),100,0.,10.,500, 0., 1.);
151 fContainer->Add(fhDCA[iDecay][cutstep]);
153 fhOpenAngle[iDecay][cutstep] = new TH2F(Form("fhOpenAngle_%s_[%d]",decayname[iDecay],cutstep),Form("Opening Angle vs. momentum"),100,0.,10.,500, 0., 1.6);
155 fContainer->Add(fhOpenAngle[iDecay][cutstep]);
157 fhRadius[iDecay][cutstep] = new TH2F(Form("fhRadius_%s_[%d]",decayname[iDecay],cutstep),Form("V0 Generation Radius vs. momentum"),100,0.,10.,500, 0., 150.);
159 fContainer->Add(fhRadius[iDecay][cutstep]);
162 fhInvMass[iDecay] = new TH2F(Form("fhInvMass_%s",decayname[iDecay]),Form("Invariant Mass vs. momentum"),100,0.,10.,500, 0., 2.);
164 fContainer->Add(fhInvMass[iDecay]);
167 /*TH1F *hV0mcPID[AliPID::kSPECIES][AliPID::kSPECIES];
172 for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++){
173 for(Int_t iSample = 0; iSample < AliPID::kSPECIES; iSample++){
175 fhV0mcPID[iSample][iSpecies] = new TH1F(Form("fhV0mcPID_%s_is_%s",name[iSample],name[iSpecies]),Form("%s contained in %s sample",name[iSpecies],name[iSample]), nPBins, 0.2, 13.);
183 //________________________________________________________________________
184 void AliTRDv0Monitor::UserExec(Option_t *)
187 // Called for each event
189 if(!(fTracks = dynamic_cast<TObjArray*>(GetInputData(1)))) return;
190 if(!(fV0s = dynamic_cast<TObjArray*>(GetInputData(2)))) return;
191 if(!(fInfo = dynamic_cast<TObjArray*>(GetInputData(3)))) return;
194 AliTRDtrackInfo *track = NULL;
195 AliTRDv0Info *v0(NULL);
199 for(Int_t itrk=0; itrk<fTracks->GetEntriesFast(); itrk++){
200 track = (AliTRDtrackInfo*)fTracks->UncheckedAt(itrk);
201 for(Int_t iv(0); iv<fV0s->GetEntriesFast(); iv++){
202 if(!(v0 = (AliTRDv0Info*)fV0s->At(iv))) continue;
203 if(!v0->HasTrack(track)) continue;
204 ULong_t status = track->GetStatus();
205 if(!(status&AliESDtrack::kTRDpid)) continue;
207 fhQualityReductions->Fill(v0->fQuality);//fills integer codes for tracks cut out by track/V0 quality cuts
209 if(!(v0->fQuality == 1)) continue;
211 for(Int_t part = 0; part < AliPID::kSPECIES; part++){
212 fhCutReductions[part]->Fill(v0->GetPID(part,track));//fill in numbers of tracks eliminated by different PID cuts
216 for(Int_t idecay(0), part(-1); idecay < AliTRDv0Info::kNDecays; idecay++){//loop over decay types considered for reference data
217 if(idecay == AliTRDv0Info::kLambda){ //protons and pions from Lambda
218 part = AliPID::kProton;
219 } else if(idecay == AliTRDv0Info::kAntiLambda) { //antiprotons and pions from Anti-Lambda
220 part = AliPID::kProton;
221 } else if(idecay == AliTRDv0Info::kK0s) {//pions from K0s
222 part = AliPID::kPion;
223 } else if(idecay == AliTRDv0Info::kGamma) {//electrons from conversions
224 part = AliPID::kElectron;
227 //fill histograms with track/V0 quality cuts only
228 fhPsiPair[idecay][0]->Fill(v0->fV0Momentum,v0->fPsiPair);//Angle between daughter momentum plane and plane perpendicular to magnetic field
229 fhInvMass[idecay]->Fill(v0->fV0Momentum,v0->fInvMass[idecay]);//Invariant mass
230 fhPointAngle[idecay][0]->Fill(v0->fV0Momentum,v0->fPointingAngle);// = TMath::ACos(esdv0->GetV0CosineOfPointingAngle()); // Cosine of pointing angle
231 fhOpenAngle[idecay][0]->Fill(v0->fV0Momentum,v0->fOpenAngle);// opening angle between daughters
232 fhDCA[idecay][0]->Fill(v0->fV0Momentum,v0->fDCA);// Distance of closest approach of daughter tracks
233 fhV0Chi2ndf[idecay][0]->Fill(v0->fV0Momentum,v0->fChi2ndf[idecay]);//Kalman Filter Chi2/NDF
234 fhRadius[idecay][0]->Fill(v0->fV0Momentum,v0->fRadius);//distance of decay/conversion from primary vertex in x-y plane
236 if(v0->HasTrack(track) == -1){
237 fhTPCdEdx[part][0]->Fill(v0->fTrackN->P(),v0->fTPCdEdx[AliTRDv0Info::kNeg]);//TPC dE/dx for negative track
238 } else if(v0->HasTrack(track) == 1){
239 fhTPCdEdx[part][0]->Fill(v0->fTrackP->P(),v0->fTPCdEdx[AliTRDv0Info::kPos]);//TPC dE/dx for positive track
242 //fill histograms after invariant mass cuts
243 if((v0->fInvMass[idecay] < v0->fUpInvMass[idecay][0])&&(v0->fInvMass[idecay]> v0->fDownInvMass[idecay])){
244 fhV0Chi2ndf[idecay][1]->Fill(v0->fV0Momentum,v0->fChi2ndf[idecay]);
245 fhPsiPair[idecay][1]->Fill(v0->fV0Momentum,v0->fPsiPair);
246 fhPointAngle[idecay][1]->Fill(v0->fV0Momentum,v0->fPointingAngle);
247 fhOpenAngle[idecay][1]->Fill(v0->fV0Momentum,v0->fOpenAngle);
248 fhDCA[idecay][1]->Fill(v0->fV0Momentum,v0->fDCA);
249 fhRadius[idecay][1]->Fill(v0->fV0Momentum,v0->fRadius);
250 if(v0->HasTrack(track) == -1)
251 fhTPCdEdx[part][1]->Fill(v0->fTrackN->P(),v0->fTPCdEdx[AliTRDv0Info::kNeg]);
252 else if(v0->HasTrack(track) == 1)
253 fhTPCdEdx[part][1]->Fill(v0->fTrackP->P(),v0->fTPCdEdx[AliTRDv0Info::kPos]);
257 //fill histograms after all reference selection cuts
258 if(v0->GetPID(part,track)==1){
259 fhV0Chi2ndf[idecay][2]->Fill(v0->fV0Momentum,v0->fChi2ndf[idecay]);
260 fhPsiPair[idecay][2]->Fill(v0->fV0Momentum,v0->fPsiPair);
261 fhPointAngle[idecay][2]->Fill(v0->fV0Momentum,v0->fPointingAngle);
262 fhOpenAngle[idecay][2]->Fill(v0->fV0Momentum,v0->fOpenAngle);
263 fhDCA[idecay][2]->Fill(v0->fV0Momentum,v0->fDCA);
264 fhRadius[idecay][2]->Fill(v0->fV0Momentum,v0->fRadius);
265 if(v0->HasTrack(track) == -1)
266 fhTPCdEdx[part][2]->Fill(v0->fTrackN->P(),v0->fTPCdEdx[AliTRDv0Info::kNeg]);
267 else if(v0->HasTrack(track) == 1)
268 fhTPCdEdx[part][2]->Fill(v0->fTrackP->P(),v0->fTPCdEdx[AliTRDv0Info::kPos]);