]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/SPECTRA/XtAnalysis/AliXtAnalysis.cxx
Removed some classed (Same code in JCORRAN packet under PWG-CF) + polished remaining...
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / XtAnalysis / AliXtAnalysis.cxx
CommitLineData
072855d8 1/**************************************************************************
2 * Copyright(c) 1998-2014, 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-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 **************************************************************************/
15
16/**************************************************************************
17 * AliXtAnalysis:
18 * This class constructs inclusive and isolated (based on charged tracks)
19 * invariant spectra. Isolated case uses a different efficiency where the
20 * contamination from cases where non-isolated particle appears as an
21 * isolated one due to finite detector efficiency is taken into account.
22 *
23 * contact: Sami Räsänen
24 * University of Jyväskylä, Finland
25 * sami.s.rasanen@jyu.fi
26**************************************************************************/
27
28// general + root classes
29#include <TList.h>
30#include <TChain.h>
31#include <TObjArray.h>
32
33// AliRoot classes
34#include <AliAnalysisManager.h>
35#include <AliInputEventHandler.h>
36#include <AliAnalysisUtils.h>
37#include <AliAODTrack.h>
38#include <AliAODEvent.h>
39
40// Jyväskylä classes
a5f56dc7 41#include <AliJCard.h> // this class at PWGCF / JCORRAN
072855d8 42#include "AliJXtHistos.h"
43//#include "AliIsolatedEfficiency.h"
44
45// This analysis
46#include "AliXtAnalysis.h"
47
48ClassImp(AliXtAnalysis)
49
50//________________________________________________________________________
51AliXtAnalysis::AliXtAnalysis()
a5f56dc7 52 : AliAnalysisTaskSE(),
53 fOutputList(0x0),
54 fAnaUtils(0x0),
55 fCard(0x0),
56 fHistDir(0x0),
57 fHistos(0x0),
58 fhEvents(0x0),
59 //fEfficiency(0x0),
60 fChargedList(0x0),
61 fIsolatedChargedList(0x0),
62 fCentBin(-1),
63 fZBin(-1),
64 fZVert(999999.),
65 fevt(0),
66 fDebugMode(0)
072855d8 67{
a5f56dc7 68// Constructor
072855d8 69}
70//________________________________________________________________________
71AliXtAnalysis::AliXtAnalysis(const char *name, const char * cardname)
a5f56dc7 72 : AliAnalysisTaskSE(name),
072855d8 73 fOutputList(0x0),
74 fAnaUtils(0x0),
a5f56dc7 75 fCard(0x0),
76 fHistDir(0x0),
072855d8 77 fHistos(0x0),
a5f56dc7 78 fhEvents(0x0),
072855d8 79 //fEfficiency(0x0),
80 fChargedList(0x0),
81 fIsolatedChargedList(0x0),
a5f56dc7 82 fCentBin(-1),
83 fZBin(-1),
84 fZVert(999999.),
072855d8 85 fevt(0),
86 fDebugMode(0)
87{
a5f56dc7 88 // All parameters of the analysis
89 fCard = new AliJCard(cardname);
90
91 cout << "debug: card created to address " << fCard << endl;
92
93 fCard->PrintOut();
94
072855d8 95 fAnaUtils = new AliAnalysisUtils();
96 fAnaUtils->SetUseOutOfBunchPileUp( kTRUE );
97 fAnaUtils->SetUseSPDCutInMultBins( kTRUE);
a5f56dc7 98
99 // Define input and output slots here
100 // Input slot #0 works with a TChain
101 DefineInput(0, TChain::Class());
102 // Output slot #0 writes into a TH1 container
103 DefineOutput(1, TList::Class());
104 // JHistos into TDirectory
105 DefineOutput(2, TDirectory::Class());
072855d8 106}
107//________________________________________________________________________
a5f56dc7 108AliXtAnalysis::AliXtAnalysis(const AliXtAnalysis& a)
109 : AliAnalysisTaskSE(a.GetName()),
072855d8 110 fOutputList(a.fOutputList),
111 fAnaUtils(a.fAnaUtils),
a5f56dc7 112 fCard(a.fCard),
113 fHistDir(a.fHistDir),
114 fHistos(a.fHistos),
115 fhEvents(a.fhEvents),
072855d8 116 //fEfficiency(a.fEfficiency),
117 fChargedList(a.fChargedList),
118 fIsolatedChargedList(a.fIsolatedChargedList),
a5f56dc7 119 fCentBin(-1),
120 fZBin(-1),
121 fZVert(999999.),
122 fevt(0),
123 fDebugMode(0)
072855d8 124{
125 //copy constructor
126 fhEvents = (TH1D*) a.fhEvents->Clone(a.fhEvents->GetName());
127}
128//________________________________________________________________________
129AliXtAnalysis& AliXtAnalysis::operator = (const AliXtAnalysis& ap){
130 // assignment operator
131 this->~AliXtAnalysis();
132 new(this) AliXtAnalysis(ap);
133 return *this;
134}
135//________________________________________________________________________
136AliXtAnalysis::~AliXtAnalysis() {
137 // destructor
138 delete fOutputList;
139 delete [] fAnaUtils;
140 delete [] fhEvents;
141 delete fHistos;
142 //delete fEfficiency;
143 delete fCard;
144 delete fChargedList;
145 delete fIsolatedChargedList;
146}
147//________________________________________________________________________
148void AliXtAnalysis::UserCreateOutputObjects(){
149 // Create histograms
150 // Called once
151
152 cout<<"\n=============== CARD =============="<<endl;
153 fCard->PrintOut();
154 cout<<"===================================\n"<<endl;
155
156 fhEvents = new TH1D("hEvents","events passing cuts", 11, -0.5, 10.5 );
157 fhEvents->SetXTitle( "0 - all, 1 - pileup, 2 - kMB selected, 3 - has vertex, 4 - good vertex, 5 - MB + good vertex, 6 - MB + good vertex + centrality" );
158 fhEvents->Sumw2();
159
160 fOutputList = new TList();
161 fOutputList->SetOwner(kTRUE);
162 //for any MC track filled with MC pt
163 fOutputList->Add(fhEvents);
164
165 fChargedList = new TObjArray;
166 fChargedList->SetOwner(kTRUE);
167 fIsolatedChargedList = new TObjArray;
168
169 PostData(1, fOutputList);
170
171 bool orignalTH1AdddirectoryStatus=TH1::AddDirectoryStatus();
172 TH1::AddDirectory(kTRUE);
173 if( !orignalTH1AdddirectoryStatus ) cout<<"DEBUG : TH1::AddDirectory is turned on"<<endl;
a5f56dc7 174 //TFile * file2 = OpenFile(2);
072855d8 175
176 fHistDir=gDirectory;
177 fHistos = new AliJXtHistos(fCard);
178 fHistos->CreateXtHistos();
179
180 PostData(2, fHistDir);
181 TH1::AddDirectory( orignalTH1AdddirectoryStatus );
182 cout<<"DEBUG : TH1::AddDirectory get orignal Value = "<<( orignalTH1AdddirectoryStatus?"True":"False" )<<endl;
183
184 //fEfficiency = new AliJEfficiency();
185
186 fevt = 0;
187}
188//________________________________________________________________________
189void AliXtAnalysis::UserExec(Option_t *) {
190
191 // Main loop - called for each event
192
193 fevt++;
194 if(fevt % 10000 == 0) cout << "Number of event scanned = "<< fevt << endl;
195
196 Int_t filterBit = AliAODTrack::kTrkGlobal; //fCard->Get("TrackFilterBit");
197
198 AliVEvent *event = InputEvent();
199 if(!event) return;
200
201 // check if the event was triggered or not and vertex
202 if( !IsGoodEvent( event ) ) return; // fZBin is set there
203 fhEvents->Fill( 5 );
204 if(fDebugMode > 0) cout << "zvtx = " << fZVert << endl;
205
206 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(event);
207 if(!aodEvent) return;
208
209 // centrality - in case of pPb and PbPb, dictated by DataType in the card
210 double fcent;
211 if( fCard->Get("DataType") > 0.5 ){
212 AliCentrality *cent = event->GetCentrality();
213 if( ! cent ) return;
214 fcent = cent->GetCentralityPercentile("V0M");
215 fCentBin = fCard->GetBin(kCentrType, fcent);;
216 //cout <<"Centrality = "<< fcent <<"\t"<< fCentBin << endl;
217 }else{
218 fcent = 0.0;
219 fCentBin = 0;
220 }
221
222 if(fCentBin<0) return;
223 fhEvents->Fill( 6 );
224 Int_t nt = aodEvent->GetNumberOfTracks();
225
226 fHistos->FillCentralityHistos(fcent, fCentBin);
227
228 // clear them up for every event
229 fChargedList->Clear();
230 fIsolatedChargedList->Clear();
231
232 // Is there a better way than hard code this into card???
233 double sqrts = fCard->Get("Sqrts");
234
235 // Isolation method: 0 = relative, 1 = absolute
236 double isolMethod = fCard->Get("IsolationMethod");
237
238 // Minimum isolation pT that is considered
239 double minIsolationPt = fCard->Get("MinimumIsolatedPt");
240
241 // Dummy numbers; either of these is updated based on selected method (other is void)
242 double isolationFraction = 99999.;
243 double isolationThreshold = 99999.;
244
245 if( isolMethod > 0.5 ){
246 isolationThreshold = fCard->Get("IsolationThreshold"); // this is fixed threshold
247 }else{
248 isolationFraction = fCard->Get("IsolationFraction"); // fraction in pT, threshold updated later in a loop
249 }
250
251 // Isolation radius
252 double isolR = fCard->Get("IsolationRadius");
253
254 // Get good tracks to the list
255 for(Int_t it = 0; it < nt; it++) {
319e6239 256 AliAODTrack *track = dynamic_cast<AliAODTrack*>(aodEvent->GetTrack(it));
072855d8 257 if( !track ) continue;
258 if( !track->TestFilterBit(filterBit) ) continue;
259 double eta = track->Eta();
260 if( !fCard->IsInEtaRange( eta ) ) continue; // Do not use fiducial cut here
261 AliAODTrack *acceptedTrack = new AliAODTrack( *track );
262 double pT = acceptedTrack->Pt();
263 double xT = 2.*pT/sqrts;
264 double phi = acceptedTrack->Phi();
265
266 // TODO:
267 double effCorr = 1.0;
268
269 // Fill histos
270 fHistos->FillInclusiveHistograms(pT, xT, eta, phi, effCorr, fCentBin);
271
272 // Add an accepted track into list of inclusive charged particles
273 fChargedList->Add( acceptedTrack );
274 }
275
276 // Check isolation of the found good tracks
277 Int_t nAcc = fChargedList->GetEntriesFast();
278
279 // Get eta range for fiducial cut
280 double etaRange = fCard->Get("EtaRange");
281
282 for( Int_t it = 0; it < nAcc; it++ ){
283 AliAODTrack *track = (AliAODTrack*)fChargedList->At(it);
284 // Fiducial eta cut for isolated particles
285 double eta = track->Eta();
286 if( abs(eta) > etaRange - isolR ) continue;
287
288 // To check the isolation with cone, use TLorentzVector -routines
289 TLorentzVector lvTrack = TLorentzVector( track->Px(), track->Py(), track->Pz(), track->P() );
290
291 // Set isolation threshold, if relative isolation
292 double pT = lvTrack.Pt();
293 if( pT < minIsolationPt ) continue;
294 if( isolMethod < 0.5 ) isolationThreshold = pT * isolationFraction; // here: relative isolation
295
296 // Isolation check
297 double sum = 0.0;
298 for( Int_t ia = 0; ia < nAcc; ia++ ){
299 if( ia == it ) continue; // Do not count the particle itself
300 AliAODTrack *assocTrack = (AliAODTrack*)fChargedList->At(ia);
301 TLorentzVector lvAssoc = TLorentzVector( assocTrack->Px(), assocTrack->Py(), assocTrack->Pz(), assocTrack->P() );
302 if( lvTrack.DeltaR( lvAssoc ) < isolR ) sum += lvAssoc.Pt();
303 }
304
305 // Cone activity
306 fHistos->FillInclusiveConeActivities(pT,sum); // efficiency correction?
307
308 // If the particle was isolated, fill histograms and the list
309 if( sum < isolationThreshold ){
310
311 double xT = 2.*pT/sqrts;
312
313 if( fDebugMode > 0 ){
314 cout << "DEBUG: isolated particle found " << endl;
315 cout << "fCentBin = " << fCentBin << ", pT = " << pT << ", xT = " << xT << " and eta = " << eta << endl;
316 }
317
318 fHistos->FillIsolatedConeActivities(pT, sum); // efficiency correction?
319
320 // TODO:
321 double effCorr = 1.0;
322
323 // Fill histos
324 fHistos->FillIsolatedHistograms(pT, xT, eta, track->Phi(), effCorr, fCentBin);
325
326 // Add tracks to the isolated list
327 AliAODTrack *acceptedIsolatedTrack = new AliAODTrack( *track );
328 fIsolatedChargedList->Add( acceptedIsolatedTrack );
329 }
330 }
331
332 // For further analysis, there is now lists of all charged and isolated charged available, will be usefull.
333
334 return; // END
335}
336//________________________________________________________________________
337void AliXtAnalysis::Terminate(Option_t *)
338{
072855d8 339 cout<<"Successfully finished"<<endl;
340}
341//________________________________________________________________________
342bool AliXtAnalysis::IsGoodEvent(AliVEvent *event) {
343
344 // This function checks that the event has the requested trigger
345 // and that the z-vertex is in given range
346
347
348 fhEvents->Fill( 0 );
349
350 if(fAnaUtils->IsPileUpEvent(event)) {
351 return kFALSE;
352 } else {
353 Bool_t triggeredEventMB = kFALSE; //init
354
355 fhEvents->Fill( 1 );
356
357 Bool_t triggerkMB = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & ( AliVEvent::kMB );
358
359 if( triggerkMB ){
360 triggeredEventMB = kTRUE; //event triggered as minimum bias
361 fhEvents->Fill( 2 );
362 }
363 //--------------------------------------------------------------
364 // check reconstructed vertex
365 int ncontributors = 0;
366 Bool_t goodRecVertex = kFALSE;
367 const AliVVertex *vtx = event->GetPrimaryVertex();
368 if(vtx){
369 fhEvents->Fill( 3 );
370 fZVert = vtx->GetZ();
371 fHistos->FillRawVertexHisto(fZVert);
372 ncontributors = vtx->GetNContributors();
373 if(ncontributors > 0){
374 if(fCard->VertInZRange(fZVert)) {
375 goodRecVertex = kTRUE;
376 fhEvents->Fill( 4 );
377 fHistos->FillAcceptedVertexHisto(fZVert, fCentBin);
378 fZBin = fCard->GetBin(kZVertType, fZVert);
379 }
380 }
381 }
382 return triggerkMB && goodRecVertex;
383 }
384 //---------------------------------
385}