1 /*************************************************************************
\r
2 * Copyright(c) 1998-2008,ALICE Experiment at CERN,All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use,copy,modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee,provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
16 /////////////////////////////////////////////////////
\r
17 // AliAnalysisTaskFlowStrange:
\r
18 // Analysis task to select K0/Lambda candidates for flow analysis.
\r
19 // Uses one AliESDtrackCuts object for both daughters and
\r
20 // QA histograms to monitor the reconstruction.
\r
21 // Authors: Cristian Ivan (civan@cern.ch)
\r
22 // Carlos Perez (cperez@cern.ch)
\r
23 // Pawel Debski (pdebski@cern.ch)
\r
24 //////////////////////////////////////////////////////
\r
31 #include "TProfile.h"
\r
32 #include "TVector3.h"
\r
34 #include "AliAnalysisManager.h"
\r
35 #include "AliInputEventHandler.h"
\r
37 #include "AliESDEvent.h"
\r
38 #include "AliESDtrack.h"
\r
39 #include "AliESDVertex.h"
\r
40 #include "AliESDv0.h"
\r
41 #include "AliESDtrackCuts.h"
\r
43 #include "AliAODEvent.h"
\r
44 #include "AliAODTrack.h"
\r
45 #include "AliAODVertex.h"
\r
46 #include "AliAODv0.h"
\r
48 #include "AliAODMCParticle.h"
\r
49 #include "TClonesArray.h"
\r
50 #include "TDatabasePDG.h"
\r
51 #include "TParticlePDG.h"
\r
54 #include "TObjArray.h"
\r
55 #include "AliFlowCandidateTrack.h"
\r
57 #include "AliFlowTrackCuts.h"
\r
58 #include "AliFlowEventCuts.h"
\r
59 #include "AliFlowEvent.h"
\r
60 #include "AliFlowBayesianPID.h"
\r
61 #include "AliFlowCommonConstants.h"
\r
62 #include "AliFlowVector.h"
\r
64 #include "AliAnalysisTaskFlowStrange.h"
\r
66 ClassImp(AliAnalysisTaskFlowStrange)
\r
68 //=======================================================================
\r
69 AliAnalysisTaskFlowStrange::AliAnalysisTaskFlowStrange() :
\r
70 AliAnalysisTaskSE(),
\r
74 fUseEventSelection(kTRUE),
\r
91 fFlowEventTPC(NULL),
\r
92 fFlowEventVZE(NULL),
\r
97 for (Int_t i=0; i!=11; ++i)
\r
100 //=======================================================================
\r
101 AliAnalysisTaskFlowStrange::AliAnalysisTaskFlowStrange(const char *name,
\r
102 AliFlowEventCuts *cutsEvent,
\r
103 AliFlowTrackCuts *cutsRFPTPC,
\r
104 AliFlowTrackCuts *cutsRFPVZE,
\r
105 AliESDtrackCuts *cutsDau) :
\r
106 AliAnalysisTaskSE(name),
\r
107 fPIDResponse(NULL),
\r
108 fBayesianPID(NULL),
\r
110 fUseEventSelection(kTRUE),
\r
112 fDoExtraQA(kFALSE),
\r
122 fCutsEvent(cutsEvent),
\r
123 fCutsRFPTPC(cutsRFPTPC),
\r
124 fCutsRFPVZE(cutsRFPVZE),
\r
127 fFlowEventTPC(NULL),
\r
128 fFlowEventVZE(NULL),
\r
133 for (Int_t i=0; i!=11; ++i)
\r
136 DefineInput( 0,TChain::Class());
\r
137 DefineOutput(1,AliFlowEventSimple::Class()); // TPC object
\r
138 DefineOutput(2,AliFlowEventSimple::Class()); // VZE object
\r
139 DefineOutput(3,TList::Class());
\r
141 //=======================================================================
\r
142 AliAnalysisTaskFlowStrange::~AliAnalysisTaskFlowStrange()
\r
145 if (fQAList) delete fQAList;
\r
146 if (fFlowEventTPC) delete fFlowEventTPC;
\r
147 if (fFlowEventVZE) delete fFlowEventVZE;
\r
148 if (fCandidates) delete fCandidates;
\r
149 if (fCutsDau) delete fCutsDau;
\r
150 if (fCutsPOI) delete fCutsPOI;
\r
151 if (fCutsRFPTPC) delete fCutsRFPTPC;
\r
152 if (fCutsRFPVZE) delete fCutsRFPVZE;
\r
153 if (fCalib) delete fCalib;
\r
155 //=======================================================================
\r
156 void AliAnalysisTaskFlowStrange::UserCreateOutputObjects()
\r
158 //UserCreateOutputObjects
\r
159 fQAList=new TList();
\r
160 fQAList->SetOwner();
\r
164 AliFlowCommonConstants *cc = AliFlowCommonConstants::GetMaster();
\r
165 cc->SetNbinsMult(1); cc->SetMultMin(0); cc->SetMultMax(1);
\r
166 cc->SetNbinsPt(120); cc->SetPtMin(0.0); cc->SetPtMax(12.0);
\r
167 cc->SetNbinsPhi(1); cc->SetPhiMin(0.0); cc->SetPhiMax(TMath::TwoPi());
\r
168 cc->SetNbinsEta(18); cc->SetEtaMin(-0.9); cc->SetEtaMax(+0.9);
\r
169 cc->SetNbinsQ(1); cc->SetQMin(0.0); cc->SetQMax(1.0);
\r
170 cc->SetNbinsMass(fMassBins);
\r
171 cc->SetMassMin(fMinMass);
\r
172 cc->SetMassMax(fMaxMass);
\r
174 fCutsPOI = new AliFlowTrackCuts("dumb_cuts");
\r
175 fCutsPOI->SetParamType( fCutsRFPTPC->GetParamType() );
\r
176 fCutsPOI->SetPtRange(+1.0,-1.0);
\r
177 fCutsPOI->SetEtaRange(+1.0,-1.0);
\r
179 fBayesianPID = new AliFlowBayesianPID();
\r
180 fBayesianPID->SetNewTrackParam();
\r
181 fFlowEventTPC = new AliFlowEvent(3000);
\r
182 fFlowEventVZE = new AliFlowEvent(500);
\r
183 fCandidates = new TObjArray(100);
\r
184 fCandidates->SetOwner();
\r
186 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
\r
187 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
\r
188 fPIDResponse = inputHandler->GetPIDResponse();
\r
190 PostData(1,fFlowEventTPC);
\r
191 PostData(2,fFlowEventVZE);
\r
192 PostData(3,fQAList);
\r
195 //=======================================================================
\r
196 void AliAnalysisTaskFlowStrange::Exec(Option_t* option)
\r
198 //bypassing ::exec (needed because of AMPT)
\r
199 if(fMCmatch==-1) // executes EVENT in data analysis
\r
200 AliAnalysisTaskSE::Exec(option);
\r
201 else // executes EVENT in monteCarlo
\r
202 AliAnalysisTaskFlowStrange::MyUserExec(option);
\r
204 //=======================================================================
\r
205 void AliAnalysisTaskFlowStrange::UserExec(Option_t *option)
\r
208 if(fRunOnpA) { // temporal extra cuts for pA (2BE REMOVED!)
\r
209 AliAODEvent *aod=dynamic_cast<AliAODEvent*>(InputEvent());
\r
211 if(aod->GetHeader()->GetEventNumberESDFile() == 0) return; //rejecting first chunk
\r
212 // https://twiki.cern.ch/twiki/bin/viewauth/ALICE/PAVertexSelectionStudies
\r
213 const AliAODVertex* trkVtx = aod->GetPrimaryVertex();
\r
214 if (!trkVtx || trkVtx->GetNContributors()<=0) return;
\r
215 TString vtxTtl = trkVtx->GetTitle();
\r
216 if (!vtxTtl.Contains("VertexerTracks")) return;
\r
217 Float_t zvtx = trkVtx->GetZ();
\r
218 const AliAODVertex* spdVtx = aod->GetPrimaryVertexSPD();
\r
219 if (spdVtx->GetNContributors()<=0) return;
\r
220 TString vtxTyp = spdVtx->GetTitle();
\r
221 Double_t cov[6]={0};
\r
222 spdVtx->GetCovarianceMatrix(cov);
\r
223 Double_t zRes = TMath::Sqrt(cov[5]);
\r
224 if (vtxTyp.Contains("vertexer:Z") && (zRes>0.25)) return;
\r
225 if (TMath::Abs(spdVtx->GetZ() - trkVtx->GetZ())>0.5) return;
\r
226 if (TMath::Abs(zvtx) > 10) return;
\r
229 AliAnalysisTaskFlowStrange::MyUserExec(option);
\r
231 //=======================================================================
\r
232 void AliAnalysisTaskFlowStrange::AddQAEvents()
\r
234 // function to add event qa
\r
235 TList *tQAEvents=new TList();
\r
236 tQAEvents->SetName("Event");
\r
237 tQAEvents->SetOwner();
\r
239 TH1D *tEvent = new TH1D("Events","Number of Events",3,0,3); tQAEvents->Add(tEvent);
\r
240 tEvent->GetXaxis()->SetBinLabel(1,"reached");
\r
241 tEvent->GetXaxis()->SetBinLabel(2,"selected");
\r
242 tEvent->GetXaxis()->SetBinLabel(3,"unexpected");
\r
245 TH1D *tTPCRFP = new TH1D("RFPTPC","TPC Reference Flow Particles;multiplicity",3000,0,3000); tQAEvents->Add(tTPCRFP);
\r
246 TH1D *tVZERFP = new TH1D("RFPVZE","VZERO Reference Flow Particles;multiplicity",3000,0,30000); tQAEvents->Add(tVZERFP);
\r
247 tH2D = new TH2D("TPCPhiEta","TPC RFP;Phi;Eta",100,0,TMath::TwoPi(),100,-1.0,+1.0); tQAEvents->Add( tH2D );
\r
248 tH2D = new TH2D("VZEPhiEta","VZE RFP;Phi;Eta",20,0,TMath::TwoPi(),40,-4.0,+6.0); tQAEvents->Add( tH2D );
\r
249 TH1D *tPOI = new TH1D("POI","POIs;multiplicity",500,0,500); tQAEvents->Add( tPOI );
\r
251 printf("QA enabled\n");
\r
252 tH2D = new TH2D("VTXZ","VTXZ;Global||SPD;SPD",60,-25,+25,60,-25,+25); tQAEvents->Add( tH2D );
\r
253 TH3D *tH3D = new TH3D("EVPLANE","EVPLANE;TPC;V0A;V0C",72,0,TMath::Pi(),72,0,TMath::Pi(),72,0,TMath::Pi()); tQAEvents->Add( tH3D );
\r
254 tH2D = new TH2D("VTXZSEL","VTXZ SEL;Global||SPD;SPD",40,-10,+10,40,-10,+10); tQAEvents->Add( tH2D );
\r
255 tH3D = new TH3D("PRIMVERTEX","PRIMVERTEX;#sigma_{x};#sigma_{y};#sigma_{z}",100,0,5e-3,100,0,5e-3,100,0,8e-3); tQAEvents->Add( tH3D );
\r
256 double dArrayPt[25] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,
\r
257 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0,
\r
258 2.5, 3.0, 3.5, 4.0, 5.0 };
\r
259 tH2D = new TH2D("TPCPtQx","TPCPtQx;pT;Qx/M",24,dArrayPt,100,-0.2,+0.2); tQAEvents->Add( tH2D );
\r
260 tH2D = new TH2D("TPCPtQy","TPCPtQy;pT;Qy/M",24,dArrayPt,100,-0.2,+0.2); tQAEvents->Add( tH2D );
\r
261 tH2D = new TH2D("TPCPtEta","TPCPtEta;pT;Eta/M",24,dArrayPt,100,-0.3,+0.3); tQAEvents->Add( tH2D );
\r
262 tH2D = new TH2D("TPCQxQy","TPCQxQy;Qx/M;Qy/M",100,-0.3,+0.3,100,-0.3,+0.3); tQAEvents->Add( tH2D );
\r
263 tH2D = new TH2D("VZEQxQy","VZEQxQy;Qx/M;Qy/M",100,-0.3,+0.3,100,-0.3,+0.3); tQAEvents->Add( tH2D );
\r
265 TProfile *tCuts = new TProfile("Cuts","Analysis Cuts",11,0,11);
\r
266 tCuts->Fill(0.5,fV0Cuts[0],1); tCuts->GetXaxis()->SetBinLabel(1,"dl");
\r
267 tCuts->Fill(1.5,fV0Cuts[1],1); tCuts->GetXaxis()->SetBinLabel(2,"dca");
\r
268 tCuts->Fill(2.5,fV0Cuts[2],1); tCuts->GetXaxis()->SetBinLabel(3,"ctp");
\r
269 tCuts->Fill(3.5,fV0Cuts[3],1); tCuts->GetXaxis()->SetBinLabel(4,"d0");
\r
270 tCuts->Fill(4.5,fV0Cuts[4],1); tCuts->GetXaxis()->SetBinLabel(5,"d0xd0");
\r
271 tCuts->Fill(5.5,fV0Cuts[5],1); tCuts->GetXaxis()->SetBinLabel(6,"qt");
\r
272 tCuts->Fill(6.5,fV0Cuts[6],1); tCuts->GetXaxis()->SetBinLabel(7,"min eta");
\r
273 tCuts->Fill(7.5,fV0Cuts[7],1); tCuts->GetXaxis()->SetBinLabel(8,"max eta");
\r
274 tCuts->Fill(8.5,fV0Cuts[8],1); tCuts->GetXaxis()->SetBinLabel(9,"PID sigmas");
\r
275 tCuts->Fill(9.5,fV0Cuts[9],1); tCuts->GetXaxis()->SetBinLabel(10,"ctau");
\r
276 tCuts->Fill(10.5,fV0Cuts[10],1); tCuts->GetXaxis()->SetBinLabel(11,"dlxy");
\r
277 tQAEvents->Add(tCuts);
\r
278 fQAList->Add(tQAEvents);
\r
280 //=======================================================================
\r
281 void AliAnalysisTaskFlowStrange::AddQACandidates()
\r
283 // function to add histogramming for candidates
\r
290 Double_t dMinMass = 0.412, dMaxMass=0.588;
\r
303 double dArrayPt[29] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,
\r
304 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0,
\r
305 2.5, 3.0, 3.5, 4.0, 5.0, 6.0, 8.0, 10., 12. };
\r
307 tList->SetName("Candidates");
\r
309 tH2D = new TH2D("V0MASS","V0MASS;pT;Mass",28,dArrayPt,nMass,dMinMass,dMaxMass); tList->Add(tH2D);
\r
310 tH2D = new TH2D("V0PhiEta","V0PhiEta;Phi;Eta",100,0,TMath::TwoPi(),100,-1.0,+1.0); tList->Add(tH2D);
\r
311 fQAList->Add(tList);
\r
314 printf("Extra QA enabled\n");
\r
315 tList = new TList(); tList->SetOwner(); tList->SetName("QACutsBefore_IP");
\r
316 tH3D = new TH3D("BefVOL", "VOLUME;Phi;Eta;Pt [GeV]", 63, 0.0,+6.3, 40,-1.0,+1.0, 60,0,12); tList->Add( tH3D );
\r
317 tH3D = new TH3D("BefRAP", "RAPIDITY;y;Pt [GeV]", 40,-1.0,+1.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
318 tH3D = new TH3D("BefDLZ", "DLZ;[cm];Pt [GeV]", 50,-5.0,+5.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
319 tH3D = new TH3D("BefDLXY","DLXY;[cm];Pt [GeV]", 100,0.00,100., 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
320 tH3D = new TH3D("BefCTau","CTau;[cm];Pt [GeV]", 250,0.00,250., 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
321 tH3D = new TH3D("BefDCA", "DCA;[cm];Pt [GeV]", 50,0.00,+5.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
322 tH3D = new TH3D("BefCTP", "CTP;;Pt [GeV]", 80,0.99,1.00, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
323 tH3D = new TH3D("BefD0", "D0;[cm];Pt [GeV]", 50,-1.0,+1.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
324 tH3D = new TH3D("BefD0D0","D0D0;[cm^{2}];Pt [GeV]", 50,-1.0,+1.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
325 tH3D = new TH3D("BefAP", "AP;#alpha;q_{t}[GeV];Pt [GeV]", 80,-1.0,+1.0, 90,0,0.3, 60,0,12); tList->Add( tH3D );
\r
326 fQAList->Add(tList);
\r
327 tList = new TList(); tList->SetOwner(); tList->SetName("QACutsBefore_OP");
\r
328 tH3D = new TH3D("BefVOL", "VOLUME;Phi;Eta;Pt [GeV]", 63, 0.0,+6.3, 40,-1.0,+1.0, 60,0,12); tList->Add( tH3D );
\r
329 tH3D = new TH3D("BefRAP", "RAPIDITY;y;Pt [GeV]", 40,-1.0,+1.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
330 tH3D = new TH3D("BefDLZ", "DLZ;[cm];Pt [GeV]", 50,-5.0,+5.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
331 tH3D = new TH3D("BefDLXY","DLXY;[cm];Pt [GeV]", 100,0.00,100., 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
332 tH3D = new TH3D("BefCTau","CTau;[cm];Pt [GeV]", 250,0.00,250., 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
333 tH3D = new TH3D("BefDCA", "DCA;[cm];Pt [GeV]", 50,0.00,+5.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
334 tH3D = new TH3D("BefCTP", "CTP;;Pt [GeV]", 50,0.99,1.00, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
335 tH3D = new TH3D("BefD0", "D0;[cm];Pt [GeV]", 50,-1.0,+1.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
336 tH3D = new TH3D("BefD0D0","D0D0;[cm^{2}];Pt [GeV]", 50,-1.0,+1.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
337 tH3D = new TH3D("BefAP", "AP;#alpha;q_{t}[GeV];Pt [GeV]", 80,-1.0,+1.0, 90,0,0.3, 60,0,12); tList->Add( tH3D );
\r
338 fQAList->Add(tList);
\r
339 tList = new TList(); tList->SetOwner(); tList->SetName("QACutsAfter_IP");
\r
340 tH3D = new TH3D("AftVOL", "VOLUME;Phi;Eta;Pt [GeV]", 63, 0.0,+6.3, 40,-1.0,+1.0, 60,0,12); tList->Add( tH3D );
\r
341 tH3D = new TH3D("AftRAP", "RAPIDITY;y;Pt [GeV]", 40,-1.0,+1.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
342 tH3D = new TH3D("AftDLZ", "DLZ;[cm];Pt [GeV]", 50,-5.0,+5.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
343 tH3D = new TH3D("AftDLXY","DLXY;[cm];Pt [GeV]", 100,0.00,100., 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
344 tH3D = new TH3D("AftCTau","CTau;[cm];Pt [GeV]", 250,0.00,250., 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
345 tH3D = new TH3D("AftDCA", "DCA;[cm];Pt [GeV]", 50,0.00,+5.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
346 tH3D = new TH3D("AftCTP", "CTP;;Pt [GeV]", 50,0.99,1.00, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
347 tH3D = new TH3D("AftD0", "D0;[cm];Pt [GeV]", 50,-1.0,+1.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
348 tH3D = new TH3D("AftD0D0","D0D0;[cm^{2}];Pt [GeV]", 50,-1.0,+1.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
349 tH3D = new TH3D("AftAP", "AP;#alpha;q_{t}[GeV];Pt [GeV]", 80,-1.0,+1.0, 90,0,0.3, 60,0,12); tList->Add( tH3D );
\r
350 fQAList->Add(tList);
\r
351 tList = new TList(); tList->SetOwner(); tList->SetName("QACutsAfter_OP");
\r
352 tH3D = new TH3D("AftVOL", "VOLUME;Phi;Eta;Pt [GeV]", 63, 0.0,+6.3, 40,-1.0,+1.0, 60,0,12); tList->Add( tH3D );
\r
353 tH3D = new TH3D("AftRAP", "RAPIDITY;y;Pt [GeV]", 40,-1.0,+1.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
354 tH3D = new TH3D("AftDLZ", "DLZ;[cm];Pt [GeV]", 50,-5.0,+5.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
355 tH3D = new TH3D("AftDLXY","DLXY;[cm];Pt [GeV]", 100,0.00,100., 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
356 tH3D = new TH3D("AftCTau","CTau;[cm];Pt [GeV]", 250,0.00,250., 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
357 tH3D = new TH3D("AftDCA", "DCA;[cm];Pt [GeV]", 50,0.00,+5.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
358 tH3D = new TH3D("AftCTP", "CTP;;Pt [GeV]", 50,0.99,1.00, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
359 tH3D = new TH3D("AftD0", "D0;[cm];Pt [GeV]", 50,-1.0,+1.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
360 tH3D = new TH3D("AftD0D0","D0D0;[cm^{2}];Pt [GeV]", 50,-1.0,+1.0, 60,0,12, nMass, dMinMass, dMaxMass); tList->Add( tH3D );
\r
361 tH3D = new TH3D("AftAP", "AP;#alpha;q_{t}[GeV];Pt [GeV]", 80,-1.0,+1.0, 90,0,0.3, 60,0,12); tList->Add( tH3D );
\r
362 fQAList->Add(tList);
\r
365 if(fMCmatch>0) { // only for MCanalysis
\r
366 printf("MC mode enabled\n");
\r
367 tList = new TList(); tList->SetOwner(); tList->SetName("QAMC");
\r
368 tH3D = new TH3D("MCPDG","MC PDGm;p_{T} (GeV);Mass [GeV]",24,0,12,nMass,dMinMass,dMaxMass,30,0,30); tList->Add( tH3D );
\r
369 tH3D->GetZaxis()->SetBinLabel( 1,"NONE");
\r
370 tH3D->GetZaxis()->SetBinLabel( 2,"NONE chked");
\r
371 tH3D->GetZaxis()->SetBinLabel( 3,"NONPDG");
\r
372 tH3D->GetZaxis()->SetBinLabel( 4,"NONPDG chked"); // 3
\r
373 tH3D->GetZaxis()->SetBinLabel( 5,"Truths");
\r
374 tH3D->GetZaxis()->SetBinLabel( 6,"Truths chked"); // 1
\r
375 tH3D->GetZaxis()->SetBinLabel( 7,"K_L0 chked");
\r
376 tH3D->GetZaxis()->SetBinLabel( 8,"K_S0 chked");
\r
377 tH3D->GetZaxis()->SetBinLabel( 9,"Lambda0 chked");
\r
378 tH3D->GetZaxis()->SetBinLabel(10,"Lambda0_bar chked");
\r
379 tH3D->GetZaxis()->SetBinLabel(11,"phi chked");
\r
380 tH3D->GetZaxis()->SetBinLabel(12,"rho0 chked");
\r
381 tH3D->GetZaxis()->SetBinLabel(13,"omega chked");
\r
382 tH3D->GetZaxis()->SetBinLabel(14,"f_0 chked");
\r
383 tH3D->GetZaxis()->SetBinLabel(15,"e- chked");
\r
384 tH3D->GetZaxis()->SetBinLabel(16,"e+ chked");
\r
385 tH3D->GetZaxis()->SetBinLabel(17,"pi+ chked");
\r
386 tH3D->GetZaxis()->SetBinLabel(18,"pi- chked");
\r
387 tH3D->GetZaxis()->SetBinLabel(19,"mu+ chked");
\r
388 tH3D->GetZaxis()->SetBinLabel(20,"mu- chked");
\r
389 tH3D->GetZaxis()->SetBinLabel(21,"K+ chked");
\r
390 tH3D->GetZaxis()->SetBinLabel(22,"K- chked");
\r
391 tH3D->GetZaxis()->SetBinLabel(23,"proton chked");
\r
392 tH3D->GetZaxis()->SetBinLabel(24,"antiproton chked");
\r
394 tH3D = new TH3D("MCMOTHER","MC MOTHER;truth p_{T} (GeV); mother p_{T} (GeV)",60,0,12,60,0,12,50,0,50); tList->Add( tH3D );
\r
395 tH3D->GetZaxis()->SetBinLabel( 1,"NONPDG chked");
\r
396 tH3D->GetZaxis()->SetBinLabel( 2,"PRIMARY chked");
\r
397 tH3D->GetZaxis()->SetBinLabel( 3,"Xi0 chked");
\r
398 tH3D->GetZaxis()->SetBinLabel( 4,"Xi0_bar chked");
\r
399 tH3D->GetZaxis()->SetBinLabel( 5,"Xi- chked");
\r
400 tH3D->GetZaxis()->SetBinLabel( 6,"Xi-_bar chked");
\r
401 tH3D->GetZaxis()->SetBinLabel( 7,"Omega- chked");
\r
402 tH3D->GetZaxis()->SetBinLabel( 8,"Omega+ chked");
\r
403 tH3D->GetZaxis()->SetBinLabel( 9,"K+ chked");
\r
404 tH3D->GetZaxis()->SetBinLabel(10,"K- chked");
\r
405 tH3D->GetZaxis()->SetBinLabel(11,"Lambda0 chked");
\r
406 tH3D->GetZaxis()->SetBinLabel(12,"Lambda0_bar chked");
\r
407 tH3D->GetZaxis()->SetBinLabel(13,"K0 chked");
\r
408 tH3D->GetZaxis()->SetBinLabel(14,"K0_bar chked");
\r
409 tH3D->GetZaxis()->SetBinLabel(15,"K_S0 chked");
\r
410 tH3D->GetZaxis()->SetBinLabel(16,"K_L0 chked");
\r
411 tH3D->GetZaxis()->SetBinLabel(17,"phi chked");
\r
412 tH3D->GetZaxis()->SetBinLabel(18,"D+ chked");
\r
413 tH3D->GetZaxis()->SetBinLabel(19,"D- chked");
\r
414 tH3D->GetZaxis()->SetBinLabel(20,"D0 chked");
\r
415 tH3D->GetZaxis()->SetBinLabel(21,"D0_bar chked");
\r
416 tH3D->GetZaxis()->SetBinLabel(22,"D_s+ chked");
\r
417 tH3D->GetZaxis()->SetBinLabel(23,"D_s- chked");
\r
418 tH3D->GetZaxis()->SetBinLabel(24,"Lambda_c+ chked");
\r
419 tH3D->GetZaxis()->SetBinLabel(25,"Lambda_c- chked");
\r
420 tH3D->GetZaxis()->SetBinLabel(26,"Sigma*- chked");
\r
421 tH3D->GetZaxis()->SetBinLabel(27,"Sigma*-_bar chked");
\r
422 tH3D->GetZaxis()->SetBinLabel(28,"Sigma*+ chked");
\r
423 tH3D->GetZaxis()->SetBinLabel(29,"Sigma*+_bar chked");
\r
424 tH3D->GetZaxis()->SetBinLabel(30,"Sigma*0 chked");
\r
425 tH3D->GetZaxis()->SetBinLabel(31,"Sigma*0_bar chked");
\r
426 tH3D->GetZaxis()->SetBinLabel(32,"Sigma- chked");
\r
427 tH3D->GetZaxis()->SetBinLabel(33,"Sigma+_bar chked");
\r
428 tH3D->GetZaxis()->SetBinLabel(34,"Sigma0 chked");
\r
429 tH3D->GetZaxis()->SetBinLabel(35,"Sigma0_bar chked");
\r
430 tH3D->GetZaxis()->SetBinLabel(36,"NONE chked");
\r
431 tH1D = new TH1D("MCDAUGHTERS","MC DAUGHTERS",10,0,10); tList->Add( tH1D );
\r
432 tH2D = new TH2D("MCRADS","MC RADS",2,0,2,200,0,10); tList->Add( tH2D );
\r
433 fQAList->Add(tList);
\r
434 } // only for MCanalysis
\r
437 //=======================================================================
\r
438 void AliAnalysisTaskFlowStrange::MyUserExec(Option_t *)
\r
441 AliAODEvent *tAOD=dynamic_cast<AliAODEvent*>(InputEvent());
\r
442 Bool_t acceptEvent=kFALSE;
\r
443 fCandidates->SetLast(-1);
\r
445 ((TH1D*)((TList*)fQAList->FindObject("Event"))->FindObject("Events"))->Fill(0);
\r
446 Double_t tVtxZ = tAOD->GetPrimaryVertex()->GetZ();
\r
447 Double_t tSPDVtxZ = tAOD->GetPrimaryVertexSPD()->GetZ();
\r
449 ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("VTXZ"))->Fill( tVtxZ, tSPDVtxZ );
\r
450 Bool_t tESelection = TMath::Abs(tVtxZ-tSPDVtxZ) < 0.5;
\r
451 Bool_t tDSelection = kTRUE;
\r
452 if(fUseEventSelection) {
\r
453 tDSelection = fCutsEvent->IsSelected(tAOD,0x0);
\r
455 if(TMath::Abs(tVtxZ)>10.0) tDSelection = kFALSE; // Cut on VtxZ mandatory!
\r
457 if(tDSelection&&tESelection) {
\r
459 ReadFromAODv0(tAOD);
\r
461 ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("VTXZSEL"))->Fill( tVtxZ, tSPDVtxZ );
\r
464 if(!acceptEvent) return;
\r
466 ((TH1D*)((TList*)fQAList->FindObject("Event"))->FindObject("Events"))->Fill(1);
\r
467 ((TH1D*)((TList*)fQAList->FindObject("Event"))->FindObject("RFPTPC"))->Fill( fFlowEventTPC->GetNumberOfRPs() );
\r
469 for(Int_t i=0;i!=fFlowEventVZE->GetNumberOfRPs();++i) {
\r
470 AliFlowTrackSimple *pTrack = fFlowEventVZE->GetTrack(i);
\r
471 mult += pTrack->Weight();
\r
473 ((TH1D*)((TList*)fQAList->FindObject("Event"))->FindObject("RFPVZE"))->Fill( mult );
\r
474 ((TH1D*)((TList*)fQAList->FindObject("Event"))->FindObject("POI"))->Fill( fCandidates->GetEntriesFast() );
\r
477 PostData(1,fFlowEventTPC);
\r
478 PostData(2,fFlowEventVZE);
\r
479 PostData(3,fQAList);
\r
482 //=======================================================================
\r
483 void AliAnalysisTaskFlowStrange::AddCandidates()
\r
485 // adds candidates to flow events (untaging if necessary)
\r
486 if(fDebug) printf("I received %d candidates\n",fCandidates->GetEntriesFast());
\r
487 for(int iCand=0; iCand!=fCandidates->GetEntriesFast(); ++iCand ) {
\r
488 AliFlowCandidateTrack *cand = dynamic_cast<AliFlowCandidateTrack*>(fCandidates->At(iCand));
\r
489 if(!cand) continue;
\r
490 if(fDebug) printf(" >Checking at candidate %d with %d daughters: mass %f\n",
\r
491 iCand,cand->GetNDaughters(),cand->Mass());
\r
493 for(int iDau=0; iDau!=cand->GetNDaughters(); ++iDau) {
\r
494 if(fDebug) printf(" >Daughter %d with fID %d", iDau, cand->GetIDDaughter(iDau));
\r
495 for(int iRPs=0; iRPs!=fFlowEventTPC->NumberOfTracks(); ++iRPs ) {
\r
496 AliFlowTrack *iRP = dynamic_cast<AliFlowTrack*>(fFlowEventTPC->GetTrack( iRPs ));
\r
497 if (!iRP) continue;
\r
498 if( !iRP->InRPSelection() ) continue;
\r
499 if( cand->GetIDDaughter(iDau) == iRP->GetID() ) {
\r
500 if(fDebug) printf(" was in RP set");
\r
501 iRP->SetForRPSelection(kFALSE);
\r
502 fFlowEventTPC->SetNumberOfRPs( fFlowEventTPC->GetNumberOfRPs() -1 );
\r
505 if(fDebug) printf("\n");
\r
508 cand->SetForPOISelection(kTRUE);
\r
509 fFlowEventTPC->InsertTrack( ((AliFlowTrack*) cand) );
\r
510 fFlowEventVZE->InsertTrack( ((AliFlowTrack*) cand) );
\r
512 if(fDebug) printf("TPCevent %d | VZEevent %d\n",
\r
513 fFlowEventTPC->NumberOfTracks(),
\r
514 fFlowEventVZE->NumberOfTracks() );
\r
517 //=======================================================================
\r
518 void AliAnalysisTaskFlowStrange::ChargedParticleAnalysis(AliAODEvent *tAOD)
\r
520 if(fMCmatch>0) fBayesianPID->SetMC(kTRUE);
\r
521 fBayesianPID->SetDetResponse(tAOD,999);
\r
522 for(int iRPs=0; iRPs!=fFlowEventTPC->NumberOfTracks(); ++iRPs ) {
\r
523 AliFlowTrack *iRP = dynamic_cast<AliFlowTrack*>(fFlowEventTPC->GetTrack( iRPs ));
\r
525 Int_t ntracks = tAOD->GetNTracks();
\r
526 AliAODTrack *iT = NULL;
\r
527 for(Int_t it=0; it!=ntracks; ++it) {
\r
528 iT = (AliAODTrack*) tAOD->GetTrack(it);
\r
529 if(iT->GetID() == iRP->GetID()) break;
\r
533 fBayesianPID->ComputeProb(iT,tAOD);
\r
534 Float_t *prob = fBayesianPID->GetProb();
\r
535 Float_t tofMismProb = fBayesianPID->GetTOFMismProb();
\r
536 if( fBayesianPID->GetCurrentMask(1) && tofMismProb<0.5 ) {
\r
537 iRP->SetMass( prob[3] );
\r
538 iRP->SetForPOISelection(kTRUE);
\r
539 iRP->SetForRPSelection(kFALSE);
\r
540 fFlowEventVZE->InsertTrack( ((AliFlowTrack*) iRP) );
\r
541 iRP->SetForRPSelection(kTRUE);
\r
542 // === MATCHED TO MC ===>>
\r
544 TClonesArray* mcArray = dynamic_cast<TClonesArray*>(tAOD->FindListObject(AliAODMCParticle::StdBranchName()));
\r
546 TString sPDG="NONE";
\r
547 TString sMOTHER = "NONE";
\r
548 Double_t ptTruth=-1, ptMom=-1;
\r
549 AliAODMCParticle *iTMC = dynamic_cast<AliAODMCParticle*>(mcArray->At( TMath::Abs(iT->GetLabel()) ));
\r
552 ptTruth = iTMC->Pt();
\r
553 Int_t iPDG = iTMC->GetPdgCode();
\r
554 TDatabasePDG *pdgDatabase = TDatabasePDG::Instance();
\r
555 if(pdgDatabase->GetParticle(iPDG))
\r
556 sPDG = (pdgDatabase->GetParticle(iPDG))->GetName();
\r
557 if(iTMC->GetMother()>=0) {
\r
558 AliAODMCParticle *iTMom = dynamic_cast<AliAODMCParticle*>(mcArray->At(iTMC->GetMother()));
\r
560 ptMom = iTMom->Pt();
\r
562 Int_t iMomPDG = iTMom->GetPdgCode();
\r
563 pdgDatabase = TDatabasePDG::Instance();
\r
564 if(pdgDatabase->GetParticle(iMomPDG))
\r
565 sMOTHER = (pdgDatabase->GetParticle(iMomPDG))->GetName();
\r
571 Double_t dMASS=prob[3];
\r
572 if(dMASS>1) dMASS=1;
\r
573 if(dMASS<0) dMASS=0;
\r
574 if(iT->GetLabel()>=0) {
\r
575 sPDG = Form("%s chked",sPDG.Data());
\r
576 sMOTHER = Form("%s chked",sMOTHER.Data());
\r
578 ((TH3D*)((TList*)fQAList->FindObject("QAMC"))->FindObject("MCPDG"))->Fill(iT->Pt(),dMASS,sPDG.Data(),1);
\r
580 ((TH3D*)((TList*)fQAList->FindObject("QAMC"))->FindObject("MCMOTHER"))->Fill(ptTruth,ptMom,sMOTHER.Data(),1);
\r
583 // <<=== MATCHED TO MC ===
\r
587 //=======================================================================
\r
588 void AliAnalysisTaskFlowStrange::ReadFromAODv0(AliAODEvent *tAOD)
\r
590 fCutsRFPTPC->SetEvent(tAOD,MCEvent());
\r
591 fCutsRFPVZE->SetEvent(tAOD,MCEvent());
\r
592 fCutsPOI->SetEvent(tAOD,MCEvent());
\r
593 fFlowEventTPC->Fill(fCutsRFPTPC,fCutsPOI);
\r
594 fFlowEventVZE->Fill(fCutsRFPVZE,fCutsPOI);
\r
595 fPsi2 = (fFlowEventVZE->GetQ()).Phi()/2;
\r
597 for(Int_t i=0; i!=fFlowEventTPC->NumberOfTracks(); i++) {
\r
598 AliFlowTrackSimple *pTrack = (AliFlowTrackSimple*) fFlowEventTPC->GetTrack(i);
\r
599 if(!pTrack) continue;
\r
600 if(!pTrack->InRPSelection()) continue;
\r
601 ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("TPCPhiEta"))->Fill( pTrack->Phi(), pTrack->Eta(), pTrack->Weight() );
\r
603 for(Int_t i=0; i!=fFlowEventVZE->NumberOfTracks(); i++) {
\r
604 AliFlowTrackSimple *pTrack = (AliFlowTrackSimple*) fFlowEventVZE->GetTrack(i);
\r
605 if(!pTrack) continue;
\r
606 if(!pTrack->InRPSelection()) continue;
\r
607 ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("VZEPhiEta"))->Fill( pTrack->Phi(), pTrack->Eta(), pTrack->Weight() );
\r
611 AliFlowVector Qs[2];
\r
612 fFlowEventVZE->TagSubeventsInEta(-5,1,1,+5);
\r
613 fFlowEventVZE->Get2Qsub(Qs,2);
\r
614 Double_t dEPV0C = Qs[1].Phi()/2;
\r
615 Double_t dEPV0A = Qs[0].Phi()/2;
\r
616 Double_t dEPTPC = (fFlowEventTPC->GetQ()).Phi()/2;
\r
617 ((TH3D*)((TList*)fQAList->FindObject("Event"))->FindObject("EVPLANE"))->Fill( dEPTPC, dEPV0A, dEPV0C );
\r
618 Double_t dVZEQx = (fFlowEventVZE->GetQ(2)).Px() / (fFlowEventVZE->GetQ(2)).GetMult();
\r
619 Double_t dVZEQy = (fFlowEventVZE->GetQ(2)).Py() / (fFlowEventVZE->GetQ(2)).GetMult();
\r
620 ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("VZEQxQy"))->Fill( dVZEQx, dVZEQy );
\r
621 ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("TPCQxQy"))->Fill( (fFlowEventTPC->GetQ(2)).Px() / (fFlowEventTPC->GetQ(2)).GetMult(),
\r
622 (fFlowEventTPC->GetQ(2)).Py() / (fFlowEventTPC->GetQ(2)).GetMult() );
\r
625 double dArrayPt[25] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,
\r
626 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0,
\r
627 2.5, 3.0, 3.5, 4.0, 5.0 };
\r
628 double dTPCPt[ngr];
\r
629 double dTPCQx[ngr];
\r
630 double dTPCQy[ngr];
\r
631 double dTPCEta[ngr];
\r
633 for(int i=0; i!=ngr; ++i) {
\r
640 for(Int_t i=0; i!=fFlowEventTPC->NumberOfTracks(); i++) {
\r
641 AliFlowTrackSimple *pTrack = (AliFlowTrackSimple*) fFlowEventTPC->GetTrack(i);
\r
642 if(!pTrack) continue;
\r
643 if(!pTrack->InRPSelection()) continue;
\r
644 Double_t dPt = pTrack->Pt();
\r
646 for(int pt=0; pt!=ngr; ++pt)
\r
647 if( (dPt > dArrayPt[pt])&&(dPt < dArrayPt[pt+1]) ) {
\r
651 if(npt<0) continue;
\r
652 Double_t dPhi = pTrack->Phi();
\r
653 Double_t dWeight = pTrack->Weight();
\r
654 dTPCPt[npt] += dWeight*dPt;
\r
655 dTPCQx[npt] += dWeight*TMath::Cos(2*dPhi);
\r
656 dTPCQy[npt] += dWeight*TMath::Sin(2*dPhi);
\r
657 dTPCEta[npt] += dWeight*pTrack->Eta();
\r
658 dTPCM[npt] += dWeight;
\r
660 for(int i=0; i!=ngr; ++i)
\r
662 ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("TPCPtQx"))->Fill( dTPCPt[i]/dTPCM[i], dTPCQx[i]/dTPCM[i] );
\r
663 ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("TPCPtQy"))->Fill( dTPCPt[i]/dTPCM[i], dTPCQy[i]/dTPCM[i] );
\r
664 ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("TPCPtEta"))->Fill( dTPCPt[i]/dTPCM[i], dTPCEta[i]/dTPCM[i] );
\r
667 const AliAODVertex* trkVtx = tAOD->GetPrimaryVertex();
\r
668 Double_t cov[6]={0};
\r
669 trkVtx->GetCovarianceMatrix(cov);
\r
670 ((TH3D*)((TList*)fQAList->FindObject("Event"))->FindObject("PRIMVERTEX"))->Fill( TMath::Sqrt( cov[0] ),
\r
671 TMath::Sqrt( cov[2] ),
\r
672 TMath::Sqrt( cov[5] ) );
\r
676 ChargedParticleAnalysis(tAOD);
\r
679 Int_t nV0s = tAOD->GetNumberOfV0s();
\r
681 Double_t dMASS=0.0;
\r
682 for (Int_t i=0; i!=nV0s; ++i) {
\r
683 myV0 = (AliAODv0*) tAOD->GetV0(i);
\r
684 if(!myV0) continue;
\r
685 if(myV0->Pt()<0.1) continue; // skipping low momentum
\r
686 Int_t pass = PassesAODCuts(myV0,tAOD);
\r
687 if(pass==0) continue;
\r
689 dMASS = myV0->MassK0Short();
\r
691 dMASS = myV0->MassLambda();
\r
692 if(pass==2) dMASS = myV0->MassAntiLambda();
\r
694 MakeTrack(dMASS, myV0->Pt(), myV0->Phi(), myV0->Eta(),
\r
695 ((AliAODTrack*) myV0->GetDaughter(0))->GetID(),
\r
696 ((AliAODTrack*) myV0->GetDaughter(1))->GetID());
\r
700 //=======================================================================
\r
701 Int_t AliAnalysisTaskFlowStrange::PassesAODCuts(AliAODv0 *myV0, AliAODEvent *tAOD)
\r
703 if (myV0->GetOnFlyStatus() ) return 0;
\r
704 //the following is needed in order to evualuate track-quality
\r
705 AliAODTrack *iT, *jT;
\r
706 AliAODVertex *vV0s = myV0->GetSecondaryVtx();
\r
707 Double_t pos[3],cov[6];
\r
709 vV0s->GetCovarianceMatrix(cov);
\r
710 const AliESDVertex vESD(pos,cov,100.,100);
\r
713 iT=(AliAODTrack*) myV0->GetDaughter(0);
\r
714 if(iT->Charge()>0) {
\r
715 iPos = 0; iNeg = 1;
\r
717 iPos = 1; iNeg = 0;
\r
721 iT=(AliAODTrack*) myV0->GetDaughter(iPos); // positive
\r
722 AliESDtrack ieT( iT );
\r
723 ieT.SetTPCClusterMap( iT->GetTPCClusterMap() );
\r
724 ieT.SetTPCSharedMap( iT->GetTPCSharedMap() );
\r
725 ieT.SetTPCPointsF( iT->GetTPCNclsF() );
\r
726 ieT.RelateToVertex(&vESD, tAOD->GetMagneticField(), 100);
\r
727 if (!fCutsDau->IsSelected( &ieT ) ) return 0;
\r
729 jT=(AliAODTrack*) myV0->GetDaughter(iNeg); // negative
\r
730 AliESDtrack jeT( jT );
\r
731 jeT.SetTPCClusterMap( jT->GetTPCClusterMap() );
\r
732 jeT.SetTPCSharedMap( jT->GetTPCSharedMap() );
\r
733 jeT.SetTPCPointsF( jT->GetTPCNclsF() );
\r
734 jeT.RelateToVertex(&vESD, tAOD->GetMagneticField(), 100);
\r
735 if (!fCutsDau->IsSelected( &jeT ) ) return 0;
\r
737 Double_t pvertex[3];
\r
738 pvertex[0]=tAOD->GetPrimaryVertex()->GetX();
\r
739 pvertex[1]=tAOD->GetPrimaryVertex()->GetY();
\r
740 pvertex[2]=tAOD->GetPrimaryVertex()->GetZ();
\r
743 dRAP=myV0->RapK0Short();
\r
745 dRAP=myV0->RapLambda();
\r
746 Double_t dDL=myV0->DecayLengthV0( pvertex );
\r
747 Double_t dDLZ=myV0->DecayVertexV0Z()-pvertex[2];
\r
748 Double_t dDLXY=myV0->RadiusV0();
\r
749 Double_t dDCA=myV0->DcaV0Daughters();
\r
750 Double_t dCTP=myV0->CosPointingAngle( pvertex );
\r
751 Double_t dD0P=ieT.GetD(pvertex[0],pvertex[1],tAOD->GetMagneticField());
\r
752 Double_t dD0M=jeT.GetD(pvertex[0],pvertex[1],tAOD->GetMagneticField());
\r
753 Double_t dD0D0=dD0P*dD0M;
\r
754 Double_t dQT=myV0->PtArmV0();
\r
755 Double_t dALPHA=myV0->AlphaV0(); // AlphaV0 -> AODRecoDecat::Alpha -> return 1.-2./(1.+QlProng(0)/QlProng(1));
\r
756 if(myV0->ChargeProng(iPos)<0) dALPHA = -dALPHA; // protects for a change in convention
\r
757 Double_t dPT=myV0->Pt();
\r
758 Double_t dETA=myV0->Eta();
\r
760 if(fSpecie==1&&dALPHA<0) passes = 2; // antilambda
\r
761 Double_t dMASS = myV0->MassK0Short();
\r
763 if(passes==2) dMASS = myV0->MassAntiLambda();
\r
764 else dMASS = myV0->MassLambda();
\r
766 Double_t dCT = dDL*dMASS/myV0->P();
\r
767 Double_t ctaucut = 2.68;
\r
768 if(fSpecie==1) ctaucut = 7.89;
\r
769 ctaucut *= fV0Cuts[9];
\r
770 if(dDL<fV0Cuts[0]) passes = 0;
\r
771 if(dDCA >fV0Cuts[1]) passes = 0;
\r
772 if(dCTP <fV0Cuts[2]) passes = 0;
\r
773 if(TMath::Abs(dD0P) <fV0Cuts[3]) passes = 0;
\r
774 if(TMath::Abs(dD0M) <fV0Cuts[3]) passes = 0;
\r
775 if(dD0D0>fV0Cuts[4]) passes = 0;
\r
776 if(dETA <fV0Cuts[6]) passes = 0;
\r
777 if(dETA >fV0Cuts[7]) passes = 0;
\r
778 if(fSpecie==0) if(dQT<+fV0Cuts[5]*dALPHA) passes = 0;
\r
779 if(fSpecie==0) if(dQT<-fV0Cuts[5]*dALPHA) passes = 0;
\r
780 if(dCT>ctaucut) passes = 0;
\r
781 if(dDLXY<fV0Cuts[10]) passes = 0;
\r
783 Double_t dPHI = myV0->Phi();
\r
784 Double_t dDPHI = dPHI - fPsi2;
\r
785 if( dDPHI < 0 ) dDPHI += TMath::TwoPi();
\r
786 if( dDPHI > TMath::Pi() ) dDPHI = TMath::TwoPi()-dDPHI;
\r
787 TString sIPOP = "IP";
\r
788 if( (dDPHI>TMath::PiOver4()) && (dDPHI<3*TMath::PiOver4()) )
\r
791 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefRAP")) ->Fill(dRAP, dPT, dMASS);
\r
792 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefDLZ")) ->Fill(dDLZ, dPT, dMASS);
\r
793 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefDLXY"))->Fill(dDLXY, dPT, dMASS);
\r
794 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefCTau"))->Fill(dCT, dPT, dMASS);
\r
795 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefDCA")) ->Fill(dDCA, dPT, dMASS);
\r
796 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefCTP")) ->Fill(dCTP, dPT, dMASS);
\r
797 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefD0")) ->Fill(dD0M, dPT, dMASS);
\r
798 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefD0")) ->Fill(dD0P, dPT, dMASS);
\r
799 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefD0D0"))->Fill(dD0D0, dPT, dMASS);
\r
800 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefAP")) ->Fill(dALPHA,dQT,dPT);
\r
801 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsBefore_%s",sIPOP.Data())))->FindObject("BefVOL")) ->Fill(dPHI, dETA,dPT);
\r
804 if(passes&&fV0Cuts[8]) {
\r
807 if( (jT->GetTPCmomentum()<15) &&
\r
808 (TMath::Abs(fPIDResponse->NumberOfSigmasTPC(jT,AliPID::kPion))>fV0Cuts[8]) )
\r
810 if( (iT->GetTPCmomentum()<15) &&
\r
811 (TMath::Abs(fPIDResponse->NumberOfSigmasTPC(iT,AliPID::kPion))>fV0Cuts[8]) )
\r
814 case 1: // Lambda PID i==pos j ==neg
\r
816 if( (iT->GetTPCmomentum()<15) &&
\r
817 (TMath::Abs(fPIDResponse->NumberOfSigmasTPC(iT,AliPID::kProton))>fV0Cuts[8]) )
\r
819 if( (jT->GetTPCmomentum()<15) &&
\r
820 (TMath::Abs(fPIDResponse->NumberOfSigmasTPC(jT,AliPID::kPion))>fV0Cuts[8]) )
\r
824 if( (iT->GetTPCmomentum()<15) &&
\r
825 (TMath::Abs(fPIDResponse->NumberOfSigmasTPC(iT,AliPID::kPion))>fV0Cuts[8]) )
\r
827 if( (jT->GetTPCmomentum()<15) &&
\r
828 (TMath::Abs(fPIDResponse->NumberOfSigmasTPC(jT,AliPID::kProton))>fV0Cuts[8]) )
\r
834 // === MATCHED TO MC ===>>
\r
835 // AliAODRecoDecay::MatchToMC()
\r
836 if((passes>0)&&(fMCmatch>0)) {
\r
837 TClonesArray* mcArray = dynamic_cast<TClonesArray*>(tAOD->FindListObject(AliAODMCParticle::StdBranchName()));
\r
840 TString sPDG="NONE";
\r
841 TString sMOTHER = "NONE";
\r
842 Double_t ptTruth=-1, ptMom=-1;
\r
843 Int_t abc=4; // 0:reject 1:truth 2:another decay 3:nonv0 t2 4:nonv0 t1
\r
844 AliAODMCParticle *iTMC = dynamic_cast<AliAODMCParticle*>(mcArray->At( TMath::Abs(iT->GetLabel()) ));
\r
845 AliAODMCParticle *jTMC = dynamic_cast<AliAODMCParticle*>(mcArray->At( TMath::Abs(jT->GetLabel()) ));
\r
846 if((iTMC)&&(jTMC)) {
\r
847 if((iTMC->GetMother()>=0)&&(jTMC->GetMother()>=0)) {
\r
848 AliAODMCParticle *iTMom = dynamic_cast<AliAODMCParticle*>(mcArray->At(iTMC->GetMother()));
\r
849 AliAODMCParticle *jTMom = dynamic_cast<AliAODMCParticle*>(mcArray->At(jTMC->GetMother()));
\r
850 if((iTMom)&&(jTMom)) {
\r
853 if(iTMC->GetMother()==jTMC->GetMother()) {
\r
854 Int_t iMomPDG = iTMom->GetPdgCode();
\r
856 TDatabasePDG *pdgDatabase = TDatabasePDG::Instance();
\r
857 if(pdgDatabase->GetParticle(iMomPDG))
\r
858 sPDG = (pdgDatabase->GetParticle(iMomPDG))->GetName();
\r
860 if(fSpecie) pdgcode = 3122; else pdgcode = 310;
\r
861 if(TMath::Abs(iMomPDG)==pdgcode) {
\r
862 Double_t pxSumDgs = iTMC->Px()+jTMC->Px();
\r
863 Double_t pySumDgs = iTMC->Py()+jTMC->Py();
\r
864 Double_t pzSumDgs = iTMC->Pz()+jTMC->Pz();
\r
865 Double_t pxMother = iTMom->Px();
\r
866 Double_t pyMother = iTMom->Py();
\r
867 Double_t pzMother = iTMom->Pz();
\r
869 Double_t rads = TMath::Sqrt( iTMC->Xv()*iTMC->Xv() + iTMC->Yv()*iTMC->Yv() );
\r
870 ((TH1D*)((TList*)fQAList->FindObject("QAMC"))->FindObject("MCDAUGHTERS"))->Fill(iTMom->GetNDaughters());
\r
871 if((TMath::Abs(pxMother-pxSumDgs)/(TMath::Abs(pxMother)+1.e-13)) < 0.00001 &&
\r
872 (TMath::Abs(pyMother-pySumDgs)/(TMath::Abs(pyMother)+1.e-13)) < 0.00001 &&
\r
873 (TMath::Abs(pzMother-pzSumDgs)/(TMath::Abs(pzMother)+1.e-13)) < 0.00001) {
\r
874 ((TH2D*)((TList*)fQAList->FindObject("QAMC"))->FindObject("MCRADS"))->Fill(1.0,rads);
\r
876 if(iTMom->GetMother()>=0) {
\r
877 AliAODMCParticle *iGrandMa = dynamic_cast<AliAODMCParticle*>(mcArray->At(iTMom->GetMother()));
\r
879 Int_t iGrandMaPDG = iGrandMa->GetPdgCode();
\r
880 ptMom = iGrandMa->Pt();
\r
881 ptTruth = iTMom->Pt();
\r
882 if(pdgDatabase->GetParticle(iGrandMaPDG))
\r
883 sMOTHER = (pdgDatabase->GetParticle(iGrandMaPDG))->GetName();
\r
886 sMOTHER = "PRIMARY";
\r
889 ((TH2D*)((TList*)fQAList->FindObject("QAMC"))->FindObject("MCRADS"))->Fill(0.0,rads);
\r
898 dMCMASS = myV0->MassK0Short();
\r
899 if(dMCMASS>0.588) dMCMASS=0.587999;
\r
900 if(dMCMASS<0.412) dMCMASS=0.412001;
\r
902 dMCMASS = myV0->MassLambda();
\r
903 if(passes==2) dMCMASS = myV0->MassAntiLambda();
\r
904 if(dMCMASS>1.167) dMCMASS=1.1669;
\r
905 if(dMCMASS<1.075) dMCMASS=1.0751;
\r
907 if((iT->GetLabel()>=0)&&(jT->GetLabel()>=0)) {
\r
908 sPDG = Form("%s chked",sPDG.Data());
\r
909 sMOTHER = Form("%s chked",sMOTHER.Data());
\r
910 if(fMCmatch==abc) mcpasses=1;
\r
912 ((TH3D*)((TList*)fQAList->FindObject("QAMC"))->FindObject("MCPDG"))->Fill(dPT,dMCMASS,sPDG.Data(),1);
\r
913 ((TH3D*)((TList*)fQAList->FindObject("QAMC"))->FindObject("MCMOTHER"))->Fill(ptTruth,ptMom,sMOTHER.Data(),1);
\r
917 // <<=== MATCHED TO MC ===
\r
918 if(passes&&fDoExtraQA) {
\r
919 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftRAP")) ->Fill(dRAP, dPT, dMASS);
\r
920 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftDLZ")) ->Fill(dDLZ, dPT, dMASS);
\r
921 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftDLXY"))->Fill(dDLXY, dPT, dMASS);
\r
922 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftCTau"))->Fill(dCT, dPT, dMASS);
\r
923 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftDCA")) ->Fill(dDCA, dPT, dMASS);
\r
924 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftCTP")) ->Fill(dCTP, dPT, dMASS);
\r
925 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftD0")) ->Fill(dD0M, dPT, dMASS);
\r
926 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftD0")) ->Fill(dD0P, dPT, dMASS);
\r
927 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftD0D0"))->Fill(dD0D0, dPT, dMASS);
\r
928 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftAP")) ->Fill(dALPHA,dQT,dPT);
\r
929 ((TH3D*)((TList*)fQAList->FindObject(Form("QACutsAfter_%s",sIPOP.Data())))->FindObject("AftVOL")) ->Fill(dPHI, dETA,dPT);
\r
931 if(passes&&fDoQA) {
\r
932 ((TH2D*)((TList*)fQAList->FindObject("Candidates"))->FindObject("V0MASS"))->Fill( dPT, dMASS );
\r
933 ((TH2D*)((TList*)fQAList->FindObject("Candidates"))->FindObject("V0PhiEta"))->Fill( dPHI, dETA );
\r
937 //=======================================================================
\r
938 void AliAnalysisTaskFlowStrange::Terminate(Option_t *)
\r
942 //=======================================================================
\r
943 void AliAnalysisTaskFlowStrange::MakeTrack( Double_t mass, Double_t pt, Double_t phi,
\r
944 Double_t eta, Int_t iid, Int_t jid )
\r
946 // create track for flow tasks
\r
947 if(fCandidates->GetLast()+1>=fCandidates->GetSize()) {
\r
948 fCandidates->Expand( 2*fCandidates->GetSize() );
\r
950 Bool_t overwrite = kTRUE;
\r
951 AliFlowCandidateTrack *oTrack = (static_cast<AliFlowCandidateTrack*> (fCandidates->At( fCandidates->GetLast()+1 )));
\r
952 if( !oTrack ) { // creates new
\r
953 oTrack = new AliFlowCandidateTrack();
\r
954 overwrite = kFALSE;
\r
955 } else { // overwrites
\r
958 oTrack->SetMass(mass);
\r
960 oTrack->SetPhi(phi);
\r
961 oTrack->SetEta(eta);
\r
962 oTrack->AddDaughter(iid);
\r
963 oTrack->AddDaughter(jid);
\r
964 oTrack->SetForPOISelection(kTRUE);
\r
965 oTrack->SetForRPSelection(kFALSE);
\r
967 fCandidates->SetLast( fCandidates->GetLast()+1 );
\r
969 fCandidates->AddLast(oTrack);
\r
973 //=======================================================================
\r
974 void AliAnalysisTaskFlowStrange::SetCommonConstants(Int_t massBins, Double_t minMass, Double_t maxMass)
\r
976 // setter for mass bins
\r
977 fMassBins = massBins;
\r
978 fMinMass = minMass;
\r
979 fMaxMass = maxMass;
\r
981 //=======================================================================
\r
982 void AliAnalysisTaskFlowStrange::SetCuts(Double_t cuts[11]) {
\r
983 // defines cuts to be used
\r
984 // fV0Cuts[11] dl3d dca ctp d0 d0d0 qt minEta maxEta PID ct dlxy
\r
985 for(int i=0; i!=11; ++i) fV0Cuts[i] = cuts[i];
\r