]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/RESONANCES/extra/AliXiStar.cxx
Changed AliAODEvent::GetTrack to return AliVTrack* (and not AliAODTrack)
[u/mrichter/AliRoot.git] / PWGLF / RESONANCES / extra / AliXiStar.cxx
CommitLineData
3311ad64 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 **************************************************************************/
15
16////////////////////////////////////////////////////////////////////////////////
17//
18// This class is used to reconstruct the neutral Xi(1530) resonance.
19// This class essentially combines charged Xi candidates from the Xi Vertexer
20// with primary charged pions.
21//
22// authors: Dhevan Gangadharan (dhevan.raja.gangadharan@cern.ch)
23//
24////////////////////////////////////////////////////////////////////////////////
25
26
27
28#include <iostream>
29#include <math.h>
30#include "TChain.h"
31#include "TFile.h"
32#include "TKey.h"
33#include "TObject.h"
34#include "TObjString.h"
35#include "TList.h"
36#include "TTree.h"
37#include "TH1F.h"
38#include "TH1D.h"
39#include "TH2D.h"
40#include "TH3D.h"
41#include "TProfile.h"
42#include "TCanvas.h"
43
44#include "AliAnalysisTask.h"
45#include "AliAnalysisManager.h"
46
47
48#include "AliESDEvent.h"
49#include "AliESDInputHandler.h"
50#include "AliESDtrackCuts.h"
51#include "AliMCEventHandler.h"
52#include "AliMCEvent.h"
53#include "AliStack.h"
54
55#include "AliAODEvent.h"
56#include "AliAODInputHandler.h"
57#include "AliAODMCParticle.h"
58#include "AliAODcascade.h"
59#include "AliESDcascade.h"
60#include "AliV0vertexer.h"
61#include "AliCascadeVertexer.h"
62
63#include "AliXiStar.h"
64
65#define PI 3.1415927
66
67
68// Author: Dhevan Gangadharan
69
70ClassImp(AliXiStar)
71
72//________________________________________________________________________
73AliXiStar::AliXiStar():
74AliAnalysisTaskSE(),
75 fname(0),
76 fAOD(0x0),
77 fESD(0x0),
78 fOutputList(0x0),
79 fTrackCut(0x0),
80 fPIDResponse(0x0),
81 fEC(0x0),
82 fEvt(0x0),
83 fTempStruct(0x0),
84 fZvertexBins(0),
85 fEventsToMix(0),
86 fMultBins(0),
3311ad64 87 fMCcase(0),
88 fAODcase(0),
89 fEventCounter(0),
3311ad64 90 fMaxDecayLength(0),
3311ad64 91 fMassWindow(0),
3311ad64 92 fTrueMassPr(0),
93 fTrueMassPi(0),
94 fTrueMassK(0),
95 fTrueMassLam(0),
96 fTrueMassXi(0),
97 fESDTrack4(0x0),
98 fXiTrack(0x0),
0a21e6f4 99 fCutList(0)
3311ad64 100{
0a21e6f4 101 // Default Constructor
102 for (Int_t i=0; i<21; i++){
103 fCovMatrix[i]=-99999.;
104 if (i<12) fMultLimits[i] = 0;
105 }
106 for (Int_t i=0; i<kNCuts; i++){
107 fDecayParameters[i]=0;
108 for (Int_t j=0; j<kNCutVariations; j++){
109 fCutValues[j][i]=0;
110 }
111 }
112 //
113 for (Int_t cv=0; cv<kNCutVariations; cv++){
114 CutVar[cv].fXi=0x0;
115 CutVar[cv].fXibar=0x0;
116 CutVar[cv].fXiMinusPiPlus=0x0;
117 CutVar[cv].fXiMinusPiMinus=0x0;
118 CutVar[cv].fXiPlusPiPlus=0x0;
119 CutVar[cv].fXiPlusPiMinus=0x0;
120 //
121 CutVar[cv].fXiMinusPiPlusbkg=0x0;
122 CutVar[cv].fXiMinusPiMinusbkg=0x0;
123 CutVar[cv].fXiPlusPiPlusbkg=0x0;
124 CutVar[cv].fXiPlusPiMinusbkg=0x0;
125 //
126 CutVar[cv].fMCrecXi=0x0;
127 CutVar[cv].fMCrecXibar=0x0;
128 CutVar[cv].fMCrecXiMinusPiPlus=0x0;
129 CutVar[cv].fMCrecXiPlusPiMinus=0x0;
130 }
131
3311ad64 132}
133//________________________________________________________________________
134AliXiStar::AliXiStar(const char *name, Bool_t AODdecision, Bool_t MCdecision, Int_t CutListOption)
135 : AliAnalysisTaskSE(name),
136 fname(name),
137 fAOD(0x0),
138 fESD(0x0),
139 fOutputList(0x0),
140 fTrackCut(0x0),
141 fPIDResponse(0x0),
142 fEC(0x0),
143 fEvt(0x0),
144 fTempStruct(0x0),
145 fZvertexBins(0),
146 fEventsToMix(0),
147 fMultBins(0),
3311ad64 148 fMCcase(MCdecision),
149 fAODcase(AODdecision),
150 fEventCounter(0),
3311ad64 151 fMaxDecayLength(0),
3311ad64 152 fMassWindow(0),
3311ad64 153 fTrueMassPr(0),
154 fTrueMassPi(0),
155 fTrueMassK(0),
156 fTrueMassLam(0),
157 fTrueMassXi(0),
158 fESDTrack4(0x0),
159 fXiTrack(0x0),
160 fCutList(CutListOption)
fe45e21b 161
3311ad64 162{
163 // Main Constructor
92650a3e 164 for (Int_t i=0; i<21; i++){
165 fCovMatrix[i]=-99999.;
166 if (i<12) fMultLimits[i] = 0;
167 }
fe45e21b 168 for (Int_t i=0; i<kNCuts; i++){
169 fDecayParameters[i]=0;
170 for (Int_t j=0; j<kNCutVariations; j++){
171 fCutValues[j][i]=0;
172 }
173 }
0a21e6f4 174 //
175 for (Int_t cv=0; cv<kNCutVariations; cv++){
176 CutVar[cv].fXi=0x0;
177 CutVar[cv].fXibar=0x0;
178 CutVar[cv].fXiMinusPiPlus=0x0;
179 CutVar[cv].fXiMinusPiMinus=0x0;
180 CutVar[cv].fXiPlusPiPlus=0x0;
181 CutVar[cv].fXiPlusPiMinus=0x0;
182 //
183 CutVar[cv].fXiMinusPiPlusbkg=0x0;
184 CutVar[cv].fXiMinusPiMinusbkg=0x0;
185 CutVar[cv].fXiPlusPiPlusbkg=0x0;
186 CutVar[cv].fXiPlusPiMinusbkg=0x0;
187 //
188 CutVar[cv].fMCrecXi=0x0;
189 CutVar[cv].fMCrecXibar=0x0;
190 CutVar[cv].fMCrecXiMinusPiPlus=0x0;
191 CutVar[cv].fMCrecXiPlusPiMinus=0x0;
192 }
193
fe45e21b 194
3311ad64 195 // Define output slots here
196 // Output slot #1
197 DefineOutput(1, TList::Class());
198
199}
200//________________________________________________________________________
201AliXiStar::AliXiStar(const AliXiStar &obj)
202 : AliAnalysisTaskSE(obj.fname),
203 fname(obj.fname),
204 fAOD(obj.fAOD),
205 fESD(obj.fESD),
206 fOutputList(obj.fOutputList),
207 fTrackCut(obj.fTrackCut),
208 fPIDResponse(obj.fPIDResponse),
209 fEC(obj.fEC),
210 fEvt(obj.fEvt),
211 fTempStruct(obj.fTempStruct),
212 fZvertexBins(obj.fZvertexBins),
213 fEventsToMix(obj.fEventsToMix),
214 fMultBins(obj.fMultBins),
215 fMultLimits(),
216 fMCcase(obj.fMCcase),
217 fAODcase(obj.fAODcase),
218 fEventCounter(obj.fEventCounter),
3311ad64 219 fMaxDecayLength(obj.fMaxDecayLength),
3311ad64 220 fMassWindow(obj.fMassWindow),
3311ad64 221 fTrueMassPr(obj.fTrueMassPr),
222 fTrueMassPi(obj.fTrueMassPi),
223 fTrueMassK(obj.fTrueMassK),
224 fTrueMassLam(obj.fTrueMassLam),
225 fTrueMassXi(obj.fTrueMassXi),
226 fESDTrack4(obj.fESDTrack4),
227 fXiTrack(obj.fXiTrack),
228 fCutList(obj.fCutList)
229
230{
231 // Copy constructor
92650a3e 232 for (Int_t i=0; i<21; i++){
233 fCovMatrix[i]=obj.fCovMatrix[i];
234 if (i<12) fMultLimits[i]=obj.fMultLimits[i];
fe45e21b 235 }
236 for (Int_t i=0; i<kNCuts; i++){
237 fDecayParameters[i]=obj.fDecayParameters[i];
238 for (Int_t j=0; j<kNCutVariations; j++){
239 fCutValues[j][i]=obj.fCutValues[j][i];
240 }
241 }
242
3311ad64 243}
244//________________________________________________________________________
245AliXiStar &AliXiStar::operator=(const AliXiStar &obj)
246{
247 // Assignment operator
248 if (this == &obj)
249 return *this;
92650a3e 250
251 fname = obj.fname;
3311ad64 252 fAOD = obj.fAOD;
253 fESD = obj.fESD;
254 fOutputList = obj.fOutputList;
255 fTrackCut = obj.fTrackCut;
256 fPIDResponse = obj.fPIDResponse;
257 fEC = obj.fEC;
258 fEvt = obj.fEvt;
259 fTempStruct = obj.fTempStruct;
260 fZvertexBins = obj.fZvertexBins;
261 fEventsToMix = obj.fEventsToMix;
262 fMultBins = obj.fMultBins;
92650a3e 263 for (Int_t i=0; i<12; i++){
264 fMultLimits[i]=obj.fMultLimits[i];
265 }
3311ad64 266 fMCcase = obj.fMCcase;
267 fAODcase = obj.fAODcase;
268 fEventCounter = obj.fEventCounter;
3311ad64 269 fMaxDecayLength = obj.fMaxDecayLength;
3311ad64 270 fMassWindow = obj.fMassWindow;
92650a3e 271 for (Int_t i=0; i<21; i++){
272 fCovMatrix[i]=obj.fCovMatrix[i];
273 }
3311ad64 274 fTrueMassPr = obj.fTrueMassPr;
275 fTrueMassPi = obj.fTrueMassPi;
276 fTrueMassK = obj.fTrueMassK;
277 fTrueMassLam = obj.fTrueMassLam;
278 fTrueMassXi = obj.fTrueMassXi;
279 fESDTrack4 = obj.fESDTrack4;
280 fXiTrack = obj.fXiTrack;
281 fCutList = obj.fCutList;
fe45e21b 282
283 for (Int_t i=0; i<kNCuts; i++){
284 fDecayParameters[i]=obj.fDecayParameters[i];
285 for (Int_t j=0; j<kNCutVariations; j++){
286 fCutValues[j][i]=obj.fCutValues[j][i];
287 }
288 }
289
290
3311ad64 291 return (*this);
292}
293//________________________________________________________________________
294AliXiStar::~AliXiStar()
295{
296 // Destructor
3311ad64 297 if(fAOD) delete fAOD;
298 if(fESD) delete fESD;
299 if(fOutputList) delete fOutputList;
300 if(fTrackCut) delete fTrackCut;
301 if(fPIDResponse) delete fPIDResponse;
302 if(fEC) delete fEC;
303 if(fEvt) delete fEvt;
304 if(fTempStruct) delete fTempStruct;
305 if(fESDTrack4) delete fESDTrack4;
306 if(fXiTrack) delete fXiTrack;
fe45e21b 307
308 for (Int_t cv=0; cv<kNCutVariations; cv++){
309 if(CutVar[cv].fXi) delete CutVar[cv].fXi;
310 if(CutVar[cv].fXibar) delete CutVar[cv].fXibar;
311 if(CutVar[cv].fXiMinusPiPlus) delete CutVar[cv].fXiMinusPiPlus;
312 if(CutVar[cv].fXiMinusPiMinus) delete CutVar[cv].fXiMinusPiMinus;
313 if(CutVar[cv].fXiPlusPiPlus) delete CutVar[cv].fXiPlusPiPlus;
314 if(CutVar[cv].fXiPlusPiMinus) delete CutVar[cv].fXiPlusPiMinus;
315 //
316 if(CutVar[cv].fXiMinusPiPlusbkg) delete CutVar[cv].fXiMinusPiPlusbkg;
317 if(CutVar[cv].fXiMinusPiMinusbkg) delete CutVar[cv].fXiMinusPiMinusbkg;
318 if(CutVar[cv].fXiPlusPiPlusbkg) delete CutVar[cv].fXiPlusPiPlusbkg;
319 if(CutVar[cv].fXiPlusPiMinusbkg) delete CutVar[cv].fXiPlusPiMinusbkg;
320 //
321 if(CutVar[cv].fMCrecXi) delete CutVar[cv].fMCrecXi;
322 if(CutVar[cv].fMCrecXibar) delete CutVar[cv].fMCrecXibar;
323 if(CutVar[cv].fMCrecXiMinusPiPlus) delete CutVar[cv].fMCrecXiMinusPiPlus;
324 if(CutVar[cv].fMCrecXiPlusPiMinus) delete CutVar[cv].fMCrecXiPlusPiMinus;
325 }
326
3311ad64 327}
328//________________________________________________________________________
329void AliXiStar::XiStarInit()
330{
331 //
332 //Inits cuts and analysis settings
333 //
334
335 fEventCounter=0;// event counter initialization
336 cout<<"AliXiStar XiStarInit() call"<<endl;
337
338
339 ///////////////////////////////////////////////
340 // Track Cuts for ESD analysis
341 fTrackCut = new AliESDtrackCuts();
342 fTrackCut->SetPtRange(.15,1000);
343 fTrackCut->SetAcceptKinkDaughters(kFALSE);
fe45e21b 344 //fTrackCut->SetMinNClustersTPC(70);
3311ad64 345 fTrackCut->SetRequireTPCRefit(kTRUE);
346 ////////////////////////////////////////////////
347
348 fZvertexBins = 20;
349 fMultBins = 11;// This must also be set in AliXiStar.h
350 if(fMCcase) fEventsToMix = 0;
351 else fEventsToMix = 40;
352
353 // multiplicity edges for event mixing bins
354 fMultLimits[0]=0, fMultLimits[1]=5, fMultLimits[2]=10, fMultLimits[3]=15, fMultLimits[4]=20, fMultLimits[5]=25;
355 fMultLimits[6]=30, fMultLimits[7]=35, fMultLimits[8]=40, fMultLimits[9]=45, fMultLimits[10]=50, fMultLimits[11]=150;
356
357
358 fEC = new AliXiStarEventCollection **[fZvertexBins];
359 for(unsigned short i=0; i<fZvertexBins; i++){
360
361 fEC[i] = new AliXiStarEventCollection *[fMultBins];
362
363 for(unsigned short j=0; j<fMultBins; j++){
364
365 fEC[i][j] = new AliXiStarEventCollection(fEventsToMix+1);
366 }
367 }
368
369
370 fTempStruct = new AliXiStarTrackStruct[kNbinsM];
371
372 fESDTrack4 = new AliESDtrack();
373 fXiTrack = new AliESDtrack();
3311ad64 374
3311ad64 375
fe45e21b 376 fMaxDecayLength = 100.;
377 fMassWindow = 0.006;
378
379 /////////////////////////////////////////////////////////////////////////////////////
380 ///////////////////////
381 // DecayParameters Key (number represents array index)
382 // NclustersTPC: 0=proton, 1=pion first, 2=pion second, 3=pion third
383 // DCAVtx: 4=proton, 5=pion first, 6=pion second, 7=lambda, 8=pion third
384 // 9 = DCA proton-pion
385 // 10 = DCA Lambda-pion
386 // 11 = Rxy Lambda
387 // 12 = Rxy Xi
388 // 13 = Cos PA Lambda
389 // 14 = Cos PA Xi
3311ad64 390
fe45e21b 391 // Set Standard Reconstruction cut values
392 fCutValues[0][0] = 70; fCutValues[0][1] = 70; fCutValues[0][2] = 70; fCutValues[0][3] = 70;
393 fCutValues[0][4] = 0.04; fCutValues[0][5] = 0.04; fCutValues[0][6] = 0.05; fCutValues[0][7] = 0.07; fCutValues[0][8] = 2.0;
394 fCutValues[0][9] = 1.6;
395 fCutValues[0][10] = 1.6;
396 fCutValues[0][11] = 1.4;
397 fCutValues[0][12] = 0.8;
398 fCutValues[0][13] = 0.97;
399 fCutValues[0][14] = 0.97;
400 for(int cv=1; cv<kNCutVariations; cv++){
401 for(int ct=0; ct<kNCuts; ct++){
402 fCutValues[cv][ct] = fCutValues[0][ct];
403 }
3311ad64 404 }
fe45e21b 405 // Set Systematic Variations
406 fCutValues[1][0] = 80; fCutValues[1][1] = 80; fCutValues[1][2] = 80; fCutValues[1][3] = 80;// 80
407 fCutValues[2][4] = 0.104;// 0.104
408 fCutValues[3][5] = 0.104;// 0.104
409 fCutValues[4][6] = 0.08;// 0.08
410 fCutValues[5][7] = 0.1;// 0.1
411 fCutValues[6][8] = 1.0;// 1.0
412 fCutValues[7][9] = 0.94;// 0.94
413 fCutValues[8][10] = 1.41;// 1.41
414 fCutValues[9][11] = 4.39;// 4.39
415 fCutValues[10][12] = 0.95;// 0.95
416 fCutValues[11][13] = 0.99;// 0.99
417 fCutValues[12][14] = 0.985;// 0.085
418
419
420
3311ad64 421
3311ad64 422
423 // PDG mass values
424 fTrueMassPr=.93827, fTrueMassPi=.13957, fTrueMassK=.493677, fTrueMassLam=1.11568, fTrueMassXi=1.32171;
425
426 // The following CovMatrix is set so that PropogateToDCA() ignores track errors. Only used to propagate Xi to third pion for XiStar reconstruction
427 for(Int_t i=0; i<21; i++) fCovMatrix[i]=0;
428 fCovMatrix[0]=1, fCovMatrix[2]=1, fCovMatrix[5]=1, fCovMatrix[9]=1, fCovMatrix[14]=1, fCovMatrix[20]=1;
429
430
431}
432//________________________________________________________________________
433void AliXiStar::UserCreateOutputObjects()
434{
435
436 XiStarInit();// Initialize settings
437
438 // Create histograms
439 fOutputList = new TList();
440 fOutputList->SetOwner();
441
442 TH3F *fVertexDist1 = new TH3F("fVertexDist1","Vertex Distribution",20,-1,1, 20,-1,1, 600,-30,30);
443 fVertexDist1->GetXaxis()->SetTitle("X Vertex (cm)");
444 fVertexDist1->GetYaxis()->SetTitle("Y Vertex (cm)");
445 fVertexDist1->GetZaxis()->SetTitle("Z Vertex (cm)");
446 fOutputList->Add(fVertexDist1);
447
448 TH3F *fVertexDist3 = new TH3F("fVertexDist3","Vertex Distribution",20,-1,1, 20,-1,1, 600,-30,30);
449 fVertexDist3->GetXaxis()->SetTitle("X Vertex (cm)");
450 fVertexDist3->GetYaxis()->SetTitle("Y Vertex (cm)");
451 fVertexDist3->GetZaxis()->SetTitle("Z Vertex (cm)");
452 fOutputList->Add(fVertexDist3);
453
454 TH2F *fDCADist = new TH2F("fDCADist","DCA distribution",kNbinsM,-.5,kNbinsM-.5, 100,0,10);
455 fOutputList->Add(fDCADist);
456
457
458 TH3F *fMultDist3d = new TH3F("fMultDist3d","Multiplicity Distribution",kNbinsM,-.5,kNbinsM-.5, kNbinsM,-.5,kNbinsM-.5, kNbinsM,-.5,kNbinsM-.5);
459 fMultDist3d->GetXaxis()->SetTitle("Multiplicity");
460 fMultDist3d->GetYaxis()->SetTitle("Positive Multiplicity");
461 fMultDist3d->GetZaxis()->SetTitle("Negative Multiplicity");
462 fMultDist3d->SetMarkerStyle(kFullCircle);
463 fOutputList->Add(fMultDist3d);
464
465
466 TH1F *fMultDist1 = new TH1F("fMultDist1","Multiplicity Distribution",kNbinsM,-.5,kNbinsM-.5);
467 fMultDist1->GetXaxis()->SetTitle("Multiplicity");
468 fOutputList->Add(fMultDist1);
469
470 TH1F *fMultDist2 = new TH1F("fMultDist2","Multiplicity Distribution",kNbinsM,-.5,kNbinsM-.5);
471 fMultDist2->GetXaxis()->SetTitle("Multiplicity");
472 fOutputList->Add(fMultDist2);
473
474 TH1F *fMultDist3 = new TH1F("fMultDist3","Multiplicity Distribution",kNbinsM,-.5,kNbinsM-.5);
475 fMultDist3->GetXaxis()->SetTitle("Multiplicity");
476 fOutputList->Add(fMultDist3);
477
478 TH1F *fMultDist4 = new TH1F("fMultDist4","Multiplicity Distribution",kNbinsM,-.5,kNbinsM-.5);
479 fMultDist4->GetXaxis()->SetTitle("Multiplicity");
480 fOutputList->Add(fMultDist4);
481
482 TH1F *fMultDist5 = new TH1F("fMultDist5","Multiplicity Distribution",kNbinsM,-.5,kNbinsM-.5);
483 fMultDist5->GetXaxis()->SetTitle("Multiplicity");
484 fOutputList->Add(fMultDist5);
485
486
487 TH3F *fPtEtaDist = new TH3F("fPtEtaDist","PtEtaDist",2,-1.1,1.1, 300,0,3., 28,-1.4,1.4);
488 fOutputList->Add(fPtEtaDist);
489
490 TH3F *fPhiPtDist = new TH3F("fPhiPtDist","PhiPtDist",2,-1.1,1.1, 120,0,2*PI, 300,0,3.);
491 fOutputList->Add(fPhiPtDist);
492
fe45e21b 493
494 for(Int_t cv=0; cv<kNCutVariations; cv++){
495
496 if(cv==0){
497 TString *nameXi=new TString("fXi_");
498 TString *nameXibar=new TString("fXibar_");
499 *nameXi += cv;
500 *nameXibar += cv;
501 CutVar[cv].fXi = new TH3F(nameXi->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.2,1.4);
502 fOutputList->Add(CutVar[cv].fXi);
503 CutVar[cv].fXibar = new TH3F(nameXibar->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.2,1.4);
504 fOutputList->Add(CutVar[cv].fXibar);
505 //
506 TString *nameMCrecXi = new TString("fMCrecXi_");
507 TString *nameMCrecXibar = new TString("fMCrecXi_");
508 *nameMCrecXi += cv;
509 *nameMCrecXibar += cv;
510 CutVar[cv].fMCrecXi = new TH3F(nameMCrecXi->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.2,1.4);
511 CutVar[cv].fMCrecXibar = new TH3F(nameMCrecXibar->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.2,1.4);
512 fOutputList->Add(CutVar[cv].fMCrecXi);
513 fOutputList->Add(CutVar[cv].fMCrecXibar);
514 }
515 //
516 TString *nameXiMinusPiPlus = new TString("fXiMinusPiPlus_");
517 TString *nameXiMinusPiMinus = new TString("fXiMinusPiMinus_");
518 TString *nameXiPlusPiPlus = new TString("fXiPlusPiPlus_");
519 TString *nameXiPlusPiMinus = new TString("fXiPlusPiMinus_");
520 TString *nameXiMinusPiPlusbkg = new TString("fXiMinusPiPlusbkg_");
521 TString *nameXiMinusPiMinusbkg = new TString("fXiMinusPiMinusbkg_");
522 TString *nameXiPlusPiPlusbkg = new TString("fXiPlusPiPlusbkg_");
523 TString *nameXiPlusPiMinusbkg = new TString("fXiPlusPiMinusbkg_");
524 *nameXiMinusPiPlus += cv;
525 *nameXiMinusPiMinus += cv;
526 *nameXiPlusPiPlus += cv;
527 *nameXiPlusPiMinus += cv;
528 *nameXiMinusPiPlusbkg += cv;
529 *nameXiMinusPiMinusbkg += cv;
530 *nameXiPlusPiPlusbkg += cv;
531 *nameXiPlusPiMinusbkg += cv;
532 CutVar[cv].fXiMinusPiPlus = new TH3F(nameXiMinusPiPlus->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
533 CutVar[cv].fXiMinusPiMinus = new TH3F(nameXiMinusPiMinus->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
534 CutVar[cv].fXiPlusPiPlus = new TH3F(nameXiPlusPiPlus->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
535 CutVar[cv].fXiPlusPiMinus = new TH3F(nameXiPlusPiMinus->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
536 CutVar[cv].fXiMinusPiPlusbkg = new TH3F(nameXiMinusPiPlusbkg->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
537 CutVar[cv].fXiMinusPiMinusbkg = new TH3F(nameXiMinusPiMinusbkg->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
538 CutVar[cv].fXiPlusPiPlusbkg = new TH3F(nameXiPlusPiPlusbkg->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
539 CutVar[cv].fXiPlusPiMinusbkg = new TH3F(nameXiPlusPiMinusbkg->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
540
541 fOutputList->Add(CutVar[cv].fXiMinusPiPlus);
542 fOutputList->Add(CutVar[cv].fXiMinusPiMinus);
543 fOutputList->Add(CutVar[cv].fXiPlusPiPlus);
544 fOutputList->Add(CutVar[cv].fXiPlusPiMinus);
545 fOutputList->Add(CutVar[cv].fXiMinusPiPlusbkg);
546 fOutputList->Add(CutVar[cv].fXiMinusPiMinusbkg);
547 fOutputList->Add(CutVar[cv].fXiPlusPiPlusbkg);
548 fOutputList->Add(CutVar[cv].fXiPlusPiMinusbkg);
549 //
3311ad64 550
fe45e21b 551
552 TString *nameMCrecXiMinusPiPlus = new TString("fMCrecXiMinusPiPlus_");
553 TString *nameMCrecXiPlusPiMinus = new TString("fMCrecXiPlusPiMinus_");
554 *nameMCrecXiMinusPiPlus += cv;
555 *nameMCrecXiPlusPiMinus += cv;
556 CutVar[cv].fMCrecXiMinusPiPlus = new TH3F(nameMCrecXiMinusPiPlus->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
557 CutVar[cv].fMCrecXiPlusPiMinus = new TH3F(nameMCrecXiPlusPiMinus->Data(),"Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
558 fOutputList->Add(CutVar[cv].fMCrecXiMinusPiPlus);
559 fOutputList->Add(CutVar[cv].fMCrecXiPlusPiMinus);
560 //
561
562 /*
563 CutVar[cv].fMCrecXiStarxiy = new TH2F("fMCrecXiStarxiy","y distribution",80,-2,2, 80,-2,2);
564 CutVar[cv].fMCrecXiStarpiony = new TH2F("fMCrecXiStarpiony","y distribution",80,-2,2, 80,-2,2);
565 fOutputList->Add(CutVar[cv].fMCrecXiStarxiy);
566 fOutputList->Add(CutVar[cv].fMCrecXiStarpiony);
567 CutVar[cv].fMCrecXilambday = new TH2F("fMCrecXilambday","y distribution",80,-2,2, 80,-2,2);
568 CutVar[cv].fMCrecXipiony = new TH2F("fMCrecXipiony","y distribution",80,-2,2, 80,-2,2);
569 fOutputList->Add(CutVar[cv].fMCrecXilambday);
570 fOutputList->Add(CutVar[cv].fMCrecXipiony);
571 CutVar[cv].fMCrecLamprotony = new TH2F("fMCrecLamprotony","y distribution",80,-2,2, 80,-2,2);
572 CutVar[cv].fMCrecLampiony = new TH2F("fMCrecLampiony","y distribution",80,-2,2, 80,-2,2);
573 fOutputList->Add(CutVar[cv].fMCrecLamprotony);
574 fOutputList->Add(CutVar[cv].fMCrecLampiony);
575 */
576 }
3311ad64 577
fe45e21b 578
3311ad64 579
580
fe45e21b 581 //////////////////////
582 // MC input histos
583 TH3F *fMCinputXiStar = new TH3F("fMCinputXiStar","Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
584 TH3F *fMCinputXiStarbar = new TH3F("fMCinputXiStarbar","Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
3311ad64 585 fOutputList->Add(fMCinputXiStar);
586 fOutputList->Add(fMCinputXiStarbar);
587
588 TH3F *fMCinputXi = new TH3F("fMCinputXi","Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.2,1.4);
589 TH3F *fMCinputXibar = new TH3F("fMCinputXibar","Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.2,1.4);
590 fOutputList->Add(fMCinputXi);
591 fOutputList->Add(fMCinputXibar);
592
593 //
594
fe45e21b 595 TH3F *fMCinputTotalXiStar1 = new TH3F("fMCinputTotalXiStar1","Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
596 TH3F *fMCinputTotalXiStarbar1 = new TH3F("fMCinputTotalXiStarbar1","Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
3311ad64 597 fOutputList->Add(fMCinputTotalXiStar1);
598 fOutputList->Add(fMCinputTotalXiStarbar1);
599
600 TH3F *fMCinputTotalXi1 = new TH3F("fMCinputTotalXi1","Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.2,1.4);
601 TH3F *fMCinputTotalXibar1 = new TH3F("fMCinputTotalXibar1","Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.2,1.4);
602 fOutputList->Add(fMCinputTotalXi1);
603 fOutputList->Add(fMCinputTotalXibar1);
604
605 //
606
fe45e21b 607 TH3F *fMCinputTotalXiStar3 = new TH3F("fMCinputTotalXiStar3","Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
608 TH3F *fMCinputTotalXiStarbar3 = new TH3F("fMCinputTotalXiStarbar3","Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.4,1.6);
3311ad64 609 fOutputList->Add(fMCinputTotalXiStar3);
610 fOutputList->Add(fMCinputTotalXiStarbar3);
611
612 TH3F *fMCinputTotalXi3 = new TH3F("fMCinputTotalXi3","Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.2,1.4);
613 TH3F *fMCinputTotalXibar3 = new TH3F("fMCinputTotalXibar3","Invariant Mass Distribution", 100,0,10, 40,-2,2, 200,1.2,1.4);
614 fOutputList->Add(fMCinputTotalXi3);
615 fOutputList->Add(fMCinputTotalXibar3);
616
617 //
3311ad64 618
619 TH2F *fMCinputXiStarxiy = new TH2F("fMCinputXiStarxiy","y distribution",80,-2,2, 80,-2,2);
620 TH2F *fMCinputXiStarpiony = new TH2F("fMCinputXiStarpiony","y distribution",80,-2,2, 80,-2,2);
621 fOutputList->Add(fMCinputXiStarxiy);
622 fOutputList->Add(fMCinputXiStarpiony);
623 TH2F *fMCinputXilambday = new TH2F("fMCinputXilambday","y distribution",80,-2,2, 80,-2,2);
624 TH2F *fMCinputXipiony = new TH2F("fMCinputXipiony","y distribution",80,-2,2, 80,-2,2);
625 fOutputList->Add(fMCinputXilambday);
626 fOutputList->Add(fMCinputXipiony);
627 TH2F *fMCinputLamprotony = new TH2F("fMCinputLamprotony","y distribution",80,-2,2, 80,-2,2);
628 TH2F *fMCinputLampiony = new TH2F("fMCinputLampiony","y distribution",80,-2,2, 80,-2,2);
629 fOutputList->Add(fMCinputLamprotony);
630 fOutputList->Add(fMCinputLampiony);
fe45e21b 631
3311ad64 632
633 ///////////////////////////////////
634
635 PostData(1, fOutputList);
636}
637
638//________________________________________________________________________
639void AliXiStar::Exec(Option_t *)
640{
641 // Main loop
642 // Called for each event
643 cout<<"=========== Event # "<<fEventCounter+1<<" ==========="<<endl;
644 fEventCounter++;
645
646 if(fAODcase) {cout<<"AODs not fully supported! Exiting event."<<endl; return;}
647
648 if(fAODcase) fAOD = dynamic_cast<AliAODEvent*> (InputEvent());
649 else fESD = dynamic_cast<AliESDEvent*> (InputEvent());
650
651 if(fAODcase) {if (!fAOD) {Printf("ERROR: fAOD not available"); return;}}
652 else {if (!fESD) {Printf("ERROR: fESD not available"); return;}}
653
654
655 // ESD Trigger Cut
656 if(!fAODcase){
657 if(!(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected())) {cout<<"Event Rejected"<<endl; return;}
658 }
659
660 ///////////////////////////////////////////////////////////
661 const AliAODVertex *PrimaryVertexAOD;
662 const AliESDVertex *PrimaryVertexESD;
663
664 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
665 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
666 fPIDResponse = inputHandler->GetPIDResponse();
667
668
669 TClonesArray *mcArray = 0x0;
670 //AliAODMCParticle *mcXi;
671 //AliAODMCParticle *mcXiStarD2;
672 //AliAODMCParticle *mcXiStar;
673 AliMCEvent *mcEvent = 0x0;
674 AliStack *mcstack = 0x0;
675 TParticle *MCLamD1esd = 0x0;
676 TParticle *MCLamD2esd = 0x0;
677 TParticle *MCLamesd = 0x0;
678 TParticle *MCXiD2esd = 0x0;
679 TParticle *MCXiesd = 0x0;
680 TParticle *MCXiStarD2esd = 0x0;
681 TParticle *MCXiStaresd = 0x0;
682
683 Double_t px1,py1,pz1, px2,py2,pz2;
fe45e21b 684 Double_t p1sq,p2sq,e1,e2,angle;
3311ad64 685 Double_t dca3d;
686 Float_t dca2[2];
fe45e21b 687 Double_t xiVtx[3];//, xiStarVtx[3];
3311ad64 688 Double_t xiP[3], xiStarP[3];
689 Double_t xiStarMom;
690 Double_t xiMass, xiStarMass;
691 Double_t xiPt, xiStarPt;
692 Double_t xiY, xiStarY;
693 Double_t xiCharge;
fe45e21b 694 Double_t decayLengthXY;
3311ad64 695 Double_t pDaughter1[3];
696 Double_t pDaughter2[3];
697 Double_t xDaughter1[3];
698 Double_t xDaughter2[3];
699 //
700 Double_t bField=0;
701 UInt_t status=0;
702 Int_t positiveTracks=0, negativeTracks=0;
703 Int_t myTracks=0;
704 //
705 Double_t primaryVtx[3]={0};
706 Int_t mBin=0;
707 Int_t zBin=0;
708 Double_t zStep=2*10/Double_t(fZvertexBins), zStart=-10.;
709 //
710 Bool_t mcXiFilled=kFALSE;// So that mctracks are never used uninitialized
711
712 if(fMCcase){
713 if(fAODcase){
714 mcArray = (TClonesArray*)fAOD->FindListObject(AliAODMCParticle::StdBranchName());
715 if(!mcArray){
716 cout<<"No MC particle branch found"<<endl;
717 return;
718 }
719 }else {
720 mcEvent = MCEvent();
721 if (!mcEvent) {Printf("ERROR: Could not retrieve MC event"); return;}
722
723 mcstack = mcEvent->Stack();
724 if (!mcstack) {Printf("ERROR: Could not retrieve the stack"); return;}
725 }
726 }
727
728
729 /////////////////////////////////////////////////
730
731
732
733 if(fAODcase){// AOD case
734 ////////////////////////////////
735 // Vertexing
736 ((TH1F*)fOutputList->FindObject("fMultDist1"))->Fill(fAOD->GetNumberOfTracks());
737 PrimaryVertexAOD = fAOD->GetPrimaryVertex();
738 if(!PrimaryVertexAOD) return;
739
740 if(fMCcase){
741 for (Int_t it = 0; it < mcArray->GetEntriesFast(); it++) {
742 AliAODMCParticle *mcInputTrack = (AliAODMCParticle*)mcArray->At(it);
743 if (!mcInputTrack) {
744 Error("UserExec", "Could not receive track %d", it);
745 continue;
746 }
747
748 if(!mcInputTrack->IsPhysicalPrimary()) continue;
749
750 // Xi
751 if(mcInputTrack->GetPdgCode() == +kXiCode) ((TH3F*)fOutputList->FindObject("fMCinputTotalXi1"))->Fill(mcInputTrack->Pt(), mcInputTrack->Y(), mcInputTrack->GetCalcMass());
752 if(mcInputTrack->GetPdgCode() == -kXiCode) ((TH3F*)fOutputList->FindObject("fMCinputTotalXibar1"))->Fill(mcInputTrack->Pt(), mcInputTrack->Y(), mcInputTrack->GetCalcMass());
753
754 // XiStar
755 if(mcInputTrack->GetPdgCode() == +kXiStarCode) ((TH3F*)fOutputList->FindObject("fMCinputTotalXiStar1"))->Fill(mcInputTrack->Pt(), mcInputTrack->Y(), mcInputTrack->GetCalcMass());
756 if(mcInputTrack->GetPdgCode() == -kXiStarCode) ((TH3F*)fOutputList->FindObject("fMCinputTotalXiStarbar1"))->Fill(mcInputTrack->Pt(), mcInputTrack->Y(), mcInputTrack->GetCalcMass());
757 }
758 }
759
760
761
762 primaryVtx[0]=PrimaryVertexAOD->GetX(); primaryVtx[1]=PrimaryVertexAOD->GetY(); primaryVtx[2]=PrimaryVertexAOD->GetZ();
763 ((TH3F*)fOutputList->FindObject("fVertexDist1"))->Fill(primaryVtx[0], primaryVtx[1], primaryVtx[2]);
764 if(fabs(primaryVtx[2]) > 10.) return; // Z-Vertex Cut
765 ((TH1F*)fOutputList->FindObject("fMultDist2"))->Fill(fAOD->GetNumberOfTracks());
766
767
768 if(fAOD->IsPileupFromSPD()) return; // Reject Pile-up events
769
770 ((TH1F*)fOutputList->FindObject("fMultDist3"))->Fill(fAOD->GetNumberOfTracks());
771 ((TH3F*)fOutputList->FindObject("fVertexDist3"))->Fill(primaryVtx[0], primaryVtx[1], primaryVtx[2]);
772
773 if(PrimaryVertexAOD->GetNContributors() >= 1) ((TH1F*)fOutputList->FindObject("fMultDist4"))->Fill(fAOD->GetNumberOfTracks());
774
775
776
777 Printf("There are %d tracks in this event", fAOD->GetNumberOfTracks());
778 // fNtracks Cut
779 if(fAOD->GetNumberOfTracks() > kNbinsM) {cout<<"More tracks than limit"<<endl; return;}
780 bField = fAOD->GetMagneticField();
781
782 // Track loop
783 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
784 AliAODTrack* aodtrack = fAOD->GetTrack(i);
785 if (!aodtrack) continue;
786
787 status=aodtrack->GetStatus();
788
789
790 if( (status&AliESDtrack::kTPCrefit)==0) continue;// Require tpcrefit
791 if( aodtrack->GetTPCNcls() < 70) continue;// TPC Ncluster cut
792 if(aodtrack->Pt() < 0.15) continue;
793 AliAODVertex *VtxType=aodtrack->GetProdVertex();
794 if((VtxType->GetType())==AliAODVertex::kKink) continue;// Reject Kinks
795
796 Bool_t goodMomentum = aodtrack->GetPxPyPz( fTempStruct[myTracks].fP);
797 if(!goodMomentum) continue;
798 aodtrack->GetXYZ( fTempStruct[myTracks].fX);
799
800
801 aodtrack->GetCovarianceXYZPxPyPz( fTempStruct[myTracks].fCov);
802
803 dca2[0] = sqrt( pow(fTempStruct[myTracks].fX[0] - primaryVtx[0],2) + pow(fTempStruct[myTracks].fX[1] - primaryVtx[1],2));
804 dca2[1] = sqrt( pow(fTempStruct[myTracks].fX[2] - primaryVtx[2],2));
805 dca3d = sqrt( pow(dca2[0],2) + pow(dca2[1],2));
806
807 ((TH1F*)fOutputList->FindObject("fDCADist"))->Fill(fAOD->GetNumberOfTracks(), dca3d);
808 ((TH3F*)fOutputList->FindObject("fPhiPtDist"))->Fill(aodtrack->Charge(), aodtrack->Phi(), aodtrack->Pt());
809 ((TH3F*)fOutputList->FindObject("fPtEtaDist"))->Fill(aodtrack->Charge(), aodtrack->Pt(), aodtrack->Eta());
810
811
812
813
814 fTempStruct[myTracks].fStatus = status;
815 fTempStruct[myTracks].fFilterMap = aodtrack->GetFilterMap();
816 fTempStruct[myTracks].fID = aodtrack->GetID();
817 fTempStruct[myTracks].fLabel = aodtrack->GetLabel();
818 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
819 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
820 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
821 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
822 fTempStruct[myTracks].fEta = aodtrack->Eta();
823 fTempStruct[myTracks].fCharge = aodtrack->Charge();
824 fTempStruct[myTracks].fDCAXY = dca2[0];
825 fTempStruct[myTracks].fDCAZ = dca2[1];
826 fTempStruct[myTracks].fDCA = dca3d;
827 fTempStruct[myTracks].fNSigmaPi = fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kPion));
828 fTempStruct[myTracks].fNSigmaK = fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kKaon));
829 fTempStruct[myTracks].fNSigmaPr = fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kProton));
830
831
832 if(aodtrack->Charge() > 0) positiveTracks++;
833 else negativeTracks++;
834
835
836 myTracks++;
837 }
838 }else {// ESDs
839
840 ((TH1F*)fOutputList->FindObject("fMultDist1"))->Fill(fESD->GetNumberOfTracks());
841 PrimaryVertexESD = fESD->GetPrimaryVertex();
842 if(!PrimaryVertexESD) return;
843
844 primaryVtx[0]=PrimaryVertexESD->GetX(); primaryVtx[1]=PrimaryVertexESD->GetY(); primaryVtx[2]=PrimaryVertexESD->GetZ();
845 ((TH3F*)fOutputList->FindObject("fVertexDist1"))->Fill(primaryVtx[0], primaryVtx[1], primaryVtx[2]);
846
847 if(fMCcase){
848 /////////////////////////////////////////////////
849 // Lam mc input
850 /////////////////////////////////////////////////
851 for (Int_t it = 0; it < mcstack->GetNprimary(); it++) {
852 TParticle *mcInputTrack = (TParticle*)mcstack->Particle(it);
853 if (!mcInputTrack) {
854 Error("UserExec", "Could not receive track %d", it);
855 continue;
856 }
857
858
859 // Xi
860 if(mcInputTrack->GetPdgCode() == +kXiCode) ((TH3F*)fOutputList->FindObject("fMCinputTotalXi1"))->Fill(mcInputTrack->Pt(), mcInputTrack->Y(), mcInputTrack->GetCalcMass());
861 if(mcInputTrack->GetPdgCode() == -kXiCode) ((TH3F*)fOutputList->FindObject("fMCinputTotalXibar1"))->Fill(mcInputTrack->Pt(), mcInputTrack->Y(), mcInputTrack->GetCalcMass());
862
863 // XiStar
864 if(mcInputTrack->GetPdgCode() == +kXiStarCode) ((TH3F*)fOutputList->FindObject("fMCinputTotalXiStar1"))->Fill(mcInputTrack->Pt(), mcInputTrack->Y(), mcInputTrack->GetCalcMass());
865 if(mcInputTrack->GetPdgCode() == -kXiStarCode) ((TH3F*)fOutputList->FindObject("fMCinputTotalXiStarbar1"))->Fill(mcInputTrack->Pt(), mcInputTrack->Y(), mcInputTrack->GetCalcMass());
866
867 }
868
869
870 }
871
872
873
874 if(fabs(primaryVtx[2]) > 10.) return; // Z-Vertex Cut
875 ((TH1F*)fOutputList->FindObject("fMultDist2"))->Fill(fESD->GetNumberOfTracks());
876
877
878 if(fESD->IsPileupFromSPD()) return; // Reject Pile-up events
879
880 ((TH1F*)fOutputList->FindObject("fMultDist3"))->Fill(fESD->GetNumberOfTracks());
881 ((TH3F*)fOutputList->FindObject("fVertexDist3"))->Fill(primaryVtx[0], primaryVtx[1], primaryVtx[2]);
882
883 if(PrimaryVertexESD->GetNContributors() >= 1) ((TH1F*)fOutputList->FindObject("fMultDist4"))->Fill(fESD->GetNumberOfTracks());
884
885 Printf("There are %d tracks in this event", fESD->GetNumberOfTracks());
886 // fNtracks Cut
887 if(fESD->GetNumberOfTracks() > kNbinsM) {cout<<"More tracks than limit"<<endl; return;}
888 bField = fESD->GetMagneticField();
889
890
891 // Track loop
892 for (Int_t i = 0; i < fESD->GetNumberOfTracks(); i++) {
893 AliESDtrack* esdtrack = fESD->GetTrack(i);
894 if (!esdtrack) continue;
895
896 status=esdtrack->GetStatus();
897
898 if(!fTrackCut->AcceptTrack(esdtrack)) continue;
899
900 Bool_t goodMomentum = esdtrack->GetPxPyPz( fTempStruct[myTracks].fP);
901 if(!goodMomentum) continue;
902 esdtrack->GetXYZ( fTempStruct[myTracks].fX);
903
904
905 esdtrack->GetCovarianceXYZPxPyPz( fTempStruct[myTracks].fCov);
906 //esdtrack->GetImpactParameters(dca2, cov);
907 dca2[0] = sqrt( pow(fTempStruct[myTracks].fX[0] - primaryVtx[0],2) + pow(fTempStruct[myTracks].fX[1] - primaryVtx[1],2));
908 dca2[1] = sqrt( pow(fTempStruct[myTracks].fX[2] - primaryVtx[2],2));
909 dca3d = sqrt( pow(dca2[0],2) + pow(dca2[1],2));
910
911 ((TH1F*)fOutputList->FindObject("fDCADist"))->Fill(fESD->GetNumberOfTracks(), dca3d);
912 ((TH3F*)fOutputList->FindObject("fPhiPtDist"))->Fill(esdtrack->Charge(), esdtrack->Phi(), esdtrack->Pt());
913 ((TH3F*)fOutputList->FindObject("fPtEtaDist"))->Fill(esdtrack->Charge(), esdtrack->Pt(), esdtrack->Eta());
914
915
916
917 fTempStruct[myTracks].fStatus = status;
918 fTempStruct[myTracks].fID = esdtrack->GetID();
919 fTempStruct[myTracks].fLabel = esdtrack->GetLabel();
920 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
921 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
922 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
923 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
924 fTempStruct[myTracks].fEta = esdtrack->Eta();
925 fTempStruct[myTracks].fCharge = esdtrack->Charge();
926 fTempStruct[myTracks].fDCAXY = dca2[0];
927 fTempStruct[myTracks].fDCAZ = dca2[1];
928 fTempStruct[myTracks].fDCA = dca3d;
929 fTempStruct[myTracks].fNSigmaPi = fabs(fPIDResponse->NumberOfSigmasTPC(esdtrack,AliPID::kPion));
930 fTempStruct[myTracks].fNSigmaK = fabs(fPIDResponse->NumberOfSigmasTPC(esdtrack,AliPID::kKaon));
931 fTempStruct[myTracks].fNSigmaPr = fabs(fPIDResponse->NumberOfSigmasTPC(esdtrack,AliPID::kProton));
fe45e21b 932 fTempStruct[myTracks].fNclusTPC = esdtrack->GetTPCNcls();
933
934
3311ad64 935 if(esdtrack->Charge() > 0) positiveTracks++;
936 else negativeTracks++;
937
938 myTracks++;
939 }
940
941 }// end of ESD case
942
943
944
945 if(myTracks >= 1) {
946 ((TH1F*)fOutputList->FindObject("fMultDist5"))->Fill(myTracks);
947 ((TH3F*)fOutputList->FindObject("fMultDist3d"))->Fill(positiveTracks+negativeTracks, positiveTracks, negativeTracks);
948 }
949
950
951 cout<<"There are "<<myTracks<<" myTracks"<<endl;
952
953 // set Z Vertex bin
954 for(Int_t i=0; i<fZvertexBins; i++){
955 if( (primaryVtx[2] > zStart+i*zStep) && (primaryVtx[2] < zStart+(i+1)*zStep) ){
956 zBin=i;
957 break;
958 }
959 }
960
961 // set Multiplicity bin
962 for(Int_t i=0; i<fMultBins; i++){
963 if( ( myTracks > fMultLimits[i]) && ( myTracks <= fMultLimits[i+1]) ) { mBin=i; break;}
964 }
965
966
967
968 ////////////////////////////////////
969 // Add event to buffer if > 0 tracks
970 if(myTracks > 0){
971 fEC[zBin][mBin]->FIFOShift();
972 (fEvt) = fEC[zBin][mBin]->fEvtStr;
973 (fEvt)->fNTracks = myTracks;
974 for(Int_t i=0; i<myTracks; i++) (fEvt)->fTracks[i] = fTempStruct[i];
975 }
976
977
978
979
980 if(fMCcase && fAODcase){// get Input MC information for AOD case
981
982 /////////////////////////////////////////////////
983 // Xi mc input
984 /////////////////////////////////////////////////
985 for (Int_t it = 0; it < mcArray->GetEntriesFast(); it++) {
986 AliAODMCParticle *mcInputTrackXi = (AliAODMCParticle*)mcArray->At(it);
987
988 if (!mcInputTrackXi) {
989 Error("UserExec", "Could not receive track %d", it);
990 continue;
991 }
992
993 if(abs(mcInputTrackXi->GetPdgCode())!=kXiCode) continue;
994 if(!mcInputTrackXi->IsPhysicalPrimary()) continue;
995
996
997 if(mcInputTrackXi->GetPdgCode() == +kXiCode) ((TH3F*)fOutputList->FindObject("fMCinputTotalXi3"))->Fill(mcInputTrackXi->Pt(), mcInputTrackXi->Y(), mcInputTrackXi->GetCalcMass());
998 else ((TH3F*)fOutputList->FindObject("fMCinputTotalXibar3"))->Fill(mcInputTrackXi->Pt(), mcInputTrackXi->Y(), mcInputTrackXi->GetCalcMass());
999
1000
1001
1002 AliAODMCParticle *mcInputTrackXiD1 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXi->GetDaughter(0)));
1003 AliAODMCParticle *mcInputTrackXiD2 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXi->GetDaughter(1)));
1004
1005 if(abs(mcInputTrackXiD1->GetPdgCode())!=kLambdaCode && abs(mcInputTrackXiD2->GetPdgCode())!=kLambdaCode) continue;
1006 if(abs(mcInputTrackXiD1->GetPdgCode())!=kPionCode && abs(mcInputTrackXiD2->GetPdgCode())!=kPionCode) continue;
1007
1008
1009 // At this point we have the right Xi decay channel
1010
1011 AliAODMCParticle *mcInputTrackLamD1;
1012 AliAODMCParticle *mcInputTrackLamD2;
1013
1014 if(abs(mcInputTrackXiD1->GetPdgCode())==kLambdaCode) {
1015 mcInputTrackLamD1 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiD1->GetDaughter(0)));
1016 mcInputTrackLamD2 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiD1->GetDaughter(1)));
1017 }
1018 else{
1019 mcInputTrackLamD1 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiD2->GetDaughter(0)));
1020 mcInputTrackLamD2 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiD2->GetDaughter(1)));
1021 }
1022
1023
1024 if(abs(mcInputTrackLamD1->GetPdgCode())!=kProtonCode && abs(mcInputTrackLamD2->GetPdgCode())!=kProtonCode) continue;
1025 if(abs(mcInputTrackLamD1->GetPdgCode())!=kPionCode && abs(mcInputTrackLamD2->GetPdgCode())!=kPionCode) continue;
1026
1027 // At this point we have the right Lambda decay channel
1028
1029 if(mcInputTrackXi->GetPdgCode() == +kXiCode) ((TH3F*)fOutputList->FindObject("fMCinputXi"))->Fill(mcInputTrackXi->Pt(), mcInputTrackXi->Y(), mcInputTrackXi->GetCalcMass());
1030 else ((TH3F*)fOutputList->FindObject("fMCinputXibar"))->Fill(mcInputTrackXi->Pt(), mcInputTrackXi->Y(), mcInputTrackXi->GetCalcMass());
1031
1032 }
1033
1034
1035
1036 /////////////////////////////////////////////////
1037 // XiStar mc input
1038 /////////////////////////////////////////////////
1039 for (Int_t it = 0; it < mcArray->GetEntriesFast(); it++) {
1040 AliAODMCParticle *mcInputTrackXiStar = (AliAODMCParticle*)mcArray->At(it);
1041 if (!mcInputTrackXiStar) {
1042 Error("UserExec", "Could not receive track %d", it);
1043 continue;
1044 }
1045
1046 if(abs(mcInputTrackXiStar->GetPdgCode())!=kXiStarCode) continue;
1047 if(!mcInputTrackXiStar->IsPhysicalPrimary()) continue;
1048
1049 if(mcInputTrackXiStar->GetPdgCode() == +kXiStarCode) ((TH3F*)fOutputList->FindObject("fMCinputTotalXiStar3"))->Fill(mcInputTrackXiStar->Pt(), mcInputTrackXiStar->Y(), mcInputTrackXiStar->GetCalcMass());
1050 else ((TH3F*)fOutputList->FindObject("fMCinputTotalXiStarbar3"))->Fill(mcInputTrackXiStar->Pt(), mcInputTrackXiStar->Y(), mcInputTrackXiStar->GetCalcMass());
1051
1052
1053 AliAODMCParticle *mcInputTrackXiStarD1 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiStar->GetDaughter(0)));
1054 AliAODMCParticle *mcInputTrackXiStarD2 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiStar->GetDaughter(1)));
1055
1056 if(abs(mcInputTrackXiStarD1->GetPdgCode())!=kXiCode && abs(mcInputTrackXiStarD2->GetPdgCode())!=kXiCode) continue;
1057 if(abs(mcInputTrackXiStarD1->GetPdgCode())!=kPionCode && abs(mcInputTrackXiStarD2->GetPdgCode())!=kPionCode) continue;
1058
1059
1060 // At this point we have the right Xi(1530) decay channel
1061
1062 AliAODMCParticle *mcInputTrackXiD1;
1063 AliAODMCParticle *mcInputTrackXiD2;
1064 if(abs(mcInputTrackXiStarD1->GetPdgCode())==kXiCode) {
1065 mcInputTrackXiD1 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiStarD1->GetDaughter(0)));
1066 mcInputTrackXiD2 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiStarD1->GetDaughter(1)));
1067 }
1068 else{
1069 mcInputTrackXiD1 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiStarD2->GetDaughter(0)));
1070 mcInputTrackXiD2 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiStarD2->GetDaughter(1)));
1071 }
1072
1073 if(abs(mcInputTrackXiD1->GetPdgCode())!=kLambdaCode && abs(mcInputTrackXiD2->GetPdgCode())!=kLambdaCode) continue;
1074 if(abs(mcInputTrackXiD1->GetPdgCode())!=kPionCode && abs(mcInputTrackXiD2->GetPdgCode())!=kPionCode) continue;
1075
1076
1077 // At this point we have the right Xi decay channel
1078
1079 AliAODMCParticle *mcInputTrackLamD1;
1080 AliAODMCParticle *mcInputTrackLamD2;
1081
1082 if(abs(mcInputTrackXiD1->GetPdgCode())==kLambdaCode) {
1083 mcInputTrackLamD1 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiD1->GetDaughter(0)));
1084 mcInputTrackLamD2 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiD1->GetDaughter(1)));
1085 }
1086 else{
1087 mcInputTrackLamD1 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiD2->GetDaughter(0)));
1088 mcInputTrackLamD2 = (AliAODMCParticle*)mcArray->At(abs(mcInputTrackXiD2->GetDaughter(1)));
1089 }
1090
1091 if(abs(mcInputTrackLamD1->GetPdgCode())!=kProtonCode && abs(mcInputTrackLamD2->GetPdgCode())!=kProtonCode) continue;
1092 if(abs(mcInputTrackLamD1->GetPdgCode())!=kPionCode && abs(mcInputTrackLamD2->GetPdgCode())!=kPionCode) continue;
1093
1094 // At this point we the right Lambda decay channel
1095
1096 if(mcInputTrackXiStar->GetPdgCode() == +kXiStarCode) ((TH3F*)fOutputList->FindObject("fMCinputXiStar"))->Fill(mcInputTrackXiStar->Pt(), mcInputTrackXiStar->Y(), mcInputTrackXiStar->GetCalcMass());
1097 else ((TH3F*)fOutputList->FindObject("fMCinputXiStarbar"))->Fill(mcInputTrackXiStar->Pt(), mcInputTrackXiStar->Y(), mcInputTrackXiStar->GetCalcMass());
1098
1099 if(abs(mcInputTrackXiStarD1->GetPdgCode())==kXiCode) {
1100 ((TH2F*)fOutputList->FindObject("fMCinputXiStarxiy"))->Fill(mcInputTrackXiStar->Y(), mcInputTrackXiStarD1->Y());
1101 ((TH2F*)fOutputList->FindObject("fMCinputXiStarpiony"))->Fill(mcInputTrackXiStar->Y(), mcInputTrackXiStarD2->Y());
1102 }else{
1103 ((TH2F*)fOutputList->FindObject("fMCinputXiStarxiy"))->Fill(mcInputTrackXiStar->Y(), mcInputTrackXiStarD2->Y());
1104 ((TH2F*)fOutputList->FindObject("fMCinputXiStarpiony"))->Fill(mcInputTrackXiStar->Y(), mcInputTrackXiStarD1->Y());
1105 }
1106 if(abs(mcInputTrackXiD1->GetPdgCode())==kLambdaCode){
1107 ((TH2F*)fOutputList->FindObject("fMCinputXilambday"))->Fill(mcInputTrackXiStar->Y(), mcInputTrackXiD1->Y());
1108 ((TH2F*)fOutputList->FindObject("fMCinputXipiony"))->Fill(mcInputTrackXiStar->Y(), mcInputTrackXiD2->Y());
1109 }else{
1110 ((TH2F*)fOutputList->FindObject("fMCinputXilambday"))->Fill(mcInputTrackXiStar->Y(), mcInputTrackXiD2->Y());
1111 ((TH2F*)fOutputList->FindObject("fMCinputXipiony"))->Fill(mcInputTrackXiStar->Y(), mcInputTrackXiD1->Y());
1112 }
1113 if(abs(mcInputTrackLamD1->GetPdgCode())==kProtonCode){
1114 ((TH2F*)fOutputList->FindObject("fMCinputLamprotony"))->Fill(mcInputTrackXiStar->Y(), mcInputTrackLamD1->Y());
1115 ((TH2F*)fOutputList->FindObject("fMCinputLampiony"))->Fill(mcInputTrackXiStar->Y(), mcInputTrackLamD2->Y());
1116 }else {
1117 ((TH2F*)fOutputList->FindObject("fMCinputLamprotony"))->Fill(mcInputTrackXiStar->Y(), mcInputTrackLamD2->Y());
1118 ((TH2F*)fOutputList->FindObject("fMCinputLampiony"))->Fill(mcInputTrackXiStar->Y(), mcInputTrackLamD1->Y());
1119 }
1120
1121
1122 }
1123 }
1124
1125
1126
1127 if(fMCcase && !fAODcase){// get Input MC information for ESD case
1128
1129 /////////////////////////////////////////////////
1130 // Xi mc input
1131 /////////////////////////////////////////////////
1132 for (Int_t it = 0; it < mcstack->GetNprimary(); it++) {
1133 TParticle *mcInputTrackXi = (TParticle*)mcstack->Particle(it);
1134 if (!mcInputTrackXi) {
1135 Error("UserExec", "Could not receive track %d", it);
1136 continue;
1137 }
1138
1139 //if(!mcstack->IsPhysicalPrimary(it)) continue;
1140 if(abs(mcInputTrackXi->GetPdgCode())!=kXiCode) continue;
1141
1142
1143 if(mcInputTrackXi->GetPdgCode() == +kXiCode) ((TH3F*)fOutputList->FindObject("fMCinputTotalXi3"))->Fill(mcInputTrackXi->Pt(), mcInputTrackXi->Y(), mcInputTrackXi->GetCalcMass());
1144 else ((TH3F*)fOutputList->FindObject("fMCinputTotalXibar3"))->Fill(mcInputTrackXi->Pt(), mcInputTrackXi->Y(), mcInputTrackXi->GetCalcMass());
1145
1146 }
1147
1148
1149 /////////////////////////////////////////////////
1150 // XiStar mc input
1151 /////////////////////////////////////////////////
1152 for (Int_t it = 0; it < mcstack->GetNprimary(); it++) {
1153 TParticle *mcInputTrackXiStar = (TParticle*)mcstack->Particle(it);
1154 if (!mcInputTrackXiStar) {
1155 Error("UserExec", "Could not receive track %d", it);
1156 continue;
1157 }
1158
1159 //if(!mcstack->IsPhysicalPrimary(it)) continue;
1160 if(abs(mcInputTrackXiStar->GetPdgCode())!=kXiStarCode) continue;
1161
1162 if(mcInputTrackXiStar->GetPdgCode() == +kXiStarCode) ((TH3F*)fOutputList->FindObject("fMCinputTotalXiStar3"))->Fill(mcInputTrackXiStar->Pt(), mcInputTrackXiStar->Y(), mcInputTrackXiStar->GetCalcMass());
1163 else ((TH3F*)fOutputList->FindObject("fMCinputTotalXiStarbar3"))->Fill(mcInputTrackXiStar->Pt(), mcInputTrackXiStar->Y(), mcInputTrackXiStar->GetCalcMass());
1164
1165 }
1166 }
1167
1168
1169
1170 if(fAODcase) {cout<<"AOD XiVertexer not currently supported! Exiting event"<<endl; return;}
1171
1172 ////////////////////////////////////////////////
1173 // Reconstruction
fe45e21b 1174
3311ad64 1175 for(Int_t i=0; i<fESD->GetNumberOfCascades(); i++){
1176
1177 AliESDcascade *Xicandidate = fESD->GetCascade(i);
1178
1179 if(TMath::Abs( Xicandidate->GetPindex()) == TMath::Abs( Xicandidate->GetNindex())) continue;
1180 if(TMath::Abs( Xicandidate->GetPindex()) == TMath::Abs( Xicandidate->GetBindex())) continue;
1181 if(TMath::Abs( Xicandidate->GetNindex()) == TMath::Abs( Xicandidate->GetBindex())) continue;
1182
1183 AliESDtrack *pTrackXi = fESD->GetTrack(TMath::Abs( Xicandidate->GetPindex()));
1184 AliESDtrack *nTrackXi = fESD->GetTrack(TMath::Abs( Xicandidate->GetNindex()));
1185 AliESDtrack *bTrackXi = fESD->GetTrack(TMath::Abs( Xicandidate->GetBindex()));
1186
1187 // Standard track QA cuts
1188 if(!fTrackCut->AcceptTrack(pTrackXi)) continue;
1189 if(!fTrackCut->AcceptTrack(nTrackXi)) continue;
1190 if(!fTrackCut->AcceptTrack(bTrackXi)) continue;
fe45e21b 1191
1192 //////////////////////
1193 // DecayParameters Key (number represents array index)
1194 // NclustersTPC: 0=proton, 1=pion first, 2=pion second, 3=pion third
1195 // DCAVtx: 4=proton, 5=pion first, 6=pion second, 7=lambda, 8=pion third
1196 // 9 = DCA proton-pion
1197 // 10 = DCA Lambda-pion
1198 // 11 = Rxy Lambda
1199 // 12 = Rxy Xi
1200 // 13 = Cos PA Lambda
1201 // 14 = Cos PA Xi
1202
1203
1204 fDecayParameters[2] = bTrackXi->GetTPCNcls();
3311ad64 1205
fe45e21b 1206
3311ad64 1207 if(Xicandidate->Charge() == -1){
fe45e21b 1208 fDecayParameters[0] = pTrackXi->GetTPCNcls();
1209 fDecayParameters[1] = nTrackXi->GetTPCNcls();
1210 fDecayParameters[4] = fabs(pTrackXi->GetD(primaryVtx[0],primaryVtx[1],bField));// DCA Vtx proton
1211 fDecayParameters[5] = fabs(nTrackXi->GetD(primaryVtx[0],primaryVtx[1],bField));// DCA Vtx pion first
3311ad64 1212 }else{
fe45e21b 1213 fDecayParameters[0] = nTrackXi->GetTPCNcls();
1214 fDecayParameters[1] = pTrackXi->GetTPCNcls();
1215 fDecayParameters[4] = fabs(nTrackXi->GetD(primaryVtx[0],primaryVtx[1],bField));// DCA Vtx proton
1216 fDecayParameters[5] = fabs(pTrackXi->GetD(primaryVtx[0],primaryVtx[1],bField));// DCA Vtx pion first
3311ad64 1217 }
1218
1219
fe45e21b 1220 fDecayParameters[6] = fabs(bTrackXi->GetD(primaryVtx[0],primaryVtx[1],bField));// DCA Vtx pion second
1221 fDecayParameters[7] = fabs(Xicandidate->GetD(primaryVtx[0],primaryVtx[1],primaryVtx[2]));// DCA Vtx Lambda
1222 fDecayParameters[9] = fabs(Xicandidate->GetDcaV0Daughters());// DCA proton-pion
1223 fDecayParameters[10] = fabs(Xicandidate->GetDcaXiDaughters());// DCA Lambda-pion
1224
1225
3311ad64 1226
1227 Double_t tempX[3]={0};
1228 Xicandidate->GetXYZ(tempX[0], tempX[1], tempX[2]);
fe45e21b 1229 fDecayParameters[11] = sqrt( pow(tempX[0],2) + pow(tempX[1],2));// Rxy Lambda
3311ad64 1230 if(sqrt( pow(tempX[0],2) + pow(tempX[1],2) ) > fMaxDecayLength) continue;
1231
1232
fe45e21b 1233 fDecayParameters[13] = Xicandidate->GetV0CosineOfPointingAngle(primaryVtx[0],primaryVtx[1],primaryVtx[2]);// Cos PA Lambda
1234 fDecayParameters[14] = Xicandidate->GetCascadeCosineOfPointingAngle(primaryVtx[0],primaryVtx[1],primaryVtx[2]);// Cos PA Xi
3311ad64 1235
3311ad64 1236 xiP[0] = Xicandidate->Px();
1237 xiP[1] = Xicandidate->Py();
1238 xiP[2] = Xicandidate->Pz();
1239 xiVtx[0] = Xicandidate->Xv();
1240 xiVtx[1] = Xicandidate->Yv();
1241 xiVtx[2] = Xicandidate->Zv();
1242 xiPt = Xicandidate->Pt();
1243 xiY = Xicandidate->RapXi();
1244 xiMass = Xicandidate->M();
1245 xiCharge = Xicandidate->Charge();
1246
1247 decayLengthXY = sqrt( pow(xiVtx[0]-primaryVtx[0],2) + pow(xiVtx[1]-primaryVtx[1],2) );
fe45e21b 1248 fDecayParameters[12] = decayLengthXY;// Rxy Xi
3311ad64 1249 if(decayLengthXY > fMaxDecayLength) continue;// 2d version
1250
fe45e21b 1251 Bool_t StandardXi=kTRUE;
1252 if(fDecayParameters[0] < fCutValues[0][0]) StandardXi=kFALSE;// Nclus proton
1253 if(fDecayParameters[1] < fCutValues[0][1]) StandardXi=kFALSE;// Nclus pion first
1254 if(fDecayParameters[2] < fCutValues[0][2]) StandardXi=kFALSE;// Nclus pion second
1255 //
1256 if(fDecayParameters[4] < fCutValues[0][4]) StandardXi=kFALSE;// DCAVtx proton
1257 if(fDecayParameters[5] < fCutValues[0][5]) StandardXi=kFALSE;// DCAVtx pion first
1258 if(fDecayParameters[6] < fCutValues[0][6]) StandardXi=kFALSE;// DCAVtx pion second
1259 if(fDecayParameters[7] < fCutValues[0][7]) StandardXi=kFALSE;// DCAVtx Lambda
1260 //
1261 if(fDecayParameters[9] > fCutValues[0][9]) StandardXi=kFALSE;// DCAV proton-pion
1262 if(fDecayParameters[10] > fCutValues[0][10]) StandardXi=kFALSE;// DCAV Lambda-pion
1263 //
1264 if(fDecayParameters[11] < fCutValues[0][11]) StandardXi=kFALSE;// Rxy Lambda
1265 if(fDecayParameters[12] < fCutValues[0][12]) StandardXi=kFALSE;// Rxy Xi
1266 //
1267 if(fDecayParameters[13] < fCutValues[0][13]) StandardXi=kFALSE;// Cos PA Lambda
1268 if(fDecayParameters[14] < fCutValues[0][14]) StandardXi=kFALSE;// Cos PA Xi
3311ad64 1269
fe45e21b 1270 if(StandardXi){
1271 if(xiCharge == -1) CutVar[0].fXi->Fill(xiPt, xiY, xiMass);
1272 else CutVar[0].fXibar->Fill(xiPt, xiY, xiMass);
1273 }
3311ad64 1274
1275 // MC associaton
1276 mcXiFilled = kFALSE;
1277 if(fMCcase && !fAODcase){
1278
1279 MCXiD2esd = (TParticle*)mcstack->Particle(abs(bTrackXi->GetLabel()));
1280
1281 if(abs(MCXiD2esd->GetPdgCode())==kPionCode){
1282
1283 MCLamD1esd = (TParticle*)mcstack->Particle(abs(pTrackXi->GetLabel()));
1284 MCLamD2esd = (TParticle*)mcstack->Particle(abs(nTrackXi->GetLabel()));
1285
1286 if(MCLamD1esd->GetMother(0) == MCLamD2esd->GetMother(0)){
1287 if(abs(MCLamD1esd->GetPdgCode())==kProtonCode || abs(MCLamD2esd->GetPdgCode())==kProtonCode) {
1288 if(abs(MCLamD1esd->GetPdgCode())==kPionCode || abs(MCLamD2esd->GetPdgCode())==kPionCode) {
1289
1290 MCLamesd = (TParticle*)mcstack->Particle(abs(MCLamD1esd->GetMother(0)));
1291 if(abs(MCLamesd->GetPdgCode())==kLambdaCode) {
1292
1293 if(MCLamesd->GetMother(0) == MCXiD2esd->GetMother(0)){
1294 MCXiesd = (TParticle*)mcstack->Particle(abs(MCLamesd->GetMother(0)));
1295 if(abs(MCXiesd->GetPdgCode())==kXiCode) {
3311ad64 1296 mcXiFilled = kTRUE;
fe45e21b 1297
1298 if(StandardXi){
1299 if(Xicandidate->Charge() == -1) {
1300 CutVar[0].fMCrecXi->Fill(xiPt, xiY, xiMass);
1301 }else {
1302 CutVar[0].fMCrecXibar->Fill(xiPt, xiY, xiMass);
1303 }
1304 }
1305
3311ad64 1306 }
1307 }
1308 }
1309 }
1310 }
1311 }
1312 }
1313 }// MC association
1314
1315
1316 if(fabs(xiMass-fTrueMassXi) > fMassWindow) continue;
1317
1318
1319
1320 fXiTrack->Set(xiVtx, xiP, fCovMatrix, Short_t(xiCharge));
1321
1322
1323 //////////////////////////////////////////////////////////
1324 // Reconstruct Xi(1530)
1325 for(Int_t EN=0; EN<fEventsToMix+1; EN++){// Event buffer loop
1326
1327 for(Int_t l=0; l<(fEvt+EN)->fNTracks; l++){// Present(EN=0) and Past(EN from 1 to fEventsToMix) event track loop
1328
1329 if(EN==0) {
1330 if((fEvt+EN)->fTracks[l].fID == pTrackXi->GetID()) continue;
1331 if((fEvt+EN)->fTracks[l].fID == nTrackXi->GetID()) continue;
1332 if((fEvt+EN)->fTracks[l].fID == bTrackXi->GetID()) continue;
1333 }
1334
1335 fXiTrack->Set(xiVtx, xiP, fCovMatrix, Short_t(xiCharge));
fe45e21b 1336
3311ad64 1337 if(!fESDTrack4) continue;
92650a3e 1338 fESDTrack4->Set((fEvt+EN)->fTracks[l].fX, (fEvt+EN)->fTracks[l].fP, (fEvt+EN)->fTracks[l].fCov, (fEvt+EN)->fTracks[l].fCharge);
3311ad64 1339 if(fAODcase){
1340 if((Bool_t)(((1<<5) & (fEvt+EN)->fTracks[l].fFilterMap) == 0)) continue;// AOD filterbit cut, "Standard cuts with tight dca"
1341 }else{
fe45e21b 1342 fDecayParameters[8] = (fEvt+EN)->fTracks[l].fDCAXY;// DCA Vtx pion third
3311ad64 1343 if((fEvt+EN)->fTracks[l].fDCAZ > 2) continue;
1344 if( (((fEvt+EN)->fTracks[l].fStatus)&AliESDtrack::kITSrefit)==0) continue;// Require itsrefit
1345 // no Chi^2 cut applied for ESDs. Info not available in my track structure.
1346 }
1347
3311ad64 1348 if(fabs((fEvt+EN)->fTracks[l].fEta) > 0.8) continue;
1349
fe45e21b 1350 fDecayParameters[3] = (fEvt+EN)->fTracks[l].fNclusTPC;
3311ad64 1351
1352 AliVertex *XiStarVtx = new AliVertex((fEvt+EN)->fTracks[l].fX,0,0);
1353 //fESDTrack4->PropagateToDCA(fXiTrack, bField);// Propagate tracks to dca, both tracks are budged
1354 if(!(fXiTrack->PropagateToDCA(XiStarVtx, bField, 3))) continue;// Propagate tracks to dca, version which assumes fESDTrack4 is already primary
1355 /////////////
1356 fXiTrack->GetPxPyPz(pDaughter1);
1357 fXiTrack->GetXYZ(xDaughter1);
1358 fESDTrack4->GetPxPyPz(pDaughter2);
1359 fESDTrack4->GetXYZ(xDaughter2);
1360 //////////////////////////
1361
1362
1363
fe45e21b 1364 //xiStarVtx[0] = (xDaughter1[0]+xDaughter2[0])/2.;
1365 //xiStarVtx[1] = (xDaughter1[1]+xDaughter2[1])/2.;
1366 //xiStarVtx[2] = (xDaughter1[2]+xDaughter2[2])/2.;
1367 //decayLength = sqrt(pow(xiStarVtx[0]-primaryVtx[0],2)+pow(xiStarVtx[1]-primaryVtx[1],2)+pow(xiStarVtx[2]-primaryVtx[2],2));
3311ad64 1368
1369 px1=pDaughter1[0];
1370 py1=pDaughter1[1];
1371 pz1=pDaughter1[2];
1372 px2=pDaughter2[0];
1373 py2=pDaughter2[1];
1374 pz2=pDaughter2[2];
1375
1376 p1sq=px1*px1+py1*py1+pz1*pz1;
1377 p2sq=px2*px2+py2*py2+pz2*pz2;
1378 if(p1sq <=0 || p2sq <=0) continue;
1379
1380 e1=sqrt(p1sq+fTrueMassXi*fTrueMassXi);
1381 e2=sqrt(p2sq+fTrueMassPi*fTrueMassPi);
1382 angle=px1*px2+py1*py2+pz1*pz2;
1383 xiStarMass=fTrueMassXi*fTrueMassXi+fTrueMassPi*fTrueMassPi+2.*e1*e2-2.*angle;
1384 if(xiStarMass<0.) xiStarMass=1.e-8;
1385 xiStarMass=sqrt(xiStarMass);
1386
1387
1388 xiStarP[0] = px1+px2;
1389 xiStarP[1] = py1+py2;
1390 xiStarP[2] = pz1+pz2;
1391 xiStarMom = sqrt(pow(xiStarP[0],2)+pow(xiStarP[1],2)+pow(xiStarP[2],2));
1392 if(xiStarMom==0) continue; // So one of the following lines doesnt break
1393 xiStarPt = sqrt(xiStarP[0]*xiStarP[0] + xiStarP[1]*xiStarP[1]);
1394 xiStarY = .5*log( ((e1+e2) + xiStarP[2])/((e1+e2) - xiStarP[2]));
fe45e21b 1395 //xiStarE = e1 + e2;
3311ad64 1396
1397
fe45e21b 1398 //if( (xiStarP[0]*(xiStarVtx[0]-primaryVtx[0]) + xiStarP[1]*(xiStarVtx[1]-primaryVtx[1]) + xiStarP[2]*(xiStarVtx[2]-primaryVtx[2]))/xiStarMom/decayLength < fXiStarCosTheta) continue;
1399
1400 for(int cv=0; cv<kNCutVariations; cv++){
1401 if(fDecayParameters[0] < fCutValues[cv][0]) continue;// Nclus proton
1402 if(fDecayParameters[1] < fCutValues[cv][1]) continue;// Nclus pion first
1403 if(fDecayParameters[2] < fCutValues[cv][2]) continue;// Nclus pion second
1404 if(fDecayParameters[3] < fCutValues[cv][3]) continue;// Nclus pion third
1405 //
1406 if(fDecayParameters[4] < fCutValues[cv][4]) continue;// DCAVtx proton
1407 if(fDecayParameters[5] < fCutValues[cv][5]) continue;// DCAVtx pion first
1408 if(fDecayParameters[6] < fCutValues[cv][6]) continue;// DCAVtx pion second
1409 if(fDecayParameters[7] < fCutValues[cv][7]) continue;// DCAVtx Lambda
1410 if(cv!=8) {if(fDecayParameters[8] > (0.0182 + 0.035/pow((fEvt+EN)->fTracks[l].fPt,1.01))) continue;}// DCAVtx pion third
1411 else {if(fDecayParameters[8] > fCutValues[cv][8]) continue;}// DCAVtx pion third
1412 //
1413 if(fDecayParameters[9] > fCutValues[cv][9]) continue;// DCAV proton-pion
1414 if(fDecayParameters[10] > fCutValues[cv][10]) continue;// DCAV Lambda-pion
1415 //
1416 if(fDecayParameters[11] < fCutValues[cv][11]) continue;// Rxy Lambda
1417 if(fDecayParameters[12] < fCutValues[cv][12]) continue;// Rxy Xi
1418 //
1419 if(fDecayParameters[13] < fCutValues[cv][13]) continue;// Cos PA Lambda
1420 if(fDecayParameters[14] < fCutValues[cv][14]) continue;// Cos PA Xi
1421
3311ad64 1422
fe45e21b 1423 if(EN==0){
1424 if(fXiTrack->Charge() == -1 && fESDTrack4->Charge() == -1) CutVar[cv].fXiMinusPiMinus->Fill(xiStarPt, xiStarY, xiStarMass);
1425 else if(fXiTrack->Charge() == -1 && fESDTrack4->Charge() == +1) CutVar[cv].fXiMinusPiPlus->Fill(xiStarPt, xiStarY, xiStarMass);
1426 else if(fXiTrack->Charge() == +1 && fESDTrack4->Charge() == -1) CutVar[cv].fXiPlusPiMinus->Fill(xiStarPt, xiStarY, xiStarMass);
1427 else CutVar[cv].fXiPlusPiPlus->Fill(xiStarPt, xiStarY, xiStarMass);
1428 }else {
1429 if(fXiTrack->Charge() == -1 && fESDTrack4->Charge() == -1) CutVar[cv].fXiMinusPiMinusbkg->Fill(xiStarPt, xiStarY, xiStarMass);
1430 else if(fXiTrack->Charge() == -1 && fESDTrack4->Charge() == +1) CutVar[cv].fXiMinusPiPlusbkg->Fill(xiStarPt, xiStarY, xiStarMass);
1431 else if(fXiTrack->Charge() == +1 && fESDTrack4->Charge() == -1) CutVar[cv].fXiPlusPiMinusbkg->Fill(xiStarPt, xiStarY, xiStarMass);
1432 else CutVar[cv].fXiPlusPiPlusbkg->Fill(xiStarPt, xiStarY, xiStarMass);
1433 }
1434
3311ad64 1435
1436 /*
fe45e21b 1437 // MC associaton AOD
3311ad64 1438 if(fMCcase && mcXiFilled && EN==0 && fAODcase){// AOD MC's
1439
1440 MCXiStarD2 = (AliAODMCParticle*)mcArray->At(abs((fEvt)->fTracks[l].fLabel));
1441
1442 if(abs(MCXiStarD2->GetPdgCode())==kPionCode){
1443 if(MCXi->GetMother() == MCXiStarD2->GetMother()){
1444 MCXiStar = (AliAODMCParticle*)mcArray->At(MCXi->GetMother());
1445 if(abs(MCXiStar->GetPdgCode())==kXiStarCode) {
1446
1447 if(fXiTrack->Charge() == -1 && fESDTrack4->Charge() == +1) fMCrecXiMinusPiPlus->Fill(xiStarPt, xiStarY, xiStarMass);
1448 if(fXiTrack->Charge() == +1 && fESDTrack4->Charge() == -1) fMCrecXiPlusPiMinus->Fill(xiStarPt, xiStarY, xiStarMass);
1449
1450 }
1451 }
1452 }
1453 }
1454 */
1455
fe45e21b 1456 // MC associaton ESD
1457 if(fMCcase && mcXiFilled && EN==0 && !fAODcase){// ESD MC's
1458 MCXiStarD2esd = (TParticle*)mcstack->Particle(abs((fEvt)->fTracks[l].fLabel));
1459
1460 if(abs(MCXiStarD2esd->GetPdgCode())==kPionCode){
1461 if(MCXiesd->GetMother(0) == MCXiStarD2esd->GetMother(0)){
1462
1463 MCXiStaresd = (TParticle*)mcstack->Particle(abs(MCXiesd->GetMother(0)));
1464 if(abs(MCXiStaresd->GetPdgCode())==kXiStarCode) {
1465
1466 if(fXiTrack->Charge() == -1 && fESDTrack4->Charge() == +1) CutVar[cv].fMCrecXiMinusPiPlus->Fill(xiStarPt, xiStarY, xiStarMass);
1467 if(fXiTrack->Charge() == +1 && fESDTrack4->Charge() == -1) CutVar[cv].fMCrecXiPlusPiMinus->Fill(xiStarPt, xiStarY, xiStarMass);
1468
1469 }
3311ad64 1470 }
1471 }
1472 }
3311ad64 1473
fe45e21b 1474 }// Cut Variation loop
3311ad64 1475 }// 3rd pion loop
1476 }// Event mixing loop
1477
1478 }// Xi loop
1479
1480
1481
1482 // Post output data.
1483 PostData(1, fOutputList);
1484
1485}
1486//________________________________________________________________________
1487void AliXiStar::Terminate(Option_t *)
1488{
1489 cout<<"Done"<<endl;
1490}
1491//________________________________________________________________________
1492Double_t AliXiStar::LinearPropagateToDCA(AliESDtrack *v, AliESDtrack *t, Double_t b) {// Adapted from AliCascadeVertexer.cxx
1493 //--------------------------------------------------------------------
1494 // This function returns the DCA between the V0 and the track
1495 //--------------------------------------------------------------------
1496
1497 Double_t alpha=t->GetAlpha(), cs1=TMath::Cos(alpha), sn1=TMath::Sin(alpha);
1498 Double_t r[3]; t->GetXYZ(r);
1499 Double_t x1=r[0], y1=r[1], z1=r[2];
1500 Double_t p[3]; t->GetPxPyPz(p);
1501 Double_t px1=p[0], py1=p[1], pz1=p[2];
1502
1503 Double_t x2[3]={0};
1504 Double_t p2[3]={0};
1505 Double_t vx2,vy2,vz2; // position and momentum of V0
1506 Double_t px2,py2,pz2;
1507
1508 v->GetXYZ(x2);
1509 v->GetPxPyPz(p2);
1510 vx2=x2[0], vy2=x2[1], vz2=x2[2];
1511 px2=p2[0], py2=p2[1], pz2=p2[2];
1512
1513// calculation dca
1514
1515 Double_t dd= Det(vx2-x1,vy2-y1,vz2-z1,px1,py1,pz1,px2,py2,pz2);
1516 Double_t ax= Det(py1,pz1,py2,pz2);
1517 Double_t ay=-Det(px1,pz1,px2,pz2);
1518 Double_t az= Det(px1,py1,px2,py2);
1519
1520 Double_t dca=TMath::Abs(dd)/TMath::Sqrt(ax*ax + ay*ay + az*az);
1521
1522//points of the DCA
1523 Double_t t1 = Det(vx2-x1,vy2-y1,vz2-z1,px2,py2,pz2,ax,ay,az)/
1524 Det(px1,py1,pz1,px2,py2,pz2,ax,ay,az);
1525
1526 x1 += px1*t1; y1 += py1*t1; //z1 += pz1*t1;
1527
1528
1529 //propagate track to the points of DCA
1530
1531 x1=x1*cs1 + y1*sn1;
1532 if (!t->PropagateTo(x1,b)) {
1533 Error("PropagateToDCA","Propagation failed !");
1534 return 1.e+33;
1535 }
1536
1537 return dca;
1538}
1539
1540
1541//________________________________________________________________________
1542Double_t AliXiStar::Det(Double_t a00, Double_t a01, Double_t a10, Double_t a11) const {// Taken from AliCascadeVertexer
1543 //--------------------------------------------------------------------
1544 // This function calculates locally a 2x2 determinant
1545 //--------------------------------------------------------------------
1546 return a00*a11 - a01*a10;
1547}
1548//________________________________________________________________________
1549Double_t AliXiStar::Det(Double_t a00,Double_t a01,Double_t a02,
1550 Double_t a10,Double_t a11,Double_t a12,
1551 Double_t a20,Double_t a21,Double_t a22) const {// Taken from AliCascadeVertexer
1552 //--------------------------------------------------------------------
1553 // This function calculates locally a 3x3 determinant
1554 //--------------------------------------------------------------------
1555 return a00*Det(a11,a12,a21,a22)-a01*Det(a10,a12,a20,a22)+a02*Det(a10,a11,a20,a21);
1556}
1557
1558
1559