]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/FLOW/Tasks/AliAnalysisTaskFlowStrangee.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWG / FLOW / Tasks / AliAnalysisTaskFlowStrangee.cxx
CommitLineData
dd965670 1/*************************************************************************
2* Copyright(c) 1998-2008,ALICE Experiment at CERN,All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
7* Permission to use,copy,modify and distribute this software and its *
8* documentation strictly for non-commercial purposes is hereby granted *
9* without fee,provided that the above copyright notice appears in all *
10* copies and that both the copyright notice and this permission notice *
11* appear in the supporting documentation. The authors make no claims *
12* about the suitability of this software for any purpose. It is *
13* provided "as is" without express or implied warranty. *
14**************************************************************************/
15
16/////////////////////////////////////////////////////
17// AliAnalysisTaskFlowStrange:
18// Analysis task to select K0/Lambda candidates for flow analysis.
19// Authors: Cristian Ivan (civan@cern.ch)
20// Carlos Perez (cperez@cern.ch)
21// Pawel Debski (pdebski@cern.ch)
22//////////////////////////////////////////////////////
23
24#include "TChain.h"
25#include "TList.h"
26#include "TH1D.h"
27#include "TH2D.h"
28#include "TH3D.h"
29#include "TF1.h"
30#include "TProfile.h"
31#include "TProfile2D.h"
32#include "TVector3.h"
33#include "TStopwatch.h"
34#include "TFile.h"
35
36#include "TRandom3.h"
37
38#include "AliAnalysisManager.h"
39#include "AliInputEventHandler.h"
40
41#include "AliVVertex.h"
42#include "AliVVZERO.h"
43#include "AliStack.h"
44#include "AliMCEvent.h"
45
46#include "AliESDEvent.h"
47#include "AliESDtrack.h"
48#include "AliESDVertex.h"
49#include "AliESDv0.h"
50#include "AliESDtrackCuts.h"
51
52#include "AliAODEvent.h"
53#include "AliAODTrack.h"
54#include "AliAODVertex.h"
55#include "AliAODv0.h"
56#include "AliAODTracklets.h"
57#include "AliAODHeader.h"
58
59#include "AliAODMCHeader.h"
60#include "AliAODMCParticle.h"
61#include "TClonesArray.h"
62#include "TDatabasePDG.h"
63#include "TParticlePDG.h"
64
65#include "TMath.h"
66#include "TObjArray.h"
67#include "AliFlowCandidateTrack.h"
68
69#include "AliFlowTrackCuts.h"
70#include "AliFlowEventCuts.h"
71#include "AliFlowEvent.h"
72#include "AliFlowBayesianPID.h"
73#include "AliFlowCommonConstants.h"
74#include "AliFlowVector.h"
75
76#include "AliAnalysisTaskFlowStrangee.h"
77
78ClassImp(AliAnalysisTaskFlowStrangee)
79
80//=======================================================================
81AliAnalysisTaskFlowStrangee::AliAnalysisTaskFlowStrangee() :
82 AliAnalysisTaskSE(),
83 fPIDResponse(NULL),
84 fFB1(NULL),
85 fFB1024(NULL),
86 fTPCevent(NULL),
87 fVZEevent(NULL),
88 fCandidates(NULL),
89 fList(NULL),
90 fRunNumber(-1),
91 fDebug(0),
92 fQAlevel(0),
93 fReadESD(kFALSE),
94 fReadMC(kFALSE),
95 fAddPiToMCReactionPlane(kTRUE),
96 fPostMatched(0),
97 fAvoidExec(kFALSE),
98 fSkipSelection(kFALSE),
99 fSkipVn(kFALSE),
100 fUseFP(kFALSE),
101 fRunOnpA(kFALSE),
102 fRunOnpp(kFALSE),
103 fExtraEventRejection(kFALSE),
104 fSkipCentralitySelection(kFALSE),
105 fCentMethod("V0MTRK"),
106 fCentPerMin(0),
107 fCentPerMax(100),
108 fThisCent(-1.0),
109 fV0M(0.0),
110 fTRK(0.0),
111 fPriVtxZ(0.0),
112 fSPDVtxZ(0.0),
113 fSPDtracklets(0),
114 fVZETotM(0.0),
115 fRefMultTPC(0),
116 fRefMultHyb(0),
117 fVertexZcut(10.0),
118 fExcludeTPCEdges(kFALSE),
119 fSpecie(0),
120 fOnline(kFALSE),
121 fHomemade(kFALSE),
122 fWhichPsi(1),
123 fVZEsave(kFALSE),
124 fVZEload(NULL),
125 fVZEResponse(NULL),
126 fVZEmb(kFALSE),
127 fVZEByDisk(kTRUE),
128 fVZECa(0),
129 fVZECb(3),
130 fVZEAa(0),
131 fVZEAb(3),
132 fVZEQA(NULL),
133 fHarmonic(2),
134 fPsi2(0.0),
135 fMCEP(0.0),
136 fQVZEACos(0.0),
137 fQVZEASin(0.0),
138 fQVZECCos(0.0),
139 fQVZECSin(0.0),
140 fQVZEA(0.0),
141 fQVZEC(0.0),
142 fVZEWarning(kFALSE),
143 fQTPCACos(0.0),
144 fQTPCASin(0.0),
145 fQTPCCCos(0.0),
146 fQTPCCSin(0.0),
147 fQTPC2hCos(0.0),
148 fQTPC2hSin(0.0),
149 fQTPCA(0.0),
150 fQTPCC(0.0),
151 fQTPCA_nTracks(0),
152 fQTPCC_nTracks(0),
153 fSkipTerminate(kTRUE),
154 fMassBins(0),
155 fMinMass(0.0),
156 fMaxMass(0.0),
157 fPtBins(0),
158 fRFPFilterBit(1),
159 fRFPminPt(0.2),
160 fRFPmaxPt(5.0),
161 fRFPAminEta(0.0),
162 fRFPAmaxEta(+0.8),
163 fRFPCminEta(-0.8),
164 fRFPCmaxEta(0.0),
165 fRFPTPCsignal(10.0),
166 fRFPmaxIPxy(2.4),
167 fRFPmaxIPz(3.2),
168 fRFPTPCncls(70),
169 fDecayMass(0.0),
170 fDecayPhi(0.0),
171 fDecayEta(0.0),
172 fDecayPt(0.0),
173 fDecayDCAdaughters(0.0),
174 fDecayCosinePointingAngleXY(0.0),
175 fDecayRadXY(0.0),
176 fDecayDecayLength(0.0),
177 fDecayDecayLengthLab(0.0),
178 fDecayQt(0.0),
179 fDecayAlpha(0.0),
180 fDecayRapidity(0.0),
181 fDecayProductIPXY(0.0),
182 fDecayIPneg(0.0),
183 fDecayIPpos(0.0),
184 fDecayXneg(0.0),
185 fDecayXpos(0.0),
186 fDecayIDneg(-1),
187 fDecayIDpos(-1),
188 fDecayID(-1),
189 fDecayMatchOrigin(0.0),
190 fDecayMatchPhi(0.0),
191 fDecayMatchEta(0.0),
192 fDecayMatchPt(0.0),
193 fDecayMatchRadXY(0.0),
194 fDecayMinEta(0.0),
195 fDecayMaxEta(0.0),
196 fDecayMinPt(0.0),
197 fDecayMaxDCAdaughters(0.0),
198 fDecayMinCosinePointingAngleXY(0.0),
199 fDecayMinQt(0.0),
200 fDecayAPCutPie(kTRUE),
201 fDecayStopPIDAtPt(3.0),
202 fDecayMinRadXY(0.0),
203 fDecayMaxDecayLength(0.0),
204 fDecayMaxProductIPXY(0.0),
205 fDecayMaxRapidity(0.0),
206 fDaughterPhi(0.0),
207 fDaughterEta(0.0),
208 fDaughterPt(0.0),
209 fDaughterNClsTPC(0),
210 fDaughterNClsITS(0),
211 fDaughterCharge(0),
212 fDaughterNFClsTPC(0),
213 fDaughterNSClsTPC(0),
214 fDaughterChi2PerNClsTPC(0.0),
215 fDaughterXRows(0.0),
216 fDaughterImpactParameterXY(0.0),
217 fDaughterImpactParameterZ(0.0),
218 fDaughterStatus(0),
219 fDaughterITScm(0),
220 fDaughterNSigmaPID(0.0),
221 fDaughterKinkIndex(0),
222 fDaughterAtSecPhi(0.0),
223 fDaughterAtSecEta(0.0),
224 fDaughterAtSecPt(0.0),
225 fsharedITSCluster(0),
226 fchi2perClusterITS(0),
227 fcounterForSharedCluster(0),
228 fDaughterMatchPhi(0.0),
229 fDaughterMatchEta(0.0),
230 fDaughterMatchPt(0.0),
231 fDaughterMatchImpactParameterXY(0.0),
232 fDaughterMatchImpactParameterZ(0.0),
233 fDaughterUnTag(kTRUE),
234 fDaughterMinEta(0.0),
235 fDaughterMaxEta(0.0),
236 fDaughterMinPt(0.0),
237 fDaughterMinNClsTPC(0),
238 fDaughterMinNClsITS(-1),
239 fDaughterMinXRows(0),
240 fDaughterMaxChi2PerNClsTPC(0.0),
241 fDaughterMinXRowsOverNClsFTPC(0.0),
242 fDaughterMinImpactParameterXY(0.0),
243 fDaughterMaxNSigmaPID(0.0),
244 fDaughterSPDRequireAny(kFALSE),
245 fDaughterITSrefit(kFALSE),
246 fMaxchi2perITSCluster(0),
247 fmaxSharedITSCluster(0)
248{
249 //ctor
250 for(Int_t i=0; i!=100; ++i) fPtBinEdge[i]=0;
251 for(Int_t i=0; i!=6; ++i) fDaughterITSConfig[i]=-1;
252 for(Int_t i=0; i!=2000; ++i) fQTPCA_fID[i]=-1;
253 for(Int_t i=0; i!=2000; ++i) fQTPCC_fID[i]=-1;
254 for(Int_t i=0; i!=64; ++i) fVZEextW[i]=1;
255}
256
257//=======================================================================
258AliAnalysisTaskFlowStrangee::AliAnalysisTaskFlowStrangee(const char *name) :
259 AliAnalysisTaskSE(name),
260 fPIDResponse(NULL),
261 fFB1(NULL),
262 fFB1024(NULL),
263 fTPCevent(NULL),
264 fVZEevent(NULL),
265 fCandidates(NULL),
266 fList(NULL),
267 fRunNumber(-1),
268 fDebug(0),
269 fQAlevel(0),
270 fReadESD(kFALSE),
271 fReadMC(kFALSE),
272 fAddPiToMCReactionPlane(kTRUE),
273 fPostMatched(0),
274 fAvoidExec(kFALSE),
275 fSkipSelection(kFALSE),
276 fSkipVn(kFALSE),
277 fUseFP(kFALSE),
278 fRunOnpA(kFALSE),
279 fRunOnpp(kFALSE),
280 fExtraEventRejection(kFALSE),
281 fSkipCentralitySelection(kFALSE),
282 fCentMethod("V0MTRK"),
283 fCentPerMin(0),
284 fCentPerMax(100),
285 fThisCent(-1.0),
286 fV0M(0.0),
287 fTRK(0.0),
288 fPriVtxZ(0.0),
289 fSPDVtxZ(0.0),
290 fSPDtracklets(0),
291 fVZETotM(0.0),
292 fRefMultTPC(0),
293 fRefMultHyb(0),
294 fVertexZcut(10.0),
295 fExcludeTPCEdges(kFALSE),
296 fSpecie(0),
297 fOnline(kFALSE),
298 fHomemade(kFALSE),
299 fWhichPsi(1),
300 fVZEsave(kFALSE),
301 fVZEload(NULL),
302 fVZEResponse(NULL),
303 fVZEmb(kFALSE),
304 fVZEByDisk(kTRUE),
305 fVZECa(0),
306 fVZECb(3),
307 fVZEAa(0),
308 fVZEAb(3),
309 fVZEQA(NULL),
310 fHarmonic(2),
311 fPsi2(0.0),
312 fMCEP(0.0),
313 fQVZEACos(0.0),
314 fQVZEASin(0.0),
315 fQVZECCos(0.0),
316 fQVZECSin(0.0),
317 fQVZEA(0.0),
318 fQVZEC(0.0),
319 fVZEWarning(kFALSE),
320 fQTPCACos(0.0),
321 fQTPCASin(0.0),
322 fQTPCCCos(0.0),
323 fQTPCCSin(0.0),
324 fQTPC2hCos(0.0),
325 fQTPC2hSin(0.0),
326 fQTPCA(0.0),
327 fQTPCC(0.0),
328 fQTPCA_nTracks(0),
329 fQTPCC_nTracks(0),
330 fSkipTerminate(kTRUE),
331 fMassBins(0),
332 fMinMass(0.0),
333 fMaxMass(0.0),
334 fPtBins(0),
335 fRFPFilterBit(1),
336 fRFPminPt(0.2),
337 fRFPmaxPt(5.0),
338 fRFPAminEta(0.0),
339 fRFPAmaxEta(+0.8),
340 fRFPCminEta(-0.8),
341 fRFPCmaxEta(0.0),
342 fRFPTPCsignal(10.0),
343 fRFPmaxIPxy(2.4),
344 fRFPmaxIPz(3.2),
345 fRFPTPCncls(70),
346 fDecayMass(0.0),
347 fDecayPhi(0.0),
348 fDecayEta(0.0),
349 fDecayPt(0.0),
350 fDecayDCAdaughters(0.0),
351 fDecayCosinePointingAngleXY(0.0),
352 fDecayRadXY(0.0),
353 fDecayDecayLength(0.0),
354 fDecayDecayLengthLab(0.0),
355 fDecayQt(0.0),
356 fDecayAlpha(0.0),
357 fDecayRapidity(0.0),
358 fDecayProductIPXY(0.0),
359 fDecayIPneg(0.0),
360 fDecayIPpos(0.0),
361 fDecayXneg(0.0),
362 fDecayXpos(0.0),
363 fDecayIDneg(-1),
364 fDecayIDpos(-1),
365 fDecayID(-1),
366 fDecayMatchOrigin(0.0),
367 fDecayMatchPhi(0.0),
368 fDecayMatchEta(0.0),
369 fDecayMatchPt(0.0),
370 fDecayMatchRadXY(0.0),
371 fDecayMinEta(0.0),
372 fDecayMaxEta(0.0),
373 fDecayMinPt(0.0),
374 fDecayMaxDCAdaughters(0.0),
375 fDecayMinCosinePointingAngleXY(0.0),
376 fDecayMinQt(0.0),
377 fDecayAPCutPie(kTRUE),
378 fDecayStopPIDAtPt(3.0),
379 fDecayMinRadXY(0.0),
380 fDecayMaxDecayLength(0.0),
381 fDecayMaxProductIPXY(0.0),
382 fDecayMaxRapidity(0.0),
383 fDaughterPhi(0.0),
384 fDaughterEta(0.0),
385 fDaughterPt(0.0),
386 fDaughterNClsTPC(0),
387 fDaughterNClsITS(0),
388 fDaughterCharge(0),
389 fDaughterNFClsTPC(0),
390 fDaughterNSClsTPC(0),
391 fDaughterChi2PerNClsTPC(0.0),
392 fDaughterXRows(0.0),
393 fDaughterImpactParameterXY(0.0),
394 fDaughterImpactParameterZ(0.0),
395 fDaughterStatus(0),
396 fDaughterITScm(0),
397 fDaughterNSigmaPID(0.0),
398 fDaughterKinkIndex(0),
399 fDaughterAtSecPhi(0.0),
400 fDaughterAtSecEta(0.0),
401 fDaughterAtSecPt(0.0),
402 fsharedITSCluster(0),
403 fchi2perClusterITS(0),
404 fcounterForSharedCluster(0),
405 fDaughterMatchPhi(0.0),
406 fDaughterMatchEta(0.0),
407 fDaughterMatchPt(0.0),
408 fDaughterMatchImpactParameterXY(0.0),
409 fDaughterMatchImpactParameterZ(0.0),
410 fDaughterUnTag(kTRUE),
411 fDaughterMinEta(0.0),
412 fDaughterMaxEta(0.0),
413 fDaughterMinPt(0.0),
414 fDaughterMinNClsTPC(0),
415 fDaughterMinNClsITS(-1),
416 fDaughterMinXRows(0),
417 fDaughterMaxChi2PerNClsTPC(0.0),
418 fDaughterMinXRowsOverNClsFTPC(0.0),
419 fDaughterMinImpactParameterXY(0.0),
420 fDaughterMaxNSigmaPID(0.0),
421 fDaughterSPDRequireAny(kFALSE),
422 fDaughterITSrefit(kFALSE),
423 fMaxchi2perITSCluster(0),
424 fmaxSharedITSCluster(0)
425{
426 //ctor
427 for(Int_t i=0; i!=100; ++i) fPtBinEdge[i]=0;
428 for(Int_t i=0; i!=6; ++i) fDaughterITSConfig[i]=-1;
429 for(Int_t i=0; i!=2000; ++i) fQTPCA_fID[i]=-1;
430 for(Int_t i=0; i!=2000; ++i) fQTPCC_fID[i]=-1;
431 for(Int_t i=0; i!=64; ++i) fVZEextW[i]=1;
432 DefineInput( 0,TChain::Class());
433 DefineOutput(1,TList::Class());
434 DefineOutput(2,AliFlowEventSimple::Class()); // TPC object
435 DefineOutput(3,AliFlowEventSimple::Class()); // VZE object
436}
437//=======================================================================
438AliAnalysisTaskFlowStrangee::~AliAnalysisTaskFlowStrangee() {
439 //dtor
440 if (fCandidates) delete fCandidates;
441 if (fTPCevent) delete fTPCevent;
442 if (fVZEevent) delete fVZEevent;
443 if (fList) delete fList;
444}
445//=======================================================================
446void AliAnalysisTaskFlowStrangee::SetPtEdges(Int_t n, Double_t *p) {
447 fPtBins = n;
448 for(int i=0;i!=n+1;++i) fPtBinEdge[i] = p[i];
449}
450//=======================================================================
451TList* AliAnalysisTaskFlowStrangee::RunTerminateAgain(TList *lst) {
452 if(!lst) return NULL;
453 fList = lst;
454 fSpecie = Int_t( ((TProfile*)((TList*)fList->FindObject("Event"))->FindObject("Configuration"))->GetBinContent(kSpecie) );
455 fSkipSelection = ((TProfile*)((TList*)fList->FindObject("Event"))->FindObject("Configuration"))->GetBinContent(kSkipSelection);
456 fReadMC = ((TProfile*)((TList*)fList->FindObject("Event"))->FindObject("Configuration"))->GetBinContent(kReadMC);
457 Terminate(NULL);
458 return fList;
459}
460//=======================================================================
461void AliAnalysisTaskFlowStrangee::PrintConfig() {
462 //DUMP for main task
463 printf("******************************\n");
464 printf("<TASK Configuration> %s\n",GetName());
465 printf(" fDebug %d\n",fDebug);
466 printf(" fQAlevel %d\n",fQAlevel);
467 printf(" fExtraEventRejection %s\n",fExtraEventRejection?"kTRUE":"kFALSE");
468 printf(" fCentMethod %s\n",fCentMethod.Data());
469 printf(" fCentPerMin %d\n",fCentPerMin);
470 printf(" fCentPerMax %d\n",fCentPerMax);
471 printf(" fVextexZcut %f\n",fVertexZcut);
472 printf(" fRunOnpA %s\n",fRunOnpA?"kTRUE":"kFALSE");
473 printf(" fRunOnpp %s\n",fRunOnpp?"kTRUE":"kFALSE");
474 printf(" fReadESD %s\n",fReadESD?"kTRUE":"kFALSE");
475 printf(" fReadMC %s\n",fReadMC?"kTRUE":"kFALSE");
476 if(fReadMC) {
477 printf(" fAddPiToMCReactionPlane %s\n",fAddPiToMCReactionPlane?"kTRUE":"kFALSE");
478 printf(" fPostMatched %d\n",fPostMatched);
479 printf(" fAvoidExec %s\n",fAvoidExec?"kTRUE":"kFALSE");
480 printf(" fSkipCentralitySelection %s\n",fSkipCentralitySelection?"kTRUE":"kFALSE");
481 }
482 printf(" fVZEsave %s\n",fVZEsave?"kTRUE":"kFALSE");
483 if(fVZEload) {
484 printf(" fVZEload %d runs\n",fVZEload->GetEntries());
485 printf(" fVZEmb %s\n",fVZEmb?"kTRUE":"kFALSE");
486 printf(" fVZEByDisk %s\n",fVZEByDisk?"kTRUE":"kFALSE");
487 }
488 printf(" fHarmonic %d\n",fHarmonic);
489 printf(" fWhichPsi %d\n",fWhichPsi);
490 printf(" fVZECa %d\n",fVZECa);
491 printf(" fVZECb %d\n",fVZECb);
492 printf(" fVZEAa %d\n",fVZEAa);
493 printf(" fVZEAb %d\n",fVZEAb);
494 printf(" fRFPFilterBit %d\n",fRFPFilterBit);
495 printf(" fRFPminPt %f\n",fRFPminPt);
496 printf(" fRFPmaxPt %f\n",fRFPmaxPt);
497 printf(" fRFPAminEta %f\n",fRFPAminEta);
498 printf(" fRFPAmaxEta %f\n",fRFPAmaxEta);
499 printf(" fRFPCminEta %f\n",fRFPCminEta);
500 printf(" fRFPCmaxEta %f\n",fRFPCmaxEta);
501 printf(" fRFPmaxIPxy %f\n",fRFPmaxIPxy);
502 printf(" fRFPmaxIPz %f\n",fRFPmaxIPz);
503 printf(" fRFPTPCsignal %f\n",fRFPTPCsignal);
504 printf(" fRFPTPCncls %d\n",fRFPTPCncls);
505 printf(" fExcludeTPCEdges %s\n",fExcludeTPCEdges?"kTRUE":"kFALSE");
506 printf(" fSkipSelection %s\n",fSkipSelection?"kTRUE":"kFALSE");
507 if(!fSkipSelection) {
508 printf(" fSpecie %d\n",fSpecie);
509 printf(" fPtBins %d\n |",fPtBins);
510 for(int i=0; i!=fPtBins+1; ++i) printf("%f|",fPtBinEdge[i]); printf("\n");
511 if(fSpecie<90) {
512 printf(" fMassBins %d\n",fMassBins);
513 printf(" fMinMass %f\n",fMinMass);
514 printf(" fMaxMass %f\n",fMaxMass);
515 }
516 }
517 printf(" fSkipVn %s\n",fSkipVn?"kTRUE":"kFALSE");
518 if(!fSkipVn) {
519 printf(" fUseFP %s\n",fUseFP?"kTRUE":"kFALSE");
520 }
521 MyPrintConfig();
522}
523//=======================================================================
524void AliAnalysisTaskFlowStrangee::MyPrintConfig() {
525 // Dump for derived task
526 printf("==================================\n");
527 printf("<FlowStrange> \n");
528 if(!fSkipSelection) {
529 if(fReadESD) {
530 printf(" fOnline %s\n",fOnline?"kTRUE":"kFALSE");
531 printf(" fHomemade %s\n",fHomemade?"kTRUE":"kFALSE");
532 }
533 printf(" fDecayMinEta %f\n",fDecayMinEta);
534 printf(" fDecayMaxEta %f\n",fDecayMaxEta);
535 printf(" fDecayMinPt %f\n",fDecayMinPt);
536 printf(" fDecayMaxDCAdaughters %f\n",fDecayMaxDCAdaughters);
537 printf(" fDecayMinCosinePointingAngleXY %f\n",fDecayMinCosinePointingAngleXY);
538 printf(" fDecayMinQt %f\n",fDecayMinQt);
539 printf(" fDecayAPCutPie %s\n",fDecayAPCutPie?"kTRUE":"kFALSE");
540 printf(" fDecayStopPIDAtPt %f\n",fDecayStopPIDAtPt);
541 printf(" fDecayMinRadXY %f\n",fDecayMinRadXY);
542 printf(" fDecayMaxDecayLength %f\n",fDecayMaxDecayLength);
543 printf(" fDecayMaxProductIPXY %f\n",fDecayMaxProductIPXY);
544 printf(" fDecayMaxRapidity %f\n",fDecayMaxRapidity);
545 }
546 printf(" fDaughterUnTag %s\n",fDaughterUnTag?"kTRUE":"kFALSE");
547 printf(" fDaughterMinEta %f\n",fDaughterMinEta);
548 printf(" fDaughterMaxEta %f\n",fDaughterMaxEta);
549 printf(" fDaughterMinPt %f\n",fDaughterMinPt);
550 printf(" fDaughterMinNClsTPC %d\n",fDaughterMinNClsTPC);
551 printf(" fDaughterMinXRows %d\n",fDaughterMinXRows);
552 printf(" fDaughterMaxChi2PerNClsTPC %f\n",fDaughterMaxChi2PerNClsTPC);
553 printf(" fDaughterMinXRowsOverNClsFTPC %f\n",fDaughterMinXRowsOverNClsFTPC);
554 printf(" fDaughterMinImpactParameterXY %f\n",fDaughterMinImpactParameterXY);
555 printf(" fDaughterMaxNSigmaPID %f\n",fDaughterMaxNSigmaPID);
556}
557//=======================================================================
558void AliAnalysisTaskFlowStrangee::UserCreateOutputObjects() {
559 //UserCreateOutputObjects
560 if(fDebug) PrintConfig();
561 fList=new TList();
562 fList->SetOwner();
563 AddQAEvents();
564 AddQACandidates();
565 if(fReadESD) MakeFilterBits();
566
567 AliFlowCommonConstants *cc = AliFlowCommonConstants::GetMaster();
568 cc->SetNbinsMult(3000); cc->SetMultMin(0); cc->SetMultMax(30000);
569 cc->SetNbinsPt(100); cc->SetPtMin(0.0); cc->SetPtMax(20.0);
570 cc->SetNbinsPhi(100); cc->SetPhiMin(0.0); cc->SetPhiMax(TMath::TwoPi());
571 cc->SetNbinsEta(100); cc->SetEtaMin(-5.0); cc->SetEtaMax(+5.0);
572 cc->SetNbinsQ(100); cc->SetQMin(0.0); cc->SetQMax(3.0);
573 cc->SetNbinsMass(fMassBins);
574 cc->SetMassMin(fMinMass);
575 cc->SetMassMax(fMaxMass);
576
577 //loading pid response
578 AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
579 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
580 fPIDResponse = inputHandler->GetPIDResponse();
581
582 if(fUseFP) {
583 fTPCevent = new AliFlowEvent(100);
584 fVZEevent = new AliFlowEvent(100);
585 //array of candidates
586 fCandidates = new TObjArray(100);
587 fCandidates->SetOwner();
588 }
589 PostData(1,fList);
590 if(fUseFP) { // for connection to the flow package
591 PostData(2,fTPCevent);
592 PostData(3,fVZEevent);
593 }
594
595 gRandom->SetSeed();
596}
597//=======================================================================
598void AliAnalysisTaskFlowStrangee::MyUserCreateOutputObjects() {
599 TList *tList;
600 TH1D *tH1D;
601 TH2D *tH2D;
602
603 //reconstruction
604 if(fReadESD) {
605 tList=new TList(); tList->SetName("ESD_TrkAll"); tList->SetOwner(); AddTrackSpy(tList); fList->Add(tList);
606 tList=new TList(); tList->SetName("ESD_TrkSel"); tList->SetOwner(); AddTrackSpy(tList); fList->Add(tList);
607 tH2D = new TH2D("NPAIR", "NPAIR;NPOS;NNEG",1000,0,5000,1000,0,5000); tList->Add(tH2D);
608 tH2D = new TH2D("PtIPXY","PtIPXY;Pt;IPxy", 100,0,10,200,-10,+10); tList->Add(tH2D);
609 }
610 //aod prefilter candidates
611 tList=new TList(); tList->SetName("V0SAll"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
612 tH2D = new TH2D("V0SADC","V0S AFTER DAUGHTER CUTS;V0ALL;V0IMW",100,0,1000,100,0,1000); tList->Add(tH2D);
613 tList=new TList(); tList->SetName("AllDau"); tList->SetOwner(); AddTrackSpy(tList); fList->Add(tList);
614 //candidates
615 tList=new TList(); tList->SetName("V0SSel"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
616 tList=new TList(); tList->SetName("SelDau"); tList->SetOwner(); AddTrackSpy(tList); fList->Add(tList);
617 //flow
618 if(!fSkipVn) {
619 tList=new TList(); tList->SetName("V0SAllVn"); tList->SetOwner(); AddDecayVn(tList); fList->Add(tList);
620 tList=new TList(); tList->SetName("V0SSelVn"); tList->SetOwner(); AddDecayVn(tList); fList->Add(tList);
621 }
622 // IN-OUT
623 if(fQAlevel>1) {
624 tList=new TList(); tList->SetName("V0SAllIP"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
625 tList=new TList(); tList->SetName("V0SAllOP"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
626 tList=new TList(); tList->SetName("V0SSelIP"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
627 tList=new TList(); tList->SetName("V0SSelOP"); tList->SetOwner(); AddCandidatesSpy(tList); fList->Add(tList);
628 }
629 //match
630 if(fReadMC) {
631 tList=new TList(); tList->SetName("STATMC"); tList->SetOwner(); fList->Add(tList);
632 tH1D = new TH1D("Events", "Events",5,0.5,5.5); tList->Add(tH1D);
633 tH1D->GetXaxis()->SetBinLabel(1,"Selected events");
634 tH1D->GetXaxis()->SetBinLabel(2,"Stack found");
635 tH1D->GetXaxis()->SetBinLabel(3,"Daughters in stack");
636 tH1D->GetXaxis()->SetBinLabel(4,"Correspond to decay");
637 tH1D->GetXaxis()->SetBinLabel(5,"Decay has mother");
638 tList=new TList(); tList->SetName("Mth"); tList->SetOwner(); AddCandidatesSpy(tList,true); fList->Add(tList);
639 tList=new TList(); tList->SetName("MthDau"); tList->SetOwner(); AddTrackSpy(tList,true); fList->Add(tList);
640 tList=new TList(); tList->SetName("MthPosPos"); tList->SetOwner(); AddCandidatesSpy(tList,true); fList->Add(tList);
641 tList=new TList(); tList->SetName("MthNegNeg"); tList->SetOwner(); AddCandidatesSpy(tList,true); fList->Add(tList);
642 tList=new TList(); tList->SetName("MthPosNeg"); tList->SetOwner(); AddCandidatesSpy(tList,true); fList->Add(tList);
643 tList=new TList(); tList->SetName("MthNegDau"); tList->SetOwner(); AddTrackSpy(tList,true); fList->Add(tList);
644 tList=new TList(); tList->SetName("MthPosDau"); tList->SetOwner(); AddTrackSpy(tList,true); fList->Add(tList);
645 tList=new TList(); tList->SetName("MthFeedDown"); tList->SetOwner(); AddCandidatesSpy(tList,true); fList->Add(tList);
646 tList=new TList(); tList->SetName("UnMth"); tList->SetOwner(); AddCandidatesSpy(tList,false); fList->Add(tList);
647 tList=new TList(); tList->SetName("UnMthDau"); tList->SetOwner(); AddTrackSpy(tList,false); fList->Add(tList);
648 if(!fSkipVn) {
649 tList=new TList(); tList->SetName("V0SMthVn"); tList->SetOwner(); AddDecayVn(tList); fList->Add(tList);
650 tList=new TList(); tList->SetName("V0SMthPosPosVn"); tList->SetOwner(); AddDecayVn(tList); fList->Add(tList);
651 tList=new TList(); tList->SetName("V0SMthNegNegVn"); tList->SetOwner(); AddDecayVn(tList); fList->Add(tList);
652 tList=new TList(); tList->SetName("V0SMthPosNegVn"); tList->SetOwner(); AddDecayVn(tList); fList->Add(tList);
653 tList=new TList(); tList->SetName("V0SUnMthVn"); tList->SetOwner(); AddDecayVn(tList); fList->Add(tList);
654 }
655 }
656}
657//=======================================================================
658void AliAnalysisTaskFlowStrangee::AddQAEvents() {
659 // function to add event qa
660 TH1D *tH1D;
661 TProfile *tProfile;
662 TList *tQAEvents=new TList();
663 tQAEvents->SetName("Event");
664 tQAEvents->SetOwner();
665 tH1D = new TH1D("Events","Number of Events",6,0,6); tQAEvents->Add(tH1D);
666 tH1D->GetXaxis()->SetBinLabel(1,"exec");
667 tH1D->GetXaxis()->SetBinLabel(2,"userexec");
668 tH1D->GetXaxis()->SetBinLabel(3,"reached");
669 tH1D->GetXaxis()->SetBinLabel(4,"selected");
670 tH1D->GetXaxis()->SetBinLabel(5,"rejectedByLowQw");
671 tH1D->GetXaxis()->SetBinLabel(6,"rejectedByErrorLoadVZEcal");
672 tProfile = new TProfile("Configuration","Configuration",10,0.5,10.5); tQAEvents->Add(tProfile);
673 tProfile->Fill(kSpecie,fSpecie,1);
674 tProfile->GetXaxis()->SetBinLabel(kSpecie,"fSpecie");
675 tProfile->Fill(kHarmonic,fHarmonic,1);
676 tProfile->GetXaxis()->SetBinLabel(kHarmonic,"fHarmonic");
677 tProfile->Fill(kReadMC,fReadMC,1);
678 tProfile->GetXaxis()->SetBinLabel(kReadMC,"fReadMC");
679 tProfile->Fill(kSkipSelection,fSkipSelection,1);
680 tProfile->GetXaxis()->SetBinLabel(kSkipSelection,"fSkipSelection");
681 tH1D = new TH1D("POI","POIs;multiplicity",800,0,800); tQAEvents->Add(tH1D);
682 tH1D = new TH1D("UNTAG","UNTAG;Untagged Daughters",800,0,800);tQAEvents->Add(tH1D);
683 tH1D = new TH1D("RealTime","RealTime;LogT sec",2000,-10,+10); tQAEvents->Add(tH1D);
684 fList->Add(tQAEvents);
685 AddEventSpy("EventsRaw");
686 AddEventSpy("EventsReached");
687 AddEventSpy("EventsSelected");
688 AddEventSpy("EventsAnalyzed");
689 AddMakeQSpy();
690 AddVZEQA();
691}
692//=======================================================================
693void AliAnalysisTaskFlowStrangee::AddEventSpy(TString name) {
694 TH1D *tH1D;
695 TH2D *tH2D;
696 TList *tList=new TList();
697 tList->SetName(name.Data());
698 tList->SetOwner();
699 tH2D = new TH2D("VTXZ","VTXZ;PriVtxZ;SPDVtxZ",60,-25,+25,60,-25,+25); tList->Add( tH2D );
700 tH2D = new TH2D("CCCC","CCCC;V0M;TRK",60,-10,110,60,-10,110); tList->Add( tH2D );
701 tH2D = new TH2D("HYBTPC","HYBTPC;TPC ONLY;HYBRID",100,0,3000,100,0,3000); tList->Add( tH2D );
702 tH1D = new TH1D("HYBTPCRat","HYBTPCRat;TPC/HYB",120,0.2,2.2); tList->Add( tH1D );
703 tH2D = new TH2D("SPDVZE","SPDVZE;SPD Tracklets;Total Multiplicity in VZERO",100,0,3500,100,0,25000); tList->Add( tH2D );
704 tH1D = new TH1D("SPDVZERat","SPDVZERat;TotalMultiplicityVZERO/SPDTracklets",120,2,+12); tList->Add( tH1D );
705 if(fReadMC) {
706 tH1D = new TH1D("MCEP","MCEP;MCEP",100,-TMath::TwoPi(),TMath::TwoPi()); tList->Add( tH1D );
707 }
708 fList->Add(tList);
709}
710//=======================================================================
711void AliAnalysisTaskFlowStrangee::FillEventSpy(TString name) {
712 ((TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject("VTXZ"))->Fill( fPriVtxZ, fSPDVtxZ );
713 ((TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject("CCCC"))->Fill( fV0M, fTRK );
714 ((TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject("HYBTPC"))->Fill( fRefMultTPC, fRefMultHyb );
715 if(fRefMultHyb>0)
716 ((TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject("HYBTPCRat"))->Fill( double(fRefMultTPC)/double(fRefMultHyb) );
717 ((TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject("SPDVZE"))->Fill( fSPDtracklets, fVZETotM );
718 if(fSPDtracklets>0)
719 ((TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject("SPDVZERat"))->Fill( fVZETotM/fSPDtracklets );
720 if(fReadMC) {
721 ((TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject("MCEP"))->Fill( fMCEP );
722 }
723}
724//=======================================================================
725void AliAnalysisTaskFlowStrangee::AddMakeQSpy() {
726 TH1D *tH1D;
727 TH2D *tH2D;
728 TProfile *tPF1;
729 TList *tList=new TList();
730 tList->SetName("MakeQSpy");
731 tList->SetOwner();
732 fList->Add(tList);
733 tH1D = new TH1D("RFPTPC","TPC Refrence Multiplicity;multiplicity",3000,0,3000); tList->Add( tH1D );
734 tH1D = new TH1D("RFPVZE","VZERO Reference Multiplicity;multiplicity",3000,0,30000); tList->Add( tH1D );
735 tH1D = new TH1D("QmTPC","TPC Normalized Q vector;|Q|/#sqrt{M}",360,0,7); tList->Add( tH1D );
736 tH1D = new TH1D("QmVZEA","VZEROA Normalized Q vector;|Q|/#sqrt{W}",360,0,7); tList->Add( tH1D );
737 tH1D = new TH1D("QmVZEC","VZEROC Normalized Q vector;|Q|/#sqrt{W}",360,0,7); tList->Add( tH1D );
738 tH2D = new TH2D("TPCAllPhiEta","TPCall;Phi;Eta",180,0,TMath::TwoPi(),80,-0.9,+0.9); tList->Add( tH2D );
739 tH2D = new TH2D("VZEAllPhiEta","VZEall;Phi;Eta",20,0,TMath::TwoPi(),40,-4.0,+6.0); tList->Add( tH2D );
740 tH1D = new TH1D("TPCPSI","TPCPSI;PSI",72,0,TMath::Pi()); tList->Add( tH1D );
741 tH1D = new TH1D("TPCPSIA","TPCPSIA;PSIA",72,0,TMath::Pi()); tList->Add( tH1D );
742 tH1D = new TH1D("TPCPSIC","TPCPSIC;PSIC",72,0,TMath::Pi()); tList->Add( tH1D );
743 tH1D = new TH1D("VZEPSI","VZEPSI;PSI",72,0,TMath::Pi()); tList->Add( tH1D );
744 tH1D = new TH1D("VZEPSIA","VZEPSIA;PSIA",72,0,TMath::Pi()); tList->Add( tH1D );
745 tH1D = new TH1D("VZEPSIC","VZEPSIC;PSIC",72,0,TMath::Pi()); tList->Add( tH1D );
746 tH2D = new TH2D("PSI_TPCAVZEC","PSI_TPCAVZEC",72,0,TMath::Pi(),72,0,TMath::Pi()); tList->Add( tH2D );
747 tH2D = new TH2D("PSI_TPCCVZEA","PSI_TPCAVZEC",72,0,TMath::Pi(),72,0,TMath::Pi()); tList->Add( tH2D );
748 tH2D = new TH2D("PSI_TPCVZE","PSI_TPCVZE",72,0,TMath::Pi(),72,0,TMath::Pi()); tList->Add( tH2D );
749 tPF1 = new TProfile("TPCQm","TPCQm",6,0.5,6.5); tList->Add( tPF1 );
750 tPF1->GetXaxis()->SetBinLabel(1,"Qcy"); tPF1->GetXaxis()->SetBinLabel(2,"Qcx");
751 tPF1->GetXaxis()->SetBinLabel(3,"Qay"); tPF1->GetXaxis()->SetBinLabel(4,"Qax");
752 tPF1->GetXaxis()->SetBinLabel(5,"Qy"); tPF1->GetXaxis()->SetBinLabel(6,"Qx");
753 tPF1 = new TProfile("VZEQm","VZEQm",6,0.5,6.5); tList->Add( tPF1 );
754 tPF1->GetXaxis()->SetBinLabel(1,"Qcy"); tPF1->GetXaxis()->SetBinLabel(2,"Qcx");
755 tPF1->GetXaxis()->SetBinLabel(3,"Qay"); tPF1->GetXaxis()->SetBinLabel(4,"Qax");
756 tPF1->GetXaxis()->SetBinLabel(5,"Qy"); tPF1->GetXaxis()->SetBinLabel(6,"Qx");
757 tPF1 = new TProfile("QmVZEAQmVZEC","QmVZEAQmVZEC",1,0.5,1.5,"s"); tList->Add( tPF1 );
758 tPF1 = new TProfile("QmVZEASQUARED","QmVZEASQUARED",1,0.5,1.5,"s"); tList->Add( tPF1 );
759 tPF1 = new TProfile("QmVZECSQUARED","QmVZECSQUARED",1,0.5,1.5,"s"); tList->Add( tPF1 );
760 tPF1 = new TProfile("QmTPCQmVZEA","QmTPCQmVZEA",1,0.5,1.5,"s"); tList->Add( tPF1 );
761 tPF1 = new TProfile("QmTPCQmVZEC","QmTPCQmVZEC",1,0.5,1.5,"s"); tList->Add( tPF1 );
762 tH1D = new TH1D("ChiSquaredVZEA","ChiSquaredVZEC",1,0.5,1.5); tList->Add( tH1D );
763 tH1D = new TH1D("ChiSquaredVZEC","ChiSquaredVZEC",1,0.5,1.5); tList->Add( tH1D );
764 if(fReadMC) {
765 tH1D = new TH1D("PSIMCDIFFTPC","PSIMCDIFFTPC;MC-TPC",72,-TMath::TwoPi(),TMath::TwoPi()); tList->Add( tH1D );
766 tH1D = new TH1D("PSIMCDIFFTPCA","PSIMCDIFFTPCA;MC-TPCA",72,-TMath::TwoPi(),TMath::TwoPi()); tList->Add( tH1D );
767 tH1D = new TH1D("PSIMCDIFFTPCC","PSIMCDIFFTPCC;MC-TPCC",72,-TMath::TwoPi(),TMath::TwoPi()); tList->Add( tH1D );
768 tH1D = new TH1D("PSIMCDIFFVZE","PSIMCDIFFVZE;MC-VZE",72,-TMath::TwoPi(),TMath::TwoPi()); tList->Add( tH1D );
769 tH1D = new TH1D("PSIMCDIFFVZEA","PSIMCDIFFVZEA;MC-VZEA",72,-TMath::TwoPi(),TMath::TwoPi()); tList->Add( tH1D );
770 tH1D = new TH1D("PSIMCDIFFVZEC","PSIMCDIFFVZEC;MC-VZEC",72,-TMath::TwoPi(),TMath::TwoPi()); tList->Add( tH1D );
771 }
772 tList=new TList(); tList->SetName("TPCRFPall"); tList->SetOwner(); AddTPCRFPSpy(tList); fList->Add(tList);
773 tList=new TList(); tList->SetName("TPCRFPsel"); tList->SetOwner(); AddTPCRFPSpy(tList); fList->Add(tList);
774}
775//=======================================================================
776void AliAnalysisTaskFlowStrangee::AddQACandidates() {
777 // function to add histogramming for candidates
778 if(fSkipSelection) return;
779 TList *tList;
780 TH1D *tH1D;
781
782 //charge particles (benchmark)
783 if(fSpecie>=90) {
784 tList=new TList(); tList->SetName("TrkAll"); tList->SetOwner(); AddTrackSpy(tList); fList->Add(tList);
785 tList=new TList(); tList->SetName("TrkSel"); tList->SetOwner(); AddTrackSpy(tList); fList->Add(tList);
786 if(!fSkipVn) {
787 tList=new TList(); tList->SetName("TrkAllVn"); tList->SetOwner(); AddTrackVn(tList); fList->Add(tList);
788 tList=new TList(); tList->SetName("TrkSelVn"); tList->SetOwner(); AddTrackVn(tList); fList->Add(tList);
789 }
790 //match
791 if(fReadMC) {
792 tList=new TList(); tList->SetName("STATMC"); tList->SetOwner(); fList->Add(tList);
793 tH1D = new TH1D("Events", "Events",3,0.5,3.5); tList->Add(tH1D);
794 tH1D->GetXaxis()->SetBinLabel(1,"Selected events");
795 tH1D->GetXaxis()->SetBinLabel(2,"Stack found");
796 tH1D->GetXaxis()->SetBinLabel(3,"Track in stack");
797 tList=new TList(); tList->SetName("Mth"); tList->SetOwner(); AddTrackSpy(tList); fList->Add(tList);
798 tList=new TList(); tList->SetName("MthPos"); tList->SetOwner(); AddTrackSpy(tList); fList->Add(tList);
799 tList=new TList(); tList->SetName("MthNeg"); tList->SetOwner(); AddTrackSpy(tList); fList->Add(tList);
800 if(!fSkipVn) {
801 tList=new TList(); tList->SetName("MthVn"); tList->SetOwner(); AddTrackVn(tList); fList->Add(tList);
802 tList=new TList(); tList->SetName("MthPosVn"); tList->SetOwner(); AddTrackVn(tList); fList->Add(tList);
803 tList=new TList(); tList->SetName("MthNegVn"); tList->SetOwner(); AddTrackVn(tList); fList->Add(tList);
804 }
805 }
806 }
807 //stack
808 if(fReadMC) {
809 tList=new TList(); tList->SetName("MCTPionGenAcc"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
810 tList=new TList(); tList->SetName("MCTKaonGenAcc"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
811 tList=new TList(); tList->SetName("MCTK0sGenAcc"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
812 tList=new TList(); tList->SetName("MCTProtonGenAcc"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
813 tList=new TList(); tList->SetName("MCTLdaGenAcc"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
814 tList=new TList(); tList->SetName("MCTPhiGenAcc"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
815 tList=new TList(); tList->SetName("MCTXiGenAcc"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
816 tList=new TList(); tList->SetName("MCTOmegaGenAcc"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
817 tList=new TList(); tList->SetName("MCTPion"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
818 tList=new TList(); tList->SetName("MCTKaon"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
819 tList=new TList(); tList->SetName("MCTK0s"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
820 tList=new TList(); tList->SetName("MCTLda"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
821 tList=new TList(); tList->SetName("MCTProton"); tList->SetOwner(); AddMCParticleSpy(tList); fList->Add(tList);
822 }
823 MyUserCreateOutputObjects();
824}
825//=======================================================================
826void AliAnalysisTaskFlowStrangee::Exec(Option_t* option) {
827 // bypassing ::exec (needed because of AMPT)
828 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("Events"))->Fill(0);
829 if(fAvoidExec) {
830 AliAnalysisTaskFlowStrangee::UserExec(option);
831 } else {
832 AliAnalysisTaskSE::Exec(option);
833 }
834}
835//=======================================================================
836void AliAnalysisTaskFlowStrangee::UserExec(Option_t *option) {
837 // bridge
838 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("Events"))->Fill(1);
839 AliAnalysisTaskFlowStrangee::MyUserExec(option);
840}
841//=======================================================================
842void AliAnalysisTaskFlowStrangee::MyNotifyRun() {
843 if(fVZEsave) AddVZEROResponse();
844}
845//=======================================================================
846Bool_t AliAnalysisTaskFlowStrangee::CalibrateEvent() {
847 if(fVZEsave) SaveVZEROResponse();
848 Bool_t okay=kTRUE;
849 if(fVZEload) {
850 LoadVZEROResponse();
851 if(!fVZEResponse) okay = kFALSE;
852 }
853 return okay;
854}
855//=======================================================================
856Bool_t AliAnalysisTaskFlowStrangee::AcceptAAEvent(AliESDEvent* tESD) {
857 // ESD reading discontinued: TO BE UPDATED
858 fRunNumber = tESD->GetRunNumber();
859 Double_t acceptEvent=kTRUE;
860 Double_t tTPCVtxZ = tESD->GetPrimaryVertex()->GetZ();
861 if(tESD->GetPrimaryVertex()->GetNContributors()<=0) return kFALSE;
862 Double_t tSPDVtxZ = tESD->GetPrimaryVertexSPD()->GetZ();
863 if(tESD->GetPrimaryVertexSPD()->GetNContributors()<=0) return kFALSE;
864 // EventCuts
865 AliCentrality *cent = tESD->GetCentrality();
866 Double_t cc1, cc2;
867 cc1 = cent->GetCentralityPercentile("V0M");
868 cc2 = cent->GetCentralityPercentile("TRK");
869 TString mycent = fCentMethod;
870 if(fCentMethod.Contains("V0MTRK")) {
871 acceptEvent = TMath::Abs(cc1-cc2)>5.0?kFALSE:acceptEvent; // a la Alex
872 mycent = "V0M";
873 }
874 fThisCent = cent->GetCentralityPercentile( mycent );
875 acceptEvent = (fThisCent<fCentPerMin||fThisCent>fCentPerMax)?kFALSE:acceptEvent;
876 acceptEvent = TMath::Abs(tTPCVtxZ-tSPDVtxZ)>0.5?kFALSE:acceptEvent;
877 acceptEvent = TMath::Abs(tTPCVtxZ)>fVertexZcut?kFALSE:acceptEvent;
878 ((TH2D*)((TList*)fList->FindObject("EventsReached"))->FindObject("VTXZ"))->Fill( tTPCVtxZ, tSPDVtxZ );
879 ((TH2D*)((TList*)fList->FindObject("EventsReached"))->FindObject("CCCC"))->Fill( cc1, cc2 );
880 // EndOfCuts
881 if(acceptEvent) {
882 ((TH2D*)((TList*)fList->FindObject("EventsSelected"))->FindObject("VTXZ"))->Fill( tTPCVtxZ, tSPDVtxZ );
883 ((TH2D*)((TList*)fList->FindObject("EventsSelected"))->FindObject("CCCC"))->Fill( cc1, cc2 );
884 }
885
886 return acceptEvent;
887
888 //return kFALSE;
889}
890//=======================================================================
891Bool_t AliAnalysisTaskFlowStrangee::MinimumRequirementsAA(AliAODEvent *tAOD) {
892 fRunNumber = tAOD->GetRunNumber();
893 AliCentrality *cent = ((AliVAODHeader*)tAOD->GetHeader())->GetCentralityP();
894 fV0M = cent->GetCentralityPercentile("V0M");
895 fTRK = cent->GetCentralityPercentile("TRK");
896 TString mycent = fCentMethod;
897 if(fCentMethod.Contains("V0MTRK")) {
898 mycent = "V0M";
899 }
900 fThisCent = cent->GetCentralityPercentile( mycent );
901 fPriVtxZ = tAOD->GetPrimaryVertex()->GetZ();
902 fSPDVtxZ = tAOD->GetPrimaryVertexSPD()->GetZ();
903 fSPDtracklets = tAOD->GetTracklets()->GetNumberOfTracklets();
904 fVZETotM = tAOD->GetVZEROData()->GetMTotV0A() + tAOD->GetVZEROData()->GetMTotV0C();
905 int hyb_fb = 272; // for 2010h::AOD086
906 if(fRunNumber>=166529&&fRunNumber<=170593) {
907 hyb_fb = 768; // for 2011h::AOD145
908 }
909 fRefMultTPC = RefMult(tAOD,128);
910 fRefMultHyb = RefMult(tAOD,hyb_fb);
911 if(fReadMC) {
912 fMCEP = -999;
913 AliAODMCHeader *mcHeader = dynamic_cast<AliAODMCHeader*>(tAOD->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
914 if(mcHeader) {
915 fMCEP = mcHeader->GetReactionPlaneAngle();
916 if(fAddPiToMCReactionPlane) fMCEP += (gRandom->Rndm()>0.5)*TMath::Pi();
917 }
918 }
919 // centrality selection health
920 // cut in Vtx 10 & NContributors
921 if(!fSkipCentralitySelection) if(fThisCent<0||fThisCent>100) return kFALSE;
922 // vtx z position compatibility within 5 mm
923 if(TMath::Abs(fPriVtxZ-fSPDVtxZ)>0.5) return kFALSE;
924 if(fExtraEventRejection) {
925 // specific cuts for 2010h (AOD086)
926 if(fRunNumber>=136851&&fRunNumber<=139517) {
927 if(fRefMultTPC>1.118*fRefMultHyb+100) return kFALSE;
928 if(fRefMultTPC<1.118*fRefMultHyb-100) return kFALSE;
929 }
930 // specific cuts for 2011h (AOD145)
931 if(fRunNumber>=166529&&fRunNumber<=170593) {
932 if(fRefMultTPC>1.205*fRefMultHyb+100) return kFALSE;
933 if(fRefMultTPC<1.205*fRefMultHyb-100) return kFALSE;
934 }
935 }
936 return kTRUE;
937}
938//=======================================================================
939Bool_t AliAnalysisTaskFlowStrangee::AcceptAAEvent(AliAODEvent *tAOD) {
940 Bool_t minimum = MinimumRequirementsAA(tAOD);
941 FillEventSpy("EventsRaw");
942 if(!minimum) return kFALSE;
943
944 Double_t acceptEvent=kTRUE;
945 TString mycent = fCentMethod;
946 if(fCentMethod.Contains("V0MTRK")) {
947 acceptEvent = TMath::Abs(fV0M-fTRK)>5.0?kFALSE:acceptEvent;
948 mycent = "V0M";
949 }
950 if(!fSkipCentralitySelection) acceptEvent = (fThisCent<fCentPerMin||fThisCent>fCentPerMax)?kFALSE:acceptEvent;
951 acceptEvent = TMath::Abs(fPriVtxZ)>fVertexZcut?kFALSE:acceptEvent; //fVertexZcut?
952 // HISTOGRAMMING
953 FillEventSpy("EventsReached");
954 if(acceptEvent) FillEventSpy("EventsSelected");
955 return acceptEvent;
956}
957//=======================================================================
958Bool_t AliAnalysisTaskFlowStrangee::AcceptPPEvent(AliAODEvent*) {
959 // PP reading discontinued: TO BE UPDATED
960 /*
961 Double_t acceptEvent=kTRUE;
962 Double_t tVtxZ = tAOD->GetPrimaryVertex()->GetZ();
963 if(tAOD->GetPrimaryVertex()->GetNContributors()<=0) return kFALSE;
964 Double_t tSPDVtxZ = tAOD->GetPrimaryVertexSPD()->GetZ();
965 if(tAOD->GetPrimaryVertexSPD()->GetNContributors()<=0) return kFALSE;
966 // EventCuts
967 AliCentrality *cent = tAOD->GetHeader()->GetCentralityP();
968 Double_t cc1, cc2;
969 cc1 = cent->GetCentralityPercentile("V0M");
970 cc2 = cent->GetCentralityPercentile("TRK");
971 fThisCent = GetReferenceMultiplicity();
972 //for pp i use fCentPerXXX to select on multiplicity
973 acceptEvent = (fThisCent<fCentPerMin||fThisCent>fCentPerMax)?kFALSE:acceptEvent;
974 acceptEvent = TMath::Abs(tVtxZ-tSPDVtxZ)>0.5?kFALSE:acceptEvent;
975 acceptEvent = TMath::Abs(tVtxZ)>fVertexZcut?kFALSE:acceptEvent;
976 ((TH2D*)((TList*)fList->FindObject("EventsReached"))->FindObject("VTXZ"))->Fill( tVtxZ, tSPDVtxZ );
977 ((TH2D*)((TList*)fList->FindObject("EventsReached"))->FindObject("CCCC"))->Fill( cc1, cc2 );
978 // EndOfCuts
979 if(acceptEvent) {
980 ((TH2D*)((TList*)fList->FindObject("EventsSelected"))->FindObject("VTXZ"))->Fill( tVtxZ, tSPDVtxZ );
981 ((TH2D*)((TList*)fList->FindObject("EventsSelected"))->FindObject("CCCC"))->Fill( cc1, cc2 );
982 }
983 return acceptEvent;
984 */
985 return kFALSE;
986}
987//=======================================================================
988Int_t AliAnalysisTaskFlowStrangee::GetReferenceMultiplicity() { //toberefined
989 AliAODEvent *tAOD = (AliAODEvent *) InputEvent();
990 if(!tAOD) return -1;
991 AliAODTrack *track;
992 Int_t rawN = tAOD->GetNumberOfTracks();
993 Int_t ref=0;
994 for(Int_t id=0; id!=rawN; ++id) {
995 track = dynamic_cast<AliAODTrack*>(tAOD->GetTrack(id));
26429088 996 if(!track) {
997 AliFatal("Not a standard AOD");
998 continue;
999 }
dd965670 1000 if(!track->TestFilterBit(fRFPFilterBit)) continue;
1001 ++ref;
1002 }
1003 return ref;
1004}
1005//=======================================================================
1006Bool_t AliAnalysisTaskFlowStrangee::AcceptPAEvent(AliAODEvent*) {
1007 // PA reading discontinued: TO BE UPDATED
1008 /*
1009 //if(aod->GetHeader()->GetEventNumberESDFile() == 0) return; //rejecting first chunk NOT NEEDED ANYMORE
1010 Int_t bc2 = ((AliVAODHeader*)tAOD->GetHeader())->GetIRInt2ClosestInteractionMap();
1011 if(bc2!=0) return kFALSE;
1012 Int_t bc1 = ((AliVAODHeader*)tAOD->GetHeader())->GetIRInt1ClosestInteractionMap();
1013 if(bc1!=0) return kFALSE;
1014 Short_t isPileup = tAOD->IsPileupFromSPD(5);
1015 if(isPileup!=0) return kFALSE;
1016 if(tAOD->GetHeader()->GetRefMultiplicityComb08()<0) return kFALSE;
1017
1018 const AliAODVertex* spdVtx = tAOD->GetPrimaryVertexSPD();
1019 if(!spdVtx) return kFALSE;
1020 if(spdVtx->GetNContributors()<=0) return kFALSE;
1021
1022 const AliAODVertex* tpcVtx=NULL;
1023 Int_t nVertices = tAOD->GetNumberOfVertices();
1024 for(Int_t iVertices = 0; iVertices < nVertices; iVertices++){
1025 const AliAODVertex* vertex = tAOD->GetVertex(iVertices);
1026 if (vertex->GetType() != AliAODVertex::kMainTPC) continue;
1027 tpcVtx = vertex;
1028 }
1029 if(!tpcVtx) return kFALSE;
1030 if(tpcVtx->GetNContributors()<=0) return kFALSE;
1031 Double_t tTPCVtxZ = tpcVtx->GetZ();
1032 Double_t tSPDVtxZ = spdVtx->GetZ();
1033 if (TMath::Abs(tSPDVtxZ - tTPCVtxZ)>2.0) return kFALSE;
1034 if(plpMV(tAOD)) return kFALSE;
1035
1036 Double_t acceptEvent=kTRUE;
1037 // EventCuts
1038 AliCentrality *cent = tAOD->GetHeader()->GetCentralityP();
1039 Double_t cc1, cc2;
1040 cc1 = cent->GetCentralityPercentile("V0M");
1041 cc2 = cent->GetCentralityPercentile("TRK");
1042 if(fCentMethod.Contains("V0MTRK")) fCentMethod = "V0M";
1043 fThisCent = cent->GetCentralityPercentile( fCentMethod );
1044 acceptEvent = (fThisCent<fCentPerMin||fThisCent>fCentPerMax)?kFALSE:acceptEvent;
1045 acceptEvent = TMath::Abs(tTPCVtxZ)>fVertexZcut?kFALSE:acceptEvent;
1046 // EndOfCuts
1047 ((TH2D*)((TList*)fList->FindObject("EventsReached"))->FindObject("VTXZ"))->Fill( tTPCVtxZ, tSPDVtxZ );
1048 ((TH2D*)((TList*)fList->FindObject("EventsReached"))->FindObject("CCCC"))->Fill( cc1, cc2 );
1049 if(acceptEvent) {
1050 ((TH2D*)((TList*)fList->FindObject("EventsSelected"))->FindObject("VTXZ"))->Fill( tTPCVtxZ, tSPDVtxZ );
1051 ((TH2D*)((TList*)fList->FindObject("EventsSelected"))->FindObject("CCCC"))->Fill( cc1, cc2 );
1052 }
1053 return acceptEvent;
1054 */
1055 return kFALSE;
1056}
1057//=======================================================================
1058void AliAnalysisTaskFlowStrangee::MyUserExec(Option_t *) {
1059 // MAIN ROUTINE
1060 TStopwatch tTime;
1061 tTime.Start();
1062 if(fDebug) {
1063 printf("****************\n");
1064 printf("****************\n");
1065 printf("**::MyUserExec()\n");
1066 }
1067 if(fUseFP) fCandidates->SetLast(-1);
1068 AliESDEvent *tESD=dynamic_cast<AliESDEvent*>(InputEvent());
1069 AliAODEvent *tAOD=dynamic_cast<AliAODEvent*>(InputEvent());
1070 Int_t prevRun = fRunNumber;
1071 //=>check event
1072 Bool_t acceptEvent=kFALSE;
1073 if(fReadESD) {
1074 if(!tESD) {ResetContainers(); Publish(); return;}
1075 acceptEvent = fRunOnpp?kFALSE:fRunOnpA?kFALSE:AcceptAAEvent(tESD);
1076 } else {
1077 if(!tAOD) {ResetContainers(); Publish(); return;}
1078 acceptEvent = fRunOnpp?AcceptPPEvent(tAOD):fRunOnpA?AcceptPAEvent(tAOD):AcceptAAEvent(tAOD);
1079 }
1080 if(prevRun!=fRunNumber) {
1081 MyNotifyRun();
1082 }
1083 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("Events"))->Fill(2);
1084 //=>does the event clear?
1085 if(!acceptEvent) {ResetContainers(); Publish(); return;}
1086 // healthy event incomming
1087
1088 if( !CalibrateEvent() ) { // saves/retrieves/qas VZEROCAL
1089 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("Events"))->Fill(5);
1090 ResetContainers(); Publish(); return; // issue retrieving callibration
1091 }
1092
1093 // loads Q vectors
1094 MakeQVectors();
1095 if(fPsi2<-0.1) {
1096 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("Events"))->Fill(4);
1097 ResetContainers(); Publish(); return;
1098 }
1099 //}
1100 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("Events"))->Fill(3);
1101 //=>great, lets do our stuff!
1102 FillEventSpy("EventsAnalyzed");
1103 FillVZEQA();
1104 //=>load candidates
1105 if(!fSkipSelection) {
1106 if(fReadESD) {
1107 ReadFromESD(tESD);
1108 } else {
1109 if(fSpecie<10) ReadFromAODv0(tAOD);
1110 else ChargeParticles(tAOD);
1111 }
1112 if(fUseFP) AddCandidates();
1113 //=>flow
1114 //=>done
1115 }
1116 tTime.Stop();
1117 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("RealTime"))->Fill( TMath::Log( tTime.RealTime() ) );
1118 Publish();
1119}
1120//=======================================================================
1121void AliAnalysisTaskFlowStrangee::Publish() {
1122 PostData(1,fList);
1123 if(fUseFP) {
1124 PostData(2,fTPCevent);
1125 PostData(3,fVZEevent);
1126 }
1127}
1128//=======================================================================
1129void AliAnalysisTaskFlowStrangee::ReadFromESD(AliESDEvent *tESD) {
1130 AliStack *stack=NULL;
1131 if(fReadMC) {
1132 AliMCEvent *mcevent=NULL;
1133 mcevent = MCEvent();
1134 if(mcevent) stack = mcevent->Stack();
1135 }
1136
1137 Int_t num = tESD->GetNumberOfTracks();
1138 AliESDtrack *myTrack;
1139 Int_t plist[3000], nlist[3000], np=0, nn=0;
1140 Double_t pd0[3000], nd0[3000];
1141 for (Int_t i=0; i!=num; ++i) {
1142 myTrack = (AliESDtrack*) tESD->GetTrack(i);
1143 if(!myTrack) continue;
1144 LoadTrack(myTrack);
1145 FillTrackSpy("ESD_TrkAll");
1146 if(!AcceptDaughter(kFALSE,kTRUE)) continue;
1147 FillTrackSpy("ESD_TrkSel");
1148 ((TH2D*)((TList*)fList->FindObject("ESD_TrkSel"))->FindObject("PtIPXY" ))->Fill( myTrack->Pt(), fDaughterImpactParameterXY );
1149 if( myTrack->Charge()>0 ) {
1150 pd0[np] = fDaughterImpactParameterXY;
1151 plist[np++] = i;
1152 } else {
1153 nd0[nn] = fDaughterImpactParameterXY;
1154 nlist[nn++] = i;
1155 }
1156 }
1157 ((TH1D*)((TList*)fList->FindObject("ESD_TrkSel"))->FindObject("NPAIR" ))->Fill( np,nn );
1158 const AliESDVertex *vtx = tESD->GetPrimaryVertex();
1159 AliESDtrack *pT, *nT;
1160 for(int p=0; p!=np; ++p) {
1161 pT = (AliESDtrack*) tESD->GetTrack( plist[p] );
1162 for(int n=0; n!=nn; ++n) {
1163 nT = (AliESDtrack*) tESD->GetTrack( nlist[n] );
1164 fDecayProductIPXY = pd0[p]*nd0[n];
1165 AliExternalTrackParam pETP(*pT), nETP(*nT);
1166 Double_t xa, xb;
1167 pETP.GetDCA(&nETP,tESD->GetMagneticField(),xa,xb);
1168 fDecayDCAdaughters = pETP.PropagateToDCA(&nETP,tESD->GetMagneticField());
1169 AliESDv0 vertex( nETP,nlist[n], pETP,plist[p] );
1170 fDecayCosinePointingAngleXY = CosThetaPointXY( &vertex, vtx );
1171 fDecayRadXY = DecayLengthXY( &vertex, vtx );
1172 fDecayPt = vertex.Pt();
1173 fDecayPhi = vertex.Phi();
1174 fDecayEta = vertex.Eta();
1175 Double_t pmx, pmy, pmz, nmx, nmy, nmz;
1176 vertex.GetNPxPyPz(nmx,nmy,nmz);
1177 vertex.GetPPxPyPz(pmx,pmy,pmz);
1178 TVector3 mom1(pmx,pmy,pmz), mom2(nmx,nmy,nmz), mom(vertex.Px(),vertex.Py(),vertex.Pz());
1179 Double_t qlpos = mom1.Dot(mom)/mom.Mag();
1180 Double_t qlneg = mom2.Dot(mom)/mom.Mag();
1181 fDecayQt = mom1.Perp(mom);
1182 fDecayAlpha = (qlpos-qlneg)/(qlpos+qlneg);
1183 Double_t mpi = 0.13957018;
1184 if(fSpecie==0) {
1185 Double_t eppi = TMath::Sqrt( mpi*mpi + pmx*pmx + pmy*pmy + pmz*pmz );
1186 Double_t enpi = TMath::Sqrt( mpi*mpi + nmx*nmx + nmy*nmy + nmz*nmz );
1187 fDecayMass = TMath::Sqrt( mpi*mpi + mpi*mpi + 2*(eppi*enpi - pmx*nmx - pmy*nmy - pmz*nmz ) );
1188 fDecayRapidity = vertex.RapK0Short();
1189 } else {
1190 Double_t mpr = 0.938272013;
1191 Double_t epi, epr;
1192 if(fDecayAlpha>0) {
1193 epr = TMath::Sqrt( mpr*mpr + pmx*pmx + pmy*pmy + pmz*pmz );
1194 epi = TMath::Sqrt( mpi*mpi + nmx*nmx + nmy*nmy + nmz*nmz );
1195 } else {
1196 epi = TMath::Sqrt( mpi*mpi + pmx*pmx + pmy*pmy + pmz*pmz );
1197 epr = TMath::Sqrt( mpr*mpr + nmx*nmx + nmy*nmy + nmz*nmz );
1198 }
1199 fDecayMass = TMath::Sqrt( mpi*mpi + mpr*mpr + 2*(epi*epr - pmx*nmx - pmy*nmy - pmz*nmz ) );
1200 fDecayRapidity = vertex.RapLambda();
1201 }
1202 Double_t energy = TMath::Sqrt( fDecayMass*fDecayMass + vertex.Px()*vertex.Px() + vertex.Py()*vertex.Py() + vertex.Pz()*vertex.Pz() );
1203 Double_t gamma = energy/fDecayMass;
1204 fDecayDecayLength = DecayLength( &vertex, vtx )/gamma;
1205 fDecayDecayLengthLab = DecayLength( &vertex, vtx );
1206 Double_t dPHI = fDecayPhi;
1207 Double_t dDPHI = dPHI - fPsi2;
1208 if( dDPHI < 0 ) dDPHI += TMath::TwoPi();
1209 if( dDPHI > TMath::Pi() ) dDPHI = TMath::TwoPi()-dDPHI;
1210 if(fQAlevel>1) {
1211 if( (dDPHI>TMath::PiOver4()) && (dDPHI<3*TMath::PiOver4()) ) FillCandidateSpy("V0SAllOP");
1212 else FillCandidateSpy("V0SAllIP");
1213 }
1214 FillCandidateSpy("V0SAll");
1215 ((TH2D*)((TList*)fList->FindObject("V0SAll"))->FindObject("D0PD0N"))->Fill( pd0[p],nd0[n] );
1216 ((TH2D*)((TList*)fList->FindObject("V0SAll"))->FindObject("XPOSXNEG"))->Fill( xa, xb );
1217 if(!AcceptCandidate()) continue;
1218 if(fDecayMass<fMinMass) continue;
1219 if(fDecayMass>fMaxMass) continue;
1220 // PID missing
1221 if(fQAlevel>1) {
1222 if( (dDPHI>TMath::PiOver4()) && (dDPHI<3*TMath::PiOver4()) ) FillCandidateSpy("V0SSelOP");
1223 else FillCandidateSpy("V0SSelIP");
1224 }
1225 FillCandidateSpy("V0SSel");
1226 ((TH2D*)((TList*)fList->FindObject("V0SSel"))->FindObject("D0PD0N"))->Fill( pd0[p],nd0[n] );
1227 ((TH2D*)((TList*)fList->FindObject("V0SSel"))->FindObject("XPOSXNEG"))->Fill( xa, xb );
1228
1229 fDecayIDneg = nT->GetID();
1230 fDecayIDpos = pT->GetID();
1231 if(fUseFP) MakeTrack();
1232 LoadTrack(pT); FillTrackSpy("SelDau");
1233 LoadTrack(nT); FillTrackSpy("SelDau");
1234
1235 //===== BEGIN OF MCMATCH
1236 if(stack) {
1237 bool matched = false;
1238 Int_t labelpos = pT->GetLabel();
1239 Int_t labelneg = nT->GetLabel();
1240 Double_t rOri=-1;
1241 if( labelpos>0 && labelneg>0 ) {
1242 TParticle *mcpos = stack->Particle( labelpos );
1243 TParticle *mcneg = stack->Particle( labelneg );
1244 Int_t pdgRecPos = mcpos->GetPdgCode();
1245 Int_t pdgRecNeg = mcneg->GetPdgCode();
1246 if( pdgRecPos==211&&pdgRecNeg==-211 ) if(mcpos->GetMother(0)>0) {
1247 if( mcpos->GetMother(0)==mcneg->GetMother(0) ) {
1248 TParticle *mcmot = stack->Particle( mcpos->GetMother(0) );
1249 rOri = TMath::Sqrt( mcmot->Vx()*mcmot->Vx() + mcmot->Vy()*mcmot->Vy() );
1250 if( TMath::Abs(mcmot->GetPdgCode())==310) {
1251 if(mcmot->GetNDaughters()==2) matched=true;
1252 }
1253 }
1254 }
1255 }
1256 if(matched) {
1257 FillCandidateSpy("Mth");
1258 ((TH2D*)((TList*)fList->FindObject("Mth"))->FindObject("D0PD0N"))->Fill( pd0[p],nd0[n] );
1259 ((TH2D*)((TList*)fList->FindObject("Mth"))->FindObject("XPOSXNEG"))->Fill( xa, xb );
1260 ((TH1D*)((TList*)fList->FindObject("Mth"))->FindObject("MCOrigin"))->Fill( rOri );
1261 LoadTrack(pT); FillTrackSpy("MthDau");
1262 LoadTrack(nT); FillTrackSpy("MthDau");
1263 }
1264 }
1265 //===== END OF MCMATCH
1266 }
1267 }
1268}
1269//=======================================================================
1270void AliAnalysisTaskFlowStrangee::ReadStack(TClonesArray* mcArray) {
1271 if(!mcArray) return;
1272 AliAODMCParticle *myMCTrack;//, *iMCDau, *jMCDau;
1273 for(int i=0; i!=mcArray->GetEntriesFast(); ++i) {
1274 myMCTrack = dynamic_cast<AliAODMCParticle*>(mcArray->At( i ));
1275 if(!myMCTrack) continue;
1276 /*
1277 int tPDG=310;
1278 if(fSpecie>0) tPDG = 3122;
1279 if( TMath::Abs(myMCTrack->PdgCode())==tPDG )
1280 if( myMCTrack->GetNDaughters() == 2 ) {
1281 Int_t iDau = myMCTrack->GetDaughter(0);
1282 Int_t jDau = myMCTrack->GetDaughter(1);
1283 AliAODMCParticle *posDau=NULL;
1284 AliAODMCParticle *negDau=NULL;
1285 if(iDau>0&&jDau>0) {
1286 iMCDau = dynamic_cast<AliAODMCParticle*>(mcArray->At( iDau ));
1287 jMCDau = dynamic_cast<AliAODMCParticle*>(mcArray->At( jDau ));
1288 if(iMCDau) {
1289 if(iMCDau->Charge()>0) posDau=iMCDau;
1290 else negDau=iMCDau;
1291 }
1292 if(jMCDau) {
1293 if(jMCDau->Charge()>0) posDau=jMCDau;
1294 else negDau=jMCDau;
1295 }
1296 } //got two daughters
1297 if(posDau&&negDau) {
1298 Double_t dx = myMCTrack->Xv() - posDau->Xv();
1299 Double_t dy = myMCTrack->Yv() - posDau->Yv();
1300 Double_t dz = myMCTrack->Zv() - posDau->Zv();
1301 fDecayRadXY = TMath::Sqrt( dx*dx + dy*dy );
1302 TVector3 momPos(posDau->Px(),posDau->Py(),posDau->Pz());
1303 TVector3 momNeg(negDau->Px(),negDau->Py(),negDau->Pz());
1304 TVector3 momTot(myMCTrack->Px(),myMCTrack->Py(),myMCTrack->Pz());
1305 Double_t qlpos = momPos.Dot(momTot)/momTot.Mag();
1306 Double_t qlneg = momNeg.Dot(momTot)/momTot.Mag();
1307 fDecayQt = momPos.Perp(momTot);
1308 fDecayAlpha = 1.-2./(1.+qlpos/qlneg);
1309 fDecayMass = myMCTrack->GetCalcMass();
1310 Double_t energy = myMCTrack->E();
1311 Double_t gamma = energy/fDecayMass;
1312 fDecayDecayLength = TMath::Sqrt(dx*dx+dy*dy+dz*dz)/gamma;
1313 fDecayPt = myMCTrack->Pt();
1314 fDecayPhi = myMCTrack->Phi();
1315 fDecayEta = myMCTrack->Eta();
1316 fDecayRapidity = myMCTrack->Y();
1317 fDecayDCAdaughters = 0;
1318 fDecayCosinePointingAngleXY = 1;
1319 fDecayProductIPXY = -1;
1320 if(AcceptCandidate()) FillCandidateSpy("GenTru");
1321 }
1322 } // k0/lda with two daughters
1323 */
1324 //==== BEGIN TRACK CUTS
1325 if(myMCTrack->Eta()<-0.8) continue;
1326 if(myMCTrack->Eta()>+0.8) continue;
1327 if(myMCTrack->Y()<-0.5) continue;
1328 if(myMCTrack->Y()>+0.5) continue;
1329 //==== END TRACK CUTS
1330 switch( TMath::Abs(myMCTrack->PdgCode()) ) {
1331 case (211): //pi
1332 FillMCParticleSpy( "MCTPion", myMCTrack );
1333 if( myMCTrack->IsPrimary() )
1334 FillMCParticleSpy( "MCTPionGenAcc", myMCTrack );
1335 break;
1336 case (321): //kaon
1337 FillMCParticleSpy( "MCTKaon", myMCTrack );
1338 if( myMCTrack->IsPrimary() )
1339 FillMCParticleSpy( "MCTKaonGenAcc", myMCTrack );
1340 break;
1341 case (310): //k0s
1342 FillMCParticleSpy( "MCTK0s", myMCTrack );
1343 if( myMCTrack->IsPrimary() )
1344 FillMCParticleSpy( "MCTK0sGenAcc", myMCTrack );
1345 break;
1346 case (2212): //proton
1347 FillMCParticleSpy( "MCTProton", myMCTrack );
1348 if( myMCTrack->IsPrimary() )
1349 FillMCParticleSpy( "MCTProtonGenAcc", myMCTrack );
1350 break;
1351 case (3122): //lda
1352 FillMCParticleSpy( "MCTLda", myMCTrack );
1353 if( myMCTrack->IsPrimary() )
1354 FillMCParticleSpy( "MCTLdaGenAcc", myMCTrack );
1355 break;
1356 case (333): //phi
1357 if( myMCTrack->IsPrimary() )
1358 FillMCParticleSpy( "MCTPhiGenAcc", myMCTrack );
1359 break;
1360 case (3312): //xi
1361 if( myMCTrack->IsPrimary() )
1362 FillMCParticleSpy( "MCTXiGenAcc", myMCTrack );
1363 break;
1364 case (3334): //omega
1365 if( myMCTrack->IsPrimary() )
1366 FillMCParticleSpy( "MCTOmegaGenAcc", myMCTrack );
1367 break;
1368 }
1369 }
1370}
1371//=======================================================================
1372Double_t AliAnalysisTaskFlowStrangee::CosThetaPointXY(AliESDv0 *me, const AliVVertex *vtx) {
1373 TVector3 mom( me->Px(), me->Py(), 0 );
1374 TVector3 fli( me->Xv()-vtx->GetX(), me->Yv()-vtx->GetY(), 0 );
1375 Double_t ctp = mom.Dot(fli) / mom.Mag() / fli.Mag();
1376 return ctp;
1377}
1378//=======================================================================
1379Double_t AliAnalysisTaskFlowStrangee::CosThetaPointXY(AliAODv0 *me, const AliVVertex *vtx) {
1380 TVector3 mom( me->Px(), me->Py(), 0 );
1381 TVector3 fli( me->Xv()-vtx->GetX(), me->Yv()-vtx->GetY(), 0 );
1382 Double_t ctp = mom.Dot(fli) / mom.Mag() / fli.Mag();
1383 return ctp;
1384}
1385//=======================================================================
1386Double_t AliAnalysisTaskFlowStrangee::DecayLengthXY(AliESDv0 *me, const AliVVertex *vtx) {
1387 Double_t dx = me->Xv()-vtx->GetX();
1388 Double_t dy = me->Yv()-vtx->GetY();
1389 Double_t dxy = TMath::Sqrt( dx*dx + dy*dy );
1390 return dxy;
1391}
1392//=======================================================================
1393Double_t AliAnalysisTaskFlowStrangee::DecayLengthXY(AliAODv0 *me, const AliVVertex *vtx) {
1394 Double_t dx = me->Xv()-vtx->GetX();
1395 Double_t dy = me->Yv()-vtx->GetY();
1396 Double_t dxy = TMath::Sqrt( dx*dx + dy*dy );
1397 return dxy;
1398}
1399//=======================================================================
1400Double_t AliAnalysisTaskFlowStrangee::DecayLength(AliESDv0 *me, const AliVVertex *vtx) {
1401 Double_t dx = me->Xv()-vtx->GetX();
1402 Double_t dy = me->Yv()-vtx->GetY();
1403 Double_t dz = me->Zv()-vtx->GetZ();
1404 Double_t dxy = TMath::Sqrt( dx*dx + dy*dy + dz*dz );
1405 return dxy;
1406}
1407//=======================================================================
1408Double_t AliAnalysisTaskFlowStrangee::DecayLength(AliAODv0 *me, const AliVVertex *vtx) {
1409 Double_t dx = me->Xv()-vtx->GetX();
1410 Double_t dy = me->Yv()-vtx->GetY();
1411 Double_t dz = me->Zv()-vtx->GetZ();
1412 Double_t dxy = TMath::Sqrt( dx*dx + dy*dy + dz*dz );
1413 return dxy;
1414}
1415//=======================================================================
1416void AliAnalysisTaskFlowStrangee::ReadFromAODv0(AliAODEvent *tAOD) {
1417 TClonesArray* mcArray=NULL;
1418 if(fReadMC) {
1419 mcArray = dynamic_cast<TClonesArray*>(tAOD->FindListObject(AliAODMCParticle::StdBranchName()));
1420 ReadStack(mcArray);
1421 }
1422
1423 Int_t nV0s = tAOD->GetNumberOfV0s();
1424 AliAODv0 *myV0;
1425 Int_t v0all=0, v0imw=0;
1426 for (Int_t i=0; i!=nV0s; ++i) {
1427 myV0 = (AliAODv0*) tAOD->GetV0(i);
1428 if(!myV0) continue;
1429 if(!fOnline) if(myV0->GetOnFlyStatus() ) continue;
1430 if(fOnline) if(!myV0->GetOnFlyStatus() ) continue;
1431
1432 fDecayPt = myV0->Pt();
1433 fDecayPhi = myV0->Phi();
1434 fDecayEta = myV0->Eta();
1435
1436 AliAODTrack *iT, *jT;
1437 AliAODVertex *vtx = tAOD->GetPrimaryVertex();
1438 Double_t pos[3],cov[6];
1439 vtx->GetXYZ(pos);
1440 vtx->GetCovarianceMatrix(cov);
1441 const AliESDVertex vESD(pos,cov,100.,100);
1442 // TESTING CHARGE
1443 int iPos, iNeg;
1444 iT=(AliAODTrack*) myV0->GetDaughter(0);
1445 if(iT->Charge()>0) {
1446 iPos = 0; iNeg = 1;
1447 } else {
1448 iPos = 1; iNeg = 0;
1449 }
1450 // END OF TEST
1451
1452 iT=(AliAODTrack*) myV0->GetDaughter(iPos); // positive
1453 AliESDtrack ieT( iT );
1454 ieT.SetTPCClusterMap( iT->GetTPCClusterMap() );
1455 ieT.SetTPCSharedMap( iT->GetTPCSharedMap() );
1456 ieT.SetTPCPointsF( iT->GetTPCNclsF() );
1457 ieT.PropagateToDCA(&vESD, tAOD->GetMagneticField(), 100);
1458 LoadTrack(&ieT,iT->Chi2perNDF());
1459 Float_t ip[2];
1460 ieT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
1461 fDaughterImpactParameterXY = ip[0];
1462 fDaughterImpactParameterZ = ip[1];
1463 fDecayIPpos = fDaughterImpactParameterXY; //ieT.GetD(pos[0], pos[1], tAOD->GetMagneticField());
1464 FillTrackSpy("AllDau");
1465 if(!AcceptDaughter(fDecayPt<2.0?kTRUE:kFALSE)) continue;
1466
1467 jT=(AliAODTrack*) myV0->GetDaughter(iNeg); // negative
1468 AliESDtrack jeT( jT );
1469 jeT.SetTPCClusterMap( jT->GetTPCClusterMap() );
1470 jeT.SetTPCSharedMap( jT->GetTPCSharedMap() );
1471 jeT.SetTPCPointsF( jT->GetTPCNclsF() );
1472 jeT.PropagateToDCA(&vESD, tAOD->GetMagneticField(), 100);
1473 LoadTrack(&jeT,jT->Chi2perNDF());
1474 jeT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
1475 fDaughterImpactParameterXY = ip[0];
1476 fDaughterImpactParameterZ = ip[1];
1477 fDecayIPneg = fDaughterImpactParameterXY; //jeT.GetD(pos[0], pos[1], tAOD->GetMagneticField());
1478 FillTrackSpy("AllDau");
1479 if(!AcceptDaughter(fDecayPt<2.0?kTRUE:kFALSE)) continue;
1480
1481 if( fExcludeTPCEdges ) {
1482 if( IsAtTPCEdge(iT->Phi(),iT->Pt(),+1,tAOD->GetMagneticField()) ) continue;
1483 if( IsAtTPCEdge(jT->Phi(),jT->Pt(),-1,tAOD->GetMagneticField()) ) continue;
1484 }
1485 ieT.GetDCA(&jeT,tAOD->GetMagneticField(),fDecayXpos,fDecayXneg);
1486 /*
1487 // cutting out population close to TPC edges :: strange excess saw in 2010
1488 if( fExcludeTPCEdges ) {
1489 Double_t phimod = myV0->Phi();
1490 int sectors[6] = {5,6,9,10,11,12};
1491 for(int ii=0; ii!=6; ++ii)
1492 if( (phimod<(sectors[ii]+1)*TMath::Pi()/9.0) && (phimod>sectors[ii]*TMath::Pi()/9.0) )
1493 return 0;
1494 }
1495 */
1496 if(fSpecie==0)
1497 fDecayRapidity = myV0->RapK0Short();
1498 else
1499 fDecayRapidity = myV0->RapLambda();
1500 fDecayDCAdaughters = myV0->DcaV0Daughters();
1501 fDecayCosinePointingAngleXY = CosThetaPointXY( myV0, vtx );
1502 fDecayRadXY = DecayLengthXY( myV0, vtx );
1503 fDecayProductIPXY = fDecayIPpos*fDecayIPneg;
1504 fDecayQt = myV0->PtArmV0();
1505 fDecayAlpha = myV0->AlphaV0(); // AlphaV0 -> AODRecoDecat::Alpha -> return 1.-2./(1.+QlProng(0)/QlProng(1));
1506 if(myV0->ChargeProng(iPos)<0) fDecayAlpha = -fDecayAlpha; // protects for a change in convention
1507 fDecayPt = myV0->Pt();
1508 fDecayEta = myV0->Eta();
1509 if( fSpecie==0 ) {
1510 fDecayMass = myV0->MassK0Short();
1511 } else {
1512 if(fDecayAlpha>0) fDecayMass = myV0->MassLambda();
1513 else fDecayMass = myV0->MassAntiLambda();
1514 }
1515 v0all++;
1516 if(fDecayMass<fMinMass) continue;
1517 if(fDecayMass>fMaxMass) continue;
1518 v0imw++;
1519 Double_t energy = TMath::Sqrt( fDecayMass*fDecayMass + myV0->Px()*myV0->Px() + myV0->Py()*myV0->Py() + myV0->Pz()*myV0->Pz() );
1520 Double_t gamma = energy/fDecayMass;
1521 fDecayDecayLength = DecayLength( myV0, vtx )/gamma;
1522 fDecayDecayLengthLab = DecayLength( myV0, vtx );
1523 Double_t dPHI = fDecayPhi;
1524 Double_t dDPHI = dPHI - fPsi2;
1525 if( dDPHI < 0 ) dDPHI += TMath::TwoPi();
1526 if( dDPHI > TMath::Pi() ) dDPHI = TMath::TwoPi()-dDPHI;
1527 if(fQAlevel>1) {
1528 if( (dDPHI>TMath::PiOver4()) && (dDPHI<3*TMath::PiOver4()) ) FillCandidateSpy("V0SAllOP");
1529 else FillCandidateSpy("V0SAllIP");
1530 }
1531 FillCandidateSpy("V0SAll");
1532 if(!fSkipVn)
1533 FillDecayVn("V0SAllVn",fDecayMass,fDecayPt,fDecayPhi,fDecayEta,fDecayIDpos,fDecayIDneg);
1534
1535 if(!AcceptCandidate()) continue;
1536
1537 if(fDecayPt<fDecayStopPIDAtPt) {
1538 if( fSpecie==0 ) {//PID for kzero::pion+pion
1539 if( !PassesPIDCuts(&ieT,AliPID::kPion) ) continue; //positive track
1540 if( !PassesPIDCuts(&jeT,AliPID::kPion) ) continue; //negative track
1541 } else { //PID for lambda::proton+pion
1542 if(fDecayAlpha>0) {
1543 if( !PassesPIDCuts(&ieT,AliPID::kProton) ) continue; //positive track
1544 if( !PassesPIDCuts(&jeT,AliPID::kPion) ) continue; //negative track
1545 } else {
1546 if( !PassesPIDCuts(&jeT,AliPID::kProton) ) continue; //negative track
1547 if( !PassesPIDCuts(&ieT,AliPID::kPion) ) continue; //positive track
1548 }
1549 }
1550 }
1551 if(fQAlevel>1) {
1552 if( (dDPHI>TMath::PiOver4()) && (dDPHI<3*TMath::PiOver4()) ) FillCandidateSpy("V0SSelOP");
1553 else FillCandidateSpy("V0SSelIP");
1554 }
1555 FillCandidateSpy("V0SSel");
1556 if(!fSkipVn)
1557 FillDecayVn("V0SSelVn",fDecayMass,fDecayPt,fDecayPhi,fDecayEta,fDecayIDpos,fDecayIDneg);
1558 // ============================
1559 // Posting for FlowAnalysis
1560 if(!fPostMatched) {
1561 fDecayIDneg = iT->GetID();
1562 fDecayIDpos = jT->GetID();
1563 if(fUseFP) MakeTrack();
1564 }
1565 // ============================
1566 LoadTrack(&ieT,iT->Chi2perNDF());
1567 ieT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
1568 fDaughterImpactParameterXY = ip[0];
1569 fDaughterImpactParameterZ = ip[1];
1570 FillTrackSpy("SelDau");
1571 LoadTrack(&jeT,jT->Chi2perNDF());
1572 jeT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
1573 fDaughterImpactParameterXY = ip[0];
1574 fDaughterImpactParameterZ = ip[1];
1575 FillTrackSpy("SelDau");
1576 //===== BEGIN OF MCMATCH
1577 if(fReadMC) ((TH1D*)((TList*)fList->FindObject("STATMC"))->FindObject("Events"))->Fill( 1 ); // Selected event
1578 if(mcArray) {
1579 ((TH1D*)((TList*)fList->FindObject("STATMC"))->FindObject("Events"))->Fill( 2 ); // Stack found
1580 bool matched = false;
1581 bool feeddown = false;
1582 Int_t labelpos = iT->GetLabel();
1583 Int_t labelneg = jT->GetLabel();
1584 AliAODMCParticle *mcpos = (AliAODMCParticle*) mcArray->At( TMath::Abs(labelpos) );
1585 AliAODMCParticle *mcneg = (AliAODMCParticle*) mcArray->At( TMath::Abs(labelneg) );
1586 if( mcpos && mcneg ) {
1587 ((TH1D*)((TList*)fList->FindObject("STATMC"))->FindObject("Events"))->Fill( 3 ); // Daughters in stack
1588 Int_t pdgRecPos = mcpos->GetPdgCode();
1589 Int_t pdgRecNeg = mcneg->GetPdgCode();
1590 int pospdg=211, negpdg=211;
1591 int mompdg=310, fdwpdg=333;
1592 if(fSpecie>0) {
1593 mompdg=3122;
1594 fdwpdg=3312;
1595 if(fDecayAlpha>0) {
1596 pospdg=2212; negpdg=211;
1597 } else {
1598 negpdg=2212; pospdg=211;
1599 }
1600 }
1601 if( TMath::Abs(pdgRecPos)==pospdg&&TMath::Abs(pdgRecNeg)==negpdg )
1602 if(mcpos->GetMother()>-1)
1603 if( mcpos->GetMother()==mcneg->GetMother() ) {
1604 AliAODMCParticle *mcmot = (AliAODMCParticle*) mcArray->At( mcpos->GetMother() );
1605 fDecayMatchOrigin = TMath::Sqrt( mcmot->Xv()*mcmot->Xv() + mcmot->Yv()*mcmot->Yv() );
1606 fDecayMatchPt = mcmot->Pt();
1607 fDecayMatchEta = mcmot->Eta();
1608 fDecayMatchPhi = mcmot->Phi();
1609 if( TMath::Abs(mcmot->GetPdgCode())==mompdg) {
1610 if(mcmot->GetNDaughters()==2) {
1611 ((TH1D*)((TList*)fList->FindObject("STATMC"))->FindObject("Events"))->Fill( 4 ); // Correspond to decay
1612 matched=true;
1613 Double_t dx = mcmot->Xv() - mcpos->Xv();
1614 Double_t dy = mcmot->Yv() - mcpos->Yv();
1615 fDecayMatchRadXY = TMath::Sqrt( dx*dx + dy*dy );
1616 }
1617 if(mcmot->GetMother()>-1) {
1618 ((TH1D*)((TList*)fList->FindObject("STATMC"))->FindObject("Events"))->Fill( 5 ); // Decay has mother
1619 AliAODMCParticle *mcfdw = (AliAODMCParticle*) mcArray->At( mcmot->GetMother() );
1620 if( TMath::Abs(mcfdw->GetPdgCode())==fdwpdg)
1621 feeddown=true;
1622 } // k0/lda have mother
1623 } // mother matches k0/lda
1624 } // both have same mother
1625 }
1626 if(matched) {
1627 FillCandidateSpy("Mth",true);
1628 if(!fSkipVn)
1629 FillDecayVn("V0SMthVn",fDecayMass,fDecayPt,fDecayPhi,fDecayEta,fDecayIDpos,fDecayIDneg);
1630 if(fPostMatched>0) {
1631 fDecayIDneg = iT->GetID();
1632 fDecayIDpos = jT->GetID();
1633 if(fUseFP) MakeTrack();
1634 }
1635 if(labelpos<0&&labelneg<0) {
1636 FillCandidateSpy("MthNegNeg",true);
1637 if(!fSkipVn)
1638 FillDecayVn("V0SMthNegNegVn",fDecayMass,fDecayPt,fDecayPhi,fDecayEta,fDecayIDpos,fDecayIDneg);
1639 } else if(labelpos>0&&labelneg>0) {
1640 if(!fSkipVn)
1641 FillDecayVn("V0SMthPosPosVn",fDecayMass,fDecayPt,fDecayPhi,fDecayEta,fDecayIDpos,fDecayIDneg);
1642 } else if(labelpos*labelneg<0) {
1643 FillCandidateSpy("MthPosNeg",true);
1644 if(!fSkipVn)
1645 FillDecayVn("V0SMthPosNegVn",fDecayMass,fDecayPt,fDecayPhi,fDecayEta,fDecayIDpos,fDecayIDneg);
1646 }
1647 AliAODVertex *secvtx = myV0->GetSecondaryVtx();
1648 Double_t possec[3],covsec[6];
1649 secvtx->GetXYZ(possec);
1650 secvtx->GetCovarianceMatrix(covsec);
1651 const AliESDVertex vSecVtx(possec,covsec,100.,100);
1652 AliESDtrack trackAtSecI( iT );
1653 trackAtSecI.SetTPCClusterMap( iT->GetTPCClusterMap() );
1654 trackAtSecI.SetTPCSharedMap( iT->GetTPCSharedMap() );
1655 trackAtSecI.SetTPCPointsF( iT->GetTPCNclsF() );
1656 trackAtSecI.PropagateToDCA(&vSecVtx, tAOD->GetMagneticField(), 100);
1657 fDaughterAtSecPhi = trackAtSecI.Phi();
1658 fDaughterAtSecEta = trackAtSecI.Eta();
1659 fDaughterAtSecPt = trackAtSecI.Pt();
1660 LoadTrack(&ieT,iT->Chi2perNDF());
1661 fDaughterMatchPhi=mcpos->Phi();
1662 fDaughterMatchEta=mcpos->Eta();
1663 fDaughterMatchPt=mcpos->Pt();
1664 ieT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
1665 fDaughterImpactParameterXY = ip[0];
1666 fDaughterImpactParameterZ = ip[1];
1667 FillTrackSpy("MthDau",true);
1668 if(labelpos<0||labelneg<0) FillTrackSpy("MthNegDau",true);
1669 else FillTrackSpy("MthPosDau",true);
1670 AliESDtrack trackAtSecJ( jT );
1671 trackAtSecJ.SetTPCClusterMap( jT->GetTPCClusterMap() );
1672 trackAtSecJ.SetTPCSharedMap( jT->GetTPCSharedMap() );
1673 trackAtSecJ.SetTPCPointsF( jT->GetTPCNclsF() );
1674 trackAtSecJ.PropagateToDCA(&vSecVtx, tAOD->GetMagneticField(), 100);
1675 fDaughterAtSecPhi = trackAtSecJ.Phi();
1676 fDaughterAtSecEta = trackAtSecJ.Eta();
1677 fDaughterAtSecPt = trackAtSecJ.Pt();
1678 LoadTrack(&jeT,jT->Chi2perNDF());
1679 fDaughterMatchPhi=mcneg->Phi();
1680 fDaughterMatchEta=mcneg->Eta();
1681 fDaughterMatchPt=mcneg->Pt();
1682 jeT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
1683 fDaughterImpactParameterXY = ip[0];
1684 fDaughterImpactParameterZ = ip[1];
1685 FillTrackSpy("MthDau",true);
1686 if(labelpos<0||labelneg<0) FillTrackSpy("MthNegDau",true);
1687 else FillTrackSpy("MthPosDau",true);
1688 } else {
1689 FillCandidateSpy("UnMth",false);
1690 if(!fSkipVn)
1691 FillDecayVn("V0SUnMthVn",fDecayMass,fDecayPt,fDecayPhi,fDecayEta,fDecayIDpos,fDecayIDneg);
1692 if(fPostMatched<0) {
1693 fDecayIDneg = iT->GetID();
1694 fDecayIDpos = jT->GetID();
1695 if(fUseFP) MakeTrack();
1696 }
1697 LoadTrack(&ieT,iT->Chi2perNDF());
1698 ieT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
1699 fDaughterImpactParameterXY = ip[0];
1700 fDaughterImpactParameterZ = ip[1];
1701 FillTrackSpy("UnMthDau",false);
1702 LoadTrack(&jeT,jT->Chi2perNDF());
1703 jeT.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
1704 fDaughterImpactParameterXY = ip[0];
1705 fDaughterImpactParameterZ = ip[1];
1706 FillTrackSpy("UnMthDau",false);
1707 }
1708 if(feeddown) {
1709 FillCandidateSpy("MthFeedDown",true);
1710 }
1711 }
1712 //===== END OF MCMATCH
1713 }
1714 ((TH2D*)((TList*)fList->FindObject("V0SAll"))->FindObject("V0SADC"))->Fill( v0all,v0imw );
1715 if(!fSkipVn) {
1716 QCStoreDecayVn("V0SAllVn");
1717 QCStoreDecayVn("V0SSelVn");
1718 if(fReadMC) {
1719 QCStoreDecayVn("V0SMthVn");
1720 QCStoreDecayVn("V0SMthNegNegVn");
1721 QCStoreDecayVn("V0SMthPosPosVn");
1722 QCStoreDecayVn("V0SMthPosNegVn");
1723 }
1724 }
1725 return;
1726}
1727//=======================================================================
1728Bool_t AliAnalysisTaskFlowStrangee::PassesPIDCuts(AliESDtrack *myTrack, AliPID::EParticleType pid) {
1729 Bool_t pass=kTRUE;
1730 if(fPIDResponse) {
1731 fDaughterNSigmaPID = fPIDResponse->NumberOfSigmasTPC(myTrack,pid);
1732 if( TMath::Abs(fDaughterNSigmaPID) > fDaughterMaxNSigmaPID )
1733 pass = kFALSE;
1734 }
1735 return pass;
1736}
1737//=======================================================================
1738void AliAnalysisTaskFlowStrangee::ChargeParticles(AliAODEvent *tAOD) {
1739 //benchmark purposes
1740 if(!tAOD) return;
1741 TClonesArray* mcArray=NULL;
1742 if(fReadMC) {
1743 mcArray = dynamic_cast<TClonesArray*>(tAOD->FindListObject(AliAODMCParticle::StdBranchName()));
1744 ReadStack(mcArray);
1745 }
1746 for(int i=0; i!=tAOD->GetNumberOfTracks(); ++i) {
1747 AliAODTrack *t = dynamic_cast<AliAODTrack*>(tAOD->GetTrack( i ));
1748 if(!t) continue;
1749 if( !t->TestFilterBit(1) ) continue;
1750 fDecayMass=0.0; // using mass as nsigmas control plot
1751 if(fPIDResponse) { // PID
1752 switch(fSpecie) { // TPC PID only
1753 case(kPION):
1754 fDecayMass = fPIDResponse->NumberOfSigmasTPC(t,AliPID::kPion);
1755 break;
1756 case(kKAON):
1757 fDecayMass = fPIDResponse->NumberOfSigmasTPC(t,AliPID::kKaon);
1758 break;
1759 case(kPROTON):
1760 fDecayMass = fPIDResponse->NumberOfSigmasTPC(t,AliPID::kProton);
1761 break;
1762 }
1763 }
1764 Bool_t pass = kTRUE;
1765 if( TMath::Abs(fDecayMass) > 3.0 ) pass=kFALSE;
1766 if( t->Eta()<-0.5 || t->Eta()>+0.5 ) pass=kFALSE;
1767 if( t->Pt()<0.2 || t->Pt()>20.0 ) pass=kFALSE;
1768 AliESDtrack et( t );
1769 et.SetTPCClusterMap( t->GetTPCClusterMap() );
1770 et.SetTPCSharedMap( t->GetTPCSharedMap() );
1771 et.SetTPCPointsF( t->GetTPCNclsF() );
1772 Float_t ip[2];
1773 LoadTrack(&et,t->Chi2perNDF());
1774 AliAODVertex *vtx = tAOD->GetPrimaryVertex();
1775 Double_t pos[3];
1776 vtx->GetXYZ(pos);
1777 et.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
1778 fDaughterImpactParameterXY = ip[0];
1779 fDaughterImpactParameterZ = ip[1];
1780
1781 FillTrackSpy("TrkAll");
1782 if(!fSkipVn)
1783 FillTrackVn("TrkAllVn",t->Pt(),t->Phi(),t->Eta(),t->GetID());
1784 if(!pass) continue;
1785 FillTrackSpy("TrkSel");
1786 if(!fSkipVn)
1787 FillTrackVn("TrkSelVn",t->Pt(),t->Phi(),t->Eta(),t->GetID());
1788 if(fReadMC) {
1789 ((TH1D*)((TList*)fList->FindObject("STATMC"))->FindObject("Events"))->Fill( 1 ); // Selected event
1790 if(mcArray) {
1791 ((TH1D*)((TList*)fList->FindObject("STATMC"))->FindObject("Events"))->Fill( 2 ); // Stack found
1792 bool matched = false;
1793 Int_t label = t->GetLabel();
1794 AliAODMCParticle *mcpar = (AliAODMCParticle*) mcArray->At( TMath::Abs(label) );
1795 if( mcpar ) {
1796 ((TH1D*)((TList*)fList->FindObject("STATMC"))->FindObject("Events"))->Fill( 3 ); // Particle in stack
1797 Int_t pdgmcpar = TMath::Abs(mcpar->GetPdgCode());
1798 switch(fSpecie) {
1799 case(kPION):
1800 if(pdgmcpar==211) matched = true;
1801 break;
1802 case(kKAON):
1803 if(pdgmcpar==211) matched = true;
1804 break;
1805 case(kPROTON):
1806 if(pdgmcpar==2212) matched = true;
1807 break;
1808 }
1809 if(!mcpar->IsPrimary()) matched = false;
1810 }
1811 if(matched) {
1812 FillTrackSpy("Mth");
1813 if(!fSkipVn)
1814 FillTrackVn("MthVn",t->Pt(),t->Phi(),t->Eta(),t->GetID());
1815 if(label<0) {
1816 FillTrackSpy("MthNeg");
1817 if(!fSkipVn)
1818 FillTrackVn("MthNegVn",t->Pt(),t->Phi(),t->Eta(),t->GetID());
1819 } else {
1820 FillTrackSpy("MthPos");
1821 if(!fSkipVn)
1822 FillTrackVn("MthPosVn",t->Pt(),t->Phi(),t->Eta(),t->GetID());
1823 }
1824 }
1825 }
1826 }
1827 if(fUseFP) {
1828 fDecayPt=t->Pt();
1829 fDecayPhi=t->Phi();
1830 fDecayEta=t->Eta();
1831 fDecayID=t->GetID();
1832 MakeTrack();
1833 }
1834 }
1835 if(!fSkipVn) {
1836 QCStoreTrackVn("TrkAllVn");
1837 QCStoreTrackVn("TrkSelVn");
1838 if(fReadMC) {
1839 QCStoreTrackVn("MthVn");
1840 QCStoreTrackVn("MthNegVn");
1841 QCStoreTrackVn("MthPosVn");
1842 }
1843 }
1844 return;
1845}
1846//=======================================================================
1847void AliAnalysisTaskFlowStrangee::ComputeChi2VZERO() {
1848 Double_t MeanQaQc = ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("QmVZEAQmVZEC"))->GetBinContent( 1 );
1849 Double_t MeanQaQa = ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("QmVZEASQUARED"))->GetBinContent( 1 );
1850 Double_t MeanQcQc = ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("QmVZECSQUARED"))->GetBinContent( 1 );
1851 Double_t MeanQaQt = ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("QmTPCQmVZEA"))->GetBinContent( 1 );
1852 Double_t MeanQcQt = ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("QmTPCQmVZEC"))->GetBinContent( 1 );
1853 if(!TMath::AreEqualAbs(MeanQaQt,0,1e-10)&&!TMath::AreEqualAbs(MeanQcQt,0,1e-10)&&!TMath::AreEqualAbs(MeanQaQc,0,1e-10)) {
1854 Double_t OneOverChiSquaredVZEA = MeanQaQa*MeanQcQt/MeanQaQc/MeanQaQt-1;
1855 Double_t OneOverChiSquaredVZEC = MeanQcQc*MeanQaQt/MeanQaQc/MeanQcQt-1;
1856 if(!TMath::AreEqualAbs(OneOverChiSquaredVZEA,0,1e-10)&&!TMath::AreEqualAbs(OneOverChiSquaredVZEC,0,1e-10)) {
1857 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("ChiSquaredVZEA"))->SetBinContent( 1, 1/OneOverChiSquaredVZEA );
1858 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("ChiSquaredVZEC"))->SetBinContent( 1, 1/OneOverChiSquaredVZEC );
1859 }
1860 }
1861}
1862//=======================================================================
1863void AliAnalysisTaskFlowStrangee::Terminate(Option_t *) {
1864 //terminate
1865 if(fSkipTerminate) return;
1866 ComputeChi2VZERO();
1867 if(fSkipSelection) return;
1868 if(fSkipVn) return;
1869 if(fSpecie<10) {
1870 ComputeDecayVn("V0SAllVn");
1871 ComputeDecayVn("V0SSelVn");
1872 if(fReadMC) {
1873 ComputeDecayVn("V0SMthVn");
1874 ComputeDecayVn("V0SMthPosPosVn");
1875 ComputeDecayVn("V0SMthNegNegVn");
1876 ComputeDecayVn("V0SMthPosNegVn");
1877 ComputeDecayVn("V0SUnMthVn");
1878 }
1879 } else {
1880 ComputeTrackVn("TrkAllVn");
1881 ComputeTrackVn("TrkSelVn");
1882 if(fReadMC) {
1883 ComputeTrackVn("MthVn");
1884 ComputeTrackVn("MthPosVn");
1885 ComputeTrackVn("MthNegVn");
1886 }
1887 }
1888}
1889//=======================================================================
1890void AliAnalysisTaskFlowStrangee::MakeTrack() {
1891 // create track for flow tasks
1892 if(fCandidates->GetLast()+5>fCandidates->GetSize()) {
1893 fCandidates->Expand( fCandidates->GetSize()+20 );
1894 }
1895 Bool_t overwrite = kTRUE;
1896 AliFlowCandidateTrack *oTrack = (static_cast<AliFlowCandidateTrack*> (fCandidates->At( fCandidates->GetLast()+1 )));
1897 if( !oTrack ) { // creates new
1898 oTrack = new AliFlowCandidateTrack();
1899 overwrite = kFALSE;
1900 } else { // overwrites
1901 oTrack->ClearMe();
1902 }
1903 oTrack->SetMass(fDecayMass);
1904 oTrack->SetPt(fDecayPt);
1905 oTrack->SetPhi(fDecayPhi);
1906 oTrack->SetEta(fDecayEta);
1907 if(fSpecie<10) {
1908 oTrack->AddDaughter(fDecayIDpos);
1909 oTrack->AddDaughter(fDecayIDneg);
1910 } else {
1911 oTrack->SetID( fDecayID );
1912 }
1913 oTrack->SetForPOISelection(kTRUE);
1914 oTrack->SetForRPSelection(kFALSE);
1915 if(overwrite) {
1916 fCandidates->SetLast( fCandidates->GetLast()+1 );
1917 } else {
1918 fCandidates->AddLast(oTrack);
1919 }
1920 return;
1921}
1922//=======================================================================
1923void AliAnalysisTaskFlowStrangee::AddCandidates() {
1924 // adds candidates to flow events (untaging if necessary)
1925 if(fDebug) printf("FlowEventTPC %d tracks | %d RFP | %d POI\n",fTPCevent->NumberOfTracks(),fTPCevent->GetNumberOfRPs(),fTPCevent->GetNumberOfPOIs());
1926 if(fDebug) printf("FlowEventVZE %d tracks | %d RFP | %d POI\n",fVZEevent->NumberOfTracks(),fVZEevent->GetNumberOfRPs(),fVZEevent->GetNumberOfPOIs());
1927 if(fDebug) printf("I received %d candidates\n",fCandidates->GetEntriesFast());
1928 Int_t untagged=0;
1929 Int_t poi=0;
1930 for(int iCand=0; iCand!=fCandidates->GetEntriesFast(); ++iCand ) {
1931 AliFlowCandidateTrack *cand = static_cast<AliFlowCandidateTrack*>(fCandidates->At(iCand));
1932 if(!cand) continue;
1933 cand->SetForPOISelection(kTRUE);
1934 cand->SetForRPSelection(kFALSE);
1935 poi++;
1936 //if(fDebug) printf(" >Checking at candidate %d with %d daughters: mass %f\n",iCand,cand->GetNDaughters(),cand->Mass());
1937 if(fSpecie<10) { // DECAYS
1938 // untagging ===>
1939 if(fDaughterUnTag) {
1940 for(int iDau=0; iDau!=cand->GetNDaughters(); ++iDau) {
1941 if(fDebug) printf(" >Daughter %d with fID %d", iDau, cand->GetIDDaughter(iDau));
1942 for(int iRPs=0; iRPs!=fTPCevent->NumberOfTracks(); ++iRPs ) {
1943 AliFlowTrack *iRP = static_cast<AliFlowTrack*>(fTPCevent->GetTrack( iRPs ));
1944 if(!iRP) continue;
1945 if(!iRP->InRPSelection()) continue;
1946 if(cand->GetIDDaughter(iDau) == iRP->GetID()) {
1947 if(fDebug) printf(" was in RP set");
1948 ++untagged;
1949 iRP->SetForRPSelection(kFALSE);
1950 fTPCevent->SetNumberOfRPs( fTPCevent->GetNumberOfRPs() -1 );
1951 }
1952 }
1953 if(fDebug) printf("\n");
1954 }
1955 }
1956 // <=== untagging
1957 fTPCevent->InsertTrack( ((AliFlowTrack*) cand) );
1958 } else { // CHARGED
1959 // adding only new tracks and tagging accordingly ===>
1960 Bool_t found=kFALSE;
1961 for(int iRPs=0; iRPs!=fTPCevent->NumberOfTracks(); ++iRPs ) {
1962 AliFlowTrack *iRP = static_cast<AliFlowTrack*>(fTPCevent->GetTrack( iRPs ));
1963 if(!iRP) continue;
1964 if(!iRP->InRPSelection()) continue;
1965 if(cand->GetID() == iRP->GetID()) {
1966 if(fDebug) printf(" >charged track (%d) was also found in RP set (adding poi tag)\n",cand->GetID());
1967 iRP->SetMass( cand->Mass() );
1968 iRP->SetForPOISelection(kTRUE);
1969 found = kTRUE;
1970 }
1971 }
1972 if(!found) // not found adding track
1973 fTPCevent->InsertTrack( ((AliFlowTrack*) cand) );
1974 }
1975 fVZEevent->InsertTrack( ((AliFlowTrack*) cand) );
1976 } //END OF LOOP
1977 fTPCevent->SetNumberOfPOIs( poi );
1978 fVZEevent->SetNumberOfPOIs( poi );
1979 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("POI"))->Fill( poi );
1980 ((TH1D*)((TList*)fList->FindObject("Event"))->FindObject("UNTAG"))->Fill( untagged );
1981 if(fDebug) printf("FlowEventTPC %d tracks | %d RFP | %d POI\n",fTPCevent->NumberOfTracks(),fTPCevent->GetNumberOfRPs(),fTPCevent->GetNumberOfPOIs());
1982 if(fDebug) printf("FlowEventVZE %d tracks | %d RFP | %d POI\n",fVZEevent->NumberOfTracks(),fVZEevent->GetNumberOfRPs(),fVZEevent->GetNumberOfPOIs());
1983}
1984//=======================================================================
1985void AliAnalysisTaskFlowStrangee::PushBackFlowTrack(AliFlowEvent *flowevent, Double_t pt, Double_t phi, Double_t eta, Double_t w, Int_t id) {
1986 AliFlowTrack rfp;
1987 rfp.SetPt(pt);
1988 rfp.SetPhi(phi);
1989 rfp.SetEta(eta);
1990 rfp.SetWeight(w);
1991 rfp.SetForRPSelection(kTRUE);
1992 rfp.SetForPOISelection(kFALSE);
1993 rfp.SetMass(-999);
1994 rfp.SetID(id);
1995 flowevent->InsertTrack( &rfp );
1996}
1997//=======================================================================
1998Bool_t AliAnalysisTaskFlowStrangee::IsAtTPCEdge(Double_t phi,Double_t pt,Int_t charge,Double_t b) {
1999 // Origin: Alex Dobrin
2000 // Implemented by Carlos Perez
2001 TF1 cutLo("cutLo", "-0.01/x+pi/18.0-0.015", 0, 100);
2002 TF1 cutHi("cutHi", "0.55/x/x+pi/18.0+0.03", 0, 100);
2003 Double_t phimod = phi;
2004 if(b<0) phimod = TMath::TwoPi()-phimod; //for negatve polarity field
2005 if(charge<0) phimod = TMath::TwoPi()-phimod; //for negatve charge
2006 phimod += TMath::Pi()/18.0;
2007 phimod = fmod(phimod, TMath::Pi()/9.0);
2008 if( phimod<cutHi.Eval(pt) && phimod>cutLo.Eval(pt) )
2009 return kTRUE;
2010
2011 return kFALSE;
2012}
2013//=======================================================================
2014void AliAnalysisTaskFlowStrangee::MakeQVectors() {
2015 //computes event plane and updates fPsi2
2016 //if there is a problem fPsi->-1
2017 fPsi2=-1;
2018 fVZEWarning=kFALSE;
2019 //=>loading event
2020 MakeQVZE(InputEvent());
2021 MakeQTPC(InputEvent());
2022 if(fUseFP&&fReadMC) {
2023 fVZEevent->SetMCReactionPlaneAngle( fMCEP );
2024 fTPCevent->SetMCReactionPlaneAngle( fMCEP );
2025 }
2026 if(fDebug) {
2027 printf("**::MakeQVectors()");
2028 printf(" fQVZEACos %.16f | fQVZEASin %.16f || fQVZEA %.3f | fQVZEC %.3f \n",fQVZEACos, fQVZEASin, fQVZEA, fQVZEC);
2029 printf(" nQTPA_nTracks %d | fQTPC_nTracks %d || fQTPCA %.3f | fQTPCC %.3f \n",fQTPCA_nTracks, fQTPCC_nTracks, fQTPCA, fQTPCC);
2030 printf(" fQTPCACos %.16f | fQTPCASin %.16f || fQTPC2hCos %.16f | fQTPC2hSin %.16f \n",fQTPCACos, fQTPCASin, fQTPC2hCos, fQTPC2hSin);
2031 }
2032 FillMakeQSpy();
2033}
2034//=======================================================================
2035void AliAnalysisTaskFlowStrangee::FillMakeQSpy() {
2036 //=>computing psi
2037 //VZERO
2038 Double_t qvzecos,qvzesin,psivzea,psivzec,psivze,qvze, qvzea, qvzec;
2039 psivzea = ( TMath::Pi()+TMath::ATan2(-fQVZEASin,-fQVZEACos) )/fHarmonic;
2040 psivzec = ( TMath::Pi()+TMath::ATan2(-fQVZECSin,-fQVZECCos) )/fHarmonic;
2041 qvzecos = fQVZEACos + fQVZECCos;
2042 qvzesin = fQVZEASin + fQVZECSin;
2043 qvzea = fQVZEA;
2044 qvzec = fQVZEC;
2045 qvze = fQVZEA + fQVZEC;
2046 psivze = ( TMath::Pi()+TMath::ATan2(-qvzesin,-qvzecos) )/fHarmonic;
2047 //TPC
2048 Double_t qtpccos,qtpcsin,psitpca,psitpcc,psitpc,qtpc;
2049 psitpca = ( TMath::Pi()+TMath::ATan2(-fQTPCASin,-fQTPCACos) )/fHarmonic;
2050 psitpcc = ( TMath::Pi()+TMath::ATan2(-fQTPCCSin,-fQTPCCCos) )/fHarmonic;
2051 qtpccos = fQTPCACos + fQTPCCCos;
2052 qtpcsin = fQTPCASin + fQTPCCSin;
2053 qtpc = fQTPCA + fQTPCC;
2054 psitpc = ( TMath::Pi()+TMath::ATan2(-qtpcsin,-qtpccos) )/fHarmonic;
2055 //=>does the event clear?
2056 switch(fWhichPsi) {
2057 case(1): //VZERO
2058 if(fVZEWarning) return;
2059 fPsi2 = psivze;
2060 break;
2061 case(2): //TPC
2062 if(fQTPCA<2||fQTPCC<2) return;
2063 fPsi2 = psitpc;
2064 break;
2065 }
2066 //computing physical Qm vectors
2067 Double_t vzec_qmcos = fQVZECCos/fQVZEC;
2068 Double_t vzec_qmsin = fQVZECSin/fQVZEC;
2069 Double_t vzec_qmnor = TMath::Sqrt( vzec_qmcos*vzec_qmcos + vzec_qmsin*vzec_qmsin );
2070 Double_t vzea_qmcos = fQVZEACos/fQVZEA;
2071 Double_t vzea_qmsin = fQVZEASin/fQVZEA;
2072 Double_t vzea_qmnor = TMath::Sqrt( vzea_qmcos*vzea_qmcos + vzea_qmsin*vzea_qmsin );
2073 Double_t vze_qmcos = qvzecos/qvze;
2074 Double_t vze_qmsin = qvzesin/qvze;
2075 Double_t vze_qmnor = TMath::Sqrt( vze_qmcos*vze_qmcos + vze_qmsin*vze_qmsin );
2076 Double_t tpcc_qmcos = fQTPCCCos/fQTPCC;
2077 Double_t tpcc_qmsin = fQTPCCSin/fQTPCC;
2078 Double_t tpcc_qmnor = TMath::Sqrt( tpcc_qmcos*tpcc_qmcos + tpcc_qmsin*tpcc_qmsin );
2079 Double_t tpca_qmcos = fQTPCACos/fQTPCA;
2080 Double_t tpca_qmsin = fQTPCASin/fQTPCA;
2081 Double_t tpca_qmnor = TMath::Sqrt( tpca_qmcos*tpca_qmcos + tpca_qmsin*tpca_qmsin );
2082 Double_t tpc_qmcos = qtpccos/qtpc;
2083 Double_t tpc_qmsin = qtpcsin/qtpc;
2084 Double_t tpc_qmnor = TMath::Sqrt( tpc_qmcos*tpc_qmcos + tpc_qmsin*tpc_qmsin );
2085 //=>great! recording
2086 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEPSI"))->Fill( psivze );
2087 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEPSIA"))->Fill( psivzea );
2088 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEPSIC"))->Fill( psivzec );
2089 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("RFPVZE"))->Fill( qvze );
2090 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("QmVZEA"))->Fill( vzea_qmnor*TMath::Sqrt(qvzea) );
2091 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("QmVZEC"))->Fill( vzec_qmnor*TMath::Sqrt(qvzec) );
2092 //------
2093 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCPSI"))->Fill( psitpc );
2094 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCPSIA"))->Fill( psitpca );
2095 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCPSIC"))->Fill( psitpcc );
2096 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("RFPTPC"))->Fill( qtpc );
2097 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("QmTPC"))->Fill( tpc_qmnor*TMath::Sqrt(qtpc) );
2098 //------
2099 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("PSI_TPCAVZEC"))->Fill( psitpca, psivzec );
2100 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("PSI_TPCCVZEA"))->Fill( psitpcc, psivzea );
2101 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("PSI_TPCVZE"))->Fill( psitpc, psivze );
2102
2103 if(fReadMC) {
2104 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("PSIMCDIFFTPC"))->Fill( psitpc-fMCEP );
2105 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("PSIMCDIFFTPCA"))->Fill( psitpca-fMCEP );
2106 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("PSIMCDIFFTPCC"))->Fill( psitpcc-fMCEP );
2107 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("PSIMCDIFFVZE"))->Fill( psivze-fMCEP );
2108 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("PSIMCDIFFVZEA"))->Fill( psivzea-fMCEP );
2109 ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("PSIMCDIFFVZEC"))->Fill( psivzec-fMCEP );
2110 }
2111 //------
2112 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCQm"))->Fill( 1., tpcc_qmsin, tpcc_qmnor );
2113 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCQm"))->Fill( 2., tpcc_qmcos, tpcc_qmnor );
2114 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCQm"))->Fill( 3., tpca_qmsin, tpca_qmnor );
2115 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCQm"))->Fill( 4., tpca_qmcos, tpca_qmnor );
2116 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCQm"))->Fill( 5., tpc_qmsin, tpc_qmnor );
2117 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCQm"))->Fill( 6., tpc_qmcos, tpc_qmnor );
2118 //------
2119 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEQm"))->Fill( 1., vzec_qmsin, vzec_qmnor );
2120 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEQm"))->Fill( 2., vzec_qmcos, vzec_qmnor );
2121 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEQm"))->Fill( 3., vzea_qmsin, vzea_qmnor );
2122 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEQm"))->Fill( 4., vzea_qmcos, vzea_qmnor );
2123 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEQm"))->Fill( 5., vze_qmsin, vze_qmnor );
2124 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEQm"))->Fill( 6., vze_qmcos, vze_qmnor );
2125 //------
2126 Double_t vzeqaqc = vzec_qmcos*vzea_qmcos + vzec_qmsin*vzea_qmsin;
2127 Double_t vzeqatpcq = vzea_qmcos*tpc_qmcos + vzea_qmsin*tpc_qmsin;
2128 Double_t vzeqctpcq = vzec_qmcos*tpc_qmcos + vzec_qmsin*tpc_qmsin;
2129 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("QmVZEAQmVZEC"))->Fill( 1., vzeqaqc, vze_qmnor );
2130 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("QmVZEASQUARED"))->Fill( 1., vzea_qmnor*vzea_qmnor, vze_qmnor );
2131 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("QmVZECSQUARED"))->Fill( 1., vzec_qmnor*vzec_qmnor, vze_qmnor );
2132 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("QmTPCQmVZEA"))->Fill( 1., vzeqatpcq, vze_qmnor );
2133 ((TProfile*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("QmTPCQmVZEC"))->Fill( 1., vzeqctpcq, vze_qmnor );
2134 return;
2135}
2136//=======================================================================
2137void AliAnalysisTaskFlowStrangee::MakeQVZE(AliVEvent *tevent) {
2138 //=>cleaning
2139 if(fUseFP) fVZEevent->ClearFast(); // flowpackage
2140 //=>computing
2141 fQVZEACos=fQVZEASin=fQVZEA=fQVZECCos=fQVZECSin=fQVZEC=0;
2142 Int_t rfp=0;
2143 Double_t eta, phi, w;
2144 //v0c -> qa
2145 for(int id=fVZECa*8;id!=8+fVZECb*8;++id) {
2146 eta = -3.45+0.5*(id/8);
2147 phi = TMath::PiOver4()*(0.5+id%8);
2148 w = tevent->GetVZEROEqMultiplicity(id);
2149 if(w<3) fVZEWarning=kTRUE;
2150 w *= fVZEextW[id];
2151 fQVZECCos += w*TMath::Cos(fHarmonic*phi);
2152 fQVZECSin += w*TMath::Sin(fHarmonic*phi);
2153 fQVZEC += w;
2154 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEAllPhiEta"))->Fill( phi, eta, w );
2155 rfp++;
2156 if(fUseFP) PushBackFlowTrack(fVZEevent,0,phi,eta,w,0); // flowpackage
2157 }
2158 //v0a -> qb
2159 for(int id=32+fVZEAa*8;id!=40+fVZEAb*8;++id) {
2160 eta = +4.8-0.6*((id/8)-4);
2161 phi = TMath::PiOver4()*(0.5+id%8);
2162 w = tevent->GetVZEROEqMultiplicity(id);
2163 if(w<3) fVZEWarning=kTRUE;
2164 w *= fVZEextW[id];
2165 fQVZEACos += w*TMath::Cos(fHarmonic*phi);
2166 fQVZEASin += w*TMath::Sin(fHarmonic*phi);
2167 fQVZEA += w;
2168 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEAllPhiEta"))->Fill( phi, eta, w );
2169 rfp++;
2170 if(fUseFP) PushBackFlowTrack(fVZEevent,0,phi,eta,w,0); // flowpackage
2171 }
2172 if(fUseFP) { // flowpackage
2173 fVZEevent->SetNumberOfRPs(rfp);
2174 if(fDebug>0) printf("Inserted tracks in FlowEventVZE %d ==> %.1f\n",fVZEevent->NumberOfTracks(),fQVZEC+fQVZEA);
2175 }
2176}
2177//=======================================================================
2178void AliAnalysisTaskFlowStrangee::AddTPCRFPSpy(TList *me) {
2179 TH1D *tH1D;
2180 tH1D = new TH1D("PT", "PT", 50,0,5); me->Add(tH1D);
2181 tH1D = new TH1D("PHI", "PHI", 90,0,TMath::TwoPi()); me->Add(tH1D);
2182 tH1D = new TH1D("ETA", "ETA", 40,-1,+1); me->Add(tH1D);
2183 tH1D = new TH1D("TPCS", "TPC Signal", 100,0,500); me->Add(tH1D);
2184 tH1D = new TH1D("IPXY", "IPXY", 100,-2,+2); me->Add(tH1D);
2185 tH1D = new TH1D("IPZ", "IPZ", 100,-2,+2); me->Add(tH1D);
2186 // TPC
2187 tH1D = new TH1D("TPCNCLS", "NCLS", 170,-0.5,+169.5); me->Add(tH1D);
2188 tH1D = new TH1D("TPCSHCL", "NSCLS / NCLS", 100,0,1); me->Add(tH1D);
2189 tH1D = new TH1D("TPCFICL", "NCLS1I / NCLS",100,0,1); me->Add(tH1D);
2190 tH1D = new TH1D("TPCXRNF", "XROW / NFCLS", 100,0,1.5); me->Add(tH1D);
2191 tH1D = new TH1D("TPCRCHI", "CHI2 / NCLS", 50,0,5); me->Add(tH1D);
2192 // ITS
2193 tH1D = new TH1D("ITSNCLS", "NCLS", 7,-0.5,+6.5); me->Add(tH1D);
2194 tH1D = new TH1D("ITSRCHI", "CHI2 / NCLS", 50,0,5); me->Add(tH1D);
2195
2196}
2197//=======================================================================
2198Bool_t AliAnalysisTaskFlowStrangee::PassesRFPTPCCuts(AliESDtrack *track, Double_t aodchi2cls, Float_t aodipxy, Float_t aodipz) {
2199 if(track->GetKinkIndex(0)>0) return kFALSE;
2200 if( (track->GetStatus()&AliESDtrack::kTPCrefit)==0 ) return kFALSE;
2201 Double_t pt = track->Pt();
2202 Double_t phi = track->Phi();
2203 Double_t eta = track->Eta();
2204 Double_t tpcs = track->GetTPCsignal();
2205 Float_t ipxy, ipz;
2206 track->GetImpactParameters(ipxy,ipz);
2207 Int_t cls = track->GetTPCclusters(0);
2208 Double_t xrows, findcls, chi2;
2209 findcls = track->GetTPCNclsF();
2210 xrows = track->GetTPCCrossedRows();
2211 chi2 = track->GetTPCchi2();
2212 Double_t rchi2 = chi2/cls;
2213 if(!fReadESD) {
2214 rchi2 = aodchi2cls;
2215 ipxy = aodipxy;
2216 ipz = aodipz;
2217 }
2218 Double_t xrnfcls = xrows/findcls;
2219 Double_t scls, cls1i, itschi2;
2220 Int_t itscls;
2221 cls1i = track->GetTPCNclsIter1();
2222 scls = track->GetTPCnclsS();
2223 itscls = track->GetITSclusters(0);
2224 itschi2 = track->GetITSchi2();
2225 Double_t shcl = scls/cls;
2226 Double_t ficl = cls1i/cls;
2227 Double_t itsrchi2 = itscls/itschi2;
2228 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("PT"))->Fill( pt );
2229 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("PHI"))->Fill( phi );
2230 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("ETA"))->Fill( eta );
2231 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("TPCS"))->Fill( tpcs );
2232 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("IPXY"))->Fill( ipxy );
2233 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("IPZ"))->Fill( ipz );
2234 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("TPCNCLS"))->Fill( cls );
2235 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("TPCSHCL"))->Fill( shcl );
2236 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("TPCFICL"))->Fill( ficl );
2237 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("TPCXRNF"))->Fill( xrnfcls );
2238 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("TPCRCHI"))->Fill( rchi2 );
2239 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("ITSNCLS"))->Fill( itscls );
2240 ((TH1D*)((TList*)fList->FindObject("TPCRFPall"))->FindObject("ITSRCHI"))->Fill( itsrchi2 );
2241 if(pt<fRFPminPt) return kFALSE; //0.2
2242 if(pt>fRFPmaxPt) return kFALSE; //5.0
2243 if(eta<fRFPCminEta||(eta>fRFPCmaxEta&&eta<fRFPAminEta)||eta>fRFPAmaxEta) return kFALSE; // -0.8 0.0 0.0 +0.8
2244 if(tpcs<fRFPTPCsignal) return kFALSE; //10.0
2245 if( TMath::Sqrt(ipxy*ipxy/fRFPmaxIPxy/fRFPmaxIPxy+ipz*ipz/fRFPmaxIPz/fRFPmaxIPz)>1 ) return kFALSE; //2.4 3.2
2246 if(cls<fRFPTPCncls) return kFALSE; //70
2247 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("PT"))->Fill( pt );
2248 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("PHI"))->Fill( phi );
2249 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("ETA"))->Fill( eta );
2250 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("TPCS"))->Fill( tpcs );
2251 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("IPXY"))->Fill( ipxy );
2252 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("IPZ"))->Fill( ipz );
2253 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("TPCNCLS"))->Fill( cls );
2254 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("TPCSHCL"))->Fill( shcl );
2255 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("TPCFICL"))->Fill( ficl );
2256 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("TPCXRNF"))->Fill( xrnfcls );
2257 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("TPCRCHI"))->Fill( rchi2 );
2258 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("ITSNCLS"))->Fill( itscls );
2259 ((TH1D*)((TList*)fList->FindObject("TPCRFPsel"))->FindObject("ITSRCHI"))->Fill( itsrchi2 );
2260 return kTRUE;
2261}
2262//=======================================================================
2263void AliAnalysisTaskFlowStrangee::MakeQTPC(AliVEvent *tevent) {
2264 AliESDEvent *tESD = (AliESDEvent*) (tevent);
2265 AliAODEvent *tAOD = (AliAODEvent*) (tevent);
2266 if(fReadESD) {
2267 if(!tESD) return;
2268 MakeQTPC(tESD);
2269 } else {
2270 if(!tAOD) return;
2271 MakeQTPC(tAOD);
2272 }
2273}
2274//=======================================================================
2275void AliAnalysisTaskFlowStrangee::MakeQTPC(AliAODEvent *tAOD) {
2276 //=>cleaning
2277 if(fUseFP) fTPCevent->ClearFast(); // flowpackage
2278 fQTPCACos=fQTPCASin=fQTPCA=fQTPC2hCos=0;
2279 fQTPCCCos=fQTPCCSin=fQTPCC=fQTPC2hSin=0;
2280 fQTPCA_nTracks = 0;
2281 fQTPCC_nTracks = 0;
2282 Int_t rfp=0;
2283 Double_t eta, phi, w;
2284 //=>aod stuff
2285 AliAODVertex *vtx = tAOD->GetPrimaryVertex();
2286 Double_t pos[3],cov[6];
2287 vtx->GetXYZ(pos);
2288 vtx->GetCovarianceMatrix(cov);
2289 const AliESDVertex vESD(pos,cov,100.,100);
2290 AliAODTrack *track;
2291 //=>looping
2292 Int_t rawN = tAOD->GetNumberOfTracks();
2293 for(Int_t id=0; id!=rawN; ++id) {
2294 track = dynamic_cast<AliAODTrack*>(tAOD->GetTrack(id));
85f19f67 2295 if(!track) {
2296 AliFatal("Not a standard AOD");
2297 return;
2298 }
dd965670 2299 //=>cuts
2300 if(!track->TestFilterBit(fRFPFilterBit)) continue;
2301 if( fExcludeTPCEdges )
2302 if( IsAtTPCEdge( track->Phi(), track->Pt(), track->Charge(), tAOD->GetMagneticField() ) ) continue;
2303 AliESDtrack etrack( track );
2304 etrack.SetTPCClusterMap( track->GetTPCClusterMap() );
2305 etrack.SetTPCSharedMap( track->GetTPCSharedMap() );
2306 etrack.SetTPCPointsF( track->GetTPCNclsF() );
2307 Float_t ip[2];
2308 etrack.GetDZ(pos[0], pos[1], pos[2], tAOD->GetMagneticField(), ip);
2309 if(!PassesRFPTPCCuts(&etrack,track->Chi2perNDF(),ip[0],ip[1])) continue;
2310 //=>collecting info
2311 phi = track->Phi();
2312 eta = track->Eta();
2313 w = 1;
2314 if(eta<0) {
2315 fQTPCCCos += w*TMath::Cos(fHarmonic*phi);
2316 fQTPCCSin += w*TMath::Sin(fHarmonic*phi);
2317 fQTPCC += w;
2318 fQTPCC_fID[fQTPCC_nTracks++] = track->GetID();
2319 } else {
2320 fQTPCACos += w*TMath::Cos(fHarmonic*phi);
2321 fQTPCASin += w*TMath::Sin(fHarmonic*phi);
2322 fQTPCA += w;
2323 fQTPCA_fID[fQTPCA_nTracks++] = track->GetID();
2324 }
2325 fQTPC2hCos += w*TMath::Cos(2.0*fHarmonic*phi);
2326 fQTPC2hSin += w*TMath::Sin(2.0*fHarmonic*phi);
2327 rfp++;
2328 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCAllPhiEta"))->Fill( phi, eta, w );
2329 if(fUseFP) PushBackFlowTrack(fTPCevent,track->Pt(),phi,eta,w,track->GetID()); // flow package
2330 }
2331 if(fUseFP) {
2332 fTPCevent->SetNumberOfRPs(rfp);
2333 if(fDebug) printf("Inserted tracks in FlowEventTPC %d ==> %.1f\n",fTPCevent->NumberOfTracks(),fQTPCA+fQTPCC);
2334 }
2335}
2336//=======================================================================
2337void AliAnalysisTaskFlowStrangee::MakeQTPC(AliESDEvent *tESD) {
2338 //=>cleaning
2339 if(fUseFP) fTPCevent->ClearFast(); // flow package
2340 fQTPCACos=fQTPCASin=fQTPCA=0;
2341 fQTPCCCos=fQTPCCSin=fQTPCC=0;
2342 fQTPCA_nTracks = 0;
2343 fQTPCC_nTracks = 0;
2344 Int_t rfp=0;
2345 Double_t eta, phi, w;
2346 //=>looping
2347 AliESDtrack *track;
2348 Int_t rawN = tESD->GetNumberOfTracks();
2349 for(Int_t id=0; id!=rawN; ++id) {
2350 track = tESD->GetTrack(id);
2351 //=>cuts
2352 if( fExcludeTPCEdges )
2353 if( IsAtTPCEdge( track->Phi(), track->Pt(), track->Charge(), tESD->GetMagneticField() ) ) continue;
2354 if(!PassesFilterBit(track)) continue;
2355 if(!PassesRFPTPCCuts(track)) continue;
2356 //=>collecting info
2357 phi = track->Phi();
2358 eta = track->Eta();
2359 w = 1;
2360 if(eta<0) {
2361 fQTPCCCos += w*TMath::Cos(fHarmonic*phi);
2362 fQTPCCSin += w*TMath::Sin(fHarmonic*phi);
2363 fQTPCC += w;
2364 fQTPCC_fID[fQTPCC_nTracks++] = track->GetID();
2365 } else {
2366 fQTPCACos += w*TMath::Cos(fHarmonic*phi);
2367 fQTPCASin += w*TMath::Sin(fHarmonic*phi);
2368 fQTPCA += w;
2369 fQTPCA_fID[fQTPCA_nTracks++] = track->GetID();
2370 }
2371 rfp++;
2372 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCAllPhiEta"))->Fill( phi, eta, w );
2373 if(fUseFP) PushBackFlowTrack(fTPCevent,track->Pt(),phi,eta,w,track->GetID()); // flowpackage
2374 }
2375 if(fUseFP) {
2376 fTPCevent->SetNumberOfRPs(rfp);
2377 if(fDebug) printf("Inserted tracks in FlowEventTPC %d ==> %.1f\n",fTPCevent->NumberOfTracks(),fQTPCA+fQTPCC);
2378 }
2379}
2380//=======================================================================
2381void AliAnalysisTaskFlowStrangee::AddMCParticleSpy(TList *me) {
2382 TH1D *tH1D;
2383 TH2D *tH2D;
2384 TProfile *tPro;
2385 tH1D = new TH1D("Pt", "Pt", fPtBins,fPtBinEdge); me->Add(tH1D);
2386 tH1D = new TH1D("Phi", "Phi", 100,0,TMath::TwoPi()); me->Add(tH1D);
2387 tH1D = new TH1D("Eta", "Eta", 100,-1,+1); me->Add(tH1D);
2388 tH1D = new TH1D("Y", "Y", 100,-1,+1); me->Add(tH1D);
2389 tH1D = new TH1D("Rad2", "Rad2", 1000,0,+100); me->Add(tH1D);
2390 tH2D = new TH2D("Dphi", "phi-MCEP;pt;dphi",fPtBins,fPtBinEdge, 72,0,TMath::Pi()); me->Add(tH2D);
2391 tPro = new TProfile("Cos2dphi","Cos2dphi",fPtBins,fPtBinEdge); me->Add(tPro);
2392 return;
2393}
2394//=======================================================================
2395void AliAnalysisTaskFlowStrangee::FillMCParticleSpy(TString listName, AliAODMCParticle *p) {
2396 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Pt" ))->Fill( p->Pt() );
2397 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Eta" ))->Fill( p->Eta() );
2398 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Y" ))->Fill( p->Y() );
2399 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Phi" ))->Fill( p->Phi() );
2400 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Rad2" ))->Fill( TMath::Sqrt( p->Xv()*p->Xv() +
2401 p->Yv()*p->Yv() ) );
2402 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Dphi" ))->Fill( p->Pt(), GetMCDPHI(p->Phi()) );
2403 ((TProfile*)((TList*)fList->FindObject(listName.Data()))->FindObject("Cos2dphi" ))->Fill( p->Pt(), TMath::Cos( 2*GetMCDPHI(p->Phi()) ), 1 );
2404 return;
2405}
2406//=======================================================================
2407Double_t AliAnalysisTaskFlowStrangee::GetMCDPHI(Double_t phi) {
2408 Double_t dDPHI = phi - fMCEP;
2409 //if( dDPHI < 0 ) dDPHI += TMath::TwoPi();
2410 //if( dDPHI > TMath::Pi() ) dDPHI = TMath::TwoPi()-dDPHI;
2411 return dDPHI;
2412}
2413//=======================================================================
2414void AliAnalysisTaskFlowStrangee::FillMCParticleSpy(TString listName, TParticle *p) {
2415 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Pt" ))->Fill( p->Pt() );
2416 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Eta" ))->Fill( p->Eta() );
2417 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Phi" ))->Fill( p->Phi() );
2418 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("Rad2" ))->Fill( TMath::Sqrt( p->Vx()*p->Vx() +
2419 p->Vy()*p->Vy() ) );
2420 return;
2421}
2422//=======================================================================
2423void AliAnalysisTaskFlowStrangee::AddCandidatesSpy(TList *me,Bool_t res) {
2424 TH1D *tH1D;
2425 TH2D *tH2D;
2426 TProfile *tPro;
2427 TProfile2D *tPro2;
2428 tH2D = new TH2D("PhiEta", "PhiEta;Phi;Eta", 100,0,TMath::TwoPi(),100,-1,+1); me->Add(tH2D);
2429 tH2D = new TH2D("PtRAP", "PtRAP;Pt;Y", fPtBins,fPtBinEdge,100,-1,+1); me->Add(tH2D);
2430 tH2D = new TH2D("PtDCA", "PtDCA;Pt;DCA", fPtBins,fPtBinEdge,100,0,1.5); me->Add(tH2D);
2431 tH2D = new TH2D("PtCTP", "PtCTP;Pt;CTP", fPtBins,fPtBinEdge,100,0.95,+1);me->Add(tH2D);
2432 tH2D = new TH2D("PtD0D0", "PtD0D0;Pt;D0D0", fPtBins,fPtBinEdge,100,-5,+5); me->Add(tH2D);
2433 tH2D = new TH2D("PtRad2", "PtRad2;Pt;RadXY",fPtBins,fPtBinEdge,100,0,+50); me->Add(tH2D);
2434 tH2D = new TH2D("PtDL", "PtDL;Pt;DL", fPtBins,fPtBinEdge,100,0,+50); me->Add(tH2D);
2435 tH2D = new TH2D("PtDLlab", "PtDL;Pt;DLlab", fPtBins,fPtBinEdge,100,0,+100); me->Add(tH2D);
2436 tH2D = new TH2D("PtMASS", "PtMASS;Pt;MASS", fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); me->Add(tH2D);
2437 tH2D = new TH2D("APPOS", "APPOS;alphaPOS;QtPOS",100,-2,+2,100,0,0.3); me->Add(tH2D);
2438 tH2D = new TH2D("D0PD0N", "D0PD0N;D0P;D0N", 200,-10,+10,200,-10,+10); me->Add(tH2D);
2439 tH2D = new TH2D("XPOSXNEG","XPOSXNEG;XPOS;XNEG", 200,-50,+50,200,-50,+50); me->Add(tH2D);
2440 if(fReadMC) {
2441 if(res) {
2442 tH1D = new TH1D("MCOrigin","MCOrigin;Rad2", 1000,0,50); me->Add(tH1D);
2443 tH2D = new TH2D("PHIRes","PHIRes;PHI;MC-DAT", 72,0,TMath::TwoPi(),100,-0.12,+0.12); me->Add(tH2D);
2444 tH2D = new TH2D("ETARes","ETARes;ETA;MC-DAT", 16,-0.8,+0.8,100,-0.2,+0.2); me->Add(tH2D);
2445 tH2D = new TH2D("PTRes", "PTRes;Pt;MC-DAT", fPtBins,fPtBinEdge,100,-0.4,+0.4); me->Add(tH2D);
2446 tH2D = new TH2D("RXYRes","RXYRes;RXY;MC-DAT", 100,0,50,100,-4.0,+4.0); me->Add(tH2D);
2447 }
2448 tH2D = new TH2D("PTDPHIMC","PtDPHIMC;Pt;PHI-MCEP",fPtBins,fPtBinEdge,72,0,TMath::Pi()); me->Add(tH2D);
2449 tPro = new TProfile("Cos2dphiMC", "Cos2dphiMC",fPtBins,fPtBinEdge); me->Add(tPro);
2450 tPro2=new TProfile2D("C2DPHIMCMASS","C2DPHIMCMASS",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); me->Add(tPro2);
2451 }
2452 return;
2453}
2454//=======================================================================
2455void AliAnalysisTaskFlowStrangee::FillCandidateSpy(TString listName, Bool_t fillRes) {
2456 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PhiEta"))->Fill( fDecayPhi, fDecayEta );
2457 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtRAP" ))->Fill( fDecayPt, fDecayRapidity );
2458 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtDCA" ))->Fill( fDecayPt, fDecayDCAdaughters );
2459 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtCTP" ))->Fill( fDecayPt, fDecayCosinePointingAngleXY );
2460 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtD0D0"))->Fill( fDecayPt, fDecayProductIPXY );
2461 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtRad2"))->Fill( fDecayPt, fDecayRadXY );
2462 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtDL" ))->Fill( fDecayPt, fDecayDecayLength );
2463 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtDLlab"))->Fill( fDecayPt, fDecayDecayLengthLab );
2464 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PtMASS"))->Fill( fDecayPt, fDecayMass );
2465 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("APPOS" ))->Fill( fDecayAlpha, fDecayQt );
2466 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("D0PD0N"))->Fill( fDecayIPpos, fDecayIPneg );
2467 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("XPOSXNEG"))->Fill( fDecayXpos, fDecayXneg );
2468 if(fReadMC) {
2469 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PTDPHIMC" ))->Fill( fDecayPt, GetMCDPHI( fDecayPhi ) );
2470 ((TProfile*)((TList*)fList->FindObject(listName.Data()))->FindObject("Cos2dphiMC" ))->Fill( fDecayPt, TMath::Cos( 2*GetMCDPHI(fDecayPhi) ), 1 );
2471 ((TProfile2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("C2DPHIMCMASS" ))->Fill(fDecayPt,fDecayMass,TMath::Cos(2*GetMCDPHI(fDecayPhi)), 1 );
2472 if(fillRes) {
2473 ((TH1D*)((TList*)fList->FindObject(listName.Data()))->FindObject("MCOrigin"))->Fill( fDecayMatchOrigin );
2474 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PHIRes"))->Fill( fDecayPhi, fDecayMatchPhi-fDecayPhi );
2475 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("ETARes"))->Fill( fDecayEta, fDecayMatchEta-fDecayEta );
2476 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PTRes"))->Fill( fDecayPt, fDecayMatchPt-fDecayPt );
2477 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("RXYRes"))->Fill( fDecayRadXY, fDecayMatchRadXY-fDecayRadXY );
2478 }
2479 }
2480}
2481//=======================================================================
2482Bool_t AliAnalysisTaskFlowStrangee::AcceptCandidate() {
2483 if(fDecayEta<fDecayMinEta) return kFALSE;
2484 if(fDecayEta>fDecayMaxEta) return kFALSE;
2485 if(fDecayPt<fDecayMinPt) return kFALSE;
2486 if(fDecayProductIPXY>fDecayMaxProductIPXY) return kFALSE;
2487 if(fDecayDCAdaughters>fDecayMaxDCAdaughters) return kFALSE;
2488 if(fDecayCosinePointingAngleXY<fDecayMinCosinePointingAngleXY) return kFALSE;
2489 if(fDecayRadXY<fDecayMinRadXY) return kFALSE;
2490 if(TMath::Abs(fDecayRapidity)>fDecayMaxRapidity) return kFALSE;
2491 if(fSpecie==0) {
2492 if(fDecayAPCutPie) {
2493 if(fDecayQt/TMath::Abs(fDecayAlpha)<fDecayMinQt) return kFALSE;
2494 } else {
2495 if(fDecayQt<fDecayMinQt) return kFALSE;
2496 }
2497 if(fDecayDecayLength>fDecayMaxDecayLength*2.6842) return kFALSE;
2498 } else {
2499 if(fDecayDecayLength>fDecayMaxDecayLength*7.89) return kFALSE;
2500 }
2501 if(fSpecie==1) if(fDecayAlpha>0) return kFALSE;
2502 if(fSpecie==2) if(fDecayAlpha<0) return kFALSE;
2503 return kTRUE;
2504}
2505//=======================================================================
2506void AliAnalysisTaskFlowStrangee::AddTrackSpy(TList *me,Bool_t res) {
2507 TH2D *tH2D;
2508 tH2D = new TH2D("PHIETA", "PHIETA;PHI;ETA", 100,0,TMath::TwoPi(),100,-2,2); me->Add(tH2D);
2509 tH2D = new TH2D("PTTRACKDECAY", "PTTRACKDECAY;PT;PT", 100,0,10,fPtBins,fPtBinEdge); me->Add(tH2D);
2510 tH2D = new TH2D("IPXYIPZ", "IPXYIPZ;IPXY;IPZ", 100,-10,+10,100,-10,+10); me->Add(tH2D);
2511 tH2D = new TH2D("PTTPCNCLS", "PTTPCNCLS;PT;NCLS", fPtBins,fPtBinEdge,170,0,170); me->Add(tH2D);
2512 tH2D = new TH2D("PTITSNCLS", "PTITSNCLS;PT;NCLS", fPtBins,fPtBinEdge,7,-0.5,6.5); me->Add(tH2D);
2513 tH2D = new TH2D("PTITSLAY", "PTITSLAY;PT;ITSLAYER", fPtBins,fPtBinEdge,6,-0.5,+5.5);me->Add(tH2D);
2514 tH2D = new TH2D("PTITSTPCrefit","PTITSTPCrefit;PT", fPtBins,fPtBinEdge,2,-0.5,+1.5);me->Add(tH2D);
2515 tH2D->GetYaxis()->SetBinLabel(1,"ITS refit");
2516 tH2D->GetYaxis()->SetBinLabel(2,"TPC refit");
2517 tH2D = new TH2D("POSTPCNCLCHI2","POSTPCNCLCHI2;NCLS;CHI2/NCLS", 170,0,170,100,0,8); me->Add(tH2D);
2518 tH2D = new TH2D("POSTPCNFCLNXR","POSTPCNFCLNXR;NFCLS;NXR", 170,0,170,170,0,170); me->Add(tH2D);
2519 tH2D = new TH2D("POSTPCNCLNFCL","POSTPCNCLNFCL;NCLS;NFCLS", 170,0,170,170,0,170); me->Add(tH2D);
2520 tH2D = new TH2D("POSTPCNCLNSCL","POSTPCNCLNSCL;NCLS;NSCLS", 170,0,170,170,0,170); me->Add(tH2D);
2521 tH2D = new TH2D("NEGTPCNCLCHI2","NEGTPCNCLCHI2;NCLS;CHI2/NCLS", 170,0,170,100,0,8); me->Add(tH2D);
2522 tH2D = new TH2D("NEGTPCNFCLNXR","NEGTPCNFCLNXR;NFCLS;NXR", 170,0,170,170,0,170); me->Add(tH2D);
2523 tH2D = new TH2D("NEGTPCNCLNFCL","NEGTPCNCLNFCL;NCLS;NFCLS", 170,0,170,170,0,170); me->Add(tH2D);
2524 tH2D = new TH2D("NEGTPCNCLNSCL","NEGTPCNCLNSCL;NCLS;NSCLS", 170,0,170,170,0,170); me->Add(tH2D);
2525 if(fReadMC) {
2526 TProfile *tPro;
2527 tPro = new TProfile("COSNDPHIMC","COSNDPHIMC",fPtBins,fPtBinEdge); me->Add(tPro);
2528 }
2529 if(res) {
2530 tH2D = new TH2D("PHIRes", "PHIRes;PHI;MC-DAT", 72,0,TMath::TwoPi(),100,-0.12,+0.12); me->Add(tH2D);
2531 tH2D = new TH2D("ETARes", "ETARes;ETA;MC-DAT", 16,-0.8,+0.8,100,-0.2,+0.2); me->Add(tH2D);
2532 tH2D = new TH2D("PTRes", "PTRes;Pt;MC-DAT", fPtBins,fPtBinEdge,100,-0.4,+0.4); me->Add(tH2D);
2533 }
2534}
2535//=======================================================================
2536void AliAnalysisTaskFlowStrangee::FillTrackSpy(TString listName,Bool_t res) {
2537 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PHIETA" ))->Fill( fDaughterPhi, fDaughterEta );
2538 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PTTRACKDECAY" ))->Fill( fDaughterPt, fDecayPt );
2539 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "IPXYIPZ" ))->Fill( fDaughterImpactParameterXY, fDaughterImpactParameterZ );
2540 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PTTPCNCLS" ))->Fill( fDaughterPt, fDaughterNClsTPC );
2541 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PTITSNCLS" ))->Fill( fDaughterPt, fDaughterNClsITS );
2542 if( TESTBIT(fDaughterITScm,0) ) ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PTITSLAY" ))->Fill( fDaughterPt, 0 );
2543 if( TESTBIT(fDaughterITScm,1) ) ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PTITSLAY" ))->Fill( fDaughterPt, 1 );
2544 if( TESTBIT(fDaughterITScm,2) ) ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PTITSLAY" ))->Fill( fDaughterPt, 2 );
2545 if( TESTBIT(fDaughterITScm,3) ) ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PTITSLAY" ))->Fill( fDaughterPt, 3 );
2546 if( TESTBIT(fDaughterITScm,4) ) ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PTITSLAY" ))->Fill( fDaughterPt, 4 );
2547 if( TESTBIT(fDaughterITScm,5) ) ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PTITSLAY" ))->Fill( fDaughterPt, 5 );
2548 if( (fDaughterStatus&AliESDtrack::kITSrefit) ) ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PTITSTPCrefit" ))->Fill( fDaughterPt, 0 );
2549 if( (fDaughterStatus&AliESDtrack::kTPCrefit) ) ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( "PTITSTPCrefit" ))->Fill( fDaughterPt, 1 );
2550 TString ch="NEG";
2551 if(fDaughterCharge>0) ch="POS";
2552 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( Form("%sTPCNCLCHI2",ch.Data()) ))->Fill( fDaughterNClsTPC, fDaughterChi2PerNClsTPC );
2553 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( Form("%sTPCNFCLNXR",ch.Data()) ))->Fill( fDaughterNFClsTPC, fDaughterXRows );
2554 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( Form("%sTPCNCLNFCL",ch.Data()) ))->Fill( fDaughterNClsTPC, fDaughterNFClsTPC );
2555 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject( Form("%sTPCNCLNSCL",ch.Data()) ))->Fill( fDaughterNClsTPC, fDaughterNSClsTPC );
2556 if(fReadMC) {
2557 Double_t cosn = TMath::Cos( fHarmonic*GetMCDPHI(fDaughterPhi) );
2558 ((TProfile*)((TList*)fList->FindObject(listName.Data()))->FindObject("COSNDPHIMC" ))->Fill( fDaughterPt, cosn, 1 );
2559 }
2560 if(res) {
2561 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PHIRes"))->Fill( fDaughterPhi, fDaughterMatchPhi-fDaughterAtSecPhi );
2562 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("ETARes"))->Fill( fDaughterEta, fDaughterMatchEta-fDaughterAtSecEta );
2563 ((TH2D*)((TList*)fList->FindObject(listName.Data()))->FindObject("PTRes"))->Fill( fDaughterPt, fDaughterMatchPt-fDaughterAtSecPt );
2564 }
2565}
2566//=======================================================================
2567void AliAnalysisTaskFlowStrangee::LoadTrack(AliESDtrack *myTrack, Double_t aodChi2NDF) {
2568 fDaughterCharge = myTrack->Charge();
2569 fDaughterXRows = myTrack->GetTPCCrossedRows();
2570 fDaughterNFClsTPC = myTrack->GetTPCNclsF();
2571 fDaughterNSClsTPC = myTrack->GetTPCnclsS();
2572 fDaughterNClsTPC = myTrack->GetTPCclusters(0);
2573 if(fReadESD) {
2574 if(fDaughterNClsTPC>0) fDaughterChi2PerNClsTPC = myTrack->GetTPCchi2()/fDaughterNClsTPC;
2575 } else {
2576 fDaughterChi2PerNClsTPC = aodChi2NDF;
2577 }
2578 myTrack->GetImpactParameters(fDaughterImpactParameterXY,fDaughterImpactParameterZ);
2579 fDaughterStatus = myTrack->GetStatus();
2580 fDaughterITScm = myTrack->GetITSClusterMap();
2581 fDaughterPhi = myTrack->Phi();
2582 fDaughterEta = myTrack->Eta();
2583 fDaughterPt = myTrack->Pt();
2584 fDaughterKinkIndex = myTrack->GetKinkIndex(0);
2585 fDaughterNClsITS=0;
2586 for(Int_t lay=0; lay!=6; ++lay)
2587 if(TESTBIT(fDaughterITScm,lay)) fDaughterNClsITS++;
2588
2589 //newITScuts
2590 fcounterForSharedCluster = 0;
2591 for(int i =0;i<6;i++){
2592 fsharedITSCluster = myTrack->HasSharedPointOnITSLayer(i);
2593 if(fsharedITSCluster == 1) fcounterForSharedCluster++;
2594 }
2595 fchi2perClusterITS = myTrack->GetITSchi2()/myTrack->GetNcls(0);
2596
2597}
2598//=======================================================================
2599Bool_t AliAnalysisTaskFlowStrangee::AcceptDaughter(Bool_t strongITS, Bool_t newITScuts) {
2600 if(fDaughterKinkIndex>0) return kFALSE;
2601 if( (fDaughterStatus&AliESDtrack::kTPCrefit)==0 ) return kFALSE;
2602 if(fDaughterNFClsTPC<1) return kFALSE;
2603 if(fDaughterPt<fDaughterMinPt) return kFALSE;
2604 if(fDaughterEta<fDaughterMinEta) return kFALSE;
2605 if(fDaughterEta>fDaughterMaxEta) return kFALSE;
2606 if(fDaughterNClsTPC<fDaughterMinNClsTPC) return kFALSE;
2607 if(fDaughterXRows<fDaughterMinXRows) return kFALSE;
2608 if(fDaughterChi2PerNClsTPC>fDaughterMaxChi2PerNClsTPC) return kFALSE;
2609 if(TMath::Abs(fDaughterImpactParameterXY)<fDaughterMinImpactParameterXY) return kFALSE;
2610 if(fDaughterXRows<fDaughterMinXRowsOverNClsFTPC*fDaughterNFClsTPC) return kFALSE;
2611 if(strongITS) {
2612 if( (fDaughterITSrefit) & ((fDaughterStatus&AliESDtrack::kITSrefit)==0) ) return kFALSE;
2613 for(Int_t lay=0; lay!=6; ++lay)
2614 if(fDaughterITSConfig[lay]>-0.5) {
2615 if(fDaughterITSConfig[lay]) {
2616 if(!TESTBIT(fDaughterITScm,lay)) return kFALSE;
2617 } else {
2618 if(TESTBIT(fDaughterITScm,lay)) return kFALSE;
2619 }
2620 }
2621 if(fDaughterNClsITS<fDaughterMinNClsITS) return kFALSE;
2622 if(fDaughterSPDRequireAny) {
2623 if( !TESTBIT(fDaughterITScm,0)&&!TESTBIT(fDaughterITScm,1)) return kFALSE;
2624 }
2625 }
2626
2627 if(newITScuts) {
2628 if(fchi2perClusterITS >= fMaxchi2perITSCluster) return kFALSE;
2629 if(fcounterForSharedCluster >= fmaxSharedITSCluster) return kFALSE;
2630 }
2631
2632 return kTRUE;
2633}
2634//=======================================================================
2635Double_t AliAnalysisTaskFlowStrangee::GetWDist(const AliVVertex* v0, const AliVVertex* v1) {
2636 // calculate sqrt of weighted distance to other vertex
2637 if (!v0 || !v1) {
2638 printf("One of vertices is not valid\n");
2639 return 0;
2640 }
2641 static TMatrixDSym vVb(3);
2642 double dist = -1;
2643 double dx = v0->GetX()-v1->GetX();
2644 double dy = v0->GetY()-v1->GetY();
2645 double dz = v0->GetZ()-v1->GetZ();
2646 double cov0[6],cov1[6];
2647 v0->GetCovarianceMatrix(cov0);
2648 v1->GetCovarianceMatrix(cov1);
2649 vVb(0,0) = cov0[0]+cov1[0];
2650 vVb(1,1) = cov0[2]+cov1[2];
2651 vVb(2,2) = cov0[5]+cov1[5];
2652 vVb(1,0) = vVb(0,1) = cov0[1]+cov1[1];
2653 vVb(0,2) = vVb(1,2) = vVb(2,0) = vVb(2,1) = 0.;
2654 vVb.InvertFast();
2655 if (!vVb.IsValid()) {printf("Singular Matrix\n"); return dist;}
2656 dist = vVb(0,0)*dx*dx + vVb(1,1)*dy*dy + vVb(2,2)*dz*dz
2657 + 2*vVb(0,1)*dx*dy + 2*vVb(0,2)*dx*dz + 2*vVb(1,2)*dy*dz;
2658 return dist>0 ? TMath::Sqrt(dist) : -1;
2659}
2660//=======================================================================
2661Bool_t AliAnalysisTaskFlowStrangee::plpMV(const AliVEvent *event) {
2662 // check for multi-vertexer pile-up
2663 const AliAODEvent *aod = (const AliAODEvent*)event;
2664 const AliESDEvent *esd = (const AliESDEvent*)event;
2665 //
2666 const int kMinPlpContrib = 5;
2667 const double kMaxPlpChi2 = 5.0;
2668 const double kMinWDist = 15;
2669 //
2670 if (!aod && !esd) {
2671 printf("Event is neither of AOD nor ESD\n");
2672 exit(1);
2673 }
2674 //
2675 const AliVVertex* vtPrm = 0;
2676 const AliVVertex* vtPlp = 0;
2677 int nPlp = 0;
2678 //
2679 if (aod) {
2680 if ( !(nPlp=aod->GetNumberOfPileupVerticesTracks()) ) return kFALSE;
2681 vtPrm = aod->GetPrimaryVertex();
2682 if (vtPrm == aod->GetPrimaryVertexSPD()) return kTRUE; // there are pile-up vertices but no primary
2683 }
2684 else {
2685 if ( !(nPlp=esd->GetNumberOfPileupVerticesTracks())) return kFALSE;
2686 vtPrm = esd->GetPrimaryVertexTracks();
2687 if (((AliESDVertex*)vtPrm)->GetStatus()!=1) return kTRUE; // there are pile-up vertices but no primary
2688 }
2689 //int bcPrim = vtPrm->GetBC();
2690 //
2691 for (int ipl=0;ipl<nPlp;ipl++) {
2692 vtPlp = aod ? (const AliVVertex*)aod->GetPileupVertexTracks(ipl) : (const AliVVertex*)esd->GetPileupVertexTracks(ipl);
2693 //
2694 if (vtPlp->GetNContributors() < kMinPlpContrib) continue;
2695 if (vtPlp->GetChi2perNDF() > kMaxPlpChi2) continue;
2696 // int bcPlp = vtPlp->GetBC();
2697 // if (bcPlp!=AliVTrack::kTOFBCNA && TMath::Abs(bcPlp-bcPrim)>2) return kTRUE; // pile-up from other BC
2698 //
2699 double wDst = GetWDist(vtPrm,vtPlp);
2700 if (wDst<kMinWDist) continue;
2701 //
2702 return kTRUE; // pile-up: well separated vertices
2703 }
2704 //
2705 return kFALSE;
2706 //
2707}
2708//=======================================================================
2709void AliAnalysisTaskFlowStrangee::MakeFilterBits() {
2710 //FilterBit 1
2711 fFB1 = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
2712 //FilterBit1024
2713 fFB1024 = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE,1);
2714 fFB1024->SetMinNCrossedRowsTPC(120);
2715 fFB1024->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
2716 fFB1024->SetMaxChi2PerClusterITS(36);
2717 fFB1024->SetMaxFractionSharedTPCClusters(0.4);
2718 fFB1024->SetMaxChi2TPCConstrainedGlobal(36);
2719 fFB1024->SetEtaRange(-0.9,0.9);
2720 fFB1024->SetPtRange(0.15, 1e10);
2721}
2722//=======================================================================
2723Bool_t AliAnalysisTaskFlowStrangee::PassesFilterBit(AliESDtrack *track) {
2724 Bool_t ret=kFALSE;
2725 switch(fRFPFilterBit) {
2726 case(1024):
2727 ret = fFB1024->AcceptTrack(track);
2728 break;
2729 default:
2730 ret = fFB1->AcceptTrack(track);
2731 }
2732 return ret;
2733}
2734//=======================================================================
2735void AliAnalysisTaskFlowStrangee::LoadVZEROResponse() {
2736 if(fVZEResponse) {
2737 TString run = fVZEResponse->GetTitle();
2738 if( run.Atoi() == fRunNumber ) return;
2739 fVZEResponse = NULL;
2740 }
2741 //==>loading
2742 fVZEResponse = dynamic_cast<TH2D*> (fVZEload->FindObject( Form("%d",fRunNumber) ));
2743 if(fVZEResponse) {
2744 printf("New VZE calibration: run %d || %s -> Entries %.0f\n",fRunNumber, fVZEResponse->GetTitle(),fVZEResponse->GetEntries());
2745 //=>external weights
2746 for(int i=0;i!=64;++i) fVZEextW[i]=1;
2747 if(!fVZEsave) {
2748 Double_t minC = fCentPerMin, maxC = fCentPerMax;
2749 if(fVZEmb) {
2750 minC = 0;
2751 maxC = 80;
2752 }
2753 Int_t ybinmin = fVZEResponse->GetYaxis()->FindBin(minC+1e-6);
2754 Int_t ybinmax = fVZEResponse->GetYaxis()->FindBin(maxC-1e-6);
2755 if(fSkipCentralitySelection) {
2756 ybinmin=-1;
2757 ybinmax=-1;
2758 }
2759 for(int i=0;i!=64;++i) fVZEextW[i] = fVZEResponse->Integral(i+1,i+1,ybinmin,ybinmax)/(maxC-minC);
2760 //ring-wise normalization
2761 Double_t ring[8];
2762 for(int j=0; j!=8; ++j) {
2763 ring[j]=0;
2764 for(int i=0;i!=8;++i) ring[j] += fVZEextW[j*8+i]/8;
2765 }
2766 //disk-wise normalization
2767 Double_t disk[2];
2768 int xbinmin, xbinmax;
2769 xbinmin = 1+8*fVZECa;
2770 xbinmax = 8+8*fVZECb;
2771 disk[0] = fVZEResponse->Integral(xbinmin,xbinmax,ybinmin,ybinmax)/(maxC-minC)/(xbinmax-xbinmin+1);
2772 xbinmin = 33+8*fVZEAa;
2773 xbinmax = 40+8*fVZEAb;
2774 disk[1] = fVZEResponse->Integral(xbinmin,xbinmax,ybinmin,ybinmax)/(maxC-minC)/(xbinmax-xbinmin+1);
2775 //for(int i=0;i!=64;++i) printf("CELL %d -> W = %f ||",i,fVZEextW[i]);
2776 if(fVZEByDisk) {
2777 for(int i=0;i!=64;++i) fVZEextW[i] = disk[i/32]/fVZEextW[i];
2778 } else {
2779 for(int i=0;i!=64;++i) fVZEextW[i] = ring[i/8]/fVZEextW[i];
2780 }
2781 //for(int i=0;i!=64;++i) printf(" W = %f \n",fVZEextW[i]);
2782 }
2783 } else {
2784 printf("VZE calibration: requested but not found!!!\n");
2785 }
2786}
2787//=======================================================================
2788void AliAnalysisTaskFlowStrangee::AddVZEQA() {
2789 TProfile2D *prof;
2790 TH2D *tH2D;
2791 TList *tList = new TList();
2792 tList->SetName( "VZEQA" );
2793 tList->SetOwner();
2794 fList->Add( tList );
2795 tH2D = new TH2D("EQU","EQU;VZEeqmult-VZEmult;cell",100,-5,+5,64,0,64); tList->Add( tH2D );
2796 prof = new TProfile2D("LINbefCAL","LINbef;VZEcell;VZEeqmult;SPDtrkl", 64,0,64,350,0,700,0,10000); tList->Add( prof );
2797 prof = new TProfile2D("LINaftCAL","LINaft;VZEcell;VZEeqmult;SPDtrkl", 64,0,64,350,0,700,0,10000); tList->Add( prof );
2798}
2799//=======================================================================
2800void AliAnalysisTaskFlowStrangee::FillVZEQA() {
2801 AliESDEvent *tESD = (AliESDEvent*) (InputEvent());
2802 AliAODEvent *tAOD = (AliAODEvent*) (InputEvent());
2803 if(fReadESD) {
2804 if(!tESD) return;
2805 //FillVZEQA(tESD);
2806 } else {
2807 if(!tAOD) return;
2808 FillVZEQA(tAOD);
2809 }
2810}
2811//=======================================================================
2812void AliAnalysisTaskFlowStrangee::FillVZEQA(AliAODEvent *tAOD) {
2813 AliVVZERO *vzero = tAOD->GetVZEROData();
2814 AliAODTracklets *tracklets = tAOD->GetTracklets();
2815 if(!vzero) return;
2816 if(!tracklets) return;
2817 Double_t mult, eqmult;
2818 Int_t trkl = tracklets->GetNumberOfTracklets();
2819 for(int id=0; id!=64; ++id) {
2820 mult = vzero->GetMultiplicity(id);
2821 eqmult = tAOD->GetVZEROEqMultiplicity(id);
2822 ((TH2D*) ((TList*) fList->FindObject("VZEQA"))->FindObject("EQU"))->Fill(eqmult-mult,id);
2823 ((TProfile2D*) ((TList*) fList->FindObject("VZEQA"))->FindObject( "LINbefCAL" ))->Fill(id,eqmult,trkl,1);
2824 ((TProfile2D*) ((TList*) fList->FindObject("VZEQA"))->FindObject( "LINaftCAL" ))->Fill(id,eqmult*fVZEextW[id],trkl,1);
2825 }
2826}
2827//=======================================================================
2828void AliAnalysisTaskFlowStrangee::AddVZEROResponse() {
2829 fVZEResponse = NULL;
2830 AliVEvent *event = InputEvent();
2831 if(!event) return;
2832 Int_t thisrun = event->GetRunNumber();
2833 fVZEResponse = new TH2D( Form("%d",thisrun), Form("%d;cell;CC",thisrun), 64,0,64, 110, -10, 100);
2834 fList->Add(fVZEResponse);
2835}
2836//=======================================================================
2837void AliAnalysisTaskFlowStrangee::SaveVZEROResponse() {
2838 if(!fVZEResponse) return;
2839 AliVEvent *event = InputEvent();
2840 if(!event) return;
2841 Double_t w;
2842 // reject event with low ocupancy in VZERO
2843 // for centralities below 60% this should not happen anyway
2844 Double_t rejectEvent = kFALSE;
2845 for(int id=0; id!=64; ++id) {
2846 w = event->GetVZEROEqMultiplicity(id);
2847 if(w<3) rejectEvent = kTRUE;
2848 }
2849 if(rejectEvent) return;
2850 // saves weights
2851 for(int id=0; id!=64; ++id) {
2852 w = event->GetVZEROEqMultiplicity(id);
2853 fVZEResponse->Fill(id,fThisCent,w);
2854 }
2855}
2856//=======================================================================
2857Int_t AliAnalysisTaskFlowStrangee::RefMult(AliAODEvent *tAOD, Int_t fb) {
2858 Int_t found = 0;
2859 for(int i=0; i!=tAOD->GetNumberOfTracks(); ++i) {
2860 AliAODTrack *t = dynamic_cast<AliAODTrack*>(tAOD->GetTrack( i ));
2861 if(!t) continue;
2862 if( !t->TestFilterBit(fb) ) continue;
2863 if( t->Eta()<-0.8 || t->Eta()>+0.8 ) continue;
2864 if( t->Pt()<0.2 || t->Pt()>5.0 ) continue;
2865 if( t->GetTPCNcls()<70 ) continue;
2866 //if( t->GetTPCsignal()<10.0 ) continue;
2867 if( t->Chi2perNDF()<0.2 ) continue;
2868 ++found;
2869 }
2870 return found;
2871}
2872//=======================================================================
2873Int_t AliAnalysisTaskFlowStrangee::RefMultTPC() {
2874 AliAODEvent *ev = dynamic_cast<AliAODEvent*> (InputEvent());
2875 if(!ev) return -1;
2876 Int_t found = 0;
2877 for(int i=0; i!=ev->GetNumberOfTracks(); ++i) {
2878 AliAODTrack *t = dynamic_cast<AliAODTrack*>(ev->GetTrack( i ));
2879 if(!t) continue;
2880 if( !t->TestFilterBit(1) ) continue;
2881 if( t->Eta()<-0.8 || t->Eta()>+0.8 ) continue;
2882 if( t->Pt()<0.2 || t->Pt()>5.0 ) continue;
2883 if( t->GetTPCNcls()<70 ) continue;
2884 if( t->GetTPCsignal()<10.0 ) continue;
2885 if( t->Chi2perNDF()<0.2 ) continue;
2886 ++found;
2887 }
2888 return found;
2889}
2890//=======================================================================
2891Int_t AliAnalysisTaskFlowStrangee::RefMultGlobal() {
2892 AliAODEvent *ev = dynamic_cast<AliAODEvent*> (InputEvent());
2893 if(!ev) return -1;
2894 Int_t found = 0;
2895 for(int i=0; i!=ev->GetNumberOfTracks(); ++i) {
2896 AliAODTrack *t = dynamic_cast<AliAODTrack*>(ev->GetTrack( i ));
2897 if(!t) continue;
2898 if( !t->TestFilterBit(16) ) continue;
2899 if( t->Eta()<-0.8 || t->Eta()>+0.8 ) continue;
2900 if( t->Pt()<0.2 || t->Pt()>5.0 ) continue;
2901 if( t->GetTPCNcls()<70 ) continue;
2902 if( t->GetTPCsignal()<10.0 ) continue;
2903 if( t->Chi2perNDF()<0.1 ) continue;
2904 Double_t b[3], bcov[3];
2905 if( !t->PropagateToDCA(ev->GetPrimaryVertex(),ev->GetMagneticField(),100,b,bcov) ) continue;
2906 if( b[0]>+0.3 || b[0]<-0.3 || b[1]>+0.3 || b[1]<-0.3) continue;
2907 ++found;
2908 }
2909 return found;
2910}
2911//=======================================================================
2912void AliAnalysisTaskFlowStrangee::ResetContainers() {
2913 if(fUseFP) {
2914 fTPCevent->ClearFast();
2915 fVZEevent->ClearFast();
2916 }
2917}
2918//=======================================================================
2919void AliAnalysisTaskFlowStrangee::AddTrackVn(TList *tList) {
2920 TProfile *tProfile;
2921 TH1D *tH1D;
2922 // vze
2923 tProfile = new TProfile("SP_uVZEA","u x Q_{VZEA}",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2924 tProfile = new TProfile("SP_uVZEC","u x Q_{VZEC}",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2925 tProfile = new TProfile("SP_VZEAVZEC","Q_{VZEA} x Q_{VZEC}",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2926 tProfile = new TProfile("SP_VZEATPC","Q_{VZEA} x Q_{TPC}",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2927 tProfile = new TProfile("SP_VZECTPC","Q_{VZEC} x Q_{TPC}",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2928 // error
2929 tProfile = new TProfile("SP_uVZEAuVZEC","u x Q_{VZEA} . u x Q_{VZEC}",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2930 tProfile = new TProfile("SP_uVZEAVZEAVZEC","u x Q_{VZEA} . Q_{VZEA} x Q_{VZEC}",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2931 tProfile = new TProfile("SP_uVZECVZEAVZEC","u x Q_{VZEC} . Q_{VZEA} x Q_{VZEC}",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2932 // tpc
2933 tProfile = new TProfile("SP_uTPCA","u x Q_{TPCA}",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2934 tProfile = new TProfile("SP_uTPCC","u x Q_{TPCC}",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2935 tProfile = new TProfile("SP_TPCATPCC","Q_{TPCA} x Q_{TPCC}",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2936 // error
2937 tProfile = new TProfile("SP_uTPCATPCATPCC","u x Q_{TPCA} . Q_{TPCA} x Q_{TPCC}",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2938 tProfile = new TProfile("SP_uTPCCTPCATPCC","u x Q_{TPCC} . Q_{TPCA} x Q_{TPCC}",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2939 // control
2940 tH1D = new TH1D("QC_HistPt_P","HistPt_P",fPtBins,fPtBinEdge); tList->Add( tH1D );
2941 tH1D = new TH1D("QC_HistPt_Q","HistPt_Q",fPtBins,fPtBinEdge); tList->Add( tH1D );
2942 // qc
2943 tProfile = new TProfile("QC_C2","QC_C2",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2944 tProfile = new TProfile("QC_C4","QC_C4",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2945 tProfile = new TProfile("QC_DC2","QC_DC2",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2946 tProfile = new TProfile("QC_DC4","QC_DC4",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2947 tProfile = new TProfile("QC_C2C4","QC_C2C4",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2948 tProfile = new TProfile("QC_C2DC2","QC_C2DC2",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2949 tProfile = new TProfile("QC_C2DC4","QC_C2DC4",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2950 tProfile = new TProfile("QC_C4DC2","QC_C4DC2",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2951 tProfile = new TProfile("QC_C4DC4","QC_C4DC4",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2952 tProfile = new TProfile("QC_DC2DC4","QC_DC2DC4",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2953 // qc transient
2954 tProfile = new TProfile("QC_pCos","QC_pCos",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2955 tProfile = new TProfile("QC_pSin","QC_pSin",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2956 tProfile = new TProfile("QC_qCos","QC_qCos",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2957 tProfile = new TProfile("QC_qSin","QC_qSin",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2958 tProfile = new TProfile("QC_q2hCos","QC_q2hCos",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2959 tProfile = new TProfile("QC_q2hSin","QC_q2hSin",fPtBins,fPtBinEdge,-3,+3,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2960 // measurements
2961 tH1D = new TH1D("SP_vnVZEA","SP_vnVZEA",fPtBins,fPtBinEdge); tList->Add( tH1D );
2962 tH1D = new TH1D("SP_vnVZEC","SP_vnVZEC",fPtBins,fPtBinEdge); tList->Add( tH1D );
2963 tH1D = new TH1D("SP_vnTPCA","SP_vnTPCA",fPtBins,fPtBinEdge); tList->Add( tH1D );
2964 tH1D = new TH1D("SP_vnTPCC","SP_vnTPCC",fPtBins,fPtBinEdge); tList->Add( tH1D );
2965 tH1D = new TH1D("QC_Cum2","QC_Cum2",fPtBins,fPtBinEdge); tList->Add( tH1D );
2966 tH1D = new TH1D("QC_Cum4","QC_Cum4",fPtBins,fPtBinEdge); tList->Add( tH1D );
2967 tH1D = new TH1D("QC_DCum2","QC_DCum2",fPtBins,fPtBinEdge); tList->Add( tH1D );
2968 tH1D = new TH1D("QC_DCum4","QC_DCum4",fPtBins,fPtBinEdge); tList->Add( tH1D );
2969 tH1D = new TH1D("SP_vnVZEGA","SP_vnVZEGA",fPtBins,fPtBinEdge); tList->Add( tH1D );
2970 tH1D = new TH1D("SP_vnVZEWA","SP_vnVZEWA",fPtBins,fPtBinEdge); tList->Add( tH1D );
2971 tH1D = new TH1D("SP_vnTPCAA","SP_vnTPCAA",fPtBins,fPtBinEdge); tList->Add( tH1D );
2972 tH1D = new TH1D("QC_vn2","QC_vn2",fPtBins,fPtBinEdge); tList->Add( tH1D );
2973 tH1D = new TH1D("QC_vn4","QC_vn4",fPtBins,fPtBinEdge); tList->Add( tH1D );
2974 if(fReadMC) {
2975 TH2D *tH2D;
2976 tProfile = new TProfile("MC_COSNDPHI","MC_COSNDPHI",fPtBins,fPtBinEdge,-3,+3); tList->Add( tProfile );
2977 tH2D = new TH2D("MC_COSNDPHI_uQVZEA","MC_COSNDPHI_uQVZEA",100,-1,+1,100,-0.3,+0.3); tList->Add( tH2D );
2978 tH2D = new TH2D("MC_COSNDPHI_uQVZEC","MC_COSNDPHI_uQVZEC",100,-1,+1,100,-0.3,+0.3); tList->Add( tH2D );
2979 tH2D = new TH2D("MC_COSNDPHI_uQTPCA","MC_COSNDPHI_uQTPCA",100,-1,+1,100,-0.3,+0.3); tList->Add( tH2D );
2980 tH2D = new TH2D("MC_COSNDPHI_uQTPCC","MC_COSNDPHI_uQTPCC",100,-1,+1,100,-0.3,+0.3); tList->Add( tH2D );
2981 }
2982}
2983//=======================================================================
2984void AliAnalysisTaskFlowStrangee::AddDecayVn(TList *tList) {
2985 TProfile2D *tProfile;
2986 TH2D *tH2D;
2987 // decay
2988 tH2D = new TH2D("DecayYield_PtMass","Decay_PtMass",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
2989 tProfile = new TProfile2D("DecayAvgPt_PtMass","Decay_PtMass",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tProfile ); tProfile->Sumw2();
2990 // vze
2991 tProfile = new TProfile2D("SP_uVZEA","u x Q_{VZEA}",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2992 tProfile = new TProfile2D("SP_uVZEC","u x Q_{VZEC}",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2993 tProfile = new TProfile2D("SP_VZEAVZEC","Q_{VZEA} x Q_{VZEC}",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2994 tProfile = new TProfile2D("SP_VZEATPC","Q_{VZEA} x Q_{TPC}",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2995 tProfile = new TProfile2D("SP_VZECTPC","Q_{VZEC} x Q_{TPC}",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2996 // error
2997 tProfile = new TProfile2D("SP_uVZEAuVZEC","u x Q_{VZEA} . u x Q_{VZEC}",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2998 tProfile = new TProfile2D("SP_uVZEAVZEAVZEC","u x Q_{VZEA} . Q_{VZEA} x Q_{VZEC}",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
2999 tProfile = new TProfile2D("SP_uVZECVZEAVZEC","u x Q_{VZEC} . Q_{VZEA} x Q_{VZEC}",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3000 // tpc
3001 tProfile = new TProfile2D("SP_uTPCA","u x Q_{TPCA}",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3002 tProfile = new TProfile2D("SP_uTPCC","u x Q_{TPCC}",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3003 tProfile = new TProfile2D("SP_TPCATPCC","Q_{TPCA} x Q_{TPCC}",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3004 // error
3005 tProfile = new TProfile2D("SP_uTPCATPCATPCC","u x Q_{TPCA} . Q_{TPCA} x Q_{TPCC}",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3006 tProfile = new TProfile2D("SP_uTPCCTPCATPCC","u x Q_{TPCC} . Q_{TPCA} x Q_{TPCC}",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3007 // control
3008 tH2D = new TH2D("QC_HistPt_P","HistPt_P",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3009 tH2D = new TH2D("QC_HistPt_Q","HistPt_Q",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3010 // qc
3011 tProfile = new TProfile2D("QC_C2","QC_C2",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3012 tProfile = new TProfile2D("QC_C4","QC_C4",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3013 tProfile = new TProfile2D("QC_DC2","QC_DC2",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3014 tProfile = new TProfile2D("QC_DC4","QC_DC4",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3015 tProfile = new TProfile2D("QC_C2C4","QC_C2C4",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3016 tProfile = new TProfile2D("QC_C2DC2","QC_C2DC2",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3017 tProfile = new TProfile2D("QC_C2DC4","QC_C2DC4",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3018 tProfile = new TProfile2D("QC_C4DC2","QC_C4DC2",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3019 tProfile = new TProfile2D("QC_C4DC4","QC_C4DC4",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3020 tProfile = new TProfile2D("QC_DC2DC4","QC_DC2DC4",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3021 // qc transient
3022 tProfile = new TProfile2D("QC_pCos","QC_pCos",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3023 tProfile = new TProfile2D("QC_pSin","QC_pSin",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3024 tProfile = new TProfile2D("QC_qCos","QC_qCos",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3025 tProfile = new TProfile2D("QC_qSin","QC_qSin",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3026 tProfile = new TProfile2D("QC_q2hCos","QC_q2hCos",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3027 tProfile = new TProfile2D("QC_q2hSin","QC_q2hSin",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass,"s"); tList->Add( tProfile ); tProfile->Sumw2();
3028 // measurements
3029 tH2D = new TH2D("SP_vnVZEA","SP_vnVZEA",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3030 tH2D = new TH2D("SP_vnVZEC","SP_vnVZEC",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3031 tH2D = new TH2D("SP_vnTPCA","SP_vnTPCA",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3032 tH2D = new TH2D("SP_vnTPCC","SP_vnTPCC",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3033 tH2D = new TH2D("QC_Cum2","QC_Cum2",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3034 tH2D = new TH2D("QC_Cum4","QC_Cum4",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3035 tH2D = new TH2D("QC_DCum2","QC_DCum2",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3036 tH2D = new TH2D("QC_DCum4","QC_DCum4",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3037 tH2D = new TH2D("SP_vnVZEGA","SP_vnVZEGA",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3038 tH2D = new TH2D("SP_vnVZEWA","SP_vnVZEWA",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3039 tH2D = new TH2D("SP_vnTPCAA","SP_vnTPCAA",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3040 tH2D = new TH2D("QC_vn2","QC_vn2",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3041 tH2D = new TH2D("QC_vn4","QC_vn4",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tH2D );
3042 if(fReadMC) {
3043 tProfile = new TProfile2D("MC_COSNDPHI","MC_COSNDPHI",fPtBins,fPtBinEdge,fMassBins,fMinMass,fMaxMass); tList->Add( tProfile );
3044 }
3045}
3046//=======================================================================
3047TList* AliAnalysisTaskFlowStrangee::RebinDecayVn(Int_t nbins, Int_t *bins) {
3048 TList *out = new TList();
3049 out->SetOwner();
3050 out->SetName( fList->GetName() );
3051
3052 TList *ori, *end;
3053
3054 ori = (TList*) fList->FindObject("Event");
3055 out->Add( ori );
3056
3057 ori = (TList*) fList->FindObject("MakeQSpy");
3058 out->Add( ori );
3059
3060 ori = (TList*) fList->FindObject("V0SAllVn");
3061 end = RebinDecayVn(ori,nbins,bins);
3062 end->SetName( ori->GetName() ); out->Add( end );
3063
3064 ori = (TList*) fList->FindObject("V0SSelVn");
3065 end = RebinDecayVn(ori,nbins,bins);
3066 end->SetName( ori->GetName() ); out->Add( end );
3067
3068 if(fReadMC) {
3069 ori = (TList*) fList->FindObject("V0SMthVn");
3070 end = RebinDecayVn(ori,nbins,bins);
3071 end->SetName( ori->GetName() ); out->Add( end );
3072
3073 ori = (TList*) fList->FindObject("V0SMthPosPosVn");
3074 end = RebinDecayVn(ori,nbins,bins);
3075 end->SetName( ori->GetName() ); out->Add( end );
3076
3077 ori = (TList*) fList->FindObject("V0SMthNegNegVn");
3078 end = RebinDecayVn(ori,nbins,bins);
3079 end->SetName( ori->GetName() ); out->Add( end );
3080
3081 ori = (TList*) fList->FindObject("V0SMthPosNegVn");
3082 end = RebinDecayVn(ori,nbins,bins);
3083 end->SetName( ori->GetName() ); out->Add( end );
3084
3085 ori = (TList*) fList->FindObject("V0SUnMthVn");
3086 end = RebinDecayVn(ori,nbins,bins);
3087 end->SetName( ori->GetName() ); out->Add( end );
3088 }
3089
3090 return out;
3091}
3092//=======================================================================
3093TList* AliAnalysisTaskFlowStrangee::RebinDecayVn(TList *tList,Int_t nbins, Int_t *bins) {
3094 // getting expected number of mass bins
3095 int sum=0;
3096 for(int i=0; i!=nbins; ++i) sum += bins[i];
3097
3098 TList *list = new TList();
3099 list->SetOwner();
3100
3101 Int_t npt;
3102 Double_t pt[200], mass[200];
3103 TH2D *tH2D;
3104
3105 tH2D = ((TH2D*)tList->FindObject( "DecayYield_PtMass" ));
3106 list->Add(tH2D); //keeping it as it is
3107 int nmassbins = tH2D->GetNbinsY();
3108 //consistency check
3109 if( nmassbins!=sum ) {
3110 printf("Error: incompatible binning %d vs %d\nBYE\n",nmassbins,sum);
3111 return NULL;
3112 }
3113 //reading pts
3114 npt = tH2D->GetNbinsX();
3115 for(int i=0; i!=npt+1; ++i) pt[i] = tH2D->GetXaxis()->GetBinLowEdge(i+1);
3116 //making mass bins
3117 for(int i=0,j=0; i!=nbins+1; ++i) {
3118 mass[i] = tH2D->GetYaxis()->GetBinLowEdge(j+1);
3119 j += bins[i];
3120 }
3121 //TProfile2D migrating info
3122 TProfile2D *tProfileOld, *tProfileNew;
3123 TString tprofiles[31] = {"DecayAvgPt_PtMass","SP_uVZEA","SP_uVZEC","SP_VZEAVZEC","SP_VZEATPC",
3124 "SP_VZECTPC","SP_uVZEAuVZEC","SP_uVZEAVZEAVZEC","SP_uVZECVZEAVZEC","SP_uTPCA",
3125 "SP_uTPCC","SP_TPCATPCC","SP_uTPCATPCATPCC","SP_uTPCCTPCATPCC","QC_C2",
3126 "QC_C4","QC_DC2","QC_DC4","QC_C2C4","QC_C2DC2",
3127 "QC_C2DC4","QC_C4DC2","QC_C4DC4","QC_DC2DC4","QC_pCos",
3128 "QC_pSin","QC_qCos","QC_qSin","QC_q2hCos","QC_q2hSin",
3129 "MC_COSNDPHI"};
3130 for(int i=0; i!=31; ++i) {
3131 tProfileOld = (TProfile2D*) tList->FindObject( tprofiles[i].Data() );
3132 if(!tProfileOld) continue;
3133 TArrayD *oldsw2 = tProfileOld->GetSumw2();
3134 TArrayD *oldbsw2 = tProfileOld->GetBinSumw2();
3135 tProfileNew = new TProfile2D( tprofiles[i].Data(), tprofiles[i].Data(),
3136 npt,pt,nbins,mass,"s");
3137 tProfileNew->Sumw2();
3138 list->Add( tProfileNew );
3139 TArrayD *newsw2 = tProfileNew->GetSumw2();
3140 TArrayD *newbsw2 = tProfileNew->GetBinSumw2();
3141 for(int x=1; x!=tProfileOld->GetNbinsX()+1; ++x) { //pt
3142 for(int y=1; y!=tProfileNew->GetNbinsY()+1; ++y) { //mass
3143 Double_t sContent=0;
3144 Double_t sEntries=0;
3145 Double_t sSqWeigh=0;
3146 Double_t sSqBWeig=0;
3147 Int_t binnew = tProfileNew->GetBin(x,y);
3148 Double_t minmass = tProfileNew->GetYaxis()->GetBinLowEdge( y );
3149 Double_t maxmass = tProfileNew->GetYaxis()->GetBinLowEdge( y+1 );
3150 Int_t minbin = tProfileOld->GetYaxis()->FindBin( minmass+1e-10 );
3151 Int_t maxbin = tProfileOld->GetYaxis()->FindBin( maxmass-1e-10 );
3152 for(int k=minbin; k!=maxbin+1; ++k) {
3153 Int_t binold = tProfileOld->GetBin(x,k);
3154 Double_t wk = tProfileOld->GetBinEntries( binold );
3155 Double_t yk = tProfileOld->GetBinContent( binold );
3156 sEntries += wk;
3157 sContent += wk*yk;
3158 sSqWeigh += oldsw2->At(binold);
3159 if(oldbsw2->GetSize()) sSqBWeig += oldbsw2->At(binold);
3160 }
3161 tProfileNew->SetBinEntries( binnew, sEntries );
3162 tProfileNew->SetBinContent( binnew, sContent );
3163 newsw2->SetAt(sSqWeigh, binnew);
3164 if(oldbsw2->GetSize()) newbsw2->SetAt(sSqBWeig, binnew);
3165 }
3166 }
3167 tProfileOld = NULL;
3168 }
3169 //TH2D all new blank
3170 TString th2ds[15] = {"QC_HisPt_P","QC_HistPt_Q","SP_vnVZEA","SP_vnVZEC","SP_vnTPCA",
3171 "SP_vnTPCC","QC_Cum2","QC_Cum4","QC_DCum2","QC_DCum4",
3172 "SP_vnVZEGA","SP_vnVZEWA","SP_vnTPCAA","QC_vn2","QC_vn4"};
3173 for(int i=0; i!=15; ++i) {
3174 tH2D = new TH2D( th2ds[i].Data(),th2ds[i].Data(),
3175 npt,pt,nbins,mass);
3176 list->Add(tH2D);
3177 }
3178 return list;
3179
3180 //int nmass = tH2Dold->GetNbinsY();
3181
3182 /*
3183 // decay
3184 TString nam[38] = {
3185 for(int i=0; i!=38; ++i) {
3186 tProfile = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( nam[i].Data() ));
3187 if(i==o) { // binning
3188 nxs = tProfile->GetXaxis()->GetNbins();
3189 nys = tProfile->GetYaxis()->GetNbins();
3190 if(pt) {
3191 nxs = nbins;
3192 *nx = *bins;
3193 for(int y=0; y!=nys; ++y)
3194 ny[y] = tProfile->GetYaxis()->GetBinLowEdge(y+1);
3195 } else {
3196 nys = nbins;
3197 *ny = *bins;
3198 for(int x=0; x!=nxs; ++x)
3199 nx[x] = tProfile->GetXaxis()->GetBinLowEdge(x+1);
3200 }
3201 }
3202 tProfileNew = new TProfile2D(tProfile->GetName(),tProfile->GetTitle(),nxs,nx,nys,ny,"s"); list->Add( tProfileNew );
3203 if(pt) {
3204 for(int y=0; y!=nys; ++y) {
3205
3206 for(int x=0; x!=nxs; ++x) {
3207 }
3208 }
3209 } else {
3210
3211 }
3212 }
3213 */
3214}
3215//=======================================================================
3216void AliAnalysisTaskFlowStrangee::QCStoreTrackVn(TString name) {
3217 // getting transients
3218 TProfile *pCos = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_pCos" ));
3219 TProfile *pSin = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_pSin" ));
3220 TProfile *qCos = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_qCos" ));
3221 TProfile *qSin = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_qSin" ));
3222 TProfile *q2hCos = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_q2hCos" ));
3223 TProfile *q2hSin = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_q2hSin" ));
3224 if(fDebug) {
3225 printf("**QCStoreTrackVn( %s )\n",name.Data());
3226 printf(" Read %.0f entries in p set and %.0f entries in q set\n",pCos->GetEntries(),qCos->GetEntries());
3227 printf(" pCos[5] %.16f | pSin[5] %.16f \n", pCos->GetBinContent(5), pSin->GetBinContent(5));
3228 printf(" qCos[5] %.16f | qSin[5] %.16f \n", qCos->GetBinContent(5), qSin->GetBinContent(5));
3229 printf(" q2hCos[5] %.16f | q2hSin[5] %.16f \n", q2hCos->GetBinContent(5), q2hSin->GetBinContent(5));
3230 }
3231 // filling {2} and {4} correlator
3232 TProfile *c2 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2" ));
3233 TProfile *c4 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C4" ));
3234 TProfile *dc2 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DC2" ));
3235 TProfile *dc4 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DC4" ));
3236 TProfile *c2c4 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2C4" ));
3237 TProfile *c2dc2 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2DC2" ));
3238 TProfile *c2dc4 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2DC4" ));
3239 TProfile *c4dc2 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C4DC2" ));
3240 TProfile *c4dc4 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C4DC4" ));
3241 TProfile *dc2dc4 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DC2DC4" ));
3242 double tpc_qcos = fQTPCACos + fQTPCCCos;
3243 double tpc_qsin = fQTPCASin + fQTPCCSin;
3244 double tpc_qsqr = tpc_qcos*tpc_qcos + tpc_qsin*tpc_qsin;
3245 double tpc_q2hsqr = fQTPC2hCos*fQTPC2hCos + fQTPC2hSin*fQTPC2hSin;
3246 double tpc_qmul = fQTPCA + fQTPCC;
3247 int n = c2->GetNbinsX();
3248 for(int i=1; i!=n+1; ++i) {
3249 double mp = pCos->GetBinEntries( i );
3250 if( mp<1 ) { if(fDebug>2) printf(" bin %d:: mp (%.16f) < 1!\n",i,mp); continue; }
3251 double mm1 = tpc_qmul*(tpc_qmul-1);
3252 if( mm1<1e-100 ) { if(fDebug>2) printf(" bin %d:: mm1<1e-100!\n",i); continue; }
3253 double mq = qCos->GetBinEntries( i );
3254 double mpmmq = mp*tpc_qmul-mq;
3255 if( mpmmq<1e-100 ) { if(fDebug>2) printf(" bin %d:: mpmmq<1e-100!\n",i); continue; }
3256 double pt = c2->GetBinCenter( i );
3257 double pcos = pCos->GetBinContent( i )*mp;
3258 double psin = pSin->GetBinContent( i )*mp;
3259 double qcos = qCos->GetBinContent( i )*mq;
3260 double qsin = qSin->GetBinContent( i )*mq;
3261 double q2hcos = q2hCos->GetBinContent( i )*mq;
3262 double q2hsin = q2hSin->GetBinContent( i )*mq;
3263 double pQ = pcos*tpc_qcos+psin*tpc_qsin;
3264 double q2nQnQn = (qcos*tpc_qcos + qsin*tpc_qsin)*tpc_qcos + (qsin*tpc_qcos-qcos*tpc_qsin)*tpc_qsin;
3265 double pnQnQ2n = (pcos*tpc_qcos - psin*tpc_qsin)*fQTPC2hCos + (psin*tpc_qcos+pcos*tpc_qsin)*fQTPC2hSin;
3266 double tC2 = (tpc_qsqr-tpc_qmul)/mm1;
3267 double tDC2 = (pQ-mq)/mpmmq;
3268 c2->Fill( pt, tC2, mm1 );
3269 dc2->Fill( pt, tDC2, mpmmq );
3270 c2dc2->Fill( pt, tC2*tDC2, mm1*mpmmq );
3271 double mm1m2m3 = tpc_qmul*(tpc_qmul-1)*(tpc_qmul-2)*(tpc_qmul-3);
3272 if(mm1m2m3<1e-100) continue;
3273 double mpm3mqm1m2 = (mp*tpc_qmul-3*mq)*(tpc_qmul-1)*(tpc_qmul-2);
3274 if(mpm3mqm1m2<1e-100) continue;
3275 double req2hqnqn = fQTPC2hCos*(tpc_qcos*tpc_qcos-tpc_qsin*tpc_qsin)+2*fQTPC2hSin*tpc_qcos*tpc_qsin;
3276 double tC4 = (tpc_qsqr*tpc_qsqr + tpc_q2hsqr - 2*req2hqnqn - 2*(2*tpc_qsqr*(tpc_qmul-2)-tpc_qmul*(tpc_qmul-3)))/mm1m2m3;
3277 double tDC4 = pQ*tpc_qsqr -q2nQnQn -pnQnQ2n -2*(tpc_qmul-1)*pQ -2*mq*(tpc_qsqr-tpc_qmul+3) +6*(qcos*tpc_qcos+qsin*tpc_qsin) +(q2hcos*fQTPC2hCos+q2hsin*fQTPC2hSin);
3278 tDC4 /= mpm3mqm1m2;
3279 c4->Fill( pt, tC4, mm1m2m3 );
3280 dc4->Fill( pt, tDC4, mpm3mqm1m2 );
3281 c2c4->Fill( pt, tC2*tC4, mm1*mm1m2m3 );
3282 c2dc4->Fill( pt, tC2*tDC4, mm1*mpm3mqm1m2 );
3283 c4dc2->Fill( pt, tC4*tDC2, mm1m2m3*mpmmq );
3284 c4dc4->Fill( pt, tC4*tDC4, mm1m2m3*mpm3mqm1m2 );
3285 dc2dc4->Fill( pt, tDC2*tDC4, mpmmq*mpm3mqm1m2 );
3286 }
3287 // clean for next event
3288 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_qCos" ))->Reset();
3289 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_qSin" ))->Reset();
3290 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_q2hCos" ))->Reset();
3291 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_q2hSin" ))->Reset();
3292 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_pCos" ))->Reset();
3293 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_pSin" ))->Reset();
3294}
3295//=======================================================================
3296void AliAnalysisTaskFlowStrangee::QCStoreDecayVn(TString name) {
3297 // getting transients
3298 TProfile2D *pCos = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_pCos" ));
3299 TProfile2D *pSin = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_pSin" ));
3300 TProfile2D *qCos = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_qCos" ));
3301 TProfile2D *qSin = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_qSin" ));
3302 TProfile2D *q2hCos = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_q2hCos" ));
3303 TProfile2D *q2hSin = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_q2hSin" ));
3304 if(fDebug) {
3305 printf("**QCStoreTrackVn( %s )\n",name.Data());
3306 printf(" Read %.0f entries in p set and %.0f entries in q set\n",pCos->GetEntries(),qCos->GetEntries());
3307 printf(" pCos[5][5] %.16f | pSin[5][5] %.16f \n", pCos->GetBinContent(5,5), pSin->GetBinContent(5,5));
3308 printf(" qCos[5][5] %.16f | qSin[5][5] %.16f \n", qCos->GetBinContent(5,5), qSin->GetBinContent(5,5));
3309 printf(" q2hCos[5][5] %.16f | q2hSin[5][5] %.16f \n", q2hCos->GetBinContent(5,5), q2hSin->GetBinContent(5,5));
3310 }
3311 // filling {2} and {4} correlator
3312 TProfile2D *c2 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2" ));
3313 TProfile2D *c4 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C4" ));
3314 TProfile2D *dc2 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DC2" ));
3315 TProfile2D *dc4 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DC4" ));
3316 TProfile2D *c2c4 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2C4" ));
3317 TProfile2D *c2dc2 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2DC2" ));
3318 TProfile2D *c2dc4 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2DC4" ));
3319 TProfile2D *c4dc2 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C4DC2" ));
3320 TProfile2D *c4dc4 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C4DC4" ));
3321 TProfile2D *dc2dc4 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DC2DC4" ));
3322 double tpc_qcos = fQTPCACos + fQTPCCCos;
3323 double tpc_qsin = fQTPCASin + fQTPCCSin;
3324 double tpc_qsqr = tpc_qcos*tpc_qcos + tpc_qsin*tpc_qsin;
3325 double tpc_q2hsqr = fQTPC2hCos*fQTPC2hCos + fQTPC2hSin*fQTPC2hSin;
3326 double tpc_qmul = fQTPCA + fQTPCC;
3327 int n = c2->GetNbinsX();
3328 int m = c2->GetNbinsY();
3329 for(int i=1; i!=n+1; ++i) {
3330 double pt = c2->GetXaxis()->GetBinCenter( i );
3331 for(int j=1; j!=m+1; ++j) {
3332 double ms = c2->GetYaxis()->GetBinCenter( j );
3333 int k = pCos->GetBin(i,j);
3334 double mp = pCos->GetBinEntries( k );
3335 if( mp<1 ) { if(fDebug>2) printf(" bin %d,%d:: mp (%.16f) < 1!\n",i,j,mp); continue; }
3336 double mm1 = tpc_qmul*(tpc_qmul-1);
3337 if( mm1<1e-100 ) { if(fDebug>2) printf(" bin %d,%d:: mm1<1e-100!\n",i,j); continue; }
3338 double mq = qCos->GetBinEntries( k );
3339 double mpmmq = mp*tpc_qmul-mq;
3340 if( mpmmq<1e-100 ) { if(fDebug>2) printf(" bin %d,%d:: mpmmq<1e-100!\n",i,j); continue; }
3341 double pcos = pCos->GetBinContent( i,j )*mp;
3342 double psin = pSin->GetBinContent( i,j )*mp;
3343 double qcos = qCos->GetBinContent( i,j )*mq;
3344 double qsin = qSin->GetBinContent( i,j )*mq;
3345 double q2hcos = q2hCos->GetBinContent( i,j )*mq;
3346 double q2hsin = q2hSin->GetBinContent( i,j )*mq;
3347 double pQ = pcos*tpc_qcos+psin*tpc_qsin;
3348 double q2nQnQn = (qcos*tpc_qcos + qsin*tpc_qsin)*tpc_qcos + (qsin*tpc_qcos-qcos*tpc_qsin)*tpc_qsin;
3349 double pnQnQ2n = (pcos*tpc_qcos - psin*tpc_qsin)*fQTPC2hCos + (psin*tpc_qcos+pcos*tpc_qsin)*fQTPC2hSin;
3350 double tC2 = (tpc_qsqr-tpc_qmul)/mm1;
3351 double tDC2 = (pQ-mq)/mpmmq;
3352 c2->Fill( pt, ms, tC2, mm1 );
3353 dc2->Fill( pt, ms, tDC2, mpmmq );
3354 c2dc2->Fill( pt, ms, tC2*tDC2, mm1*mpmmq );
3355 double mm1m2m3 = tpc_qmul*(tpc_qmul-1)*(tpc_qmul-2)*(tpc_qmul-3);
3356 if(mm1m2m3<1e-100) continue;
3357 double mpm3mqm1m2 = (mp*tpc_qmul-3*mq)*(tpc_qmul-1)*(tpc_qmul-2);
3358 if(mpm3mqm1m2<1e-100) continue;
3359 double req2hqnqn = fQTPC2hCos*(tpc_qcos*tpc_qcos-tpc_qsin*tpc_qsin)+2*fQTPC2hSin*tpc_qcos*tpc_qsin;
3360 double tC4 = (tpc_qsqr*tpc_qsqr + tpc_q2hsqr - 2*req2hqnqn - 2*(2*tpc_qsqr*(tpc_qmul-2)-tpc_qmul*(tpc_qmul-3)))/mm1m2m3;
3361 double tDC4 = pQ*tpc_qsqr -q2nQnQn -pnQnQ2n -2*(tpc_qmul-1)*pQ -2*mq*(tpc_qsqr-tpc_qmul+3) +6*(qcos*tpc_qcos+qsin*tpc_qsin) +(q2hcos*fQTPC2hCos+q2hsin*fQTPC2hSin);
3362 tDC4 /= mpm3mqm1m2;
3363 c4->Fill( pt, ms, tC4, mm1m2m3 );
3364 dc4->Fill( pt, ms, tDC4, mpm3mqm1m2 );
3365 c2c4->Fill( pt, ms, tC2*tC4, mm1*mm1m2m3 );
3366 c2dc4->Fill( pt, ms, tC2*tDC4, mm1*mpm3mqm1m2 );
3367 c4dc2->Fill( pt, ms, tC4*tDC2, mm1m2m3*mpmmq );
3368 c4dc4->Fill( pt, ms, tC4*tDC4, mm1m2m3*mpm3mqm1m2 );
3369 dc2dc4->Fill( pt, ms, tDC2*tDC4, mpmmq*mpm3mqm1m2 );
3370 }
3371 }
3372 // clean for next event
3373 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_qCos" ))->Reset();
3374 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_qSin" ))->Reset();
3375 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_q2hCos" ))->Reset();
3376 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_q2hSin" ))->Reset();
3377 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_pCos" ))->Reset();
3378 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_pSin" ))->Reset();
3379}
3380//=======================================================================
3381void AliAnalysisTaskFlowStrangee::FillTrackVn(TString name,Double_t pt,Double_t phi,Double_t eta,Int_t fid) {
3382 // reading vze qm
3383 Double_t vzec_qmcos = fQVZECCos/fQVZEC;
3384 Double_t vzec_qmsin = fQVZECSin/fQVZEC;
3385 Double_t vzea_qmcos = fQVZEACos/fQVZEA;
3386 Double_t vzea_qmsin = fQVZEASin/fQVZEA;
3387 // reading tpc qm
3388 Double_t tpcc_qmcos = fQTPCCCos/fQTPCC;
3389 Double_t tpcc_qmsin = fQTPCCSin/fQTPCC;
3390 Double_t tpca_qmcos = fQTPCACos/fQTPCA;
3391 Double_t tpca_qmsin = fQTPCASin/fQTPCA;
3392 Double_t qtpc = fQTPCA+fQTPCC;
3393 Double_t tpc_qmcos = (fQTPCACos+fQTPCCCos)/qtpc;
3394 Double_t tpc_qmsin = (fQTPCASin+fQTPCCSin)/qtpc;
3395 // computing u
3396 Double_t cosn = TMath::Cos(fHarmonic*phi);
3397 Double_t sinn = TMath::Sin(fHarmonic*phi);
3398 Double_t cos2n = TMath::Cos(2.0*fHarmonic*phi);
3399 Double_t sin2n = TMath::Sin(2.0*fHarmonic*phi);
3400 // Scalar Product
3401 Double_t uQ, uQa, uQc, qaqc;
3402 // filling flow with vze
3403 qaqc = (vzea_qmcos*vzec_qmcos + vzea_qmsin*vzec_qmsin);
3404 uQa = (cosn*vzea_qmcos + sinn*vzea_qmsin);
3405 uQc = (cosn*vzec_qmcos + sinn*vzec_qmsin);
3406 Double_t cosmc = TMath::Cos( fHarmonic*GetMCDPHI(phi) );
3407 if(fReadMC) {
3408 ((TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "MC_COSNDPHI_uQVZEA" ))->Fill( cosmc,uQa );
3409 ((TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "MC_COSNDPHI_uQVZEC" ))->Fill( cosmc,uQc );
3410 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "MC_COSNDPHI" ))->Fill( pt,cosmc );
3411 }
3412 Double_t qaqt = (vzea_qmcos*tpc_qmcos + vzea_qmsin*tpc_qmsin);
3413 Double_t qcqt = (vzec_qmcos*tpc_qmcos + vzec_qmsin*tpc_qmsin);
3414 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEA" ))->Fill( pt,uQa,fQVZEA );
3415 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEC" ))->Fill( pt,uQc,fQVZEC );
3416 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_VZEAVZEC" ))->Fill( pt,qaqc,fQVZEA*fQVZEC );
3417 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_VZEATPC" ))->Fill( pt,qaqt,fQVZEA*qtpc );
3418 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_VZECTPC" ))->Fill( pt,qcqt,fQVZEC*qtpc );
3419 // error vze
3420 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEAuVZEC" ))->Fill( pt,uQa*uQc,fQVZEA*fQVZEC );
3421 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEAVZEAVZEC" ))->Fill( pt,uQa*qaqc,fQVZEA*fQVZEA*fQVZEC );
3422 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZECVZEAVZEC" ))->Fill( pt,uQc*qaqc,fQVZEC*fQVZEA*fQVZEC );
3423 // filling flow with tpc
3424 qaqc = (tpca_qmcos*tpcc_qmcos + tpca_qmsin*tpcc_qmsin);
3425 if(eta<0) {
3426 uQ = (cosn*tpca_qmcos + sinn*tpca_qmsin);
3427 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCA" ))->Fill( pt,uQ,fQTPCA );
3428 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCATPCATPCC" ))->Fill( pt,uQ*qaqc,fQTPCA*fQTPCA*fQTPCC );
3429 if(fReadMC) {
3430 ((TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "MC_COSNDPHI_uQTPCA" ))->Fill( cosmc,uQ );
3431 }
3432 } else {
3433 uQ = (cosn*tpcc_qmcos + sinn*tpcc_qmsin);
3434 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCC" ))->Fill( pt,uQ,fQTPCC );
3435 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCCTPCATPCC" ))->Fill( pt,uQ*qaqc,fQTPCC*fQTPCA*fQTPCC );
3436 if(fReadMC) {
3437 ((TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "MC_COSNDPHI_uQTPCC" ))->Fill( cosmc,uQ );
3438 }
3439 }
3440 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_TPCATPCC" ))->Fill( pt,qaqc,fQTPCA*fQTPCC );
3441 // QC
3442 ((TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_HistPt_P" ))->Fill( pt );
3443 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_pCos" ))->Fill( pt, cosn, 1.0 );
3444 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_pSin" ))->Fill( pt, sinn, 1.0 );
3445 if(InQTPC(fid)) {
3446 ((TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_HistPt_Q" ))->Fill( pt );
3447 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_qCos" ))->Fill( pt, cosn, 1.0 );
3448 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_qSin" ))->Fill( pt, sinn, 1.0 );
3449 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_q2hCos" ))->Fill( pt, cos2n, 1.0 );
3450 ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_q2hSin" ))->Fill( pt, sin2n, 1.0 );
3451 }
3452}
3453//=======================================================================
3454void AliAnalysisTaskFlowStrangee::FillDecayVn(TString name,Double_t ms,Double_t pt,Double_t phi,Double_t eta,Int_t fid1,Int_t fid2) {
3455 ((TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "DecayYield_PtMass" ))->Fill( pt,ms );
3456 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "DecayAvgPt_PtMass" ))->Fill( pt,ms,pt );
3457
3458 // reading vze qm
3459 Double_t vzec_qmcos = fQVZECCos/fQVZEC;
3460 Double_t vzec_qmsin = fQVZECSin/fQVZEC;
3461 Double_t vzea_qmcos = fQVZEACos/fQVZEA;
3462 Double_t vzea_qmsin = fQVZEASin/fQVZEA;
3463 // reading tpc qm
3464 Double_t tpcc_qmcos = fQTPCCCos/fQTPCC;
3465 Double_t tpcc_qmsin = fQTPCCSin/fQTPCC;
3466 Double_t tpca_qmcos = fQTPCACos/fQTPCA;
3467 Double_t tpca_qmsin = fQTPCASin/fQTPCA;
3468 Double_t qtpc = fQTPCA+fQTPCC;
3469 Double_t tpc_qmcos = (fQTPCACos+fQTPCCCos)/qtpc;
3470 Double_t tpc_qmsin = (fQTPCASin+fQTPCCSin)/qtpc;
3471 // computing u
3472 Double_t cosn = TMath::Cos(fHarmonic*phi);
3473 Double_t sinn = TMath::Sin(fHarmonic*phi);
3474 Double_t cos2n = TMath::Cos(2.0*fHarmonic*phi);
3475 Double_t sin2n = TMath::Sin(2.0*fHarmonic*phi);
3476 // Scalar Product
3477 Double_t uQ, uQa, uQc, qaqc;
3478 // filling flow with vze
3479 qaqc = (vzea_qmcos*vzec_qmcos + vzea_qmsin*vzec_qmsin);
3480 uQa = (cosn*vzea_qmcos + sinn*vzea_qmsin);
3481 uQc = (cosn*vzec_qmcos + sinn*vzec_qmsin);
3482 Double_t cosmc = TMath::Cos( fHarmonic*GetMCDPHI(phi) );
3483 if(fReadMC) {
3484 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "MC_COSNDPHI" ))->Fill( pt,ms,cosmc );
3485 }
3486 Double_t qaqt = (vzea_qmcos*tpc_qmcos + vzea_qmsin*tpc_qmsin);
3487 Double_t qcqt = (vzec_qmcos*tpc_qmcos + vzec_qmsin*tpc_qmsin);
3488 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEA" ))->Fill( pt,ms,uQa,fQVZEA );
3489 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEC" ))->Fill( pt,ms,uQc,fQVZEC );
3490 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_VZEAVZEC" ))->Fill( pt,ms,qaqc,fQVZEA*fQVZEC );
3491 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_VZEATPC" ))->Fill( pt,ms,qaqt,fQVZEA*qtpc );
3492 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_VZECTPC" ))->Fill( pt,ms,qcqt,fQVZEC*qtpc );
3493 // error vze
3494 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEAuVZEC" ))->Fill( pt,ms,uQa*uQc,fQVZEA*fQVZEC );
3495 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEAVZEAVZEC" ))->Fill( pt,ms,uQa*qaqc,fQVZEA*fQVZEA*fQVZEC );
3496 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZECVZEAVZEC" ))->Fill( pt,ms,uQc*qaqc,fQVZEC*fQVZEA*fQVZEC );
3497 // filling flow with tpc
3498 qaqc = (tpca_qmcos*tpcc_qmcos + tpca_qmsin*tpcc_qmsin);
3499 if(eta<0) {
3500 uQ = (cosn*tpca_qmcos + sinn*tpca_qmsin);
3501 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCA" ))->Fill( pt,ms,uQ,fQTPCA );
3502 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCATPCATPCC" ))->Fill( pt,ms,uQ*qaqc,fQTPCA*fQTPCA*fQTPCC );
3503 } else {
3504 uQ = (cosn*tpcc_qmcos + sinn*tpcc_qmsin);
3505 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCC" ))->Fill( pt,ms,uQ,fQTPCC );
3506 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCCTPCATPCC" ))->Fill( pt,ms,uQ*qaqc,fQTPCC*fQTPCA*fQTPCC );
3507 }
3508 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_TPCATPCC" ))->Fill( pt,ms,qaqc,fQTPCA*fQTPCC );
3509 // QC
3510 ((TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_HistPt_P" ))->Fill( pt,ms );
3511 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_pCos" ))->Fill( pt, ms, cosn, 1.0 );
3512 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_pSin" ))->Fill( pt, ms, sinn, 1.0 );
3513 if(InQTPC(fid1)||InQTPC(fid2)) {
3514 ((TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_HistPt_Q" ))->Fill( pt,ms );
3515 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_qCos" ))->Fill( pt, ms, cosn, 1.0 );
3516 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_qSin" ))->Fill( pt, ms, sinn, 1.0 );
3517 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_q2hCos" ))->Fill( pt, ms, cos2n, 1.0 );
3518 ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_q2hSin" ))->Fill( pt, ms, sin2n, 1.0 );
3519 }
3520}
3521//=======================================================================
3522Bool_t AliAnalysisTaskFlowStrangee::InQTPC(Int_t id) {
3523 Bool_t ret = kFALSE;
3524 for(int i=0; i!=fQTPCA_nTracks; ++i)
3525 if(fQTPCA_fID[i]==id) {
3526 ret=kTRUE;
3527 break;
3528 }
3529 if(ret) return kTRUE;
3530 for(int i=0; i!=fQTPCC_nTracks; ++i)
3531 if(fQTPCC_fID[i]==id) {
3532 ret=kTRUE;
3533 break;
3534 }
3535 return ret;
3536}
3537//=======================================================================
3538void AliAnalysisTaskFlowStrangee::ComputeTrackVn(TString name) {
3539 TProfile *uQa, *uQc, *qaqc, *uQaqaqc, *uQcqaqc;
3540 TArrayD *pasww, *pbsww, *pcsww;
3541 //ScalarProducr TPC
3542 printf("<<%s>> SP TPC\n",name.Data());
3543 uQa = (TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCA" );
3544 uQc = (TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCC" );
3545 qaqc = (TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_TPCATPCC" );
3546 uQaqaqc = (TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCATPCATPCC" );
3547 uQcqaqc = (TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCCTPCATPCC" );
3548 pasww = uQa->GetBinSumw2();
3549 pbsww = uQc->GetBinSumw2();
3550 pcsww = qaqc->GetBinSumw2();
3551 //
3552 TH1D *sptpca = (TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnTPCA" );
3553 TH1D *sptpcc = (TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnTPCC" );
3554 TH1D *sptpcaa = (TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnTPCAA" );
3555 //
3556 for(Int_t i=1; i!=sptpcaa->GetNbinsX()+1; ++i) {
3557 sptpcaa->SetBinContent(i,0);
3558 sptpcaa->SetBinError(i,0);
3559 sptpca->SetBinContent(i,0);
3560 sptpca->SetBinError(i,0);
3561 sptpcc->SetBinContent(i,0);
3562 sptpcc->SetBinError(i,0);
3563 double a = uQa->GetBinContent(i);
3564 double b = uQc->GetBinContent(i);
3565 double c = qaqc->GetBinContent(i);
3566 //if(TMath::AreEqualAbs(a,0,1e-100)) continue;
3567 //if(TMath::AreEqualAbs(b,0,1e-100)) continue;
3568 if(c<1e-100) continue;
3569 // nominal sptpca
3570 double vna = a/TMath::Sqrt(c);
3571 sptpca->SetBinContent(i,vna);
3572 // nominal sptpcc
3573 double vnc = b/TMath::Sqrt(c);
3574 sptpcc->SetBinContent(i,vnc);
3575 // nominal sptpc
3576 double vn = (vna + vnc)/2.0;
3577 sptpcaa->SetBinContent(i,vn);
3578 // errors
3579 double asw = uQa->GetBinEntries(i);
3580 double bsw = uQc->GetBinEntries(i);
3581 double csw = qaqc->GetBinEntries(i);
3582 if(asw<1e-100||bsw<1e-100||csw<1e-100) continue;
3583 double asww = pasww->At(i);
3584 double bsww = pbsww->At(i);
3585 double csww = pcsww->At(i);
3586 if(asww<1e-100||bsww<1e-100||csww<1e-100) continue;
3587 if((1<1e-100+asww/asw/asw)||(1<1e-100+bsww/bsw/bsw)||(1<1e-100+csww/csw/csw)) continue;
3588 if(TMath::AreEqualAbs(asww,asw*asw,1e-100)||
3589 TMath::AreEqualAbs(bsww,bsw*bsw,1e-100)||
3590 TMath::AreEqualAbs(csww,csw*csw,1e-100)) continue;
3591 double ac = uQaqaqc->GetBinContent(i);
3592 double bc = uQcqaqc->GetBinContent(i);
3593 double acsw = uQaqaqc->GetBinEntries(i);
3594 double bcsw = uQcqaqc->GetBinEntries(i);
3595 double ea = uQa->GetBinError(i)*TMath::Sqrt(asww)/asw/TMath::Sqrt(1-asww/asw/asw);
3596 double eb = uQc->GetBinError(i)*TMath::Sqrt(bsww)/bsw/TMath::Sqrt(1-bsww/bsw/bsw);
3597 double ec = qaqc->GetBinError(i)*TMath::Sqrt(csww)/csw/TMath::Sqrt(1-csww/csw/csw);
3598 //printf("%d >> ea^2 %.16f |||| asww %.16f | asw %.16f | 1-asww/asw/asw %.16f \n", i,ea, asww, asw, 1-asww/asw/asw);
3599 //printf("%d >> eb^2 %.16f |||| bsww %.16f | bsw %.16f | 1-bsww/bsw/bsw %.16f \n", i,eb, bsww, bsw, 1-bsww/bsw/bsw);
3600 //printf("%d >> ec^2 %.16f |||| csww %.16f | csw %.16f | 1-csww/csw/csw %.16f \n", i,ec, csww, csw, 1-csww/csw/csw);
3601 double ebc = (bc-b*c)/(1-bcsw/bsw/csw)*bcsw/bsw/csw;
3602 double eac = (ac-a*c)/(1-acsw/asw/csw)*acsw/asw/csw;
3603 double evna = 1.0/TMath::Abs(c) * ( ea*ea + vna*vna/TMath::Abs(c)/4.0*ec*ec - vna/TMath::Sqrt(c)*eac );
3604 double evnc = 1.0/TMath::Abs(c) * ( eb*eb + vnc*vnc/TMath::Abs(c)/4.0*ec*ec - vnc/TMath::Sqrt(c)*ebc );
3605 //printf("%d >> evna^2 %.16f |||| ea %.16f | ec %.16f | eac %.16f | c %.16f\n", i,evna, ea, ec, eac,c);
3606 //printf("%d >> evnc^2 %.16f |||| eb %.16f | ec %.16f | ebc %.16f | c %.16f\n", i,evnc, eb, ec, ebc,c);
3607 if(evna>1e-100) evna = TMath::Sqrt(evna); else evna=0;
3608 if(evnc>1e-100) evnc = TMath::Sqrt(evnc); else evnc=0;
3609 sptpca->SetBinError(i,evna);
3610 sptpcc->SetBinError(i,evnc);
3611 sptpcaa->SetBinError(i,TMath::Sqrt(evna*evna+evnc*evnc)/2.0);
3612 }
3613 //ScalarProduct VZE
3614 printf("<<%s>> SP VZE\n",name.Data());
3615 double cvzea2 = ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("ChiSquaredVZEA"))->GetBinContent( 1 );
3616 double cvzec2 = ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("ChiSquaredVZEC"))->GetBinContent( 1 );
3617 if( TMath::AreEqualAbs(cvzea2+cvzec2,0,1e-100) ) return;
3618 uQa = (TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEA" );
3619 uQc = (TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEC" );
3620 qaqc = (TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_VZEAVZEC" );
3621 uQaqaqc = (TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEAVZEAVZEC" );
3622 uQcqaqc = (TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZECVZEAVZEC" );
3623 pasww = uQa->GetBinSumw2();
3624 pbsww = uQc->GetBinSumw2();
3625 pcsww = qaqc->GetBinSumw2();
3626 //
3627 TProfile *qaqt = (TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_VZEATPC" );
3628 TProfile *qcqt = (TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_VZECTPC" );
3629 TProfile *uQauQc = (TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEAuVZEC" );
3630 //
3631 TH1D *spvzea = (TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnVZEA" );
3632 TH1D *spvzec = (TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnVZEC" );
3633 TH1D *spvzega = (TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnVZEGA" );
3634 TH1D *spvzewa = (TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnVZEWA" );
3635 for(Int_t i=1; i!=spvzewa->GetNbinsX()+1; ++i) {
3636 spvzega->SetBinContent(i,0);
3637 spvzega->SetBinError(i,0);
3638 spvzewa->SetBinContent(i,0);
3639 spvzewa->SetBinError(i,0);
3640 spvzea->SetBinContent(i,0);
3641 spvzea->SetBinError(i,0);
3642 spvzec->SetBinContent(i,0);
3643 spvzec->SetBinError(i,0);
3644 double asw = uQa->GetBinEntries(i);
3645 double bsw = uQc->GetBinEntries(i);
3646 double csw = qaqc->GetBinEntries(i);
3647 if(asw<1e-1||bsw<1e-1||csw<1e-1) continue;
3648 double asww = pasww->At(i);
3649 double bsww = pbsww->At(i);
3650 double csww = pcsww->At(i);
3651 if(asww<1e-1||bsww<1e-1||csww<1e-1) continue;
3652 if((1<asww/asw/asw)||(1<bsww/bsw/bsw)||(1<csww/csw/csw)) continue;
3653 double a = uQa->GetBinContent(i);
3654 double b = uQc->GetBinContent(i);
3655 double c = qaqc->GetBinContent(i);
3656 double at = qaqt->GetBinContent(i);
3657 double bt = qcqt->GetBinContent(i);
3658 if(TMath::AreEqualAbs(a,0,1e-10)) continue;
3659 if(TMath::AreEqualAbs(b,0,1e-10)) continue;
3660 if(TMath::AreEqualAbs(c,0,1e-10)) continue;
3661 if(TMath::AreEqualAbs(at,0,1e-10)) continue;
3662 if(TMath::AreEqualAbs(bt,0,1e-10)) continue;
3663 // nominal spvzea
3664 double aa = c*at/bt;
3665 if(aa<1e-100) continue;
3666 double vna = a/TMath::Sqrt(aa);
3667 spvzea->SetBinContent(i,vna);
3668 // nominal spvzec
3669 double bb = c*bt/at;
3670 if(bb<1e-100) continue;
3671 double vnc = b/TMath::Sqrt(bb);
3672 spvzec->SetBinContent(i,vnc);
3673 //nominal spvzewa
3674 double vnwa = (cvzea2*vna + cvzec2*vnc) / (cvzea2+cvzec2);
3675 spvzewa->SetBinContent(i,vnwa);
3676 // nominal spvzega
3677 double vnga = a*b/c;
3678 if(vnga<1e-100) continue;
3679 vnga = TMath::Sqrt(vnga);
3680 spvzega->SetBinContent(i,vnga);
3681 // errors
3682 double ab = uQauQc->GetBinContent(i);
3683 double ac = uQaqaqc->GetBinContent(i);
3684 double bc = uQcqaqc->GetBinContent(i);
3685 double absw = uQauQc->GetBinEntries(i);
3686 double acsw = uQaqaqc->GetBinEntries(i);
3687 double bcsw = uQcqaqc->GetBinEntries(i);
3688 double ea = uQa->GetBinError(i)*TMath::Sqrt(asww)/asw/TMath::Sqrt(1-asww/asw/asw);
3689 double eb = uQc->GetBinError(i)*TMath::Sqrt(bsww)/bsw/TMath::Sqrt(1-bsww/bsw/bsw);
3690 double ec = qaqc->GetBinError(i)*TMath::Sqrt(csww)/csw/TMath::Sqrt(1-csww/csw/csw);
3691 if(TMath::AreEqualAbs(1,absw/asw/bsw,1e-100)||TMath::AreEqualAbs(1,bcsw/bsw/csw,1e-100)||TMath::AreEqualAbs(1,acsw/asw/csw,1e-100)) continue;
3692 double eab = (ab-a*b)/(1-absw/asw/bsw)*absw/asw/bsw;
3693 double ebc = (bc-b*c)/(1-bcsw/bsw/csw)*bcsw/bsw/csw;
3694 double eac = (ac-a*c)/(1-acsw/asw/csw)*acsw/asw/csw;
3695 double nc, nec, neac, nebc;
3696 nc = c*at/bt;
3697 nec = ec*at/bt;
3698 neac = eac*at/bt;
3699 nebc = ebc*at/bt;
3700 double evna = 1.0/TMath::Abs(nc*nc*nc) * ( nc*nc*ea*ea + a*a/4.0*nec*nec - a*TMath::Abs(nc)*neac*neac );
3701 nc = c*bt/at;
3702 nec = ec*bt/at;
3703 neac = eac*bt/at;
3704 nebc = ebc*bt/at;
3705 double evnc = 1.0/TMath::Abs(nc*nc*nc) * ( nc*nc*eb*eb + b*b/4.0*nec*nec - b*TMath::Abs(nc)*nebc*nebc );
3706 if(evna>1e-100) evna = TMath::Sqrt(evna); else evna=0;
3707 if(evnc>1e-100) evnc = TMath::Sqrt(evnc); else evnc=0;
3708 spvzea->SetBinError(i,evna);
3709 spvzec->SetBinError(i,evnc);
3710 double evnwa = TMath::Sqrt( cvzea2*cvzea2*evna*evna + cvzec2*cvzec2*evnc*evnc )/(cvzea2+cvzec2);
3711 spvzewa->SetBinError(i,evnwa);
3712 double evnga = 0.25/c/c * ( TMath::Abs(b*c/a)*ea*ea + TMath::Abs(a*c/b)*eb*eb + TMath::Abs(a*b/c)*ec*ec + 2*c*eab - 2*a*ebc - 2*b*eac );
3713 if(evnga>1e-100) evnga = TMath::Sqrt(evnga); else evnga=0;
3714 spvzega->SetBinError(i,evnga);
3715 }
3716 printf("<<%s>> QC TPC\n",name.Data());
3717 //Qcumulants
3718 TH1D *resC2 = (TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_Cum2" );
3719 TH1D *resC4 = (TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_Cum4" );
3720 TH1D *resDC2= (TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DCum2" );
3721 TH1D *resDC4= (TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DCum4" );
3722 TH1D *resvn2= (TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_vn2" );
3723 TH1D *resvn4= (TH1D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_vn4" );
3724 //correlators
3725 TProfile *c2 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2" ));
3726 TProfile *c4 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C4" ));
3727 TProfile *dc2 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DC2" ));
3728 TProfile *dc4 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DC4" ));
3729 TProfile *c2c4 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2C4" ));
3730 TProfile *c2dc2 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2DC2" ));
3731 TProfile *c2dc4 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2DC4" ));
3732 TProfile *c4dc2 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C4DC2" ));
3733 TProfile *c4dc4 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C4DC4" ));
3734 TProfile *dc2dc4 = ((TProfile*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DC2DC4" ));
3735 TArrayD *c2sww = c2->GetBinSumw2();
3736 TArrayD *c4sww = c4->GetBinSumw2();
3737 TArrayD *dc2sww= dc2->GetBinSumw2();
3738 TArrayD *dc4sww= dc4->GetBinSumw2();
3739 for(Int_t i=1; i!=resvn2->GetNbinsX()+1; ++i) {
3740 // cn{2}
3741 double v_c2sw = c2->GetBinEntries(i);
3742 if(v_c2sw<1e-100) continue;
3743 double v_c2sww = c2sww->At(i);
3744 double v_c2 = c2->GetBinContent(i);
3745 double e_c2 = TMath::Sqrt(v_c2sww)/v_c2sw*c2->GetBinError(i);
3746 double cum2 = v_c2;
3747 double ecum2= e_c2;
3748 resC2->SetBinContent(i, cum2 );
3749 resC2->SetBinError(i, ecum2 );
3750 // cn{4}
3751 double v_c4sw = c4->GetBinEntries(i);
3752 if(v_c4sw<1e-100) continue;
3753 double v_c4sww = c4sww->At(i);
3754 double v_c4 = c4->GetBinContent(i);
3755 double e_c4 = TMath::Sqrt(v_c4sww)/v_c4sw*c4->GetBinError(i);
3756 double v_c2c4 = c2c4->GetBinContent(i);
3757 double v_c2c4sw = c2c4->GetBinEntries(i);
3758 if(TMath::AreEqualAbs(v_c2c4sw/v_c2sw/v_c4sw,1,1e-100)) continue;
3759 double covc2c4 = v_c2c4sw/v_c2sw/v_c4sw*(v_c2c4 - v_c2*v_c4)/(1-v_c2c4sw/v_c2sw/v_c4sw);
3760 double cum4 = v_c4 - 2*v_c2*v_c2;
3761 double ecum4= 16.0*v_c2*v_c2*e_c2*e_c2 + e_c4*e_c4 - 8.0*v_c2*covc2c4;
3762 if(ecum4<1e-100) continue;
3763 ecum4 = TMath::Sqrt( ecum4 );
3764 resC4->SetBinContent(i, cum4 );
3765 resC4->SetBinError(i, ecum4 );
3766 // dn{2}
3767 double v_dc2sw = dc2->GetBinEntries(i);
3768 if(v_dc2sw<1) continue;
3769 double v_dc2 = dc2->GetBinContent(i);
3770 double v_dc2sww = dc2sww->At(i);
3771 double e_dc2 = TMath::Sqrt(v_dc2sww)/v_dc2sw*dc2->GetBinError(i);
3772 double dcum2 = v_dc2;
3773 double edcum2= e_dc2;
3774 resDC2->SetBinContent(i, dcum2 );
3775 resDC2->SetBinError(i, edcum2 );
3776 // v2{2}
3777 if(v_c2<1e-100) continue;
3778 double dv22 = v_dc2/TMath::Sqrt(v_c2);
3779 double v_c2dc2 = c2dc2->GetBinContent(i);
3780 double v_c2dc2sw = c2dc2->GetBinEntries(i);
3781 if(TMath::AreEqualAbs(v_c2dc2sw/v_c2sw/v_dc2sw,1,1e-100)) continue;
3782 double covc2dc2 = v_c2dc2sw/v_c2sw/v_dc2sw*(v_c2dc2 - v_c2*v_dc2)/(1-v_c2dc2sw/v_c2sw/v_dc2sw);
3783 double edv22 = 0.25/v_c2/v_c2/v_c2*(v_dc2*v_dc2*e_c2*e_c2 + 4*v_c2*v_c2*e_dc2*e_dc2 - 4*v_c2*v_dc2*covc2dc2);
3784 //printf("%d >> dv22 %.16f || edv22^2 %.16f |||| v_c2dc2 %.16f | v_c2dc2sw %.16f | covc2dc2 %.16f \n", i,dv22,edv22,v_c2dc2,v_c2dc2sw,covc2dc2);
3785 if(edv22<1e-100) continue;
3786 edv22 = TMath::Sqrt(edv22);
3787 resvn2->SetBinContent(i,dv22);
3788 resvn2->SetBinError(i,edv22);
3789 // dn{4}
3790 double v_dc4sw = dc4->GetBinEntries(i);
3791 if(v_dc4sw<1) continue;
3792 double v_dc4 = dc4->GetBinContent(i);
3793 double v_dc4sww = dc4sww->At(i);
3794 double e_dc4 = TMath::Sqrt(v_dc4sww)/v_dc4sw*dc4->GetBinError(i);
3795 double dcum4 = v_dc4 - 2*v_c2*v_dc2;
3796 double v_c2dc4 = c2dc4->GetBinContent(i);
3797 double v_c2dc4sw = c2dc4->GetBinEntries(i);
3798 if(TMath::AreEqualAbs(v_c2dc4sw/v_c2sw/v_dc4sw,1,1e-100)) continue;
3799 double covc2dc4 = v_c2dc4sw/v_c2sw/v_dc4sw*(v_c2dc4 - v_c2*v_dc4)/(1-v_c2dc4sw/v_c2sw/v_dc4sw);
3800 double v_dc2dc4 = dc2dc4->GetBinContent(i);
3801 double v_dc2dc4sw = dc2dc4->GetBinEntries(i);
3802 if(TMath::AreEqualAbs(v_dc2dc4sw/v_dc2sw/v_dc4sw,1,1e-100)) continue;
3803 double covdc2dc4 = v_dc2dc4sw/v_dc2sw/v_dc4sw*(v_dc2dc4 - v_dc2*v_dc4)/(1-v_dc2dc4sw/v_dc2sw/v_dc4sw);
3804 double edcum4= ( +4.0*v_dc2*v_dc2*e_c2*e_c2
3805 +4.0*v_c2*v_c2*e_dc2*e_dc2
3806 +e_dc4*e_dc4
3807 +8.0*v_c2*v_dc2*covc2dc2
3808 -4.0*v_dc2*covc2dc4
3809 -4.0*v_c2*covdc2dc4 );
3810 if(edcum4<1e-100) continue;
3811 edcum4 = TMath::Sqrt(edcum4);
3812 resDC4->SetBinContent(i, dcum4 );
3813 resDC4->SetBinError(i, edcum4 );
3814 // v2{4}
3815 if(cum4>1e-100) continue;
3816 double dv24 = -dcum4/TMath::Power(-cum4,0.75);
3817 double dterm1 = 2*v_c2*v_c2*v_dc2 - 3*v_c2*v_dc4 + 2*v_c4*v_dc2;
3818 double dterm2 = 9.0/16.0*dcum4*dcum4;
3819 double dterm3 = 4.0*v_c2*v_c2*cum4*cum4;
3820 double dterm4 = cum4*cum4;
3821 double dterm5 = -3.0/2.0*dcum4*dterm1;
3822 double dterm6 = -4.0*v_c2*cum4*dterm1;
3823 double dterm7 = -2.0*cum4*dterm1;
3824 double dterm8 = 3.0*v_c2*cum4*dcum4;
3825 double dterm9 = 3.0/2.0*cum4*dcum4;
3826 double dterm10= 4*v_c2*cum4*cum4;
3827 double v_c4dc2 = c4dc2->GetBinContent(i);
3828 double v_c4dc2sw = c4dc2->GetBinEntries(i);
3829 if(TMath::AreEqualAbs(v_c4dc2sw/v_c4sw/v_dc2sw,1,1e-100)) continue;
3830 double covc4dc2 = v_c4dc2sw/v_c4sw/v_dc2sw*(v_c4dc2 - v_c4*v_dc2)/(1-v_c4dc2sw/v_c4sw/v_dc2sw);
3831 double v_c4dc4 = c4dc4->GetBinContent(i);
3832 double v_c4dc4sw = c4dc4->GetBinEntries(i);
3833 if(TMath::AreEqualAbs(v_c4dc4sw/v_c4sw/v_dc4sw,1,1e-100)) continue;
3834 double covc4dc4 = v_c4dc4sw/v_c4sw/v_dc4sw*(v_c4dc4 - v_c4*v_dc4)/(1-v_c4dc4sw/v_c4sw/v_dc4sw);
3835 double edv24= 1.0/TMath::Power(-cum4,3.5)*(+dterm1*dterm1*e_c2*e_c2
3836 +dterm2*e_c4*e_c4
3837 +dterm3*e_dc2*e_dc2
3838 +dterm4*e_dc4*e_dc4
3839 -dterm5*covc2c4
3840 -dterm6*covc2dc2
3841 +dterm7*covc2dc4
3842 +dterm8*covc4dc2
3843 -dterm9*covc4dc4
3844 -dterm10*covdc2dc4);
3845 if(edv24<1e-100) continue;
3846 edv24 = TMath::Sqrt(edv24);
3847 resvn4->SetBinContent(i,dv24);
3848 resvn4->SetBinError(i,edv24);
3849 }
3850}
3851//=======================================================================
3852void AliAnalysisTaskFlowStrangee::ComputeDecayVn(TString name) {
3853 TProfile2D *uQa, *uQc, *qaqc, *uQaqaqc, *uQcqaqc;
3854 TArrayD *pasww, *pbsww, *pcsww;
3855 //ScalarProducr TPC
3856 printf("<<%s>> SP TPC\n",name.Data());
3857 uQa = (TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCA" );
3858 uQc = (TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCC" );
3859 qaqc = (TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_TPCATPCC" );
3860 uQaqaqc = (TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCATPCATPCC" );
3861 uQcqaqc = (TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uTPCCTPCATPCC" );
3862 pasww = uQa->GetBinSumw2();
3863 pbsww = uQc->GetBinSumw2();
3864 pcsww = qaqc->GetBinSumw2();
3865 //
3866 TH2D *sptpca = (TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnTPCA" );
3867 TH2D *sptpcc = (TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnTPCC" );
3868 TH2D *sptpcaa = (TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnTPCAA" );
3869 //
3870 for(Int_t i=1; i!=sptpcaa->GetNbinsX()+1; ++i) {
3871 for(Int_t j=1; j!=sptpcaa->GetNbinsY()+1; ++j) {
3872 sptpcaa->SetBinContent(i,j,0);
3873 sptpcaa->SetBinError(i,j,0);
3874 sptpca->SetBinContent(i,j,0);
3875 sptpca->SetBinError(i,j,0);
3876 sptpcc->SetBinContent(i,j,0);
3877 sptpcc->SetBinError(i,j,0);
3878 double a = uQa->GetBinContent(i,j);
3879 double b = uQc->GetBinContent(i,j);
3880 double c = qaqc->GetBinContent(i,j);
3881 //if(TMath::AreEqualAbs(a,0,1e-100)) continue;
3882 //if(TMath::AreEqualAbs(b,0,1e-100)) continue;
3883 if(c<1e-100) {printf("skipping i=%d, j=%d due to c=%.16f\n",i,j,c); continue;}
3884 // nominal sptpca
3885 double vna = a/TMath::Sqrt(c);
3886 sptpca->SetBinContent(i,j,vna);
3887 // nominal sptpcc
3888 double vnc = b/TMath::Sqrt(c);
3889 sptpcc->SetBinContent(i,j,vnc);
3890 // nominal sptpc
3891 double vn = (vna + vnc)/2.0;
3892 sptpcaa->SetBinContent(i,j,vn);
3893 // errors
3894 int k = sptpcaa->GetBin(i,j);
3895 double asw = uQa->GetBinEntries(k);
3896 double bsw = uQc->GetBinEntries(k);
3897 double csw = qaqc->GetBinEntries(k);
3898 if(asw<1e-100||bsw<1e-100||csw<1e-100) {printf("skipping i=%d, j=%d due to asw=%f or bsw=%f or csw=%f\n",i,j,asw,bsw,csw); continue;}
3899 double asww = pasww->At(k);
3900 double bsww = pbsww->At(k);
3901 double csww = pcsww->At(k);
3902 if(asww<1e-100||bsww<1e-100||csww<1e-100) {printf("skipping i=%d, j=%d due to asww=%f or bsww=%f or csww=%f\n",i,j,asww,bsww,csww); continue;}
3903 if((1<1e-100+asww/asw/asw)||(1<1e-100+bsww/bsw/bsw)||(1<1e-100+csww/csw/csw)) {printf("skipping i=%d, j=%d due to COVa=%f or COVb=%f or COVc=%f\n",i,j,asww/asw/asw,bsww/bsw/bsw,csww/csw/csw); continue;}
3904 if(TMath::AreEqualAbs(asww,asw*asw,1e-100)||
3905 TMath::AreEqualAbs(bsww,bsw*bsw,1e-100)||
3906 TMath::AreEqualAbs(csww,csw*csw,1e-100)) {printf("skipping i=%d, j=%d due to funny coincidence\n",i,j); continue;}
3907 double ac = uQaqaqc->GetBinContent(i,j);
3908 double bc = uQcqaqc->GetBinContent(i,j);
3909 double acsw = uQaqaqc->GetBinEntries(k);
3910 double bcsw = uQcqaqc->GetBinEntries(k);
3911 double ea = uQa->GetBinError(i,j)*TMath::Sqrt(asww)/asw/TMath::Sqrt(1-asww/asw/asw);
3912 double eb = uQc->GetBinError(i,j)*TMath::Sqrt(bsww)/bsw/TMath::Sqrt(1-bsww/bsw/bsw);
3913 double ec = qaqc->GetBinError(i,j)*TMath::Sqrt(csww)/csw/TMath::Sqrt(1-csww/csw/csw);
3914 //printf("%d >> ea^2 %.16f |||| asww %.16f | asw %.16f | 1-asww/asw/asw %.16f \n", i,ea, asww, asw, 1-asww/asw/asw);
3915 //printf("%d >> eb^2 %.16f |||| bsww %.16f | bsw %.16f | 1-bsww/bsw/bsw %.16f \n", i,eb, bsww, bsw, 1-bsww/bsw/bsw);
3916 //printf("%d >> ec^2 %.16f |||| csww %.16f | csw %.16f | 1-csww/csw/csw %.16f \n", i,ec, csww, csw, 1-csww/csw/csw);
3917 double ebc = (bc-b*c)/(1-bcsw/bsw/csw)*bcsw/bsw/csw;
3918 double eac = (ac-a*c)/(1-acsw/asw/csw)*acsw/asw/csw;
3919 double evna = 1.0/TMath::Abs(c) * ( ea*ea + vna*vna/TMath::Abs(c)/4.0*ec*ec - vna/TMath::Sqrt(c)*eac );
3920 double evnc = 1.0/TMath::Abs(c) * ( eb*eb + vnc*vnc/TMath::Abs(c)/4.0*ec*ec - vnc/TMath::Sqrt(c)*ebc );
3921 //printf("%d >> evna^2 %.16f |||| ea %.16f | ec %.16f | eac %.16f | c %.16f\n", i,evna, ea, ec, eac,c);
3922 //printf("%d >> evnc^2 %.16f |||| eb %.16f | ec %.16f | ebc %.16f | c %.16f\n", i,evnc, eb, ec, ebc,c);
3923 if(evna>1e-100) evna = TMath::Sqrt(evna); else evna=0;
3924 if(evnc>1e-100) evnc = TMath::Sqrt(evnc); else evnc=0;
3925 sptpca->SetBinError(i,j,evna);
3926 sptpcc->SetBinError(i,j,evnc);
3927 sptpcaa->SetBinError(i,j,TMath::Sqrt(evna*evna+evnc*evnc)/2.0);
3928 }
3929 }
3930 //ScalarProduct VZE
3931 printf("<<%s>> SP VZE\n",name.Data());
3932 double cvzea2 = ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("ChiSquaredVZEA"))->GetBinContent( 1 );
3933 double cvzec2 = ((TH1D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("ChiSquaredVZEC"))->GetBinContent( 1 );
3934 if( TMath::AreEqualAbs(cvzea2+cvzec2,0,1e-100) ) return;
3935 uQa = (TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEA" );
3936 uQc = (TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEC" );
3937 qaqc = (TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_VZEAVZEC" );
3938 uQaqaqc = (TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEAVZEAVZEC" );
3939 uQcqaqc = (TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZECVZEAVZEC" );
3940 pasww = uQa->GetBinSumw2();
3941 pbsww = uQc->GetBinSumw2();
3942 pcsww = qaqc->GetBinSumw2();
3943 //
3944 TProfile2D *qaqt = (TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_VZEATPC" );
3945 TProfile2D *qcqt = (TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_VZECTPC" );
3946 TProfile2D *uQauQc = (TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_uVZEAuVZEC" );
3947 //
3948 TH2D *spvzea = (TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnVZEA" );
3949 TH2D *spvzec = (TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnVZEC" );
3950 TH2D *spvzega = (TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnVZEGA" );
3951 TH2D *spvzewa = (TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "SP_vnVZEWA" );
3952 for(Int_t i=1; i!=spvzewa->GetNbinsX()+1; ++i) {
3953 for(Int_t j=1; j!=spvzewa->GetNbinsY()+1; ++j) {
3954 spvzega->SetBinContent(i,j,0);
3955 spvzega->SetBinError(i,j,0);
3956 spvzewa->SetBinContent(i,j,0);
3957 spvzewa->SetBinError(i,j,0);
3958 spvzea->SetBinContent(i,j,0);
3959 spvzea->SetBinError(i,j,0);
3960 spvzec->SetBinContent(i,j,0);
3961 spvzec->SetBinError(i,j,0);
3962 double a = uQa->GetBinContent(i,j);
3963 double b = uQc->GetBinContent(i,j);
3964 double c = qaqc->GetBinContent(i,j);
3965 double at = qaqt->GetBinContent(i,j);
3966 double bt = qcqt->GetBinContent(i,j);
3967 if(TMath::AreEqualAbs(a,0,1e-100)) {printf("skipping A\n"); continue;}
3968 if(TMath::AreEqualAbs(b,0,1e-100)) {printf("skipping B\n"); continue;}
3969 if(TMath::AreEqualAbs(c,0,1e-100)) {printf("skipping C\n"); continue;}
3970 if(TMath::AreEqualAbs(at,0,1e-100)) {printf("skipping AT\n"); continue;}
3971 if(TMath::AreEqualAbs(bt,0,1e-100)) {printf("skipping CT\n"); continue;}
3972 // nominal spvzea
3973 double aa = c*at/bt;
3974 if(aa<1e-100) {printf("AA\n"); continue;}
3975 double vna = a/TMath::Sqrt(aa);
3976 spvzea->SetBinContent(i,j,vna);
3977 // nominal spvzec
3978 double bb = c*bt/at;
3979 if(bb<1e-100) {printf("BB\n"); continue;}
3980 double vnc = b/TMath::Sqrt(bb);
3981 spvzec->SetBinContent(i,j,vnc);
3982 //nominal spvzewa
3983 double vnwa = (cvzea2*vna + cvzec2*vnc) / (cvzea2+cvzec2);
3984 spvzewa->SetBinContent(i,j,vnwa);
3985 // nominal spvzega
3986 double vnga = a*b/c;
3987 if(vnga<1e-100) continue;
3988 vnga = TMath::Sqrt(vnga);
3989 spvzega->SetBinContent(i,j,vnga);
3990 // errors
3991 int k = spvzea->GetBin(i,j);
3992 double asw = uQa->GetBinEntries(k);
3993 double bsw = uQc->GetBinEntries(k);
3994 double csw = qaqc->GetBinEntries(k);
3995 if(asw<1e-100||bsw<1e-100||csw<1e-100) continue;
3996 double asww = pasww->At(k);
3997 double bsww = pbsww->At(k);
3998 double csww = pcsww->At(k);
3999 if(asww<1e-100||bsww<1e-100||csww<1e-100) continue;
4000 if((1<asww/asw/asw)||(1<bsww/bsw/bsw)||(1<csww/csw/csw)) continue;
4001 double ab = uQauQc->GetBinContent(i,j);
4002 double ac = uQaqaqc->GetBinContent(i,j);
4003 double bc = uQcqaqc->GetBinContent(i,j);
4004 double absw = uQauQc->GetBinEntries(k);
4005 double acsw = uQaqaqc->GetBinEntries(k);
4006 double bcsw = uQcqaqc->GetBinEntries(k);
4007 if(TMath::AreEqualAbs(1,absw/asw/bsw,1e-100)||TMath::AreEqualAbs(1,bcsw/bsw/csw,1e-100)||TMath::AreEqualAbs(1,acsw/asw/csw,1e-100)) continue;
4008 double ea = uQa->GetBinError(i,j)*TMath::Sqrt(asww)/asw/TMath::Sqrt(1-asww/asw/asw);
4009 double eb = uQc->GetBinError(i,j)*TMath::Sqrt(bsww)/bsw/TMath::Sqrt(1-bsww/bsw/bsw);
4010 double ec = qaqc->GetBinError(i,j)*TMath::Sqrt(csww)/csw/TMath::Sqrt(1-csww/csw/csw);
4011 double eab = (ab-a*b)/(1-absw/asw/bsw)*absw/asw/bsw;
4012 double ebc = (bc-b*c)/(1-bcsw/bsw/csw)*bcsw/bsw/csw;
4013 double eac = (ac-a*c)/(1-acsw/asw/csw)*acsw/asw/csw;
4014 double nc, nec, neac, nebc;
4015 nc = c*at/bt;
4016 nec = ec*at/bt;
4017 neac = eac*at/bt;
4018 nebc = ebc*at/bt;
4019 double evna = 1.0/TMath::Abs(nc*nc*nc) * ( nc*nc*ea*ea + a*a/4.0*nec*nec - a*TMath::Abs(nc)*neac*neac );
4020 nc = c*bt/at;
4021 nec = ec*bt/at;
4022 neac = eac*bt/at;
4023 nebc = ebc*bt/at;
4024 double evnc = 1.0/TMath::Abs(nc*nc*nc) * ( nc*nc*eb*eb + b*b/4.0*nec*nec - b*TMath::Abs(nc)*nebc*nebc );
4025 if(evna>1e-100) evna = TMath::Sqrt(evna); else evna=0;
4026 if(evnc>1e-100) evnc = TMath::Sqrt(evnc); else evnc=0;
4027 spvzea->SetBinError(i,j,evna);
4028 spvzec->SetBinError(i,j,evnc);
4029 double evnwa = TMath::Sqrt( cvzea2*cvzea2*evna*evna + cvzec2*cvzec2*evnc*evnc )/(cvzea2+cvzec2);
4030 spvzewa->SetBinError(i,j,evnwa);
4031 double evnga = 0.25/c/c * ( TMath::Abs(b*c/a)*ea*ea + TMath::Abs(a*c/b)*eb*eb + TMath::Abs(a*b/c)*ec*ec + 2*c*eab - 2*a*ebc - 2*b*eac );
4032 if(evnga>1e-100) evnga = TMath::Sqrt(evnga); else evnga=0;
4033 spvzega->SetBinError(i,j,evnga);
4034 }
4035 }
4036 printf("<<%s>> QC TPC\n",name.Data());
4037 //Qcumulants
4038 TH2D *resC2 = (TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_Cum2" );
4039 TH2D *resC4 = (TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_Cum4" );
4040 TH2D *resDC2= (TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DCum2" );
4041 TH2D *resDC4= (TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DCum4" );
4042 TH2D *resvn2= (TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_vn2" );
4043 TH2D *resvn4= (TH2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_vn4" );
4044 //correlators
4045 TProfile2D *c2 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2" ));
4046 TProfile2D *c4 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C4" ));
4047 TProfile2D *dc2 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DC2" ));
4048 TProfile2D *dc4 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DC4" ));
4049 TProfile2D *c2c4 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2C4" ));
4050 TProfile2D *c2dc2 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2DC2" ));
4051 TProfile2D *c2dc4 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C2DC4" ));
4052 TProfile2D *c4dc2 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C4DC2" ));
4053 TProfile2D *c4dc4 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_C4DC4" ));
4054 TProfile2D *dc2dc4 = ((TProfile2D*)((TList*)fList->FindObject(name.Data()))->FindObject( "QC_DC2DC4" ));
4055 TArrayD *c2sww = c2->GetBinSumw2();
4056 TArrayD *c4sww = c4->GetBinSumw2();
4057 TArrayD *dc2sww= dc2->GetBinSumw2();
4058 TArrayD *dc4sww= dc4->GetBinSumw2();
4059 for(Int_t i=1; i!=resvn2->GetNbinsX()+1; ++i) {
4060 for(Int_t j=1; j!=resvn2->GetNbinsY()+1; ++j) {
4061 // cn{2}
4062 int k = c2->GetBin(i,j);
4063 double v_c2sw = c2->GetBinEntries(k);
4064 if(v_c2sw<1e-100) continue;
4065 double v_c2sww = c2sww->At(k);
4066 double v_c2 = c2->GetBinContent(i,j);
4067 double e_c2 = TMath::Sqrt(v_c2sww)/v_c2sw*c2->GetBinError(i,j);
4068 double cum2 = v_c2;
4069 double ecum2= e_c2;
4070 resC2->SetBinContent(i,j, cum2 );
4071 resC2->SetBinError(i,j, ecum2 );
4072 // cn{4}
4073 double v_c4sw = c4->GetBinEntries(k);
4074 if(v_c4sw<1e-100) continue;
4075 double v_c4sww = c4sww->At(k);
4076 double v_c4 = c4->GetBinContent(i,j);
4077 double e_c4 = TMath::Sqrt(v_c4sww)/v_c4sw*c4->GetBinError(i,j);
4078 double v_c2c4 = c2c4->GetBinContent(i,j);
4079 double v_c2c4sw = c2c4->GetBinEntries(k);
4080 if(TMath::AreEqualAbs(v_c2c4sw/v_c2sw/v_c4sw,1,1e-100)) continue;
4081 double covc2c4 = v_c2c4sw/v_c2sw/v_c4sw*(v_c2c4 - v_c2*v_c4)/(1-v_c2c4sw/v_c2sw/v_c4sw);
4082 double cum4 = v_c4 - 2*v_c2*v_c2;
4083 double ecum4= 16.0*v_c2*v_c2*e_c2*e_c2 + e_c4*e_c4 - 8.0*v_c2*covc2c4;
4084 if(ecum4<1e-100) continue;
4085 ecum4 = TMath::Sqrt( ecum4 );
4086 resC4->SetBinContent(i,j, cum4 );
4087 resC4->SetBinError(i,j, ecum4 );
4088 // dn{2}
4089 double v_dc2sw = dc2->GetBinEntries(k);
4090 if(v_dc2sw<1) continue;
4091 double v_dc2 = dc2->GetBinContent(i,j);
4092 double v_dc2sww = dc2sww->At(k);
4093 double e_dc2 = TMath::Sqrt(v_dc2sww)/v_dc2sw*dc2->GetBinError(i,j);
4094 double dcum2 = v_dc2;
4095 double edcum2= e_dc2;
4096 resDC2->SetBinContent(i,j, dcum2 );
4097 resDC2->SetBinError(i,j, edcum2 );
4098 // v2{2}
4099 if(v_c2<1e-100) continue;
4100 double dv22 = v_dc2/TMath::Sqrt(v_c2);
4101 double v_c2dc2 = c2dc2->GetBinContent(i,j);
4102 double v_c2dc2sw = c2dc2->GetBinEntries(k);
4103 if(TMath::AreEqualAbs(v_c2dc2sw/v_c2sw/v_dc2sw,1,1e-100)) continue;
4104 double covc2dc2 = v_c2dc2sw/v_c2sw/v_dc2sw*(v_c2dc2 - v_c2*v_dc2)/(1-v_c2dc2sw/v_c2sw/v_dc2sw);
4105 double edv22 = 0.25/v_c2/v_c2/v_c2*(v_dc2*v_dc2*e_c2*e_c2 + 4*v_c2*v_c2*e_dc2*e_dc2 - 4*v_c2*v_dc2*covc2dc2);
4106 //printf("%d >> dv22 %.16f || edv22^2 %.16f |||| v_c2dc2 %.16f | v_c2dc2sw %.16f | covc2dc2 %.16f \n", i,dv22,edv22,v_c2dc2,v_c2dc2sw,covc2dc2);
4107 if(edv22<1e-100) continue;
4108 edv22 = TMath::Sqrt(edv22);
4109 resvn2->SetBinContent(i,j,dv22);
4110 resvn2->SetBinError(i,j,edv22);
4111 // dn{4}
4112 double v_dc4sw = dc4->GetBinEntries(k);
4113 if(v_dc4sw<1) continue;
4114 double v_dc4 = dc4->GetBinContent(i,j);
4115 double v_dc4sww = dc4sww->At(k);
4116 double e_dc4 = TMath::Sqrt(v_dc4sww)/v_dc4sw*dc4->GetBinError(i,j);
4117 double dcum4 = v_dc4 - 2*v_c2*v_dc2;
4118 double v_c2dc4 = c2dc4->GetBinContent(i,j);
4119 double v_c2dc4sw = c2dc4->GetBinEntries(k);
4120 if(TMath::AreEqualAbs(v_c2dc4sw/v_c2sw/v_dc4sw,1,1e-100)) continue;
4121 double covc2dc4 = v_c2dc4sw/v_c2sw/v_dc4sw*(v_c2dc4 - v_c2*v_dc4)/(1-v_c2dc4sw/v_c2sw/v_dc4sw);
4122 double v_dc2dc4 = dc2dc4->GetBinContent(i,j);
4123 double v_dc2dc4sw = dc2dc4->GetBinEntries(k);
4124 if(TMath::AreEqualAbs(v_dc2dc4sw/v_dc2sw/v_dc4sw,1,1e-100)) continue;
4125 double covdc2dc4 = v_dc2dc4sw/v_dc2sw/v_dc4sw*(v_dc2dc4 - v_dc2*v_dc4)/(1-v_dc2dc4sw/v_dc2sw/v_dc4sw);
4126 double edcum4= ( +4.0*v_dc2*v_dc2*e_c2*e_c2
4127 +4.0*v_c2*v_c2*e_dc2*e_dc2
4128 +e_dc4*e_dc4
4129 +8.0*v_c2*v_dc2*covc2dc2
4130 -4.0*v_dc2*covc2dc4
4131 -4.0*v_c2*covdc2dc4 );
4132 if(edcum4<1e-100) continue;
4133 edcum4 = TMath::Sqrt(edcum4);
4134 resDC4->SetBinContent(i,j, dcum4 );
4135 resDC4->SetBinError(i,j, edcum4 );
4136 // v2{4}
4137 if(cum4>1e-100) continue;
4138 double dv24 = -dcum4/TMath::Power(-cum4,0.75);
4139 double dterm1 = 2*v_c2*v_c2*v_dc2 - 3*v_c2*v_dc4 + 2*v_c4*v_dc2;
4140 double dterm2 = 9.0/16.0*dcum4*dcum4;
4141 double dterm3 = 4.0*v_c2*v_c2*cum4*cum4;
4142 double dterm4 = cum4*cum4;
4143 double dterm5 = -3.0/2.0*dcum4*dterm1;
4144 double dterm6 = -4.0*v_c2*cum4*dterm1;
4145 double dterm7 = -2.0*cum4*dterm1;
4146 double dterm8 = 3.0*v_c2*cum4*dcum4;
4147 double dterm9 = 3.0/2.0*cum4*dcum4;
4148 double dterm10= 4*v_c2*cum4*cum4;
4149 double v_c4dc2 = c4dc2->GetBinContent(i,j);
4150 double v_c4dc2sw = c4dc2->GetBinEntries(k);
4151 if(TMath::AreEqualAbs(v_c4dc2sw/v_c4sw/v_dc2sw,1,1e-100)) continue;
4152 double covc4dc2 = v_c4dc2sw/v_c4sw/v_dc2sw*(v_c4dc2 - v_c4*v_dc2)/(1-v_c4dc2sw/v_c4sw/v_dc2sw);
4153 double v_c4dc4 = c4dc4->GetBinContent(i,j);
4154 double v_c4dc4sw = c4dc4->GetBinEntries(k);
4155 if(TMath::AreEqualAbs(v_c4dc4sw/v_c4sw/v_dc4sw,1,1e-100)) continue;
4156 double covc4dc4 = v_c4dc4sw/v_c4sw/v_dc4sw*(v_c4dc4 - v_c4*v_dc4)/(1-v_c4dc4sw/v_c4sw/v_dc4sw);
4157 double edv24= 1.0/TMath::Power(-cum4,3.5)*(+dterm1*dterm1*e_c2*e_c2
4158 +dterm2*e_c4*e_c4
4159 +dterm3*e_dc2*e_dc2
4160 +dterm4*e_dc4*e_dc4
4161 -dterm5*covc2c4
4162 -dterm6*covc2dc2
4163 +dterm7*covc2dc4
4164 +dterm8*covc4dc2
4165 -dterm9*covc4dc4
4166 -dterm10*covdc2dc4);
4167 if(edv24<1e-100) continue;
4168 edv24 = TMath::Sqrt(edv24);
4169 resvn4->SetBinContent(i,j,dv24);
4170 resvn4->SetBinError(i,j,edv24);
4171 }
4172 }
4173}
4174
4175//=======================================================================
4176void AliAnalysisTaskFlowStrangee::OpenToyModel() {
4177 fList = new TList();
4178 fList->SetOwner();
4179
4180 TList *tList;
4181 tList=new TList(); tList->SetName("ToyVn"); tList->SetOwner(); AddDecayVn(tList); fList->Add(tList);
4182 AddMakeQSpy();
4183
4184 fRFPAminEta=-0.9;
4185 fRFPAmaxEta=0.0;
4186 fRFPCminEta=0.0;
4187 fRFPCmaxEta=+0.9;
4188}
4189//=======================================================================
4190void AliAnalysisTaskFlowStrangee::CloseToyModel() {
4191 ComputeChi2VZERO();
4192 ComputeDecayVn("ToyVn");
4193}
4194//=======================================================================
4195void AliAnalysisTaskFlowStrangee::MakeToyEvent( Int_t seed, Int_t m_decay,Double_t v_decay,
4196 Double_t mass_decay_mu,Double_t mass_decay_sg,
4197 Int_t m_bgr,Double_t v_bgr,
4198 Int_t mtpc_a,Double_t v_tpca,Int_t mtpc_c,Double_t v_tpcc,
4199 Int_t mvze_a,Double_t v_vzea,Int_t mvze_c,Double_t v_vzec ) {
4200 gRandom->SetSeed( seed );
4201 // QVectors
4202 fMCEP = gRandom->Rndm()*TMath::Pi();
4203 TF1 tf1_tpca( "dphitpca", Form("1+2*%f*TMath::Cos(2*x)",v_tpca),0,TMath::TwoPi() );
4204 TF1 tf1_tpcc( "dphitpcc", Form("1+2*%f*TMath::Cos(2*x)",v_tpcc),0,TMath::TwoPi() );
4205 TF1 tf1_vzea( "dphivzea", Form("1+2*%f*TMath::Cos(2*x)",v_vzea),0,TMath::TwoPi() );
4206 TF1 tf1_vzec( "dphivzec", Form("1+2*%f*TMath::Cos(2*x)",v_vzec),0,TMath::TwoPi() );
4207 TF1 tf1_decay( "dphidecay", Form("1+2*%f*TMath::Cos(2*x)",v_decay),0,TMath::TwoPi() );
4208 TF1 tf1_bgr( "dphibgr", Form("1+2*%f*TMath::Cos(2*x)",v_bgr),0,TMath::TwoPi() );
4209 Double_t phi, eta;
4210 fQTPCACos=fQTPCASin=fQTPCA=0;
4211 fQTPCCCos=fQTPCCSin=fQTPCC=0;
4212 fQTPC2hCos=fQTPC2hSin=0;
4213 fQVZEACos=fQVZEASin=fQVZEA=0;
4214 fQVZECCos=fQVZECSin=fQVZEC=0;
4215 for(int m=0; m!=mtpc_a; ++m) {
4216 phi = tf1_tpca.GetRandom() + fMCEP;
4217 if(phi>TMath::TwoPi()) phi -= TMath::TwoPi();
4218 eta = gRandom->Rndm()*(fRFPAmaxEta-fRFPAminEta)+fRFPAminEta;
4219 fQTPCACos += TMath::Cos(fHarmonic*phi);
4220 fQTPCASin += TMath::Sin(fHarmonic*phi);
4221 fQTPCA += 1;
4222 fQTPC2hCos += TMath::Cos(2*fHarmonic*phi);
4223 fQTPC2hSin += TMath::Sin(2*fHarmonic*phi);
4224 fQTPCA_fID[m] = -99;
4225 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCAllPhiEta"))->Fill( phi, eta );
4226 }
4227 for(int m=0; m!=mtpc_c; ++m) {
4228 phi = tf1_tpcc.GetRandom() + fMCEP;
4229 if(phi>TMath::TwoPi()) phi -= TMath::TwoPi();
4230 eta = gRandom->Rndm()*(fRFPCmaxEta-fRFPCminEta)+fRFPCminEta;
4231 fQTPCCCos += TMath::Cos(fHarmonic*phi);
4232 fQTPCCSin += TMath::Sin(fHarmonic*phi);
4233 fQTPCC += 1;
4234 fQTPC2hCos += TMath::Cos(2*fHarmonic*phi);
4235 fQTPC2hSin += TMath::Sin(2*fHarmonic*phi);
4236 fQTPCC_fID[m] = -99;
4237 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("TPCAllPhiEta"))->Fill( phi, eta );
4238 }
4239 for(int m=0; m!=mvze_a; ++m) {
4240 phi = tf1_vzea.GetRandom() + fMCEP;
4241 if(phi>TMath::TwoPi()) phi -= TMath::TwoPi();
4242 eta = gRandom->Rndm()*2-3.5;
4243 fQVZEACos += TMath::Cos(fHarmonic*phi);
4244 fQVZEASin += TMath::Sin(fHarmonic*phi);
4245 fQVZEA += 1;
4246 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEAllPhiEta"))->Fill( phi, eta );
4247 }
4248 for(int m=0; m!=mvze_c; ++m) {
4249 phi = tf1_vzec.GetRandom() + fMCEP;
4250 if(phi>TMath::TwoPi()) phi -= TMath::TwoPi();
4251 eta = gRandom->Rndm()*2+2.5;
4252 fQVZECCos += TMath::Cos(fHarmonic*phi);
4253 fQVZECSin += TMath::Sin(fHarmonic*phi);
4254 fQVZEC += 1;
4255 ((TH2D*)((TList*)fList->FindObject("MakeQSpy"))->FindObject("VZEAllPhiEta"))->Fill( phi, eta );
4256 }
4257 fQTPCA_nTracks = mtpc_a;
4258 fQTPCC_nTracks = mtpc_c;
4259 FillMakeQSpy();
4260
4261 //decays
4262 double ptrange = fPtBinEdge[fPtBins] - fPtBinEdge[0];
4263 double pt, mass;
4264 for(int m=0; m!=m_decay; ++m) {
4265 phi = tf1_decay.GetRandom() + fMCEP;
4266 if(phi>TMath::TwoPi()) phi -= TMath::TwoPi();
4267 eta = gRandom->Rndm()*1.6-0.8;
4268 pt = gRandom->Rndm()*ptrange + fPtBinEdge[0];
4269 mass = gRandom->Gaus(mass_decay_mu,mass_decay_sg);
4270 FillDecayVn("ToyVn",mass,pt,phi,eta,+999,+999);
4271 }
4272 for(int m=0; m!=m_bgr; ++m) {
4273 phi = tf1_bgr.GetRandom() + fMCEP;
4274 if(phi>TMath::TwoPi()) phi -= TMath::TwoPi();
4275 eta = gRandom->Rndm()*1.6-0.8;
4276 pt = gRandom->Rndm()*ptrange + fPtBinEdge[0];
4277 mass = gRandom->Rndm()*(fMaxMass-fMinMass)+fMinMass;
4278 FillDecayVn("ToyVn",mass,pt,phi,eta,+999,+999);
4279 }
4280 QCStoreDecayVn("ToyVn");
4281
4282}