]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGPP/TPC/AliPerformancePtCalibMC.cxx
Merge branch 'master', remote branch 'origin' into TPCdev
[u/mrichter/AliRoot.git] / PWGPP / TPC / AliPerformancePtCalibMC.cxx
CommitLineData
4060dd2d 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-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 **************************************************************************/
ba06aaec 15//------------------------------------------------------------------------------
16// Implementation of AliPerformancePtCalibMC class. It compares ESD, TPC track
4060dd2d 17// momenta with MC information to study charge/pt spectra.
18// The output can be analysed with AliPerfAnalyzeInvPt via AliPerformancePtCalibMC::Analyse():
19// Projection of charge/pt vs theta and vs phi resp. histoprams will be fitted with either
20// polynomial or gaussian fit function to extract minimum position of charge/pt.
ba06aaec 21// Fit options and theta, phi bins can be set by user.
4060dd2d 22// Attention: use the Set functions of AliPerformancePtCalibMC when running
ba06aaec 23// AliPerformancePtCalibMC::Analyse()
24// The result of the analysis (histograms/graphs) are stored in the folder which is
4060dd2d 25// a data member of AliPerformancePtCalibMC.
ba06aaec 26//
27// Author: S.Schuchmann 11/13/2009
28//------------------------------------------------------------------------------
29
30/*
31
4060dd2d 32// after running the performance task, read the file, and get component
ba06aaec 33
34TFile f("Output.root");
4060dd2d 35AliPerformancePtCalibMC *compObj = (AliPerformancePtCalibMC*)coutput->FindObject("AliPerformancePtCalibMC");
ba06aaec 36
4060dd2d 37// set phi and theta bins for fitting and analyse comparison data
38compObj->SetProjBinsTheta(thetaBins,nThetaBins,minPhi, maxPhi);
39compObj->SetProjBinsPhi(phiBins,nPhiBins,minTheta,maxTheta);
40compObj->SetMakeFitOption(kFALSE,exclRange,fitRange);
41compObj->SetDoRebin(rebin);
42//compObj->SetAnaMCOff();
ba06aaec 43compObj->Analyse();
4060dd2d 44//details see functions of this class
ba06aaec 45
46// the output histograms/graphs will be stored in the folder "folderRes"
47compObj->GetAnalysisFolder()->ls("*");
48
49// user can save whole comparison object (or only folder with anlysed histograms)
50// in the seperate output file (e.g.)
51TFile fout("Analysed_InvPt.root","recreate");
52compObj->Write(); // compObj->GetAnalysisFolder()->Write();
53fout.Close();
54
55*/
56
57
acb9d358 58#include "TH1F.h"
59#include "TH2F.h"
4060dd2d 60#include "THnSparse.h"
ba06aaec 61#include "TList.h"
acb9d358 62#include "TMath.h"
ba06aaec 63#include "TFolder.h"
acb9d358 64
acb9d358 65#include "AliESDEvent.h"
acb9d358 66#include "AliESDtrack.h"
67#include "AliESDtrackCuts.h"
acb9d358 68#include "AliMCEvent.h"
69#include "AliStack.h"
ba06aaec 70#include "AliESDfriendTrack.h"
71#include "AliESDfriend.h"
acb9d358 72
73#include "AliPerformancePtCalibMC.h"
74#include "AliPerfAnalyzeInvPt.h"
ba06aaec 75
acb9d358 76
77using namespace std;
78
79ClassImp(AliPerformancePtCalibMC)
80
81//________________________________________________________________________
4823e4d4 82AliPerformancePtCalibMC::AliPerformancePtCalibMC(const char *name, const char *title):
acb9d358 83 AliPerformanceObject(name,title),
ba06aaec 84 // option parameter for AliPerformancePtCalibMC::Analyse()
acb9d358 85 fNThetaBins(0),
41fefc69 86 fNPhiBins(0),
87 fMaxPhi(0),
88 fMinPhi(0),
89 fMaxTheta(0),
90 fMinTheta(0),
91 fRange(0),
92 fExclRange(0),
93 fFitGaus(0) ,
94 fDoRebin(0),
95 fRebin(0),
96 fAnaMC(0),
97 // option parameter for user defined charge/pt shift
98 fShift(0),
99 fDeltaInvP(0),
100 //options for cuts
101 fOptTPC(0),
102 fESDcuts(0),
bf34559d 103 fPions(0),
41fefc69 104 fEtaAcceptance(0),
105 fCutsRC(0),
106 fCutsMC(0),
107 fList(0),
4060dd2d 108
41fefc69 109 // histograms
110 fHistInvPtPtThetaPhi(0),
111 fHistPtShift0(0),
112 fHistPrimaryVertexPosX(0),
113 fHistPrimaryVertexPosY(0),
114 fHistPrimaryVertexPosZ(0),
115 fHistTrackMultiplicity(0),
116 fHistTrackMultiplicityCuts(0),
117 fHistTPCMomentaPosP(0),
118 fHistTPCMomentaNegP(0),
119 fHistTPCMomentaPosPt(0),
120 fHistTPCMomentaNegPt(0),
121 fHistInvPtPtThetaPhiMC(0),
122 fHistInvPtMCESD(0),
123 fHistInvPtMCTPC(0),
124 fHistPtMCESD(0),
125 fHistPtMCTPC(0),
126 fHistMomresMCESD(0),
127 fHistMomresMCTPC(0),
128 fHistTPCMomentaPosInvPtMC(0),
129 fHistTPCMomentaNegInvPtMC(0),
130 fHistTPCMomentaPosPtMC(0),
131 fHistTPCMomentaNegPtMC(0),
132 fHistESDMomentaPosInvPtMC(0),
133 fHistESDMomentaNegInvPtMC(0),
134 fHistESDMomentaPosPtMC(0),
135 fHistESDMomentaNegPtMC(0),
136 fHistUserPtShift(0),
bf34559d 137 fHistdedxPions(0),
41fefc69 138 //esd track cuts
139 fESDTrackCuts(0),
140 // analysis folder
141 fAnalysisFolder(0)
acb9d358 142{
4060dd2d 143 // Dummy constructor
144
145
ba06aaec 146 fShift = kFALSE; // shift in charge/pt yes/no
147 fDeltaInvP = 0.00; // shift value
acb9d358 148 //options for cuts
4060dd2d 149
acb9d358 150 fOptTPC = kTRUE; // read TPC tracks yes/no
4060dd2d 151 fESDcuts = kFALSE;
bf34559d 152 fPions = kFALSE;
acb9d358 153 fCutsRC = NULL;
154 fCutsMC = NULL;
4060dd2d 155
ba06aaec 156 fEtaAcceptance = 0.8;
ba06aaec 157
158 // options for function AliPerformancePtCalibMC::Analyse()
159 fFitGaus = kFALSE;// use gaussian function for fitting charge/pt yes/no
160 fNThetaBins = 0; //number of theta bins
161 fNPhiBins = 0; //number of phi bins
4060dd2d 162 fMaxPhi = 6.5;// max phi for 2D projection on theta and charge/pt axis
163 fMinPhi = 0.0;// min phi for 2D projection on theta and charge/pt axis
164 fMaxTheta = 3.0;// max theta for 2D projection on phi and charge/pt axis
165 fMinTheta = 0.0;// min theta for 2D projection on phi and charge/pt axis
ba06aaec 166 fRange = 0; //fit range around 0
167 fExclRange =0; //range of rejection of points around 0
168 fAnaMC = kTRUE; // analyse MC tracks yes/no
4060dd2d 169 fDoRebin = kFALSE;// flag for rebin
170 fRebin = 0;// bins for rebin
171
18e588e9 172 for (Int_t i=0; i<100; i++){
173 fThetaBins[i] = 0;
174 fPhiBins[i] = 0;
175 }
176
acb9d358 177 Init();
178}
179
180//________________________________________________________________________
181AliPerformancePtCalibMC::~AliPerformancePtCalibMC() {
ba06aaec 182 //
183 // destructor
184 //
4060dd2d 185
186 if(fList) delete fList;
187 // histograms
188 if(fHistInvPtPtThetaPhi) delete fHistInvPtPtThetaPhi;fHistInvPtPtThetaPhi=0;
189 if(fHistPtShift0) delete fHistPtShift0;fHistPtShift0=0;
190 if(fHistPrimaryVertexPosX) delete fHistPrimaryVertexPosX;fHistPrimaryVertexPosX=0;
191 if(fHistPrimaryVertexPosY) delete fHistPrimaryVertexPosY;fHistPrimaryVertexPosY=0;
192 if(fHistPrimaryVertexPosZ) delete fHistPrimaryVertexPosZ;fHistPrimaryVertexPosZ=0;
193 if(fHistTrackMultiplicity) delete fHistTrackMultiplicity;fHistTrackMultiplicity=0;
194 if(fHistTrackMultiplicityCuts) delete fHistTrackMultiplicityCuts;fHistTrackMultiplicityCuts=0;
195
196 if(fHistTPCMomentaPosP) delete fHistTPCMomentaPosP;fHistTPCMomentaPosP=0;
197 if(fHistTPCMomentaNegP) delete fHistTPCMomentaNegP;fHistTPCMomentaNegP=0;
198 if(fHistTPCMomentaPosPt) delete fHistTPCMomentaPosPt;fHistTPCMomentaPosPt=0;
199 if(fHistTPCMomentaNegPt) delete fHistTPCMomentaNegPt ;fHistTPCMomentaNegPt=0;
200 if(fHistUserPtShift) delete fHistUserPtShift;fHistUserPtShift=0;
201 if(fHistInvPtPtThetaPhiMC) delete fHistInvPtPtThetaPhiMC;fHistInvPtPtThetaPhiMC=0;
202 if(fHistInvPtMCESD) delete fHistInvPtMCESD;fHistInvPtMCESD=0;
203 if(fHistInvPtMCTPC) delete fHistInvPtMCTPC;fHistInvPtMCTPC=0;
204 if(fHistPtMCESD) delete fHistPtMCESD;fHistPtMCESD=0;
205 if(fHistPtMCTPC) delete fHistPtMCTPC;fHistPtMCTPC=0;
206 if(fHistMomresMCESD) delete fHistMomresMCESD;fHistMomresMCESD=0;
207 if(fHistMomresMCTPC) delete fHistMomresMCTPC;fHistMomresMCTPC=0;
208 if(fHistTPCMomentaPosInvPtMC) delete fHistTPCMomentaPosInvPtMC;fHistTPCMomentaPosInvPtMC=0;
209 if(fHistTPCMomentaNegInvPtMC) delete fHistTPCMomentaNegInvPtMC;fHistTPCMomentaNegInvPtMC=0;
210 if(fHistTPCMomentaPosPtMC) delete fHistTPCMomentaPosPtMC;fHistTPCMomentaPosPtMC=0;
211 if(fHistTPCMomentaNegPtMC) delete fHistTPCMomentaNegPtMC;fHistTPCMomentaNegPtMC=0;
212 if(fHistESDMomentaPosInvPtMC) delete fHistESDMomentaPosInvPtMC;fHistESDMomentaPosInvPtMC=0;
213 if(fHistESDMomentaNegInvPtMC) delete fHistESDMomentaNegInvPtMC;fHistESDMomentaNegInvPtMC=0;
214 if(fHistESDMomentaPosPtMC) delete fHistESDMomentaPosPtMC;fHistESDMomentaPosPtMC=0;
215 if(fHistESDMomentaNegPtMC) delete fHistESDMomentaNegPtMC;fHistESDMomentaNegPtMC=0;
bf34559d 216 if(fHistdedxPions) delete fHistdedxPions;fHistdedxPions=0;
4060dd2d 217
218
219 //esd track cuts
220 if(fESDTrackCuts) delete fESDTrackCuts;
221 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
222
223
224
acb9d358 225}
226
227//________________________________________________________________________
228void AliPerformancePtCalibMC::Init()
229{
230 // Create histograms
231 // Called once
232
233 fList = new TList();
234
235 // init folder
236 fAnalysisFolder = CreateFolder("folderPt_TPC","Analysis Pt Resolution Folder");
aa4776c7 237
acb9d358 238 // Primary Vertex:
239 fHistPrimaryVertexPosX = new TH1F("fHistPrimaryVertexPosX", "Primary Vertex Position X;Primary Vertex Position X (cm);Events",100,-0.5,0.5);
240 fList->Add(fHistPrimaryVertexPosX);
241 fHistPrimaryVertexPosY = new TH1F("fHistPrimaryVertexPosY", "Primary Vertex Position Y;Primary Vertex Position Y (cm);Events",100,-0.5,0.5);
242 fList->Add(fHistPrimaryVertexPosY);
243 fHistPrimaryVertexPosZ = new TH1F("fHistPrimaryVertexPosZ", "Primary Vertex Position Z;Primary Vertex Position Z (cm);Events",200,-2.0,2.0);
244 fList->Add(fHistPrimaryVertexPosZ);
245
246 // Multiplicity:
247 fHistTrackMultiplicity = new TH1F("fHistTrackMultiplicity", "Multiplicity distribution;Number of tracks;Events", 250, 0, 250);
248 fList->Add(fHistTrackMultiplicity);
249 fHistTrackMultiplicityCuts = new TH1F("fHistTrackMultiplicityCuts", "Multiplicity distribution;Number of tracks after cuts;Events", 250, 0, 250);
250 fList->Add(fHistTrackMultiplicityCuts);
251
252 // momentum histos
4060dd2d 253 fHistPtShift0 = new TH1F("fHistPtShift0","1/pt dN/pt vs. pt of ESD track ",800,-20.0,20.0);
acb9d358 254 fList->Add(fHistPtShift0);
4060dd2d 255 const Int_t invPtDims = 4;
aa4776c7 256 fMaxPhi=6.52;
4060dd2d 257 fMinPhi=0.0;
258 fMaxTheta=3.0;
259 fMinTheta=0.0;
260 Double_t xminInvPt[invPtDims] = {-4.5,-20.0,fMinTheta,fMinPhi};
261 Double_t xmaxInvPt[invPtDims] = {4.5,20.0,fMaxTheta,fMaxPhi};
aa4776c7 262 Int_t binsInvPt[invPtDims] = {450,400,150,163};
4060dd2d 263
264 fHistInvPtPtThetaPhi = new THnSparseF("fHistInvPtPtThetaPhi","1/pt vs pt vs #theta vs #phi ",invPtDims,binsInvPt,xminInvPt,xmaxInvPt);
265 fList->Add(fHistInvPtPtThetaPhi);
266
267 // momentum test histos
acb9d358 268 fHistTPCMomentaPosP = new TH2F("fHistTPCMomentaPosP","TPC p vs global esd track p pos",300,0.0,15.0,300,0.0,15.0);
269 fList->Add(fHistTPCMomentaPosP);
270 fHistTPCMomentaNegP = new TH2F("fHistTPCMomentaNegP","TPC p vs global esd track p neg",300,0.0,15.0,300,0.0,15.0);
271 fList->Add(fHistTPCMomentaNegP);
272 fHistTPCMomentaPosPt = new TH2F("fHistTPCMomentaPosPt","TPC pt vs global esd track pt pos",300,0.0,15.0,300,0.0,15.0);
273 fList->Add(fHistTPCMomentaPosPt);
274 fHistTPCMomentaNegPt = new TH2F("fHistTPCMomentaNegPt","TPC pt vs global esd track pt neg",300,0.0,15.0,300,0.0,15.0);
275 fList->Add(fHistTPCMomentaNegPt);
276
4060dd2d 277 // momentum test histos MC
aa4776c7 278 fHistTPCMomentaPosInvPtMC = new TH2F("fHistTPCMomentaPosInvPtMC","TPC-MC of 1/pt vs global ESD-MC of 1/pt pos",250, -5.0, 5.0,250, -5.0,5.0);
acb9d358 279 fList->Add(fHistTPCMomentaPosInvPtMC);
aa4776c7 280 fHistTPCMomentaNegInvPtMC = new TH2F("fHistTPCMomentaNegInvPtMC","TPC-MC of 1/pt vs global ESD-MC 1/pt neg",250, -5.0, 5.0,250, -5.0, 5.0);
acb9d358 281 fList->Add(fHistTPCMomentaNegInvPtMC);
aa4776c7 282 fHistTPCMomentaPosPtMC = new TH2F("fHistTPCMomentaPosPtMC","(TPC-MC)/MC^2 of pt vs global (ESD-MC)/MC^2 of pt pos",200,-2.0,2.0,200,-2.0,2.0);
acb9d358 283 fList->Add(fHistTPCMomentaPosPtMC);
aa4776c7 284 fHistTPCMomentaNegPtMC = new TH2F("fHistTPCMomentaNegPtMC","(TPC-MC/)MC^2 of pt vs global (ESD-MC)/MC^2 of pt neg",200,-2.0,2.0,200,-2.0,2.0);
acb9d358 285 fList->Add(fHistTPCMomentaNegPtMC);
aa4776c7 286 fHistESDMomentaPosInvPtMC = new TH1F("fHistESDMomentaPosInvPtMC","ESD-MC of 1/pt pos ",200, -2.0, 2.0);
acb9d358 287 fList->Add(fHistESDMomentaPosInvPtMC);
aa4776c7 288 fHistESDMomentaNegInvPtMC = new TH1F("fHistESDMomentaNegInvPtMC","ESD-MC of 1/pt neg",200, -2.0, 2.0);
acb9d358 289 fList->Add(fHistESDMomentaNegInvPtMC);
aa4776c7 290 fHistESDMomentaPosPtMC = new TH1F("fHistESDMomentaPosPtMC","(ESD-MC)/MC^2 of pt pos",200,-2.0,2.0);
acb9d358 291 fList->Add(fHistESDMomentaPosPtMC);
aa4776c7 292 fHistESDMomentaNegPtMC = new TH1F("fHistESDMomentaNegPtMC","(ESD-MC)/MC^2 of pt neg",200,-2.0,2.0);
acb9d358 293 fList->Add(fHistESDMomentaNegPtMC);
294
4060dd2d 295 // MC only info
296 fHistInvPtPtThetaPhiMC = new THnSparseF("fHistInvPtPtThetaPhiMC","MC 1/pt vs pt vs #theta vs #phi ",invPtDims,binsInvPt,xminInvPt,xmaxInvPt);
297 fList->Add(fHistInvPtPtThetaPhiMC);
298
acb9d358 299
300 //correlation histos MC ESD or TPC
aa4776c7 301 fHistInvPtMCESD = new TH2F("fHistInvPtMCESD","inv pt ESD vs MC",450, -4.5, 4.5,450, -4.5, 4.5);
acb9d358 302 fList->Add(fHistInvPtMCESD);
aa4776c7 303 fHistPtMCESD = new TH2F("fHistPtMCESD"," pt ESD vs MC",500, 0.0, 50.0,500, 0.0, 50.0);
acb9d358 304 fList->Add(fHistPtMCESD);
aa4776c7 305 fHistInvPtMCTPC = new TH2F("fHistInvPtMCTPC","inv pt TPC vs MC",450, -4.5, 4.5,450, -4.5, 4.5);
acb9d358 306 fList->Add(fHistInvPtMCTPC);
aa4776c7 307 fHistPtMCTPC = new TH2F("fHistPtMCTPC"," pt TPC vs MC",500, 0.0, 50.0,500, 0.0,50.0);
acb9d358 308 fList->Add(fHistPtMCTPC);
aa4776c7 309 fHistMomresMCESD = new TH2F("fHistMomresMCESD"," (pt ESD - pt MC)/ptMC vs pt MC",500, 0.0, 50.0,200, -2.0, 2.0);
310 fList->Add(fHistMomresMCESD);
311 fHistMomresMCTPC = new TH2F("fHistMomresMCTPC"," (pt TPC - pt MC)/ptMC vs pt MC",500, 0.0, 50.0,200, -2.0, 2.0);
acb9d358 312 fList->Add(fHistMomresMCTPC);
313
314
315 //user pt shift check
316 fHistUserPtShift = new TH1F("fHistUserPtShift","user defined shift in 1/pt",100,-0.5,1.5);
317 fList->Add(fHistUserPtShift);
bf34559d 318 // pid
319 fHistdedxPions = new TH2F ("fHistdedxPions","dEdx of pions ident. via PDG code vs signed Pt",300,-15.05,15.05,200,0.0,400.0);
320 fList->Add(fHistdedxPions);
321
acb9d358 322 // esd track cuts
aa4776c7 323 fESDTrackCuts =NULL;
4060dd2d 324
acb9d358 325
326}
327
328//________________________________________________________________________
ba06aaec 329void AliPerformancePtCalibMC::SetPtShift(const Double_t shiftVal ) {
330
331 //set user defined shift in charge/pt
332
333 if(shiftVal) { fShift=kTRUE; fDeltaInvP = shiftVal; }
acb9d358 334}
335
336//________________________________________________________________________
4060dd2d 337void AliPerformancePtCalibMC::Exec(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent, AliESDfriend *const /*esdFriend*/, const Bool_t /*bUseMC*/, const Bool_t /*bUseESDfriend*/)
acb9d358 338{
ba06aaec 339 //exec: read MC and esd or tpc tracks
340
4060dd2d 341 AliStack* stack = NULL;
acb9d358 342
ba06aaec 343 if (!esdEvent) {
344 Printf("ERROR: Event not available");
345 return;
346 }
347
aa4776c7 348
ba06aaec 349 fHistTrackMultiplicity->Fill(esdEvent->GetNumberOfTracks());
350
351 if (!mcEvent) {
352 Printf("ERROR: Could not retrieve MC event");
353 return;
354 }
355 stack = mcEvent->Stack();
356 if (!stack) {
357 Printf("ERROR: Could not retrieve stack");
358 return;
359 }
360
4060dd2d 361
4060dd2d 362 //vertex info for cut
41fefc69 363 //const AliESDVertex *vtx = esdEvent->GetPrimaryVertex();
364 //if (!vtx->GetStatus()) return ;
365
ba06aaec 366 if(fShift) fHistUserPtShift->Fill(fDeltaInvP);
acb9d358 367
ba06aaec 368 // read primary vertex info
369 Double_t tPrimaryVtxPosition[3];
370 // Double_t tPrimaryVtxCov[3];
371 const AliESDVertex *primaryVtx = esdEvent->GetPrimaryVertexTPC();
acb9d358 372
ba06aaec 373 tPrimaryVtxPosition[0] = primaryVtx->GetXv();
374 tPrimaryVtxPosition[1] = primaryVtx->GetYv();
375 tPrimaryVtxPosition[2] = primaryVtx->GetZv();
acb9d358 376
ba06aaec 377 fHistPrimaryVertexPosX->Fill(tPrimaryVtxPosition[0]);
378 fHistPrimaryVertexPosY->Fill(tPrimaryVtxPosition[1]);
379 fHistPrimaryVertexPosZ->Fill(tPrimaryVtxPosition[2]);
acb9d358 380
381
ba06aaec 382 //fill histos for pt spectra and shift of transverse momentum
383 Int_t count=0;
acb9d358 384
ba06aaec 385 for(Int_t j = 0;j<esdEvent->GetNumberOfTracks();j++){
386 AliESDtrack *esdTrack = esdEvent->GetTrack(j);
387 if(!esdTrack) continue;
acb9d358 388
389 //esd track cuts
4060dd2d 390 if(fESDcuts){
ba06aaec 391 if(!fESDTrackCuts->AcceptTrack(esdTrack)) continue;
392 }
4060dd2d 393
ba06aaec 394 // get MC info
395 Int_t esdLabel = esdTrack->GetLabel();
396 if(esdLabel<0) continue;
397 TParticle * partMC = stack->Particle(esdLabel);
398 if (!partMC) continue;
acb9d358 399
ba06aaec 400 // fill correlation histos MC ESD
401 Double_t pESD = esdTrack->GetP();
402 Double_t ptESD = esdTrack->GetSignedPt();
acb9d358 403
ba06aaec 404 if(!ptESD || !(partMC->Pt()) ) continue;
405 Double_t mcPt = partMC->Pt();
406 Double_t invPtMC = 1.0/mcPt;
407 Int_t signMC = partMC->GetPdgCode();
bf34559d 408
409 //pid
410 if(fPions && !(fabs(signMC)-211<0.001)) continue;// pions only
411
ba06aaec 412 //MC only
413 if(signMC>0) signMC = 1;
414 else signMC = -1;
415
4060dd2d 416 //fill MC information
417 Double_t thetaMC = partMC->Theta();
418 Double_t phiMC = partMC->Phi();
419
420 Double_t momAngMC[4] = {signMC*(fabs(invPtMC)),signMC*(fabs(mcPt)),thetaMC,phiMC};
421
422 // fill only if MC track is in eta acceptance of TPC in order to be compareable to TPC tracks
aa4776c7 423 if(fabs( partMC->Eta())< fEtaAcceptance) {
4060dd2d 424 fHistInvPtPtThetaPhiMC->Fill(momAngMC);
425
426 //correlation histos MC ESD
aa4776c7 427 fHistInvPtMCESD->Fill(signMC*(fabs(invPtMC)),1.0/ptESD);
4060dd2d 428 fHistPtMCESD->Fill(fabs(mcPt),fabs(ptESD));
429 }
aa4776c7 430
4060dd2d 431 // fill histos TPC or ESD
ba06aaec 432 if(fOptTPC){
433 //TPC tracks and MC tracks
434 const AliExternalTrackParam *tpcTrack = esdTrack->GetTPCInnerParam();
435 if(!tpcTrack) continue;
aa4776c7 436 if(fabs(tpcTrack->Eta())>= fEtaAcceptance) continue;
acb9d358 437
ba06aaec 438 Double_t signedPt = tpcTrack->GetSignedPt();
439 Double_t invPt = 0.0;
440 if(signedPt) {
441 invPt = 1.0/signedPt;
acb9d358 442
4060dd2d 443 fHistPtShift0->Fill(signedPt);//changed
acb9d358 444
4060dd2d 445 if(fShift){Printf("user shift of momentum SET to non zero value!");
ba06aaec 446 invPt += fDeltaInvP; //shift momentum for tests
447 if(invPt) signedPt = 1.0/invPt;
448 else continue;
449 }
acb9d358 450
acb9d358 451
aa4776c7 452 Double_t theta = tpcTrack->Theta();
453 Double_t phi = tpcTrack->Phi();
4060dd2d 454
455 Double_t momAng[4] = {invPt,signedPt,theta,phi};
456 fHistInvPtPtThetaPhi->Fill(momAng);
acb9d358 457
ba06aaec 458 //correlation histos MC TPC
aa4776c7 459 fHistInvPtMCTPC->Fill(signMC*(fabs(invPtMC)),invPt);
ba06aaec 460 fHistPtMCTPC->Fill(fabs(mcPt),fabs(signedPt));
acb9d358 461
ba06aaec 462 //compare to MC info
463 Double_t ptDiffESD = (fabs(ptESD)-fabs(mcPt))/pow(mcPt,2);
464 Double_t ptDiffTPC = (fabs(signedPt)-fabs(mcPt))/pow(mcPt,2);
465 Double_t invPtDiffESD = fabs(1.0/ptESD)-1.0/fabs(mcPt);
466 Double_t invPtDiffTPC = fabs(invPt)-1.0/fabs(mcPt);
4060dd2d 467 Double_t pTPC = tpcTrack->GetP();
aa4776c7 468
ba06aaec 469 if(esdTrack->GetSign()>0){//compare momenta ESD track and TPC track
470 fHistTPCMomentaPosP->Fill(fabs(pESD),fabs(pTPC));
471 fHistTPCMomentaPosPt->Fill(fabs(ptESD),fabs(signedPt));
472 fHistTPCMomentaPosInvPtMC->Fill(invPtDiffESD,invPtDiffTPC);
473 fHistTPCMomentaPosPtMC->Fill(ptDiffESD,ptDiffTPC);
474 }
475 else{
476 fHistTPCMomentaNegP->Fill(fabs(pESD),fabs(pTPC));
477 fHistTPCMomentaNegPt->Fill(fabs(ptESD),fabs(signedPt));
478 fHistTPCMomentaNegInvPtMC->Fill(invPtDiffESD,invPtDiffTPC);
479 fHistTPCMomentaNegPtMC->Fill(ptDiffESD,ptDiffTPC);
480 }
bf34559d 481 fHistdedxPions->Fill(signedPt,esdTrack->GetTPCsignal());
482 fHistMomresMCESD->Fill(fabs(mcPt),(fabs(ptESD)-fabs(mcPt))/fabs(mcPt));
483 fHistMomresMCTPC->Fill(fabs(mcPt),(fabs(signedPt)-fabs(mcPt))/fabs(mcPt));
ba06aaec 484 count++;
485 }
486 else continue;
acb9d358 487 }
acb9d358 488
aa4776c7 489 else{
490 // ESD tracks and MC tracks
491 if(fabs(esdTrack->Eta())>= fEtaAcceptance) continue;
492 Double_t invPt = 0.0;
acb9d358 493
aa4776c7 494 if(ptESD) {
495 invPt = 1.0/ptESD;
496 fHistPtShift0->Fill(ptESD);
acb9d358 497
aa4776c7 498 if(fShift){Printf("user shift of momentum SET to non zero value!");
499 invPt += fDeltaInvP; //shift momentum for tests
500 if(invPt) ptESD = 1.0/invPt;
501 else continue;
502 }
503
504 Double_t theta = esdTrack->Theta();
505 Double_t phi = esdTrack->Phi();
506
507 Double_t momAng[4] = {invPt,ptESD,theta,phi};
508 fHistInvPtPtThetaPhi->Fill(momAng);
509
510 //differences MC ESD tracks
511 Double_t ptDiffESD = (fabs(ptESD)-fabs(mcPt))/pow(mcPt,2);
512 Double_t invPtdiffESD = fabs(1.0/ptESD)-1.0/fabs(mcPt);
513 if(esdTrack->GetSign()>0){
514 fHistESDMomentaPosInvPtMC->Fill(invPtdiffESD);
515 fHistESDMomentaPosPtMC->Fill(ptDiffESD);
516 }
517 else{
518 fHistESDMomentaNegInvPtMC->Fill(invPtdiffESD);
519 fHistESDMomentaNegPtMC->Fill(ptDiffESD);
520 }
bf34559d 521 fHistdedxPions->Fill(ptESD,esdTrack->GetTPCsignal());
522 fHistMomresMCESD->Fill(fabs(mcPt),(fabs(ptESD)-fabs(mcPt))/fabs(mcPt));
aa4776c7 523 count++;
524 }
525 }
526}
acb9d358 527
aa4776c7 528fHistTrackMultiplicityCuts->Fill(count);
acb9d358 529
530}
531
acb9d358 532//______________________________________________________________________________________________________________________
533
534void AliPerformancePtCalibMC::Analyse()
535{
536
ba06aaec 537 // analyse charge/pt spectra in bins of theta and phi. Bins can be set by user
538
4060dd2d 539
540 THnSparseF *copyTHnSparseTheta;
541 THnSparseF *copyTHnSparsePhi;
542
543 if(fAnaMC){
544 Printf("AliPerformancePtCalibMC::Analyse: analysing MC!");
545 copyTHnSparseTheta = (THnSparseF*)fHistInvPtPtThetaPhiMC->Clone("copyTHnSparseThetaMC");
546 copyTHnSparsePhi = (THnSparseF*)fHistInvPtPtThetaPhiMC->Clone("copyTHnSparsePhiMC");
547 }
548 else {
549 Printf("AliPerformancePtCalibMC::Analyse: analysing ESD (reco)!");
550 copyTHnSparseTheta = (THnSparseF*)fHistInvPtPtThetaPhi->Clone("copyTHnSparseTheta");
551 copyTHnSparsePhi = (THnSparseF*)fHistInvPtPtThetaPhi->Clone("copyTHnSparsePhi");
552 }
553
554 copyTHnSparseTheta->GetAxis(3)->SetRangeUser(fMinPhi,fMaxPhi);
555 copyTHnSparsePhi->GetAxis(2)->SetRangeUser(fMinTheta,fMaxTheta);
556
557 TH2F *histInvPtTheta = (TH2F*)copyTHnSparseTheta->Projection(2,0);
558 TH2F *histInvPtPhi = (TH2F*)copyTHnSparsePhi->Projection(3,0);
559
ba06aaec 560 AliPerfAnalyzeInvPt *ana = new AliPerfAnalyzeInvPt("AliPerfAnalyzeInvPt","AliPerfAnalyzeInvPt");
18e588e9 561 if(!ana) return;
acb9d358 562
ba06aaec 563 TH1::AddDirectory(kFALSE);
acb9d358 564
ba06aaec 565 ana->SetProjBinsTheta(fThetaBins,fNThetaBins);
566 ana->SetProjBinsPhi(fPhiBins,fNPhiBins);
567 ana->SetMakeFitOption(fFitGaus,fExclRange,fRange);
4060dd2d 568 if(fDoRebin) ana->SetDoRebin(fRebin);
ba06aaec 569 TObjArray *aFolderObj = new TObjArray;
18e588e9 570 if(!aFolderObj) return;
4060dd2d 571
572 ana->StartAnalysis(histInvPtTheta,histInvPtPhi, aFolderObj);
573
ba06aaec 574 // export objects to analysis folder
575 fAnalysisFolder = ExportToFolder(aFolderObj);
acb9d358 576
ba06aaec 577 // delete only TObjArray
578 if(aFolderObj) delete aFolderObj;
579 if(ana) delete ana;
acb9d358 580
581}
582
583//______________________________________________________________________________________________________________________
584TFolder* AliPerformancePtCalibMC::ExportToFolder(TObjArray * array)
585{
ba06aaec 586 // recreate folder avery time and export objects to new one
587 //
588 AliPerformancePtCalibMC * comp=this;
589 TFolder *folder = comp->GetAnalysisFolder();
590
591 TString name, title;
592 TFolder *newFolder = 0;
593 Int_t i = 0;
594 Int_t size = array->GetSize();
595
596 if(folder) {
597 // get name and title from old folder
598 name = folder->GetName();
599 title = folder->GetTitle();
600
601 // delete old one
602 delete folder;
603
604 // create new one
605 newFolder = CreateFolder(name.Data(),title.Data());
606 newFolder->SetOwner();
607
608 // add objects to folder
609 while(i < size) {
610 newFolder->Add(array->At(i));
611 i++;
612 }
613 }
614
615 return newFolder;
acb9d358 616}
617
618//______________________________________________________________________________________________________________________
619Long64_t AliPerformancePtCalibMC::Merge(TCollection* const list)
620{
ba06aaec 621 // Merge list of objects (needed by PROOF)
acb9d358 622
ba06aaec 623 if (!list)
624 return 0;
acb9d358 625
ba06aaec 626 if (list->IsEmpty())
627 return 1;
acb9d358 628
ba06aaec 629 TIterator* iter = list->MakeIterator();
630 TObject* obj = 0;
acb9d358 631
ba06aaec 632 // collection of generated histograms
633 Int_t count=0;
634 while((obj = iter->Next()) != 0)
635 {
636 AliPerformancePtCalibMC* entry = dynamic_cast<AliPerformancePtCalibMC*>(obj);
637 if (!entry) continue;
4060dd2d 638 fHistInvPtPtThetaPhi->Add(entry->fHistInvPtPtThetaPhi);
639
640 fHistInvPtPtThetaPhiMC->Add(entry->fHistInvPtPtThetaPhiMC);
641
ba06aaec 642 fHistInvPtMCESD->Add(entry->fHistInvPtMCESD);
643 fHistPtMCESD->Add(entry->fHistPtMCESD);
644 fHistInvPtMCTPC->Add(entry->fHistInvPtMCTPC);
645 fHistPtMCTPC->Add(entry->fHistPtMCTPC);
646 fHistMomresMCESD->Add(entry->fHistMomresMCESD);
647 fHistMomresMCTPC->Add(entry->fHistMomresMCTPC);
648
649 fHistPtShift0->Add(entry->fHistPtShift0);
650 fHistPrimaryVertexPosX->Add(entry->fHistPrimaryVertexPosX);
651 fHistPrimaryVertexPosY->Add(entry->fHistPrimaryVertexPosY);
652 fHistPrimaryVertexPosZ->Add(entry->fHistPrimaryVertexPosZ);
653 fHistTrackMultiplicity->Add(entry->fHistTrackMultiplicity);
654 fHistTrackMultiplicityCuts->Add(entry->fHistTrackMultiplicityCuts);
acb9d358 655
ba06aaec 656 fHistTPCMomentaPosP->Add(entry->fHistTPCMomentaPosP);
657 fHistTPCMomentaNegP->Add(entry->fHistTPCMomentaNegP);
658 fHistTPCMomentaPosPt->Add(entry->fHistTPCMomentaPosPt);
659 fHistTPCMomentaNegPt->Add(entry->fHistTPCMomentaNegPt);
660 fHistTPCMomentaPosInvPtMC->Add(entry->fHistTPCMomentaPosInvPtMC);
661 fHistTPCMomentaNegInvPtMC->Add(entry->fHistTPCMomentaNegInvPtMC);
662 fHistTPCMomentaPosPtMC->Add(entry->fHistTPCMomentaPosPtMC);
663 fHistTPCMomentaNegPtMC->Add(entry->fHistTPCMomentaNegPtMC);
664 fHistESDMomentaPosInvPtMC->Add(entry->fHistESDMomentaPosInvPtMC);
665 fHistESDMomentaNegInvPtMC->Add(entry->fHistESDMomentaNegInvPtMC);
666 fHistESDMomentaPosPtMC->Add(entry->fHistESDMomentaPosPtMC);
667 fHistESDMomentaNegPtMC->Add(entry->fHistESDMomentaNegPtMC);
bf34559d 668 fHistdedxPions->Add(entry->fHistdedxPions);
ba06aaec 669 count++;
670 }
acb9d358 671
ba06aaec 672 return count;
acb9d358 673}
674
675//______________________________________________________________________________________________________________________
676TFolder* AliPerformancePtCalibMC::CreateFolder(TString name,TString title) {
ba06aaec 677 // create folder for analysed histograms
678 //
679 TFolder *folder = 0;
680 folder = new TFolder(name.Data(),title.Data());
acb9d358 681
ba06aaec 682 return folder;
acb9d358 683}
684
685
686// set variables for Analyse()
acb9d358 687//______________________________________________________________________________________________________________________
4060dd2d 688void AliPerformancePtCalibMC::SetProjBinsPhi(const Double_t *phiBinArray,const Int_t nphBins, const Double_t minTheta, const Double_t maxTheta){
ba06aaec 689 // set phi bins for Analyse()
4060dd2d 690 // set phi bins as array and set number of this array which is equal to number of bins analysed
691 // the last analysed bin will always be the projection from first to last bin in the array
ba06aaec 692 if(nphBins){
693 fNPhiBins = nphBins;
acb9d358 694
ba06aaec 695 for(Int_t k = 0;k<fNPhiBins;k++){
696 fPhiBins[k] = phiBinArray[k];
697 }
4060dd2d 698 Printf("AliPerformancePtCalibMC::SetProjBinsPhi: number of bins in phi set to %i",fNPhiBins);
699 }
700 else Printf("Warning AliPerformancePtCalibMC::SetProjBinsPhi: number of bins in phi NOT set!!! Default values are taken.");
701
702 if(fabs(minTheta-maxTheta)<0.001){
703 Printf("AliPerformancePtCalibMC::SetProjBinsPhi: theta range for projection for projection on phi and charge/pt is too small. whole range of theta selected.");
704 }
705 else{
706 Printf("AliPerformancePtCalibMC::SetProjBinsPhi: theta range for projection on phi and charge/pt is selected by user: %1.3f - %1.3f rad",minTheta,maxTheta);
707 fMinTheta = minTheta;
708 fMaxTheta = maxTheta;
acb9d358 709 }
acb9d358 710}
711//____________________________________________________________________________________________________________________________________________
4060dd2d 712void AliPerformancePtCalibMC::SetProjBinsTheta(const Double_t *thetaBinArray, const Int_t nthBins, const Double_t minPhi, const Double_t maxPhi){
ba06aaec 713 // set theta bins for Analyse()
4060dd2d 714 // set theta bins as array and set number of this array which is equal to number of bins analysed
715 // the last analysed bin will always be the projection from first to last bin in the array
ba06aaec 716 if(nthBins){
717 fNThetaBins = nthBins;
718 for(Int_t k = 0;k<fNThetaBins;k++){
719 fThetaBins[k] = thetaBinArray[k];
720 }
4060dd2d 721 Printf("AliPerformancePtCalibMC::SetProjBinsTheta: number of bins in theta set to %i",fNThetaBins);
722 }
723 else Printf("Warning AliPerformancePtCalibMC::SetProjBinsTheta: number of bins in theta NOT set!!! Default values are taken.");
724
725 if(fabs(minPhi-maxPhi)<0.001){
726 Printf("AliPerformancePtCalibMC::SetProjBinsTheta: phi range for projection for projection on theta and charge/pt is too small. whole range of phi selected.");
727 }
728 else{
729 Printf("AliPerformancePtCalibMC::SetProjBinsTheta: phi range for projection on theta and charge/pt is selected by user: %1.3f - %1.3f rad",minPhi,maxPhi);
730 fMinPhi = minPhi;
731 fMaxPhi = maxPhi;
acb9d358 732 }
acb9d358 733}
4060dd2d 734
acb9d358 735//____________________________________________________________________________________________________________________________________________
736void AliPerformancePtCalibMC::SetMakeFitOption(const Bool_t setGausFit, const Double_t exclusionR,const Double_t fitR ){
737
4060dd2d 738 // set the fit options:
739 // for usage of gaussian function instead of polynomial (default) set setGausFit=kTRUE
740 // set the range of rejection of points around 0 via exclusionR
741 // set the fit range around 0 with fitR
acb9d358 742
743 fFitGaus = setGausFit;
744 fExclRange = exclusionR;
745 fRange = fitR;
746
4060dd2d 747 if(fFitGaus) Printf("AliPerformancePtCalibMC::SetMakeFitOption: set MakeGausFit with fit range %2.3f and exclusion range in fabs(1/pt): %2.3f",fRange,fExclRange);
748 else Printf("AliPerformancePtCalibMC::SetMakeFitOption: set standard polynomial fit with fit range %2.3f and exclusion range in fabs(1/pt): %2.3f",fRange,fExclRange);
acb9d358 749
750}