]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/FLOW/Tasks/AliAnalysisTaskFlowStrange.cxx
from Panos:
[u/mrichter/AliRoot.git] / PWG / FLOW / Tasks / AliAnalysisTaskFlowStrange.cxx
1 /*************************************************************************\r
2 * Copyright(c) 1998-2008,ALICE Experiment at CERN,All rights reserved. *\r
3 *                                                                        *\r
4 * Author: The ALICE Off-line Project.                                    *\r
5 * Contributors are mentioned in the code where appropriate.              *\r
6 *                                                                        *\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
15 \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
25 \r
26 #include "TChain.h"\r
27 #include "TList.h"\r
28 #include "TH1D.h"\r
29 #include "TH2D.h"\r
30 #include "TH3D.h"\r
31 #include "TProfile.h"\r
32 #include "TVector3.h"\r
33 \r
34 #include "AliAnalysisManager.h"\r
35 #include "AliInputEventHandler.h"\r
36 \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
42 \r
43 #include "AliAODEvent.h"\r
44 #include "AliAODTrack.h"\r
45 #include "AliAODVertex.h"\r
46 #include "AliAODv0.h"\r
47 \r
48 #include "AliAODMCParticle.h"\r
49 #include "TClonesArray.h"\r
50 #include "TDatabasePDG.h"\r
51 #include "TParticlePDG.h"\r
52 \r
53 #include "TMath.h"\r
54 #include "TObjArray.h"\r
55 #include "AliFlowCandidateTrack.h"\r
56 \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
63 \r
64 #include "AliAnalysisTaskFlowStrange.h"\r
65 \r
66 ClassImp(AliAnalysisTaskFlowStrange)\r
67 \r
68 //=======================================================================\r
69 AliAnalysisTaskFlowStrange::AliAnalysisTaskFlowStrange() :\r
70   AliAnalysisTaskSE(),\r
71   fPIDResponse(NULL),\r
72   fBayesianPID(NULL),\r
73   fDebug(kFALSE),\r
74   fUseEventSelection(kTRUE),\r
75   fDoQA(kFALSE),\r
76   fDoExtraQA(kFALSE),\r
77   fRunOnpA(kFALSE),\r
78   fRunOnpp(kFALSE),\r
79   fCalib(NULL),\r
80   fPsi2(0.0),\r
81   fSpecie(0),\r
82   fMCmatch(-1),\r
83   fMassBins(0),\r
84   fMinMass(0.0),\r
85   fMaxMass(0.0),\r
86   fCutsEvent(NULL),\r
87   fCutsRFPTPC(NULL),\r
88   fCutsRFPVZE(NULL),\r
89   fCutsPOI(NULL),\r
90   fCutsDau(NULL),\r
91   fFlowEventTPC(NULL),\r
92   fFlowEventVZE(NULL),\r
93   fCandidates(NULL),\r
94   fQAList(NULL)\r
95 {\r
96   //ctor\r
97   for (Int_t i=0; i!=11; ++i)\r
98     fV0Cuts[i] = 0;\r
99 }\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
109   fDebug(kFALSE),\r
110   fUseEventSelection(kTRUE),\r
111   fDoQA(kFALSE),\r
112   fDoExtraQA(kFALSE),\r
113   fRunOnpA(kFALSE),\r
114   fRunOnpp(kFALSE),\r
115   fCalib(NULL),\r
116   fPsi2(0.0),\r
117   fSpecie(0),\r
118   fMCmatch(-1),\r
119   fMassBins(0),\r
120   fMinMass(0.0),\r
121   fMaxMass(0.0),\r
122   fCutsEvent(cutsEvent),\r
123   fCutsRFPTPC(cutsRFPTPC),\r
124   fCutsRFPVZE(cutsRFPVZE),\r
125   fCutsPOI(NULL),\r
126   fCutsDau(cutsDau),\r
127   fFlowEventTPC(NULL),\r
128   fFlowEventVZE(NULL),\r
129   fCandidates(NULL),\r
130   fQAList(NULL)\r
131 {\r
132   //ctor\r
133   for (Int_t i=0; i!=11; ++i)\r
134     fV0Cuts[i] = 0;\r
135 \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
140 }\r
141 //=======================================================================\r
142 AliAnalysisTaskFlowStrange::~AliAnalysisTaskFlowStrange()\r
143 {\r
144   //dtor\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
154 }\r
155 //=======================================================================\r
156 void AliAnalysisTaskFlowStrange::UserCreateOutputObjects()\r
157 {\r
158   //UserCreateOutputObjects\r
159   fQAList=new TList();\r
160   fQAList->SetOwner();\r
161   AddQAEvents();\r
162   AddQACandidates();\r
163 \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
173 \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
178 \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
185 \r
186   AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();\r
187   AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());\r
188   fPIDResponse = inputHandler->GetPIDResponse();\r
189 \r
190   PostData(1,fFlowEventTPC);\r
191   PostData(2,fFlowEventVZE);\r
192   PostData(3,fQAList);\r
193 \r
194 }\r
195 //=======================================================================\r
196 void AliAnalysisTaskFlowStrange::Exec(Option_t* option)\r
197 {\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
203 }\r
204 //=======================================================================\r
205 void AliAnalysisTaskFlowStrange::UserExec(Option_t *option)\r
206 {\r
207   // dummy user exec\r
208   if(fRunOnpA) { // temporal extra cuts for pA (2BE REMOVED!)\r
209     AliAODEvent *aod=dynamic_cast<AliAODEvent*>(InputEvent());\r
210     if(!aod) return;\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
227   }\r
228 \r
229   AliAnalysisTaskFlowStrange::MyUserExec(option);\r
230 }\r
231 //=======================================================================\r
232 void AliAnalysisTaskFlowStrange::AddQAEvents()\r
233 {\r
234   // function to add event qa\r
235   TList *tQAEvents=new TList();\r
236   tQAEvents->SetName("Event");\r
237   tQAEvents->SetOwner();\r
238 \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
243 \r
244   TH2D *tH2D;\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
250   if(fDoQA) {\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
264   }\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
279 }\r
280 //=======================================================================\r
281 void AliAnalysisTaskFlowStrange::AddQACandidates()\r
282 {\r
283   // function to add histogramming for candidates\r
284   TList *tList;\r
285   TH1D *tH1D;\r
286   TH2D *tH2D;\r
287   TH3D *tH3D;\r
288 \r
289   Int_t nMass = 88;\r
290   Double_t dMinMass = 0.412, dMaxMass=0.588;\r
291   switch(fSpecie) {\r
292   case(1):\r
293     nMass = 92;\r
294     dMinMass = 1.075;\r
295     dMaxMass = 1.167;\r
296     break;\r
297   case(90):\r
298     nMass = 100;\r
299     dMinMass = 0.0;\r
300     dMaxMass = 1.0;\r
301     break;\r
302   }\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
306   tList=new TList();\r
307   tList->SetName("Candidates");\r
308   tList->SetOwner();\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
312 \r
313   if(fDoExtraQA) {\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
363   }\r
364 \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
393   \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
435 \r
436 }\r
437 //=======================================================================\r
438 void AliAnalysisTaskFlowStrange::MyUserExec(Option_t *)\r
439 {\r
440   // user exec\r
441   AliAODEvent *tAOD=dynamic_cast<AliAODEvent*>(InputEvent());\r
442   Bool_t acceptEvent=kFALSE;\r
443   fCandidates->SetLast(-1);\r
444   if(tAOD) {\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
448     if( fDoQA )\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
454     } else {\r
455       if(TMath::Abs(tVtxZ)>10.0) tDSelection = kFALSE; // Cut on VtxZ mandatory!\r
456     }\r
457     if(tDSelection&&tESelection) {\r
458       acceptEvent=kTRUE;\r
459       ReadFromAODv0(tAOD);\r
460       if( fDoQA )\r
461         ((TH2D*)((TList*)fQAList->FindObject("Event"))->FindObject("VTXZSEL"))->Fill( tVtxZ, tSPDVtxZ );\r
462     }\r
463   }\r
464   if(!acceptEvent) return;\r
465   // QA filling\r
466   ((TH1D*)((TList*)fQAList->FindObject("Event"))->FindObject("Events"))->Fill(1);\r
467   ((TH1D*)((TList*)fQAList->FindObject("Event"))->FindObject("RFPTPC"))->Fill( fFlowEventTPC->GetNumberOfRPs() );\r
468   Double_t mult=0;\r
469   for(Int_t i=0;i!=fFlowEventVZE->GetNumberOfRPs();++i) {\r
470     AliFlowTrackSimple *pTrack = fFlowEventVZE->GetTrack(i);\r
471     mult += pTrack->Weight();\r
472   }\r
473   ((TH1D*)((TList*)fQAList->FindObject("Event"))->FindObject("RFPVZE"))->Fill( mult );\r
474   ((TH1D*)((TList*)fQAList->FindObject("Event"))->FindObject("POI"))->Fill( fCandidates->GetEntriesFast() );\r
475   AddCandidates();\r
476 \r
477   PostData(1,fFlowEventTPC);\r
478   PostData(2,fFlowEventVZE);\r
479   PostData(3,fQAList);\r
480   return;\r
481 }\r
482 //=======================================================================\r
483 void AliAnalysisTaskFlowStrange::AddCandidates()\r
484 {\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
492     // untagging ===>\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
503         }\r
504       }\r
505       if(fDebug) printf("\n");\r
506     }\r
507     // <=== untagging\r
508     cand->SetForPOISelection(kTRUE);\r
509     fFlowEventTPC->InsertTrack( ((AliFlowTrack*) cand) );\r
510     fFlowEventVZE->InsertTrack( ((AliFlowTrack*) cand) );\r
511   }\r
512   if(fDebug) printf("TPCevent %d | VZEevent %d\n",\r
513                     fFlowEventTPC->NumberOfTracks(),\r
514                     fFlowEventVZE->NumberOfTracks() );\r
515 }\r
516 \r
517 //=======================================================================\r
518 void AliAnalysisTaskFlowStrange::ChargedParticleAnalysis(AliAODEvent *tAOD)\r
519 {\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
524     if(!iRP) continue;\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
530       iT = NULL;\r
531     }\r
532     if(!iT) continue;\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
543       if(fMCmatch>0) {\r
544         TClonesArray* mcArray = dynamic_cast<TClonesArray*>(tAOD->FindListObject(AliAODMCParticle::StdBranchName()));\r
545         if(mcArray) {\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
550           if(iTMC) {\r
551             sPDG="NONPDG";\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
559               if(iTMom) {\r
560                 ptMom = iTMom->Pt();\r
561                 sMOTHER="NONPDG";\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
566               }\r
567             } else {\r
568               sMOTHER="PRIMARY";\r
569             }\r
570           }\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
577           }\r
578           ((TH3D*)((TList*)fQAList->FindObject("QAMC"))->FindObject("MCPDG"))->Fill(iT->Pt(),dMASS,sPDG.Data(),1);\r
579           if(dMASS>=0.90)\r
580             ((TH3D*)((TList*)fQAList->FindObject("QAMC"))->FindObject("MCMOTHER"))->Fill(ptTruth,ptMom,sMOTHER.Data(),1);\r
581         }\r
582       }\r
583       // <<=== MATCHED TO MC ===\r
584     }\r
585   }\r
586 }\r
587 //=======================================================================\r
588 void AliAnalysisTaskFlowStrange::ReadFromAODv0(AliAODEvent *tAOD)\r
589 {\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
596 \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
602   }\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
608   }\r
609 \r
610   if(fDoQA) {\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
623     // TPC Q\r
624     const int ngr=24;\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
632     double dTPCM[ngr];\r
633     for(int i=0; i!=ngr; ++i) {\r
634       dTPCPt[i] = 0;\r
635       dTPCQx[i] = 0;\r
636       dTPCQy[i] = 0;\r
637       dTPCEta[i] = 0;\r
638       dTPCM[i] = 0;\r
639     }\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
645       int npt=-1;\r
646       for(int pt=0; pt!=ngr; ++pt)\r
647         if( (dPt > dArrayPt[pt])&&(dPt < dArrayPt[pt+1]) ) {\r
648           npt = pt;\r
649           break;\r
650         }\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
659     }\r
660     for(int i=0; i!=ngr; ++i)\r
661       if( dTPCM[i]>0 ) {\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
665       }\r
666     // End of TPC Q\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
673   }\r
674 \r
675   if(fSpecie>80) {\r
676     ChargedParticleAnalysis(tAOD);\r
677     return;\r
678   }\r
679   Int_t nV0s = tAOD->GetNumberOfV0s();\r
680   AliAODv0 *myV0;\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
688     if(fSpecie==0) {\r
689       dMASS = myV0->MassK0Short();\r
690     } else {\r
691       dMASS = myV0->MassLambda();\r
692       if(pass==2) dMASS = myV0->MassAntiLambda();\r
693     }\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
697   }\r
698   return;\r
699 }\r
700 //=======================================================================\r
701 Int_t AliAnalysisTaskFlowStrange::PassesAODCuts(AliAODv0 *myV0, AliAODEvent *tAOD)\r
702 {\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
708   vV0s->GetXYZ(pos);\r
709   vV0s->GetCovarianceMatrix(cov);\r
710   const AliESDVertex vESD(pos,cov,100.,100);\r
711   // TESTING CHARGE\r
712   int iPos, iNeg;\r
713   iT=(AliAODTrack*) myV0->GetDaughter(0);\r
714   if(iT->Charge()>0) {\r
715     iPos = 0; iNeg = 1;\r
716   } else {\r
717     iPos = 1; iNeg = 0;\r
718   }\r
719   // END OF TEST\r
720 \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
728 \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
736 \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
741   Double_t dRAP;\r
742   if(fSpecie==0)\r
743     dRAP=myV0->RapK0Short();\r
744   else\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
759   Int_t passes = 1;\r
760   if(fSpecie==1&&dALPHA<0) passes = 2; // antilambda\r
761   Double_t dMASS = myV0->MassK0Short();\r
762   if(fSpecie==1) {\r
763     if(passes==2) dMASS = myV0->MassAntiLambda();\r
764     else dMASS = myV0->MassLambda();\r
765   }\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
782 \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
789     sIPOP = "OP";\r
790   if(fDoExtraQA) {\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
802   }\r
803 \r
804   if(passes&&fV0Cuts[8]) {\r
805     switch(fSpecie) {\r
806     case 0: // K0 PID\r
807       if( (jT->GetTPCmomentum()<15) &&\r
808         (TMath::Abs(fPIDResponse->NumberOfSigmasTPC(jT,AliPID::kPion))>fV0Cuts[8]) )\r
809         passes = 0;\r
810       if( (iT->GetTPCmomentum()<15) &&\r
811         (TMath::Abs(fPIDResponse->NumberOfSigmasTPC(iT,AliPID::kPion))>fV0Cuts[8]) )\r
812         passes = 0;\r
813       break;\r
814     case 1: // Lambda PID  i==pos j ==neg\r
815       if(passes==1) {\r
816         if( (iT->GetTPCmomentum()<15) &&\r
817           (TMath::Abs(fPIDResponse->NumberOfSigmasTPC(iT,AliPID::kProton))>fV0Cuts[8]) )\r
818           passes = 0;\r
819         if( (jT->GetTPCmomentum()<15) &&\r
820           (TMath::Abs(fPIDResponse->NumberOfSigmasTPC(jT,AliPID::kPion))>fV0Cuts[8]) )\r
821           passes = 0;\r
822       }\r
823       if(passes==2) {\r
824         if( (iT->GetTPCmomentum()<15) &&\r
825           (TMath::Abs(fPIDResponse->NumberOfSigmasTPC(iT,AliPID::kPion))>fV0Cuts[8]) )\r
826           passes = 0;\r
827         if( (jT->GetTPCmomentum()<15) &&\r
828           (TMath::Abs(fPIDResponse->NumberOfSigmasTPC(jT,AliPID::kProton))>fV0Cuts[8]) )\r
829           passes = 0;\r
830       }\r
831       break;\r
832     }\r
833   }\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
838     Int_t mcpasses=0;\r
839     if(mcArray) {\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
851             sPDG="NONPDG";\r
852             abc=3;\r
853             if(iTMC->GetMother()==jTMC->GetMother()) {\r
854               Int_t iMomPDG = iTMom->GetPdgCode();\r
855               abc=2;\r
856               TDatabasePDG *pdgDatabase = TDatabasePDG::Instance();\r
857               if(pdgDatabase->GetParticle(iMomPDG))\r
858                 sPDG = (pdgDatabase->GetParticle(iMomPDG))->GetName();\r
859               Int_t pdgcode;\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
868                 sPDG = "Truths";\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
875                   abc=1;\r
876                   if(iTMom->GetMother()>=0) {\r
877                     AliAODMCParticle *iGrandMa = dynamic_cast<AliAODMCParticle*>(mcArray->At(iTMom->GetMother()));\r
878                     if(iGrandMa) {\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
884                     }\r
885                   } else {\r
886                     sMOTHER = "PRIMARY";\r
887                   }\r
888                 } else {\r
889                   ((TH2D*)((TList*)fQAList->FindObject("QAMC"))->FindObject("MCRADS"))->Fill(0.0,rads);\r
890                 }\r
891               }\r
892             }\r
893           }\r
894         }\r
895       }\r
896       Double_t dMCMASS;\r
897       if(fSpecie==0) {\r
898         dMCMASS = myV0->MassK0Short();\r
899         if(dMCMASS>0.588) dMCMASS=0.587999;\r
900         if(dMCMASS<0.412) dMCMASS=0.412001;\r
901       } else {\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
906       }\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
911       }\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
914     }//mcArray\r
915     passes=mcpasses;\r
916   }\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
930   }\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
934   }\r
935   return passes;\r
936 }\r
937 //=======================================================================\r
938 void AliAnalysisTaskFlowStrange::Terminate(Option_t *)\r
939 {\r
940   //terminate\r
941 }\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
945 {\r
946   // create track for flow tasks\r
947   if(fCandidates->GetLast()+1>=fCandidates->GetSize()) {\r
948     fCandidates->Expand( 2*fCandidates->GetSize() );\r
949   }\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
956     oTrack->ClearMe();\r
957   }\r
958   oTrack->SetMass(mass);\r
959   oTrack->SetPt(pt);\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
966   if(overwrite) {\r
967     fCandidates->SetLast( fCandidates->GetLast()+1 );\r
968   } else {\r
969     fCandidates->AddLast(oTrack);\r
970   }\r
971   return;\r
972 }\r
973 //=======================================================================\r
974 void AliAnalysisTaskFlowStrange::SetCommonConstants(Int_t massBins, Double_t minMass, Double_t maxMass)\r
975 {\r
976   // setter for mass bins\r
977   fMassBins = massBins;\r
978   fMinMass = minMass;\r
979   fMaxMass = maxMass;\r
980 }\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
986 }\r
987 \r