]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGCF/FEMTOSCOPY/Chaoticity/AliChaoticity.cxx
Fixes for ROOT trunk - #error is seen by Cling-based rootcint
[u/mrichter/AliRoot.git] / PWGCF / FEMTOSCOPY / Chaoticity / AliChaoticity.cxx
CommitLineData
cd12341d 1#include <iostream>
2#include <math.h>
3#include "TChain.h"
4#include "TFile.h"
5#include "TKey.h"
6#include "TObject.h"
7#include "TObjString.h"
8#include "TList.h"
9#include "TTree.h"
10#include "TH1F.h"
11#include "TH1D.h"
12#include "TH2D.h"
13#include "TH3D.h"
14#include "TProfile.h"
15#include "TProfile2D.h"
16#include "TCanvas.h"
17#include "TRandom3.h"
18#include "TF1.h"
19
20#include "AliAnalysisTask.h"
21#include "AliAnalysisManager.h"
22
23
24#include "AliESDEvent.h"
25#include "AliESDInputHandler.h"
26#include "AliESDtrackCuts.h"
27
28#include "AliAODEvent.h"
29#include "AliAODInputHandler.h"
30#include "AliAODMCParticle.h"
31
32#include "AliChaoticity.h"
33
34#define PI 3.1415927
35#define G_Coeff 0.006399 // 2*pi*alpha*M_pion
05db4376 36#define kappa3 0.24 // kappa3 Edgeworth coefficient (non-Gaussian features of C2)
37#define kappa4 0.16 // kappa4 Edgeworth coefficient (non-Gaussian features of C2)
cd12341d 38
39
40// Author: Dhevan Gangadharan
41
42ClassImp(AliChaoticity)
43
44//________________________________________________________________________
45AliChaoticity::AliChaoticity():
46AliAnalysisTaskSE(),
47 fname(0),
48 fAOD(0x0),
cd12341d 49 fOutputList(0x0),
50 fPIDResponse(0x0),
51 fEC(0x0),
52 fEvt(0x0),
53 fTempStruct(0x0),
54 fRandomNumber(0x0),
55 fLEGO(kTRUE),
56 fMCcase(kFALSE),
57 fAODcase(kTRUE),
58 fPbPbcase(kTRUE),
654866df 59 fGenerateSignal(kFALSE),
cd12341d 60 fPdensityExplicitLoop(kFALSE),
61 fPdensityPairCut(kTRUE),
62 fTabulatePairs(kFALSE),
05db4376 63 fRMax(11),
64 fFixedLambdaBinMomRes(9),
65 fFixedLambdaBinr3(10),
654866df 66 fFilterBit(7),
dbcaf506 67 fMaxChi2NDF(10),
68 fMinTPCncls(0),
cd12341d 69 fBfield(0),
70 fMbin(0),
ae9b34d1 71 fFSIbin(0),
cd12341d 72 fEDbin(0),
654866df 73 fMbins(fCentBins),
cd12341d 74 fMultLimit(0),
75 fCentBinLowLimit(0),
76 fCentBinHighLimit(1),
77 fEventCounter(0),
78 fEventsToMix(0),
79 fZvertexBins(0),
80 fMultLimits(),
81 fQcut(),
82 fQLowerCut(0),
83 fNormQcutLow(),
84 fNormQcutHigh(),
85 fKupperBound(0),
86 fQupperBound(0),
87 fQupperBoundWeights(0),
88 fKstepT(),
89 fKstepY(),
90 fKmeanT(),
91 fKmeanY(),
92 fKmiddleT(),
93 fKmiddleY(),
94 fQstep(0),
5e3e77d6 95 fQstepWeights(0),
cd12341d 96 fQmean(),
97 fDampStart(0),
98 fDampStep(0),
cd12341d 99 fTPCTOFboundry(0),
100 fTOFboundry(0),
654866df 101 fSigmaCutTPC(2.0),
102 fSigmaCutTOF(2.0),
e29e02c1 103 fMinSepPairEta(0.03),
104 fMinSepPairPhi(0.04),
cd12341d 105 fShareQuality(0),
106 fShareFraction(0),
107 fTrueMassP(0),
108 fTrueMassPi(0),
109 fTrueMassK(0),
110 fTrueMassKs(0),
111 fTrueMassLam(0),
f5df8b1d 112 fKtIndexL(0),
113 fKtIndexH(0),
114 fQoIndexL(0),
115 fQoIndexH(0),
116 fQsIndexL(0),
117 fQsIndexH(0),
118 fQlIndexL(0),
119 fQlIndexH(0),
cd12341d 120 fDummyB(0),
cd12341d 121 fDefaultsCharMult(),
122 fDefaultsCharSE(),
123 fDefaultsCharME(),
124 fDefaultsInt(),
125 fPairLocationSE(),
126 fPairLocationME(),
127 fTripletSkip1(),
128 fTripletSkip2(),
129 fOtherPairLocation1(),
130 fOtherPairLocation2(),
131 fNormPairSwitch(),
132 fPairSplitCut(),
5e3e77d6 133 fNormPairs(),
baba9c2d 134 fMomResC2(0x0),
135 fFSI2SS(0x0),
136 fFSI2OS(0x0)
cd12341d 137{
138 // Default constructor
139 for(Int_t mb=0; mb<fMbins; mb++){
654866df 140 for(Int_t edB=0; edB<fEDbins; edB++){
cd12341d 141 for(Int_t c1=0; c1<2; c1++){
142 for(Int_t c2=0; c2<2; c2++){
143 for(Int_t sc=0; sc<kSCLimit2; sc++){
144 for(Int_t term=0; term<2; term++){
145
146 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2=0x0;
147
148 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
149 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
150 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSL = 0x0;
151 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSLQW = 0x0;
152 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSL = 0x0;
153 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSLQW = 0x0;
154
155 }// term_2
156 }// SC_2
157
158 for(Int_t c3=0; c3<2; c3++){
159 for(Int_t sc=0; sc<kSCLimit3; sc++){
160 for(Int_t term=0; term<5; term++){
161
162 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fExplicit3 = 0x0;
163 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNormEx3 = 0x0;
164 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
165 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
166 for(Int_t dt=0; dt<kDENtypes; dt++){
167 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNorm = 0x0;
90814457 168 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNorm = 0x0;
169 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNorm = 0x0;
170 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNormIdeal = 0x0;
171 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNormIdeal = 0x0;
172 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNormSmeared = 0x0;
173 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNormSmeared = 0x0;
cd12341d 174 }//dt
175
176 }// term_3
177 }// SC_3
178 }//c3
179 }//c2
180 }//c1
654866df 181 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
182 for(Int_t yKbin=0; yKbin<fKbinsY; yKbin++){
cd12341d 183 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fExplicit2ThreeD = 0x0;
184 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fExplicit2ThreeD = 0x0;
185 }
186 }
187
188 }// ED
189 }// Mbin
190
baba9c2d 191 // Initialize 3-pion FSI histograms
edc35fd5 192 for(Int_t i=0; i<6; i++){
193 fFSIOmega0SS[i]=0x0;
194 fFSIOmega0OS[i]=0x0;
195 }
196
197
198 // Initialize fNormWeight and fNormWeightErr to 0
f5df8b1d 199 for(Int_t i=0; i<3; i++){// Kt iterator
200 for(Int_t j=0; j<10; j++){// Mbin iterator
201 fNormWeight[i][j]=0x0;
edc35fd5 202 }
203 }
f5df8b1d 204
edc35fd5 205
cd12341d 206}
207//________________________________________________________________________
654866df 208AliChaoticity::AliChaoticity(const Char_t *name)
cd12341d 209: AliAnalysisTaskSE(name),
210 fname(name),
211 fAOD(0x0),
cd12341d 212 fOutputList(0x0),
213 fPIDResponse(0x0),
214 fEC(0x0),
215 fEvt(0x0),
216 fTempStruct(0x0),
217 fRandomNumber(0x0),
140107fb 218 fLEGO(kTRUE),
654866df 219 fMCcase(kFALSE),
cd12341d 220 fAODcase(kTRUE),
654866df 221 fPbPbcase(kTRUE),
222 fGenerateSignal(kFALSE),
cd12341d 223 fPdensityExplicitLoop(kFALSE),
224 fPdensityPairCut(kTRUE),
654866df 225 fTabulatePairs(kFALSE),
05db4376 226 fRMax(11),
227 fFixedLambdaBinMomRes(9),
228 fFixedLambdaBinr3(10),
654866df 229 fFilterBit(7),
dbcaf506 230 fMaxChi2NDF(10),
231 fMinTPCncls(0),
cd12341d 232 fBfield(0),
233 fMbin(0),
ae9b34d1 234 fFSIbin(0),
cd12341d 235 fEDbin(0),
654866df 236 fMbins(fCentBins),
cd12341d 237 fMultLimit(0),
654866df 238 fCentBinLowLimit(0),
239 fCentBinHighLimit(1),
cd12341d 240 fEventCounter(0),
241 fEventsToMix(0),
242 fZvertexBins(0),
243 fMultLimits(),
244 fQcut(),
245 fQLowerCut(0),
246 fNormQcutLow(),
247 fNormQcutHigh(),
248 fKupperBound(0),
249 fQupperBound(0),
250 fQupperBoundWeights(0),
251 fKstepT(),
252 fKstepY(),
253 fKmeanT(),
254 fKmeanY(),
255 fKmiddleT(),
256 fKmiddleY(),
257 fQstep(0),
5e3e77d6 258 fQstepWeights(0),
cd12341d 259 fQmean(),
260 fDampStart(0),
261 fDampStep(0),
cd12341d 262 fTPCTOFboundry(0),
263 fTOFboundry(0),
654866df 264 fSigmaCutTPC(2.0),
265 fSigmaCutTOF(2.0),
e29e02c1 266 fMinSepPairEta(0.03),
267 fMinSepPairPhi(0.04),
cd12341d 268 fShareQuality(0),
269 fShareFraction(0),
270 fTrueMassP(0),
271 fTrueMassPi(0),
272 fTrueMassK(0),
273 fTrueMassKs(0),
274 fTrueMassLam(0),
f5df8b1d 275 fKtIndexL(0),
276 fKtIndexH(0),
277 fQoIndexL(0),
278 fQoIndexH(0),
279 fQsIndexL(0),
280 fQsIndexH(0),
281 fQlIndexL(0),
282 fQlIndexH(0),
cd12341d 283 fDummyB(0),
cd12341d 284 fDefaultsCharMult(),
285 fDefaultsCharSE(),
286 fDefaultsCharME(),
287 fDefaultsInt(),
288 fPairLocationSE(),
289 fPairLocationME(),
290 fTripletSkip1(),
291 fTripletSkip2(),
292 fOtherPairLocation1(),
293 fOtherPairLocation2(),
294 fNormPairSwitch(),
295 fPairSplitCut(),
5e3e77d6 296 fNormPairs(),
baba9c2d 297 fMomResC2(0x0),
298 fFSI2SS(0x0),
299 fFSI2OS(0x0)
cd12341d 300{
301 // Main constructor
cd12341d 302 fAODcase=kTRUE;
cd12341d 303 fPdensityExplicitLoop = kFALSE;
304 fPdensityPairCut = kTRUE;
654866df 305
cd12341d 306
307 for(Int_t mb=0; mb<fMbins; mb++){
654866df 308 for(Int_t edB=0; edB<fEDbins; edB++){
cd12341d 309 for(Int_t c1=0; c1<2; c1++){
310 for(Int_t c2=0; c2<2; c2++){
311 for(Int_t sc=0; sc<kSCLimit2; sc++){
312 for(Int_t term=0; term<2; term++){
313
314 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2=0x0;
315
316 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
317 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
318 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSL = 0x0;
319 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSLQW = 0x0;
320 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSL = 0x0;
321 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSLQW = 0x0;
322
323 }// term_2
324 }// SC_2
325
326 for(Int_t c3=0; c3<2; c3++){
327 for(Int_t sc=0; sc<kSCLimit3; sc++){
328 for(Int_t term=0; term<5; term++){
329
330 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fExplicit3 = 0x0;
331 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNormEx3 = 0x0;
332 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
333 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
334 for(Int_t dt=0; dt<kDENtypes; dt++){
335 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNorm = 0x0;
90814457 336 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNorm = 0x0;
337 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNorm = 0x0;
338 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNormIdeal = 0x0;
339 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNormIdeal = 0x0;
340 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNormSmeared = 0x0;
341 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNormSmeared = 0x0;
cd12341d 342 }//dt
343
344 }// term_3
345 }// SC_3
346 }//c3
347 }//c2
348 }//c1
654866df 349 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
350 for(Int_t yKbin=0; yKbin<fKbinsY; yKbin++){
cd12341d 351 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fExplicit2ThreeD = 0x0;
352 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fExplicit2ThreeD = 0x0;
353 }
354 }
355
356 }// ED
357 }// Mbin
358
baba9c2d 359 // Initialize 3-pion FSI histograms
edc35fd5 360 for(Int_t i=0; i<6; i++){
361 fFSIOmega0SS[i]=0x0;
362 fFSIOmega0OS[i]=0x0;
363 }
f5df8b1d 364
edc35fd5 365 // Initialize fNormWeight and fNormWeightErr to 0
f5df8b1d 366 for(Int_t i=0; i<3; i++){// Kt iterator
367 for(Int_t j=0; j<10; j++){// Mbin iterator
368 fNormWeight[i][j]=0x0;
edc35fd5 369 }
370 }
cd12341d 371
f5df8b1d 372
cd12341d 373 DefineOutput(1, TList::Class());
374}
375//________________________________________________________________________
376AliChaoticity::AliChaoticity(const AliChaoticity &obj)
377 : AliAnalysisTaskSE(obj.fname),
378 fname(obj.fname),
379 fAOD(obj.fAOD),
b6e5ec54 380 //fESD(obj.fESD),
cd12341d 381 fOutputList(obj.fOutputList),
382 fPIDResponse(obj.fPIDResponse),
383 fEC(obj.fEC),
384 fEvt(obj.fEvt),
385 fTempStruct(obj.fTempStruct),
386 fRandomNumber(obj.fRandomNumber),
387 fLEGO(obj.fLEGO),
388 fMCcase(obj.fMCcase),
389 fAODcase(obj.fAODcase),
390 fPbPbcase(obj.fPbPbcase),
654866df 391 fGenerateSignal(obj.fGenerateSignal),
cd12341d 392 fPdensityExplicitLoop(obj.fPdensityExplicitLoop),
393 fPdensityPairCut(obj.fPdensityPairCut),
394 fTabulatePairs(obj.fTabulatePairs),
05db4376 395 fRMax(obj.fRMax),
5fc49f8c 396 fFixedLambdaBinMomRes(obj.fFixedLambdaBinMomRes),
397 fFixedLambdaBinr3(obj.fFixedLambdaBinr3),
654866df 398 fFilterBit(obj.fFilterBit),
dbcaf506 399 fMaxChi2NDF(obj.fMaxChi2NDF),
400 fMinTPCncls(obj.fMinTPCncls),
cd12341d 401 fBfield(obj.fBfield),
402 fMbin(obj.fMbin),
ae9b34d1 403 fFSIbin(obj.fFSIbin),
cd12341d 404 fEDbin(obj.fEDbin),
405 fMbins(obj.fMbins),
406 fMultLimit(obj.fMultLimit),
407 fCentBinLowLimit(obj.fCentBinLowLimit),
408 fCentBinHighLimit(obj.fCentBinHighLimit),
409 fEventCounter(obj.fEventCounter),
410 fEventsToMix(obj.fEventsToMix),
411 fZvertexBins(obj.fZvertexBins),
412 fMultLimits(),
413 fQcut(),
414 fQLowerCut(obj.fQLowerCut),
415 fNormQcutLow(),
416 fNormQcutHigh(),
417 fKupperBound(obj.fKupperBound),
418 fQupperBound(obj.fQupperBound),
419 fQupperBoundWeights(obj.fQupperBoundWeights),
420 fKstepT(),
421 fKstepY(),
422 fKmeanT(),
423 fKmeanY(),
424 fKmiddleT(),
425 fKmiddleY(),
426 fQstep(obj.fQstep),
5e3e77d6 427 fQstepWeights(obj.fQstepWeights),
cd12341d 428 fQmean(),
429 fDampStart(obj.fDampStart),
430 fDampStep(obj.fDampStep),
cd12341d 431 fTPCTOFboundry(obj.fTPCTOFboundry),
432 fTOFboundry(obj.fTOFboundry),
433 fSigmaCutTPC(obj.fSigmaCutTPC),
434 fSigmaCutTOF(obj.fSigmaCutTOF),
e29e02c1 435 fMinSepPairEta(obj.fMinSepPairEta),
436 fMinSepPairPhi(obj.fMinSepPairPhi),
cd12341d 437 fShareQuality(obj.fShareQuality),
438 fShareFraction(obj.fShareFraction),
439 fTrueMassP(obj.fTrueMassP),
440 fTrueMassPi(obj.fTrueMassPi),
441 fTrueMassK(obj.fTrueMassK),
442 fTrueMassKs(obj.fTrueMassKs),
443 fTrueMassLam(obj.fTrueMassLam),
f5df8b1d 444 fKtIndexL(obj.fKtIndexL),
445 fKtIndexH(obj.fKtIndexH),
446 fQoIndexL(obj.fQoIndexL),
447 fQoIndexH(obj.fQoIndexH),
448 fQsIndexL(obj.fQsIndexL),
449 fQsIndexH(obj.fQsIndexH),
450 fQlIndexL(obj.fQlIndexL),
451 fQlIndexH(obj.fQlIndexH),
cd12341d 452 fDummyB(obj.fDummyB),
cd12341d 453 fDefaultsCharMult(),
454 fDefaultsCharSE(),
455 fDefaultsCharME(),
456 fDefaultsInt(),
457 fPairLocationSE(),
458 fPairLocationME(),
459 fTripletSkip1(),
460 fTripletSkip2(),
461 fOtherPairLocation1(),
462 fOtherPairLocation2(),
463 fNormPairSwitch(),
464 fPairSplitCut(),
5e3e77d6 465 fNormPairs(),
baba9c2d 466 fMomResC2(obj.fMomResC2),
467 fFSI2SS(obj.fFSI2SS),
468 fFSI2OS(obj.fFSI2OS)
cd12341d 469{
baba9c2d 470 // Copy Constructor
471
edc35fd5 472 for(Int_t i=0; i<6; i++){
473 fFSIOmega0SS[i]=obj.fFSIOmega0SS[i];
474 fFSIOmega0OS[i]=obj.fFSIOmega0OS[i];
475 }
476
477 // Initialize fNormWeight and fNormWeightErr to 0
f5df8b1d 478 for(Int_t i=0; i<3; i++){// Kt iterator
479 for(Int_t j=0; j<10; j++){// Mbin iterator
480 fNormWeight[i][j]=0x0;
edc35fd5 481 }
482 }
f5df8b1d 483
edc35fd5 484
cd12341d 485}
486//________________________________________________________________________
487AliChaoticity &AliChaoticity::operator=(const AliChaoticity &obj)
488{
489 // Assignment operator
490 if (this == &obj)
491 return *this;
492
493 fname = obj.fname;
494 fAOD = obj.fAOD;
cd12341d 495 fOutputList = obj.fOutputList;
496 fPIDResponse = obj.fPIDResponse;
497 fEC = obj.fEC;
498 fEvt = obj.fEvt;
499 fTempStruct = obj.fTempStruct;
500 fRandomNumber = obj.fRandomNumber;
501 fLEGO = fLEGO;
502 fMCcase = obj.fMCcase;
503 fAODcase = obj.fAODcase;
654866df 504 fPbPbcase = obj.fPbPbcase;
505 fGenerateSignal = obj.fGenerateSignal;
cd12341d 506 fPdensityExplicitLoop = obj.fPdensityExplicitLoop;
507 fPdensityPairCut = obj.fPdensityPairCut;
508 fTabulatePairs = obj.fTabulatePairs;
05db4376 509 fRMax = obj.fRMax;
5fc49f8c 510 fFixedLambdaBinMomRes = obj.fFixedLambdaBinMomRes;
511 fFixedLambdaBinr3 = obj.fFixedLambdaBinr3;
654866df 512 fFilterBit = obj.fFilterBit;
dbcaf506 513 fMaxChi2NDF = obj.fMaxChi2NDF;
514 fMinTPCncls = obj.fMinTPCncls;
cd12341d 515 fBfield = obj.fBfield;
516 fMbin = obj.fMbin;
ae9b34d1 517 fFSIbin = obj.fFSIbin;
cd12341d 518 fEDbin = obj.fEDbin;
519 fMbins = obj.fMbins;
520 fMultLimit = obj.fMultLimit;
521 fCentBinLowLimit = obj.fCentBinLowLimit;
522 fCentBinHighLimit = obj.fCentBinHighLimit;
523 fEventCounter = obj.fEventCounter;
524 fEventsToMix = obj.fEventsToMix;
525 fZvertexBins = obj.fZvertexBins;
cd12341d 526 fQLowerCut = obj.fQLowerCut;
cd12341d 527 fKupperBound = obj.fKupperBound;
528 fQupperBound = obj.fQupperBound;
529 fQupperBoundWeights = obj.fQupperBoundWeights;
cd12341d 530 fQstep = obj.fQstep;
5e3e77d6 531 fQstepWeights = obj.fQstepWeights;
cd12341d 532 fDampStart = obj.fDampStart;
533 fDampStep = obj.fDampStep;
cd12341d 534 fTPCTOFboundry = obj.fTPCTOFboundry;
535 fTOFboundry = obj.fTOFboundry;
536 fSigmaCutTPC = obj.fSigmaCutTPC;
537 fSigmaCutTOF = obj.fSigmaCutTOF;
e29e02c1 538 fMinSepPairEta = obj.fMinSepPairEta;
539 fMinSepPairPhi = obj.fMinSepPairPhi;
cd12341d 540 fShareQuality = obj.fShareQuality;
541 fShareFraction = obj.fShareFraction;
542 fTrueMassP = obj.fTrueMassP;
543 fTrueMassPi = obj.fTrueMassPi;
544 fTrueMassK = obj.fTrueMassK;
545 fTrueMassKs = obj.fTrueMassKs;
546 fTrueMassLam = obj.fTrueMassLam;
f5df8b1d 547 fKtIndexL = obj.fKtIndexL;
548 fKtIndexH = obj.fKtIndexH;
549 fQoIndexL = obj.fQoIndexL;
550 fQoIndexH = obj.fQoIndexH;
551 fQsIndexL = obj.fQsIndexL;
552 fQsIndexH = obj.fQsIndexH;
553 fQlIndexL = obj.fQlIndexL;
554 fQlIndexH = obj.fQlIndexH;
cd12341d 555 fDummyB = obj.fDummyB;
edc35fd5 556 fMomResC2 = obj.fMomResC2;
baba9c2d 557 fFSI2SS = obj.fFSI2SS;
558 fFSI2OS = obj.fFSI2OS;
559
edc35fd5 560 for(Int_t i=0; i<6; i++){
561 fFSIOmega0SS[i]=obj.fFSIOmega0SS[i];
562 fFSIOmega0OS[i]=obj.fFSIOmega0OS[i];
563 }
f5df8b1d 564 for(Int_t i=0; i<3; i++){// Kt iterator
565 for(Int_t j=0; j<10; j++){// Mbin iterator
566 fNormWeight[i][j]=obj.fNormWeight[i][j];
edc35fd5 567 }
568 }
f5df8b1d 569
cd12341d 570 return (*this);
571}
572//________________________________________________________________________
573AliChaoticity::~AliChaoticity()
574{
575 // Destructor
576 if(fAOD) delete fAOD;
b6e5ec54 577 //if(fESD) delete fESD;
cd12341d 578 if(fOutputList) delete fOutputList;
579 if(fPIDResponse) delete fPIDResponse;
580 if(fEC) delete fEC;
581 if(fEvt) delete fEvt;
68b2d0b9 582 if(fTempStruct) delete [] fTempStruct;
cd12341d 583 if(fRandomNumber) delete fRandomNumber;
5e3e77d6 584 if(fMomResC2) delete fMomResC2;
baba9c2d 585 if(fFSI2SS) delete fFSI2SS;
586 if(fFSI2OS) delete fFSI2OS;
5e3e77d6 587
edc35fd5 588 for(Int_t i=0; i<fMultLimit; i++){
68b2d0b9 589 if(fPairLocationSE[i]) delete [] fPairLocationSE[i];
590 if(fPairLocationME[i]) delete [] fPairLocationME[i];
edc35fd5 591 for(Int_t j=0; j<2; j++){
68b2d0b9 592 if(fOtherPairLocation1[j][i]) delete [] fOtherPairLocation1[j][i];
593 if(fOtherPairLocation2[j][i]) delete [] fOtherPairLocation2[j][i];
594 }
edc35fd5 595 for(Int_t j=0; j<3; j++) if(fNormPairSwitch[j][i]) delete [] fNormPairSwitch[j][i];
596 for(Int_t j=0; j<4; j++) if(fPairSplitCut[j][i]) delete [] fPairSplitCut[j][i];
68b2d0b9 597 }
edc35fd5 598 for(Int_t i=0; i<kPairLimit; i++) if(fTripletSkip1[i]) delete [] fTripletSkip1[i];
599 for(Int_t i=0; i<2*kPairLimit; i++) if(fTripletSkip2[i]) delete [] fTripletSkip2[i];
600 for(Int_t i=0; i<3; i++) if(fNormPairs[i]) delete [] fNormPairs[i];
cd12341d 601 //
602 for(Int_t mb=0; mb<fMbins; mb++){
654866df 603 for(Int_t edB=0; edB<fEDbins; edB++){
cd12341d 604 for(Int_t c1=0; c1<2; c1++){
605 for(Int_t c2=0; c2<2; c2++){
606 for(Int_t sc=0; sc<kSCLimit2; sc++){
607 for(Int_t term=0; term<2; term++){
608
609 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2;
610
611 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal;
612 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared;
613 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSL) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSL;
614 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSLQW) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSLQW;
615 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSL) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSL;
616 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSLQW) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSLQW;
fa109294 617 //
618 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv;
619 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW;
cd12341d 620 }// term_2
621 }// SC_2
622
623 for(Int_t c3=0; c3<2; c3++){
624 for(Int_t sc=0; sc<kSCLimit3; sc++){
625 for(Int_t term=0; term<5; term++){
626
627 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fExplicit3) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fExplicit3;
628 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNormEx3) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNormEx3;
629 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3;
630 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3;
90814457 631 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1Terms) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1Terms;
632 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2Terms) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2Terms;
633 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsIdeal) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsIdeal;
634 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsIdeal) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsIdeal;
635 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsSmeared) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsSmeared;
636 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsSmeared) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsSmeared;
0e58bc53 637 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1Q3W) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1Q3W;
638 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2Q3W) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2Q3W;
fa109294 639 //
90814457 640 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsSumK3) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsSumK3;
641 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsSumK3) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsSumK3;
642 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsEnK3) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsEnK3;
643 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsEnK3) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsEnK3;
644 //
645 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsSumK2) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsSumK2;
646 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsSumK2) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsSumK2;
647 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsEnK2) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsEnK2;
648 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsEnK2) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsEnK2;
649
fa109294 650 //
cd12341d 651 for(Int_t dt=0; dt<kDENtypes; dt++){
652 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNorm) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNorm;
fa109294 653 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNorm) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNorm;
654 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNorm) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNorm;
90814457 655 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNormIdeal) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNormIdeal;
656 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNormIdeal) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNormIdeal;
657 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNormSmeared) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNormSmeared;
658 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNormIdeal) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNormSmeared;
659
cd12341d 660 }//dt
661
662 }// term_3
663 }// SC_3
664 }//c3
665 }//c2
666 }//c1
654866df 667 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
668 for(Int_t yKbin=0; yKbin<fKbinsY; yKbin++){
cd12341d 669 if(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fExplicit2ThreeD) delete KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fExplicit2ThreeD;
670 if(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fExplicit2ThreeD) delete KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fExplicit2ThreeD;
671 }
672 }
673
674 }// ED
675 }// Mbin
edc35fd5 676
baba9c2d 677
edc35fd5 678 for(Int_t i=0; i<6; i++){
679 if(fFSIOmega0SS[i]) delete fFSIOmega0SS[i];
680 if(fFSIOmega0OS[i]) delete fFSIOmega0OS[i];
681 }
f5df8b1d 682 for(Int_t i=0; i<3; i++){// Kt iterator
683 for(Int_t j=0; j<10; j++){// Mbin iterator
684 if(fNormWeight[i][j]) delete fNormWeight[i][j];
685 }
686 }
687
cd12341d 688}
689//________________________________________________________________________
690void AliChaoticity::ParInit()
691{
692 cout<<"AliChaoticity MyInit() call"<<endl;
e29e02c1 693 cout<<"lego:"<<fLEGO<<" MCcase:"<<fMCcase<<" PbPbcase:"<<fPbPbcase<<" TabulatePairs:"<<fTabulatePairs<<" GenSignal:"<<fGenerateSignal<<" CentLow:"<<fCentBinLowLimit<<" CentHigh:"<<fCentBinHighLimit<<" RMax:"<<fRMax<<" LambdaBinMomRes:"<<fFixedLambdaBinMomRes<<" LambdaBinr3:"<<fFixedLambdaBinr3<<" FB:"<<fFilterBit<<" MaxChi2/NDF:"<<fMaxChi2NDF<<" MinTPCncls:"<<fMinTPCncls<<" MinPairSepEta:"<<fMinSepPairEta<<" MinPairSepPhi:"<<fMinSepPairPhi<<" NsigTPC:"<<fSigmaCutTPC<<" NsigTOF:"<<fSigmaCutTOF<<endl;
140107fb 694
cd12341d 695 fRandomNumber = new TRandom3();
696 fRandomNumber->SetSeed(0);
cd12341d 697
698 //
699 fEventCounter=0;
700 if(fPdensityExplicitLoop) fEventsToMix=3;
701 else if(fPdensityPairCut && !fPdensityExplicitLoop) fEventsToMix=2;
702 else fEventsToMix=0;
703 fZvertexBins=2;//2
704
705 fTPCTOFboundry = 0.6;// TPC pid used below this momentum, TOF above but below TOF_boundry
706 fTOFboundry = 2.1;// TOF pid used below this momentum
cd12341d 707
708 ////////////////////////////////////////////////
654866df 709 // PadRow Pair Cuts
cd12341d 710 fShareQuality = .5;// max
711 fShareFraction = .05;// max
712 ////////////////////////////////////////////////
5e3e77d6 713
cd12341d 714
715 fMultLimits[0]=0, fMultLimits[1]=2, fMultLimits[2]=4, fMultLimits[3]=6, fMultLimits[4]=8, fMultLimits[5]=10;
716 fMultLimits[6]=12, fMultLimits[7]=14, fMultLimits[8]=16, fMultLimits[9]=18, fMultLimits[10]=20, fMultLimits[11]=150;
717
718
90814457 719
cd12341d 720 if(fPbPbcase) {// PbPb
721 fMultLimit=kMultLimitPbPb;
654866df 722 fMbins=fCentBins;
140107fb 723 fQcut[0]=0.1;//pi-pi, pi-k, pi-p
724 fQcut[1]=0.1;//k-k
725 fQcut[2]=0.6;//the rest
2a5fc38d 726 fNormQcutLow[0] = 0.15;// 0.15 or 1.06
727 fNormQcutHigh[0] = 0.175;// 0.175 or 1.1
cd12341d 728 fNormQcutLow[1] = 1.34;//1.34
729 fNormQcutHigh[1] = 1.4;//1.4
730 fNormQcutLow[2] = 1.1;//1.1
731 fNormQcutHigh[2] = 1.4;//1.4
732 }
733 else {// pp
734 fMultLimit=kMultLimitpp;
735 fMbins=kMultBinspp;
736 fQcut[0]=0.6;
737 fQcut[1]=0.6;
738 fQcut[2]=0.6;
739 fNormQcutLow[0] = 1.0;
740 fNormQcutHigh[0] = 1.5;
741 fNormQcutLow[1] = 1.0;
742 fNormQcutHigh[1] = 1.5;
743 fNormQcutLow[2] = 1.0;
744 fNormQcutHigh[2] = 1.5;
745 }
746
90814457 747 fQLowerCut = 0.005;// was 0.005
cd12341d 748 fKupperBound = 1.0;
749 //
140107fb 750 fKstepY[0] = 1.6;
cd12341d 751 fKmeanY[0] = 0;// central y
cd12341d 752 fKmiddleY[0] = 0;
140107fb 753
754 // 4x1 (Kt: 0-0.25, 0.25-0.35, 0.35-0.45, 0.45-1.0)
755 if(fKbinsT==4){
756 fKstepT[0] = 0.25; fKstepT[1] = 0.1; fKstepT[2] = 0.1; fKstepT[3] = 0.55;
757 fKmeanT[0] = 0.212; fKmeanT[1] = 0.299; fKmeanT[2] = 0.398; fKmeanT[3] = 0.576;
758 fKmiddleT[0] = 0.125; fKmiddleT[1] = 0.3; fKmiddleT[2] = 0.4; fKmiddleT[3] = 0.725;
759 }
760 // 3x1 (Kt: 0-0.3, 0.3-0.45, 0.45-1.0)
761 if(fKbinsT==3){
762 fKstepT[0] = 0.3; fKstepT[1] = 0.15; fKstepT[2] = 0.55;
763 fKmeanT[0] = 0.240; fKmeanT[1] = 0.369; fKmeanT[2] = 0.576;
764 fKmiddleT[0] = 0.15; fKmiddleT[1] = 0.375; fKmiddleT[2] = 0.725;
765 }
766 // 2x1 (Kt: 0-0.35, 0.35-1.0)
767 if(fKbinsT==2){
768 fKstepT[0] = 0.35; fKstepT[1] = 0.65;
769 fKmeanT[0] = 0.264; fKmeanT[1] = 0.500;
770 fKmiddleT[0] = 0.175; fKmiddleT[1] = 0.675;
771 }
772
cd12341d 773 //
774 fQupperBoundWeights = 0.2;
775 fQupperBound = 0.1;
5e3e77d6 776 fQstep = fQupperBound/Float_t(kQbins);
777 fQstepWeights = fQupperBoundWeights/Float_t(kQbinsWeights);
778 for(Int_t i=0; i<kQbinsWeights; i++) {fQmean[i]=(i+0.5)*fQstepWeights;}
cd12341d 779 //
05db4376 780 fDampStart = 0.5;// was 0.3
cd12341d 781 fDampStep = 0.02;
782
f9a5e67a 783 //
784
cd12341d 785
786 fEC = new AliChaoticityEventCollection **[fZvertexBins];
787 for(UShort_t i=0; i<fZvertexBins; i++){
788
789 fEC[i] = new AliChaoticityEventCollection *[fMbins];
790
791 for(UShort_t j=0; j<fMbins; j++){
792
6e805184 793 fEC[i][j] = new AliChaoticityEventCollection(fEventsToMix+1, fMultLimit, kPairLimit, kMCarrayLimit, fMCcase);
cd12341d 794 }
795 }
796
797
798 for(Int_t i=0; i<fMultLimit; i++) fDefaultsCharMult[i]='0';
799 for(Int_t i=0; i<kPairLimit; i++) fDefaultsCharSE[i]='0';
800 for(Int_t i=0; i<2*kPairLimit; i++) fDefaultsCharME[i]='0';
801 for(Int_t i=0; i<fMultLimit; i++) fDefaultsInt[i]=-1;
802 for(Int_t i=0; i<fMultLimit; i++) fPairLocationSE[i] = new TArrayI(fMultLimit,fDefaultsInt);
803 for(Int_t i=0; i<fMultLimit; i++) fPairLocationME[i] = new TArrayI(fMultLimit,fDefaultsInt);
804 for(Int_t i=0; i<kPairLimit; i++) fTripletSkip1[i] = new TArrayC(fMultLimit,fDefaultsCharSE);
805 for(Int_t i=0; i<2*kPairLimit; i++) fTripletSkip2[i] = new TArrayC(fMultLimit,fDefaultsCharME);
806
807
808 // Normalization utilities
809 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation1[0][i] = new TArrayI(fMultLimit,fDefaultsInt);
810 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation1[1][i] = new TArrayI(fMultLimit,fDefaultsInt);
811 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation2[0][i] = new TArrayI(fMultLimit,fDefaultsInt);
812 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation2[1][i] = new TArrayI(fMultLimit,fDefaultsInt);
813 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[0][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
814 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[1][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
815 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[2][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
816
817 // Track Merging/Splitting utilities
818 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[0][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P11
819 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[1][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P12
820 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[2][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P13
821 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[3][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P23
822
823
824 fNormPairs[0] = new AliChaoticityNormPairStruct[kNormPairLimit];
825 fNormPairs[1] = new AliChaoticityNormPairStruct[kNormPairLimit];
826
827
828 fTempStruct = new AliChaoticityTrackStruct[fMultLimit];
829
830
831 fTrueMassP=0.93827, fTrueMassPi=0.13957, fTrueMassK=0.493677, fTrueMassKs=0.497614, fTrueMassLam=1.11568;
832
833
cd12341d 834
835 // Set weights, Coulomb corrections, and Momentum resolution corrections manually if not on LEGO
90814457 836 if(!fLEGO) {
5e3e77d6 837 SetFSICorrelations(fLEGO);// Read in 2-particle and 3-particle FSI correlations
90814457 838 if(!fTabulatePairs) SetWeightArrays(fLEGO);// Set Weight Array
140107fb 839 if(!fMCcase && !fTabulatePairs) SetMomResCorrections(fLEGO);// Read Momentum resolution file
cd12341d 840 }
90814457 841
842 /////////////////////////////////////////////
140107fb 843 /////////////////////////////////////////////
90814457 844
cd12341d 845}
846//________________________________________________________________________
847void AliChaoticity::UserCreateOutputObjects()
848{
849 // Create histograms
850 // Called once
851
852 ParInit();// Initialize my settings
5e3e77d6 853
cd12341d 854
855 fOutputList = new TList();
856 fOutputList->SetOwner();
857
858 TH3F *fVertexDist = new TH3F("fVertexDist","Vertex Distribution",20,-1,1, 20,-1,1, 600,-30,30);
859 fVertexDist->GetXaxis()->SetTitle("X Vertex (cm)");
860 fVertexDist->GetYaxis()->SetTitle("Y Vertex (cm)");
861 fVertexDist->GetZaxis()->SetTitle("Z Vertex (cm)");
862 fOutputList->Add(fVertexDist);
863
864
865 TH2F *fDCAxyDistPlus = new TH2F("fDCAxyDistPlus","DCA distribution",300,0,3., 50,0,5);
866 fOutputList->Add(fDCAxyDistPlus);
867 TH2F *fDCAzDistPlus = new TH2F("fDCAzDistPlus","DCA distribution",300,0,3., 50,0,5);
868 fOutputList->Add(fDCAzDistPlus);
869 TH2F *fDCAxyDistMinus = new TH2F("fDCAxyDistMinus","DCA distribution",300,0,3., 50,0,5);
870 fOutputList->Add(fDCAxyDistMinus);
871 TH2F *fDCAzDistMinus = new TH2F("fDCAzDistMinus","DCA distribution",300,0,3., 50,0,5);
872 fOutputList->Add(fDCAzDistMinus);
873
874
875 TH1F *fEvents1 = new TH1F("fEvents1","Events vs. fMbin",fMbins,.5,fMbins+.5);
876 fOutputList->Add(fEvents1);
877 TH1F *fEvents2 = new TH1F("fEvents2","Events vs. fMbin",fMbins,.5,fMbins+.5);
878 fOutputList->Add(fEvents2);
879
880 TH1F *fMultDist1 = new TH1F("fMultDist1","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
881 fMultDist1->GetXaxis()->SetTitle("Multiplicity");
882 fOutputList->Add(fMultDist1);
883
884 TH1F *fMultDist2 = new TH1F("fMultDist2","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
885 fMultDist2->GetXaxis()->SetTitle("Multiplicity");
886 fOutputList->Add(fMultDist2);
887
888 TH1F *fMultDist3 = new TH1F("fMultDist3","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
889 fMultDist3->GetXaxis()->SetTitle("Multiplicity");
890 fOutputList->Add(fMultDist3);
891
892 TH3F *fPtEtaDist = new TH3F("fPtEtaDist","fPtEtaDist",2,-1.1,1.1, 300,0,3., 28,-1.4,1.4);
893 fOutputList->Add(fPtEtaDist);
894
895 TH3F *fPhiPtDist = new TH3F("fPhiPtDist","fPhiPtDist",2,-1.1,1.1, 120,0,2*PI, 300,0,3.);
896 fOutputList->Add(fPhiPtDist);
897
898 TH3F *fTOFResponse = new TH3F("fTOFResponse","TOF relative time",20,0,100, 200,0,2, 4000,-20000,20000);
899 fOutputList->Add(fTOFResponse);
900 TH3F *fTPCResponse = new TH3F("fTPCResponse","TPCsignal",20,0,100, 200,0,2, 1000,0,1000);
901 fOutputList->Add(fTPCResponse);
902
903 TH1F *fRejectedPairs = new TH1F("fRejectedPairs","",200,0,2);
904 fOutputList->Add(fRejectedPairs);
905 TH1I *fRejectedEvents = new TH1I("fRejectedEvents","",fMbins,0.5,fMbins+.5);
906 fOutputList->Add(fRejectedEvents);
907
908 TH3F *fPairsDetaDPhiNum = new TH3F("fPairsDetaDPhiNum","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
909 if(fMCcase) fOutputList->Add(fPairsDetaDPhiNum);
910 TH3F *fPairsDetaDPhiDen = new TH3F("fPairsDetaDPhiDen","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
911 if(fMCcase) fOutputList->Add(fPairsDetaDPhiDen);
e29e02c1 912 TH3F *fPairsShareFracDPhiNum = new TH3F("fPairsShareFracDPhiNum","",10,-.5,9.5, 159,0,1, 600,-0.3,0.3);
913 if(fMCcase) fOutputList->Add(fPairsShareFracDPhiNum);
914 TH3F *fPairsShareFracDPhiDen = new TH3F("fPairsShareFracDPhiDen","",10,-.5,9.5, 159,0,1, 600,-0.3,0.3);
915 if(fMCcase) fOutputList->Add(fPairsShareFracDPhiDen);
916 TH3D* fPairsPadRowNum = new TH3D("fPairsPadRowNum","", 20,0,1, 159,0,1, 40,0,0.2);
917 if(fMCcase) fOutputList->Add(fPairsPadRowNum);
918 TH3D* fPairsPadRowDen = new TH3D("fPairsPadRowDen","", 20,0,1, 159,0,1, 40,0,0.2);
919 if(fMCcase) fOutputList->Add(fPairsPadRowDen);
920
921
922
cd12341d 923 TH2D *fResonanceOSPairs = new TH2D("fResonanceOSPairs","",fMbins,.5,fMbins+.5, 1000,0,2);
924 if(fMCcase) fOutputList->Add(fResonanceOSPairs);
925 TH2D *fAllOSPairs = new TH2D("fAllOSPairs","",fMbins,.5,fMbins+.5, 1000,0,2);
926 if(fMCcase) fOutputList->Add(fAllOSPairs);
927
e29e02c1 928 TH3D *fPrimarySCPionPairs = new TH3D("fPrimarySCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
929 if(fMCcase) fOutputList->Add(fPrimarySCPionPairs);
930 TH3D *fAllSCPionPairs = new TH3D("fAllSCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
931 if(fMCcase) fOutputList->Add(fAllSCPionPairs);
932 TH3D *fPrimaryMCPionPairs = new TH3D("fPrimaryMCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
933 if(fMCcase) fOutputList->Add(fPrimaryMCPionPairs);
934 TH3D *fAllMCPionPairs = new TH3D("fAllMCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
935 if(fMCcase) fOutputList->Add(fAllMCPionPairs);
936
cd12341d 937 TProfile *fAvgMult = new TProfile("fAvgMult","",fMbins,.5,fMbins+.5, 0,1500,"");
938 fOutputList->Add(fAvgMult);
939
dbcaf506 940 TH2D *fTrackChi2NDF = new TH2D("fTrackChi2NDF","",20,0,100, 100,0,10);
941 fOutputList->Add(fTrackChi2NDF);
942 TH2D *fTrackTPCncls = new TH2D("fTrackTPCncls","",20,0,100, 110,50,160);
943 fOutputList->Add(fTrackTPCncls);
944
945
5e027bd6 946 TH3D *fTPNRejects1 = new TH3D("fTPNRejects1","",kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
947 fOutputList->Add(fTPNRejects1);
948 TH3D *fTPNRejects2 = new TH3D("fTPNRejects2","",kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
949 fOutputList->Add(fTPNRejects2);
950 TH3D *fTPNRejects3 = new TH3D("fTPNRejects3","",kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
951 fOutputList->Add(fTPNRejects3);
952 TH3D *fTPNRejects4 = new TH3D("fTPNRejects4","",kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
953 fOutputList->Add(fTPNRejects4);
954 TH3D *fTPNRejects5 = new TH3D("fTPNRejects5","",kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
955 fOutputList->Add(fTPNRejects5);
956
cd12341d 957
140107fb 958 TH3D *fKt3DistTerm1 = new TH3D("fKt3DistTerm1","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
959 TH3D *fKt3DistTerm5 = new TH3D("fKt3DistTerm5","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
960 fOutputList->Add(fKt3DistTerm1);
961 fOutputList->Add(fKt3DistTerm5);
cd12341d 962
05db4376 963 TH1D *fMCWeight3DTerm1SC = new TH1D("fMCWeight3DTerm1SC","", 20,0,0.2);
964 TH1D *fMCWeight3DTerm1SCden = new TH1D("fMCWeight3DTerm1SCden","", 20,0,0.2);
965 TH1D *fMCWeight3DTerm2SC = new TH1D("fMCWeight3DTerm2SC","", 20,0,0.2);
966 TH1D *fMCWeight3DTerm2SCden = new TH1D("fMCWeight3DTerm2SCden","", 20,0,0.2);
967 TH1D *fMCWeight3DTerm1MC = new TH1D("fMCWeight3DTerm1MC","", 20,0,0.2);
968 TH1D *fMCWeight3DTerm1MCden = new TH1D("fMCWeight3DTerm1MCden","", 20,0,0.2);
969 TH1D *fMCWeight3DTerm2MC = new TH1D("fMCWeight3DTerm2MC","", 20,0,0.2);
970 TH1D *fMCWeight3DTerm2MCden = new TH1D("fMCWeight3DTerm2MCden","", 20,0,0.2);
971 TH1D *fMCWeight3DTerm3MC = new TH1D("fMCWeight3DTerm3MC","", 20,0,0.2);
972 TH1D *fMCWeight3DTerm3MCden = new TH1D("fMCWeight3DTerm3MCden","", 20,0,0.2);
973 TH1D *fMCWeight3DTerm4MC = new TH1D("fMCWeight3DTerm4MC","", 20,0,0.2);
974 TH1D *fMCWeight3DTerm4MCden = new TH1D("fMCWeight3DTerm4MCden","", 20,0,0.2);
975 fOutputList->Add(fMCWeight3DTerm1SC);
976 fOutputList->Add(fMCWeight3DTerm1SCden);
977 fOutputList->Add(fMCWeight3DTerm2SC);
978 fOutputList->Add(fMCWeight3DTerm2SCden);
979 fOutputList->Add(fMCWeight3DTerm1MC);
980 fOutputList->Add(fMCWeight3DTerm1MCden);
981 fOutputList->Add(fMCWeight3DTerm2MC);
982 fOutputList->Add(fMCWeight3DTerm2MCden);
983 fOutputList->Add(fMCWeight3DTerm3MC);
984 fOutputList->Add(fMCWeight3DTerm3MCden);
985 fOutputList->Add(fMCWeight3DTerm4MC);
986 fOutputList->Add(fMCWeight3DTerm4MCden);
987
988
cd12341d 989 if(fPdensityExplicitLoop || fPdensityPairCut){
990
991 for(Int_t mb=0; mb<fMbins; mb++){
992 if((mb < fCentBinLowLimit) || (mb > fCentBinHighLimit)) continue;
993
654866df 994 for(Int_t edB=0; edB<fEDbins; edB++){
cd12341d 995 for(Int_t c1=0; c1<2; c1++){
996 for(Int_t c2=0; c2<2; c2++){
997 for(Int_t sc=0; sc<kSCLimit2; sc++){
998 for(Int_t term=0; term<2; term++){
999
1000 TString *nameEx2 = new TString("Explicit2_Charge1_");
1001 *nameEx2 += c1;
1002 nameEx2->Append("_Charge2_");
1003 *nameEx2 += c2;
1004 nameEx2->Append("_SC_");
1005 *nameEx2 += sc;
1006 nameEx2->Append("_M_");
1007 *nameEx2 += mb;
1008 nameEx2->Append("_ED_");
1009 *nameEx2 += edB;
1010 nameEx2->Append("_Term_");
1011 *nameEx2 += term+1;
1012
1013 if(sc==0 || sc==3 || sc==5){
1014 if( (c1+c2)==1 ) {if(c1!=0) continue;}// skip degenerate histogram
1015 }
1016
1017 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2 = new TH2D(nameEx2->Data(),"Two Particle Distribution",20,0,1, 400,0,2);
1018 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2);
5e3e77d6 1019 TString *nameEx2QW=new TString(nameEx2->Data());
1020 nameEx2QW->Append("_QW");
1021 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW = new TH2D(nameEx2QW->Data(),"Two Particle Distribution",20,0,1, 400,0,2);
1022 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW);
704f2481 1023 TString *nameAvgP=new TString(nameEx2->Data());
1024 nameAvgP->Append("_AvgP");
1025 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fAvgP = new TProfile2D(nameAvgP->Data(),"",10,0,1, 400,0,2, 0.,1.0,"");
1026 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fAvgP);
1027
cd12341d 1028 // Momentum resolution histos
1029 if(fMCcase && sc==0){
1030 TString *nameIdeal = new TString(nameEx2->Data());
1031 nameIdeal->Append("_Ideal");
654866df 1032 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = new TH2D(nameIdeal->Data(),"Two Particle Distribution",fRVALUES*kNDampValues,-0.5,fRVALUES*kNDampValues-0.5, kQbinsWeights,0,fQupperBoundWeights);
cd12341d 1033 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal);
1034 TString *nameSmeared = new TString(nameEx2->Data());
1035 nameSmeared->Append("_Smeared");
654866df 1036 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = new TH2D(nameSmeared->Data(),"Two Particle Distribution",fRVALUES*kNDampValues,-0.5,fRVALUES*kNDampValues-0.5, kQbinsWeights,0,fQupperBoundWeights);
cd12341d 1037 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared);
fa109294 1038 //
1039 TString *nameEx2MC=new TString(nameEx2->Data());
1040 nameEx2MC->Append("_MCqinv");
1041 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv = new TH1D(nameEx2MC->Data(),"",400,0,2);
1042 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv);
1043 TString *nameEx2MCQW=new TString(nameEx2->Data());
1044 nameEx2MCQW->Append("_MCqinvQW");
1045 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW = new TH1D(nameEx2MCQW->Data(),"",400,0,2);
1046 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW);
54d66278 1047 //
1048 TString *nameEx2PIDpurityDen=new TString(nameEx2->Data());
1049 nameEx2PIDpurityDen->Append("_PIDpurityDen");
1050 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen = new TH2D(nameEx2PIDpurityDen->Data(),"Two Particle Distribution",20,0,1, 400,0,2);
1051 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen);
1052 TString *nameEx2PIDpurityNum=new TString(nameEx2->Data());
1053 nameEx2PIDpurityNum->Append("_PIDpurityNum");
1054 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum = new TH2D(nameEx2PIDpurityNum->Data(),"Two Particle Distribution",20,0,1, 400,0,2);
1055 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum);
cd12341d 1056 }
fa109294 1057 if(sc==0){
cd12341d 1058
1059 TString *nameEx2OSLB1 = new TString(nameEx2->Data());
1060 nameEx2OSLB1->Append("_osl_b1");
fa109294 1061 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSL = new TH3D(nameEx2OSLB1->Data(),"Two Particle Distribution",kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
cd12341d 1062 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSL);
1063 nameEx2OSLB1->Append("_QW");
fa109294 1064 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSLQW = new TH3D(nameEx2OSLB1->Data(),"Two Particle Distribution",kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
cd12341d 1065 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSLQW);
1066 //
1067 TString *nameEx2OSLB2 = new TString(nameEx2->Data());
1068 nameEx2OSLB2->Append("_osl_b2");
fa109294 1069 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSL = new TH3D(nameEx2OSLB2->Data(),"Two Particle Distribution",kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
cd12341d 1070 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSL);
1071 nameEx2OSLB2->Append("_QW");
fa109294 1072 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSLQW = new TH3D(nameEx2OSLB2->Data(),"Two Particle Distribution",kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
cd12341d 1073 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSLQW);
1074
1075 }
1076
1077 }// term_2
1078 }// SC_2
1079
1080 // skip 3-particle if Tabulate6DPairs is true
1081 if(fTabulatePairs) continue;
1082
1083 for(Int_t c3=0; c3<2; c3++){
1084 for(Int_t sc=0; sc<kSCLimit3; sc++){
1085 for(Int_t term=0; term<5; term++){
1086 TString *nameEx3 = new TString("Explicit3_Charge1_");
1087 *nameEx3 += c1;
1088 nameEx3->Append("_Charge2_");
1089 *nameEx3 += c2;
1090 nameEx3->Append("_Charge3_");
1091 *nameEx3 += c3;
1092 nameEx3->Append("_SC_");
1093 *nameEx3 += sc;
1094 nameEx3->Append("_M_");
1095 *nameEx3 += mb;
1096 nameEx3->Append("_ED_");
1097 *nameEx3 += edB;
1098 nameEx3->Append("_Term_");
1099 *nameEx3 += term+1;
1100
1101 TString *namePC3 = new TString("PairCut3_Charge1_");
1102 *namePC3 += c1;
1103 namePC3->Append("_Charge2_");
1104 *namePC3 += c2;
1105 namePC3->Append("_Charge3_");
1106 *namePC3 += c3;
1107 namePC3->Append("_SC_");
1108 *namePC3 += sc;
1109 namePC3->Append("_M_");
1110 *namePC3 += mb;
1111 namePC3->Append("_ED_");
1112 *namePC3 += edB;
1113 namePC3->Append("_Term_");
1114 *namePC3 += term+1;
1115
1116 ///////////////////////////////////////
1117 // skip degenerate histograms
1118 if(sc==0 || sc==6 || sc==9){// Identical species
1119 if( (c1+c2+c3)==1) {if(c3!=1) continue;}
1120 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
1121 }else if(sc!=5){
1122 if( (c1+c2)==1) {if(c1!=0) continue;}
1123 }else {}// do nothing for pi-k-p case
1124
1125 /////////////////////////////////////////
1126
654866df 1127
1128
cd12341d 1129 if(fPdensityExplicitLoop){
1130 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fExplicit3 = new TH1D(nameEx3->Data(),"Three Particle Distribution",200,0,2);
1131 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fExplicit3);
1132 //
1133 nameEx3->Append("_Norm");
1134 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNormEx3 = new TH1D(nameEx3->Data(),"Explicit_3 Norm",1,-0.5,0.5);
1135 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNormEx3);
1136 }
1137 if(fPdensityPairCut){
1138 TString *nameNorm=new TString(namePC3->Data());
1139 nameNorm->Append("_Norm");
1140 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3 = new TH1D(nameNorm->Data(),"Norm",1,-0.5,0.5);
1141 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3);
1142 //
1143 if(sc<=2){
1144 TString *name3DQ=new TString(namePC3->Data());
1145 name3DQ->Append("_3D");
1146 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3 = new TH3D(name3DQ->Data(),"", kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1147 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3);
1148 //
baba9c2d 1149 /*
90814457 1150 const int NEdgesPos=16;
1151 double lowEdges4vectPos[NEdgesPos]={0};
1152 lowEdges4vectPos[0]=0.0;
6e805184 1153 lowEdges4vectPos[1]=0.00005;// best resolution at low Q^2
90814457 1154 for(int edge=2; edge<NEdgesPos; edge++){
1155 lowEdges4vectPos[edge] = lowEdges4vectPos[edge-1] + lowEdges4vectPos[1]*(edge);
1156 }
1157 const int NEdges=2*NEdgesPos-1;
fa109294 1158 double lowEdges4vect[NEdges]={0};
90814457 1159 for(int edge=0; edge<NEdges; edge++){
1160 if(edge<NEdgesPos-1) lowEdges4vect[edge] = -lowEdges4vectPos[NEdgesPos-1-edge];
1161 else if(edge==NEdgesPos-1) lowEdges4vect[edge] = 0;
1162 else lowEdges4vect[edge] = lowEdges4vectPos[edge-NEdgesPos+1];
6e805184 1163 //if(c1==c2 && c1==c3) cout<<lowEdges4vect[edge]<<endl;
fa109294 1164 }
6e805184 1165
5e3e77d6 1166 if(c1==c2 && c1==c3 && sc==0 && fMCcase==kFALSE){
90814457 1167 TString *name4vect1=new TString(namePC3->Data());
1168 TString *name4vect2=new TString(namePC3->Data());
1169 name4vect1->Append("_4VectProd1");
1170 name4vect2->Append("_4VectProd2");
5e3e77d6 1171 // use 3.75e6 MeV^4 as the resolution on QprodSum
90814457 1172 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1Terms = new TH3D(name4vect1->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1173 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1Terms);
1174 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2Terms = new TH3D(name4vect2->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1175 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2Terms);
baba9c2d 1176 }*/
5e3e77d6 1177 if(sc==0 && fMCcase==kTRUE){
1178 TString *name3DMomResIdeal=new TString(namePC3->Data());
1179 name3DMomResIdeal->Append("_Ideal");
1180 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal = new TH3D(name3DMomResIdeal->Data(),"", kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1181 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal);
1182 TString *name3DMomResSmeared=new TString(namePC3->Data());
1183 name3DMomResSmeared->Append("_Smeared");
1184 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared = new TH3D(name3DMomResSmeared->Data(),"", kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1185 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared);
601fbb33 1186 //
1187 TString *name3DMomResQW12=new TString(namePC3->Data());
1188 name3DMomResQW12->Append("_QW12");
1189 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fQW12 = new TH3D(name3DMomResQW12->Data(),"", kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1190 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fQW12);
1191 TString *name3DMomResQW13=new TString(namePC3->Data());
1192 name3DMomResQW13->Append("_QW13");
1193 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fQW13 = new TH3D(name3DMomResQW13->Data(),"", kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1194 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fQW13);
90814457 1195 //
1196 if(term==0){
1197 TString *name3DSumK3=new TString(namePC3->Data());
1198 name3DSumK3->Append("_SumK3");
1199 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSumK3 = new TH3D(name3DSumK3->Data(),"", kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1200 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSumK3);
1201 TString *name3DEnK3=new TString(namePC3->Data());
1202 name3DEnK3->Append("_EnK3");
1203 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fEnK3 = new TH3D(name3DEnK3->Data(),"", kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1204 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fEnK3);
1205 }
1206
baba9c2d 1207 /*if(c1==c2 && c1==c3){
90814457 1208 TString *name4vect1Ideal=new TString(namePC3->Data());
1209 TString *name4vect1Smeared=new TString(namePC3->Data());
1210 TString *name4vect2Ideal=new TString(namePC3->Data());
1211 TString *name4vect2Smeared=new TString(namePC3->Data());
0e58bc53 1212 TString *name4vect1Q3W=new TString(namePC3->Data());
1213 TString *name4vect2Q3W=new TString(namePC3->Data());
90814457 1214 name4vect1Ideal->Append("_4VectProd1Ideal");
1215 name4vect1Smeared->Append("_4VectProd1Smeared");
1216 name4vect2Ideal->Append("_4VectProd2Ideal");
1217 name4vect2Smeared->Append("_4VectProd2Smeared");
0e58bc53 1218 name4vect1Q3W->Append("_4VectProd1Q3W");
1219 name4vect2Q3W->Append("_4VectProd2Q3W");
1220 //
90814457 1221 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsIdeal = new TH3D(name4vect1Ideal->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1222 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsIdeal);
1223 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsSmeared = new TH3D(name4vect1Smeared->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1224 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsSmeared);
1225 //
1226 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsIdeal = new TH3D(name4vect2Ideal->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1227 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsIdeal);
1228 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsSmeared = new TH3D(name4vect2Smeared->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1229 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsSmeared);
1230 //
0e58bc53 1231 if(term==0){// average Q3 in each FVP cell
1232 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1Q3W = new TH3D(name4vect1Q3W->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1233 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1Q3W);
1234 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2Q3W = new TH3D(name4vect2Q3W->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1235 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2Q3W);
1236 }
1237 //
90814457 1238 if(term==0){
1239 TString *name4vect1SumK3=new TString(namePC3->Data());
1240 TString *name4vect2SumK3=new TString(namePC3->Data());
1241 TString *name4vect1EnK3=new TString(namePC3->Data());
1242 TString *name4vect2EnK3=new TString(namePC3->Data());
1243 name4vect1SumK3->Append("_4VectProd1SumK3");
1244 name4vect2SumK3->Append("_4VectProd2SumK3");
1245 name4vect1EnK3->Append("_4VectProd1EnK3");
1246 name4vect2EnK3->Append("_4VectProd2EnK3");
1247 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsSumK3 = new TH3D(name4vect1SumK3->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1248 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsSumK3);
1249 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsSumK3 = new TH3D(name4vect2SumK3->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1250 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsSumK3);
1251 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsEnK3 = new TH3D(name4vect1EnK3->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1252 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsEnK3);
1253 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsEnK3 = new TH3D(name4vect2EnK3->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1254 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsEnK3);
1255 }// term 0
1256 if(term > 0 && term < 4){
1257 TString *name4vect1SumK2=new TString(namePC3->Data());
1258 TString *name4vect2SumK2=new TString(namePC3->Data());
1259 TString *name4vect1EnK2=new TString(namePC3->Data());
1260 TString *name4vect2EnK2=new TString(namePC3->Data());
1261 name4vect1SumK2->Append("_4VectProd1SumK2");
1262 name4vect2SumK2->Append("_4VectProd2SumK2");
1263 name4vect1EnK2->Append("_4VectProd1EnK2");
1264 name4vect2EnK2->Append("_4VectProd2EnK2");
1265 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsSumK2 = new TH3D(name4vect1SumK2->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1266 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsSumK2);
1267 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsSumK2 = new TH3D(name4vect2SumK2->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1268 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsSumK2);
1269 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsEnK2 = new TH3D(name4vect1EnK2->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1270 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd1TermsEnK2);
1271 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsEnK2 = new TH3D(name4vect2EnK2->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1272 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProd2TermsEnK2);
1273 }// terms 1,2,3
baba9c2d 1274 }*/
90814457 1275 }// MCcase
5e3e77d6 1276 //
90814457 1277 if(c1==c2 && c1==c3 && term==4 && sc==0){
cd12341d 1278 for(Int_t dt=0; dt<kDENtypes; dt++){
1279 TString *nameDenType=new TString("PairCut3_Charge1_");
1280 *nameDenType += c1;
1281 nameDenType->Append("_Charge2_");
1282 *nameDenType += c2;
1283 nameDenType->Append("_Charge3_");
1284 *nameDenType += c3;
1285 nameDenType->Append("_SC_");
1286 *nameDenType += sc;
1287 nameDenType->Append("_M_");
1288 *nameDenType += mb;
1289 nameDenType->Append("_ED_");
1290 *nameDenType += edB;
1291 nameDenType->Append("_TPN_");
1292 *nameDenType += dt;
1293
1294 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNorm = new TH3D(nameDenType->Data(),"",kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1295 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNorm);
1296 // neglect errors for TPN
1297 //nameDenType->Append("_Err");
1298 //Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNormErr = new TH3D(nameDenType->Data(),"",kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1299 //fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNormErr);
5e3e77d6 1300 //
baba9c2d 1301 /*TString *name4vect1TPN=new TString(nameDenType->Data());
fa109294 1302 TString *name4vect2TPN=new TString(nameDenType->Data());
1303 name4vect1TPN->Append("_4VectProd1");
1304 name4vect2TPN->Append("_4VectProd2");
1305 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNorm = new TH3D(name4vect1TPN->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1306 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNorm);
1307 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNorm = new TH3D(name4vect2TPN->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1308 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNorm);
90814457 1309 //
1310 if(fMCcase){
1311 TString *name4vect1TPNIdeal=new TString(nameDenType->Data());
1312 TString *name4vect2TPNIdeal=new TString(nameDenType->Data());
1313 TString *name4vect1TPNSmeared=new TString(nameDenType->Data());
1314 TString *name4vect2TPNSmeared=new TString(nameDenType->Data());
1315 name4vect1TPNIdeal->Append("_4VectProd1Ideal");
1316 name4vect2TPNIdeal->Append("_4VectProd2Ideal");
1317 name4vect1TPNSmeared->Append("_4VectProd1Smeared");
1318 name4vect2TPNSmeared->Append("_4VectProd2Smeared");
1319 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNormIdeal = new TH3D(name4vect1TPNIdeal->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1320 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNormIdeal);
1321 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNormIdeal = new TH3D(name4vect2TPNIdeal->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1322 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNormIdeal);
1323 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNormSmeared = new TH3D(name4vect1TPNSmeared->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1324 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd1TwoPartNormSmeared);
1325 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNormSmeared = new TH3D(name4vect2TPNSmeared->Data(),"",NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect, NEdges-1,lowEdges4vect);
1326 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProd2TwoPartNormSmeared);
baba9c2d 1327 }*/
1328
cd12341d 1329 }
baba9c2d 1330
cd12341d 1331 }// term=4
1332 }// c and sc exclusion
1333 }// PdensityPairCut
1334 }// term_3
1335 }// SC_3
1336 }//c3
1337 }//c2
1338 }//c1
1339 }// ED
1340 }// mbin
1341 }// Pdensity Method
1342
1343
1344 if(fTabulatePairs){
1345
654866df 1346 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
1347 for(Int_t yKbin=0; yKbin<fKbinsY; yKbin++){
cd12341d 1348 for(Int_t mb=0; mb<fMbins; mb++){
654866df 1349 for(Int_t edB=0; edB<fEDbins; edB++){
cd12341d 1350
1351 TString *nameNum = new TString("TwoPart_num_Kt_");
1352 *nameNum += tKbin;
1353 nameNum->Append("_Ky_");
1354 *nameNum += yKbin;
1355 nameNum->Append("_M_");
1356 *nameNum += mb;
1357 nameNum->Append("_ED_");
1358 *nameNum += edB;
1359
1360 TString *nameDen = new TString("TwoPart_den_Kt_");
1361 *nameDen += tKbin;
1362 nameDen->Append("_Ky_");
1363 *nameDen += yKbin;
1364 nameDen->Append("_M_");
1365 *nameDen += mb;
1366 nameDen->Append("_ED_");
1367 *nameDen += edB;
1368
1369
654866df 1370 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fExplicit2ThreeD = new TH3D(nameNum->Data(),"", kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
cd12341d 1371 fOutputList->Add(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fExplicit2ThreeD);
1372
654866df 1373 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fExplicit2ThreeD = new TH3D(nameDen->Data(),"", kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
cd12341d 1374 fOutputList->Add(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fExplicit2ThreeD);
1375 }
1376 }
1377 }
1378 }
1379
1380 }
46b217b3 1381
cd12341d 1382
1383 TProfile *fQsmearMean = new TProfile("fQsmearMean","",2,0.5,2.5, -0.2,0.2,"");
1384 fOutputList->Add(fQsmearMean);
1385 TProfile *fQsmearSq = new TProfile("fQsmearSq","",2,0.5,2.5, -2,2,"");
1386 fOutputList->Add(fQsmearSq);
1387 TH1D *fQDist = new TH1D("fQDist","",200,-.2,.2);
1388 fOutputList->Add(fQDist);
1389
46b217b3 1390
cd12341d 1391
1392 ////////////////////////////////////
1393 ///////////////////////////////////
1394
1395 PostData(1, fOutputList);
1396}
1397
1398//________________________________________________________________________
1399void AliChaoticity::Exec(Option_t *)
1400{
1401 // Main loop
1402 // Called for each event
1ccd6f0d 1403 //cout<<"=========== Event # "<<fEventCounter+1<<" ==========="<<endl;
cd12341d 1404 fEventCounter++;
baba9c2d 1405
b6e5ec54 1406 if(!fAODcase) {cout<<"ESDs not supported"<<endl; return;}
cd12341d 1407
b6e5ec54 1408 fAOD = dynamic_cast<AliAODEvent*> (InputEvent());
1409 if (!fAOD) {Printf("ERROR: fAOD not available"); return;}
cd12341d 1410
cd12341d 1411
1412 // Trigger Cut
1413 if(fAOD->GetRunNumber() >= 136851 && fAOD->GetRunNumber() <= 139517){// 10h data
1414 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
fa109294 1415 if(!isSelected1 && !fMCcase) {return;}
5e3e77d6 1416 }else if(fAOD->GetRunNumber() >= 167693 && fAOD->GetRunNumber() <= 170593){// 11h data
cd12341d 1417 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kCentral);
1418 Bool_t isSelected2 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kSemiCentral);
fa109294 1419 if(!isSelected1 && !isSelected2 && !fMCcase) {return;}
1420 }else {return;}
cd12341d 1421
1422 ///////////////////////////////////////////////////////////
1423 const AliAODVertex *primaryVertexAOD;
1424 AliCentrality *centrality;// for AODs and ESDs
1425
1426
1427 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
1428 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
1429 fPIDResponse = inputHandler->GetPIDResponse();
1430
1431
1432 TClonesArray *mcArray = 0x0;
1433 if(fMCcase){
1434 if(fAODcase){
1435 mcArray = (TClonesArray*)fAOD->FindListObject(AliAODMCParticle::StdBranchName());
6e805184 1436 if(!mcArray || mcArray->GetEntriesFast() >= kMCarrayLimit){
cd12341d 1437 cout<<"No MC particle branch found or Array too large!!"<<endl;
cd12341d 1438 return;
1439 }
1440 }
1441 }
1442
1443
1444 UInt_t status=0;
1445 Int_t positiveTracks=0, negativeTracks=0;
1446 Int_t myTracks=0, pionCount=0, kaonCount=0, protonCount=0;
1447
1448 Double_t vertex[3]={0};
1449 Int_t zbin=0;
1450 Double_t zstep=2*10/Double_t(fZvertexBins), zstart=-10.;
1451 /////////////////////////////////////////////////
1452
1453
1454 Float_t centralityPercentile=0;
1455 Float_t cStep=5.0, cStart=0;
1456
1457
1458 if(fAODcase){// AOD case
1459
1460 if(fPbPbcase){
1461 centrality = fAOD->GetCentrality();
1462 centralityPercentile = centrality->GetCentralityPercentile("V0M");
1463 if(centralityPercentile == 0) {cout<<"Centrality = 0, skipping event"<<endl; return;}
5e3e77d6 1464 if((centralityPercentile < 5*fCentBinLowLimit) || (centralityPercentile>= 5*(fCentBinHighLimit+1))) {/*cout<<"Centrality out of Range. Skipping Event"<<endl;*/ return;}
cd12341d 1465 cout<<"Centrality % = "<<centralityPercentile<<endl;
1466 }
1467
1468
1469
1470
1471 ////////////////////////////////
1472 // Vertexing
1473 ((TH1F*)fOutputList->FindObject("fMultDist1"))->Fill(fAOD->GetNumberOfTracks());
1474 primaryVertexAOD = fAOD->GetPrimaryVertex();
1475 vertex[0]=primaryVertexAOD->GetX(); vertex[1]=primaryVertexAOD->GetY(); vertex[2]=primaryVertexAOD->GetZ();
1476
1477 if(fabs(vertex[2]) > 10) {cout<<"Zvertex Out of Range. Skip Event"<<endl; return;} // Z-Vertex Cut
1478 ((TH3F*)fOutputList->FindObject("fVertexDist"))->Fill(vertex[0], vertex[1], vertex[2]);
1479
1480 if(fAOD->IsPileupFromSPD()) {cout<<"PileUpEvent. Skip Event"<<endl; return;} // Reject Pile-up events
20d52fd9 1481 if(!fMCcase && primaryVertexAOD->GetNContributors() < 1) {cout<<"Bad Vertex. Skip Event"<<endl; return;}
cd12341d 1482
1483 ((TH1F*)fOutputList->FindObject("fMultDist2"))->Fill(fAOD->GetNumberOfTracks());
1484
1485 fBfield = fAOD->GetMagneticField();
2f00662e 1486
cd12341d 1487 for(Int_t i=0; i<fZvertexBins; i++){
1488 if( (vertex[2] >= zstart+i*zstep) && (vertex[2] < zstart+(i+1)*zstep) ){
1489 zbin=i;
1490 break;
1491 }
1492 }
1493
20d52fd9 1494
cd12341d 1495
1496 /////////////////////////////
1497 // Create Shuffled index list
1498 Int_t randomIndex[fAOD->GetNumberOfTracks()];
1499 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) randomIndex[i]=i;
1500 Shuffle(randomIndex,0,fAOD->GetNumberOfTracks()-1);
1501 /////////////////////////////
1502
1503 // Track loop
1504 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
1505 AliAODTrack* aodtrack = fAOD->GetTrack(randomIndex[i]);
1506 if (!aodtrack) continue;
1507 if(myTracks >= fMultLimit) {cout<<"More tracks than Track Limit"<<endl; return;}
1508
1509 status=aodtrack->GetStatus();
1510
e29e02c1 1511
654866df 1512 if(!aodtrack->TestFilterBit(BIT(fFilterBit))) continue;// AOD filterBit cut
1513
cd12341d 1514 if(aodtrack->Pt() < 0.16) continue;
1515 if(fabs(aodtrack->Eta()) > 0.8) continue;
e29e02c1 1516
cd12341d 1517
1518 Bool_t goodMomentum = aodtrack->GetPxPyPz( fTempStruct[myTracks].fP);
1519 if(!goodMomentum) continue;
1520 aodtrack->GetXYZ( fTempStruct[myTracks].fX);
e29e02c1 1521
cd12341d 1522 Float_t dca2[2];
1523 Float_t dca3d;
1524
1525 dca2[0] = sqrt( pow(fTempStruct[myTracks].fX[0] - vertex[0],2) + pow(fTempStruct[myTracks].fX[1] - vertex[1],2));
1526 dca2[1] = sqrt( pow(fTempStruct[myTracks].fX[2] - vertex[2],2));
1527 dca3d = sqrt( pow(dca2[0],2) + pow(dca2[1],2));
1528
1529 fTempStruct[myTracks].fStatus = status;
1530 fTempStruct[myTracks].fFiltermap = aodtrack->GetFilterMap();
1531 fTempStruct[myTracks].fId = aodtrack->GetID();
1532 fTempStruct[myTracks].fLabel = aodtrack->GetLabel();
1533 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
1534 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
1535 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
1536 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
1537 fTempStruct[myTracks].fEta = aodtrack->Eta();
1538 fTempStruct[myTracks].fCharge = aodtrack->Charge();
1539 fTempStruct[myTracks].fDCAXY = dca2[0];
1540 fTempStruct[myTracks].fDCAZ = dca2[1];
1541 fTempStruct[myTracks].fDCA = dca3d;
1542 fTempStruct[myTracks].fClusterMap = aodtrack->GetTPCClusterMap();
1543 fTempStruct[myTracks].fSharedMap = aodtrack->GetTPCSharedMap();
1544
1545
1546
1547 if(fTempStruct[myTracks].fMom > 0.9999) continue;// upper P bound
1548 if(fTempStruct[myTracks].fPt > 0.9999) continue;// upper P bound
1549 if(fTempStruct[myTracks].fP[2] > 0.9999) continue;// upper P bound
1550
1551 if(fTempStruct[myTracks].fCharge==+1) {
1552 ((TH2F*)fOutputList->FindObject("fDCAxyDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1553 ((TH2F*)fOutputList->FindObject("fDCAzDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1554 }else {
1555 ((TH2F*)fOutputList->FindObject("fDCAxyDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1556 ((TH2F*)fOutputList->FindObject("fDCAzDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1557 }
1558
1559 ((TH3F*)fOutputList->FindObject("fPhiPtDist"))->Fill(aodtrack->Charge(), aodtrack->Phi(), aodtrack->Pt());
1560 ((TH3F*)fOutputList->FindObject("fPtEtaDist"))->Fill(aodtrack->Charge(), aodtrack->Pt(), aodtrack->Eta());
1561
05db4376 1562
1563 // PID section
cd12341d 1564 fTempStruct[myTracks].fElectron = kFALSE;
1565 fTempStruct[myTracks].fPion = kFALSE;
1566 fTempStruct[myTracks].fKaon = kFALSE;
1567 fTempStruct[myTracks].fProton = kFALSE;
1568
1569 Float_t nSigmaTPC[5];
1570 Float_t nSigmaTOF[5];
1571 nSigmaTPC[0]=10; nSigmaTPC[1]=10; nSigmaTPC[2]=10; nSigmaTPC[3]=10; nSigmaTPC[4]=10;
1572 nSigmaTOF[0]=10; nSigmaTOF[1]=10; nSigmaTOF[2]=10; nSigmaTOF[3]=10; nSigmaTOF[4]=10;
1573 fTempStruct[myTracks].fTOFhit = kFALSE;// default
1574 Float_t signalTPC=0, signalTOF=0;
1575 Double_t integratedTimesTOF[10]={0};
cd12341d 1576
05db4376 1577 if(fFilterBit != 7) {
1578 nSigmaTPC[0]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kElectron));
1579 nSigmaTPC[1]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kMuon));
1580 nSigmaTPC[2]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kPion));
1581 nSigmaTPC[3]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kKaon));
1582 nSigmaTPC[4]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kProton));
cd12341d 1583 //
05db4376 1584 nSigmaTOF[0]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kElectron));
1585 nSigmaTOF[1]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kMuon));
1586 nSigmaTOF[2]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kPion));
1587 nSigmaTOF[3]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kKaon));
1588 nSigmaTOF[4]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kProton));
1589 signalTPC = aodtrack->GetTPCsignal();
1590 if( (status&AliESDtrack::kTOFpid)!=0 && (status&AliESDtrack::kTIME)!=0 && (status&AliESDtrack::kTOFout)!=0 && (status&AliESDtrack::kTOFmismatch)<=0){// good tof hit
cd12341d 1591 fTempStruct[myTracks].fTOFhit = kTRUE;
05db4376 1592 signalTOF = aodtrack->GetTOFsignal();
1593 aodtrack->GetIntegratedTimes(integratedTimesTOF);
cd12341d 1594 }else fTempStruct[myTracks].fTOFhit = kFALSE;
05db4376 1595
1596 }else {// FilterBit 7 PID workaround
1597
1598 for(Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1599 AliAODTrack* aodTrack2 = fAOD->GetTrack(j);
1600 if (!aodTrack2) continue;
1601 if(aodtrack->GetID() != (-aodTrack2->GetID() - 1)) continue;// (-aodTrack2->GetID() - 1)
1602
1603 UInt_t status2=aodTrack2->GetStatus();
1604
1605 nSigmaTPC[0]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kElectron));
1606 nSigmaTPC[1]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kMuon));
1607 nSigmaTPC[2]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kPion));
1608 nSigmaTPC[3]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kKaon));
1609 nSigmaTPC[4]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kProton));
1610 //
1611 nSigmaTOF[0]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kElectron));
1612 nSigmaTOF[1]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kMuon));
1613 nSigmaTOF[2]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kPion));
1614 nSigmaTOF[3]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kKaon));
1615 nSigmaTOF[4]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kProton));
1616 signalTPC = aodTrack2->GetTPCsignal();
1617
1618 if( (status2&AliESDtrack::kTOFpid)!=0 && (status2&AliESDtrack::kTIME)!=0 && (status2&AliESDtrack::kTOFout)!=0 && (status2&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1619 fTempStruct[myTracks].fTOFhit = kTRUE;
1620 signalTOF = aodTrack2->GetTOFsignal();
1621 aodTrack2->GetIntegratedTimes(integratedTimesTOF);
1622 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1623
1624 }// aodTrack2
1625 }// FilterBit 7 PID workaround
1626
1627
cd12341d 1628 ///////////////////
1629 ((TH3F*)fOutputList->FindObject("fTPCResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTPC);
1630 if(fTempStruct[myTracks].fTOFhit) {
1631 ((TH3F*)fOutputList->FindObject("fTOFResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTOF - integratedTimesTOF[3]);
1632 }
1633 ///////////////////
1634
1635 // Use TOF if good hit and above threshold
1636 if(fTempStruct[myTracks].fTOFhit && fTempStruct[myTracks].fMom > fTPCTOFboundry){
1637 if(nSigmaTOF[0]<fSigmaCutTOF) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1638 if(nSigmaTOF[2]<fSigmaCutTOF) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1639 if(nSigmaTOF[3]<fSigmaCutTOF) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1640 if(nSigmaTOF[4]<fSigmaCutTOF) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1641 }else {// TPC info instead
1642 if(nSigmaTPC[0]<fSigmaCutTPC) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1643 if(nSigmaTPC[2]<fSigmaCutTPC) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1644 if(nSigmaTPC[3]<fSigmaCutTPC) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1645 if(nSigmaTPC[4]<fSigmaCutTPC) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1646 }
05db4376 1647
cd12341d 1648
1649 // Ensure there is only 1 candidate per track
1650 if(fTempStruct[myTracks].fElectron && fTempStruct[myTracks].fMom < 0.45) continue;// Remove electron band
1651 if(!fTempStruct[myTracks].fPion && !fTempStruct[myTracks].fKaon && !fTempStruct[myTracks].fProton) continue;
1652 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon) continue;
1653 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fProton) continue;
1654 if(fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
1655 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
1656 ////////////////////////
1657 if(fTempStruct[myTracks].fProton && fTempStruct[myTracks].fMom < 0.25) continue;//extra cut for protons
1658
1659 if(!fTempStruct[myTracks].fPion) continue;// only pions
1660
1661
1662
1663
1664 if(fTempStruct[myTracks].fPion) {// pions
1665 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassPi,2));
1666 fTempStruct[myTracks].fKey = 1;
1667 }else if(fTempStruct[myTracks].fKaon){// kaons
1668 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassK,2));;
1669 fTempStruct[myTracks].fKey = 10;
1670 }else{// protons
1671 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassP,2));;
1672 fTempStruct[myTracks].fKey = 100;
1673 }
1674
dbcaf506 1675
1676 ((TH2D*)fOutputList->FindObject("fTrackChi2NDF"))->Fill(centralityPercentile, aodtrack->Chi2perNDF());
1677 ((TH2D*)fOutputList->FindObject("fTrackTPCncls"))->Fill(centralityPercentile, aodtrack->GetTPCncls());
1678 if(aodtrack->Chi2perNDF() > fMaxChi2NDF) continue;
1679 if(aodtrack->GetTPCncls() < fMinTPCncls) continue;
1680
1681
cd12341d 1682 if(aodtrack->Charge() > 0) positiveTracks++;
1683 else negativeTracks++;
1684
1685 if(fTempStruct[myTracks].fPion) pionCount++;
1686 if(fTempStruct[myTracks].fKaon) kaonCount++;
1687 if(fTempStruct[myTracks].fProton) protonCount++;
1688
1689 myTracks++;
1690
1691 }
1692 }else {// ESD tracks
1693 cout<<"ESDs not supported currently"<<endl;
1694 return;
1695 }
1696
1697
1698 if(myTracks >= 1) {
1699 ((TH1F*)fOutputList->FindObject("fMultDist3"))->Fill(myTracks);
1700 }
1701
1702
b6e5ec54 1703 //cout<<"There are "<<myTracks<<" myTracks"<<endl;
1704 //cout<<"pionCount = "<<pionCount<<" kaonCount = "<<kaonCount<<" protonCount = "<<protonCount<<endl;
cd12341d 1705
1706 /////////////////////////////////////////
1707 // Pion Multiplicity Cut (To ensure all Correlation orders are present in each event)
1708 if(myTracks < 3) {cout<<"Less than 3 tracks. Skipping Event."<<endl; return;}
1709 /////////////////////////////////////////
fa109294 1710
cd12341d 1711
1712 ////////////////////////////////
1713 ///////////////////////////////
1714 // Mbin determination
1715 //
1716 // Mbin set to Pion Count Only for pp!!!!!!!
1717 fMbin=-1;
1718 if(!fPbPbcase){
1719 for(Int_t i=0; i<kMultBinspp; i++){
1720 if( ( pionCount > fMultLimits[i]) && ( pionCount <= fMultLimits[i+1]) ) { fMbin=i; break;}
1721 // Mbin 0 has 1 pion
1722 }
1723 }else{
654866df 1724 for(Int_t i=0; i<fCentBins; i++){
cd12341d 1725 if( (centralityPercentile >= cStart+i*cStep) && (centralityPercentile < cStart+(i+1)*cStep) ){
1726 fMbin=i;// 0 = most central
1727 break;
1728 }
1729 }
1730 }
1731
1732 if(fMbin==-1) {cout<<"Bad Mbin+++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl; return;}
1733
704f2481 1734 fFSIbin=0;
ae9b34d1 1735 if(fMbin==0) fFSIbin = 0;//0-5%
1736 else if(fMbin==1) fFSIbin = 1;//5-10%
1737 else if(fMbin<=3) fFSIbin = 2;//10-20%
1738 else if(fMbin<=5) fFSIbin = 3;//20-30%
1739 else if(fMbin<=7) fFSIbin = 4;//30-40%
1740 else fFSIbin = 5;//40-50%
1741
05db4376 1742 Int_t rIndexForTPNMomRes = fRMax-6;
05db4376 1743 if(fMbin==0) {rIndexForTPNMomRes=fRMax-6;}// 10 fm with EW (fRMax should be 11 for normal running)
1744 else if(fMbin==1) {rIndexForTPNMomRes=fRMax-7;}
1745 else if(fMbin<=3) {rIndexForTPNMomRes=fRMax-8;}
1746 else if(fMbin<=5) {rIndexForTPNMomRes=fRMax-9;}
1747 else {rIndexForTPNMomRes=fRMax-10;}
90814457 1748
cd12341d 1749 //////////////////////////////////////////////////
1750 fEDbin=0;// Extra Dimension bin (Kt, (Kt-Psi),....)
1751 //////////////////////////////////////////////////
1752
20d52fd9 1753
654866df 1754
cd12341d 1755 ((TH1F*)fOutputList->FindObject("fEvents1"))->Fill(fMbin+1);
1756 ((TProfile*)fOutputList->FindObject("fAvgMult"))->Fill(fMbin+1., pionCount);
1757
1758 ////////////////////////////////////
1759 // Add event to buffer if > 0 tracks
1760 if(myTracks > 0){
1761 fEC[zbin][fMbin]->FIFOShift();
1762 (fEvt) = fEC[zbin][fMbin]->fEvtStr;
1763 (fEvt)->fNtracks = myTracks;
1764 (fEvt)->fFillStatus = 1;
1765 for(Int_t i=0; i<myTracks; i++) (fEvt)->fTracks[i] = fTempStruct[i];
1766 if(fMCcase){
1767 (fEvt)->fMCarraySize = mcArray->GetEntriesFast();
1768 for(Int_t i=0; i<mcArray->GetEntriesFast(); i++) {
1769 AliAODMCParticle *tempMCTrack = (AliAODMCParticle*)mcArray->At(i);
1770 (fEvt)->fMCtracks[i].fPx = tempMCTrack->Px();
1771 (fEvt)->fMCtracks[i].fPy = tempMCTrack->Py();
1772 (fEvt)->fMCtracks[i].fPz = tempMCTrack->Pz();
1773 (fEvt)->fMCtracks[i].fPtot = sqrt(pow(tempMCTrack->Px(),2)+pow(tempMCTrack->Py(),2)+pow(tempMCTrack->Pz(),2));
1774 }
1775 }
1776 }
1777
20d52fd9 1778
cd12341d 1779
1780 Float_t qinv12=0, qinv13=0, qinv23=0;
1781 Float_t qout=0, qside=0, qlong=0;
1782 Float_t qoutMC=0, qsideMC=0, qlongMC=0;
df2ce8e1 1783 Float_t firstQ=0, secondQ=0, thirdQ=0;
1784 Float_t firstQMC=0, secondQMC=0, thirdQMC=0;
cd12341d 1785 Float_t transK12=0, rapK12=0, transK3=0;
1786 Int_t transKbin=0, rapKbin=0;
05db4376 1787 Float_t q3=0, q3MC=0;
cd12341d 1788 Int_t ch1=0, ch2=0, ch3=0;
1789 Short_t key1=0, key2=0, key3=0;
1790 Int_t bin1=0, bin2=0, bin3=0;
1791 Float_t pVect1[4]={0};
1792 Float_t pVect2[4]={0};
1793 Float_t pVect3[4]={0};
1794 Float_t pVect1MC[4]={0};
1795 Float_t pVect2MC[4]={0};
5e3e77d6 1796 Float_t pVect3MC[4]={0};
cd12341d 1797 Int_t index1=0, index2=0, index3=0;
1798 Float_t weight12=0, weight13=0, weight23=0;
1799 Float_t weight12Err=0, weight13Err=0, weight23Err=0;
1800 Float_t weight12CC=0, weight13CC=0, weight23CC=0;
1801 Float_t weightTotal=0;//, weightTotalErr=0;
5e3e77d6 1802 Float_t qinv12MC=0, qinv13MC=0, qinv23MC=0;
20d52fd9 1803 //Float_t Qsum1v1=0, Qsum2=0, Qsum3v1=0, Qsum1v2=0, Qsum3v2=0;
1804 //Float_t Qsum1v1MC=0, Qsum2MC=0, Qsum3v1MC=0, Qsum1v2MC=0, Qsum3v2MC=0;
90814457 1805 //
cd12341d 1806 AliAODMCParticle *mcParticle1=0x0;
1807 AliAODMCParticle *mcParticle2=0x0;
1808
1809
1810 if(fPdensityPairCut){
1811 ////////////////////
1812 Int_t pairCountSE=0, pairCountME=0;
1813 Int_t normPairCount[2]={0};
1814 Int_t numOtherPairs1[2][fMultLimit];
1815 Int_t numOtherPairs2[2][fMultLimit];
1816 Bool_t exitCode=kFALSE;
1817 Int_t tempNormFillCount[2][2][2][10][5];
1818
1819
1820 // reset to defaults
1821 for(Int_t i=0; i<fMultLimit; i++) {
1822 fPairLocationSE[i]->Set(fMultLimit,fDefaultsInt);
1823 fPairLocationME[i]->Set(fMultLimit,fDefaultsInt);
1824
1825 // Normalization Utilities
1826 fOtherPairLocation1[0][i]->Set(fMultLimit,fDefaultsInt);
1827 fOtherPairLocation1[1][i]->Set(fMultLimit,fDefaultsInt);
1828 fOtherPairLocation2[0][i]->Set(fMultLimit,fDefaultsInt);
1829 fOtherPairLocation2[1][i]->Set(fMultLimit,fDefaultsInt);
1830 fNormPairSwitch[0][i]->Set(fMultLimit,fDefaultsCharMult);
1831 fNormPairSwitch[1][i]->Set(fMultLimit,fDefaultsCharMult);
1832 fNormPairSwitch[2][i]->Set(fMultLimit,fDefaultsCharMult);
1833 numOtherPairs1[0][i]=0;
1834 numOtherPairs1[1][i]=0;
1835 numOtherPairs2[0][i]=0;
1836 numOtherPairs2[1][i]=0;
1837
1838 // Track Merging/Splitting Utilities
1839 fPairSplitCut[0][i]->Set(fMultLimit,fDefaultsCharMult);// P11
1840 fPairSplitCut[1][i]->Set(fMultLimit,fDefaultsCharMult);// P12
1841 fPairSplitCut[2][i]->Set(fMultLimit,fDefaultsCharMult);// P13
1842 fPairSplitCut[3][i]->Set(fMultLimit,fDefaultsCharMult);// P23
1843 }
1844
1845 // Reset the temp Normalization counters
1846 for(Int_t i=0; i<2; i++){// Charge1
1847 for(Int_t j=0; j<2; j++){// Charge2
1848 for(Int_t k=0; k<2; k++){// Charge3
1849 for(Int_t l=0; l<10; l++){// FillIndex (species Combination)
1850 for(Int_t m=0; m<5; m++){// Term (Cumulant term)
1851 tempNormFillCount[i][j][k][l][m] = 0;
1852 }
1853 }
1854 }
1855 }
1856 }
1857
1858
1859 ///////////////////////////////////////////////////////
1860 // Start the pairing process
1861 // P11 pairing
1862 // 1st Particle
20d52fd9 1863
cd12341d 1864 for (Int_t i=0; i<myTracks; i++) {
1865
1866 Int_t en2=0;
1867
1868 // 2nd particle
1869 for (Int_t j=i+1; j<(fEvt+en2)->fNtracks; j++) {
1870
1871 key1 = (fEvt)->fTracks[i].fKey;
1872 key2 = (fEvt+en2)->fTracks[j].fKey;
1873 Short_t fillIndex2 = FillIndex2part(key1+key2);
1874 Short_t qCutBin = SetQcutBin(fillIndex2);
1875 Short_t normBin = SetNormBin(fillIndex2);
1876 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
1877 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
1878 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
1879 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
654866df 1880
cd12341d 1881 //
1882
1883 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
1884 GetQosl(pVect1, pVect2, qout, qside, qlong);
1885 transK12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
3eebc801 1886
1887
654866df 1888 //
1889
cd12341d 1890 ///////////////////////////////
1891 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
1892 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
1893 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
1894
e29e02c1 1895 if(fMCcase && ch1==ch2 && fMbin==0 && qinv12<0.2){
1896 //////////////////////////
1897 // pad-row method testing
1898 Float_t coeff = (5)*0.2*(0.18/1.2);// 5 to evaluate at 1.0m in TPC
1899 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
1900 if(phi1 > 2*PI) phi1 -= 2*PI;
1901 if(phi1 < 0) phi1 += 2*PI;
1902 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
1903 if(phi2 > 2*PI) phi2 -= 2*PI;
1904 if(phi2 < 0) phi2 += 2*PI;
1905 Float_t deltaphi = phi1 - phi2;
1906 if(deltaphi > PI) deltaphi -= PI;
1907 if(deltaphi < -PI) deltaphi += PI;
1908
1909 Int_t ncl1 = (fEvt)->fTracks[i].fClusterMap.GetNbits();
1910 Int_t ncl2 = (fEvt+en2)->fTracks[j].fClusterMap.GetNbits();
1911 Float_t sumCls = 0; Float_t sumSha = 0; Float_t sumQ = 0;
1912 Double_t shfrac = 0; //Double_t qfactor = 0;
1913 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
1914 if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Both clusters
1915 if ((fEvt)->fTracks[i].fSharedMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fSharedMap.TestBitNumber(imap)) { // Shared
1916 sumQ++;
1917 sumCls+=2;
1918 sumSha+=2;}
1919 else {sumQ--; sumCls+=2;}
1920 }
1921 else if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) || (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Non shared
1922 sumQ++;
1923 sumCls++;}
1924 }
1925 if (sumCls>0) {
1926 //qfactor = sumQ*1.0/sumCls;
1927 shfrac = sumSha*1.0/sumCls;
1928 }
1929 if(fabs(deltaphi)<0.07 && fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
1930 ((TH3D*)fOutputList->FindObject("fPairsPadRowNum"))->Fill(transK12, shfrac, qinv12);
1931 }
1932
cd12341d 1933 for(Int_t rstep=0; rstep<10; rstep++){
e29e02c1 1934 coeff = (rstep)*0.2*(0.18/1.2);
1935 phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
cd12341d 1936 if(phi1 > 2*PI) phi1 -= 2*PI;
1937 if(phi1 < 0) phi1 += 2*PI;
e29e02c1 1938 phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
cd12341d 1939 if(phi2 > 2*PI) phi2 -= 2*PI;
1940 if(phi2 < 0) phi2 += 2*PI;
e29e02c1 1941 deltaphi = phi1 - phi2;
cd12341d 1942 if(deltaphi > PI) deltaphi -= PI;
1943 if(deltaphi < -PI) deltaphi += PI;
e29e02c1 1944
1945 if(fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
1946 ((TH3F*)fOutputList->FindObject("fPairsShareFracDPhiNum"))->Fill(rstep, shfrac, deltaphi);
1947 }
1948 //if(shfrac < 0.05){
cd12341d 1949 ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiNum"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
e29e02c1 1950 //}
cd12341d 1951 }
e29e02c1 1952
1953
1954 }// MCcase and pair selection
20d52fd9 1955
cd12341d 1956 // Pair Splitting/Merging cut
e29e02c1 1957 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting/merging cut)
cd12341d 1958 if(ch1 == ch2){
1959 if(!AcceptPair((fEvt)->fTracks[i], (fEvt+en2)->fTracks[j])) {
1960 fPairSplitCut[0][i]->AddAt('1',j);
1961 ((TH1F*)fOutputList->FindObject("fRejectedPairs"))->Fill(qinv12);
1962 continue;
1963 }
1964 }
e29e02c1 1965
cd12341d 1966 // HIJING tests
1967 if(fMCcase && fillIndex2==0){
1968
1969 // Check that label does not exceed stack size
1970 if((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize && (fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize){
1971 pVect1MC[0]=sqrt(pow((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1972 pVect2MC[0]=sqrt(pow((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1973 pVect1MC[1]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx; pVect2MC[1]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
1974 pVect1MC[2]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy; pVect2MC[2]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
1975 pVect1MC[3]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz; pVect2MC[3]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
1976 qinv12MC = GetQinv(fillIndex2, pVect1MC, pVect2MC);
1977 GetQosl(pVect1MC, pVect2MC, qoutMC, qsideMC, qlongMC);
1978 if(qinv12<0.1 && ch1==ch2) {
1979 ((TProfile*)fOutputList->FindObject("fQsmearMean"))->Fill(1.,qinv12-qinv12MC);
1980 ((TProfile*)fOutputList->FindObject("fQsmearSq"))->Fill(1.,1000.*pow(qinv12-qinv12MC,2));
1981 ((TH1D*)fOutputList->FindObject("fQDist"))->Fill(qinv12-qinv12MC);
1982 }
1983
3eebc801 1984 //if(transK12 <= 0.35) fEDbin=0;
1985 //else fEDbin=1;
1986
df2ce8e1 1987 /*for(Int_t rIter=0; rIter<fRVALUES; rIter++){// 3fm to 8fm + 1 Therminator setting
cd12341d 1988 for(Int_t myDampIt=0; myDampIt<kNDampValues; myDampIt++){
1989 Int_t denIndex = rIter*kNDampValues + myDampIt;
05db4376 1990 Float_t WInput = MCWeight(ch1,ch2, rIter+kRmin, myDampIt, qinv12MC);
cd12341d 1991 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fIdeal->Fill(denIndex, qinv12MC, WInput);
1992 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fIdeal->Fill(denIndex, qinv12MC);
1993 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fSmeared->Fill(denIndex, qinv12, WInput);
1994 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fSmeared->Fill(denIndex, qinv12);
1995 }
df2ce8e1 1996 }*/
3eebc801 1997 //fEDbin=0;
1998
fa109294 1999 mcParticle1 = (AliAODMCParticle*)mcArray->At(abs((fEvt)->fTracks[i].fLabel));
2000 mcParticle2 = (AliAODMCParticle*)mcArray->At(abs((fEvt+en2)->fTracks[j].fLabel));
2001
cd12341d 2002 //HIJING resonance test
2003 if(ch1 != ch2){
cd12341d 2004 ((TH1F*)fOutputList->FindObject("fAllOSPairs"))->Fill(fMbin+1, qinv12);
fa109294 2005 if(abs(mcParticle1->GetPdgCode())==211 && abs(mcParticle2->GetPdgCode())==211){// Pions
cd12341d 2006 if(mcParticle1->GetMother() == mcParticle2->GetMother() && mcParticle1->GetMother() >=0){
2007 ((TH1F*)fOutputList->FindObject("fResonanceOSPairs"))->Fill(fMbin+1, qinv12);
2008 }
2009 }
2010 }
e29e02c1 2011 // secondary contamination
2012 if(abs(mcParticle1->GetPdgCode())==211 && abs(mcParticle2->GetPdgCode())==211){
2013 if(ch1==ch2) {
2014 ((TH3D*)fOutputList->FindObject("fAllSCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
2015 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
2016 ((TH3D*)fOutputList->FindObject("fPrimarySCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
2017 }
2018 }else{
2019 ((TH3D*)fOutputList->FindObject("fAllMCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
2020 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
2021 ((TH3D*)fOutputList->FindObject("fPrimaryMCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
2022 }
2023 }
2024 }
2025
05db4376 2026 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fMCqinv->Fill(qinv12MC, MCWeight(ch1,ch2,10,10,qinv12MC));// was 4,5
2027 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fMCqinvQW->Fill(qinv12MC, qinv12MC*MCWeight(ch1,ch2,10,10,qinv12MC));// was 4,5
54d66278 2028 // pion purity
2029 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fPIDpurityDen->Fill(transK12, qinv12);
2030 if(abs(mcParticle1->GetPdgCode())==211 && abs(mcParticle2->GetPdgCode())==211){// Pions
2031 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fPIDpurityNum->Fill(transK12, qinv12);
2032 }
2033
cd12341d 2034 }// label check 2
2035 }// MC case
a05cda99 2036
cd12341d 2037 //////////////////////////////////////////
2038 // 2-particle term
2039 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2->Fill(transK12, qinv12);
5e3e77d6 2040 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2QW->Fill(transK12, qinv12, qinv12);
704f2481 2041 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fAvgP->Fill(transK12, qinv12, (fEvt)->fTracks[i].fMom);
2042 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fAvgP->Fill(transK12, qinv12, (fEvt+en2)->fTracks[j].fMom);
fa109294 2043
cd12341d 2044 // osl frame
fa109294 2045 if(fillIndex2==0){
cd12341d 2046 if((transK12 > 0.2) && (transK12 < 0.3)){
2047 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[0].fExplicit2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
2048 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[0].fExplicit2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
2049 }
2050 if((transK12 > 0.6) && (transK12 < 0.7)){
2051 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[1].fExplicit2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
2052 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[1].fExplicit2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
2053 }
2054 }
5e3e77d6 2055
cd12341d 2056 //////////////////////////////////////////
2057 if(fTabulatePairs){
2058 if(fillIndex2==0 && bin1==bin2){
2059 rapK12 = 0;
2060 transKbin=-1; rapKbin=-1;
654866df 2061
2062 for(Int_t kIt=0; kIt<fKbinsT; kIt++) {if(transK12 < (fKmiddleT[kIt] + fKstepT[kIt]/2.)) {transKbin = kIt; break;}}
2063 for(Int_t kIt=0; kIt<fKbinsY; kIt++) {if(rapK12 < (fKmiddleY[kIt] + fKstepY[kIt]/2.)) {rapKbin = kIt; break;}}
cd12341d 2064 if((transKbin<0) || (rapKbin<0)) {cout<<"problem!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl; continue;}
654866df 2065 if((transKbin>=fKbinsT) || (rapKbin>=fKbinsY)) {cout<<"problem!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl; continue;}
2066 Float_t WInput = 1.0;
2067 if(fGenerateSignal) {
baba9c2d 2068 WInput = MCWeight(ch1,ch2, fRMax, fFixedLambdaBinr3, qinv12);
2069 //WInput = MCWeight(ch1,ch2, fRMax, fFixedLambdaBinr3, qinv12MC);
2f00662e 2070 KT[transKbin].KY[rapKbin].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2ThreeD->Fill(fabs(qout), fabs(qside), fabs(qlong), WInput);
654866df 2071 }else KT[transKbin].KY[rapKbin].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2ThreeD->Fill(fabs(qout), fabs(qside), fabs(qlong));
2072
cd12341d 2073 continue;
2074 }
2075 }
2076
2077
2078 // exit out of loop if there are too many pairs
654866df 2079 if(pairCountSE >= kPairLimit) {exitCode=kTRUE; continue;}// Too many SE pairs
cd12341d 2080 if(exitCode) continue;
5e3e77d6 2081
cd12341d 2082 //////////////////////////
2083 // Enforce the Qcut
2084 if(qinv12 <= fQcut[qCutBin]) {
5e3e77d6 2085
cd12341d 2086 ///////////////////////////
2087 // particle 1
2088 (fEvt)->fPairsSE[pairCountSE].fP1[0] = (fEvt)->fTracks[i].fP[0];
2089 (fEvt)->fPairsSE[pairCountSE].fP1[1] = (fEvt)->fTracks[i].fP[1];
2090 (fEvt)->fPairsSE[pairCountSE].fP1[2] = (fEvt)->fTracks[i].fP[2];
2091 (fEvt)->fPairsSE[pairCountSE].fE1 = (fEvt)->fTracks[i].fEaccepted;
2092 (fEvt)->fPairsSE[pairCountSE].fCharge1 = (fEvt)->fTracks[i].fCharge;
2093 (fEvt)->fPairsSE[pairCountSE].fIndex1 = i;
2094 (fEvt)->fPairsSE[pairCountSE].fKey1 = key1;
2095 (fEvt)->fPairsSE[pairCountSE].fLabel1 = (fEvt)->fTracks[i].fLabel;
2096 if(fMCcase && ((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize)){
2097 (fEvt)->fPairsSE[pairCountSE].fP1MC[0] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx;
2098 (fEvt)->fPairsSE[pairCountSE].fP1MC[1] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy;
2099 (fEvt)->fPairsSE[pairCountSE].fP1MC[2] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz;
5e3e77d6 2100 }
cd12341d 2101 // particle 2
2102 (fEvt)->fPairsSE[pairCountSE].fP2[0] = (fEvt+en2)->fTracks[j].fP[0];
2103 (fEvt)->fPairsSE[pairCountSE].fP2[1] = (fEvt+en2)->fTracks[j].fP[1];
2104 (fEvt)->fPairsSE[pairCountSE].fP2[2] = (fEvt+en2)->fTracks[j].fP[2];
2105 (fEvt)->fPairsSE[pairCountSE].fE2 = (fEvt+en2)->fTracks[j].fEaccepted;
2106 (fEvt)->fPairsSE[pairCountSE].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2107 (fEvt)->fPairsSE[pairCountSE].fIndex2 = j;
2108 (fEvt)->fPairsSE[pairCountSE].fKey2 = key2;
2109 (fEvt)->fPairsSE[pairCountSE].fLabel2 = (fEvt+en2)->fTracks[j].fLabel;
2110 if(fMCcase && ((fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize)){
2111 (fEvt)->fPairsSE[pairCountSE].fP2MC[0] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
2112 (fEvt)->fPairsSE[pairCountSE].fP2MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
2113 (fEvt)->fPairsSE[pairCountSE].fP2MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
2114 }
5e3e77d6 2115
cd12341d 2116 (fEvt)->fPairsSE[pairCountSE].fQinv = qinv12;
2117
2118 fPairLocationSE[i]->AddAt(pairCountSE,j);
2119
2120 pairCountSE++;
2121
2122 }
2123
2124
2125 /////////////////////////////////////////////////////////
2126 // Normalization Region
2127
2128 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2129 // particle 1
2130 fNormPairs[en2][normPairCount[en2]].fCharge1 = (fEvt)->fTracks[i].fCharge;
2131 fNormPairs[en2][normPairCount[en2]].fIndex1 = i;
2132 fNormPairs[en2][normPairCount[en2]].fKey1 = (fEvt)->fTracks[i].fKey;
2133 // particle 2
2134 fNormPairs[en2][normPairCount[en2]].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2135 fNormPairs[en2][normPairCount[en2]].fIndex2 = j;
2136 fNormPairs[en2][normPairCount[en2]].fKey2 = (fEvt+en2)->fTracks[j].fKey;
2137
2138
2139 //other past pairs with particle j
2140 for(Int_t pastpair=0; pastpair<numOtherPairs2[0][j]; pastpair++){
2141 Int_t locationOtherPair = fOtherPairLocation2[0][j]->At(pastpair);
2142 if(locationOtherPair < 0) continue;// no pair there
2143 Int_t indexOther1 = i;
2144 Int_t indexOther2 = fNormPairs[0][ locationOtherPair ].fIndex1;
2145
2146 // Both possible orderings of other indexes
2147 if( (fNormPairSwitch[0][indexOther1]->At(indexOther2)=='1') || (fNormPairSwitch[0][indexOther2]->At(indexOther1)=='1')) {
2148
2149 // 1 and 2 are from SE
2150 ch3 = Int_t((fNormPairs[0][ locationOtherPair ].fCharge1 + 1)/2.);
2151 key3 = fNormPairs[0][ locationOtherPair ].fKey1;
2152 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2153 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2154
2155 tempNormFillCount[bin1][bin2][bin3][fillIndex3][0]++;
2156 }
2157
2158 }// pastpair P11 loop
2159
2160
2161 fNormPairSwitch[en2][i]->AddAt('1',j);
2162 fOtherPairLocation1[en2][i]->AddAt(normPairCount[en2], numOtherPairs1[en2][i]);// location of otherpair with i as 1st particle
2163 fOtherPairLocation2[en2][j]->AddAt(normPairCount[en2], numOtherPairs2[en2][j]);// location of otherpair with j as 2nd particle
2164
2165 numOtherPairs1[en2][i]++;
2166 numOtherPairs2[en2][j]++;
2167
2168
2169 normPairCount[en2]++;
2170 if(normPairCount[en2] >= kNormPairLimit) exitCode=kTRUE;
2171
2172 }// Norm Region
2173
2174 }// j particle
2175 }// i particle
2176
20d52fd9 2177
cd12341d 2178
2179 //////////////////////////////////////////////
2180 // P12 pairing
2181 // 1st Particle
2182 for (Int_t i=0; i<myTracks; i++) {
2183
2184 Int_t en2=1;
2185
2186 // 2nd particle
2187 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2188
2189 key1 = (fEvt)->fTracks[i].fKey;
2190 key2 = (fEvt+en2)->fTracks[j].fKey;
2191 Short_t fillIndex2 = FillIndex2part(key1+key2);
2192 Short_t qCutBin = SetQcutBin(fillIndex2);
2193 Short_t normBin = SetNormBin(fillIndex2);
2194 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2195 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2196 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2197 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
654866df 2198
cd12341d 2199 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2200 GetQosl(pVect1, pVect2, qout, qside, qlong);
2201 transK12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
3eebc801 2202 //if(transK12 <= 0.35) fEDbin=0;
2203 //else fEDbin=1;
2204
2f00662e 2205
cd12341d 2206
2207 ///////////////////////////////
2208 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
2209 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2210 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
2211
df2ce8e1 2212 if(fMCcase){
2213 if((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize && (fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize){
2214 pVect1MC[0]=sqrt(pow((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2215 pVect2MC[0]=sqrt(pow((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2216 pVect1MC[1]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx; pVect2MC[1]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
2217 pVect1MC[2]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy; pVect2MC[2]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
2218 pVect1MC[3]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz; pVect2MC[3]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
2219 qinv12MC = GetQinv(fillIndex2, pVect1MC, pVect2MC);
2220 //
e29e02c1 2221
df2ce8e1 2222 for(Int_t rIter=0; rIter<fRVALUES; rIter++){
2223 for(Int_t myDampIt=0; myDampIt<kNDampValues; myDampIt++){
2224 Int_t denIndex = rIter*kNDampValues + myDampIt;
2225 Float_t WInput = MCWeight(ch1,ch2, rIter+kRmin, myDampIt, qinv12MC);
2226 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fIdeal->Fill(denIndex, qinv12MC, WInput);
2227 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fIdeal->Fill(denIndex, qinv12MC);
2228 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fSmeared->Fill(denIndex, qinv12, WInput);
2229 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fSmeared->Fill(denIndex, qinv12);
2230 }
2231 }
e29e02c1 2232
df2ce8e1 2233
2234 /////////////////////////////////////////////////////
bd1011c2 2235 if(!fTabulatePairs && qinv12 <= fQcut[qCutBin]) {// 3-particle MRC
2236
f72089ee 2237 // 3-particle MRC
2238 Short_t fillIndex3 = 0;
2239 key1=1; key2=1; key3=1;
2240 Int_t en3 = 2;
2241
2242 for (Int_t k=0; k<(fEvt+en3)->fNtracks; k++) {
2243 if((fEvt+en3)->fTracks[k].fLabel < (fEvt+en3)->fMCarraySize){
2244 ch3 = Int_t(((fEvt+en3)->fTracks[k].fCharge + 1)/2.);
2245 pVect3[0]=(fEvt+en3)->fTracks[k].fEaccepted;
2246 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
2247 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
2248 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
2249 qinv13 = GetQinv(0, pVect1, pVect3);
2250 qinv23 = GetQinv(0, pVect2, pVect3);
2251
a05cda99 2252 if(qinv13 > fQcut[qCutBin] || qinv23 > fQcut[qCutBin]) continue;
df2ce8e1 2253
a05cda99 2254
2255 pVect3MC[0]=sqrt(pow((fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2256 pVect3MC[1]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPx;
2257 pVect3MC[2]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPy;
2258 pVect3MC[3]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPz;
2259 qinv13MC = GetQinv(0, pVect1MC, pVect3MC);
2260 qinv23MC = GetQinv(0, pVect2MC, pVect3MC);
2261
2262
2263 q3MC = sqrt(pow(qinv12MC,2)+pow(qinv13MC,2)+pow(qinv23MC,2));
e29e02c1 2264 transK3 = sqrt( pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
a05cda99 2265
e29e02c1 2266
a05cda99 2267 //
2268 // The below call to SetFillBins3 will work for all 3-particle terms since all are for fully mixed events. part is set to 1, but only matters for terms 2-4.
2269 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2270 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 1, bin1, bin2, bin3, fill2, fill3, fill4);
2271
2272
2273 for(Int_t jj=1; jj<=5; jj++){// term loop
df2ce8e1 2274
a05cda99 2275 if(jj==2) {if(!fill2) continue;}//12
2276 if(jj==3) {if(!fill3) continue;}//13
2277 if(jj==4) {if(!fill4) continue;}//23
2278
2279 Float_t WInput=1.0;
2280 Double_t K3=1.0;
2281 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, 1, jj, firstQ, secondQ, thirdQ);
2282 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, 1, jj, firstQMC, secondQMC, thirdQMC);
2283
2284 if(ch1==ch2 && ch1==ch3){// same charge
2285 WInput = MCWeight3D(kTRUE, jj, fFixedLambdaBinMomRes, firstQMC, secondQMC, thirdQMC);
2286 if(jj==1) {
2287 K3 = FSICorrelationTherm2(+1,+1, firstQMC)*FSICorrelationTherm2(+1,+1, secondQMC)*FSICorrelationTherm2(+1,+1, thirdQMC);// GRS
2288 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1SC"))->Fill(q3MC, WInput);
2289 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1SCden"))->Fill(q3MC);
2290 }else if(jj!=5){
2291 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2SC"))->Fill(q3MC, WInput);
2292 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2SCden"))->Fill(q3MC);
2293 }
2294 }else {// mixed charge
2295 if(bin1==bin2) {
2296 WInput = MCWeight3D(kFALSE, jj, fFixedLambdaBinMomRes, firstQMC, secondQMC, thirdQMC);
2297 if(jj==1) K3 = FSICorrelationTherm2(+1,+1, firstQMC)*FSICorrelationTherm2(+1,-1, secondQMC)*FSICorrelationTherm2(+1,-1, thirdQMC);// GRS
2298 }else {
2299 if(jj==1 || jj==5) WInput = MCWeight3D(kFALSE, jj, fFixedLambdaBinMomRes, thirdQMC, secondQMC, firstQMC);// thirdQMC is ss
2300 else WInput = MCWeight3D(kFALSE, 6-jj, fFixedLambdaBinMomRes, thirdQMC, secondQMC, firstQMC);
2301
2302 if(jj==1) K3 = FSICorrelationTherm2(+1,+1, thirdQMC)*FSICorrelationTherm2(+1,-1, secondQMC)*FSICorrelationTherm2(+1,-1, firstQMC);// GRS
2303 }
2304 if(jj==1){
2305 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1MC"))->Fill(q3MC, WInput);
2306 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1MCden"))->Fill(q3MC);
df2ce8e1 2307 }else{
a05cda99 2308 if(bin1==bin2){
2309 if(jj==2){
2310 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MC"))->Fill(q3MC, WInput);
2311 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MCden"))->Fill(q3MC);
2312 }else if(jj==3){
2313 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MC"))->Fill(q3MC, WInput);
2314 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MCden"))->Fill(q3MC);
2315 }else if(jj==4){
2316 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MC"))->Fill(q3MC, WInput);
2317 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MCden"))->Fill(q3MC);
2318 }else{}
2319 }else{
2320 if(jj==2){
2321 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MC"))->Fill(q3MC, WInput);
2322 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MCden"))->Fill(q3MC);
2323 }else if(jj==3){
2324 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MC"))->Fill(q3MC, WInput);
2325 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MCden"))->Fill(q3MC);
2326 }else if(jj==4){
2327 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MC"))->Fill(q3MC, WInput);
2328 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MCden"))->Fill(q3MC);
2329 }else{}
2330 }
2331
df2ce8e1 2332 }
df2ce8e1 2333 }
2334
a05cda99 2335 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fIdeal->Fill(firstQMC, secondQMC, thirdQMC, WInput);
2336 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fSmeared->Fill(firstQ, secondQ, thirdQ, WInput);
2337 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fQW12->Fill(firstQMC, secondQMC, thirdQMC, WInput*firstQMC);
2338 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fQW13->Fill(firstQMC, secondQMC, thirdQMC, WInput*secondQMC);
df2ce8e1 2339 if(jj==1){
a05cda99 2340 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fSumK3->Fill(firstQMC, secondQMC, thirdQMC, WInput/K3);
2341 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fEnK3->Fill(firstQMC, secondQMC, thirdQMC, WInput);
df2ce8e1 2342 }
a05cda99 2343
20d52fd9 2344 /*if(ch1==ch2 && ch1==ch3){
df2ce8e1 2345 if(jj==1){
a05cda99 2346 FourVectProdTerms(pVect1, pVect2, pVect3, Qsum1v1, Qsum2, Qsum3v1, Qsum1v2, Qsum3v2);// 4-vector product sums
2347 FourVectProdTerms(pVect1MC, pVect2MC, pVect3MC, Qsum1v1MC, Qsum2MC, Qsum3v1MC, Qsum1v2MC, Qsum3v2MC);// 4-vector product sums
2348 }else if(jj==2) {
2349 FourVectProdTerms(pVect1, pVect2, pVect3, Qsum1v1, Qsum2, Qsum3v1, Qsum1v2, Qsum3v2);// 4-vector product sums
2350 FourVectProdTerms(pVect1MC, pVect2MC, pVect3MC, Qsum1v1MC, Qsum2MC, Qsum3v1MC, Qsum1v2MC, Qsum3v2MC);// 4-vector product sums
2351 }else if(jj==3){
2352 FourVectProdTerms(pVect1, pVect3, pVect2, Qsum1v1, Qsum2, Qsum3v1, Qsum1v2, Qsum3v2);// 4-vector product sums
2353 FourVectProdTerms(pVect1MC, pVect3MC, pVect2MC, Qsum1v1MC, Qsum2MC, Qsum3v1MC, Qsum1v2MC, Qsum3v2MC);// 4-vector product sums
2354 }else if(jj==4) {
2355 FourVectProdTerms(pVect3, pVect1, pVect2, Qsum1v1, Qsum2, Qsum3v1, Qsum1v2, Qsum3v2);// 4-vector product sums
2356 FourVectProdTerms(pVect3MC, pVect1MC, pVect2MC, Qsum1v1MC, Qsum2MC, Qsum3v1MC, Qsum1v2MC, Qsum3v2MC);// 4-vector product sums
2357 }else {
2358 FourVectProdTerms(pVect1, pVect2, pVect3, Qsum1v1, Qsum2, Qsum3v1, Qsum1v2, Qsum3v2);// 4-vector product sums
2359 FourVectProdTerms(pVect1MC, pVect2MC, pVect3MC, Qsum1v1MC, Qsum2MC, Qsum3v1MC, Qsum1v2MC, Qsum3v2MC);// 4-vector product sums
df2ce8e1 2360 }
a05cda99 2361
2362 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd1TermsIdeal->Fill(Qsum1v1MC, Qsum2MC, Qsum3v1MC, WInput);
2363 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd1TermsSmeared->Fill(Qsum1v1, Qsum2, Qsum3v1, WInput);
2364 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd2TermsIdeal->Fill(Qsum1v2MC, Qsum2MC, Qsum3v2MC, WInput);
2365 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd2TermsSmeared->Fill(Qsum1v2, Qsum2, Qsum3v2, WInput);
2366 if(jj==1){
2367 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd1Q3W->Fill(Qsum1v1MC, Qsum2MC, Qsum3v1MC, WInput*q3);
2368 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd2Q3W->Fill(Qsum1v2MC, Qsum2MC, Qsum3v2MC, WInput*q3);
2369 }
2370 //
2371 if(qinv12MC > fQLowerCut && qinv13MC > fQLowerCut && qinv23MC > fQLowerCut){
2372 // does not really matter if MC or real data triplets are used to average 1/K3...but better to use umsmeared values
2373 if(jj==1){
2374 WInput = MCWeight3D(kTRUE, 1, 25, firstQMC, secondQMC, thirdQMC);// pure 3-pion (lambda=1)
2375 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd1TermsSumK3->Fill(Qsum1v1MC, Qsum2MC, Qsum3v1MC, WInput/K3);
2376 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd2TermsSumK3->Fill(Qsum1v2MC, Qsum2MC, Qsum3v2MC, WInput/K3);
2377 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd1TermsEnK3->Fill(Qsum1v1MC, Qsum2MC, Qsum3v1MC, WInput);
2378 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd2TermsEnK3->Fill(Qsum1v2MC, Qsum2MC, Qsum3v2MC, WInput);
2379 }if(jj>1 && jj<=4){
2380 Float_t InteractingQ=qinv12MC;
2381 Double_t K2 = FSICorrelationTherm2(+1,+1, InteractingQ);// K2 from Therminator source
2382 WInput = MCWeight3D(kTRUE, jj, 25, firstQMC, secondQMC, thirdQMC);// pure 2-pion (lambda=1)
2383 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd1TermsSumK2->Fill(Qsum1v1MC, Qsum2MC, Qsum3v1MC, WInput/K2);
2384 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd2TermsSumK2->Fill(Qsum1v2MC, Qsum2MC, Qsum3v2MC, WInput/K2);
2385 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd1TermsEnK2->Fill(Qsum1v1MC, Qsum2MC, Qsum3v1MC, WInput);
2386 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd2TermsEnK2->Fill(Qsum1v2MC, Qsum2MC, Qsum3v2MC, WInput);
2387 }
2388 }
2389
2390 }// same charges
20d52fd9 2391 */
a05cda99 2392 }// jj
2393 }// MCarray check, 3rd particle
f72089ee 2394 }// 3rd particle
a05cda99 2395
f72089ee 2396 }// TabulatePairs Check
a05cda99 2397
2398 }// MCarray check, 1st and 2nd particle
f72089ee 2399
a05cda99 2400 // reset key's and fill bins (they were altered for 3 particle MRC calculation)
2401 key1 = (fEvt)->fTracks[i].fKey;
2402 key2 = (fEvt+en2)->fTracks[j].fKey;
2403 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
2404
e29e02c1 2405
2406 if(ch1==ch2 && fMbin==0 && qinv12<0.2){
2407 //////////////////////////
2408 // pad-row method testing
2409 Float_t coeff = (5)*0.2*(0.18/1.2);// 5 to evaluate at 1.0m in TPC
2410 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
2411 if(phi1 > 2*PI) phi1 -= 2*PI;
2412 if(phi1 < 0) phi1 += 2*PI;
2413 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
2414 if(phi2 > 2*PI) phi2 -= 2*PI;
2415 if(phi2 < 0) phi2 += 2*PI;
2416 Float_t deltaphi = phi1 - phi2;
2417 if(deltaphi > PI) deltaphi -= PI;
2418 if(deltaphi < -PI) deltaphi += PI;
2419
2420 Int_t ncl1 = (fEvt)->fTracks[i].fClusterMap.GetNbits();
2421 Int_t ncl2 = (fEvt+en2)->fTracks[j].fClusterMap.GetNbits();
2422 Float_t sumCls = 0; Float_t sumSha = 0; Float_t sumQ = 0;
2423 Double_t shfrac = 0; //Double_t qfactor = 0;
2424 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
2425 if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Both clusters
2426 if ((fEvt)->fTracks[i].fSharedMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fSharedMap.TestBitNumber(imap)) { // Shared
2427 sumQ++;
2428 sumCls+=2;
2429 sumSha+=2;}
2430 else {sumQ--; sumCls+=2;}
2431 }
2432 else if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) || (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Non shared
2433 sumQ++;
2434 sumCls++;}
2435 }
2436 if (sumCls>0) {
2437 //qfactor = sumQ*1.0/sumCls;
2438 shfrac = sumSha*1.0/sumCls;
2439 }
2440 if(fabs(deltaphi)<0.07 && fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
2441 ((TH3D*)fOutputList->FindObject("fPairsPadRowDen"))->Fill(transK12, shfrac, qinv12);
2442 }
2443
df2ce8e1 2444 for(Int_t rstep=0; rstep<10; rstep++){
e29e02c1 2445 coeff = (rstep)*0.2*(0.18/1.2);
df2ce8e1 2446 // propagate through B field to r=1.2m
e29e02c1 2447 phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
df2ce8e1 2448 if(phi1 > 2*PI) phi1 -= 2*PI;
2449 if(phi1 < 0) phi1 += 2*PI;
e29e02c1 2450 phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
df2ce8e1 2451 if(phi2 > 2*PI) phi2 -= 2*PI;
2452 if(phi2 < 0) phi2 += 2*PI;
e29e02c1 2453 deltaphi = phi1 - phi2;
df2ce8e1 2454 if(deltaphi > PI) deltaphi -= PI;
2455 if(deltaphi < -PI) deltaphi += PI;
e29e02c1 2456
2457 if(fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
2458 ((TH3F*)fOutputList->FindObject("fPairsShareFracDPhiDen"))->Fill(rstep, shfrac, deltaphi);
2459 }
2460 //if(shfrac < 0.05){
df2ce8e1 2461 ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiDen"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
e29e02c1 2462 //}
df2ce8e1 2463 }
e29e02c1 2464
2465
2466
2467
2468 }// desired pair selection
df2ce8e1 2469
e29e02c1 2470
2471
df2ce8e1 2472 }// fMCcase
2473
e29e02c1 2474
2475
df2ce8e1 2476 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
cd12341d 2477 if(ch1 == ch2){
2478 if(!AcceptPair((fEvt)->fTracks[i], (fEvt+en2)->fTracks[j])) {
2479 fPairSplitCut[1][i]->AddAt('1',j);
2480 continue;
2481 }
2482 }
2483
2484 //////////////////////////////////////////
2485 // 2-particle term
2486 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2->Fill(transK12, qinv12);
5e3e77d6 2487 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2QW->Fill(transK12, qinv12, qinv12);
2488
cd12341d 2489 // osl frame
fa109294 2490 if(fillIndex2==0){
2491 if((transK12 > 0.2) && (transK12 < 0.3)){
cd12341d 2492 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[0].fExplicit2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
2493 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[0].fExplicit2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
2494 }
2495 if((transK12 > 0.6) && (transK12 < 0.7)){
2496 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[1].fExplicit2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
2497 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[1].fExplicit2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
2498 }
2499 }
2500 //////////////////////////////////////////
2501 if(fTabulatePairs){
2502 if(fillIndex2==0 && bin1==bin2){
2503 rapK12 = 0;
2504 transKbin=-1; rapKbin=-1;
654866df 2505
2506 for(Int_t kIt=0; kIt<fKbinsT; kIt++) {if(transK12 < (fKmiddleT[kIt] + fKstepT[kIt]/2.)) {transKbin = kIt; break;}}
2507 for(Int_t kIt=0; kIt<fKbinsY; kIt++) {if(rapK12 < (fKmiddleY[kIt] + fKstepY[kIt]/2.)) {rapKbin = kIt; break;}}
cd12341d 2508 if((transKbin<0) || (rapKbin<0)) {cout<<"problem!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl; continue;}
654866df 2509 if((transKbin>=fKbinsT) || (rapKbin>=fKbinsY)) {cout<<"problem!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl; continue;}
2510
2f00662e 2511 if(fGenerateSignal) KT[transKbin].KY[rapKbin].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2ThreeD->Fill(fabs(qout), fabs(qside), fabs(qlong));
654866df 2512 else KT[transKbin].KY[rapKbin].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2ThreeD->Fill(fabs(qout), fabs(qside), fabs(qlong));
2513
cd12341d 2514 continue;
2515 }
2516 }
2517
2518
654866df 2519 if(pairCountME >= 2*kPairLimit) {exitCode=kTRUE; continue;}// Too many SE pairs
cd12341d 2520 if(exitCode) continue;
2521
2522 if(qinv12 <= fQcut[qCutBin]) {
2523 ///////////////////////////
2524
2525 // particle 1
2526 (fEvt)->fPairsME[pairCountME].fP1[0] = (fEvt)->fTracks[i].fP[0];
2527 (fEvt)->fPairsME[pairCountME].fP1[1] = (fEvt)->fTracks[i].fP[1];
2528 (fEvt)->fPairsME[pairCountME].fP1[2] = (fEvt)->fTracks[i].fP[2];
2529 (fEvt)->fPairsME[pairCountME].fE1 = (fEvt)->fTracks[i].fEaccepted;
2530 (fEvt)->fPairsME[pairCountME].fCharge1 = (fEvt)->fTracks[i].fCharge;
2531 (fEvt)->fPairsME[pairCountME].fIndex1 = i;
2532 (fEvt)->fPairsME[pairCountME].fKey1 = key1;
2533 (fEvt)->fPairsME[pairCountME].fLabel1 = (fEvt)->fTracks[i].fLabel;
2534 if(fMCcase && ((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize)){
2535 (fEvt)->fPairsME[pairCountME].fP1MC[0] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx;
2536 (fEvt)->fPairsME[pairCountME].fP1MC[1] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy;
2537 (fEvt)->fPairsME[pairCountME].fP1MC[2] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz;
2538 }
2539 // particle 2
2540 (fEvt)->fPairsME[pairCountME].fP2[0] = (fEvt+en2)->fTracks[j].fP[0];
2541 (fEvt)->fPairsME[pairCountME].fP2[1] = (fEvt+en2)->fTracks[j].fP[1];
2542 (fEvt)->fPairsME[pairCountME].fP2[2] = (fEvt+en2)->fTracks[j].fP[2];
2543 (fEvt)->fPairsME[pairCountME].fE2 = (fEvt+en2)->fTracks[j].fEaccepted;
2544 (fEvt)->fPairsME[pairCountME].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2545 (fEvt)->fPairsME[pairCountME].fIndex2 = j;
2546 (fEvt)->fPairsME[pairCountME].fKey2 = key2;
2547 (fEvt)->fPairsME[pairCountME].fLabel2 = (fEvt+en2)->fTracks[j].fLabel;
2548 if(fMCcase && ((fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize)){
2549 (fEvt)->fPairsME[pairCountME].fP2MC[0] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
2550 (fEvt)->fPairsME[pairCountME].fP2MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
2551 (fEvt)->fPairsME[pairCountME].fP2MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
2552 }
2553
2554 (fEvt)->fPairsME[pairCountME].fQinv = qinv12;
2555
2556 fPairLocationME[i]->AddAt(Int_t(pairCountME),j);
2557
2558 pairCountME++;
2559
2560 }
2561
2562 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2563 // particle 1
2564 fNormPairs[en2][normPairCount[en2]].fCharge1 = (fEvt)->fTracks[i].fCharge;
2565 fNormPairs[en2][normPairCount[en2]].fIndex1 = i;
2566 fNormPairs[en2][normPairCount[en2]].fKey1 = (fEvt)->fTracks[i].fKey;
2567 // particle 2
2568 fNormPairs[en2][normPairCount[en2]].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2569 fNormPairs[en2][normPairCount[en2]].fIndex2 = j;
2570 fNormPairs[en2][normPairCount[en2]].fKey2 = (fEvt+en2)->fTracks[j].fKey;
2571
2572 //other past pairs in P11 with particle i
2573 for(Int_t pastpairP11=0; pastpairP11<numOtherPairs2[0][i]; pastpairP11++){// past pair in P11 with i as 1st and 2nd particle
2574 Int_t locationOtherPairP11 = fOtherPairLocation2[0][i]->At(pastpairP11);// i is 2nd particle
2575 if(locationOtherPairP11 < 0) continue;// no pair there
2576 Int_t indexOther1P11 = fNormPairs[0][ locationOtherPairP11 ].fIndex1;
2577
2578 //Check other past pairs in P12
2579 if( (fNormPairSwitch[1][indexOther1P11]->At(j)=='0')) continue;
2580
2581 // 1 and 3 are from SE
2582 ch3 = Int_t((fNormPairs[0][ locationOtherPairP11 ].fCharge1 + 1)/2.);// charge of second particle in P11
2583 key3 = fNormPairs[0][ locationOtherPairP11 ].fKey1;
2584 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2585 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2586 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 2, bin1, bin2, bin3, fill2, fill3, fill4);
2587
2588
2589 if(fill2) tempNormFillCount[bin1][bin2][bin3][fillIndex3][1]++;
2590 if(fill3) tempNormFillCount[bin1][bin2][bin3][fillIndex3][2]++;
2591 if(fill4) tempNormFillCount[bin1][bin2][bin3][fillIndex3][3]++;
2592
2593
2594 }// P11 loop
2595
2596
2597 fNormPairSwitch[en2][i]->AddAt('1',j);
2598 fOtherPairLocation1[en2][i]->AddAt(normPairCount[en2], numOtherPairs1[en2][i]);// location of otherpair with i as 1st particle
2599 fOtherPairLocation2[en2][j]->AddAt(normPairCount[en2], numOtherPairs2[en2][j]);// location of otherpair with j as 2nd particle
2600
2601 numOtherPairs1[en2][i]++;
2602 numOtherPairs2[en2][j]++;
2603
2604 normPairCount[en2]++;
2605 if(normPairCount[en2] >= kNormPairLimit) exitCode=kTRUE;
2606
2607 }// Norm Region
2608
2609
2610 }
2611 }
20d52fd9 2612
cd12341d 2613
2614 ///////////////////////////////////////
2615 // P13 pairing (just for Norm counting of term5)
2616 for (Int_t i=0; i<myTracks; i++) {
2617
2618 // exit out of loop if there are too many pairs
2619 // dont bother with this loop if exitCode is set.
2620 if(exitCode) break;
2621
2622 // 2nd particle
2623 Int_t en2=2;
2624
2625 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2626
2627 key1 = (fEvt)->fTracks[i].fKey;
2628 key2 = (fEvt+en2)->fTracks[j].fKey;
2629 Short_t fillIndex2 = FillIndex2part(key1+key2);
2630 Short_t normBin = SetNormBin(fillIndex2);
2631 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2632 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2633 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2634 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2635
2636 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2637
2638 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2639
2640 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
2641 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2642
2643 if(ch1 == ch2){
2644 if(!AcceptPair((fEvt)->fTracks[i], (fEvt+en2)->fTracks[j])) {
2645 fPairSplitCut[2][i]->AddAt('1',j);
2646 continue;
2647 }
2648 }
2649
2650 /////////////////////////////////////////////////////////
2651 // Normalization Region
2652
2653 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2654
2655 fNormPairSwitch[en2][i]->AddAt('1',j);
2656
2657 }// Norm Region
2658 }
2659 }
2660
2661
20d52fd9 2662
cd12341d 2663 ///////////////////////////////////////
2664 // P23 pairing (just for Norm counting of term5)
2665 Int_t en1=1;
2666 for (Int_t i=0; i<(fEvt+en1)->fNtracks; i++) {
2667
2668 // exit out of loop if there are too many pairs
2669 // dont bother with this loop if exitCode is set.
2670 if(exitCode) break;
2671
2672 // 2nd event
2673 Int_t en2=2;
2674 // 2nd particle
2675 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2676
2677 if(exitCode) break;
2678
2679 key1 = (fEvt+en1)->fTracks[i].fKey;
2680 key2 = (fEvt+en2)->fTracks[j].fKey;
2681 Short_t fillIndex2 = FillIndex2part(key1+key2);
2682 Short_t normBin = SetNormBin(fillIndex2);
2683 pVect1[0]=(fEvt+en1)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2684 pVect1[1]=(fEvt+en1)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2685 pVect1[2]=(fEvt+en1)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2686 pVect1[3]=(fEvt+en1)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2687
2688 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2689
2690 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2691
2692 ///////////////////////////////
2693 ch1 = Int_t(((fEvt+en1)->fTracks[i].fCharge + 1)/2.);
2694 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2695
2696 if(ch1 == ch2){
2697 if(!AcceptPair((fEvt+en1)->fTracks[i], (fEvt+en2)->fTracks[j])) {
2698 fPairSplitCut[3][i]->AddAt('1',j);
2699 continue;
2700 }
2701 }
2702
2703 if((qinv12 < fNormQcutLow[normBin]) || (qinv12 >= fNormQcutHigh[normBin])) continue;
2704
2705 Int_t index1P23 = i;
2706 Int_t index2P23 = j;
2707
2708 for(Int_t pastpairP12=0; pastpairP12<numOtherPairs2[1][index1P23]; pastpairP12++){// loop in P12 with i as 2nd particle
2709 Int_t locationOtherPairP12 = fOtherPairLocation2[1][index1P23]->At(pastpairP12);
2710 if(locationOtherPairP12 < 0) continue; // no pair there
2711 Int_t index1P12 = fNormPairs[1][ locationOtherPairP12 ].fIndex1;
2712
2713
2714 //Check other past pair status in P13
2715 if( (fNormPairSwitch[2][index1P12]->At(index2P23)=='0')) continue;
2716
2717 // all from different event
2718 ch3 = Int_t((fNormPairs[1][ locationOtherPairP12 ].fCharge1 + 1)/2.);// charge of first particle in P12
2719 key3 = fNormPairs[1][ locationOtherPairP12 ].fKey1;
2720 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2721 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2722
2723 tempNormFillCount[bin1][bin2][bin3][fillIndex3][4]++;
2724 }
2725 }
2726 }
2727
2728
2729
2730
2731 ///////////////////////////////////////////////////
2732 // Do not use pairs from events with too many pairs
2733 if(exitCode) {
2734 cout<<"SE or ME or Norm PairCount too large. Discarding all pairs and skipping event"<<endl;
2735 (fEvt)->fNpairsSE = 0;
2736 (fEvt)->fNpairsME = 0;
2737 ((TH1F*)fOutputList->FindObject("fRejectedEvents"))->Fill(fMbin+1);
2738 return;// Skip event
2739 }else{
2740 (fEvt)->fNpairsSE = pairCountSE;
2741 (fEvt)->fNpairsME = pairCountME;
2742 ((TH1F*)fOutputList->FindObject("fEvents2"))->Fill(fMbin+1);
2743 }
2744 ///////////////////////////////////////////////////
2745
cd12341d 2746
2747 //cout<<"pairCountSE = "<<pairCountSE<<" pairCountME = "<<pairCountME<<endl;
b6e5ec54 2748 //cout<<"Start Main analysis"<<endl;
cd12341d 2749
2750 ///////////////////////////////////////////////////////////////////////
2751 ///////////////////////////////////////////////////////////////////////
2752 ///////////////////////////////////////////////////////////////////////
2753 //
2754 //
5e3e77d6 2755 // Start the Main Correlation Analysis
cd12341d 2756 //
2757 //
2758 ///////////////////////////////////////////////////////////////////////
2759
f5df8b1d 2760
654866df 2761
cd12341d 2762 /////////////////////////////////////////////////////////
2763 // Skip 3-particle part if Tabulate6DPairs is set to true
2764 if(fTabulatePairs) return;
2765 /////////////////////////////////////////////////////////
2766
2767 // Set the Normalization counters
2768 for(Int_t termN=0; termN<5; termN++){
2769
2770 if(termN==0){
2771 if((fEvt)->fNtracks ==0) continue;
2772 }else if(termN<4){
2773 if((fEvt)->fNtracks ==0) continue;
2774 if((fEvt+1)->fNtracks ==0) continue;
2775 }else {
2776 if((fEvt)->fNtracks ==0) continue;
2777 if((fEvt+1)->fNtracks ==0) continue;
2778 if((fEvt+2)->fNtracks ==0) continue;
2779 }
654866df 2780
cd12341d 2781 for(Int_t sc=0; sc<kSCLimit3; sc++){
2782
2783 for(Int_t c1=0; c1<2; c1++){
2784 for(Int_t c2=0; c2<2; c2++){
2785 for(Int_t c3=0; c3<2; c3++){
2786
2787 if(sc==0 || sc==6 || sc==9){// Identical species
2788 if( (c1+c2+c3)==1) {if(c1!=0 || c2!=0 || c3!=1) continue;}
2789 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
2790 }else if(sc!=5){
2791 if( (c1+c2)==1) {if(c1!=0) continue;}
2792 }else {}// do nothing for pi-k-p case
2793 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[fMbin].EDB[fEDbin].ThreePT[termN].fNorm3->Fill(0.,tempNormFillCount[c1][c2][c3][sc][termN]);
2794 }
2795 }
2796 }
2797 }
2798 }
2799
2800
2801
2802 /////////////////////////////////////////////
2803 // Calculate Pair-Cut Correlations
2804 for(Int_t en1case=0; en1case<2; en1case++){// limit at 2 (normal)
2805
2806 Int_t nump1=0;
2807 if(en1case==0) nump1 = (fEvt)->fNpairsSE;
2808 if(en1case==1) nump1 = (fEvt)->fNpairsME;
2809
2810 // 1st pair
2811 for(Int_t p1=0; p1<nump1; p1++){
2812
2813 if(en1case==0){
2814 ch1 = Int_t(((fEvt)->fPairsSE[p1].fCharge1 + 1)/2.);
2815 ch2 = Int_t(((fEvt)->fPairsSE[p1].fCharge2 + 1)/2.);
2816 pVect1[0] = (fEvt)->fPairsSE[p1].fE1; pVect2[0] = (fEvt)->fPairsSE[p1].fE2;
2817 pVect1[1] = (fEvt)->fPairsSE[p1].fP1[0]; pVect2[1] = (fEvt)->fPairsSE[p1].fP2[0];
2818 pVect1[2] = (fEvt)->fPairsSE[p1].fP1[1]; pVect2[2] = (fEvt)->fPairsSE[p1].fP2[1];
2819 pVect1[3] = (fEvt)->fPairsSE[p1].fP1[2]; pVect2[3] = (fEvt)->fPairsSE[p1].fP2[2];
2820 index1 = (fEvt)->fPairsSE[p1].fIndex1; index2 = (fEvt)->fPairsSE[p1].fIndex2;
2821 key1 = (fEvt)->fPairsSE[p1].fKey1; key2 = (fEvt)->fPairsSE[p1].fKey2;
cd12341d 2822 qinv12 = (fEvt)->fPairsSE[p1].fQinv;
2f00662e 2823 //
2824 pVect1MC[1] = (fEvt)->fPairsSE[p1].fP1MC[0]; pVect2MC[1] = (fEvt)->fPairsSE[p1].fP2MC[0];
2825 pVect1MC[2] = (fEvt)->fPairsSE[p1].fP1MC[1]; pVect2MC[2] = (fEvt)->fPairsSE[p1].fP2MC[1];
2826 pVect1MC[3] = (fEvt)->fPairsSE[p1].fP1MC[2]; pVect2MC[3] = (fEvt)->fPairsSE[p1].fP2MC[2];
2827 pVect1MC[0] = sqrt(pow(pVect1MC[1],2)+pow(pVect1MC[2],2)+pow(pVect1MC[3],2)+pow(fTrueMassPi,2));
2828 pVect2MC[0] = sqrt(pow(pVect2MC[1],2)+pow(pVect2MC[2],2)+pow(pVect2MC[3],2)+pow(fTrueMassPi,2));
cd12341d 2829 }
2830 if(en1case==1){
2831 ch1 = Int_t(((fEvt)->fPairsME[p1].fCharge1 + 1)/2.);
2832 ch2 = Int_t(((fEvt)->fPairsME[p1].fCharge2 + 1)/2.);
2833 pVect1[0] = (fEvt)->fPairsME[p1].fE1; pVect2[0] = (fEvt)->fPairsME[p1].fE2;
2834 pVect1[1] = (fEvt)->fPairsME[p1].fP1[0]; pVect2[1] = (fEvt)->fPairsME[p1].fP2[0];
2835 pVect1[2] = (fEvt)->fPairsME[p1].fP1[1]; pVect2[2] = (fEvt)->fPairsME[p1].fP2[1];
2836 pVect1[3] = (fEvt)->fPairsME[p1].fP1[2]; pVect2[3] = (fEvt)->fPairsME[p1].fP2[2];
2837 index1 = (fEvt)->fPairsME[p1].fIndex1; index2 = (fEvt)->fPairsME[p1].fIndex2;
2838 key1 = (fEvt)->fPairsME[p1].fKey1; key2 = (fEvt)->fPairsME[p1].fKey2;
cd12341d 2839 qinv12 = (fEvt)->fPairsME[p1].fQinv;
2f00662e 2840 //
2841 pVect1MC[1] = (fEvt)->fPairsME[p1].fP1MC[0]; pVect2MC[1] = (fEvt)->fPairsME[p1].fP2MC[0];
2842 pVect1MC[2] = (fEvt)->fPairsME[p1].fP1MC[1]; pVect2MC[2] = (fEvt)->fPairsME[p1].fP2MC[1];
2843 pVect1MC[3] = (fEvt)->fPairsME[p1].fP1MC[2]; pVect2MC[3] = (fEvt)->fPairsME[p1].fP2MC[2];
2844 pVect1MC[0] = sqrt(pow(pVect1MC[1],2)+pow(pVect1MC[2],2)+pow(pVect1MC[3],2)+pow(fTrueMassPi,2));
2845 pVect2MC[0] = sqrt(pow(pVect2MC[1],2)+pow(pVect2MC[2],2)+pow(pVect2MC[3],2)+pow(fTrueMassPi,2));
cd12341d 2846 }
2f00662e 2847
140107fb 2848
cd12341d 2849 // en2 buffer
2850 for(Int_t en2=0; en2<3; en2++){
2851 //////////////////////////////////////
2852
2853 Bool_t skipcase=kTRUE;
2854 Short_t config=-1, part=-1;
2855 if(en1case==0 && en2==0) {skipcase=kFALSE; config=1; part=0;}// P11T1
2856 if(en1case==0 && en2==1) {skipcase=kFALSE; config=2; part=1;}// P11T2
2857 if(en1case==1 && en2==0) {skipcase=kFALSE; config=2; part=2;}// P12T1
2858 if(en1case==1 && en2==2) {skipcase=kFALSE; config=3; part=3;}// P12T3
2859
2860 if(skipcase) continue;
2861
2862
2863 // 3-particle terms
2864 // 3rd particle
2865 for(Int_t k=0; k<(fEvt+en2)->fNtracks; k++){
2866 index3 = k;
2867
2868
2869 // remove auto-correlations and duplicate triplets
2870 if(config==1){
2871 if( index1 == index3) continue;
2872 if( index2 == index3) continue;
2873 if(fPairSplitCut[0][index1]->At(index2)=='1') continue;// Track splitting/merging
2874
2875 // skip the switched off triplets
2876 if(fTripletSkip1[fPairLocationSE[index1]->At(index2)]->At(index3)=='1') {
2877 fTripletSkip1[fPairLocationSE[index1]->At(index2)]->AddAt('0',index3);// Reset
2878 continue;
2879 }
2880 ///////////////////////////////
2881 // Turn off 1st possible degenerate triplet
2882 if(index1 < index3){// verify correct id ordering ( index1 < k )
2883 if(fPairLocationSE[index1]->At(index3) >= 0){
2884 fTripletSkip1[fPairLocationSE[index1]->At(index3)]->AddAt('1',index2);
2885 }
2886 if(fPairSplitCut[0][index1]->At(index3)=='1') continue;// Track splitting/merging
2887 }else {// or k < index1
2888 if(fPairLocationSE[index3]->At(index1) >= 0){
2889 fTripletSkip1[fPairLocationSE[index3]->At(index1)]->AddAt('1',index2);
2890 }
2891 if(fPairSplitCut[0][index3]->At(index1)=='1') continue;// Track splitting/merging
2892 }
2893 // turn off 2nd possible degenerate triplet
2894 if(index2 < index3){// verify correct id ordering (index2 < k)
2895 if(fPairLocationSE[index2]->At(index3) >= 0){
2896 fTripletSkip1[fPairLocationSE[index2]->At(index3)]->AddAt('1',index1);
2897 }
2898 if(fPairSplitCut[0][index2]->At(index3)=='1') continue;// Track splitting/merging
2899 }else {// or k < index2
2900 if(fPairLocationSE[index3]->At(index2) >= 0){
2901 fTripletSkip1[fPairLocationSE[index3]->At(index2)]->AddAt('1',index1);
2902 }
2903 if(fPairSplitCut[0][index3]->At(index2)=='1') continue;// Track splitting/merging
2904 }
2905
2906 }// end config 1
2907
2908 if(config==2 && part==1){// SE pair and third particle from next event. P11T2
2909 ///////////////////////////////
2910 // Turn off 1st possible degenerate triplet
2911 if(fPairLocationME[index1]->At(index3) >= 0){
2912 fTripletSkip2[fPairLocationME[index1]->At(index3)]->AddAt('1',index2);
2913 }
2914
2915 // turn off 2nd possible degenerate triplet
2916 if(fPairLocationME[index2]->At(index3) >= 0){
2917 fTripletSkip2[fPairLocationME[index2]->At(index3)]->AddAt('1',index1);
2918 }
2919
2920 if(fPairSplitCut[0][index1]->At(index2)=='1') continue;// Track splitting/merging
2921 if(fPairSplitCut[1][index1]->At(index3)=='1') continue;// Track splitting/merging
2922 if(fPairSplitCut[1][index2]->At(index3)=='1') continue;// Track splitting/merging
2923 }// end config 2 part 1
2924
2925 if(config==2 && part==2){// P12T1
2926 if( index1 == index3) continue;
2927
2928 // skip the switched off triplets
2929 if(fTripletSkip2[fPairLocationME[index1]->At(index2)]->At(index3)=='1') {
2930 fTripletSkip2[fPairLocationME[index1]->At(index2)]->AddAt('0',index3);// Reset
2931 continue;
2932 }
2933 // turn off another possible degenerate
2934 if(fPairLocationME[index3]->At(index2) >= 0){
2935 fTripletSkip2[fPairLocationME[index3]->At(index2)]->AddAt('1',index1);
2936 }// end config 2 part 2
2937
2938 if(fPairSplitCut[1][index1]->At(index2)=='1') continue;// Track splitting/merging
2939 if(index1 < index3) {if(fPairSplitCut[0][index1]->At(index3)=='1') continue;}// Track splitting/merging
2940 else {if(fPairSplitCut[0][index3]->At(index1)=='1') continue;}// Track splitting/merging
2941 if(fPairSplitCut[1][index3]->At(index2)=='1') continue;// Track splitting/merging
2942 }
2943 if(config==3){// P12T3
2944 if(fPairSplitCut[1][index1]->At(index2)=='1') continue;// Track splitting/merging
2945 if(fPairSplitCut[2][index1]->At(index3)=='1') continue;// Track splitting/merging
2946 if(fPairSplitCut[3][index2]->At(index3)=='1') continue;// Track splitting/merging
2947 }// end config 3
2948
2949
5e3e77d6 2950
cd12341d 2951 ch3 = Int_t(((fEvt+en2)->fTracks[k].fCharge + 1)/2.);
2952 key3 = (fEvt+en2)->fTracks[k].fKey;
2953 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2954 Short_t fillIndex13 = FillIndex2part(key1+key3);
2955 Short_t fillIndex23 = FillIndex2part(key2+key3);
2956 Short_t qCutBin13 = SetQcutBin(fillIndex13);
2957 Short_t qCutBin23 = SetQcutBin(fillIndex23);
2958 pVect3[0] = (fEvt+en2)->fTracks[k].fEaccepted;
2959 pVect3[1] = (fEvt+en2)->fTracks[k].fP[0];
2960 pVect3[2] = (fEvt+en2)->fTracks[k].fP[1];
2961 pVect3[3] = (fEvt+en2)->fTracks[k].fP[2];
654866df 2962 qinv13 = GetQinv(fillIndex13, pVect1, pVect3);
2963 qinv23 = GetQinv(fillIndex23, pVect2, pVect3);
2964
2965 if(qinv13 < fQLowerCut) continue;
2966 if(qinv23 < fQLowerCut) continue;
2967 if(qinv13 > fQcut[qCutBin13]) continue;
2968 if(qinv23 > fQcut[qCutBin23]) continue;
2969
2f00662e 2970
140107fb 2971
2f00662e 2972 if(fMCcase){
2973 pVect3MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPx;
2974 pVect3MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPy;
2975 pVect3MC[3] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPz;
2976 pVect3MC[0] = sqrt(pow(pVect3MC[1],2)+pow(pVect3MC[2],2)+pow(pVect3MC[3],2)+pow(fTrueMassPi,2));
2977 qinv12MC = GetQinv(0, pVect1MC, pVect2MC);
2978 qinv13MC = GetQinv(0, pVect1MC, pVect3MC);
2979 qinv23MC = GetQinv(0, pVect2MC, pVect3MC);
2980 }
2981
140107fb 2982
654866df 2983
5e3e77d6 2984 // if all three pair cuts are the same then the case (config=2 && term=2) never reaches here.
2985
cd12341d 2986 q3 = sqrt(pow(qinv12,2) + pow(qinv13,2) + pow(qinv23,2));
2987 transK3 = sqrt( pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
576f89a7 2988 if(fEDbins>1){
2989 if(transK3<0.3) fEDbin=0;
2990 else fEDbin=1;
2991 }
df2ce8e1 2992 firstQ=0; secondQ=0; thirdQ=0;
e29e02c1 2993
140107fb 2994
5e3e77d6 2995 //
fa109294 2996
5e3e77d6 2997 //
cd12341d 2998 if(config==1) {// 123
2999 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
fa109294 3000
cd12341d 3001 if(fillIndex3 <= 2){
3002 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, 0, 1, firstQ, secondQ, thirdQ);
2f00662e 3003 if(fillIndex3==0 && fMCcase) ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, 0, 1, firstQMC, secondQMC, thirdQMC);
654866df 3004 Float_t WInput = 1.0;
baba9c2d 3005 if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, 1, fFixedLambdaBinr3, firstQ, secondQ, thirdQ);
3006 //if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, 1, fFixedLambdaBinr3, firstQMC, secondQMC, thirdQMC);
654866df 3007 ////
3008
3009 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fTerms3->Fill(firstQ, secondQ, thirdQ, WInput);
3010 ////
5e3e77d6 3011 //
3012 if(fillIndex3==0 && ch1==ch2 && ch1==ch3 && fMCcase==kFALSE){
baba9c2d 3013 ((TH3D*)fOutputList->FindObject("fKt3DistTerm1"))->Fill(fMbin+1, transK3, q3);
3014 /*FourVectProdTerms(pVect1, pVect2, pVect3, Qsum1v1, Qsum2, Qsum3v1, Qsum1v2, Qsum3v2);// 4-vector product sums
90814457 3015 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].f4VectProd1Terms->Fill(Qsum1v1, Qsum2, Qsum3v1);
3016 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].f4VectProd2Terms->Fill(Qsum1v2, Qsum2, Qsum3v2);
baba9c2d 3017 */
5e3e77d6 3018 }
e29e02c1 3019
cd12341d 3020 }
3021
3022 }else if(config==2){// 12, 13, 23
5e3e77d6 3023
cd12341d 3024 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
3025 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, part, bin1, bin2, bin3, fill2, fill3, fill4);
3026
3027 // loop over terms 2-4
5e3e77d6 3028 for(Int_t jj=2; jj<5; jj++){
3029 if(jj==2) {if(!fill2) continue;}//12
3030 if(jj==3) {if(!fill3) continue;}//13
3031 if(jj==4) {if(!fill4) continue;}//23
cd12341d 3032
3033 if(fillIndex3 <= 2){
5e3e77d6 3034 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, part, jj, firstQ, secondQ, thirdQ);
2f00662e 3035 if(fillIndex3==0 && fMCcase) ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, part, jj, firstQMC, secondQMC, thirdQMC);
654866df 3036 Float_t WInput = 1.0;
baba9c2d 3037 if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, jj, fFixedLambdaBinr3, firstQ, secondQ, thirdQ);
3038 //if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, jj, fFixedLambdaBinr3, firstQMC, secondQMC, thirdQMC);
654866df 3039 ////
3040 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fTerms3->Fill(firstQ, secondQ, thirdQ, WInput);
3041 ////
baba9c2d 3042 /*if(fillIndex3==0 && ch1==ch2 && ch1==ch3){
90814457 3043 if(part==1){// P11T2
3044 if(jj==2) {
3045 FourVectProdTerms(pVect1, pVect2, pVect3, Qsum1v1, Qsum2, Qsum3v1, Qsum1v2, Qsum3v2);// 4-vector product sums
90814457 3046 }if(jj==3){
3047 FourVectProdTerms(pVect1, pVect3, pVect2, Qsum1v1, Qsum2, Qsum3v1, Qsum1v2, Qsum3v2);// 4-vector product sums
90814457 3048 }if(jj==4) {
3049 FourVectProdTerms(pVect3, pVect1, pVect2, Qsum1v1, Qsum2, Qsum3v1, Qsum1v2, Qsum3v2);// 4-vector product sums
90814457 3050 }
3051 }else{// P12T1
3052 if(jj==2) {
3053 FourVectProdTerms(pVect1, pVect3, pVect2, Qsum1v1, Qsum2, Qsum3v1, Qsum1v2, Qsum3v2);// 4-vector product sums
90814457 3054 }if(jj==3) {
3055 FourVectProdTerms(pVect1, pVect2, pVect3, Qsum1v1, Qsum2, Qsum3v1, Qsum1v2, Qsum3v2);// 4-vector product sums
90814457 3056 }if(jj==4) {
3057 FourVectProdTerms(pVect2, pVect1, pVect3, Qsum1v1, Qsum2, Qsum3v1, Qsum1v2, Qsum3v2);// 4-vector product sums
90814457 3058 }
3059 }
3060 if(!fMCcase){
3061 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd1Terms->Fill(Qsum1v1, Qsum2, Qsum3v1);
3062 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProd2Terms->Fill(Qsum1v2, Qsum2, Qsum3v2);
fa109294 3063 }
baba9c2d 3064 }*/
e29e02c1 3065
cd12341d 3066 }
3067 }
5e3e77d6 3068
cd12341d 3069 }else {// config 3: All particles from different events
cd12341d 3070
704f2481 3071 // "enhancement" differs from 1.0 only when Qinv goes over fQcut
3072 //Float_t enhancement=1.0;
3073 //Int_t nUnderCut=0;
3074 //if(qinv13<fQcut[qCutBin13]) nUnderCut++;
3075 //if(qinv23<fQcut[qCutBin23]) nUnderCut++;
3076 //if(nUnderCut==0) enhancement = (1+1+1)/1.;// 1 LowQ pair
3077 //if(nUnderCut==1) enhancement = (1+2)/2.;// 2 LowQ pair
3078 //if(nUnderCut==2) enhancement = 1.;// 3 LowQ pair
cd12341d 3079
3080 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
90814457 3081
140107fb 3082 if(ch1==ch2 && ch1==ch3 && fillIndex3==0) {
baba9c2d 3083 //FourVectProdTerms(pVect1, pVect2, pVect3, Qsum1v1, Qsum2, Qsum3v1, Qsum1v2, Qsum3v2);// 4-vector product sums
df2ce8e1 3084 if(!fMCcase) ((TH3D*)fOutputList->FindObject("fKt3DistTerm5"))->Fill(fMbin+1, transK3, q3);
140107fb 3085 }
cd12341d 3086
3087 if(fillIndex3 <= 2){
3088 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, part, 5, firstQ, secondQ, thirdQ);
704f2481 3089 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fTerms3->Fill(firstQ, secondQ, thirdQ);
baba9c2d 3090 /*if(fillIndex3==0 && ch1==ch2 && ch1==ch3 && fMCcase==kFALSE){
90814457 3091 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].f4VectProd1Terms->Fill(Qsum1v1, Qsum2, Qsum3v1);
3092 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].f4VectProd2Terms->Fill(Qsum1v2, Qsum2, Qsum3v2);
baba9c2d 3093 }*/
cd12341d 3094 }
baba9c2d 3095
cd12341d 3096 if(fillIndex3 !=0) continue;// only calculate TPN for pi-pi-pi
3097 if(ch1!=ch2 || ch1!=ch3) continue;// only calcualte TPN for ss
5e3e77d6 3098
90814457 3099
2f00662e 3100 GetWeight(pVect1, pVect2, weight12, weight12Err);
3101 GetWeight(pVect1, pVect3, weight13, weight13Err);
3102 GetWeight(pVect2, pVect3, weight23, weight23Err);
3103
5e027bd6 3104 if(sqrt(fabs(weight12*weight13*weight23)) > 1.0) {
3105 if(fMbin==0 && bin1==0) {
3106 ((TH3F*)fOutputList->FindObject("fTPNRejects1"))->Fill(qinv12, qinv13, qinv23, sqrt(fabs(weight12*weight13*weight23)));
3107 }
3108 continue;// weight should never be larger than 1
3109 }
46b217b3 3110
2f00662e 3111
5fc49f8c 3112 Float_t myDamp = fDampStart + (fDampStep)*fFixedLambdaBinr3;// lambdabin=0.52 for v1 draft, 0.7 is more realistic
fa109294 3113 Int_t denIndex = 0;
f9a5e67a 3114 Int_t momResIndex = rIndexForTPNMomRes*kNDampValues + fFixedLambdaBinMomRes;// lambdabin=0.52 for v1 draft, 0.4 is more realistic
90814457 3115
704f2481 3116 Float_t coulCorr12 = FSICorrelationTherm2(+1,+1, qinv12);
3117 Float_t coulCorr13 = FSICorrelationTherm2(+1,+1, qinv13);
3118 Float_t coulCorr23 = FSICorrelationTherm2(+1,+1, qinv23);
d60cf3cf 3119 if(coulCorr12 < 0.1 || coulCorr13 < 0.1 || coulCorr23 < 0.1) {// Safety check
3120 if(fMbin==0 && bin1==0) {
5e027bd6 3121 ((TH3F*)fOutputList->FindObject("fTPNRejects2"))->Fill(qinv12, qinv13, qinv23, sqrt(fabs(weight12*weight13*weight23)));
d60cf3cf 3122 }
3123 continue;
3124 }
704f2481 3125 Float_t MomResCorr12=1.0, MomResCorr13=1.0, MomResCorr23=1.0;
5fc49f8c 3126 if(!fGenerateSignal && !fMCcase) {
704f2481 3127 Int_t momBin12 = fMomResC2->GetYaxis()->FindBin(qinv12);
3128 Int_t momBin13 = fMomResC2->GetYaxis()->FindBin(qinv13);
3129 Int_t momBin23 = fMomResC2->GetYaxis()->FindBin(qinv23);
3130 if(momBin12 >= kQbins) momBin12 = kQbins-1;
3131 if(momBin13 >= kQbins) momBin13 = kQbins-1;
3132 if(momBin23 >= kQbins) momBin23 = kQbins-1;
3133 MomResCorr12 = fMomResC2->GetBinContent(momResIndex+1, momBin12);
3134 MomResCorr13 = fMomResC2->GetBinContent(momResIndex+1, momBin13);
3135 MomResCorr23 = fMomResC2->GetBinContent(momResIndex+1, momBin23);
d60cf3cf 3136 if(MomResCorr12 > 1.2 || MomResCorr13 > 1.2 || MomResCorr23 > 1.2) {// Safety check
3137 if(fMbin==0 && bin1==0) {
5e027bd6 3138 ((TH3F*)fOutputList->FindObject("fTPNRejects3"))->Fill(qinv12, qinv13, qinv23, sqrt(fabs(weight12*weight13*weight23)));
d60cf3cf 3139 }
3140 continue;
3141 }
704f2481 3142 }
3143 weight12CC = ((weight12+1)*MomResCorr12 - myDamp*coulCorr12 - (1-myDamp));
3144 weight12CC /= coulCorr12*myDamp;
3145 weight13CC = ((weight13+1)*MomResCorr13 - myDamp*coulCorr13 - (1-myDamp));
3146 weight13CC /= coulCorr13*myDamp;
3147 weight23CC = ((weight23+1)*MomResCorr23 - myDamp*coulCorr23 - (1-myDamp));
3148 weight23CC /= coulCorr23*myDamp;
3149
3150 if(weight12CC < 0 || weight13CC < 0 || weight23CC < 0) {
3151 if(fMbin==0 && bin1==0) {
3152 weightTotal = sqrt(fabs(weight12CC*weight13CC*weight23CC));
5e027bd6 3153 ((TH3F*)fOutputList->FindObject("fTPNRejects4"))->Fill(qinv12, qinv13, qinv23, weightTotal);
704f2481 3154 }
3155 continue;// C2^QS can never be less than unity
3156 }
3157
3158 /////////////////////////////////////////////////////
3159 weightTotal = sqrt(weight12CC*weight13CC*weight23CC);
3160 /////////////////////////////////////////////////////
baba9c2d 3161
704f2481 3162 if(weightTotal > 1.5) {
3163 if(fMbin==0 && bin1==0) {
5e027bd6 3164 ((TH3F*)fOutputList->FindObject("fTPNRejects5"))->Fill(qinv12, qinv13, qinv23, weightTotal);
704f2481 3165 }
3166 continue;// C2^QS never be greater than 1.0 in theory. Can be slightly larger than 1.0 with fluctuations
3167 }
baba9c2d 3168
3169
704f2481 3170
3171 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].DT[denIndex].fTwoPartNorm->Fill(qinv12, qinv13, qinv23, weightTotal);
3172
baba9c2d 3173 //Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].DT[denIndex].f4VectProd1TwoPartNorm->Fill(Qsum1v1, Qsum2, Qsum3v1, weightTotal);
3174 //Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].DT[denIndex].f4VectProd2TwoPartNorm->Fill(Qsum1v2, Qsum2, Qsum3v2, weightTotal);
e29e02c1 3175
90814457 3176
704f2481 3177 // Save cpu time and memory by skipping r3 denominator calculation below. den errors are negligible compared to num errors.
3178 /*
3179 if(weightTotal > 0.0001){// tiny numbers cause a Float_ting point exception below
3180 weightTotalErr = pow((weight12Err*coulCorr12)*weight13CC*weight23CC,2);
3181 weightTotalErr += pow(weight12CC*(weight13Err*coulCorr13)*weight23CC,2);
3182 weightTotalErr += pow(weight12CC*weight13CC*(weight23Err*coulCorr23),2);
3183 weightTotalErr /= pow(2*weightTotal,2);
3184
3185 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].TwoPartNormErr->Fill(denIndex, q3, weightTotalErr);
3186 }
3187 */
3188
cd12341d 3189
3190
baba9c2d 3191 }// config 3
cd12341d 3192 }// end 3rd particle
3193 }// en2
3194
3195
fa109294 3196 }// p1
3197 }//en1
cd12341d 3198
cd12341d 3199 ///////////////////
3200 }// end of PdensityPairs
3201
fa109294 3202
cd12341d 3203
3204
3205
3206
3207
3208 ////////////////////////////////////////////////////////
3209 // Pdensity Method with Explicit Loops
3210 if(fPdensityExplicitLoop){
3211
3212 ////////////////////////////////////
3213 // 2nd, 3rd, and 4th order Correlations
3214
3215 // First Particle
3216 for (Int_t i=0; i<myTracks; i++) {
3217 ch1 = Int_t( ((fEvt)->fTracks[i].fCharge + 1)/2. );
3218 pVect1[0] = (fEvt)->fTracks[i].fEaccepted;
3219 pVect1[1] = (fEvt)->fTracks[i].fP[0];
3220 pVect1[2] = (fEvt)->fTracks[i].fP[1];
3221 pVect1[3] = (fEvt)->fTracks[i].fP[2];
3222 key1 = (fEvt)->fTracks[i].fKey;
3223
3224 // Second Event
3225 for(Int_t en2=0; en2<fEventsToMix+1; en2++){
3226 Int_t startbin2=0;
3227 if(en2==0) startbin2=i+1;
3228
3229 // Second Particle
3230 for (Int_t j=startbin2; j<(fEvt+en2)->fNtracks; j++) {
3231 ch2 = Int_t( ((fEvt+en2)->fTracks[j].fCharge + 1)/2. );
3232 pVect2[0] = (fEvt+en2)->fTracks[j].fEaccepted;
3233 pVect2[1] = (fEvt+en2)->fTracks[j].fP[0];
3234 pVect2[2] = (fEvt+en2)->fTracks[j].fP[1];
3235 pVect2[3] = (fEvt+en2)->fTracks[j].fP[2];
3236 key2 = (fEvt+en2)->fTracks[j].fKey;
3237
3238 Short_t fillIndex12 = FillIndex2part(key1+key2);
3239 qinv12 = GetQinv(fillIndex12, pVect1, pVect2);
3240
3241 if(qinv12 < fQLowerCut) continue;
3242
3243
3244 // 2-particle part is filled always during pair creator
3245
3246 // Third Event
3247 for(Int_t en3=en2; en3<fEventsToMix+1; en3++){
3248 Int_t startbin3=0;
3249 if(en3==en2) startbin3=j+1;
3250 else startbin3=0;
3251
3252
3253 // Third Particle
3254 for (Int_t k=startbin3; k<(fEvt+en3)->fNtracks; k++) {
3255 ch3 = Int_t( ((fEvt+en3)->fTracks[k].fCharge + 1)/2. );
3256 pVect3[0] = (fEvt+en3)->fTracks[k].fEaccepted;
3257 pVect3[1] = (fEvt+en3)->fTracks[k].fP[0];
3258 pVect3[2] = (fEvt+en3)->fTracks[k].fP[1];
3259 pVect3[3] = (fEvt+en3)->fTracks[k].fP[2];
3260 key3 = (fEvt+en3)->fTracks[k].fKey;
3261
3262 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
3263 Short_t fillIndex13 = FillIndex2part(key1+key3);
3264 qinv13 = GetQinv(fillIndex13, pVect1, pVect3);
3265 Short_t fillIndex23 = FillIndex2part(key2+key3);
3266 qinv23 = GetQinv(fillIndex23, pVect2, pVect3);
3267
3268
3269 if(qinv13 < fQLowerCut) continue;
3270 if(qinv23 < fQLowerCut) continue;
3271
3272
3273 q3 = sqrt(pow(qinv12,2) + pow(qinv13,2) + pow(qinv23,2));
3274
3275 Short_t normBin12 = SetNormBin(fillIndex12);
3276 Short_t normBin13 = SetNormBin(fillIndex13);
3277 Short_t normBin23 = SetNormBin(fillIndex23);
3278
3279
3280 if(en3==0 && en2==0) {// 123
3281 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
3282
3283 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fExplicit3->Fill(q3);// 123
3284
3285 if((qinv12>=fNormQcutLow[normBin12]) && (qinv13>=fNormQcutLow[normBin13]) && (qinv23>=fNormQcutLow[normBin23])) {
3286 if((qinv12<fNormQcutHigh[normBin12]) && (qinv13<fNormQcutHigh[normBin13]) && (qinv23<fNormQcutHigh[normBin23])) {
3287 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fNormEx3->Fill(0.);
3288 }
3289 }
3290
3291 }else if((en2==0 && en3==1) ) {// 12-3, 13-2, 23-1
3292 Float_t gFact=1;
3293
3294 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
3295 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 1, bin1, bin2, bin3, fill2, fill3, fill4);
3296
3297
3298 if(fill2){
3299 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[1].fExplicit3->Fill(q3, gFact);// 12
3300 if((qinv12>=fNormQcutLow[normBin12]) && (qinv13>=fNormQcutLow[normBin13]) && (qinv23>=fNormQcutLow[normBin23])) {
3301 if((qinv12<fNormQcutHigh[normBin12]) && (qinv13<fNormQcutHigh[normBin13]) && (qinv23<fNormQcutHigh[normBin23])) {
3302 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[1].fNormEx3->Fill(0.);
3303 }
3304 }
3305 }
3306 if(fill3){
3307 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[2].fExplicit3->Fill(q3, gFact);// 12
3308 if((qinv12>=fNormQcutLow[normBin12]) && (qinv13>=fNormQcutLow[normBin13]) && (qinv23>=fNormQcutLow[normBin23])) {
3309 if((qinv12<fNormQcutHigh[normBin12]) && (qinv13<fNormQcutHigh[normBin13]) && (qinv23<fNormQcutHigh[normBin23])) {
3310 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[2].fNormEx3->Fill(0.);
3311 }
3312 }
3313 }
3314 if(fill4){
3315 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[3].fExplicit3->Fill(q3, gFact);// 12
3316 if((qinv12>=fNormQcutLow[normBin12]) && (qinv13>=fNormQcutLow[normBin13]) && (qinv23>=fNormQcutLow[normBin23])) {
3317 if((qinv12<fNormQcutHigh[normBin12]) && (qinv13<fNormQcutHigh[normBin13]) && (qinv23<fNormQcutHigh[normBin23])) {
3318 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[3].fNormEx3->Fill(0.);
3319 }
3320 }
3321 }
3322
3323 }else if(en2==1 && en3==2){// all uncorrelated events
3324 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
3325
3326 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fExplicit3->Fill(q3);
3327 if((qinv12>=fNormQcutLow[normBin12]) && (qinv13>=fNormQcutLow[normBin13]) && (qinv23>=fNormQcutLow[normBin23])) {
3328 if((qinv12<fNormQcutHigh[normBin12]) && (qinv13<fNormQcutHigh[normBin13]) && (qinv23<fNormQcutHigh[normBin23])) {
3329 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fNormEx3->Fill(0.);
3330 }
3331 }
3332 Short_t qCutBin12 = SetQcutBin(fillIndex12);
3333 Short_t qCutBin13 = SetQcutBin(fillIndex13);
3334 Short_t qCutBin23 = SetQcutBin(fillIndex23);
3335
3336 if( (qinv12 < fQcut[qCutBin12]) || (qinv13 < fQcut[qCutBin13]) || (qinv23 < fQcut[qCutBin23])){
3337
3338 Int_t nUnderCut=0;
3339 if(qinv12<fQcut[qCutBin12]) nUnderCut++;
3340 if(qinv13<fQcut[qCutBin13]) nUnderCut++;
3341 if(qinv23<fQcut[qCutBin23]) nUnderCut++;
3342
3343 }
3344
3345 }else {}
3346
3347
3348 }// 3rd particle
3349 }// 3rd event
3350
3351 }// 2nd particle
3352 }// 2nd event
3353
3354 }// 1st particle
3355
3356
3357
3358
3359 }// End of PdensityExplicit
3360
3361
3362
3363
3364 // Post output data.
3365 PostData(1, fOutputList);
3366
3367}
3368//________________________________________________________________________
3369void AliChaoticity::Terminate(Option_t *)
3370{
3371 // Called once at the end of the query
3372
3373 cout<<"Done"<<endl;
3374
3375}
3376//________________________________________________________________________
3377Bool_t AliChaoticity::AcceptPair(AliChaoticityTrackStruct first, AliChaoticityTrackStruct second)
3378{
e29e02c1 3379
3380 if(fabs(first.fEta-second.fEta) > fMinSepPairEta) return kTRUE;
cd12341d 3381
3382 // propagate through B field to r=1m
5e3e77d6 3383 Float_t phi1 = first.fPhi - asin(first.fCharge*(0.1*fBfield)*0.15/first.fPt);// 0.15 for D=1m
cd12341d 3384 if(phi1 > 2*PI) phi1 -= 2*PI;
3385 if(phi1 < 0) phi1 += 2*PI;
5e3e77d6 3386 Float_t phi2 = second.fPhi - asin(second.fCharge*(0.1*fBfield)*0.15/second.fPt);// 0.15 for D=1m
cd12341d 3387 if(phi2 > 2*PI) phi2 -= 2*PI;
3388 if(phi2 < 0) phi2 += 2*PI;
3389
3390 Float_t deltaphi = phi1 - phi2;
3391 if(deltaphi > PI) deltaphi -= 2*PI;
3392 if(deltaphi < -PI) deltaphi += 2*PI;
3393 deltaphi = fabs(deltaphi);
3394
e29e02c1 3395 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
3396
cd12341d 3397
3398 // propagate through B field to r=1.6m
5e3e77d6 3399 phi1 = first.fPhi - asin(first.fCharge*(0.1*fBfield)*0.24/first.fPt);// mine. 0.24 for D=1.6m
cd12341d 3400 if(phi1 > 2*PI) phi1 -= 2*PI;
3401 if(phi1 < 0) phi1 += 2*PI;
5e3e77d6 3402 phi2 = second.fPhi - asin(second.fCharge*(0.1*fBfield)*0.24/second.fPt);// mine. 0.24 for D=1.6m
cd12341d 3403 if(phi2 > 2*PI) phi2 -= 2*PI;
3404 if(phi2 < 0) phi2 += 2*PI;
3405
3406 deltaphi = phi1 - phi2;
3407 if(deltaphi > PI) deltaphi -= 2*PI;
3408 if(deltaphi < -PI) deltaphi += 2*PI;
3409 deltaphi = fabs(deltaphi);
3410
e29e02c1 3411 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
3412
3413
cd12341d 3414
3415 //
46b217b3 3416
cd12341d 3417 Int_t ncl1 = first.fClusterMap.GetNbits();
3418 Int_t ncl2 = second.fClusterMap.GetNbits();
3419 Int_t sumCls = 0; Int_t sumSha = 0; Int_t sumQ = 0;
3420 Double_t shfrac = 0; Double_t qfactor = 0;
3421 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
3422 if (first.fClusterMap.TestBitNumber(imap) && second.fClusterMap.TestBitNumber(imap)) {// Both clusters
3423 if (first.fSharedMap.TestBitNumber(imap) && second.fSharedMap.TestBitNumber(imap)) { // Shared
3424 sumQ++;
3425 sumCls+=2;
3426 sumSha+=2;}
3427 else {sumQ--; sumCls+=2;}
3428 }
3429 else if (first.fClusterMap.TestBitNumber(imap) || second.fClusterMap.TestBitNumber(imap)) {// Non shared
3430 sumQ++;
3431 sumCls++;}
3432 }
3433 if (sumCls>0) {
3434 qfactor = sumQ*1.0/sumCls;
3435 shfrac = sumSha*1.0/sumCls;
3436 }
e29e02c1 3437
cd12341d 3438 if(qfactor > fShareQuality || shfrac > fShareFraction) return kFALSE;
46b217b3 3439
cd12341d 3440
3441 return kTRUE;
5e3e77d6 3442
cd12341d 3443
3444}
3445//________________________________________________________________________
3446Float_t AliChaoticity::GamovFactor(Int_t chargeBin1, Int_t chargeBin2, Float_t qinv)
3447{
3448 Float_t arg = G_Coeff/qinv;
3449
3450 if(chargeBin1==chargeBin2) return (exp(arg)-1)/(arg);
3451 else {return (exp(-arg)-1)/(-arg);}
3452
3453}
3454//________________________________________________________________________
3455void AliChaoticity::Shuffle(Int_t *iarr, Int_t i1, Int_t i2)
3456{
3457 Int_t j, k;
3458 Int_t a = i2 - i1;
3459 for (Int_t i = i1; i < i2+1; i++) {
3460 j = (Int_t) (gRandom->Rndm() * a);
3461 k = iarr[j];
3462 iarr[j] = iarr[i];
3463 iarr[i] = k;
3464 }
3465}
3466//________________________________________________________________________
3467Short_t AliChaoticity::FillIndex2part(Short_t key){
3468
3469 if(key==2) return 0;// pi-pi
3470 else if(key==11) return 1;// pi-k
3471 else if(key==101) return 2;// pi-p
3472 else if(key==20) return 3;// k-k
3473 else if(key==110) return 4;// k-p
3474 else return 5;// p-p
3475}
3476//________________________________________________________________________
3477Short_t AliChaoticity::FillIndex3part(Short_t key){
3478
3479 if(key==3) return 0;// pi-pi-pi
3480 else if(key==12) return 1;// pi-pi-k
3481 else if(key==21) return 2;// k-k-pi
3482 else if(key==102) return 3;// pi-pi-p
3483 else if(key==201) return 4;// p-p-pi
3484 else if(key==111) return 5;// pi-k-p
3485 else if(key==30) return 6;// k-k-k
3486 else if(key==120) return 7;// k-k-p
3487 else if(key==210) return 8;// p-p-k
3488 else return 9;// p-p-p
3489
3490}
3491//________________________________________________________________________
3492Short_t AliChaoticity::SetQcutBin(Short_t fi){// fi=FillIndex
3493 if(fi <= 2) return 0;
3494 else if(fi==3) return 1;
3495 else return 2;
3496}
3497//________________________________________________________________________
3498Short_t AliChaoticity::SetNormBin(Short_t fi){// fi=FillIndex
3499 if(fi==0) return 0;
3500 else if(fi <= 2) return 1;
3501 else return 2;
3502}
3503//________________________________________________________________________
3504void AliChaoticity::SetFillBins2(Short_t fi, Short_t key1, Short_t key2, Int_t c1, Int_t c2, Int_t &b1, Int_t &b2){
3505
3506 if(fi==0 || fi==3 || fi==5){// Identical species
3507 if((c1+c2)==1) {b1=0; b2=1;}// Re-assign to merge degenerate histos
3508 else {b1=c1; b2=c2;}
3509 }else {// Mixed species
3510 if(key1 < key2) { b1=c1; b2=c2;}
3511 else {b1=c2; b2=c1;}
3512 }
3513
3514}
3515//________________________________________________________________________
3516void AliChaoticity::SetFillBins3(Short_t fi, Short_t key1, Short_t key2, Short_t key3, Int_t c1, Int_t c2, Int_t c3, Short_t part, Int_t &b1, Int_t &b2, Int_t &b3, Bool_t &fill2, Bool_t &fill3, Bool_t &fill4){
3517
3518
3519 // seSS, seSK, SE_keysum only used to determine which terms to fill (only used for terms 2-4)
df2ce8e1 3520 // part only matters for terms 2-4
cd12341d 3521 Bool_t seSS=kFALSE;
3522 Bool_t seSK=kFALSE;
3523 Short_t seKeySum=0;// only used for pi-k-p case
3524 if(part==1) {// default case (irrelevant for term 1 and term 5)
3525 if(c1==c2) seSS=kTRUE;
3526 if(key1==key2) seSK=kTRUE;
3527 seKeySum = key1+key2;
3528 }
3529 if(part==2){
3530 if(c1==c3) seSS=kTRUE;
3531 if(key1==key3) seSK=kTRUE;
3532 seKeySum = key1+key3;
3533 }
3534
3535
3536 // fill2, fill3, fill4 are only used for Cumulant Terms 2,3,4
3537
3538 if(fi==0 || fi==6 || fi==9){// Identical species
3539 if( (c1+c2+c3)==1) {
3540 b1=0; b2=0; b3=1;// Re-assign to merge degenerate histos
3541 //
3542 if(seSS) fill2=kTRUE;
3543 else {fill3=kTRUE; fill4=kTRUE;}
3544 //
3545 }else if( (c1+c2+c3)==2) {
3546 b1=0; b2=1; b3=1;
3547 //
3548 if(!seSS) {fill2=kTRUE; fill3=kTRUE;}
3549 else fill4=kTRUE;
3550 //
3551 }else {
3552 b1=c1; b2=c2; b3=c3;
3553 fill2=kTRUE; fill3=kTRUE; fill4=kTRUE;
3554 }
3555 }else if(fi != 5){// all the rest except pi-k-p
3556 if(key1==key2){
3557 b3=c3;
3558 if( (c1+c2)==1) {b1=0; b2=1;}
3559 else {b1=c1; b2=c2;}
3560 }else if(key1==key3){
3561 b3=c2;
3562 if( (c1+c3)==1) {b1=0; b2=1;}
3563 else {b1=c1; b2=c3;}
3564 }else {// Key2==Key3
3565 b3=c1;
3566 if( (c2+c3)==1) {b1=0; b2=1;}
3567 else {b1=c2; b2=c3;}
3568 }
3569 //////////////////////////////
3570 if(seSK) fill2=kTRUE;// Same keys from Same Event
3571 else {// Different keys from Same Event
3572 if( (c1+c2+c3)==1) {
3573 if(b3==0) {
3574 if(seSS) fill3=kTRUE;
3575 else fill4=kTRUE;
3576 }else{fill3=kTRUE; fill4=kTRUE;}// b3=1 so fill both
3577 }else if( (c1+c2+c3)==2) {
3578 if(b3==1) {
3579 if(seSS) fill4=kTRUE;
3580 else fill3=kTRUE;
3581 }else{fill3=kTRUE; fill4=kTRUE;}// b3=0 so fill both
3582 }else{fill3=kTRUE; fill4=kTRUE;}// all same charge so fill both
3583 }
3584 /////////////////////////////
3585 }else {// pi-k-p (no charge ordering applies since all are unique)
3586 if(key1==1){
3587 if(key2==10) {b1=c1; b2=c2; b3=c3;}// pi-k-p
3588 else {b1=c1; b2=c3; b3=c2;}// pi-p-k
3589 }else if(key1==10){
3590 if(key2==1) {b1=c2; b2=c1; b3=c3;}// k-pi-p
3591 else {b1=c3; b2=c1; b3=c2;}// k-p-pi
3592 }else {// key1==100
3593 if(key2==1) {b1=c2; b2=c3; b3=c1;}// p-pi-k
3594 else {b1=c3; b2=c2; b3=c1;}// p-k-pi
3595 }
3596 ////////////////////////////////////
3597 if(seKeySum==11) fill2=kTRUE;
3598 else if(seKeySum==101) fill3=kTRUE;
3599 else fill4=kTRUE;
3600 ////////////////////////////////////
3601 }
3602
3603}
3604//________________________________________________________________________
3605void AliChaoticity::ArrangeQs(Short_t fi, Short_t key1, Short_t key2, Short_t key3, Int_t c1, Int_t c2, Int_t c3, Float_t q12, Float_t q13, Float_t q23, Short_t part, Short_t term, Float_t &fQ, Float_t &sQ, Float_t &tQ){
3606
3607 // for terms 2-4: start by setting q12(part 1) or q13(part 2)
3608 if(fi==0 || fi==6 || fi==9){// Identical species
3609 if( (c1+c2+c3)==1) {// fQ=ss, sQ=os, tQ=os
3610 if(term==1 || term==5){
3611 if(c1==c2) {fQ=q12; sQ=q13; tQ=q23;}
3612 else if(c1==c3) {fQ=q13; sQ=q12; tQ=q23;}
3613 else {fQ=q23; sQ=q12; tQ=q13;}
3614 }else if(term==2 && part==1){
3615 fQ=q12; sQ=q13; tQ=q23;
3616 }else if(term==2 && part==2){
3617 fQ=q13; sQ=q12; tQ=q23;
3618 }else if(term==3 && part==1){
3619 sQ=q12;
3620 if(c1==c3) {fQ=q13; tQ=q23;}
3621 else {fQ=q23; tQ=q13;}
3622 }else if(term==3 && part==2){
3623 sQ=q13;
3624 if(c1==c2) {fQ=q12; tQ=q23;}
3625 else {fQ=q23; tQ=q12;}
3626 }else if(term==4 && part==1){
3627 tQ=q12;
3628 if(c1==c3) {fQ=q13; sQ=q23;}
3629 else {fQ=q23; sQ=q13;}
3630 }else if(term==4 && part==2){
3631 tQ=q13;
3632 if(c1==c2) {fQ=q12; sQ=q23;}
3633 else {fQ=q23; sQ=q12;}
3634 }else cout<<"problem!!!!!!!!!!!!!"<<endl;
3635 }else if( (c1+c2+c3)==2) {// fQ=os, sQ=os, tQ=ss
3636 if(term==1 || term==5){
3637 if(c1==c2) {tQ=q12; sQ=q13; fQ=q23;}
3638 else if(c1==c3) {tQ=q13; sQ=q12; fQ=q23;}
3639 else {tQ=q23; sQ=q12; fQ=q13;}
3640 }else if(term==2 && part==1){
3641 fQ=q12;
3642 if(c1==c3) {tQ=q13; sQ=q23;}
3643 else {tQ=q23; sQ=q13;}
3644 }else if(term==2 && part==2){
3645 fQ=q13;
3646 if(c1==c2) {tQ=q12; sQ=q23;}
3647 else {tQ=q23; sQ=q12;}
3648 }else if(term==3 && part==1){
3649 sQ=q12;
3650 if(c1==c3) {tQ=q13; fQ=q23;}
3651 else {tQ=q23; fQ=q13;}
3652 }else if(term==3 && part==2){
3653 sQ=q13;
3654 if(c1==c2) {tQ=q12; fQ=q23;}
3655 else {tQ=q23; fQ=q12;}
3656 }else if(term==4 && part==1){
3657 tQ=q12; sQ=q13; fQ=q23;
3658 }else if(term==4 && part==2){
3659 tQ=q13; sQ=q12; fQ=q23;
3660 }else cout<<"problem!!!!!!!!!!!!!"<<endl;
3661 }else {// fQ=ss, sQ=ss, tQ=ss
3662 if(term==1 || term==5) {fQ=q12; sQ=q13; tQ=q23;}
3663 else if(term==2 && part==1) {fQ=q12; sQ=q13; tQ=q23;}
3664 else if(term==2 && part==2) {fQ=q13; sQ=q12; tQ=q23;}
3665 else if(term==3 && part==1) {sQ=q12; fQ=q13; tQ=q23;}
3666 else if(term==3 && part==2) {sQ=q13; fQ=q12; tQ=q23;}
3667 else if(term==4 && part==1) {tQ=q12; fQ=q13; sQ=q23;}
3668 else if(term==4 && part==2) {tQ=q13; fQ=q12; sQ=q23;}
3669 }
3670 }else if(fi != 5){// all the rest except pi-k-p
3671 if(key1==key2){
3672 fQ=q12;
3673 if(c1==c2){
3674 // cases not explicity shown below are not possible
3675 if(term==1 || term==5) {sQ=q13; tQ=q23;}
3676 else if(term==2 && part==1) {sQ=q13; tQ=q23;}
3677 else if(term==3 && part==2) {sQ=q13; tQ=q23;}
3678 else if(term==4 && part==2) {tQ=q13; sQ=q23;}
3679 else cout<<"problem!!!!!!!!!!!!!"<<endl;
3680 }else if(c3==0){
3681 if(c1==c3) {sQ=q13; tQ=q23;}
3682 else {sQ=q23; tQ=q13;}
3683 }else {//c3==1
3684 if(c1==c3) {tQ=q13; sQ=q23;}
3685 else {tQ=q23; sQ=q13;}
3686 }
3687 }else if(key1==key3){
3688 fQ=q13;
3689 if(c1==c3){
3690 // cases not explicity shown below are not possible
3691 if(term==1 || term==5) {sQ=q12; tQ=q23;}
3692 else if(term==2 && part==2) {sQ=q12; tQ=q23;}
3693 else if(term==3 && part==1) {sQ=q12; tQ=q23;}
3694 else if(term==4 && part==1) {tQ=q12; sQ=q23;}
3695 else cout<<"problem!!!!!!!!!!!!!!!!!!!!!!"<<endl;
3696 }else if(c2==0){
3697 if(c1==c2) {sQ=q12; tQ=q23;}
3698 else {sQ=q23; tQ=q12;}
3699 }else {//c2==1
3700 if(c1==c2) {tQ=q12; sQ=q23;}
3701 else {tQ=q23; sQ=q12;}
3702 }
3703 }else {// key2==key3
3704 fQ=q23;
3705 if(c2==c3){
3706 // cases not explicity shown below are not possible
3707 if(term==1 || term==5) {sQ=q12; tQ=q13;}
3708 else if(term==3 && part==1) {sQ=q12; tQ=q13;}
3709 else if(term==3 && part==2) {sQ=q13; tQ=q12;}
3710 else if(term==4 && part==1) {tQ=q12; sQ=q13;}
3711 else if(term==4 && part==2) {tQ=q13; sQ=q12;}
3712 else cout<<"problem!!!!!!!!!!!!!!!!!!!!!!"<<endl;
3713 }else if(c1==0){
3714 if(c1==c2) {sQ=q12; tQ=q13;}
3715 else {sQ=q13; tQ=q12;}
3716 }else {//c1==1
3717 if(c1==c2) {tQ=q12; sQ=q13;}
3718 else {tQ=q13; sQ=q12;}
3719 }
3720 }
3721 }else {// pi-k-p
3722 if(key1==1){
3723 if(key2==10) {fQ=q12; sQ=q13; tQ=q23;}// pi-k-p
3724 else {fQ=q13; sQ=q12; tQ=q23;}// pi-p-k
3725 }else if(key1==10){
3726 if(key2==1) {fQ=q12; sQ=q23; tQ=q13;}// k-pi-p
3727 else {fQ=q13; sQ=q23; tQ=q12;}// k-p-pi
3728 }else {// key1==100
3729 if(key2==1) {fQ=q23; sQ=q12; tQ=q13;}// p-pi-k
3730 else {fQ=q23; sQ=q13; tQ=q12;}// p-k-pi
3731 }
3732
3733 }
3734
3735
3736}
3737//________________________________________________________________________
3738Float_t AliChaoticity::GetQinv(Short_t fi, Float_t track1[], Float_t track2[]){
3739
3740 Float_t qinv=1.0;
3741
3742 if(fi==0 || fi==3 || fi==5){// identical masses
3743 qinv = sqrt( pow(track1[1]-track2[1],2) + pow(track1[2]-track2[2],2) + pow(track1[3]-track2[3],2) - pow(track1[0]-track2[0],2));
3744 }else{// different masses
3745 Float_t px = track1[1] + track2[1];
3746 Float_t py = track1[2] + track2[2];
3747 Float_t pz = track1[3] + track2[3];
3748 Float_t pSquared = pow(track1[0]+track2[0],2) - px*px - py*py - pz*pz;
3749 Float_t deltaDOTsum = (track1[0]-track2[0])*(track1[0]+track2[0]);
3750 deltaDOTsum -= (track1[1]-track2[1])*px + (track1[2]-track2[2])*py + (track1[3]-track2[3])*pz;
3751
3752 qinv = pow( (track1[1]-track2[1]) - deltaDOTsum*px/(pSquared),2);
3753 qinv += pow( (track1[2]-track2[2]) - deltaDOTsum*py/(pSquared),2);
3754 qinv += pow( (track1[3]-track2[3]) - deltaDOTsum*pz/(pSquared),2);
3755 qinv -= pow( (track1[0]-track2[0]) - deltaDOTsum*(track1[0]+track2[0])/(pSquared),2);
3756 qinv = sqrt(qinv);
3757 }
3758
3759 return qinv;
3760
3761}
3762//________________________________________________________________________
3763void AliChaoticity::GetQosl(Float_t track1[], Float_t track2[], Float_t& qout, Float_t& qside, Float_t& qlong){
3764
3765 Float_t p0 = track1[0] + track2[0];
3766 Float_t px = track1[1] + track2[1];
3767 Float_t py = track1[2] + track2[2];
3768 Float_t pz = track1[3] + track2[3];
3769
3770 Float_t mt = sqrt(p0*p0 - pz*pz);
3771 Float_t pt = sqrt(px*px + py*py);
3772
3773 Float_t v0 = track1[0] - track2[0];
3774 Float_t vx = track1[1] - track2[1];
3775 Float_t vy = track1[2] - track2[2];
3776 Float_t vz = track1[3] - track2[3];
3777
3778 qout = (px*vx + py*vy)/pt;
3779 qside = (px*vy - py*vx)/pt;
3780 qlong = (p0*vz - pz*v0)/mt;
3781}
3782//________________________________________________________________________
654866df 3783void AliChaoticity::SetWeightArrays(Bool_t legoCase, TH3F *histos[AliChaoticity::fKbinsT][AliChaoticity::fCentBins]){
3784
90814457 3785 if(legoCase){
3786 cout<<"LEGO call to SetWeightArrays"<<endl;
704f2481 3787
654866df 3788 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
3789 for(Int_t mb=0; mb<fCentBins; mb++){
f5df8b1d 3790 fNormWeight[tKbin][mb] = (TH3F*)histos[tKbin][mb]->Clone();
3791 fNormWeight[tKbin][mb]->SetDirectory(0);
90814457 3792 }
3793 }
f5df8b1d 3794
90814457 3795 }else{
3796
3797 TFile *wFile = new TFile("WeightFile.root","READ");
3798 if(!wFile->IsOpen()) {cout<<"No Weight File!!!!!!!!!!"<<endl; return;}
3799 else cout<<"Good Weight File Found!"<<endl;
3800
654866df 3801 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
3802 for(Int_t mb=0; mb<fCentBins; mb++){
f5df8b1d 3803
3804 TString *name = new TString("Weight_Kt_");
3805 *name += tKbin;
3806 name->Append("_Ky_0");
3807 name->Append("_M_");
3808 *name += mb;
3809 name->Append("_ED_0");
3810
f5df8b1d 3811
3812 fNormWeight[tKbin][mb] = (TH3F*)wFile->Get(name->Data());
3813 fNormWeight[tKbin][mb]->SetDirectory(0);
3814
3815
f5df8b1d 3816 }//mb
90814457 3817 }//kt
3818
3819 wFile->Close();
3820 }
f5df8b1d 3821
5e3e77d6 3822 cout<<"Done reading weight file"<<endl;
cd12341d 3823
3824}
3825//________________________________________________________________________
2f00662e 3826void AliChaoticity::GetWeight(Float_t track1[], Float_t track2[], Float_t& wgt, Float_t& wgtErr){
cd12341d 3827
2f00662e 3828 Float_t kt=sqrt( pow(track1[1]+track2[1],2) + pow(track1[2]+track2[2],2))/2.;
cd12341d 3829 //
3830 Float_t qOut=0,qSide=0,qLong=0;
3831 GetQosl(track1, track2, qOut, qSide, qLong);
3832 qOut = fabs(qOut);
3833 qSide = fabs(qSide);
3834 qLong = fabs(qLong);
3eebc801 3835 Float_t wd=0, xd=0, yd=0, zd=0;
2f00662e 3836 //Float_t qinv_temp=GetQinv(0,track1, track2);
cd12341d 3837 //
3838
2f00662e 3839 if(kt < fKmeanT[0]) {fKtIndexL=0; fKtIndexH=1;}
3840 else if(kt >= fKmeanT[fKbinsT-1]) {fKtIndexL=fKbinsT-2; fKtIndexH=fKbinsT-1;}
cd12341d 3841 else {
654866df 3842 for(Int_t i=0; i<fKbinsT-1; i++){
f5df8b1d 3843 if((kt >= fKmeanT[i]) && (kt < fKmeanT[i+1])) {fKtIndexL=i; fKtIndexH=i+1; break;}
cd12341d 3844 }
3845 }
2f00662e 3846 wd = (kt-fKmeanT[fKtIndexL])/(fKmeanT[fKtIndexH]-fKmeanT[fKtIndexL]);
cd12341d 3847 //
3848 /////////
3eebc801 3849 if(qOut < fQmean[0]) {fQoIndexL=0; fQoIndexH=0; xd=0;}
a05cda99 3850 else if(qOut >= fQmean[kQbinsWeights-1]) {fQoIndexL=kQbinsWeights-1; fQoIndexH=kQbinsWeights-1; xd=1;}
cd12341d 3851 else {
3eebc801 3852 for(Int_t i=0; i<kQbinsWeights-1; i++){
f5df8b1d 3853 if((qOut >= fQmean[i]) && (qOut < fQmean[i+1])) {fQoIndexL=i; fQoIndexH=i+1; break;}
cd12341d 3854 }
3eebc801 3855 xd = (qOut-fQmean[fQoIndexL])/(fQmean[fQoIndexH]-fQmean[fQoIndexL]);
cd12341d 3856 }
3857 //
3eebc801 3858 if(qSide < fQmean[0]) {fQsIndexL=0; fQsIndexH=0; yd=0;}
a05cda99 3859 else if(qSide >= fQmean[kQbinsWeights-1]) {fQsIndexL=kQbinsWeights-1; fQsIndexH=kQbinsWeights-1; yd=1;}
cd12341d 3860 else {
3861 for(Int_t i=0; i<kQbinsWeights-1; i++){
f5df8b1d 3862 if((qSide >= fQmean[i]) && (qSide < fQmean[i+1])) {fQsIndexL=i; fQsIndexH=i+1; break;}
cd12341d 3863 }
3eebc801 3864 yd = (qSide-fQmean[fQsIndexL])/(fQmean[fQsIndexH]-fQmean[fQsIndexL]);
cd12341d 3865 }
3866 //
3eebc801 3867 if(qLong < fQmean[0]) {fQlIndexL=0; fQlIndexH=0; zd=0;}
a05cda99 3868 else if(qLong >= fQmean[kQbinsWeights-1]) {fQlIndexL=kQbinsWeights-1; fQlIndexH=kQbinsWeights-1; zd=1;}
cd12341d 3869 else {
3870 for(Int_t i=0; i<kQbinsWeights-1; i++){
f5df8b1d 3871 if((qLong >= fQmean[i]) && (qLong < fQmean[i+1])) {fQlIndexL=i; fQlIndexH=i+1; break;}
cd12341d 3872 }
3eebc801 3873 zd = (qLong-fQmean[fQlIndexL])/(fQmean[fQlIndexH]-fQmean[fQlIndexL]);
cd12341d 3874 }
3875 //
3876
f5df8b1d 3877
3eebc801 3878 //Float_t min = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1,fQsIndexH+1,fQlIndexH+1);
f5df8b1d 3879 Float_t minErr = fNormWeight[fKtIndexL][fMbin]->GetBinError(fQoIndexH+1,fQsIndexH+1,fQlIndexH+1);
3eebc801 3880 /*
cd12341d 3881 Float_t deltaW=0;
3882 // kt
f5df8b1d 3883 deltaW += (fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexH+1) - min)*(kt-fKmeanT[fKtIndexL])/((fKstepT[fKtIndexL]+fKstepT[fKtIndexH])/2.);
cd12341d 3884 // Qo
f5df8b1d 3885 deltaW += (fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexH+1, fQlIndexH+1) - min)*(qOut-fQmean[fQoIndexL])/fQstepWeights;
cd12341d 3886 // Qs
f5df8b1d 3887 deltaW += (fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexL+1, fQlIndexH+1) - min)*(qSide-fQmean[fQsIndexL])/fQstepWeights;
cd12341d 3888 // Ql
f5df8b1d 3889 deltaW += (fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexL+1) - min)*(qLong-fQmean[fQlIndexL])/fQstepWeights;
cd12341d 3890 //
3891 wgt = min + deltaW;
3eebc801 3892 */
cd12341d 3893
3eebc801 3894
3895 //
3896 // w interpolation (kt)
3897 Float_t c000 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexL+1, fQlIndexL+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexL+1, fQlIndexL+1)*wd;
3898 Float_t c100 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexL+1, fQlIndexL+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexL+1, fQlIndexL+1)*wd;
3899 Float_t c010 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexH+1, fQlIndexL+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexH+1, fQlIndexL+1)*wd;
3900 Float_t c001 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexL+1, fQlIndexH+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexL+1, fQlIndexH+1)*wd;
3901 Float_t c110 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexL+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexL+1)*wd;
3902 Float_t c101 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexL+1, fQlIndexH+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexL+1, fQlIndexH+1)*wd;
3903 Float_t c011 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexH+1, fQlIndexH+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexH+1, fQlIndexH+1)*wd;
3904 Float_t c111 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexH+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexH+1)*wd;
3905 // x interpolation (qOut)
3906 Float_t c00 = c000*(1-xd) + c100*xd;
3907 Float_t c10 = c010*(1-xd) + c110*xd;
3908 Float_t c01 = c001*(1-xd) + c101*xd;
3909 Float_t c11 = c011*(1-xd) + c111*xd;
3910 // y interpolation (qSide)
3911 Float_t c0 = c00*(1-yd) + c10*yd;
3912 Float_t c1 = c01*(1-yd) + c11*yd;
3913 // z interpolation (qLong)
3914 wgt = (c0*(1-zd) + c1*zd);
46b217b3 3915
cd12341d 3916 ////
3917
3918 // Denominator errors negligible compared to numerator so do not waste cpu time below.
3eebc801 3919 //Float_t deltaWErr=0;
cd12341d 3920 // Kt
3921 /*
f5df8b1d 3922 deltaWErr += (fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexH+1) - minErr)*(kt-fKmeanT[fKtIndexL])/((fKstepT[fKtIndexL]+fKstepT[fKtIndexH])/2.);
cd12341d 3923 // Qo
f5df8b1d 3924 deltaWErr += (fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexH+1, fQlIndexH+1) - minErr)*(qOut-fQmean[fQoIndexL])/fQstepWeights;
cd12341d 3925 // Qs
f5df8b1d 3926 deltaWErr += (fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexL+1, fQlIndexH+1) - minErr)*(qSide-fQmean[fQsIndexL])/fQstepWeights;
cd12341d 3927 // Ql
f5df8b1d 3928 deltaWErr += (fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexL+1) - minErr)*(qLong-fQmean[fQlIndexL])/fQstepWeights;
cd12341d 3929 */
3eebc801 3930 wgtErr = minErr;
cd12341d 3931
3932
cd12341d 3933}
3934//________________________________________________________________________
05db4376 3935Float_t AliChaoticity::MCWeight(Int_t charge1, Int_t charge2, Int_t r, Int_t dampIndex, Float_t qinv){
cd12341d 3936
05db4376 3937 Float_t radius = Float_t(r)/0.19733;// convert to GeV (starts at 5 fm, was 3 fm)
dbcaf506 3938
cd12341d 3939 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
654866df 3940 Float_t coulCorr12 = FSICorrelationTherm2(charge1, charge2, qinv);
cd12341d 3941 if(charge1==charge2){
05db4376 3942 Float_t arg=qinv*radius;
3943 Float_t EW = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg,3) - 12.*arg);
3944 EW += kappa4/(24.*pow(2.,2))*(16.*pow(arg,4) -48.*pow(arg,2) + 12);
3945 return ((1-myDamp) + myDamp*(1 + exp(-pow(qinv*radius,2))*pow(EW,2))*coulCorr12);
cd12341d 3946 }else {
5e3e77d6 3947 return ((1-myDamp) + myDamp*coulCorr12);
cd12341d 3948 }
3949
3950}
654866df 3951//________________________________________________________________________
05db4376 3952Float_t AliChaoticity::MCWeightOSL(Int_t charge1, Int_t charge2, Int_t r, Int_t dampIndex, Float_t qinv, Float_t qo, Float_t qs, Float_t ql){
654866df 3953
05db4376 3954 Float_t radiusOut = Float_t(r)/0.19733;// convert to GeV (starts at 5 fm, was 3 fm)
654866df 3955 Float_t radiusSide = radiusOut;
3956 Float_t radiusLong = radiusOut;
3957 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
3958 Float_t coulCorr12 = FSICorrelationTherm2(charge1, charge2, qinv);
3959 if(charge1==charge2){
3960 return ((1-myDamp) + myDamp*(1 + exp(-pow(qo*radiusOut,2)) * exp(-pow(qs*radiusSide,2)) * exp(-pow(ql*radiusLong,2)))*coulCorr12);
3961 }else {
3962 return ((1-myDamp) + myDamp*coulCorr12);
3963 }
3964
3965}
3966
cd12341d 3967//________________________________________________________________________
90814457 3968Float_t AliChaoticity::MCWeight3D(Bool_t SameCharge, Int_t term, Int_t dampIndex, Float_t q12, Float_t q13, Float_t q23){
cd12341d 3969 if(term==5) return 1.0;
5e3e77d6 3970
05db4376 3971 Float_t radius=fRMax;// was in terms of bins starting at 3 fm Gaussian source
f9a5e67a 3972 //if(fMbin<=1) {}
3973 //else if(fMbin<=3) {radius = radius-1;}
3974 //else if(fMbin<=5) {radius = radius-2;}
3975 //else {radius = radius-3;}
3976
90814457 3977 radius /= 0.19733;
3978
cd12341d 3979 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
3980 Float_t fc = sqrt(myDamp);
b3316be6 3981
5e3e77d6 3982 if(SameCharge){// all three of the same charge
90814457 3983 Float_t coulCorr12 = FSICorrelationTherm2(+1,+1, q12);// K2
3984 Float_t coulCorr13 = FSICorrelationTherm2(+1,+1, q13);// K2
3985 Float_t coulCorr23 = FSICorrelationTherm2(+1,+1, q23);// K2
05db4376 3986 Float_t arg12=q12*radius;
3987 Float_t arg13=q13*radius;
3988 Float_t arg23=q23*radius;
3989 Float_t EW12 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12);
3990 EW12 += kappa4/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12);
3991 Float_t EW13 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg13,3) - 12.*arg13);
3992 EW13 += kappa4/(24.*pow(2.,2))*(16.*pow(arg13,4) -48.*pow(arg13,2) + 12);
3993 Float_t EW23 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg23,3) - 12.*arg23);
3994 EW23 += kappa4/(24.*pow(2.,2))*(16.*pow(arg23,4) -48.*pow(arg23,2) + 12);
5e3e77d6 3995 if(term==1){
05db4376 3996 Float_t c3QS = 1 + exp(-pow(q12*radius,2))*pow(EW12,2) + exp(-pow(q13*radius,2))*pow(EW13,2) + exp(-pow(q23*radius,2))*pow(EW23,2);
3997 c3QS += 2*exp(-pow(radius,2)*(pow(q12,2) + pow(q13,2) + pow(q23,2))/2.)*EW12*EW13*EW23;
5e3e77d6 3998 Float_t w123 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
05db4376 3999 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12;
4000 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q13*radius,2))*pow(EW13,2))*coulCorr13;
4001 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q23*radius,2))*pow(EW23,2))*coulCorr23;
baba9c2d 4002 w123 += pow(fc,3)*c3QS*coulCorr12*coulCorr13*coulCorr23;
5e3e77d6 4003 return w123;
4004 }else if(term==2){
05db4376 4005 return ((1-myDamp) + myDamp*(1 + exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12);
5e3e77d6 4006 }else if(term==3){
05db4376 4007 return ((1-myDamp) + myDamp*(1 + exp(-pow(q13*radius,2))*pow(EW13,2))*coulCorr13);
5e3e77d6 4008 }else if(term==4){
05db4376 4009 return ((1-myDamp) + myDamp*(1 + exp(-pow(q23*radius,2))*pow(EW23,2))*coulCorr23);
5e3e77d6 4010 }else return 1.0;
4011
4012 }else{// mixed charge case pair 12 always treated as ss
90814457 4013 Float_t coulCorr12 = FSICorrelationTherm2(+1,+1, q12);// K2 ss
4014 Float_t coulCorr13 = FSICorrelationTherm2(+1,-1, q13);// K2 os
4015 Float_t coulCorr23 = FSICorrelationTherm2(+1,-1, q23);// K2 os
05db4376 4016 Float_t arg12=q12*radius;
4017 Float_t EW12 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12);
4018 EW12 += kappa4/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12);
5e3e77d6 4019 if(term==1){
05db4376 4020 Float_t c3QS = 1 + exp(-pow(q12*radius,2))*pow(EW12,2);
5e3e77d6 4021 Float_t w123 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
05db4376 4022 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12;
5e3e77d6 4023 w123 += pow(fc,2)*(1-fc)*coulCorr13;
4024 w123 += pow(fc,2)*(1-fc)*coulCorr23;
baba9c2d 4025 w123 += pow(fc,3)*c3QS*coulCorr12*coulCorr13*coulCorr23;
5e3e77d6 4026 return w123;
4027 }else if(term==2){
05db4376 4028 return ((1-myDamp) + myDamp*(1 + exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12);
5e3e77d6 4029 }else if(term==3){
4030 return ((1-myDamp) + myDamp*coulCorr13);
4031 }else if(term==4){
4032 return ((1-myDamp) + myDamp*coulCorr23);
4033 }else return 1.0;
4034 }
4035
cd12341d 4036}
4037//________________________________________________________________________
90814457 4038void AliChaoticity::SetMomResCorrections(Bool_t legoCase, TH2D *temp2D){
5e3e77d6 4039
4040
4041 if(legoCase){
90814457 4042 cout<<"LEGO call to SetMomResCorrections"<<endl;
5e3e77d6 4043 fMomResC2 = (TH2D*)temp2D->Clone();
5e3e77d6 4044 fMomResC2->SetDirectory(0);
5e3e77d6 4045 }else {
4046 TFile *momResFile = new TFile("MomResFile.root","READ");
4047 if(!momResFile->IsOpen()) {
4048 cout<<"No momentum resolution file found"<<endl;
4049 AliFatal("No momentum resolution file found. Kill process.");
4050 }else {cout<<"Good Momentum Resolution File Found!"<<endl;}
4051
4052 TH2D *temp2D2 = (TH2D*)momResFile->Get("MomResHisto_pp");
5e3e77d6 4053 fMomResC2 = (TH2D*)temp2D2->Clone();
5e3e77d6 4054 fMomResC2->SetDirectory(0);
90814457 4055
5e3e77d6 4056 momResFile->Close();
4057 }
cd12341d 4058
704f2481 4059 // fMomResC2->GetBinContent(1,5) should be ~1.007
4060 if(fMomResC2->GetBinContent(1,5) > 1.2) AliFatal("AliChaoticity: SetMomResCorrections Problem");// Additional Safety check
4061 if(fMomResC2->GetBinContent(1,5) < 0.95) AliFatal("AliChaoticity: SetMomResCorrections Problem");// Additional Safety check
4062
4063 for(Int_t bx=1; bx<=fMomResC2->GetNbinsX(); bx++){
4064 for(Int_t by=1; by<=fMomResC2->GetNbinsX(); by++){
4065 if(fMomResC2->GetBinContent(bx,by) > 1.5) fMomResC2->SetBinContent(bx,by, 1.5);// Maximum is ~1.02
4066 if(fMomResC2->GetBinContent(bx,by) < 0.95) fMomResC2->SetBinContent(bx,by, 0.95);// Minimum is ~0.98
4067 }
4068 }
4069
5e3e77d6 4070 cout<<"Done reading momentum resolution file"<<endl;
4071}
4072//________________________________________________________________________
baba9c2d 4073void AliChaoticity::SetFSICorrelations(Bool_t legoCase, TH2D *temp2DTherm[2], TH3D *temp3Dos[6], TH3D *temp3Dss[6]){
5e3e77d6 4074 // read in 2-particle and 3-particle FSI correlations = K2 & K3
4075 // 2-particle input histo from file is binned in qinv. 3-particle in qinv of each pair
4076 if(legoCase){
c4980714 4077 cout<<"LEGO call to SetFSICorrelations"<<endl;
baba9c2d 4078 fFSI2SS = (TH2D*)temp2DTherm[0]->Clone();
4079 fFSI2OS = (TH2D*)temp2DTherm[1]->Clone();
5e3e77d6 4080 //
baba9c2d 4081 fFSI2SS->SetDirectory(0);
4082 fFSI2OS->SetDirectory(0);
90814457 4083
4084 for(Int_t CB=0; CB<6; CB++) {
4085 fFSIOmega0OS[CB] = (TH3D*)temp3Dos[CB]->Clone();
4086 fFSIOmega0SS[CB] = (TH3D*)temp3Dss[CB]->Clone();
4087 //
4088 fFSIOmega0OS[CB]->SetDirectory(0);
4089 fFSIOmega0SS[CB]->SetDirectory(0);
4090 }
5e3e77d6 4091 }else {
c4980714 4092 cout<<"non LEGO call to SetFSICorrelations"<<endl;
5e3e77d6 4093 TFile *fsifile = new TFile("KFile.root","READ");
4094 if(!fsifile->IsOpen()) {
4095 cout<<"No FSI file found"<<endl;
4096 AliFatal("No FSI file found. Kill process.");
4097 }else {cout<<"Good FSI File Found!"<<endl;}
4098
90814457 4099 TH2D *temphisto2ThermSS = (TH2D*)fsifile->Get("K2ssT");
4100 TH2D *temphisto2ThermOS = (TH2D*)fsifile->Get("K2osT");
4101 TH3D *temphisto3OS[6];
ae9b34d1 4102 TH3D *temphisto3SS[6];
4103 for(Int_t CB=0; CB<6; CB++) {
90814457 4104 TString *nameK3SS = new TString("K3ss_");
4105 *nameK3SS += CB;
4106 temphisto3SS[CB] = (TH3D*)fsifile->Get(nameK3SS->Data());
4107 //
4108 TString *nameK3OS = new TString("K3os_");
4109 *nameK3OS += CB;
4110 temphisto3OS[CB] = (TH3D*)fsifile->Get(nameK3OS->Data());
ae9b34d1 4111 }
4112
baba9c2d 4113 fFSI2SS = (TH2D*)temphisto2ThermSS->Clone();
4114 fFSI2OS = (TH2D*)temphisto2ThermOS->Clone();
4115 fFSI2SS->SetDirectory(0);
4116 fFSI2OS->SetDirectory(0);
4117
90814457 4118 for(Int_t CB=0; CB<6; CB++) {
4119 fFSIOmega0SS[CB] = (TH3D*)temphisto3SS[CB]->Clone();
4120 fFSIOmega0OS[CB] = (TH3D*)temphisto3OS[CB]->Clone();
4121 fFSIOmega0SS[CB]->SetDirectory(0);
4122 fFSIOmega0OS[CB]->SetDirectory(0);
4123 }
4124 //
4125
5e3e77d6 4126 fsifile->Close();
cd12341d 4127 }
baba9c2d 4128
4129 // fFSI2SS->GetBinContent(1,2) should be ~0.32
4130 if(fFSI2SS->GetBinContent(1,2) > 1.0) AliFatal("AliChaoticity: SetFSICorrelations Problem");// Additional Safety check
4131 if(fFSI2SS->GetBinContent(1,2) < 0.1) AliFatal("AliChaoticity: SetFSICorrelations Problem");// Additional Safety check
4132
4133 for(Int_t ii=1; ii<=fFSI2SS->GetNbinsX(); ii++){
4134 for(Int_t jj=1; jj<=fFSI2SS->GetNbinsY(); jj++){
4135 if(fFSI2SS->GetBinContent(ii,jj) > 1.0) fFSI2SS->SetBinContent(ii,jj, 1.0);
4136 if(fFSI2OS->GetBinContent(ii,jj) > 10.0) fFSI2OS->SetBinContent(ii,jj, 10.0);
704f2481 4137 //
baba9c2d 4138 if(fFSI2SS->GetBinContent(ii,jj) < 0.05) fFSI2SS->SetBinContent(ii,jj, 0.05);
4139 if(fFSI2OS->GetBinContent(ii,jj) < 0.9) fFSI2OS->SetBinContent(ii,jj, 0.9);
704f2481 4140 }
4141 }
4142
5e3e77d6 4143 cout<<"Done reading FSI file"<<endl;
cd12341d 4144}
4145//________________________________________________________________________
90814457 4146Float_t AliChaoticity::FSICorrelationTherm2(Int_t charge1, Int_t charge2, Float_t qinv){
4147 // returns 2-particle Coulomb correlations = K2
baba9c2d 4148 Int_t qbinL = fFSI2SS->GetYaxis()->FindBin(qinv-fFSI2SS->GetYaxis()->GetBinWidth(1)/2.);
5e3e77d6 4149 Int_t qbinH = qbinL+1;
4150 if(qbinL <= 0) return 1.0;
baba9c2d 4151 if(qbinH > fFSI2SS->GetNbinsY()) return 1.0;
5e3e77d6 4152
4153 Float_t slope=0;
4154 if(charge1==charge2){
baba9c2d 4155 slope = fFSI2SS->GetBinContent(fFSIbin+1, qbinL) - fFSI2SS->GetBinContent(fFSIbin+1, qbinH);
4156 slope /= fFSI2SS->GetYaxis()->GetBinCenter(qbinL) - fFSI2SS->GetYaxis()->GetBinCenter(qbinH);
4157 return (slope*(qinv - fFSI2SS->GetYaxis()->GetBinCenter(qbinL)) + fFSI2SS->GetBinContent(fFSIbin+1, qbinL));
5e3e77d6 4158 }else {
baba9c2d 4159 slope = fFSI2OS->GetBinContent(fFSIbin+1, qbinL) - fFSI2OS->GetBinContent(fFSIbin+1, qbinH);
4160 slope /= fFSI2OS->GetYaxis()->GetBinCenter(qbinL) - fFSI2OS->GetYaxis()->GetBinCenter(qbinH);
4161 return (slope*(qinv - fFSI2OS->GetYaxis()->GetBinCenter(qbinL)) + fFSI2OS->GetBinContent(fFSIbin+1, qbinL));
cd12341d 4162 }
4163}
4164//________________________________________________________________________
5e3e77d6 4165Double_t AliChaoticity::FSICorrelationOmega0(Bool_t SameCharge, Double_t Q12, Double_t Q13, Double_t Q23){
5e3e77d6 4166 // returns 3d 3-particle Coulomb Correlation = K3
ae9b34d1 4167 Int_t Q12bin = fFSIOmega0SS[fFSIbin]->GetXaxis()->FindBin(Q12);
4168 Int_t Q13bin = fFSIOmega0SS[fFSIbin]->GetZaxis()->FindBin(Q13);
4169 Int_t Q23bin = fFSIOmega0SS[fFSIbin]->GetYaxis()->FindBin(Q23);
baba9c2d 4170 Int_t index12L = int(fabs(Q12 - fFSI2SS->GetYaxis()->GetBinWidth(1)/2.)/(fFSI2SS->GetYaxis()->GetBinWidth(1)));
0e58bc53 4171 Int_t index12H = index12L+1;
baba9c2d 4172 Int_t index13L = int(fabs(Q13 - fFSI2SS->GetYaxis()->GetBinWidth(1)/2.)/(fFSI2SS->GetYaxis()->GetBinWidth(1)));
0e58bc53 4173 Int_t index13H = index13L+1;
baba9c2d 4174 Int_t index23L = int(fabs(Q23 - fFSI2SS->GetYaxis()->GetBinWidth(1)/2.)/(fFSI2SS->GetYaxis()->GetBinWidth(1)));
0e58bc53 4175 Int_t index23H = index23L+1;
4176
5e3e77d6 4177 if(SameCharge){
ae9b34d1 4178 if(fFSIOmega0SS[fFSIbin]->GetBinContent(Q12bin, Q23bin, Q13bin) <=0) return 1.0;
0e58bc53 4179 Double_t base = fFSIOmega0SS[fFSIbin]->GetBinContent(index12L+1, index23L+1, index13L+1);
4180 Double_t InterPolated = 0;
4181 Double_t slope12 = fFSIOmega0SS[fFSIbin]->GetBinContent(index12H+1, index23L+1, index13L+1);
4182 slope12 -= base;
4183 slope12 /= fFSIOmega0SS[fFSIbin]->GetXaxis()->GetBinWidth(1);
4184 InterPolated += slope12*fabs(Q12 - fFSIOmega0SS[fFSIbin]->GetXaxis()->GetBinCenter(index12L+1));
4185 Double_t slope23 = fFSIOmega0SS[fFSIbin]->GetBinContent(index12L+1, index23H+1, index13L+1);
4186 slope23 -= base;
4187 slope23 /= fFSIOmega0SS[fFSIbin]->GetYaxis()->GetBinWidth(1);
4188 InterPolated += slope23*fabs(Q23 - fFSIOmega0SS[fFSIbin]->GetYaxis()->GetBinCenter(index23L+1));
4189 Double_t slope13 = fFSIOmega0SS[fFSIbin]->GetBinContent(index12L+1, index23L+1, index13H+1);
4190 slope13 -= base;
4191 slope13 /= fFSIOmega0SS[fFSIbin]->GetZaxis()->GetBinWidth(1);
4192 InterPolated += slope13*fabs(Q13 - fFSIOmega0SS[fFSIbin]->GetZaxis()->GetBinCenter(index13L+1));
4193 if( (base+InterPolated) <= 0) return 1.0;
4194 return (base+InterPolated);
4195
4196 }else{// mixed charge. Q12 is always designated as the same-charge pair
90814457 4197 if(fFSIOmega0OS[fFSIbin]->GetBinContent(Q12bin, Q23bin, Q13bin) <=0) return 1.0;
0e58bc53 4198 Double_t base = fFSIOmega0OS[fFSIbin]->GetBinContent(index12L+1, index23H+1, index13H+1);
4199 Double_t InterPolated = 0;
4200 Double_t slope12 = fFSIOmega0OS[fFSIbin]->GetBinContent(index12H+1, index23H+1, index13H+1);
4201 slope12 -= base;
4202 slope12 /= fFSIOmega0OS[fFSIbin]->GetXaxis()->GetBinWidth(1);
4203 InterPolated += slope12*fabs(Q12 - fFSIOmega0OS[fFSIbin]->GetXaxis()->GetBinCenter(index12L+1));
4204 Double_t slope23 = fFSIOmega0OS[fFSIbin]->GetBinContent(index12L+1, index23L+1, index13H+1);
4205 slope23 -= base;
4206 slope23 /= fFSIOmega0OS[fFSIbin]->GetYaxis()->GetBinWidth(1);
4207 InterPolated += slope23*fabs(Q23 - fFSIOmega0OS[fFSIbin]->GetYaxis()->GetBinCenter(index23L+1));
4208 Double_t slope13 = fFSIOmega0OS[fFSIbin]->GetBinContent(index12L+1, index23H+1, index13L+1);
4209 slope13 -= base;
4210 slope13 /= fFSIOmega0OS[fFSIbin]->GetZaxis()->GetBinWidth(1);
4211 InterPolated += slope13*fabs(Q13 - fFSIOmega0OS[fFSIbin]->GetZaxis()->GetBinCenter(index13L+1));
4212 if( (base+InterPolated) <= 0) return 1.0;
4213 return (base+InterPolated);
4214
5e3e77d6 4215 }
cd12341d 4216}
90814457 4217//________________________________________________________________________
4218void AliChaoticity::FourVectProdTerms(Float_t pV1[], Float_t pV2[], Float_t pV3[], Float_t& QS1v1, Float_t& QS2, Float_t& QS3v1, Float_t& QS1v2, Float_t& QS3v2){
4219 QS1v1 = (pV1[0]-pV2[0])*(pV2[1]-pV3[1]) - (pV1[1]-pV2[1])*(pV2[0]-pV3[0]);
4220 QS1v1 += (pV1[0]-pV2[0])*(pV2[2]-pV3[2]) - (pV1[2]-pV2[2])*(pV2[0]-pV3[0]);
4221 QS1v1 += (pV1[0]-pV2[0])*(pV2[3]-pV3[3]) - (pV1[3]-pV2[3])*(pV2[0]-pV3[0]);
4222 QS2 = (pV1[1]-pV2[1])*(pV2[2]-pV3[2]) - (pV1[2]-pV2[2])*(pV2[1]-pV3[1]);
4223 QS3v1 = (pV1[1]-pV2[1])*(pV2[3]-pV3[3]) - (pV1[3]-pV2[3])*(pV2[1]-pV3[1]);
4224 QS3v1 += (pV1[2]-pV2[2])*(pV2[3]-pV3[3]) - (pV1[3]-pV2[3])*(pV2[2]-pV3[2]);
4225 //
4226 QS1v2 = (pV1[0]-pV2[0])*(pV2[1]-pV3[1]) - (pV1[1]-pV2[1])*(pV2[0]-pV3[0]);
4227 QS1v2 += (pV1[0]-pV2[0])*(pV2[2]-pV3[2]) - (pV1[2]-pV2[2])*(pV2[0]-pV3[0]);
4228 QS3v2 = (pV1[1]-pV2[1])*(pV2[3]-pV3[3]) - (pV1[3]-pV2[3])*(pV2[1]-pV3[1]);
4229 QS3v2 += (pV1[0]-pV2[0])*(pV2[3]-pV3[3]) - (pV1[3]-pV2[3])*(pV2[0]-pV3[0]);
4230 QS3v2 += (pV1[2]-pV2[2])*(pV2[3]-pV3[3]) - (pV1[3]-pV2[3])*(pV2[2]-pV3[2]);
4231}
4232//________________________________________________________________________