]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG1/TRD/AliTRDv0Monitor.cxx
fix codding conventions
[u/mrichter/AliRoot.git] / PWG1 / TRD / AliTRDv0Monitor.cxx
1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
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 **************************************************************************/
15
16 /////////////////////////////////////////////////////
17 //
18 //  Monitor V0 for TRD
19 //
20 //  Authors:                                          
21 //  Markus Heide <mheide@uni-muenster.de> 
22 //////////////////////////////////////////////////////
23
24 #include "TObjArray.h"
25 #include "TH2.h"
26 #include "TH2F.h"
27 #include "TH1I.h"
28 #include "TCanvas.h"
29
30 #include "AliLog.h"
31 #include "AliESDtrack.h"
32 #include "AliPID.h"
33 #include "AliTRDv0Monitor.h"
34 #include "info/AliTRDv0Info.h"
35
36
37 ClassImp(AliTRDv0Monitor)
38
39 //________________________________________________________________________
40 AliTRDv0Monitor::AliTRDv0Monitor() 
41   :AliTRDrecoTask()
42   ,fhQualityReductions(NULL)
43   ,fV0s(NULL)
44   ,fData(NULL)
45   ,fInfo(NULL)
46   ,fP(-1.) 
47 {
48   //
49   // Default constructor
50   //
51   SetNameTitle("TRDv0Monitor", "V0 Monitor for TRD PID");
52 }
53
54 //________________________________________________________________________
55 AliTRDv0Monitor::AliTRDv0Monitor(const char *name) 
56   :AliTRDrecoTask(name, "V0 Monitor for TRD PID")
57   ,fhQualityReductions(NULL)
58   ,fV0s(NULL)
59   ,fData(NULL)
60   ,fInfo(NULL)
61   ,fP(-1.)
62 {
63   //
64   // Default constructor
65   //
66   DefineInput(2, TObjArray::Class()); // v0 list
67   DefineInput(3, TObjArray::Class()); // pid info list 
68 }
69
70
71
72 // //____________________________________________________________________
73 // void AliTRDv0Monitor::MakeSummary(){//makes a summary with potentially nice reference figures
74 //   //TCanvas *cOut = new TCanvas("v0MonitorSummary1", "Summary 1 for task V0Monitor", 1024, 768);
75 //   //cOut->cd();
76 //   //GetRefFigure(4);
77 //   //cOut->SaveAs("V0MonitorSummary.gif");
78 // 
79 //   //cOut = new TCanvas("v0MonitorSummary2","Summary 2 for task V0Monitor", 1024, 768);
80 //   //cOut->cd();
81 //   //GetRefFigure(5);
82 //   //cOut->SaveAs("V0MonitorSummary2.gif");
83 // }
84
85 //________________________________________________________________________
86 Bool_t AliTRDv0Monitor::GetRefFigure(Int_t /*ifig*/)
87 {
88   //creating reference figures
89
90   AliInfo("Implementation on going ...");
91   return kTRUE;
92 }
93
94 //________________________________________________________________________
95 TObjArray* AliTRDv0Monitor::Histos()
96 {
97   // Create histograms
98   // Called once
99   if(fContainer) return fContainer;
100
101   fContainer = new TObjArray(kNPlots);
102   fContainer->SetName("V0Monitoring");
103   
104   const char *samplename[AliPID::kSPECIES] = {"electrons","muons","pions","kaons","protons"};
105   const char *decayname[AliTRDv0Info::kNDecays] = {"gamma","K0s","Lambda","AntiLambda"};
106   const char *detectorname[kNDets] = {"ITS","TPC","TOF"};
107   
108   fhQualityReductions = new TH1I(Form("fhQualityReductions"),Form("Number of tracks cut out by different quality cut steps"),11,-9,2);
109   fContainer->Add(fhQualityReductions);
110   
111   for(Int_t ipart = 0;ipart < AliPID::kSPECIES; ipart++){
112     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);
113     fContainer->Add(fhCutReductions[ipart]);
114     for(Int_t idetector = 0; idetector < kNDets; idetector++){
115       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.);
116   
117       fContainer->Add(fhDetPID[idetector][ipart]);
118     }
119     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.);
120   
121     fContainer->Add(fhComPID[ipart]);
122
123     for(Int_t cutstep = 0; cutstep < kNCutSteps; cutstep++){
124       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.);
125       
126       fContainer->Add(fhTPCdEdx[ipart][cutstep]);
127     }
128   }
129   
130   for(Int_t iDecay = 0; iDecay < AliTRDv0Info::kNDecays; iDecay++){   
131     for(Int_t cutstep =0; cutstep < kNCutSteps; cutstep++){
132       fhV0Chi2ndf[iDecay][cutstep] =  new TH2F(Form("fhV0Chi2ndf_%s_[%d]",decayname[iDecay],cutstep),Form("Chi2/NDF vs. momentum"),100,0.,10.,500, 0., 500.);
133       
134       fContainer->Add(fhV0Chi2ndf[iDecay][cutstep]);
135       
136       fhPsiPair[iDecay][cutstep] =  new TH2F(Form("fhV0PsiPair_%s_[%d]",decayname[iDecay],cutstep),Form("Psi_pair vs. momentum"),100,0.,10.,200, 0., 1.6);
137       
138       fContainer->Add(fhPsiPair[iDecay][cutstep]);
139   
140       fhPointAngle[iDecay][cutstep] =  new TH2F(Form("fhPointAngle_%s_[%d]",decayname[iDecay],cutstep),Form("Pointing Angle vs. momentum"),100,0.,10.,500, 0., 1.6);     
141       fContainer->Add(fhPointAngle[iDecay][cutstep]);
142   
143       fhDCA[iDecay][cutstep] =  new TH2F(Form("fhDCA_%s_[%d]",decayname[iDecay],cutstep),Form("V0 Daughter DCA vs. momentum"),100,0.,10.,500, 0., 1.);
144       
145       fContainer->Add(fhDCA[iDecay][cutstep]);
146   
147       fhOpenAngle[iDecay][cutstep] =  new TH2F(Form("fhOpenAngle_%s_[%d]",decayname[iDecay],cutstep),Form("Opening Angle vs. momentum"),100,0.,10.,500, 0., 1.6);
148       
149       fContainer->Add(fhOpenAngle[iDecay][cutstep]);
150   
151       fhRadius[iDecay][cutstep] =  new TH2F(Form("fhRadius_%s_[%d]",decayname[iDecay],cutstep),Form("V0 Generation Radius vs. momentum"),100,0.,10.,500, 0., 150.);
152       
153       fContainer->Add(fhRadius[iDecay][cutstep]);
154     }
155   
156     fhInvMass[iDecay] =  new TH2F(Form("fhInvMass_%s",decayname[iDecay]),Form("Invariant Mass vs. momentum"),100,0.,10.,500, 0., 2.);
157       
158     fContainer->Add(fhInvMass[iDecay]); 
159   } 
160
161 /*TH1F *hV0mcPID[AliPID::kSPECIES][AliPID::kSPECIES];
162   Int_t nPBins = 200;
163   
164   
165   
166   for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++){
167   for(Int_t iSample = 0; iSample < AliPID::kSPECIES; iSample++){
168   
169   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.);
170   }
171   }*/
172
173   return fContainer;
174 }
175
176
177 //________________________________________________________________________
178 void AliTRDv0Monitor::UserExec(Option_t *) 
179 {
180   // Main loop
181   // Called for each event
182   if(!(fTracks = dynamic_cast<TObjArray*>(GetInputData(1)))) return;
183   if(!(fV0s    = dynamic_cast<TObjArray*>(GetInputData(2)))) return;
184   if(!(fInfo   = dynamic_cast<TObjArray*>(GetInputData(3)))) return;
185   
186   
187   AliTRDtrackInfo     *track = NULL;
188   AliTRDv0Info *v0(NULL);
189
190   for(Int_t itrk=0; itrk<fTracks->GetEntriesFast(); itrk++){
191     track = (AliTRDtrackInfo*)fTracks->UncheckedAt(itrk);
192     for(Int_t iv(0); iv<fV0s->GetEntriesFast(); iv++){
193       if(!(v0 = (AliTRDv0Info*)fV0s->At(iv))) continue;
194       if(!v0->HasTrack(track)) continue;
195       ULong_t status = track->GetStatus();
196       if(!(status&AliESDtrack::kTRDpid)) continue;
197       
198       fhQualityReductions->Fill(v0->GetQuality());//fills integer codes for tracks cut out by track/V0 quality cuts
199       
200       if(!(v0->GetQuality() == 1)) continue;
201
202       for(Int_t part = 0; part < AliPID::kSPECIES; part++){
203         fhCutReductions[part]->Fill(v0->GetPID(part,track));//fill in numbers of tracks eliminated by different PID cuts
204       }
205
206     
207       for(Int_t idecay(0), part(-1); idecay <  AliTRDv0Info::kNDecays; idecay++){//loop over decay types considered for reference data
208         if(idecay ==  AliTRDv0Info::kLambda){ //protons and pions from Lambda
209           part = AliPID::kProton;
210         } else if(idecay == AliTRDv0Info::kAntiLambda) { //antiprotons and pions from Anti-Lambda     
211           part = AliPID::kProton;
212         } else if(idecay ==   AliTRDv0Info::kK0s) {//pions from K0s
213           part = AliPID::kPion;
214         } else if(idecay ==  AliTRDv0Info::kGamma) {//electrons from conversions
215           part = AliPID::kElectron;
216         } 
217         
218         //fill histograms with track/V0 quality cuts only
219         fhPsiPair[idecay][0]->Fill(v0->GetV0Momentum(),v0->GetPsiPair());//Angle between daughter momentum plane and plane perpendicular to magnetic field
220         fhInvMass[idecay]->Fill(v0->GetV0Momentum(),v0->GetInvMass(idecay));//Invariant mass
221         fhPointAngle[idecay][0]->Fill(v0->GetV0Momentum(),v0->GetPointingAngle());// = TMath::ACos(esdv0->GetV0CosineOfPointingAngle()); // Cosine of pointing angle
222         fhOpenAngle[idecay][0]->Fill(v0->GetV0Momentum(),v0->GetOpenAngle());// opening angle between daughters
223         fhDCA[idecay][0]->Fill(v0->GetV0Momentum(),v0->GetDCA());// Distance of closest approach of daughter tracks     
224         fhV0Chi2ndf[idecay][0]->Fill(v0->GetV0Momentum(),v0->GetChi2ndf(idecay));//Kalman Filter Chi2/NDF
225         fhRadius[idecay][0]->Fill(v0->GetV0Momentum(),v0->GetRadius());//distance of decay/conversion from primary vertex in x-y plane
226       
227         if(v0->HasTrack(track) == -1){    
228           fhTPCdEdx[part][0]->Fill(v0->GetV0Daughter(-1)->P(),v0->GetTPCdEdx(AliTRDv0Info::kNeg));//TPC dE/dx for negative track
229         } else if(v0->HasTrack(track) == 1){
230           fhTPCdEdx[part][0]->Fill(v0->GetV0Daughter(1)->P(),v0->GetTPCdEdx(AliTRDv0Info::kPos));//TPC dE/dx for positive track
231         }
232       
233         //fill histograms after invariant mass cuts
234         if((v0->GetInvMass(idecay) < v0->GetUpInvMass(idecay,0))&&(v0->GetInvMass(idecay)> v0->GetDownInvMass(idecay))){
235           fhV0Chi2ndf[idecay][1]->Fill(v0->GetV0Momentum(),v0->GetChi2ndf(idecay));
236           fhPsiPair[idecay][1]->Fill(v0->GetV0Momentum(),v0->GetPsiPair());
237           fhPointAngle[idecay][1]->Fill(v0->GetV0Momentum(),v0->GetPointingAngle());
238           fhOpenAngle[idecay][1]->Fill(v0->GetV0Momentum(),v0->GetOpenAngle());
239           fhDCA[idecay][1]->Fill(v0->GetV0Momentum(),v0->GetDCA());
240           fhRadius[idecay][1]->Fill(v0->GetV0Momentum(),v0->GetRadius());
241           if(v0->HasTrack(track) == -1)
242             fhTPCdEdx[part][1]->Fill(v0->GetV0Daughter(-1)->P(),v0->GetTPCdEdx(AliTRDv0Info::kNeg));
243           else if(v0->HasTrack(track) == 1)
244             fhTPCdEdx[part][1]->Fill(v0->GetV0Daughter(1)->P(),v0->GetTPCdEdx(AliTRDv0Info::kPos));
245       
246         }
247
248         //fill histograms after all reference selection cuts
249         if(v0->GetPID(part,track)==1){
250           fhV0Chi2ndf[idecay][2]->Fill(v0->GetV0Momentum(),v0->GetChi2ndf(idecay));
251           fhPsiPair[idecay][2]->Fill(v0->GetV0Momentum(),v0->GetPsiPair());
252           fhPointAngle[idecay][2]->Fill(v0->GetV0Momentum(),v0->GetPointingAngle());
253           fhOpenAngle[idecay][2]->Fill(v0->GetV0Momentum(),v0->GetOpenAngle());
254           fhDCA[idecay][2]->Fill(v0->GetV0Momentum(),v0->GetDCA());
255           fhRadius[idecay][2]->Fill(v0->GetV0Momentum(),v0->GetRadius());
256           if(v0->HasTrack(track) == -1)
257             fhTPCdEdx[part][2]->Fill(v0->GetV0Daughter(-1)->P(),v0->GetTPCdEdx(AliTRDv0Info::kNeg));
258           else if(v0->HasTrack(track) == 1)
259             fhTPCdEdx[part][2]->Fill(v0->GetV0Daughter(1)->P(),v0->GetTPCdEdx(AliTRDv0Info::kPos));
260         }
261       }
262     }
263   }
264 }