1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //----------------------------------------------------------------------------
19 // Implementation of the class to calculate the parton energy loss
20 // Based on the "BDMPS" quenching weights by C.A.Salgado and U.A.Wiedemann
23 // C.A.Salgado and U.A.Wiedemann, Phys.Rev.D68 (2003) 014008 [hep-ph/0302184]
24 // A.Dainese, Eur.Phys.J.C, in press, [nucl-ex/0312005]
26 // Origin: C. Loizides constantinos.loizides@cern.ch
27 // A. Dainese andrea.dainese@pd.infn.it
28 //----------------------------------------------------------------------------
30 #include <Riostream.h>
38 #include "AliQuenchingWeights.h"
40 ClassImp(AliQuenchingWeights)
42 // conversion from fm to GeV^-1: 1 fm = fmGeV GeV^-1
43 const Double_t AliQuenchingWeights::gkConvFmToInvGeV = 1./0.197;
46 const Double_t AliQuenchingWeights::gkRMax = 40000.;
48 // counter for histogram labels
49 Int_t AliQuenchingWeights::gCounter = 0;
51 AliQuenchingWeights::AliQuenchingWeights()
62 fInstanceNumber=gCounter++;
65 AliQuenchingWeights::AliQuenchingWeights(const AliQuenchingWeights& a)
71 fMultSoft=a.GetMultSoft();;
73 fQTransport=a.GetQTransport();
74 fECMethod=(kECMethod)a.GetECMethod();
75 fLengthMax=a.GetLengthMax();
76 fInstanceNumber=gCounter++;
77 //Missing in the class is the pathname
78 //to the tables, can be added if needed
81 AliQuenchingWeights::~AliQuenchingWeights()
86 void AliQuenchingWeights::Reset()
89 for(Int_t l=0;l<fLengthMaxOld;l++){
98 void AliQuenchingWeights::SetECMethod(kECMethod type)
101 if(fECMethod==kDefault)
102 Info("SetECMethod","Energy Constraint Method set to DEFAULT:\nIf (sampled energy loss > parton energy) then sampled energy loss = parton energy.");
104 Info("SetECMethod","Energy Constraint Method set to REWEIGHT:\nRequire sampled energy loss <= parton energy.");
107 Int_t AliQuenchingWeights::InitMult(const Char_t *contall,const Char_t *discall)
109 // read in tables for multiple scattering approximation
110 // path to continuum and to discrete part
112 fTablesLoaded = kFALSE;
116 sprintf(fname,"%s",gSystem->ExpandPathName(contall));
117 //PH ifstream fincont(fname);
118 fstream fincont(fname,ios::in);
119 #if defined(__HP_aCC) || defined(__DECCXX)
120 if(!fincont.rdbuf()->is_open()) return -1;
122 if(!fincont.is_open()) return -1;
126 while(fincont>>fxx[nn]>>fcaq[0][nn]>>fcaq[1][nn]>>fcaq[2][nn]>>fcaq[3][nn]>>
127 fcaq[4][nn]>>fcaq[5][nn]>>fcaq[6][nn]>>fcaq[7][nn]>>fcaq[8][nn]>>
128 fcaq[9][nn]>>fcaq[10][nn]>>fcaq[11][nn]>>fcaq[12][nn]>>
130 fcaq[14][nn]>>fcaq[15][nn]>>fcaq[16][nn]>>fcaq[17][nn]>>
132 fcaq[19][nn]>>fcaq[20][nn]>>fcaq[21][nn]>>fcaq[22][nn]>>
134 fcaq[24][nn]>>fcaq[25][nn]>>fcaq[26][nn]>>fcaq[27][nn]>>
143 while(fincont>>fxxg[nn]>>fcag[0][nn]>>fcag[1][nn]>>fcag[2][nn]>>fcag[3][nn]>>
144 fcag[4][nn]>>fcag[5][nn]>>fcag[6][nn]>>fcag[7][nn]>>fcag[8][nn]>>
145 fcag[9][nn]>>fcag[10][nn]>>fcag[11][nn]>>fcag[12][nn]>>
147 fcag[14][nn]>>fcag[15][nn]>>fcag[16][nn]>>fcag[17][nn]>>
149 fcag[19][nn]>>fcag[20][nn]>>fcag[21][nn]>>fcag[22][nn]>>
151 fcag[24][nn]>>fcag[25][nn]>>fcag[26][nn]>>fcag[27][nn]>>
159 sprintf(fname,"%s",gSystem->ExpandPathName(discall));
160 //PH ifstream findisc(fname);
161 fstream findisc(fname,ios::in);
162 #if defined(__HP_aCC) || defined(__DECCXX)
163 if(!findisc.rdbuf()->is_open()) return -1;
165 if(!findisc.is_open()) return -1;
169 while(findisc>>frrr[nn]>>fdaq[nn]) {
174 while(findisc>>frrrg[nn]>>fdag[nn]) {
179 fTablesLoaded = kTRUE;
184 C***************************************************************************
185 C Quenching Weights for Multiple Soft Scattering
190 C Carlos A. Salgado and Urs A. Wiedemann, hep-ph/0302184.
192 C Carlos A. Salgado and Urs A. Wiedemann Phys.Rev.Lett.89:092303,2002.
195 C This package contains quenching weights for gluon radiation in the
196 C multiple soft scattering approximation.
198 C swqmult returns the quenching weight for a quark (ipart=1) or
199 C a gluon (ipart=2) traversing a medium with transport coeficient q and
200 C length L. The input values are rrrr=0.5*q*L^3 and xxxx=w/wc, where
201 C wc=0.5*q*L^2 and w is the energy radiated. The output values are
202 C the continuous and discrete (prefactor of the delta function) parts
203 C of the quenching weights.
205 C In order to use this routine, the files cont.all and disc.all need to be
206 C in the working directory.
208 C An initialization of the tables is needed by doing call initmult before
211 C Please, send us any comment:
213 C urs.wiedemann@cern.ch
214 C carlos.salgado@cern.ch
217 C-------------------------------------------------------------------
219 SUBROUTINE swqmult(ipart,rrrr,xxxx,continuous,discrete)
221 REAL*8 xx(400), daq(30), caq(30,261), rrr(30)
222 COMMON /dataqua/ xx, daq, caq, rrr
224 REAL*8 xxg(400), dag(30), cag(30,261), rrrg(30)
225 COMMON /dataglu/ xxg, dag, cag, rrrg
227 REAL*8 rrrr,xxxx, continuous, discrete
229 INTEGER nrlow, nrhigh, nxlow, nxhigh
230 REAL*8 rrhigh, rrlow, rfraclow, rfrachigh
231 REAL*8 xfraclow, xfrachigh
237 nxlow = int(xxin/0.005) + 1
239 xfraclow = (xx(nxhigh)-xxin)/0.005
240 xfrachigh = (xxin - xx(nxlow))/0.005
243 if (rrin.lt.rrr(nr)) then
255 rfraclow = (rrhigh-rrin)/(rrhigh-rrlow)
256 rfrachigh = (rrin-rrlow)/(rrhigh-rrlow)
259 clow = xfraclow*caq(nrlow,nxlow)+xfrachigh*caq(nrlow,nxhigh)
260 chigh = xfraclow*caq(nrhigh,nxlow)+xfrachigh*caq(nrhigh,nxhigh)
262 clow = xfraclow*cag(nrlow,nxlow)+xfrachigh*cag(nrlow,nxhigh)
263 chigh = xfraclow*cag(nrhigh,nxlow)+xfrachigh*cag(nrhigh,nxhigh)
266 continuous = rfraclow*clow + rfrachigh*chigh
269 discrete = rfraclow*daq(nrlow) + rfrachigh*daq(nrhigh)
271 discrete = rfraclow*dag(nrlow) + rfrachigh*dag(nrhigh)
277 REAL*8 xxq(400), daq(30), caq(30,261), rrr(30)
278 COMMON /dataqua/ xxq, daq, caq, rrr
280 REAL*8 xxg(400), dag(30), cag(30,261), rrrg(30)
281 COMMON /dataglu/ xxg, dag, cag, rrrg
283 OPEN(UNIT=20,FILE='cont.all',STATUS='OLD',ERR=90)
285 read (20,*) xxq(nn), caq(1,nn), caq(2,nn), caq(3,nn),
286 + caq(4,nn), caq(5,nn), caq(6,nn), caq(7,nn), caq(8,nn),
287 + caq(9,nn), caq(10,nn), caq(11,nn), caq(12,nn),
289 + caq(14,nn), caq(15,nn), caq(16,nn), caq(17,nn),
291 + caq(19,nn), caq(20,nn), caq(21,nn), caq(22,nn),
293 + caq(24,nn), caq(25,nn), caq(26,nn), caq(27,nn),
295 + caq(29,nn), caq(30,nn)
298 read (20,*) xxg(nn), cag(1,nn), cag(2,nn), cag(3,nn),
299 + cag(4,nn), cag(5,nn), cag(6,nn), cag(7,nn), cag(8,nn),
300 + cag(9,nn), cag(10,nn), cag(11,nn), cag(12,nn),
302 + cag(14,nn), cag(15,nn), cag(16,nn), cag(17,nn),
304 + cag(19,nn), cag(20,nn), cag(21,nn), cag(22,nn),
306 + cag(24,nn), cag(25,nn), cag(26,nn), cag(27,nn),
308 + cag(29,nn), cag(30,nn)
312 OPEN(UNIT=21,FILE='disc.all',STATUS='OLD',ERR=91)
314 read (21,*) rrr(nn), daq(nn)
317 read (21,*) rrrg(nn), dag(nn)
322 90 PRINT*, 'input - output error'
323 91 PRINT*, 'input - output error #2'
328 =======================================================================
330 Adapted to ROOT macro by A. Dainese - 13/07/2003
331 ported to class by C. Loizides - 12/02/2004
334 Int_t AliQuenchingWeights::CalcMult(Int_t ipart, Double_t rrrr,Double_t xxxx,
335 Double_t &continuous,Double_t &discrete) const
337 // Calculate Multiple Scattering approx.
338 // weights for given parton type,
339 // rrrr=0.5*q*L^3 and xxxx=w/wc, wc=0.5*q*L^2
341 // read-in data before first call
343 Error("CalcMult","Tables are not loaded.");
347 Error("CalcMult","Tables are not loaded for Multiple Scattering.");
351 Double_t rrin = rrrr;
352 Double_t xxin = xxxx;
354 Int_t nxlow = (Int_t)(xxin/0.01) + 1;
355 Int_t nxhigh = nxlow + 1;
356 Double_t xfraclow = (fxx[nxhigh-1]-xxin)/0.01;
357 Double_t xfrachigh = (xxin - fxx[nxlow-1])/0.01;
360 if(rrin<=frrr[29]) rrin = 1.05*frrr[29]; // AD
361 if(rrin>=frrr[0]) rrin = 0.95*frrr[0]; // AD
363 Int_t nrlow=0,nrhigh=0;
364 Double_t rrhigh=0,rrlow=0;
365 for(Int_t nr=1; nr<=30; nr++) {
366 if(rrin<frrr[nr-1]) {
369 rrhigh = frrr[nr-1-1];
379 Double_t rfraclow = (rrhigh-rrin)/(rrhigh-rrlow);
380 Double_t rfrachigh = (rrin-rrlow)/(rrhigh-rrlow);
382 //printf("R = %f,\nRlow = %f, Rhigh = %f,\nRfraclow = %f, Rfrachigh = %f\n",rrin,rrlow,rrhigh,rfraclow,rfrachigh); // AD
384 Double_t clow=0,chigh=0;
386 clow = xfraclow*fcaq[nrlow-1][nxlow-1]+xfrachigh*fcaq[nrlow-1][nxhigh-1];
387 chigh = xfraclow*fcaq[nrhigh-1][nxlow-1]+xfrachigh*fcaq[nrhigh-1][nxhigh-1];
389 clow = xfraclow*fcag[nrlow-1][nxlow-1]+xfrachigh*fcag[nrlow-1][nxhigh-1];
390 chigh = xfraclow*fcag[nrhigh-1][nxlow-1]+xfrachigh*fcag[nrhigh-1][nxhigh-1];
393 continuous = rfraclow*clow + rfrachigh*chigh;
394 //printf("rfraclow %f, clow %f, rfrachigh %f, chigh %f,\n continuous %f\n",
395 // rfraclow,clow,rfrachigh,chigh,continuous);
398 discrete = rfraclow*fdaq[nrlow-1] + rfrachigh*fdaq[nrhigh-1];
400 discrete = rfraclow*fdag[nrlow-1] + rfrachigh*fdag[nrhigh-1];
406 Int_t AliQuenchingWeights::InitSingleHard(const Char_t *contall,const Char_t *discall)
408 // read in tables for Single Hard Approx.
409 // path to continuum and to discrete part
411 fTablesLoaded = kFALSE;
415 sprintf(fname,"%s",gSystem->ExpandPathName(contall));
416 //PH ifstream fincont(fname);
417 fstream fincont(fname,ios::in);
418 #if defined(__HP_aCC) || defined(__DECCXX)
419 if(!fincont.rdbuf()->is_open()) return -1;
421 if(!fincont.is_open()) return -1;
425 while(fincont>>fxx[nn]>>fcaq[0][nn]>>fcaq[1][nn]>>fcaq[2][nn]>>fcaq[3][nn]>>
426 fcaq[4][nn]>>fcaq[5][nn]>>fcaq[6][nn]>>fcaq[7][nn]>>fcaq[8][nn]>>
427 fcaq[9][nn]>>fcaq[10][nn]>>fcaq[11][nn]>>fcaq[12][nn]>>
429 fcaq[14][nn]>>fcaq[15][nn]>>fcaq[16][nn]>>fcaq[17][nn]>>
431 fcaq[19][nn]>>fcaq[20][nn]>>fcaq[21][nn]>>fcaq[22][nn]>>
433 fcaq[24][nn]>>fcaq[25][nn]>>fcaq[26][nn]>>fcaq[27][nn]>>
442 while(fincont>>fxxg[nn]>>fcag[0][nn]>>fcag[1][nn]>>fcag[2][nn]>>fcag[3][nn]>>
443 fcag[4][nn]>>fcag[5][nn]>>fcag[6][nn]>>fcag[7][nn]>>fcag[8][nn]>>
444 fcag[9][nn]>>fcag[10][nn]>>fcag[11][nn]>>fcag[12][nn]>>
446 fcag[14][nn]>>fcag[15][nn]>>fcag[16][nn]>>fcag[17][nn]>>
448 fcag[19][nn]>>fcag[20][nn]>>fcag[21][nn]>>fcag[22][nn]>>
450 fcag[24][nn]>>fcag[25][nn]>>fcag[26][nn]>>fcag[27][nn]>>
458 sprintf(fname,"%s",gSystem->ExpandPathName(discall));
459 //PH ifstream findisc(fname);
460 fstream findisc(fname,ios::in);
461 #if defined(__HP_aCC) || defined(__DECCXX)
462 if(!findisc.rdbuf()->is_open()) return -1;
464 if(!findisc.is_open()) return -1;
468 while(findisc>>frrr[nn]>>fdaq[nn]) {
473 while(findisc>>frrrg[nn]>>fdag[nn]) {
479 fTablesLoaded = kTRUE;
484 C***************************************************************************
485 C Quenching Weights for Single Hard Scattering
490 C Carlos A. Salgado and Urs A. Wiedemann, hep-ph/0302184.
492 C Carlos A. Salgado and Urs A. Wiedemann Phys.Rev.Lett.89:092303,2002.
495 C This package contains quenching weights for gluon radiation in the
496 C single hard scattering approximation.
498 C swqlin returns the quenching weight for a quark (ipart=1) or
499 C a gluon (ipart=2) traversing a medium with Debye screening mass mu and
500 C length L. The input values are rrrr=0.5*mu^2*L^2 and xxxx=w/wc, where
501 C wc=0.5*mu^2*L and w is the energy radiated. The output values are
502 C the continuous and discrete (prefactor of the delta function) parts
503 C of the quenching weights.
505 C In order to use this routine, the files contlin.all and disclin.all
506 C need to be in the working directory.
508 C An initialization of the tables is needed by doing call initlin before
511 C Please, send us any comment:
513 C urs.wiedemann@cern.ch
514 C carlos.salgado@cern.ch
517 C-------------------------------------------------------------------
520 SUBROUTINE swqlin(ipart,rrrr,xxxx,continuous,discrete)
522 REAL*8 xx(400), dalq(30), calq(30,261), rrr(30)
523 COMMON /datalinqua/ xx, dalq, calq, rrr
525 REAL*8 xxlg(400), dalg(30), calg(30,261), rrrlg(30)
526 COMMON /datalinglu/ xxlg, dalg, calg, rrrlg
528 REAL*8 rrrr,xxxx, continuous, discrete
530 INTEGER nrlow, nrhigh, nxlow, nxhigh
531 REAL*8 rrhigh, rrlow, rfraclow, rfrachigh
532 REAL*8 xfraclow, xfrachigh
538 nxlow = int(xxin/0.038) + 1
540 xfraclow = (xx(nxhigh)-xxin)/0.038
541 xfrachigh = (xxin - xx(nxlow))/0.038
544 if (rrin.lt.rrr(nr)) then
556 rfraclow = (rrhigh-rrin)/(rrhigh-rrlow)
557 rfrachigh = (rrin-rrlow)/(rrhigh-rrlow)
560 clow = xfraclow*calq(nrlow,nxlow)+xfrachigh*calq(nrlow,nxhigh)
561 chigh = xfraclow*calq(nrhigh,nxlow)+xfrachigh*calq(nrhigh,nxhigh)
563 clow = xfraclow*calg(nrlow,nxlow)+xfrachigh*calg(nrlow,nxhigh)
564 chigh = xfraclow*calg(nrhigh,nxlow)+xfrachigh*calg(nrhigh,nxhigh)
567 continuous = rfraclow*clow + rfrachigh*chigh
570 discrete = rfraclow*dalq(nrlow) + rfrachigh*dalq(nrhigh)
572 discrete = rfraclow*dalg(nrlow) + rfrachigh*dalg(nrhigh)
578 REAL*8 xxlq(400), dalq(30), calq(30,261), rrr(30)
579 COMMON /datalinqua/ xxlq, dalq, calq, rrr
581 REAL*8 xxlg(400), dalg(30), calg(30,261), rrrlg(30)
582 COMMON /datalinglu/ xxlg, dalg, calg, rrrlg
584 OPEN(UNIT=20,FILE='contlin.all',STATUS='OLD',ERR=90)
586 read (20,*) xxlq(nn), calq(1,nn), calq(2,nn), calq(3,nn),
587 + calq(4,nn), calq(5,nn), calq(6,nn), calq(7,nn), calq(8,nn),
588 + calq(9,nn), calq(10,nn), calq(11,nn), calq(12,nn),
590 + calq(14,nn), calq(15,nn), calq(16,nn), calq(17,nn),
592 + calq(19,nn), calq(20,nn), calq(21,nn), calq(22,nn),
594 + calq(24,nn), calq(25,nn), calq(26,nn), calq(27,nn),
596 + calq(29,nn), calq(30,nn)
599 read (20,*) xxlg(nn), calg(1,nn), calg(2,nn), calg(3,nn),
600 + calg(4,nn), calg(5,nn), calg(6,nn), calg(7,nn), calg(8,nn),
601 + calg(9,nn), calg(10,nn), calg(11,nn), calg(12,nn),
603 + calg(14,nn), calg(15,nn), calg(16,nn), calg(17,nn),
605 + calg(19,nn), calg(20,nn), calg(21,nn), calg(22,nn),
607 + calg(24,nn), calg(25,nn), calg(26,nn), calg(27,nn),
609 + calg(29,nn), calg(30,nn)
613 OPEN(UNIT=21,FILE='disclin.all',STATUS='OLD',ERR=91)
615 read (21,*) rrr(nn), dalq(nn)
618 read (21,*) rrrlg(nn), dalg(nn)
623 90 PRINT*, 'input - output error'
624 91 PRINT*, 'input - output error #2'
629 =======================================================================
631 Ported to class by C. Loizides - 17/02/2004
635 Int_t AliQuenchingWeights::CalcSingleHard(Int_t ipart, Double_t rrrr,Double_t xxxx,
636 Double_t &continuous,Double_t &discrete) const
638 // calculate Single Hard approx.
639 // weights for given parton type,
640 // rrrr=0.5*mu^2*L^2 and xxxx=w/wc, wc=0.5*mu^2*L
642 // read-in data before first call
644 Error("CalcMult","Tables are not loaded.");
648 Error("CalcMult","Tables are not loaded for Single Hard Scattering.");
652 Double_t rrin = rrrr;
653 Double_t xxin = xxxx;
655 Int_t nxlow = (Int_t)(xxin/0.038) + 1;
656 Int_t nxhigh = nxlow + 1;
657 Double_t xfraclow = (fxx[nxhigh-1]-xxin)/0.038;
658 Double_t xfrachigh = (xxin - fxx[nxlow-1])/0.038;
661 if(rrin<=frrr[29]) rrin = 1.05*frrr[29]; // AD
662 if(rrin>=frrr[0]) rrin = 0.95*frrr[0]; // AD
664 Int_t nrlow=0,nrhigh=0;
665 Double_t rrhigh=0,rrlow=0;
666 for(Int_t nr=1; nr<=30; nr++) {
667 if(rrin<frrr[nr-1]) {
670 rrhigh = frrr[nr-1-1];
680 Double_t rfraclow = (rrhigh-rrin)/(rrhigh-rrlow);
681 Double_t rfrachigh = (rrin-rrlow)/(rrhigh-rrlow);
683 //printf("R = %f,\nRlow = %f, Rhigh = %f,\nRfraclow = %f, Rfrachigh = %f\n",rrin,rrlow,rrhigh,rfraclow,rfrachigh); // AD
685 Double_t clow=0,chigh=0;
687 clow = xfraclow*fcaq[nrlow-1][nxlow-1]+xfrachigh*fcaq[nrlow-1][nxhigh-1];
688 chigh = xfraclow*fcaq[nrhigh-1][nxlow-1]+xfrachigh*fcaq[nrhigh-1][nxhigh-1];
690 clow = xfraclow*fcag[nrlow-1][nxlow-1]+xfrachigh*fcag[nrlow-1][nxhigh-1];
691 chigh = xfraclow*fcag[nrhigh-1][nxlow-1]+xfrachigh*fcag[nrhigh-1][nxhigh-1];
694 continuous = rfraclow*clow + rfrachigh*chigh;
695 //printf("rfraclow %f, clow %f, rfrachigh %f, chigh %f,\n continuous %f\n",
696 // rfraclow,clow,rfrachigh,chigh,continuous);
699 discrete = rfraclow*fdaq[nrlow-1] + rfrachigh*fdaq[nrhigh-1];
701 discrete = rfraclow*fdag[nrlow-1] + rfrachigh*fdag[nrhigh-1];
707 Int_t AliQuenchingWeights::CalcMult(Int_t ipart,
708 Double_t w,Double_t qtransp,Double_t length,
709 Double_t &continuous,Double_t &discrete) const
711 Double_t wc=CalcWC(qtransp,length);
712 Double_t rrrr=CalcR(wc,length);
714 return CalcMult(ipart,rrrr,xxxx,continuous,discrete);
717 Int_t AliQuenchingWeights::CalcSingleHard(Int_t ipart,
718 Double_t w,Double_t mu,Double_t length,
719 Double_t &continuous,Double_t &discrete) const
721 Double_t wcbar=CalcWCbar(mu,length);
722 Double_t rrrr=CalcR(wcbar,length);
723 Double_t xxxx=w/wcbar;
724 return CalcSingleHard(ipart,rrrr,xxxx,continuous,discrete);
727 Double_t AliQuenchingWeights::CalcR(Double_t wc, Double_t l) const
729 Double_t R = wc*l*gkConvFmToInvGeV;
731 Warning("CalcR","Value of R = %.2f; should be less than %.2f",R,gkRMax);
737 Double_t AliQuenchingWeights::GetELossRandom(Int_t ipart, Double_t length, Double_t e) const
739 // return DeltaE for MS or SH scattering
740 // for given parton type, length and energy
741 // Dependant on ECM (energy constraint method)
742 // e is used to determine where to set bins to zero.
745 Fatal("GetELossRandom","Call SampleEnergyLoss method before!");
748 if((ipart<1) || (ipart>2)) {
749 Fatal("GetELossRandom","ipart =%d; but has to be 1 (quark) or 2 (gluon)",ipart);
753 Int_t l=(Int_t)length;
754 if((length-(Double_t)l)>0.5) l++;
756 if(l>fLengthMax) l=fLengthMax;
758 if(fECMethod==kReweight){
759 TH1F *dummy=new TH1F(*fHistos[ipart-1][l-1]);
760 dummy->SetName("dummy");
761 for(Int_t bin=dummy->FindBin(e)+1;bin<=1100;bin++){
762 dummy->SetBinContent(bin,0.);
764 dummy->Scale(1./dummy->Integral());
765 Double_t ret=dummy->GetRandom();
768 //****** !! ALTERNATIVE WAY OF DOING IT !! ***
769 //Double_t ret = 2.*e;
770 //while(ret>e) ret=fHistos[ipart-1][l-1]->GetRandom();
772 //********************************************
774 Double_t ret=fHistos[ipart-1][l-1]->GetRandom();
780 Double_t AliQuenchingWeights::CalcQuenchedEnergy(Int_t ipart, Double_t length, Double_t e) const
782 //return quenched parton energy
783 //for given parton type, length and energy
785 Double_t loss=GetELossRandom(ipart,length,e);
789 Double_t AliQuenchingWeights::GetELossRandom(Int_t ipart, TH1F *hell, Double_t e) const
792 Warning("GetELossRandom","Pointer to length distribution is NULL.");
795 Double_t ell=hell->GetRandom();
796 return GetELossRandom(ipart,ell,e);
799 Double_t AliQuenchingWeights::CalcQuenchedEnergy(Int_t ipart, TH1F *hell, Double_t e) const
801 //return quenched parton energy
802 //for given parton type, length distribution and energy
804 Double_t loss=GetELossRandom(ipart,hell,e);
808 Int_t AliQuenchingWeights::SampleEnergyLoss()
810 // Has to be called to fill the histograms
812 // For stored values fQTransport loop over
813 // particle type and length = 1 to fMaxLength (fm)
814 // to fill energy loss histos
816 // Take histogram of continuous weights
817 // Take discrete_weight
818 // If discrete_weight > 1, put all channels to 0, except channel 1
819 // Fill channel 1 with discrete_weight/(1-discrete_weight)*integral
821 // read-in data before first call
823 Error("CalcMult","Tables are not loaded.");
828 Int_t lmax=CalcLengthMax(fQTransport);
830 Info("SampleEnergyLoss","Maximum length changed from %d to %d;\nin order to have R < %.f",fLengthMax,lmax,gkRMax);
834 Warning("SampleEnergyLoss","Maximum length not checked,\nbecause SingeHard is not yet tested.");
838 fHistos=new TH1F**[2];
839 fHistos[0]=new TH1F*[fLengthMax];
840 fHistos[1]=new TH1F*[fLengthMax];
841 fLengthMaxOld=fLengthMax; //remember old value in case
842 //user wants to reset
847 medvalue=(Int_t)(fQTransport*1000.);
848 sprintf(meddesc,"MS");
850 medvalue=(Int_t)(fMu*1000.);
851 sprintf(meddesc,"SH");
854 for(Int_t ipart=1;ipart<=2;ipart++){
855 for(Int_t l=1;l<=fLengthMax;l++){
858 sprintf(hname,"hDisc-ContQW_%s_%d_%d_%d_%d",meddesc,fInstanceNumber,ipart,medvalue,l);
859 Double_t wc = CalcWC(l);
860 fHistos[ipart-1][l-1] = new TH1F(hname,hname,1100,0.,1.1*wc);
861 fHistos[ipart-1][l-1]->SetXTitle("#Delta E [GeV]");
862 fHistos[ipart-1][l-1]->SetYTitle("p(#Delta E)");
863 fHistos[ipart-1][l-1]->SetLineColor(4);
865 Double_t rrrr = CalcR(wc,l);
866 Double_t discrete=0.;
867 // loop on histogram channels
868 for(Int_t bin=1; bin<=1100; bin++) {
869 Double_t xxxx = fHistos[ipart-1][l-1]->GetBinCenter(bin)/wc;
871 CalcMult(ipart,rrrr,xxxx,continuous,discrete);
872 fHistos[ipart-1][l-1]->SetBinContent(bin,continuous);
874 // add discrete part to distribution
876 for(Int_t bin=2;bin<=1100;bin++)
877 fHistos[ipart-1][l-1]->SetBinContent(bin,0.);
879 Double_t val=discrete/(1.-discrete)*fHistos[ipart-1][l-1]->Integral(1,1100);
880 fHistos[ipart-1][l-1]->Fill(0.,val);
882 Double_t hint=fHistos[ipart-1][l-1]->Integral(1,1100);
883 fHistos[ipart-1][l-1]->Scale(1./hint);
889 const TH1F* AliQuenchingWeights::GetHisto(Int_t ipart,Int_t l) const
892 Fatal("GetELossRandom","Call SampleEnergyLoss method before!");
895 if((ipart<1) || (ipart>2)) {
896 Fatal("GetELossRandom","ipart =%d; but has to be 1 (quark) or 2 (gluon)",ipart);
901 if(l>fLengthMax) l=fLengthMax;
903 return fHistos[ipart-1][l-1];
906 TH1F* AliQuenchingWeights::ComputeQWHisto(Int_t ipart,Double_t medval,Double_t length) const
908 // ipart = 1 for quark, 2 for gluon
909 // medval a) qtransp = transport coefficient (GeV^2/fm)
910 // b) mu = Debye mass (GeV)
911 // length = path length in medium (fm)
912 // Get from SW tables:
913 // - discrete weight (probability to have NO energy loss)
914 // - continuous weight, as a function of dE
915 // compute up to max dE = 1.1*wc
916 // (as an histogram named hContQW_<ipart>_<medval*1000>_<l>
917 // and range [0,1.1*wc] (1100 channels)
922 wc=CalcWC(medval,length);
923 sprintf(meddesc,"MS");
925 wc=CalcWCbar(medval,length);
926 sprintf(meddesc,"SH");
930 sprintf(hname,"hContQWHisto_%s_%d_%d_%d",meddesc,ipart,
931 (Int_t)(medval*1000.),(Int_t)length);
933 TH1F *hist = new TH1F("hist",hname,1100,0.,1.1*wc);
934 hist->SetXTitle("#Delta E [GeV]");
935 hist->SetYTitle("p(#Delta E)");
936 hist->SetLineColor(4);
938 Double_t rrrr = CalcR(wc,length);
939 // loop on histogram channels
940 for(Int_t bin=1; bin<=1100; bin++) {
941 Double_t xxxx = hist->GetBinCenter(bin)/wc;
942 Double_t continuous,discrete;
944 if(fMultSoft) ret=CalcMult(ipart,rrrr,xxxx,continuous,discrete);
945 else ret=CalcSingleHard(ipart,rrrr,xxxx,continuous,discrete);
950 hist->SetBinContent(bin,continuous);
955 TH1F* AliQuenchingWeights::ComputeQWHistoX(Int_t ipart,Double_t medval,Double_t length) const
957 // ipart = 1 for quark, 2 for gluon
958 // medval a) qtransp = transport coefficient (GeV^2/fm)
959 // b) mu = Debye mass (GeV)
960 // length = path length in medium (fm)
961 // Get from SW tables:
962 // - discrete weight (probability to have NO energy loss)
963 // - continuous weight, as a function of dE
964 // compute up to max dE = 1.1*wc
965 // (as an histogram named hContQW_<ipart>_<medval*1000>_<l>
966 // and range [0,1.1] (1100 channels)
971 wc=CalcWC(medval,length);
972 sprintf(meddesc,"MS");
974 wc=CalcWCbar(medval,length);
975 sprintf(meddesc,"SH");
979 sprintf(hname,"hContQWHistox_%s_%d_%d_%d",meddesc,ipart,
980 (Int_t)(medval*1000.),(Int_t)length);
982 TH1F *histx = new TH1F("histx",hname,1100,0.,1.1);
983 histx->SetXTitle("x = #Delta E/#omega_{c}");
985 histx->SetYTitle("p(#Delta E/#omega_{c})");
987 histx->SetYTitle("p(#Delta E/#bar#omega_{c})");
988 histx->SetLineColor(4);
990 Double_t rrrr = CalcR(wc,length);
991 // loop on histogram channels
992 for(Int_t bin=1; bin<=1100; bin++) {
993 Double_t xxxx = histx->GetBinCenter(bin);
994 Double_t continuous,discrete;
996 if(fMultSoft) ret=CalcMult(ipart,rrrr,xxxx,continuous,discrete);
997 else ret=CalcSingleHard(ipart,rrrr,xxxx,continuous,discrete);
1002 histx->SetBinContent(bin,continuous);
1007 TH1F* AliQuenchingWeights::ComputeELossHisto(Int_t ipart,Double_t medval,Double_t l,Double_t e) const
1009 AliQuenchingWeights *dummy=new AliQuenchingWeights(*this);
1011 dummy->SetQTransport(medval);
1014 dummy->SetMu(medval);
1015 dummy->InitSingleHard();
1017 dummy->SampleEnergyLoss();
1022 sprintf(name,"Energy Loss Distribution - Quarks;E_{loss} (GeV);#");
1023 sprintf(hname,"hLossQuarks");
1025 sprintf(name,"Energy Loss Distribution - Gluons;E_{loss} (GeV);#");
1026 sprintf(hname,"hLossGluons");
1029 TH1F *h = new TH1F(hname,name,250,0,250);
1030 for(Int_t i=0;i<100000;i++){
1031 //if(i % 1000 == 0) cout << "." << flush;
1032 Double_t loss=dummy->GetELossRandom(ipart,l,e);
1042 TH1F* AliQuenchingWeights::ComputeELossHisto(Int_t ipart,Double_t medval,TH1F *hEll,Double_t e) const
1044 AliQuenchingWeights *dummy=new AliQuenchingWeights(*this);
1046 dummy->SetQTransport(medval);
1049 dummy->SetMu(medval);
1050 dummy->InitSingleHard();
1052 dummy->SampleEnergyLoss();
1057 sprintf(name,"Energy Loss Distribution - Quarks;E_{loss} (GeV);#");
1058 sprintf(hname,"hLossQuarks");
1060 sprintf(name,"Energy Loss Distribution - Gluons;E_{loss} (GeV);#");
1061 sprintf(hname,"hLossGluons");
1064 TH1F *h = new TH1F(hname,name,250,0,250);
1065 for(Int_t i=0;i<100000;i++){
1066 //if(i % 1000 == 0) cout << "." << flush;
1067 Double_t loss=dummy->GetELossRandom(ipart,hEll,e);
1077 void AliQuenchingWeights::PlotDiscreteWeights(Int_t len) const
1081 c = new TCanvas("cdiscms","Discrete Weight for Multiple Scattering",0,0,500,400);
1083 c = new TCanvas("cdiscsh","Discrete Weight for Single Hard Scattering",0,0,500,400);
1086 TH2F *hframe = new TH2F("hdisc","",2,0,5.1,2,0,1);
1087 hframe->SetStats(0);
1089 hframe->SetXTitle("#hat{q} [GeV^{2}/fm]");
1091 hframe->SetXTitle("#mu [GeV]");
1092 hframe->SetYTitle("Probability #Delta E = 0 , p_{0}");
1095 TGraph *gq=new TGraph(20);
1098 for(Double_t q=0.05;q<=5.05;q+=0.25){
1100 CalcMult(1,1.0, q, len, cont, disc);
1101 gq->SetPoint(i,q,disc);i++;
1104 for(Double_t m=0.05;m<=5.05;m+=0.25){
1106 CalcSingleHard(1,1.0, m, len, cont, disc);
1107 gq->SetPoint(i,m,disc);i++;
1110 gq->SetMarkerStyle(20);
1113 TGraph *gg=new TGraph(20);
1116 for(Double_t q=0.05;q<=5.05;q+=0.25){
1118 CalcMult(2,1.0, q, 5., cont, disc);
1119 gg->SetPoint(i,q,disc);i++;
1122 for(Double_t m=0.05;m<=5.05;m+=0.25){
1124 CalcSingleHard(2,1.0, m, 5., cont, disc);
1125 gg->SetPoint(i,m,disc);i++;
1128 gg->SetMarkerStyle(24);
1131 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1132 l1a->SetFillStyle(0);
1133 l1a->SetBorderSize(0);
1135 sprintf(label,"L = %d fm",len);
1136 l1a->AddEntry(gq,label,"");
1137 l1a->AddEntry(gq,"quark","pl");
1138 l1a->AddEntry(gg,"gluon","pl");
1144 void AliQuenchingWeights::PlotContWeights(Int_t itype,Int_t ell) const
1151 sprintf(title,"Cont. Weight for Multiple Scattering - Quarks");
1153 sprintf(title,"Cont. Weight for Multiple Scattering - Gluons");
1155 medvals[0]=4;medvals[1]=1;medvals[2]=0.5;
1156 sprintf(name,"ccont-ms-%d",itype);
1159 sprintf(title,"Cont. Weight for Single Hard Scattering - Quarks");
1161 sprintf(title,"Cont. Weight for Single Hard Scattering - Gluons");
1163 medvals[0]=2;medvals[1]=1;medvals[2]=0.5;
1164 sprintf(name,"ccont-ms-%d",itype);
1167 TCanvas *c = new TCanvas(name,title,0,0,500,400);
1169 TH1F *h1=ComputeQWHisto(itype,medvals[0],ell);
1171 h1->SetTitle(title);
1173 h1->SetLineColor(1);
1175 TH1F *h2=ComputeQWHisto(itype,medvals[1],ell);
1177 h2->SetLineColor(2);
1178 h2->DrawCopy("SAME");
1179 TH1F *h3=ComputeQWHisto(itype,medvals[2],ell);
1181 h3->SetLineColor(3);
1182 h3->DrawCopy("SAME");
1184 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1185 l1a->SetFillStyle(0);
1186 l1a->SetBorderSize(0);
1188 sprintf(label,"L = %d fm",ell);
1189 l1a->AddEntry(h1,label,"");
1191 sprintf(label,"#hat{q} = %.1f GeV^{2}/fm",medvals[0]);
1192 l1a->AddEntry(h1,label,"pl");
1193 sprintf(label,"#hat{q} = %.1f GeV^{2}/fm",medvals[1]);
1194 l1a->AddEntry(h2,label,"pl");
1195 sprintf(label,"#hat{q} = %.1f GeV^{2}/fm",medvals[2]);
1196 l1a->AddEntry(h3,label,"pl");
1198 sprintf(label,"#mu = %.1f GeV",medvals[0]);
1199 l1a->AddEntry(h1,label,"pl");
1200 sprintf(label,"#mu = %.1f GeV",medvals[1]);
1201 l1a->AddEntry(h2,label,"pl");
1202 sprintf(label,"#mu = %.1f GeV",medvals[2]);
1203 l1a->AddEntry(h3,label,"pl");
1210 void AliQuenchingWeights::PlotContWeights(Int_t itype,Double_t medval) const
1216 sprintf(title,"Cont. Weight for Multiple Scattering - Quarks");
1218 sprintf(title,"Cont. Weight for Multiple Scattering - Gluons");
1220 sprintf(name,"ccont2-ms-%d",itype);
1223 sprintf(title,"Cont. Weight for Single Hard Scattering - Quarks");
1225 sprintf(title,"Cont. Weight for Single Hard Scattering - Gluons");
1227 sprintf(name,"ccont2-sh-%d",itype);
1229 TCanvas *c = new TCanvas(name,title,0,0,500,400);
1231 TH1F *h1=ComputeQWHisto(itype,medval,8);
1233 h1->SetTitle(title);
1235 h1->SetLineColor(1);
1237 TH1F *h2=ComputeQWHisto(itype,medval,5);
1239 h2->SetLineColor(2);
1240 h2->DrawCopy("SAME");
1241 TH1F *h3=ComputeQWHisto(itype,medval,2);
1243 h3->SetLineColor(3);
1244 h3->DrawCopy("SAME");
1246 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1247 l1a->SetFillStyle(0);
1248 l1a->SetBorderSize(0);
1251 sprintf(label,"#hat{q} = %.1f GeV^{2}/fm",medval);
1253 sprintf(label,"#mu = %.1f GeV",medval);
1255 l1a->AddEntry(h1,label,"");
1256 l1a->AddEntry(h1,"L = 8 fm","pl");
1257 l1a->AddEntry(h2,"L = 5 fm","pl");
1258 l1a->AddEntry(h3,"L = 2 fm","pl");
1264 void AliQuenchingWeights::PlotAvgELoss(Int_t len,Double_t e) const
1267 Error("CalcMult","Tables are not loaded.");
1274 sprintf(title,"Average Loss for Multiple Scattering");
1275 sprintf(name,"cavgelossms");
1277 sprintf(title,"Average Loss for Single Hard Scattering");
1278 sprintf(name,"cavgelosssh");
1281 TCanvas *c = new TCanvas(name,title,0,0,500,400);
1283 TH2F *hframe = new TH2F("avgloss",title,2,0,5.1,2,0,100);
1284 hframe->SetStats(0);
1286 hframe->SetXTitle("#hat{q} [GeV^{2}/fm]");
1288 hframe->SetXTitle("#mu [GeV]");
1289 hframe->SetYTitle("<E_{loss}> [GeV]");
1292 TGraph *gq=new TGraph(20);
1294 for(Double_t v=0.05;v<=5.05;v+=0.25){
1295 TH1F *dummy=ComputeELossHisto(1,v,len,e);
1296 Double_t avgloss=dummy->GetMean();
1297 gq->SetPoint(i,v,avgloss);i++;
1300 gq->SetMarkerStyle(20);
1303 TGraph *gg=new TGraph(20);
1305 for(Double_t v=0.05;v<=5.05;v+=0.25){
1306 TH1F *dummy=ComputeELossHisto(2,v,len,e);
1307 Double_t avgloss=dummy->GetMean();
1308 gg->SetPoint(i,v,avgloss);i++;
1311 gg->SetMarkerStyle(24);
1314 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1315 l1a->SetFillStyle(0);
1316 l1a->SetBorderSize(0);
1318 sprintf(label,"L = %d fm",len);
1319 l1a->AddEntry(gq,label,"");
1320 l1a->AddEntry(gq,"quark","pl");
1321 l1a->AddEntry(gg,"gluon","pl");
1327 void AliQuenchingWeights::PlotAvgELoss(TH1F *hEll,Double_t e) const
1330 Error("CalcMult","Tables are not loaded.");
1337 sprintf(title,"Average Loss for Multiple Scattering");
1338 sprintf(name,"cavgelossms2");
1340 sprintf(title,"Average Loss for Single Hard Scattering");
1341 sprintf(name,"cavgelosssh2");
1344 TCanvas *c = new TCanvas(name,title,0,0,500,400);
1346 TH2F *hframe = new TH2F("havgloss",title,2,0,5.1,2,0,100);
1347 hframe->SetStats(0);
1349 hframe->SetXTitle("#hat{q} [GeV^{2}/fm]");
1351 hframe->SetXTitle("#mu [GeV]");
1352 hframe->SetYTitle("<E_{loss}> [GeV]");
1355 TGraph *gq=new TGraph(20);
1357 for(Double_t v=0.05;v<=5.05;v+=0.25){
1358 TH1F *dummy=ComputeELossHisto(1,v,hEll,e);
1359 Double_t avgloss=dummy->GetMean();
1360 gq->SetPoint(i,v,avgloss);i++;
1363 gq->SetMarkerStyle(20);
1366 TGraph *gg=new TGraph(20);
1368 for(Double_t v=0.05;v<=5.05;v+=0.25){
1369 TH1F *dummy=ComputeELossHisto(2,v,hEll,e);
1370 Double_t avgloss=dummy->GetMean();
1371 gg->SetPoint(i,v,avgloss);i++;
1374 gg->SetMarkerStyle(24);
1377 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1378 l1a->SetFillStyle(0);
1379 l1a->SetBorderSize(0);
1381 sprintf(label,"<L> = %.2f fm",hEll->GetMean());
1382 l1a->AddEntry(gq,label,"");
1383 l1a->AddEntry(gq,"quark","pl");
1384 l1a->AddEntry(gg,"gluon","pl");
1390 void AliQuenchingWeights::PlotAvgELossVsPt(Double_t medval,Int_t len) const
1393 Error("CalcMult","Tables are not loaded.");
1400 sprintf(title,"Relative Loss for Multiple Scattering");
1401 sprintf(name,"cavgelossvsptms");
1403 sprintf(title,"Relative Loss for Single Hard Scattering");
1404 sprintf(name,"cavgelossvsptsh");
1407 TCanvas *c = new TCanvas(name,title,0,0,500,400);
1409 TH2F *hframe = new TH2F("havglossvspt",title,2,0,100,2,0,1);
1410 hframe->SetStats(0);
1411 hframe->SetXTitle("p_{T} [GeV]");
1412 hframe->SetYTitle("<E_{loss}>/p_{T} [GeV]");
1415 TGraph *gq=new TGraph(40);
1417 for(Double_t pt=2.5;pt<=100.05;pt+=2.5){
1418 TH1F *dummy=ComputeELossHisto(1,medval,len,pt);
1419 Double_t avgloss=dummy->GetMean();
1420 gq->SetPoint(i,pt,avgloss/pt);i++;
1423 gq->SetMarkerStyle(20);
1426 TGraph *gg=new TGraph(40);
1428 for(Double_t pt=2.5;pt<=100.05;pt+=2.5){
1429 TH1F *dummy=ComputeELossHisto(2,medval,len,pt);
1430 Double_t avgloss=dummy->GetMean();
1431 gg->SetPoint(i,pt,avgloss/pt);i++;
1434 gg->SetMarkerStyle(24);
1437 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1438 l1a->SetFillStyle(0);
1439 l1a->SetBorderSize(0);
1441 sprintf(label,"L = %d fm",len);
1442 l1a->AddEntry(gq,label,"");
1443 l1a->AddEntry(gq,"quark","pl");
1444 l1a->AddEntry(gg,"gluon","pl");
1450 void AliQuenchingWeights::PlotAvgELossVsPt(Double_t medval,TH1F *hEll) const
1453 Error("CalcMult","Tables are not loaded.");
1460 sprintf(title,"Relative Loss for Multiple Scattering");
1461 sprintf(name,"cavgelossvsptms2");
1463 sprintf(title,"Relative Loss for Single Hard Scattering");
1464 sprintf(name,"cavgelossvsptsh2");
1466 TCanvas *c = new TCanvas(name,title,0,0,500,400);
1468 TH2F *hframe = new TH2F("havglossvspt",title,2,0,100,2,0,1);
1469 hframe->SetStats(0);
1470 hframe->SetXTitle("p_{T} [GeV]");
1471 hframe->SetYTitle("<E_{loss}>/p_{T} [GeV]");
1474 TGraph *gq=new TGraph(40);
1476 for(Double_t pt=2.5;pt<=100.05;pt+=2.5){
1477 TH1F *dummy=ComputeELossHisto(1,medval,hEll,pt);
1478 Double_t avgloss=dummy->GetMean();
1479 gq->SetPoint(i,pt,avgloss/pt);i++;
1482 gq->SetMarkerStyle(20);
1485 TGraph *gg=new TGraph(40);
1487 for(Double_t pt=2.5;pt<=100.05;pt+=2.5){
1488 TH1F *dummy=ComputeELossHisto(2,medval,hEll,pt);
1489 Double_t avgloss=dummy->GetMean();
1490 gg->SetPoint(i,pt,avgloss/pt);i++;
1493 gg->SetMarkerStyle(24);
1496 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1497 l1a->SetFillStyle(0);
1498 l1a->SetBorderSize(0);
1500 sprintf(label,"<L> = %.2f fm",hEll->GetMean());
1501 l1a->AddEntry(gq,label,"");
1502 l1a->AddEntry(gq,"quark","pl");
1503 l1a->AddEntry(gg,"gluon","pl");