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]
27 // Origin: C. Loizides constantinos.loizides@cern.ch
28 // A. Dainese andrea.dainese@pd.infn.it
30 //----------------------------------------------------------------------------
32 #include <Riostream.h>
40 #include "AliQuenchingWeights.h"
42 ClassImp(AliQuenchingWeights)
44 // conversion from fm to GeV^-1: 1 fm = fmGeV GeV^-1
45 const Double_t AliQuenchingWeights::fgkConvFmToInvGeV = 1./0.197;
48 const Double_t AliQuenchingWeights::fgkRMax = 1.e6;
50 // counter for histogram labels
51 Int_t AliQuenchingWeights::fgCounter = 0;
53 AliQuenchingWeights::AliQuenchingWeights()
66 fInstanceNumber=fgCounter++;
69 AliQuenchingWeights::AliQuenchingWeights(const AliQuenchingWeights& a)
77 fMultSoft=a.GetMultSoft();;
79 fQTransport=a.GetQTransport();
80 fECMethod=(kECMethod)a.GetECMethod();
81 fLengthMax=a.GetLengthMax();
82 fInstanceNumber=fgCounter++;
83 //Missing in the class is the pathname
84 //to the tables, can be added if needed
87 AliQuenchingWeights::~AliQuenchingWeights()
92 void AliQuenchingWeights::Reset()
94 //reset tables if there were used
97 for(Int_t l=0;l<fLengthMaxOld;l++){
106 void AliQuenchingWeights::SetECMethod(kECMethod type)
108 //set energy constraint method
111 if(fECMethod==kDefault)
112 Info("SetECMethod","Energy Constraint Method set to DEFAULT:\nIf (sampled energy loss > parton energy) then sampled energy loss = parton energy.");
114 Info("SetECMethod","Energy Constraint Method set to REWEIGHT:\nRequire sampled energy loss <= parton energy.");
117 Int_t AliQuenchingWeights::InitMult(const Char_t *contall,const Char_t *discall)
119 // read in tables for multiple scattering approximation
120 // path to continuum and to discrete part
122 fTablesLoaded = kFALSE;
126 sprintf(fname,"%s",gSystem->ExpandPathName(contall));
127 //PH ifstream fincont(fname);
128 fstream fincont(fname,ios::in);
129 #if defined(__HP_aCC) || defined(__DECCXX)
130 if(!fincont.rdbuf()->is_open()) return -1;
132 if(!fincont.is_open()) return -1;
136 while(fincont>>fxx[nn]>>fcaq[0][nn]>>fcaq[1][nn]>>fcaq[2][nn]>>fcaq[3][nn]>>
137 fcaq[4][nn]>>fcaq[5][nn]>>fcaq[6][nn]>>fcaq[7][nn]>>fcaq[8][nn]>>
138 fcaq[9][nn]>>fcaq[10][nn]>>fcaq[11][nn]>>fcaq[12][nn]>>fcaq[13][nn]>>
139 fcaq[14][nn]>>fcaq[15][nn]>>fcaq[16][nn]>>fcaq[17][nn]>>fcaq[18][nn]>>
140 fcaq[19][nn]>>fcaq[20][nn]>>fcaq[21][nn]>>fcaq[22][nn]>>fcaq[23][nn]>>
141 fcaq[24][nn]>>fcaq[25][nn]>>fcaq[26][nn]>>fcaq[27][nn]>>fcaq[28][nn]>>
142 fcaq[29][nn]>>fcaq[30][nn]>>fcaq[31][nn]>>fcaq[32][nn]>>fcaq[33][nn])
149 while(fincont>>fxxg[nn]>>fcag[0][nn]>>fcag[1][nn]>>fcag[2][nn]>>fcag[3][nn]>>
150 fcag[4][nn]>>fcag[5][nn]>>fcag[6][nn]>>fcag[7][nn]>>fcag[8][nn]>>
151 fcag[9][nn]>>fcag[10][nn]>>fcag[11][nn]>>fcag[12][nn]>>fcag[13][nn]>>
152 fcag[14][nn]>>fcag[15][nn]>>fcag[16][nn]>>fcag[17][nn]>>fcag[18][nn]>>
153 fcag[19][nn]>>fcag[20][nn]>>fcag[21][nn]>>fcag[22][nn]>>fcag[23][nn]>>
154 fcag[24][nn]>>fcag[25][nn]>>fcag[26][nn]>>fcag[27][nn]>>fcag[28][nn]>>
155 fcag[29][nn]>>fcag[30][nn]>>fcag[31][nn]>>fcag[32][nn]>>fcag[33][nn])
162 sprintf(fname,"%s",gSystem->ExpandPathName(discall));
163 //PH ifstream findisc(fname);
164 fstream findisc(fname,ios::in);
165 #if defined(__HP_aCC) || defined(__DECCXX)
166 if(!findisc.rdbuf()->is_open()) return -1;
168 if(!findisc.is_open()) return -1;
172 while(findisc>>frrr[nn]>>fdaq[nn]) {
177 while(findisc>>frrrg[nn]>>fdag[nn]) {
182 fTablesLoaded = kTRUE;
187 C***************************************************************************
188 C Quenching Weights for Multiple Soft Scattering
193 C Carlos A. Salgado and Urs A. Wiedemann, hep-ph/0302184.
195 C Carlos A. Salgado and Urs A. Wiedemann Phys.Rev.Lett.89:092303,2002.
198 C This package contains quenching weights for gluon radiation in the
199 C multiple soft scattering approximation.
201 C swqmult returns the quenching weight for a quark (ipart=1) or
202 C a gluon (ipart=2) traversing a medium with transport coeficient q and
203 C length L. The input values are rrrr=0.5*q*L^3 and xxxx=w/wc, where
204 C wc=0.5*q*L^2 and w is the energy radiated. The output values are
205 C the continuous and discrete (prefactor of the delta function) parts
206 C of the quenching weights.
208 C In order to use this routine, the files cont.all and disc.all need to be
209 C in the working directory.
211 C An initialization of the tables is needed by doing call initmult before
214 C Please, send us any comment:
216 C urs.wiedemann@cern.ch
217 C carlos.salgado@cern.ch
220 C-------------------------------------------------------------------
222 SUBROUTINE swqmult(ipart,rrrr,xxxx,continuous,discrete)
224 REAL*8 xx(400), daq(34), caq(34,261), rrr(34)
225 COMMON /dataqua/ xx, daq, caq, rrr
227 REAL*8 xxg(400), dag(34), cag(34,261), rrrg(34)
228 COMMON /dataglu/ xxg, dag, cag, rrrg
230 REAL*8 rrrr,xxxx, continuous, discrete
232 INTEGER nrlow, nrhigh, nxlow, nxhigh
233 REAL*8 rrhigh, rrlow, rfraclow, rfrachigh
234 REAL*8 xfraclow, xfrachigh
245 if (rrin.lt.rrr(nr)) then
257 rfraclow = (rrhigh-rrin)/(rrhigh-rrlow)
258 rfrachigh = (rrin-rrlow)/(rrhigh-rrlow)
259 if (rrin.gt.10000d0) then
260 rfraclow = dlog(rrhigh/rrin)/dlog(rrhigh/rrlow)
261 rfrachigh = dlog(rrin/rrlow)/dlog(rrhigh/rrlow)
264 if (ipart.eq.1.and.rrin.ge.rrr(1)) then
271 if (ipart.ne.1.and.rrin.ge.rrrg(1)) then
278 if (xxxx.ge.xx(261)) go to 245
280 nxlow = int(xxin/0.01) + 1
282 xfraclow = (xx(nxhigh)-xxin)/0.01
283 xfrachigh = (xxin - xx(nxlow))/0.01
286 clow = xfraclow*caq(nrlow,nxlow)+xfrachigh*caq(nrlow,nxhigh)
287 chigh = xfraclow*caq(nrhigh,nxlow)+xfrachigh*caq(nrhigh,nxhigh)
289 clow = xfraclow*cag(nrlow,nxlow)+xfrachigh*cag(nrlow,nxhigh)
290 chigh = xfraclow*cag(nrhigh,nxlow)+xfrachigh*cag(nrhigh,nxhigh)
293 continuous = rfraclow*clow + rfrachigh*chigh
298 discrete = rfraclow*daq(nrlow) + rfrachigh*daq(nrhigh)
300 discrete = rfraclow*dag(nrlow) + rfrachigh*dag(nrhigh)
306 REAL*8 xxq(400), daq(34), caq(34,261), rrr(34)
307 COMMON /dataqua/ xxq, daq, caq, rrr
309 REAL*8 xxg(400), dag(34), cag(34,261), rrrg(34)
310 COMMON /dataglu/ xxg, dag, cag, rrrg
312 OPEN(UNIT=20,FILE='contnew.all',STATUS='OLD',ERR=90)
314 read (20,*) xxq(nn), caq(1,nn), caq(2,nn), caq(3,nn),
315 + caq(4,nn), caq(5,nn), caq(6,nn), caq(7,nn), caq(8,nn),
316 + caq(9,nn), caq(10,nn), caq(11,nn), caq(12,nn),
318 + caq(14,nn), caq(15,nn), caq(16,nn), caq(17,nn),
320 + caq(19,nn), caq(20,nn), caq(21,nn), caq(22,nn),
322 + caq(24,nn), caq(25,nn), caq(26,nn), caq(27,nn),
324 + caq(29,nn), caq(30,nn), caq(31,nn), caq(32,nn),
325 + caq(33,nn), caq(34,nn)
328 read (20,*) xxg(nn), cag(1,nn), cag(2,nn), cag(3,nn),
329 + cag(4,nn), cag(5,nn), cag(6,nn), cag(7,nn), cag(8,nn),
330 + cag(9,nn), cag(10,nn), cag(11,nn), cag(12,nn),
332 + cag(14,nn), cag(15,nn), cag(16,nn), cag(17,nn),
334 + cag(19,nn), cag(20,nn), cag(21,nn), cag(22,nn),
336 + cag(24,nn), cag(25,nn), cag(26,nn), cag(27,nn),
338 + cag(29,nn), cag(30,nn), cag(31,nn), cag(32,nn),
339 + cag(33,nn), cag(34,nn)
343 OPEN(UNIT=21,FILE='discnew.all',STATUS='OLD',ERR=91)
345 read (21,*) rrr(nn), daq(nn)
348 read (21,*) rrrg(nn), dag(nn)
353 90 PRINT*, 'input - output error'
354 91 PRINT*, 'input - output error #2'
360 =======================================================================
362 Adapted to ROOT macro by A. Dainese - 13/07/2003
363 Ported to class by C. Loizides - 12/02/2004
364 New version for extended R values added - 06/03/2004
367 Int_t AliQuenchingWeights::CalcMult(Int_t ipart, Double_t rrrr,Double_t xxxx,
368 Double_t &continuous,Double_t &discrete) const
370 // Calculate Multiple Scattering approx.
371 // weights for given parton type,
372 // rrrr=0.5*q*L^3 and xxxx=w/wc, wc=0.5*q*L^2
378 // read-in data before first call
380 Error("CalcMult","Tables are not loaded.");
384 Error("CalcMult","Tables are not loaded for Multiple Scattering.");
388 Double_t rrin = rrrr;
389 Double_t xxin = xxxx;
391 if(xxin>fxx[260]) return -1;
392 Int_t nxlow = (Int_t)(xxin/0.01) + 1;
393 Int_t nxhigh = nxlow + 1;
394 Double_t xfraclow = (fxx[nxhigh-1]-xxin)/0.01;
395 Double_t xfrachigh = (xxin - fxx[nxlow-1])/0.01;
398 if(rrin<=frrr[33]) rrin = 1.05*frrr[33]; // AD
399 if(rrin>=frrr[0]) rrin = 0.95*frrr[0]; // AD
401 Int_t nrlow=0,nrhigh=0;
402 Double_t rrhigh=0,rrlow=0;
403 for(Int_t nr=1; nr<=34; nr++) {
404 if(rrin<frrr[nr-1]) {
407 rrhigh = frrr[nr-1-1];
417 Double_t rfraclow = (rrhigh-rrin)/(rrhigh-rrlow);
418 Double_t rfrachigh = (rrin-rrlow)/(rrhigh-rrlow);
421 rfraclow = TMath::Log2(rrhigh/rrin)/TMath::Log2(rrhigh/rrlow);
422 rfrachigh = TMath::Log2(rrin/rrlow)/TMath::Log2(rrhigh/rrlow);
424 if((ipart==1) && (rrin>=frrr[0]))
431 if((ipart==2) && (rrin>=frrrg[0]))
439 //printf("R = %f,\nRlow = %f, Rhigh = %f,\nRfraclow = %f, Rfrachigh = %f\n",rrin,rrlow,rrhigh,rfraclow,rfrachigh); // AD
441 Double_t clow=0,chigh=0;
443 clow = xfraclow*fcaq[nrlow-1][nxlow-1]+xfrachigh*fcaq[nrlow-1][nxhigh-1];
444 chigh = xfraclow*fcaq[nrhigh-1][nxlow-1]+xfrachigh*fcaq[nrhigh-1][nxhigh-1];
446 clow = xfraclow*fcag[nrlow-1][nxlow-1]+xfrachigh*fcag[nrlow-1][nxhigh-1];
447 chigh = xfraclow*fcag[nrhigh-1][nxlow-1]+xfrachigh*fcag[nrhigh-1][nxhigh-1];
450 continuous = rfraclow*clow + rfrachigh*chigh;
451 //printf("rfraclow %f, clow %f, rfrachigh %f, chigh %f,\n continuous %f\n",
452 // rfraclow,clow,rfrachigh,chigh,continuous);
455 discrete = rfraclow*fdaq[nrlow-1] + rfrachigh*fdaq[nrhigh-1];
457 discrete = rfraclow*fdag[nrlow-1] + rfrachigh*fdag[nrhigh-1];
463 Int_t AliQuenchingWeights::InitSingleHard(const Char_t *contall,const Char_t *discall)
465 // read in tables for Single Hard Approx.
466 // path to continuum and to discrete part
468 fTablesLoaded = kFALSE;
472 sprintf(fname,"%s",gSystem->ExpandPathName(contall));
473 //PH ifstream fincont(fname);
474 fstream fincont(fname,ios::in);
475 #if defined(__HP_aCC) || defined(__DECCXX)
476 if(!fincont.rdbuf()->is_open()) return -1;
478 if(!fincont.is_open()) return -1;
482 while(fincont>>fxx[nn]>>fcaq[0][nn]>>fcaq[1][nn]>>fcaq[2][nn]>>fcaq[3][nn]>>
483 fcaq[4][nn]>>fcaq[5][nn]>>fcaq[6][nn]>>fcaq[7][nn]>>fcaq[8][nn]>>
484 fcaq[9][nn]>>fcaq[10][nn]>>fcaq[11][nn]>>fcaq[12][nn]>>
486 fcaq[14][nn]>>fcaq[15][nn]>>fcaq[16][nn]>>fcaq[17][nn]>>
488 fcaq[19][nn]>>fcaq[20][nn]>>fcaq[21][nn]>>fcaq[22][nn]>>
490 fcaq[24][nn]>>fcaq[25][nn]>>fcaq[26][nn]>>fcaq[27][nn]>>
499 while(fincont>>fxxg[nn]>>fcag[0][nn]>>fcag[1][nn]>>fcag[2][nn]>>fcag[3][nn]>>
500 fcag[4][nn]>>fcag[5][nn]>>fcag[6][nn]>>fcag[7][nn]>>fcag[8][nn]>>
501 fcag[9][nn]>>fcag[10][nn]>>fcag[11][nn]>>fcag[12][nn]>>
503 fcag[14][nn]>>fcag[15][nn]>>fcag[16][nn]>>fcag[17][nn]>>
505 fcag[19][nn]>>fcag[20][nn]>>fcag[21][nn]>>fcag[22][nn]>>
507 fcag[24][nn]>>fcag[25][nn]>>fcag[26][nn]>>fcag[27][nn]>>
515 sprintf(fname,"%s",gSystem->ExpandPathName(discall));
516 //PH ifstream findisc(fname);
517 fstream findisc(fname,ios::in);
518 #if defined(__HP_aCC) || defined(__DECCXX)
519 if(!findisc.rdbuf()->is_open()) return -1;
521 if(!findisc.is_open()) return -1;
525 while(findisc>>frrr[nn]>>fdaq[nn]) {
530 while(findisc>>frrrg[nn]>>fdag[nn]) {
536 fTablesLoaded = kTRUE;
541 C***************************************************************************
542 C Quenching Weights for Single Hard Scattering
547 C Carlos A. Salgado and Urs A. Wiedemann, hep-ph/0302184.
549 C Carlos A. Salgado and Urs A. Wiedemann Phys.Rev.Lett.89:092303,2002.
552 C This package contains quenching weights for gluon radiation in the
553 C single hard scattering approximation.
555 C swqlin returns the quenching weight for a quark (ipart=1) or
556 C a gluon (ipart=2) traversing a medium with Debye screening mass mu and
557 C length L. The input values are rrrr=0.5*mu^2*L^2 and xxxx=w/wc, where
558 C wc=0.5*mu^2*L and w is the energy radiated. The output values are
559 C the continuous and discrete (prefactor of the delta function) parts
560 C of the quenching weights.
562 C In order to use this routine, the files contlin.all and disclin.all
563 C need to be in the working directory.
565 C An initialization of the tables is needed by doing call initlin before
568 C Please, send us any comment:
570 C urs.wiedemann@cern.ch
571 C carlos.salgado@cern.ch
574 C-------------------------------------------------------------------
577 SUBROUTINE swqlin(ipart,rrrr,xxxx,continuous,discrete)
579 REAL*8 xx(400), dalq(30), calq(30,261), rrr(30)
580 COMMON /datalinqua/ xx, dalq, calq, rrr
582 REAL*8 xxlg(400), dalg(30), calg(30,261), rrrlg(30)
583 COMMON /datalinglu/ xxlg, dalg, calg, rrrlg
585 REAL*8 rrrr,xxxx, continuous, discrete
587 INTEGER nrlow, nrhigh, nxlow, nxhigh
588 REAL*8 rrhigh, rrlow, rfraclow, rfrachigh
589 REAL*8 xfraclow, xfrachigh
595 nxlow = int(xxin/0.038) + 1
597 xfraclow = (xx(nxhigh)-xxin)/0.038
598 xfrachigh = (xxin - xx(nxlow))/0.038
601 if (rrin.lt.rrr(nr)) then
613 rfraclow = (rrhigh-rrin)/(rrhigh-rrlow)
614 rfrachigh = (rrin-rrlow)/(rrhigh-rrlow)
617 clow = xfraclow*calq(nrlow,nxlow)+xfrachigh*calq(nrlow,nxhigh)
618 chigh = xfraclow*calq(nrhigh,nxlow)+xfrachigh*calq(nrhigh,nxhigh)
620 clow = xfraclow*calg(nrlow,nxlow)+xfrachigh*calg(nrlow,nxhigh)
621 chigh = xfraclow*calg(nrhigh,nxlow)+xfrachigh*calg(nrhigh,nxhigh)
624 continuous = rfraclow*clow + rfrachigh*chigh
627 discrete = rfraclow*dalq(nrlow) + rfrachigh*dalq(nrhigh)
629 discrete = rfraclow*dalg(nrlow) + rfrachigh*dalg(nrhigh)
635 REAL*8 xxlq(400), dalq(30), calq(30,261), rrr(30)
636 COMMON /datalinqua/ xxlq, dalq, calq, rrr
638 REAL*8 xxlg(400), dalg(30), calg(30,261), rrrlg(30)
639 COMMON /datalinglu/ xxlg, dalg, calg, rrrlg
641 OPEN(UNIT=20,FILE='contlin.all',STATUS='OLD',ERR=90)
643 read (20,*) xxlq(nn), calq(1,nn), calq(2,nn), calq(3,nn),
644 + calq(4,nn), calq(5,nn), calq(6,nn), calq(7,nn), calq(8,nn),
645 + calq(9,nn), calq(10,nn), calq(11,nn), calq(12,nn),
647 + calq(14,nn), calq(15,nn), calq(16,nn), calq(17,nn),
649 + calq(19,nn), calq(20,nn), calq(21,nn), calq(22,nn),
651 + calq(24,nn), calq(25,nn), calq(26,nn), calq(27,nn),
653 + calq(29,nn), calq(30,nn)
656 read (20,*) xxlg(nn), calg(1,nn), calg(2,nn), calg(3,nn),
657 + calg(4,nn), calg(5,nn), calg(6,nn), calg(7,nn), calg(8,nn),
658 + calg(9,nn), calg(10,nn), calg(11,nn), calg(12,nn),
660 + calg(14,nn), calg(15,nn), calg(16,nn), calg(17,nn),
662 + calg(19,nn), calg(20,nn), calg(21,nn), calg(22,nn),
664 + calg(24,nn), calg(25,nn), calg(26,nn), calg(27,nn),
666 + calg(29,nn), calg(30,nn)
670 OPEN(UNIT=21,FILE='disclin.all',STATUS='OLD',ERR=91)
672 read (21,*) rrr(nn), dalq(nn)
675 read (21,*) rrrlg(nn), dalg(nn)
680 90 PRINT*, 'input - output error'
681 91 PRINT*, 'input - output error #2'
686 =======================================================================
688 Ported to class by C. Loizides - 17/02/2004
692 Int_t AliQuenchingWeights::CalcSingleHard(Int_t ipart, Double_t rrrr,Double_t xxxx,
693 Double_t &continuous,Double_t &discrete) const
695 // calculate Single Hard approx.
696 // weights for given parton type,
697 // rrrr=0.5*mu^2*L^2 and xxxx=w/wc, wc=0.5*mu^2*L
699 // read-in data before first call
701 Error("CalcMult","Tables are not loaded.");
705 Error("CalcMult","Tables are not loaded for Single Hard Scattering.");
709 Double_t rrin = rrrr;
710 Double_t xxin = xxxx;
712 Int_t nxlow = (Int_t)(xxin/0.038) + 1;
713 Int_t nxhigh = nxlow + 1;
714 Double_t xfraclow = (fxx[nxhigh-1]-xxin)/0.038;
715 Double_t xfrachigh = (xxin - fxx[nxlow-1])/0.038;
718 if(rrin<=frrr[29]) rrin = 1.05*frrr[29]; // AD
719 if(rrin>=frrr[0]) rrin = 0.95*frrr[0]; // AD
721 Int_t nrlow=0,nrhigh=0;
722 Double_t rrhigh=0,rrlow=0;
723 for(Int_t nr=1; nr<=30; nr++) {
724 if(rrin<frrr[nr-1]) {
727 rrhigh = frrr[nr-1-1];
737 Double_t rfraclow = (rrhigh-rrin)/(rrhigh-rrlow);
738 Double_t rfrachigh = (rrin-rrlow)/(rrhigh-rrlow);
740 //printf("R = %f,\nRlow = %f, Rhigh = %f,\nRfraclow = %f, Rfrachigh = %f\n",rrin,rrlow,rrhigh,rfraclow,rfrachigh); // AD
742 Double_t clow=0,chigh=0;
744 clow = xfraclow*fcaq[nrlow-1][nxlow-1]+xfrachigh*fcaq[nrlow-1][nxhigh-1];
745 chigh = xfraclow*fcaq[nrhigh-1][nxlow-1]+xfrachigh*fcaq[nrhigh-1][nxhigh-1];
747 clow = xfraclow*fcag[nrlow-1][nxlow-1]+xfrachigh*fcag[nrlow-1][nxhigh-1];
748 chigh = xfraclow*fcag[nrhigh-1][nxlow-1]+xfrachigh*fcag[nrhigh-1][nxhigh-1];
751 continuous = rfraclow*clow + rfrachigh*chigh;
752 //printf("rfraclow %f, clow %f, rfrachigh %f, chigh %f,\n continuous %f\n",
753 // rfraclow,clow,rfrachigh,chigh,continuous);
756 discrete = rfraclow*fdaq[nrlow-1] + rfrachigh*fdaq[nrhigh-1];
758 discrete = rfraclow*fdag[nrlow-1] + rfrachigh*fdag[nrhigh-1];
764 Int_t AliQuenchingWeights::CalcMult(Int_t ipart,
765 Double_t w,Double_t qtransp,Double_t length,
766 Double_t &continuous,Double_t &discrete) const
768 // Calculate Multiple Scattering approx.
769 // weights for given parton type,
770 // rrrr=0.5*q*L^3 and xxxx=w/wc, wc=0.5*q*L^2
772 Double_t wc=CalcWC(qtransp,length);
773 Double_t rrrr=CalcR(wc,length);
775 return CalcMult(ipart,rrrr,xxxx,continuous,discrete);
778 Int_t AliQuenchingWeights::CalcSingleHard(Int_t ipart,
779 Double_t w,Double_t mu,Double_t length,
780 Double_t &continuous,Double_t &discrete) const
782 // calculate Single Hard approx.
783 // weights for given parton type,
784 // rrrr=0.5*mu^2*L^2 and xxxx=w/wc, wc=0.5*mu^2*L
786 Double_t wcbar=CalcWCbar(mu,length);
787 Double_t rrrr=CalcR(wcbar,length);
788 Double_t xxxx=w/wcbar;
789 return CalcSingleHard(ipart,rrrr,xxxx,continuous,discrete);
792 Double_t AliQuenchingWeights::CalcR(Double_t wc, Double_t l) const
794 //calculate R value and
795 //check if it is less then maximum
797 Double_t R = wc*l*fgkConvFmToInvGeV;
799 Warning("CalcR","Value of R = %.2f; should be less than %.2f",R,fgkRMax);
805 Double_t AliQuenchingWeights::GetELossRandom(Int_t ipart, Double_t length, Double_t e) const
807 // return DeltaE for MS or SH scattering
808 // for given parton type, length and energy
809 // Dependant on ECM (energy constraint method)
810 // e is used to determine where to set bins to zero.
813 Fatal("GetELossRandom","Call SampleEnergyLoss method before!");
816 if((ipart<1) || (ipart>2)) {
817 Fatal("GetELossRandom","ipart =%d; but has to be 1 (quark) or 2 (gluon)",ipart);
821 Int_t l=(Int_t)length;
822 if((length-(Double_t)l)>0.5) l++;
824 if(l>fLengthMax) l=fLengthMax;
826 if(fECMethod==kReweight){
827 TH1F *dummy=new TH1F(*fHistos[ipart-1][l-1]);
828 dummy->SetName("dummy");
829 for(Int_t bin=dummy->FindBin(e)+1;bin<=1100;bin++){
830 dummy->SetBinContent(bin,0.);
832 dummy->Scale(1./dummy->Integral());
833 Double_t ret=dummy->GetRandom();
836 //****** !! ALTERNATIVE WAY OF DOING IT !! ***
837 //Double_t ret = 2.*e;
838 //while(ret>e) ret=fHistos[ipart-1][l-1]->GetRandom();
840 //********************************************
842 Double_t ret=fHistos[ipart-1][l-1]->GetRandom();
848 Double_t AliQuenchingWeights::CalcQuenchedEnergy(Int_t ipart, Double_t length, Double_t e) const
850 //return quenched parton energy
851 //for given parton type, length and energy
853 Double_t loss=GetELossRandom(ipart,length,e);
857 Double_t AliQuenchingWeights::GetELossRandom(Int_t ipart, TH1F *hell, Double_t e) const
859 // return DeltaE for MS or SH scattering
860 // for given parton type, length distribution and energy
861 // Dependant on ECM (energy constraint method)
862 // e is used to determine where to set bins to zero.
865 Warning("GetELossRandom","Pointer to length distribution is NULL.");
868 Double_t ell=hell->GetRandom();
869 return GetELossRandom(ipart,ell,e);
872 Double_t AliQuenchingWeights::CalcQuenchedEnergy(Int_t ipart, TH1F *hell, Double_t e) const
874 //return quenched parton energy
875 //for given parton type, length distribution and energy
877 Double_t loss=GetELossRandom(ipart,hell,e);
881 Int_t AliQuenchingWeights::SampleEnergyLoss()
883 // Has to be called to fill the histograms
885 // For stored values fQTransport loop over
886 // particle type and length = 1 to fMaxLength (fm)
887 // to fill energy loss histos
889 // Take histogram of continuous weights
890 // Take discrete_weight
891 // If discrete_weight > 1, put all channels to 0, except channel 1
892 // Fill channel 1 with discrete_weight/(1-discrete_weight)*integral
894 // read-in data before first call
896 Error("CalcMult","Tables are not loaded.");
901 Int_t lmax=CalcLengthMax(fQTransport);
903 Info("SampleEnergyLoss","Maximum length changed from %d to %d;\nin order to have R < %.f",fLengthMax,lmax,fgkRMax);
907 Warning("SampleEnergyLoss","Maximum length not checked,\nbecause SingeHard is not yet tested.");
911 fHistos=new TH1F**[2];
912 fHistos[0]=new TH1F*[fLengthMax];
913 fHistos[1]=new TH1F*[fLengthMax];
914 fLengthMaxOld=fLengthMax; //remember old value in case
915 //user wants to reset
920 medvalue=(Int_t)(fQTransport*1000.);
921 sprintf(meddesc,"MS");
923 medvalue=(Int_t)(fMu*1000.);
924 sprintf(meddesc,"SH");
927 for(Int_t ipart=1;ipart<=2;ipart++){
928 for(Int_t l=1;l<=fLengthMax;l++){
931 sprintf(hname,"hDisc-ContQW_%s_%d_%d_%d_%d",meddesc,fInstanceNumber,ipart,medvalue,l);
932 Double_t wc = CalcWC(l);
933 fHistos[ipart-1][l-1] = new TH1F(hname,hname,1100,0.,1.1*wc);
934 fHistos[ipart-1][l-1]->SetXTitle("#Delta E [GeV]");
935 fHistos[ipart-1][l-1]->SetYTitle("p(#Delta E)");
936 fHistos[ipart-1][l-1]->SetLineColor(4);
938 Double_t rrrr = CalcR(wc,l);
939 Double_t discrete=0.;
940 // loop on histogram channels
941 for(Int_t bin=1; bin<=1100; bin++) {
942 Double_t xxxx = fHistos[ipart-1][l-1]->GetBinCenter(bin)/wc;
944 CalcMult(ipart,rrrr,xxxx,continuous,discrete);
945 fHistos[ipart-1][l-1]->SetBinContent(bin,continuous);
947 // add discrete part to distribution
949 for(Int_t bin=2;bin<=1100;bin++)
950 fHistos[ipart-1][l-1]->SetBinContent(bin,0.);
952 Double_t val=discrete/(1.-discrete)*fHistos[ipart-1][l-1]->Integral(1,1100);
953 fHistos[ipart-1][l-1]->Fill(0.,val);
955 Double_t hint=fHistos[ipart-1][l-1]->Integral(1,1100);
956 fHistos[ipart-1][l-1]->Scale(1./hint);
962 const TH1F* AliQuenchingWeights::GetHisto(Int_t ipart,Int_t l) const
964 //return quenching histograms
965 //for ipart and length
968 Fatal("GetELossRandom","Call SampleEnergyLoss method before!");
971 if((ipart<1) || (ipart>2)) {
972 Fatal("GetELossRandom","ipart =%d; but has to be 1 (quark) or 2 (gluon)",ipart);
977 if(l>fLengthMax) l=fLengthMax;
979 return fHistos[ipart-1][l-1];
982 TH1F* AliQuenchingWeights::ComputeQWHisto(Int_t ipart,Double_t medval,Double_t length) const
984 // ipart = 1 for quark, 2 for gluon
985 // medval a) qtransp = transport coefficient (GeV^2/fm)
986 // b) mu = Debye mass (GeV)
987 // length = path length in medium (fm)
988 // Get from SW tables:
989 // - discrete weight (probability to have NO energy loss)
990 // - continuous weight, as a function of dE
991 // compute up to max dE = 1.1*wc
992 // (as an histogram named hContQW_<ipart>_<medval*1000>_<l>
993 // and range [0,1.1*wc] (1100 channels)
998 wc=CalcWC(medval,length);
999 sprintf(meddesc,"MS");
1001 wc=CalcWCbar(medval,length);
1002 sprintf(meddesc,"SH");
1006 sprintf(hname,"hContQWHisto_%s_%d_%d_%d",meddesc,ipart,
1007 (Int_t)(medval*1000.),(Int_t)length);
1009 TH1F *hist = new TH1F("hist",hname,1100,0.,1.1*wc);
1010 hist->SetXTitle("#Delta E [GeV]");
1011 hist->SetYTitle("p(#Delta E)");
1012 hist->SetLineColor(4);
1014 Double_t rrrr = CalcR(wc,length);
1015 // loop on histogram channels
1016 for(Int_t bin=1; bin<=1100; bin++) {
1017 Double_t xxxx = hist->GetBinCenter(bin)/wc;
1018 Double_t continuous,discrete;
1020 if(fMultSoft) ret=CalcMult(ipart,rrrr,xxxx,continuous,discrete);
1021 else ret=CalcSingleHard(ipart,rrrr,xxxx,continuous,discrete);
1026 hist->SetBinContent(bin,continuous);
1031 TH1F* AliQuenchingWeights::ComputeQWHistoX(Int_t ipart,Double_t medval,Double_t length) const
1033 // ipart = 1 for quark, 2 for gluon
1034 // medval a) qtransp = transport coefficient (GeV^2/fm)
1035 // b) mu = Debye mass (GeV)
1036 // length = path length in medium (fm)
1037 // Get from SW tables:
1038 // - discrete weight (probability to have NO energy loss)
1039 // - continuous weight, as a function of dE
1040 // compute up to max dE = 1.1*wc
1041 // (as an histogram named hContQW_<ipart>_<medval*1000>_<l>
1042 // and range [0,1.1] (1100 channels)
1045 Char_t meddesc[100];
1047 wc=CalcWC(medval,length);
1048 sprintf(meddesc,"MS");
1050 wc=CalcWCbar(medval,length);
1051 sprintf(meddesc,"SH");
1055 sprintf(hname,"hContQWHistox_%s_%d_%d_%d",meddesc,ipart,
1056 (Int_t)(medval*1000.),(Int_t)length);
1058 TH1F *histx = new TH1F("histx",hname,1100,0.,1.1);
1059 histx->SetXTitle("x = #Delta E/#omega_{c}");
1061 histx->SetYTitle("p(#Delta E/#omega_{c})");
1063 histx->SetYTitle("p(#Delta E/#bar#omega_{c})");
1064 histx->SetLineColor(4);
1066 Double_t rrrr = CalcR(wc,length);
1067 // loop on histogram channels
1068 for(Int_t bin=1; bin<=1100; bin++) {
1069 Double_t xxxx = histx->GetBinCenter(bin);
1070 Double_t continuous,discrete;
1072 if(fMultSoft) ret=CalcMult(ipart,rrrr,xxxx,continuous,discrete);
1073 else ret=CalcSingleHard(ipart,rrrr,xxxx,continuous,discrete);
1078 histx->SetBinContent(bin,continuous);
1083 TH1F* AliQuenchingWeights::ComputeELossHisto(Int_t ipart,Double_t medval,Double_t l,Double_t e) const
1085 //compute energy loss histogram for
1086 //parton type, medium value, length and energy
1088 AliQuenchingWeights *dummy=new AliQuenchingWeights(*this);
1090 dummy->SetQTransport(medval);
1093 dummy->SetMu(medval);
1094 dummy->InitSingleHard();
1096 dummy->SampleEnergyLoss();
1101 sprintf(name,"Energy Loss Distribution - Quarks;E_{loss} (GeV);#");
1102 sprintf(hname,"hLossQuarks");
1104 sprintf(name,"Energy Loss Distribution - Gluons;E_{loss} (GeV);#");
1105 sprintf(hname,"hLossGluons");
1108 TH1F *h = new TH1F(hname,name,250,0,250);
1109 for(Int_t i=0;i<100000;i++){
1110 //if(i % 1000 == 0) cout << "." << flush;
1111 Double_t loss=dummy->GetELossRandom(ipart,l,e);
1121 TH1F* AliQuenchingWeights::ComputeELossHisto(Int_t ipart,Double_t medval,TH1F *hEll,Double_t e) const
1123 //compute energy loss histogram for
1124 //parton type, medium value,
1125 //length distribution and energy
1127 AliQuenchingWeights *dummy=new AliQuenchingWeights(*this);
1129 dummy->SetQTransport(medval);
1132 dummy->SetMu(medval);
1133 dummy->InitSingleHard();
1135 dummy->SampleEnergyLoss();
1140 sprintf(name,"Energy Loss Distribution - Quarks;E_{loss} (GeV);#");
1141 sprintf(hname,"hLossQuarks");
1143 sprintf(name,"Energy Loss Distribution - Gluons;E_{loss} (GeV);#");
1144 sprintf(hname,"hLossGluons");
1147 TH1F *h = new TH1F(hname,name,250,0,250);
1148 for(Int_t i=0;i<100000;i++){
1149 //if(i % 1000 == 0) cout << "." << flush;
1150 Double_t loss=dummy->GetELossRandom(ipart,hEll,e);
1160 void AliQuenchingWeights::PlotDiscreteWeights(Int_t len) const
1162 //plot discrete weights for given length
1166 c = new TCanvas("cdiscms","Discrete Weight for Multiple Scattering",0,0,500,400);
1168 c = new TCanvas("cdiscsh","Discrete Weight for Single Hard Scattering",0,0,500,400);
1171 TH2F *hframe = new TH2F("hdisc","",2,0,5.1,2,0,1);
1172 hframe->SetStats(0);
1174 hframe->SetXTitle("#hat{q} [GeV^{2}/fm]");
1176 hframe->SetXTitle("#mu [GeV]");
1177 hframe->SetYTitle("Probability #Delta E = 0 , p_{0}");
1180 TGraph *gq=new TGraph(20);
1183 for(Double_t q=0.05;q<=5.05;q+=0.25){
1185 CalcMult(1,1.0, q, len, cont, disc);
1186 gq->SetPoint(i,q,disc);i++;
1189 for(Double_t m=0.05;m<=5.05;m+=0.25){
1191 CalcSingleHard(1,1.0, m, len, cont, disc);
1192 gq->SetPoint(i,m,disc);i++;
1195 gq->SetMarkerStyle(20);
1198 TGraph *gg=new TGraph(20);
1201 for(Double_t q=0.05;q<=5.05;q+=0.25){
1203 CalcMult(2,1.0, q, 5., cont, disc);
1204 gg->SetPoint(i,q,disc);i++;
1207 for(Double_t m=0.05;m<=5.05;m+=0.25){
1209 CalcSingleHard(2,1.0, m, 5., cont, disc);
1210 gg->SetPoint(i,m,disc);i++;
1213 gg->SetMarkerStyle(24);
1216 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1217 l1a->SetFillStyle(0);
1218 l1a->SetBorderSize(0);
1220 sprintf(label,"L = %d fm",len);
1221 l1a->AddEntry(gq,label,"");
1222 l1a->AddEntry(gq,"quark","pl");
1223 l1a->AddEntry(gg,"gluon","pl");
1229 void AliQuenchingWeights::PlotContWeights(Int_t itype,Int_t ell) const
1231 //plot continous weights for
1232 //given parton type and length
1239 sprintf(title,"Cont. Weight for Multiple Scattering - Quarks");
1241 sprintf(title,"Cont. Weight for Multiple Scattering - Gluons");
1243 medvals[0]=4;medvals[1]=1;medvals[2]=0.5;
1244 sprintf(name,"ccont-ms-%d",itype);
1247 sprintf(title,"Cont. Weight for Single Hard Scattering - Quarks");
1249 sprintf(title,"Cont. Weight for Single Hard Scattering - Gluons");
1251 medvals[0]=2;medvals[1]=1;medvals[2]=0.5;
1252 sprintf(name,"ccont-ms-%d",itype);
1255 TCanvas *c = new TCanvas(name,title,0,0,500,400);
1257 TH1F *h1=ComputeQWHisto(itype,medvals[0],ell);
1259 h1->SetTitle(title);
1261 h1->SetLineColor(1);
1263 TH1F *h2=ComputeQWHisto(itype,medvals[1],ell);
1265 h2->SetLineColor(2);
1266 h2->DrawCopy("SAME");
1267 TH1F *h3=ComputeQWHisto(itype,medvals[2],ell);
1269 h3->SetLineColor(3);
1270 h3->DrawCopy("SAME");
1272 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1273 l1a->SetFillStyle(0);
1274 l1a->SetBorderSize(0);
1276 sprintf(label,"L = %d fm",ell);
1277 l1a->AddEntry(h1,label,"");
1279 sprintf(label,"#hat{q} = %.1f GeV^{2}/fm",medvals[0]);
1280 l1a->AddEntry(h1,label,"pl");
1281 sprintf(label,"#hat{q} = %.1f GeV^{2}/fm",medvals[1]);
1282 l1a->AddEntry(h2,label,"pl");
1283 sprintf(label,"#hat{q} = %.1f GeV^{2}/fm",medvals[2]);
1284 l1a->AddEntry(h3,label,"pl");
1286 sprintf(label,"#mu = %.1f GeV",medvals[0]);
1287 l1a->AddEntry(h1,label,"pl");
1288 sprintf(label,"#mu = %.1f GeV",medvals[1]);
1289 l1a->AddEntry(h2,label,"pl");
1290 sprintf(label,"#mu = %.1f GeV",medvals[2]);
1291 l1a->AddEntry(h3,label,"pl");
1298 void AliQuenchingWeights::PlotContWeights(Int_t itype,Double_t medval) const
1300 //plot continous weights for
1301 //given parton type and medium value
1307 sprintf(title,"Cont. Weight for Multiple Scattering - Quarks");
1309 sprintf(title,"Cont. Weight for Multiple Scattering - Gluons");
1311 sprintf(name,"ccont2-ms-%d",itype);
1314 sprintf(title,"Cont. Weight for Single Hard Scattering - Quarks");
1316 sprintf(title,"Cont. Weight for Single Hard Scattering - Gluons");
1318 sprintf(name,"ccont2-sh-%d",itype);
1320 TCanvas *c = new TCanvas(name,title,0,0,500,400);
1322 TH1F *h1=ComputeQWHisto(itype,medval,8);
1324 h1->SetTitle(title);
1326 h1->SetLineColor(1);
1328 TH1F *h2=ComputeQWHisto(itype,medval,5);
1330 h2->SetLineColor(2);
1331 h2->DrawCopy("SAME");
1332 TH1F *h3=ComputeQWHisto(itype,medval,2);
1334 h3->SetLineColor(3);
1335 h3->DrawCopy("SAME");
1337 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1338 l1a->SetFillStyle(0);
1339 l1a->SetBorderSize(0);
1342 sprintf(label,"#hat{q} = %.1f GeV^{2}/fm",medval);
1344 sprintf(label,"#mu = %.1f GeV",medval);
1346 l1a->AddEntry(h1,label,"");
1347 l1a->AddEntry(h1,"L = 8 fm","pl");
1348 l1a->AddEntry(h2,"L = 5 fm","pl");
1349 l1a->AddEntry(h3,"L = 2 fm","pl");
1355 void AliQuenchingWeights::PlotAvgELoss(Int_t len,Double_t e) const
1357 //plot average energy loss for given length
1361 Error("CalcMult","Tables are not loaded.");
1368 sprintf(title,"Average Loss for Multiple Scattering");
1369 sprintf(name,"cavgelossms");
1371 sprintf(title,"Average Loss for Single Hard Scattering");
1372 sprintf(name,"cavgelosssh");
1375 TCanvas *c = new TCanvas(name,title,0,0,500,400);
1377 TH2F *hframe = new TH2F("avgloss",title,2,0,5.1,2,0,100);
1378 hframe->SetStats(0);
1380 hframe->SetXTitle("#hat{q} [GeV^{2}/fm]");
1382 hframe->SetXTitle("#mu [GeV]");
1383 hframe->SetYTitle("<E_{loss}> [GeV]");
1386 TGraph *gq=new TGraph(20);
1388 for(Double_t v=0.05;v<=5.05;v+=0.25){
1389 TH1F *dummy=ComputeELossHisto(1,v,len,e);
1390 Double_t avgloss=dummy->GetMean();
1391 gq->SetPoint(i,v,avgloss);i++;
1394 gq->SetMarkerStyle(20);
1397 TGraph *gg=new TGraph(20);
1399 for(Double_t v=0.05;v<=5.05;v+=0.25){
1400 TH1F *dummy=ComputeELossHisto(2,v,len,e);
1401 Double_t avgloss=dummy->GetMean();
1402 gg->SetPoint(i,v,avgloss);i++;
1405 gg->SetMarkerStyle(24);
1408 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1409 l1a->SetFillStyle(0);
1410 l1a->SetBorderSize(0);
1412 sprintf(label,"L = %d fm",len);
1413 l1a->AddEntry(gq,label,"");
1414 l1a->AddEntry(gq,"quark","pl");
1415 l1a->AddEntry(gg,"gluon","pl");
1421 void AliQuenchingWeights::PlotAvgELoss(TH1F *hEll,Double_t e) const
1423 //plot average energy loss for given
1424 //length distribution and parton energy
1427 Error("CalcMult","Tables are not loaded.");
1434 sprintf(title,"Average Loss for Multiple Scattering");
1435 sprintf(name,"cavgelossms2");
1437 sprintf(title,"Average Loss for Single Hard Scattering");
1438 sprintf(name,"cavgelosssh2");
1441 TCanvas *c = new TCanvas(name,title,0,0,500,400);
1443 TH2F *hframe = new TH2F("havgloss",title,2,0,5.1,2,0,100);
1444 hframe->SetStats(0);
1446 hframe->SetXTitle("#hat{q} [GeV^{2}/fm]");
1448 hframe->SetXTitle("#mu [GeV]");
1449 hframe->SetYTitle("<E_{loss}> [GeV]");
1452 TGraph *gq=new TGraph(20);
1454 for(Double_t v=0.05;v<=5.05;v+=0.25){
1455 TH1F *dummy=ComputeELossHisto(1,v,hEll,e);
1456 Double_t avgloss=dummy->GetMean();
1457 gq->SetPoint(i,v,avgloss);i++;
1460 gq->SetMarkerStyle(20);
1463 TGraph *gg=new TGraph(20);
1465 for(Double_t v=0.05;v<=5.05;v+=0.25){
1466 TH1F *dummy=ComputeELossHisto(2,v,hEll,e);
1467 Double_t avgloss=dummy->GetMean();
1468 gg->SetPoint(i,v,avgloss);i++;
1471 gg->SetMarkerStyle(24);
1474 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1475 l1a->SetFillStyle(0);
1476 l1a->SetBorderSize(0);
1478 sprintf(label,"<L> = %.2f fm",hEll->GetMean());
1479 l1a->AddEntry(gq,label,"");
1480 l1a->AddEntry(gq,"quark","pl");
1481 l1a->AddEntry(gg,"gluon","pl");
1487 void AliQuenchingWeights::PlotAvgELossVsPt(Double_t medval,Int_t len) const
1489 //plot relative energy loss for given
1490 //length and parton energy versus pt
1493 Error("CalcMult","Tables are not loaded.");
1500 sprintf(title,"Relative Loss for Multiple Scattering");
1501 sprintf(name,"cavgelossvsptms");
1503 sprintf(title,"Relative Loss for Single Hard Scattering");
1504 sprintf(name,"cavgelossvsptsh");
1507 TCanvas *c = new TCanvas(name,title,0,0,500,400);
1509 TH2F *hframe = new TH2F("havglossvspt",title,2,0,100,2,0,1);
1510 hframe->SetStats(0);
1511 hframe->SetXTitle("p_{T} [GeV]");
1512 hframe->SetYTitle("<E_{loss}>/p_{T} [GeV]");
1515 TGraph *gq=new TGraph(40);
1517 for(Double_t pt=2.5;pt<=100.05;pt+=2.5){
1518 TH1F *dummy=ComputeELossHisto(1,medval,len,pt);
1519 Double_t avgloss=dummy->GetMean();
1520 gq->SetPoint(i,pt,avgloss/pt);i++;
1523 gq->SetMarkerStyle(20);
1526 TGraph *gg=new TGraph(40);
1528 for(Double_t pt=2.5;pt<=100.05;pt+=2.5){
1529 TH1F *dummy=ComputeELossHisto(2,medval,len,pt);
1530 Double_t avgloss=dummy->GetMean();
1531 gg->SetPoint(i,pt,avgloss/pt);i++;
1534 gg->SetMarkerStyle(24);
1537 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1538 l1a->SetFillStyle(0);
1539 l1a->SetBorderSize(0);
1541 sprintf(label,"L = %d fm",len);
1542 l1a->AddEntry(gq,label,"");
1543 l1a->AddEntry(gq,"quark","pl");
1544 l1a->AddEntry(gg,"gluon","pl");
1550 void AliQuenchingWeights::PlotAvgELossVsPt(Double_t medval,TH1F *hEll) const
1552 //plot relative energy loss for given
1553 //length distribution and parton energy versus pt
1556 Error("CalcMult","Tables are not loaded.");
1563 sprintf(title,"Relative Loss for Multiple Scattering");
1564 sprintf(name,"cavgelossvsptms2");
1566 sprintf(title,"Relative Loss for Single Hard Scattering");
1567 sprintf(name,"cavgelossvsptsh2");
1569 TCanvas *c = new TCanvas(name,title,0,0,500,400);
1571 TH2F *hframe = new TH2F("havglossvspt",title,2,0,100,2,0,1);
1572 hframe->SetStats(0);
1573 hframe->SetXTitle("p_{T} [GeV]");
1574 hframe->SetYTitle("<E_{loss}>/p_{T} [GeV]");
1577 TGraph *gq=new TGraph(40);
1579 for(Double_t pt=2.5;pt<=100.05;pt+=2.5){
1580 TH1F *dummy=ComputeELossHisto(1,medval,hEll,pt);
1581 Double_t avgloss=dummy->GetMean();
1582 gq->SetPoint(i,pt,avgloss/pt);i++;
1585 gq->SetMarkerStyle(20);
1588 TGraph *gg=new TGraph(40);
1590 for(Double_t pt=2.5;pt<=100.05;pt+=2.5){
1591 TH1F *dummy=ComputeELossHisto(2,medval,hEll,pt);
1592 Double_t avgloss=dummy->GetMean();
1593 gg->SetPoint(i,pt,avgloss/pt);i++;
1596 gg->SetMarkerStyle(24);
1599 TLegend *l1a = new TLegend(0.5,0.6,.95,0.8);
1600 l1a->SetFillStyle(0);
1601 l1a->SetBorderSize(0);
1603 sprintf(label,"<L> = %.2f fm",hEll->GetMean());
1604 l1a->AddEntry(gq,label,"");
1605 l1a->AddEntry(gq,"quark","pl");
1606 l1a->AddEntry(gg,"gluon","pl");