]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HBTAN/AliHBTLLWeights.cxx
Compiler Warning removed
[u/mrichter/AliRoot.git] / HBTAN / AliHBTLLWeights.cxx
CommitLineData
4fdf4eb3 1#include "AliHBTLLWeights.h"
88cb7938 2/**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
7 * *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
16
17//_________________________________________________________________________
18///////////////////////////////////////////////////////////////////////////
19//
20// class AliHBTLLWeights
21//
22// This class introduces the weight's calculation
23// according to the Lednicky's algorithm.
24//
25//
26// fsiw.f, fsiini.f
27//
28// Description from fortran code by author R. Lednicky
29//
30// Calculates final state interaction (FSI) weights
31// WEIF = weight due to particle - (effective) nucleus FSI (p-N)
32// WEI = weight due to p-p-N FSI
33// WEIN = weight due to p-p FSI; note that WEIN=WEI if I3C=0;
34// note that if I3C=1 the calculation of
35// WEIN can be skipped by putting J=0
36//.......................................................................
37// Correlation Functions:
38// CF(p-p-N) = sum(WEI)/sum(WEIF)
39// CF(p-p) = sum(WEIN)/sum(1); here the nucleus is completely
40// inactive
41// CF(p-p-"N") = sum(WEIN*WEIF')/sum(WEIF'), where WEIN and WEIF'
42// are not correlated (calculated at different emission
43// points, e.g., for different events);
44// thus here the nucleus affects one-particle
45// spectra but not the correlation
46//.......................................................................
47// User must supply data file <fn> on unit NUNIT (e.g. =11) specifying
48// LL : particle pair
49// NS : approximation used to calculate Bethe-Salpeter amplitude
50// ITEST: test switch
51// If ITEST=1 then also following parameters are required
52// ICH : 1(0) Coulomb interaction between the two particles ON (OFF)
53// IQS : 1(0) quantum statistics for the two particles ON (OFF)
54// ISI : 1(0) strong interaction between the two particles ON (OFF)
55// I3C : 1(0) Coulomb interaction with residual nucleus ON (OFF)
56// This data file can contain other information useful for the user.
57// It is read by subroutines READINT4 and READREA8(4) (or READ_FILE).
58// -------------------------------------------------------------------
59//- LL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
60//- part. 1: n p n alfa pi+ pi0 pi+ n p pi+ pi+ pi+ pi- K+ K+ K+ K-
61//- part. 2: n p p alfa pi- pi0 pi+ d d K- K+ p p K- K+ p p
62// NS=1 y/n: + + + + + - - - - - - - - - - - -
63// -------------------------------------------------------------------
64//- LL 18 19 20 21 22 23 24 25 26 27 28
65//- part. 1: d d t t K0 K0 d p p p n
66//- part. 2: d alfa t alfa K0 K0b t t alfa lambda lambda
67// NS=1 y/n: - - - - - - - - - + +
68// -------------------------------------------------------------------
69// NS=1 Square well potential,
70// NS=3 not used
71// NS=4 scattered wave approximated by the spherical wave,
72// NS=2 same as NS=4 but the approx. of equal emission times in PRF
73// not required (t=0 approx. used in all other cases).
74// Note: if NS=2,4, the B-S amplitude diverges at zero distance r* in
75// the two-particle c.m.s.; user can specify a cutoff AA in
76// SUBROUTINE FSIINI, for example:
77// IF(NS.EQ.2.OR.NS.EQ.4)AA=5.D0 !! in 1/GeV --> AA=1. fm
78// ------------------------------------------------------------------
79// ITEST=1 any values of parameters ICH, IQS, ISI, I3C are allowed
80// and should be given in data file <fn>
81// ITEST=0 physical values of these parameters are put automatically
82// in FSIINI (their values are not required in data file)
83//=====================================================================
84// At the beginning of calculation user should call FSIINI,
85// which reads LL, NS, ITEST (and eventually ICH, IQS, ISI, I3C)
86// and initializes various parameters.
87// In particular the constants in
88// COMMON/FSI_CONS/PI,PI2,SPI,DR,W
89// may be useful for the user:
90// W=1/.1973D0 ! from fm to 1/GeV
91// PI=4*DATAN(1.D0)
92// PI2=2*PI
93// SPI=DSQRT(PI)
94// DR=180.D0/PI ! from radian to degree
95// _______________________________________________________
96// !! |Important note: all real quantities are assumed REAL*8 | !!
97// -------------------------------------------------------
98// For each event user should fill in the following information
99// in COMMONs (all COMMONs in FSI calculation start with FSI_):
100// ...................................................................
101// COMMON/FSI_POC/AMN,AM1,AM2,CN,C1,C2,AC1,AC2
102// Only
103// AMN = mass of the effective nucleus [GeV/c**2]
104// CN = charge of the effective nucleus [elem. charge units]
105// are required
106// ...................................................................
107// COMMON/FSI_MOM/P1X,P1Y,P1Z,E1,P1, !part. momenta in the rest frame
108// 1 P2X,P2Y,P2Z,E2,P2 !of effective nucleus (NRF)
109// Only the components
110// PiX,PiY,PiZ [GeV/c]
111// in NRF are required.
112// To make the corresponding Lorentz transformation user can use the
113// subroutines LTRAN and LTRANB
114// ...................................................................
115// COMMON/FSI_COOR/X1,Y1,Z1,T1,R1, ! 4-coord. of emission
116// 1 X2,Y2,Z2,T2,R2 ! points in NRF
117// The componets
118// Xi,Yi,Zi [fm]
119// and emission times
120// Ti [fm/c]
121// should be given in NRF with the origin assumed at the center
122// of the effective nucleus. If the effect of residual nucleus is
123// not calculated within FSIW, the NRF can be any fixed frame.
124// --------------------------------------------------------------------
125// Before calling FSIW the user must call
126// CALL LTRAN12
127// Besides Lorentz transformation to pair rest frame:
128// (p1-p2)/2 --> k* it also transforms 4-coordinates of
129// emission points from fm to 1/GeV and calculates Ei,Pi and Ri.
130// Note that |k*|=AK in COMMON/FSI_PRF/
131// --------------------------------------------------------------------
132// After making some additional filtering using k* (say k* < k*max)
133// or direction of vector k*,
134// user can finally call FSIW to calculate the FSI weights
135// to be used to construct the correlation function
136//======================================================================
137
4fdf4eb3 138
7f92929e 139/*******************************************************************/
140/****** ROUTINES USED FOR COMMUNUCATION ********/
141/******************** WITH FORTRAN ********************/
142/*******************************************************************/
143#ifndef WIN32
144# define led_bldata led_bldata_
145# define fsiini fsiini_
146# define ltran12 ltran12_
147# define fsiw fsiw_
88cb7938 148# define setpdist setpdist_
7f92929e 149# define type_of_call
150#else
151# define led_bldata LED_BLDATA
152# define fsiini FSIINI
153# define ltran12 LTRAN12
154# define fsiw FSIW
88cb7938 155# define setpdist SETPDIST
7f92929e 156# define type_of_call _stdcall
157#endif
158/****************************************************************/
159extern "C" void type_of_call led_bldata();
160extern "C" void type_of_call fsiini();
161extern "C" void type_of_call ltran12();
162extern "C" void type_of_call fsiw();
88cb7938 163extern "C" void type_of_call setpdist(Double_t& r);
7f92929e 164/**************************************************************/
165
88cb7938 166#include "AliHBTPair.h"
167#include "AliHBTParticle.h"
168#include "WLedCOMMONS.h"
88cb7938 169#include <TRandom.h>
170#include <TMath.h>
171#include <TPDGCode.h>
172
173
7f92929e 174ClassImp(AliHBTLLWeights)
7f92929e 175
88cb7938 176AliHBTLLWeights* AliHBTLLWeights::fgLLWeights = 0x0;
177const Double_t AliHBTLLWeights::fgkWcons = 1./0.1973;
7f92929e 178
88cb7938 179AliHBTLLWeights::AliHBTLLWeights():
180 fTest(kTRUE),
181 fColoumbSwitch(kTRUE),
182 fQuantStatSwitch(kTRUE),
183 fStrongInterSwitch(kTRUE),
111e505b 184 fColWithResidNuclSwitch(kFALSE),
88cb7938 185 fNuclMass(0.0),
186 fNuclCharge(0.0),
187 fRandomPosition(kFALSE),
188 fRadius(0.0),
526c2bd5 189 fOneMinusLambda(0.0),
88cb7938 190 fPID1(0),
191 fPID2(0),
192 fSigma(0.0)
7f92929e 193{
88cb7938 194// Default Constructor
ae4a4473 195 if (fgLLWeights)
196 Fatal("AliHBTLLWeights","LLWeights already instatiated. Use AliHBTLLWeights::Instance()");
7f92929e 197}
88cb7938 198/**************************************************************/
7f92929e 199
111e505b 200AliHBTLLWeights::AliHBTLLWeights(const AliHBTLLWeights &/*source*/):
dd82cadc 201 AliHBTWeights(),
111e505b 202 fTest(kTRUE),
203 fColoumbSwitch(kTRUE),
204 fQuantStatSwitch(kTRUE),
205 fStrongInterSwitch(kTRUE),
206 fColWithResidNuclSwitch(kFALSE),
207 fNuclMass(0.0),
208 fNuclCharge(0.0),
209 fRandomPosition(kFALSE),
210 fRadius(0.0),
526c2bd5 211 fOneMinusLambda(0.0),
111e505b 212 fPID1(0),
213 fPID2(0),
214 fSigma(0.0)
215{
216 //Copy ctor needed by the coding conventions but not used
217 Fatal("AliHBTLLWeights","copy ctor not implemented");
218}
219/************************************************************/
220
221AliHBTLLWeights& AliHBTLLWeights::operator=(const AliHBTLLWeights& /*source*/)
222{
223 //Assignment operator needed by the coding conventions but not used
224 Fatal("AliHBTLLWeights","assignment operator not implemented");
225 return * this;
226}
227/************************************************************/
228
4fdf4eb3 229AliHBTLLWeights* AliHBTLLWeights::Instance()
88cb7938 230{
231// returns instance of class
232 if (fgLLWeights)
233 {
4fdf4eb3 234 return fgLLWeights;
88cb7938 235 }
236 else
237 {
238 fgLLWeights = new AliHBTLLWeights();
239 return fgLLWeights;
240 }
241}
526c2bd5 242/************************************************************/
7f92929e 243
dd82cadc 244void AliHBTLLWeights::Set()
245{
246 //sets this as weighitng class
247 Info("Set","Setting Lednicky-Lyuboshitz as Weighing Class");
248
249 if ( fgWeights == 0x0 )
250 {
251 fgWeights = AliHBTLLWeights::Instance();
252 return;
253 }
254 if ( fgWeights == AliHBTLLWeights::Instance() ) return;
255 delete fgWeights;
256 fgWeights = AliHBTLLWeights::Instance();
257}
258/************************************************************/
259
7f92929e 260Double_t AliHBTLLWeights::GetWeight(const AliHBTPair* partpair)
261{
88cb7938 262// calculates weight for a pair
37e71815 263 static const Double_t kcmtofm = 1.e13;
264 static const Double_t kcmtoOneOverGeV = kcmtofm*fgkWcons;
88cb7938 265
4fdf4eb3 266 AliHBTParticle *part1 = partpair->Particle1();
267 AliHBTParticle *part2 = partpair->Particle2();
2f8eea63 268
4fdf4eb3 269 if ( (part1 == 0x0) || (part2 == 0x0))
88cb7938 270 {
271 Error("GetWeight","Null particle pointer");
272 return 0.0;
273 }
274
275
526c2bd5 276//takes a lot of time
4fdf4eb3 277 if ( (part1->Px() == part2->Px()) &&
278 (part1->Py() == part2->Py()) &&
279 (part1->Pz() == part2->Pz()) )
88cb7938 280 {
281 return 0.0;
282 }
283
4fdf4eb3 284 if ((!fRandomPosition) &&
88cb7938 285 (part1->Vx() == part2->Vx()) &&
286 (part1->Vy() == part2->Vy()) &&
287 (part1->Vz() == part2->Vz()) )
2f8eea63 288 {
4fdf4eb3 289 return 0.0;
2f8eea63 290 }
88cb7938 291
526c2bd5 292 if(fOneMinusLambda)//implemetation of non-zero intetcept parameter
293 {
294 if( gRandom->Rndm() < fOneMinusLambda ) return 1.0;
295 }
296
88cb7938 297 FSI_MOM.P1X = part1->Px();
298 FSI_MOM.P1Y = part1->Py();
299 FSI_MOM.P1Z = part1->Pz();
300
301 FSI_MOM.P2X = part2->Px();
302 FSI_MOM.P2Y = part2->Py();
303 FSI_MOM.P2Z = part2->Pz();
304
37e71815 305 FSI_COOR.X1 = part1->Vx()*kcmtoOneOverGeV;
306 FSI_COOR.Y1 = part1->Vy()*kcmtoOneOverGeV;
307 FSI_COOR.Z1 = part1->Vz()*kcmtoOneOverGeV;
88cb7938 308 FSI_COOR.T1 = part1->T();
309
37e71815 310 FSI_COOR.X2 = part2->Vx()*kcmtoOneOverGeV;
311 FSI_COOR.Y2 = part2->Vy()*kcmtoOneOverGeV;
312 FSI_COOR.Z2 = part2->Vz()*kcmtoOneOverGeV;
88cb7938 313 FSI_COOR.T2 = part2->T();
4fdf4eb3 314
315 ltran12();
7f92929e 316
88cb7938 317 //this must be after ltran12 because it would overwrite what we set below
318 if (fRandomPosition)
319 {
320 Double_t rxcm = fSigma*gRandom->Gaus();
321 Double_t rycm = fSigma*gRandom->Gaus();
322 Double_t rzcm = fSigma*gRandom->Gaus();
323
324 FSI_PRF.X=rxcm*fgkWcons;
325 FSI_PRF.Y=rycm*fgkWcons;
326 FSI_PRF.Z=rzcm*fgkWcons;
327 FSI_PRF.T=0.;
328
329 Double_t rps=rxcm*rxcm+rycm*rycm+rzcm*rzcm;
330 Double_t rp=TMath::Sqrt(rps);
331 setpdist(rp);
332 }
333
334 fsiw();
4fdf4eb3 335 return LEDWEIGHT.WEIN;
336}
7f92929e 337/************************************************************/
88cb7938 338
7f92929e 339void AliHBTLLWeights::Init()
4fdf4eb3 340{
88cb7938 341//initial parameters of model
342
4fdf4eb3 343 FSI_NS.NS = fApproximationModel;
344
88cb7938 345 LEDWEIGHT.ITEST = fTest;
346 if(fTest)
347 {
348 FSI_NS.ICH = fColoumbSwitch;
349 FSI_NS.ISI = fStrongInterSwitch;
350 FSI_NS.IQS = fQuantStatSwitch;
351 FSI_NS.I3C = fColWithResidNuclSwitch;
352 LEDWEIGHT.IRANPOS = fRandomPosition;
353 }
354
4fdf4eb3 355 if ( (fPID1 == 0) || (fPID2 == 0) )
88cb7938 356 {
357 Fatal("Init","Particles types are not set");
358 return;//pro forma
359 }
4fdf4eb3 360 FSI_NS.LL = GetPairCode(fPID1,fPID2);
88cb7938 361
4fdf4eb3 362 if (FSI_NS.LL == 0)
88cb7938 363 {
364 Fatal("Init","Particles types are not supported");
365 return;//pro forma
366 }
367
368
4fdf4eb3 369 TParticlePDG* tpart1 = TDatabasePDG::Instance()->GetParticle(fPID1);
370 if (tpart1 == 0x0)
88cb7938 371 {
372 Fatal("init","We can not find particle with ID=%d in PDG DataBase",fPID1);
373 return;
374 }
375
4fdf4eb3 376 FSI_POC.AM1=tpart1->Mass();
377 FSI_POC.C1=tpart1->Charge();
88cb7938 378
4fdf4eb3 379 TParticlePDG* tpart2 = TDatabasePDG::Instance()->GetParticle(fPID2);
88cb7938 380//lv
4fdf4eb3 381 if (tpart2 == 0x0)
88cb7938 382 {
383 Fatal("init","We can not find particle with ID=%d in our DataBase",fPID2);
384 return;
385 }
386
4fdf4eb3 387 FSI_POC.AM2=tpart2->Mass();
388 FSI_POC.C1=tpart2->Charge();
88cb7938 389
4fdf4eb3 390 led_bldata();
391 fsiini();
88cb7938 392
393
394//constants for radii simulation
395
396 if(fRandomPosition)
397 {
398 fSigma =TMath::Sqrt(2.)*fRadius;
399 }
7f92929e 400}
88cb7938 401/************************************************************/
7f92929e 402
403Int_t AliHBTLLWeights::GetPairCode(const AliHBTPair* partpair)
404{
88cb7938 405//returns Code corresponding to that pair
406 return GetPairCode(partpair->Particle1()->GetPdgCode(),partpair->Particle2()->GetPdgCode());
7f92929e 407}
88cb7938 408/************************************************************/
7f92929e 409
410Int_t AliHBTLLWeights::GetPairCode(Int_t pid1,Int_t pid2)
411{
88cb7938 412// returns code corresponding to the pair of PIDs
413// pairCode 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
414// hpid: n p n alfa pi+ pi0 pi+ n p pi+ pi+ pi+ pi- K+ K+ K+ K- d d t t K0 K0 d p p p n
415// lpid: n p p alfa pi- pi0 pi+ d d K- K+ p p K- K+ p p d alfa t alfa K0 K0b t t alfa lambda lambda
416// NS=1 y/n: + + + + + - - - - - - - - - - - - - - - - - - - - - - -
417
418//alphas, deuterons and tyts are NOT supported here
419
7f92929e 420 Int_t chargefactor = 1;
421 Int_t hpid; //pid in higher row
422 Int_t lpid; //pid in lower row
423 Int_t code; //pairCode
424
425 Bool_t swap;
426
88cb7938 427//determine the order of selcetion in switch
7f92929e 428 if (TMath::Abs(pid1) < TMath::Abs(pid2) )
88cb7938 429 {
430 if (pid1<0) chargefactor=-1;
431 hpid=pid2*chargefactor;
432 lpid=pid1*chargefactor;
433 swap = kFALSE;
434 }
7f92929e 435 else
88cb7938 436 {
437 if (pid2<0) chargefactor=-1;
438 hpid=pid1*chargefactor;
439 lpid=pid2*chargefactor;
440 swap = kTRUE;
441 }
442
443//mlv
444 hpid=pid1;
445 lpid=pid2;
446
447
448//Determine the pair code
7f92929e 449 switch (hpid) //switch on first particle id
88cb7938 450 {
451 case kNeutron:
7f92929e 452 switch (lpid)
88cb7938 453 {
454 case kNeutron:
455 code = 1; //neutron neutron
456 break;
457
458 case kProton:
459 code = 3; //neutron proton
460 break;
461
462 case kLambda0:
463 code = 28; //neutron lambda
464 break;
465
466 default:
467 return 0; //given pair not supported
468 break;
469 }
7f92929e 470 break;
88cb7938 471
472 case kProton:
7f92929e 473 switch (lpid)
88cb7938 474 {
475 case kProton:
476 code = 2; //proton proton
477 break;
478
479 case kLambda0:
480 code = 27;//proton lambda
481 break;
482
483 default:
484 return 0; //given pair not supported
485 break;
486
487 }
7f92929e 488 break;
88cb7938 489
490 case kPiPlus:
491
7f92929e 492 switch (lpid)
88cb7938 493 {
494 case kPiPlus:
495 code = 7; //piplus piplus
496 break;
497
498 case kPiMinus:
499 code = 5; //piplus piminus
500 break;
501
502 case kKMinus:
503 code = 10; //piplus Kminus
504 break;
505
506 case kKPlus:
507 code = 11; //piplus Kplus
508 break;
509
510 case kProton:
511 code = 12; //piplus proton
512 chargefactor*=-1;
513 break;
514
515 default:
516 return 0; //given pair not supported
517 break;
518 }
7f92929e 519 break;
88cb7938 520 case kPi0:
7f92929e 521 switch (lpid)
88cb7938 522 {
523 case kPi0:
524 code = 6;
525 break;
526
527 default:
528 return 0; //given pair not supported
529 break;
530 }
7f92929e 531 break;
532
88cb7938 533 case kKPlus:
7f92929e 534 switch (lpid)
88cb7938 535 {
536 case kKMinus:
537 code = 14; //Kplus Kminus
538 break;
539
540 case kKPlus:
541 code = 15; //Kplus Kplus
542 break;
543
544 case kProton:
545 code = 16; //Kplus proton
546 break;
547
548 default:
549 return 0; //given pair not supported
550 break;
551 }
7f92929e 552 break;
553
88cb7938 554 case kKMinus:
7f92929e 555 switch (lpid)
88cb7938 556 {
557 case kProton:
558 code = 17; //Kminus proton
559 chargefactor*=1;
560 break;
561
562 default:
563 return 0; //given pair not supported
564 break;
565 }
7f92929e 566 break;
567
88cb7938 568 case kK0:
7f92929e 569 switch (lpid)
88cb7938 570 {
571 case kK0:
572 code = 2; //Kzero Kzero
573 break;
574
575 case kK0Bar:
576 code = 17; //Kzero KzeroBar
577 break;
578
579 default:
580 return 0; //given pair not supported
581 break;
582 }
7f92929e 583 break;
88cb7938 584
585 default: return 0;
586 }
7f92929e 587 return code;
588}
88cb7938 589/************************************************************/
590
591void AliHBTLLWeights::SetTest(Bool_t rtest)
592{
593 //Sets fTest member
594 fTest = rtest;
595}
596/************************************************************/
597
598void AliHBTLLWeights::SetColoumb(Bool_t col)
599{
600 // (ICH in fortran code) Coulomb interaction between the two particles ON (OFF)
601 fColoumbSwitch = col;
602}
603/************************************************************/
604
605void AliHBTLLWeights::SetQuantumStatistics(Bool_t qss)
606{
607 //IQS: quantum statistics for the two particles ON (OFF)
608 //if non-identical particles automatically off
609 fQuantStatSwitch = qss;
610}
611/************************************************************/
612
613void AliHBTLLWeights::SetStrongInterSwitch(Bool_t sis)
614{
615 //ISI: strong interaction between the two particles ON (OFF)
616 fStrongInterSwitch = sis;
617}
618/************************************************************/
7f92929e 619
88cb7938 620void AliHBTLLWeights::SetColWithResidNuclSwitch(Bool_t crn)
621{
622 //I3C: Coulomb interaction with residual nucleus ON (OFF)
623 fColWithResidNuclSwitch = crn;
624}
625/************************************************************/
626
627void AliHBTLLWeights::SetApproxModel(Int_t ap)
628{
629 //sets Model of Approximation (NS in Fortran code)
630 fApproximationModel=ap;
631}
632/************************************************************/
633
634void AliHBTLLWeights::SetRandomPosition(Bool_t rp)
635{
636 //ON=kTRUE(OFF=kFALSE)
637 //ON -- calculation of the Gauss source radii
638 //if the generator don't allows the source generation (for example MeVSim)
639 //if ON the following parameters are requested:
640 fRandomPosition = rp;
641}
642/************************************************************/
643
644void AliHBTLLWeights::SetR1dw(Double_t R)
645{
646 //spherical source model radii
647 fRadius=R;
648}
649/************************************************************/
650
651void AliHBTLLWeights::SetParticlesTypes(Int_t pid1, Int_t pid2)
652{
653 //set AliRoot particles types
654 fPID1 = pid1;
655 fPID2 = pid2;
656}
657/************************************************************/
658
659void AliHBTLLWeights::SetNucleusCharge(Double_t ch)
660{
661 // not used now (see comments in fortran code)
662 fNuclCharge=ch;
663}
664/************************************************************/
665
666void AliHBTLLWeights::SetNucleusMass(Double_t mass)
667{
668 // (see comments in fortran code)
669 fNuclMass=mass;
670}