1 ////////////////////////////////////////////////////////////////////////////////
3 // AliFemtoCorrFctnDirectYlm - Correlation function that is binned in Ylms //
4 // directly. Provides a way to store the numerator and denominator //
5 // in Ylms directly and correctly calculate the correlation //
6 // function from them. //
8 // Authors: Adam Kisiel kisiel@mps.ohio-state.edu //
10 ////////////////////////////////////////////////////////////////////////////////
11 #include "AliFemtoCorrFctnDirectYlm.h"
17 AliFemtoCorrFctnDirectYlm::AliFemtoCorrFctnDirectYlm(const char *name, int maxl, int ibin=30, double vmin=0.0, double vmax=0.3, int aUseLCMS=0):
43 fMaxJM = (maxl+1)*(maxl+1);
45 cout << "Size is " << sizeof(double) << " " << sizeof(complex<double>) << endl;
47 // Fill in factorials table
48 factorials = (double *) malloc(sizeof(double) * (4 * (maxl + 1)));
51 for (int iter=1; iter<4*(maxl+1); iter++)
54 factorials[iter] = fac;
57 // Fill in els and ems table
61 fels = (double *) malloc(sizeof(double) * (fMaxJM));
62 fems = (double *) malloc(sizeof(double) * (fMaxJM));
63 felsi = (int *) malloc(sizeof(int) * (fMaxJM));
64 femsi = (int *) malloc(sizeof(int) * (fMaxJM));
71 cout << "il el em " << il << " " << felsi[il] << " " << femsi[il] << endl;
81 for (il=0; il<fMaxJM; il++)
82 cout << "il el em " << il << " " << felsi[il] << " " << femsi[il] << endl;
84 // Create numerator and denominator historgrams
85 // int sthp = sizeof(TH1D *);
86 // fnumsreal = (TH1D **) malloc(sthp * fMaxJM);
87 // fnumsreal = new TH1D * [fMaxJM];
88 // fnumsimag = new TH1D * [fMaxJM];
89 // fdensreal = new TH1D * [fMaxJM];
90 // fdensimag = new TH1D * [fMaxJM];
91 fnumsreal = (TH1D **) malloc(sizeof(TH1D *) * fMaxJM);
92 fnumsimag = (TH1D **) malloc(sizeof(TH1D *) * fMaxJM);
93 fdensreal = (TH1D **) malloc(sizeof(TH1D *) * fMaxJM);
94 fdensimag = (TH1D **) malloc(sizeof(TH1D *) * fMaxJM);
97 for (int ihist=0; ihist<fMaxJM; ihist++) {
98 sprintf(bufname, "NumReYlm%i%i%s", felsi[ihist], femsi[ihist]<0 ? felsi[ihist]-femsi[ihist] : femsi[ihist], name);
99 fnumsreal[ihist] = new TH1D(bufname, bufname, ibin, vmin, vmax);
100 sprintf(bufname, "NumImYlm%i%i%s", felsi[ihist], femsi[ihist]<0 ? felsi[ihist]-femsi[ihist] : femsi[ihist], name);
101 fnumsimag[ihist] = new TH1D(bufname, bufname, ibin, vmin, vmax);
102 sprintf(bufname, "DenReYlm%i%i%s", felsi[ihist], femsi[ihist]<0 ? felsi[ihist]-femsi[ihist] : femsi[ihist], name);
103 fdensreal[ihist] = new TH1D(bufname, bufname, ibin, vmin, vmax);
104 sprintf(bufname, "DenImYlm%i%i%s", felsi[ihist], femsi[ihist]<0 ? felsi[ihist]-femsi[ihist] : femsi[ihist], name);
105 fdensimag[ihist] = new TH1D(bufname, bufname, ibin, vmin, vmax);
107 fnumsreal[ihist]->Sumw2();
108 fnumsimag[ihist]->Sumw2();
109 fdensreal[ihist]->Sumw2();
110 fdensimag[ihist]->Sumw2();
113 sprintf(bufname, "BinCountNum%s", name);
114 fbinctn = new TH1D(bufname, bufname, ibin, vmin, vmax);
116 sprintf(bufname, "BinCountDen%s", name);
117 fbinctd = new TH1D(bufname, bufname, ibin, vmin, vmax);
119 fYlmBuffer = (complex<double> *) malloc(sizeof(complex<double>) * fMaxJM);
121 // Covariance matrices
122 fcovmnum = (double *) malloc(sizeof(double) * fMaxJM * fMaxJM * 4 * ibin);
123 fcovmden = (double *) malloc(sizeof(double) * fMaxJM * fMaxJM * 4 * ibin);
128 AliFemtoYlm::InitializeYlms();
132 AliFemtoCorrFctnDirectYlm::AliFemtoCorrFctnDirectYlm():
156 // Default constructor
157 AliFemtoCorrFctnDirectYlm("AliFemtoCorrFctnDirectYlm",2);
160 AliFemtoCorrFctnDirectYlm::AliFemtoCorrFctnDirectYlm(const AliFemtoCorrFctnDirectYlm& aCorrFctn):
186 int ibin = aCorrFctn.fbinctn->GetNbinsX();
188 fMaxL = aCorrFctn.fMaxL;
189 fMaxJM = (fMaxL+1)*(fMaxL+1);
191 // Fill in factorials table
192 factorials = (double *) malloc(sizeof(double) * (4 * (fMaxL + 1)));
193 for (int iter=1; iter<4*(fMaxL+1); iter++)
195 factorials[iter] = aCorrFctn.factorials[iter];
198 // Fill in els and ems table
202 fels = (double *) malloc(sizeof(double) * (fMaxJM));
203 fems = (double *) malloc(sizeof(double) * (fMaxJM));
204 felsi = (int *) malloc(sizeof(int) * (fMaxJM));
205 femsi = (int *) malloc(sizeof(int) * (fMaxJM));
209 felsi[il] = (int) el;
210 femsi[il] = (int) em;
221 fnumsreal = (TH1D **) malloc(sizeof(TH1D *) * fMaxJM);
222 fnumsimag = (TH1D **) malloc(sizeof(TH1D *) * fMaxJM);
223 fdensreal = (TH1D **) malloc(sizeof(TH1D *) * fMaxJM);
224 fdensimag = (TH1D **) malloc(sizeof(TH1D *) * fMaxJM);
226 for (int ihist=0; ihist<fMaxJM; ihist++) {
227 if (aCorrFctn.fnumsreal[ihist])
228 fnumsreal[ihist] = new TH1D(*aCorrFctn.fnumsreal[ihist]);
230 fnumsreal[ihist] = 0;
231 if (aCorrFctn.fnumsimag[ihist])
232 fnumsimag[ihist] = new TH1D(*aCorrFctn.fnumsimag[ihist]);
234 fnumsimag[ihist] = 0;
235 if (aCorrFctn.fdensreal[ihist])
236 fdensreal[ihist] = new TH1D(*aCorrFctn.fdensreal[ihist]);
238 fdensreal[ihist] = 0;
239 if (aCorrFctn.fdensimag[ihist])
240 fdensimag[ihist] = new TH1D(*aCorrFctn.fdensimag[ihist]);
242 fdensimag[ihist] = 0;
245 if (aCorrFctn.fbinctn)
246 fbinctn = new TH1D(*aCorrFctn.fbinctn);
249 if (aCorrFctn.fbinctd)
250 fbinctd = new TH1D(*aCorrFctn.fbinctd);
254 fYlmBuffer = (complex<double> *) malloc(sizeof(complex<double>) * fMaxJM);
256 // Covariance matrices
257 fcovmnum = (double *) malloc(sizeof(double) * fMaxJM * fMaxJM * 4 * ibin);
258 fcovmden = (double *) malloc(sizeof(double) * fMaxJM * fMaxJM * 4 * ibin);
260 for (int iter=0; iter<fMaxJM * fMaxJM * 4 * ibin; iter++) {
261 fcovmnum[iter] = aCorrFctn.fcovmnum[iter];
262 fcovmden[iter] = aCorrFctn.fcovmden[iter];
265 if (aCorrFctn.fcovnum)
266 fcovnum = new TH3D(*aCorrFctn.fcovnum);
269 if (aCorrFctn.fcovden)
270 fcovden = new TH3D(*aCorrFctn.fcovden);
274 fSout = aCorrFctn.fSout;
275 fSside = aCorrFctn.fSside;
276 fSlong = aCorrFctn.fSlong;
278 if (aCorrFctn.fPairCut)
279 fPairCut = aCorrFctn.fPairCut;
281 fUseLCMS = aCorrFctn.fUseLCMS;
284 AliFemtoCorrFctnDirectYlm& AliFemtoCorrFctnDirectYlm::operator=(const AliFemtoCorrFctnDirectYlm& aCorrFctn)
286 // assignment operator
287 if (this == &aCorrFctn)
290 int ibin = aCorrFctn.fbinctn->GetNbinsX();
292 fMaxL = aCorrFctn.fMaxL;
293 fMaxJM = (fMaxL+1)*(fMaxL+1);
295 // Fill in factorials table
296 factorials = (double *) malloc(sizeof(double) * (4 * (fMaxL + 1)));
297 for (int iter=1; iter<4*(fMaxL+1); iter++)
299 factorials[iter] = aCorrFctn.factorials[iter];
302 // Fill in els and ems table
306 fels = (double *) malloc(sizeof(double) * (fMaxJM));
307 fems = (double *) malloc(sizeof(double) * (fMaxJM));
308 felsi = (int *) malloc(sizeof(int) * (fMaxJM));
309 femsi = (int *) malloc(sizeof(int) * (fMaxJM));
313 felsi[il] = (int) el;
314 femsi[il] = (int) em;
325 fnumsreal = (TH1D **) malloc(sizeof(TH1D *) * fMaxJM);
326 fnumsimag = (TH1D **) malloc(sizeof(TH1D *) * fMaxJM);
327 fdensreal = (TH1D **) malloc(sizeof(TH1D *) * fMaxJM);
328 fdensimag = (TH1D **) malloc(sizeof(TH1D *) * fMaxJM);
330 for (int ihist=0; ihist<fMaxJM; ihist++) {
331 if (aCorrFctn.fnumsreal[ihist])
332 fnumsreal[ihist] = new TH1D(*aCorrFctn.fnumsreal[ihist]);
334 fnumsreal[ihist] = 0;
335 if (aCorrFctn.fnumsimag[ihist])
336 fnumsimag[ihist] = new TH1D(*aCorrFctn.fnumsimag[ihist]);
338 fnumsimag[ihist] = 0;
339 if (aCorrFctn.fdensreal[ihist])
340 fdensreal[ihist] = new TH1D(*aCorrFctn.fdensreal[ihist]);
342 fdensreal[ihist] = 0;
343 if (aCorrFctn.fdensimag[ihist])
344 fdensimag[ihist] = new TH1D(*aCorrFctn.fdensimag[ihist]);
346 fdensimag[ihist] = 0;
349 if (aCorrFctn.fbinctn)
350 fbinctn = new TH1D(*aCorrFctn.fbinctn);
353 if (aCorrFctn.fbinctd)
354 fbinctd = new TH1D(*aCorrFctn.fbinctd);
358 fYlmBuffer = (complex<double> *) malloc(sizeof(complex<double>) * fMaxJM);
360 // Covariance matrices
361 fcovmnum = (double *) malloc(sizeof(double) * fMaxJM * fMaxJM * 4 * ibin);
362 fcovmden = (double *) malloc(sizeof(double) * fMaxJM * fMaxJM * 4 * ibin);
364 for (int iter=0; iter<fMaxJM * fMaxJM * 4 * ibin; iter++) {
365 fcovmnum[iter] = aCorrFctn.fcovmnum[iter];
366 fcovmden[iter] = aCorrFctn.fcovmden[iter];
369 if (aCorrFctn.fcovnum)
370 fcovnum = new TH3D(*aCorrFctn.fcovnum);
373 if (aCorrFctn.fcovden)
374 fcovden = new TH3D(*aCorrFctn.fcovden);
378 fSout = aCorrFctn.fSout;
379 fSside = aCorrFctn.fSside;
380 fSlong = aCorrFctn.fSlong;
382 if (aCorrFctn.fPairCut)
383 fPairCut = aCorrFctn.fPairCut;
385 fUseLCMS = aCorrFctn.fUseLCMS;
390 AliFemtoCorrFctnDirectYlm::~AliFemtoCorrFctnDirectYlm()
393 for (int ihist=0; ihist<fMaxJM; ihist++) {
394 delete fnumsreal[ihist];
395 delete fnumsimag[ihist];
396 delete fdensreal[ihist];
397 delete fdensimag[ihist];
423 if (fcovnum) delete fcovnum;
424 if (fcovden) delete fcovden;
426 if (fPairCut) delete fPairCut;
429 double AliFemtoCorrFctnDirectYlm::ClebschGordan(double aJot1, double aEm1, double aJot2, double aEm2, double aJot, double aEm)
431 // Calculate Clebsh-Gordan coefficient
437 maxt = lrint(aJot1 + aJot2 - aJot);
439 if (lrint(aJot1 - aEm1) < maxt) maxt = lrint(aJot1 - aEm1);
440 if (lrint(aJot2 + aEm2) < maxt) maxt = lrint(aJot2 + aEm2);
441 if (lrint(-(aJot-aJot2+aEm1)) > mint) mint = lrint(-(aJot-aJot2+aEm1));
442 if (lrint(-(aJot-aJot1-aEm2)) > mint) mint = lrint(-(aJot-aJot1-aEm2));
444 for (titer = mint; titer<=maxt; titer ++)
446 coef = TMath::Power(-1, titer);
447 coef *= TMath::Sqrt((2*aJot+1)*
448 factorials[lrint(aJot1+aEm1)] *
449 factorials[lrint(aJot1-aEm1)] *
450 factorials[lrint(aJot2+aEm2)] *
451 factorials[lrint(aJot2-aEm2)] *
452 factorials[lrint(aJot+aEm)] *
453 factorials[lrint(aJot-aEm)]);
454 coef /= (factorials[titer] *
455 factorials[lrint(aJot1+aJot2-aJot-titer)] *
456 factorials[lrint(aJot1-aEm1-titer)] *
457 factorials[lrint(aJot2+aEm2-titer)] *
458 factorials[lrint(aJot-aJot2+aEm1+titer)] *
459 factorials[lrint(aJot-aJot1-aEm2+titer)]);
464 cgc *= DeltaJ(aJot1, aJot2, aJot);
469 double AliFemtoCorrFctnDirectYlm::DeltaJ(double aJot1, double aJot2, double aJot)
471 // Calculate J for the Clebsh-Gordan coefficient
472 if ((aJot1+aJot2-aJot) < 0) {
473 // cout << "J1+J2-J3 < 0 !!!" << " " << aJot1 << " " << aJot2 << " " << aJot << endl;
476 if ((aJot1-aJot2+aJot) < 0) {
477 // cout << "J1-J2+J3 < 0 !!!" << " " << aJot1 << " " << aJot2 << " " << aJot << endl;
480 if ((-aJot1+aJot2+aJot) < 0) {
481 // cout << "-J1+J2+J3 < 0 !!!" << " " << aJot1 << " " << aJot2 << " " << aJot << endl;
484 if ((aJot1+aJot2+aJot+1) < 0) {
485 // cout << "J1+J2+J3+1 < 0 !!!" << " " << aJot1 << " " << aJot2 << " " << aJot << endl;
488 double res = TMath::Sqrt(1.0 *
489 factorials[lrint(aJot1+aJot2-aJot)] *
490 factorials[lrint(aJot1-aJot2+aJot)] *
491 factorials[lrint(-aJot1+aJot2+aJot)] /
492 factorials[lrint(aJot1+aJot2+aJot+1)]);
497 double AliFemtoCorrFctnDirectYlm::WignerSymbol(double aJot1, double aEm1, double aJot2, double aEm2, double aJot, double aEm)
500 if (lrint(aEm1+aEm2+aEm) != 0.0)
502 double cge = ClebschGordan(aJot1, aEm1, aJot2, aEm2, aJot, -aEm);
503 if (lrint(abs(aJot1 - aJot2 - aEm)) % 2)
505 cge /= sqrt(2*aJot + 1);
507 if (cge == -0.0) cge = 0.0;
513 void AliFemtoCorrFctnDirectYlm::GetMtilde(complex<double> *aMat, double *aMTilde)
515 // Create the Mtilde for a given q bin
524 complex<double> mcomp;
526 for (int izero = 0; izero<GetMaxJM(); izero++) {
527 GetElEmForIndex(izero, &lzero, &mzero);
528 GetElEmForIndex(izero, &lzeroi, &mzeroi);
529 for (int ibis = 0; ibis<GetMaxJM(); ibis++) {
530 GetElEmForIndex(ibis, &lbis, &mbis);
531 GetElEmForIndex(ibis, &lbisi, &mbisi);
532 complex<double> val = complex<double>(0.0, 0.0);
533 for (int iprim = 0; iprim<GetMaxJM(); iprim++) {
535 GetElEmForIndex(iprim, &lprim, &mprim);
536 GetElEmForIndex(iprim, &lprimi, &mprimi);
538 if (abs(mzeroi) % 2) mcomp = complex<double>(-1.0, 0.0); // (-1)^m
539 else mcomp = complex<double>(1.0, 0.0);
541 mcomp *= sqrt((2*lzero+1)*(2*lprim+1)*(2*lbis+1)); // P1
542 mcomp *= WignerSymbol(lzero, 0, lprim, 0, lbis, 0); // W1
543 mcomp *= WignerSymbol(lzero, -mzero, lprim, mprim, lbis, mbis); // W2
544 mcomp *= aMat[iprim];
547 aMTilde[(izero*2)*(2*GetMaxJM()) + (ibis*2)] = real(val);
548 aMTilde[(izero*2+1)*(2*GetMaxJM()) + (ibis*2)] = imag(val);
549 if (imag(val) != 0.0)
550 aMTilde[(izero*2)*(2*GetMaxJM()) + (ibis*2+1)] = -imag(val);
552 aMTilde[(izero*2)*(2*GetMaxJM()) + (ibis*2+1)] = 0.0;
553 aMTilde[(izero*2+1)*(2*GetMaxJM()) + (ibis*2+1)] = real(val);
559 int AliFemtoCorrFctnDirectYlm::GetMaxJM() const
562 void AliFemtoCorrFctnDirectYlm::GetElEmForIndex(int aIndex, double *aEl, double *aEm) const
564 // Get l,m for a given index
569 void AliFemtoCorrFctnDirectYlm::GetElEmForIndex(int aIndex, int *aEl, int *aEm) const
571 // Get l,m for a given index
572 *aEl = felsi[aIndex];
573 *aEm = femsi[aIndex];
576 int AliFemtoCorrFctnDirectYlm::GetBin(int qbin, int ilmzero, int zeroimag, int ilmprim, int primimag)
578 return (qbin*GetMaxJM()*GetMaxJM()*4 +
579 (ilmprim*2 + primimag) * GetMaxJM()*2 +
580 ilmzero*2 + zeroimag);
583 void AliFemtoCorrFctnDirectYlm::AddRealPair(double qout, double qside, double qlong, double weight)
586 double kv = sqrt(qout*qout + qside*qside + qlong*qlong);
587 int nqbin = fbinctn->GetXaxis()->FindFixBin(kv) - 1;
589 // Use saved ylm values for same qout, qside, qlong
590 if ((qout != fSout) || (qside != fSside) || (qlong != fSlong)) {
591 AliFemtoYlm::YlmUpToL(fMaxL, qout, qside, qlong, fYlmBuffer);
592 fSout = qout; fSside = qside; fSlong = qlong;
594 for (int ilm=0; ilm<GetMaxJM(); ilm++) {
595 // fYlmBuffer[ilm] = AliFemtoYlm::Ylm(elsi[ilm], emsi[ilm], qout, qside, qlong);
597 fnumsreal[ilm]->Fill(kv, real(fYlmBuffer[ilm])*weight);
598 fnumsimag[ilm]->Fill(kv, -imag(fYlmBuffer[ilm])*weight);
600 fbinctn->Fill(kv, 1.0);
603 // Fill in the error matrix
604 // int tabshift = nqbin*GetMaxJM()*GetMaxJM()*4;
605 if (nqbin < fbinctn->GetNbinsX())
606 for (int ilmzero=0; ilmzero<GetMaxJM(); ilmzero++)
607 for (int ilmprim=0; ilmprim<GetMaxJM(); ilmprim++) {
608 fcovmnum[GetBin(nqbin, ilmzero, 0, ilmprim, 0)] += real(fYlmBuffer[ilmzero])*real(fYlmBuffer[ilmprim])*weight*weight;
609 fcovmnum[GetBin(nqbin, ilmzero, 0, ilmprim, 1)] += real(fYlmBuffer[ilmzero])*-imag(fYlmBuffer[ilmprim])*weight*weight;
610 fcovmnum[GetBin(nqbin, ilmzero, 1, ilmprim, 0)] += -imag(fYlmBuffer[ilmzero])*real(fYlmBuffer[ilmprim])*weight*weight;
611 fcovmnum[GetBin(nqbin, ilmzero, 1, ilmprim, 1)] += -imag(fYlmBuffer[ilmzero])*-imag(fYlmBuffer[ilmprim])*weight*weight;
617 void AliFemtoCorrFctnDirectYlm::AddMixedPair(double qout, double qside, double qlong, double weight)
620 double kv = sqrt(qout*qout + qside*qside + qlong*qlong);
622 // Use saved ylm values for same qout, qside, qlong
623 if ((qout != fSout) || (qside != fSside) || (qlong != fSlong)) {
624 AliFemtoYlm::YlmUpToL(fMaxL, qout, qside, qlong, fYlmBuffer);
625 fSout = qout; fSside = qside; fSlong = qlong;
627 for (int ilm=0; ilm<GetMaxJM(); ilm++) {
628 // fYlmBuffer[ilm] = AliFemtoYlm::Ylm(elsi[ilm], emsi[ilm], qout, qside, qlong);
630 fdensreal[ilm]->Fill(kv, real(fYlmBuffer[ilm])*weight);
631 fdensimag[ilm]->Fill(kv, -imag(fYlmBuffer[ilm])*weight);
633 fbinctd->Fill(kv, 1.0);
636 // Fill in the error matrix
637 int nqbin = fbinctn->GetXaxis()->FindFixBin(kv) - 1;
638 // int tabshift = nqbin*GetMaxJM()*GetMaxJM()*4;
639 if (nqbin < fbinctn->GetNbinsX())
640 for (int ilmzero=0; ilmzero<GetMaxJM(); ilmzero++)
641 for (int ilmprim=0; ilmprim<GetMaxJM(); ilmprim++) {
642 fcovmden[GetBin(nqbin, ilmzero, 0, ilmprim, 0)] += real(fYlmBuffer[ilmzero])*real(fYlmBuffer[ilmprim]);
643 fcovmden[GetBin(nqbin, ilmzero, 0, ilmprim, 1)] += real(fYlmBuffer[ilmzero])*-imag(fYlmBuffer[ilmprim]);
644 fcovmden[GetBin(nqbin, ilmzero, 1, ilmprim, 0)] += -imag(fYlmBuffer[ilmzero])*real(fYlmBuffer[ilmprim]);
645 fcovmden[GetBin(nqbin, ilmzero, 1, ilmprim, 1)] += -imag(fYlmBuffer[ilmzero])*-imag(fYlmBuffer[ilmprim]);
650 void AliFemtoCorrFctnDirectYlm::AddRealPair(double *qvec, double weight) {
651 AddRealPair(qvec[0], qvec[1], qvec[2], weight);
654 void AliFemtoCorrFctnDirectYlm::AddMixedPair(double *qvec, double weight) {
655 AddMixedPair(qvec[0], qvec[1], qvec[2], weight);
658 void AliFemtoCorrFctnDirectYlm::Finish()
663 void AliFemtoCorrFctnDirectYlm::Write()
665 // Write out output histograms
666 if ((!fcovnum) || (!fcovden))
669 for (int ilm=0; ilm<fMaxJM; ilm++) {
670 fnumsreal[ilm]->Write();
671 fdensreal[ilm]->Write();
672 fnumsimag[ilm]->Write();
673 fdensimag[ilm]->Write();
675 if (fcovnum) fcovnum->Write();
676 if (fcovden) fcovden->Write();
679 TList* AliFemtoCorrFctnDirectYlm::GetOutputList()
681 // Prepare the list of objects to be written to the output
682 TList *tOutputList = new TList();
684 for (int ilm=0; ilm<fMaxJM; ilm++) {
685 tOutputList->Add(fnumsreal[ilm]);
686 tOutputList->Add(fdensreal[ilm]);
687 tOutputList->Add(fnumsimag[ilm]);
688 tOutputList->Add(fdensimag[ilm]);
690 if (fcovnum) tOutputList->Add(fcovnum);
691 if (fcovden) tOutputList->Add(fcovden);
697 void AliFemtoCorrFctnDirectYlm::ReadFromFile(TFile *infile, const char *name, int maxl)
699 // Raad in the numerator and denominator from file
701 cout << "Cannot read function for L " << maxl << " into a container with L "<< fMaxL << endl;
704 cout << "Reading in numerators and denominators" << endl;
707 for (int ihist=0; ihist<fMaxJM; ihist++) {
708 sprintf(bufname, "NumReYlm%i%i%s", felsi[ihist], femsi[ihist]<0 ? felsi[ihist]-femsi[ihist] : femsi[ihist], name);
709 if (fnumsreal[ihist]) delete fnumsreal[ihist];
710 fnumsreal[ihist] = new TH1D(*((TH1D *) infile->Get(bufname)));
712 sprintf(bufname, "NumImYlm%i%i%s", felsi[ihist], femsi[ihist]<0 ? felsi[ihist]-femsi[ihist] : femsi[ihist], name);
713 if (fnumsimag[ihist]) delete fnumsimag[ihist];
714 fnumsimag[ihist] = new TH1D(*((TH1D *) infile->Get(bufname)));
716 sprintf(bufname, "DenReYlm%i%i%s", felsi[ihist], femsi[ihist]<0 ? felsi[ihist]-femsi[ihist] : femsi[ihist], name);
717 if (fdensreal[ihist]) delete fdensreal[ihist];
718 fdensreal[ihist] = new TH1D(*((TH1D *) infile->Get(bufname)));
720 sprintf(bufname, "DenImYlm%i%i%s", felsi[ihist], femsi[ihist]<0 ? felsi[ihist]-femsi[ihist] : femsi[ihist], name);
721 if (fdensimag[ihist]) delete fdensimag[ihist];
722 fdensimag[ihist] = new TH1D(*((TH1D *) infile->Get(bufname)));
725 if (fcovnum) delete fcovnum;
726 sprintf(bufname, "covNum%s", name);
727 fcovnum = new TH3D (*((TH3D *) infile->Get(bufname)));
729 if (fcovden) delete fcovden;
730 sprintf(bufname, "CovDen%s", name);
731 fcovden = new TH3D (*((TH3D *) infile->Get(bufname)));
733 if ((fcovnum) && (fcovden)) {
734 cout << "Unpacking covariance matrices from file " << endl;
739 cout << "Creating fake covariance matrices" << endl;
741 for (int ibin=1; ibin<=fnumsreal[0]->GetNbinsX(); ibin++) {
742 double nent = fnumsreal[0]->GetEntries();
743 double nentd = fdensreal[0]->GetEntries();
744 for (int ilmx=0; ilmx<GetMaxJM(); ilmx++) {
745 for (int ilmy=0; ilmy<GetMaxJM(); ilmy++) {
746 double t1t2rr = fnumsreal[ilmx]->GetBinContent(ibin)*fnumsreal[ilmy]->GetBinContent(ibin)/nent/nent;
747 double t1t2ri = fnumsreal[ilmx]->GetBinContent(ibin)*fnumsimag[ilmy]->GetBinContent(ibin)/nent/nent;
748 double t1t2ir = fnumsimag[ilmx]->GetBinContent(ibin)*fnumsreal[ilmy]->GetBinContent(ibin)/nent/nent;
749 double t1t2ii = fnumsimag[ilmx]->GetBinContent(ibin)*fnumsimag[ilmy]->GetBinContent(ibin)/nent/nent;
751 fcovmnum[GetBin(ibin-1, ilmx, 0, ilmy, 0)] = nent*(TMath::Power(fnumsreal[ilmx]->GetBinError(ibin)/nent,2)*(nent-1) + t1t2rr);
752 fcovmnum[GetBin(ibin-1, ilmx, 0, ilmy, 1)] = nent*t1t2ri;
753 fcovmnum[GetBin(ibin-1, ilmx, 1, ilmy, 0)] = nent*t1t2ir;
754 fcovmnum[GetBin(ibin-1, ilmx, 1, ilmy, 1)] = nent*(TMath::Power(fnumsimag[ilmx]->GetBinError(ibin)/nent,2)*(nent-1) + t1t2rr);
757 fcovmnum[GetBin(ibin-1, ilmx, 0, ilmy, 0)] = nent*t1t2rr;
758 fcovmnum[GetBin(ibin-1, ilmx, 0, ilmy, 1)] = nent*t1t2ri;
759 fcovmnum[GetBin(ibin-1, ilmx, 1, ilmy, 0)] = nent*t1t2ir;
760 fcovmnum[GetBin(ibin-1, ilmx, 1, ilmy, 1)] = nent*t1t2ii;
762 t1t2rr = fdensreal[ilmx]->GetBinContent(ibin)*fdensreal[ilmy]->GetBinContent(ibin)/nentd/nentd;
763 t1t2ri = fdensreal[ilmx]->GetBinContent(ibin)*fdensimag[ilmy]->GetBinContent(ibin)/nentd/nentd;
764 t1t2ir = fdensimag[ilmx]->GetBinContent(ibin)*fdensreal[ilmy]->GetBinContent(ibin)/nentd/nentd;
765 t1t2ii = fdensimag[ilmx]->GetBinContent(ibin)*fdensimag[ilmy]->GetBinContent(ibin)/nentd/nentd;
767 fcovmden[GetBin(ibin-1, ilmx, 0, ilmy, 0)] = nentd*t1t2rr;
768 fcovmden[GetBin(ibin-1, ilmx, 0, ilmy, 1)] = nentd*t1t2ri;
769 fcovmden[GetBin(ibin-1, ilmx, 1, ilmy, 0)] = nentd*t1t2ir;
770 fcovmden[GetBin(ibin-1, ilmx, 1, ilmy, 1)] = nentd*t1t2ii;
776 // Recalculating the correlation functions
780 int AliFemtoCorrFctnDirectYlm::PackYlmVector(const double *invec, double *outvec)
782 // Pack a vector in l,m into an array using
783 // only independent components
786 for (int ilm=0; ilm<GetMaxJM(); ilm++) {
787 GetElEmForIndex(ilm, &el, &em);
788 outvec[ioutcount++] = invec[ilm*2];
791 outvec[ioutcount++] = invec[ilm*2 + 1];
797 int AliFemtoCorrFctnDirectYlm::PackYlmMatrix(const double *inmat, double *outmat)
799 // Pack a matrix in l,m x l,m into an array using
800 // only independent components
807 for (int ilm=0; ilm<GetMaxJM(); ilm++) {
808 GetElEmForIndex(ilm, &elz, &emz);
810 if (emz == 0) continue;
814 for (int ilmz=0; ilmz<GetMaxJM(); ilmz++) {
815 GetElEmForIndex(ilmz, &elz, &emz);
817 for (int ilmp=0; ilmp<GetMaxJM(); ilmp++) {
818 GetElEmForIndex(ilmp, &elp, &emp);
819 outmat[ioutcountz*finalsize + ioutcountp] = inmat[GetBin(0, ilmz, 0, ilmp, 0)];
821 if (emp == 0) continue;
822 outmat[ioutcountz*finalsize + ioutcountp] = inmat[GetBin(0, ilmz, 0, ilmp, 1)];
827 if (emz == 0) continue;
829 for (int ilmp=0; ilmp<GetMaxJM(); ilmp++) {
830 GetElEmForIndex(ilmp, &elp, &emp);
831 outmat[ioutcountz*finalsize + ioutcountp] = inmat[GetBin(0, ilmz, 1, ilmp, 0)];
833 if (emp == 0) continue;
834 outmat[ioutcountz*finalsize + ioutcountp] = inmat[GetBin(0, ilmz, 1, ilmp, 1)];
843 void AliFemtoCorrFctnDirectYlm::PackCovariances()
845 // Migrate the covariance matrix into a 3D histogram for storage
847 sprintf(bufname, "CovNum%s", fnumsreal[0]->GetName()+10);
849 if (fcovnum) delete fcovnum;
850 fcovnum = new TH3D(bufname,bufname,
851 fnumsreal[0]->GetNbinsX(), fnumsreal[0]->GetXaxis()->GetXmin(), fnumsreal[0]->GetXaxis()->GetXmax(),
852 GetMaxJM()*2, -0.5, GetMaxJM()*2 - 0.5,
853 GetMaxJM()*2, -0.5, GetMaxJM()*2 - 0.5);
855 for (int ibin=1; ibin<=fcovnum->GetNbinsX(); ibin++)
856 for (int ilmz=0; ilmz<GetMaxJM()*2; ilmz++)
857 for (int ilmp=0; ilmp<GetMaxJM()*2; ilmp++)
858 fcovnum->SetBinContent(ibin, ilmz+1, ilmp+1, fcovmnum[GetBin(ibin-1, ilmz/2, ilmz%2, ilmp/2, ilmp%2)]);
860 if (fcovden) delete fcovden;
861 sprintf(bufname, "CovDen%s", fnumsreal[0]->GetName()+10);
862 fcovden = new TH3D(bufname,bufname,
863 fdensreal[0]->GetNbinsX(), fdensreal[0]->GetXaxis()->GetXmin(), fdensreal[0]->GetXaxis()->GetXmax(),
864 GetMaxJM()*2, -0.5, GetMaxJM()*2 - 0.5,
865 GetMaxJM()*2, -0.5, GetMaxJM()*2 - 0.5);
867 for (int ibin=1; ibin<=fcovden->GetNbinsX(); ibin++)
868 for (int ilmz=0; ilmz<GetMaxJM()*2; ilmz++)
869 for (int ilmp=0; ilmp<GetMaxJM()*2; ilmp++)
870 fcovden->SetBinContent(ibin, ilmz+1, ilmp+1, fcovmden[GetBin(ibin-1, ilmz/2, ilmz%2, ilmp/2, ilmp%2)]);
874 void AliFemtoCorrFctnDirectYlm::UnpackCovariances()
876 // Extract the covariance matrices from storage
878 for (int ibin=1; ibin<=fcovnum->GetNbinsX(); ibin++)
879 for (int ilmz=0; ilmz<GetMaxJM()*2; ilmz++)
880 for (int ilmp=0; ilmp<GetMaxJM()*2; ilmp++)
881 fcovmnum[GetBin(ibin-1, ilmz/2, ilmz%2, ilmp/2, ilmp%2)] = fcovnum->GetBinContent(ibin, ilmz+1, ilmp+1);
885 for (int ibin=1; ibin<=fcovden->GetNbinsX(); ibin++)
886 for (int ilmz=0; ilmz<GetMaxJM()*2; ilmz++)
887 for (int ilmp=0; ilmp<GetMaxJM()*2; ilmp++)
888 fcovmden[GetBin(ibin-1, ilmz/2, ilmz%2, ilmp/2, ilmp%2)] = fcovden->GetBinContent(ibin, ilmz+1, ilmp+1);
892 int AliFemtoCorrFctnDirectYlm::GetIndexForLM(int el, int em) const
894 // Get array index for a given l,m
895 for (int iter=0; iter<fMaxJM; iter++)
896 if ((el == felsi[iter]) && (em == femsi[iter]))
901 TH1D *AliFemtoCorrFctnDirectYlm::GetNumRealHist(int el, int em)
903 // Get numerator hist for a given l,m
904 if (GetIndexForLM(el, em)>=0)
905 return fnumsreal[GetIndexForLM(el, em)];
909 TH1D *AliFemtoCorrFctnDirectYlm::GetNumImagHist(int el, int em)
911 // Get numerator hist for a given l,m
912 if (GetIndexForLM(el, em)>=0)
913 return fnumsimag[GetIndexForLM(el, em)];
918 TH1D *AliFemtoCorrFctnDirectYlm::GetDenRealHist(int el, int em)
920 // Get denominator hist for a given l,m
921 if (GetIndexForLM(el, em)>=0)
922 return fdensreal[GetIndexForLM(el, em)];
926 TH1D *AliFemtoCorrFctnDirectYlm::GetDenImagHist(int el, int em)
928 // Get denominator hist for a given l,m
929 if (GetIndexForLM(el, em)>=0)
930 return fdensimag[GetIndexForLM(el, em)];
935 AliFemtoString AliFemtoCorrFctnDirectYlm::Report()
937 return "AliFemtoCorrFctnDirectYlm::Finish";
940 void AliFemtoCorrFctnDirectYlm::AddRealPair(AliFemtoPair* aPair)
942 // Fill in the numerator
944 if (!fPairCut->Pass(aPair)) return;
947 AddRealPair(aPair->QOutCMS(), aPair->QSideCMS(), aPair->QLongCMS(), 1.0);
949 AddRealPair(aPair->KOut(), aPair->KSide(), aPair->KLong(), 1.0);
952 void AliFemtoCorrFctnDirectYlm::AddMixedPair(AliFemtoPair* aPair)
954 // Fill in the denominator
956 if (!fPairCut->Pass(aPair)) return;
959 AddMixedPair(aPair->QOutCMS(), aPair->QSideCMS(), aPair->QLongCMS(), 1.0);
961 AddMixedPair(aPair->KOut(), aPair->KSide(), aPair->KLong(), 1.0);
964 void AliFemtoCorrFctnDirectYlm::SetUseLCMS(int aUseLCMS)
969 int AliFemtoCorrFctnDirectYlm::GetUseLCMS()