@@ -6,7 +6,9 @@ R__ADD_INCLUDE_PATH($O2DPG_MC_CONFIG_ROOT/MC/config/PWGDQ/EvtGen)
66R__LOAD_LIBRARY (libpythia6 )
77#include "GeneratorCocktail.C"
88#include "GeneratorEvtGen.C"
9-
9+ // ==========================
10+ // === pp 13 TeV classes ====
11+ // ==========================
1012namespace o2
1113{
1214namespace eventgen
@@ -277,4 +279,259 @@ FairGenerator* GeneratorCocktailBottomoniaToMuonEvtGen_pp13TeV()
277279 genCocktailEvtGen -> SetForceDecay (kEvtDiMuon );
278280
279281 return genCocktailEvtGen ;
280- }
282+ }
283+ // === END OF pp13tev CLASSES =====
284+
285+ // ================================
286+ // ==== PbPb 5.36 TeV classes =====
287+ // ================================
288+ namespace o2
289+ {
290+ namespace eventgen
291+ {
292+ /////////////////////////////////////////////////////////////////////////////
293+ class O2_GeneratorParamUpsilon1SFwdY_PbPb5TeV : public GeneratorTGenerator
294+ {
295+ public :
296+ O2_GeneratorParamUpsilon1SFwdY_PbPb5TeV () : GeneratorTGenerator ("ParamUpsilon1S_PbPb5TeV" )
297+ {
298+ paramUpsilon1S = new GeneratorParam (1 , -1 , PtUpsilon1SPbPb5TeV , YUpsilon1SPbPb5TeV , V2Upsilon1SPbPb5TeV , IpUpsilon1SPbPb5TeV );
299+ paramUpsilon1S -> SetMomentumRange (0. , 1.e6 );
300+ paramUpsilon1S -> SetPtRange (0 , 999. );
301+ paramUpsilon1S -> SetYRange (-4.2 , -2.3 ); // ALICE muon spectrometer
302+ paramUpsilon1S -> SetPhiRange (0. , 360. );
303+ paramUpsilon1S -> SetDecayer (new TPythia6Decayer ());
304+ paramUpsilon1S -> SetForceDecay (kNoDecay ); // left undecayed for EvtGen
305+ setTGenerator (paramUpsilon1S );
306+ };
307+
308+ ~O2_GeneratorParamUpsilon1SFwdY_PbPb5TeV () { delete paramUpsilon1S ; };
309+
310+ Bool_t Init () override
311+ {
312+ GeneratorTGenerator ::Init ();
313+ paramUpsilon1S -> Init ();
314+ return true;
315+ }
316+ void SetNSignalPerEvent (Int_t nsig ) { paramUpsilon1S -> SetNumberParticles (nsig ); }
317+
318+ static Double_t PtUpsilon1SPbPb5TeV (const Double_t * px , const Double_t * /*dummy*/ )
319+ {
320+ // Upsilon(1S) pT in PbPb at 5.36 TeV
321+ // Parameterized from pp LHCb 13 TeV (arXiv:1804.09214) scaled to PbPb 5.36 TeV
322+ // NOTE: should be updated once dedicated ALICE PbPb 5.36 TeV tuning is available
323+ Double_t x = * px ;
324+ Float_t p0 , p1 , p2 , p3 ;
325+ p0 = 3.68558e+02 ;
326+ p1 = 9.15000e+00 ; // softer than pp 13TeV (p1=10.31) reflecting PbPb medium
327+ p2 = 1.62309e+00 ;
328+ p3 = 4.84709e+00 ;
329+ return (p0 * x / TMath ::Power (1. + TMath ::Power (x / p1 , p2 ), p3 ));
330+ }
331+
332+
333+ //-------------------------------------------------------------------------//
334+ static Double_t YUpsilon1SPbPb5TeV (const Double_t * py , const Double_t * /*dummy*/ )
335+ {
336+ // Upsilon(1S) y in PbPb at 5.36 TeV
337+ // Based on LHCb pp 13 TeV shape (arXiv:1804.09214), reasonable for PbPb forward y
338+ Double_t x = * py ;
339+ Float_t p0 , p1 ;
340+ p0 = 3.07931e+03 ;
341+ p1 = -3.53102e-02 ;
342+ return (p0 * (1. + p1 * x * x ));
343+ }
344+
345+ //-------------------------------------------------------------------------//
346+ static Double_t V2Upsilon1SPbPb5TeV (const Double_t * /*dummy*/ , const Double_t * /*dummy*/ )
347+ {
348+ // Upsilon(1S) v2 - set to 0, can be updated with measurement
349+ return 0. ;
350+ }
351+ //-------------------------------------------------------------------------//
352+ static Int_t IpUpsilon1SPbPb5TeV (TRandom * )
353+ {
354+ return 553 ; // PDG code Upsilon(1S)
355+ }
356+
357+ private :
358+ GeneratorParam * paramUpsilon1S = nullptr ;
359+ };
360+ /////////////////////////////////////////////////////////////////////////////
361+ class O2_GeneratorParamUpsilon2SFwdY_PbPb5TeV : public GeneratorTGenerator
362+ {
363+
364+ public :
365+ O2_GeneratorParamUpsilon2SFwdY_PbPb5TeV ()
366+ : GeneratorTGenerator ("ParamUpsilon2S_PbPb5TeV" )
367+ {
368+ paramUpsilon2S = new GeneratorParam (1 , -1 , PtUpsilon2SPbPb5TeV , YUpsilon2SPbPb5TeV , V2Upsilon2SPbPb5TeV , IpUpsilon2SPbPb5TeV );
369+ paramUpsilon2S -> SetMomentumRange (0. , 1.e6 );
370+ paramUpsilon2S -> SetPtRange (0 , 999. );
371+ paramUpsilon2S -> SetYRange (-4.2 , -2.3 );
372+ paramUpsilon2S -> SetPhiRange (0. , 360. );
373+ paramUpsilon2S -> SetDecayer (new TPythia6Decayer ());
374+ paramUpsilon2S -> SetForceDecay (kNoDecay );
375+ setTGenerator (paramUpsilon2S );
376+ };
377+
378+ ~O2_GeneratorParamUpsilon2SFwdY_PbPb5TeV () { delete paramUpsilon2S ; };
379+
380+ Bool_t Init () override
381+ {
382+ GeneratorTGenerator ::Init ();
383+ paramUpsilon2S -> Init ();
384+ return true;
385+ }
386+
387+ void SetNSignalPerEvent (Int_t nsig ) { paramUpsilon2S -> SetNumberParticles (nsig ); }
388+
389+ //-------------------------------------------------------------------------//
390+ static Double_t PtUpsilon2SPbPb5TeV (const Double_t * px , const Double_t * /*dummy*/ )
391+ {
392+ // Upsilon(2S) pT in PbPb at 5.36 TeV
393+ // Scaled from LHCb pp 13 TeV (arXiv:1804.09214)
394+ // NOTE: should be updated once dedicated ALICE PbPb 5.36 TeV tuning is available
395+ Double_t x = * px ;
396+ Float_t p0 , p1 , p2 , p3 ;
397+ p0 = 7.29541e+01 ;
398+ p1 = 1.30000e+01 ; // scaled down from pp 13TeV (p1=14.81) for PbPb
399+ p2 = 1.50018e+00 ;
400+ p3 = 6.34208e+00 ;
401+ return (p0 * x / TMath ::Power (1. + TMath ::Power (x / p1 , p2 ), p3 ));
402+ }
403+
404+ //-------------------------------------------------------------------------//
405+ static Double_t YUpsilon2SPbPb5TeV (const Double_t * py , const Double_t * /*dummy*/ )
406+ {
407+ // Upsilon(2S) y in PbPb at 5.36 TeV
408+ Double_t x = * py ;
409+ Float_t p0 , p1 ;
410+ p0 = 7.50409e+02 ;
411+ p1 = -3.57039e-02 ;
412+ return (p0 * (1. + p1 * x * x ));
413+ }
414+
415+ //-------------------------------------------------------------------------//
416+ static Double_t V2Upsilon2SPbPb5TeV (const Double_t * /*dummy*/ , const Double_t * /*dummy*/ )
417+ {
418+ return 0. ;
419+ }
420+
421+ //-------------------------------------------------------------------------//
422+ static Int_t IpUpsilon2SPbPb5TeV (TRandom * )
423+ {
424+ return 100553 ; // PDG code Upsilon(2S)
425+ }
426+
427+ private :
428+ GeneratorParam * paramUpsilon2S = nullptr ;
429+ };
430+
431+ /////////////////////////////////////////////////////////////////////////////
432+ class O2_GeneratorParamUpsilon3SFwdY_PbPb5TeV : public GeneratorTGenerator
433+ {
434+ public :
435+ O2_GeneratorParamUpsilon3SFwdY_PbPb5TeV () : GeneratorTGenerator ("ParamUpsilon3S_PbPb5TeV" )
436+ {
437+ paramUpsilon3S = new GeneratorParam (1 , -1 , PtUpsilon3SPbPb5TeV , YUpsilon3SPbPb5TeV , V2Upsilon3SPbPb5TeV , IpUpsilon3SPbPb5TeV );
438+ paramUpsilon3S -> SetMomentumRange (0. , 1.e6 );
439+ paramUpsilon3S -> SetPtRange (0 , 999. );
440+ paramUpsilon3S -> SetYRange (-4.2 , -2.3 );
441+ paramUpsilon3S -> SetPhiRange (0. , 360. );
442+ paramUpsilon3S -> SetDecayer (new TPythia6Decayer ());
443+ paramUpsilon3S -> SetForceDecay (kNoDecay );
444+ setTGenerator (paramUpsilon3S );
445+ };
446+
447+ ~O2_GeneratorParamUpsilon3SFwdY_PbPb5TeV () { delete paramUpsilon3S ; };
448+
449+ Bool_t Init () override
450+ {
451+ GeneratorTGenerator ::Init ();
452+ paramUpsilon3S -> Init ();
453+ return true;
454+ }
455+
456+ void SetNSignalPerEvent (Int_t nsig ) { paramUpsilon3S -> SetNumberParticles (nsig ); }
457+
458+ //-------------------------------------------------------------------------//
459+ static Double_t PtUpsilon3SPbPb5TeV (const Double_t * px , const Double_t * /*dummy*/ )
460+ {
461+ // Upsilon(3S) pT in PbPb at 5.36 TeV
462+ // Scaled from LHCb pp 13 TeV (arXiv:1804.09214)
463+ // NOTE: should be updated once dedicated ALICE PbPb 5.36 TeV tuning is available
464+ Double_t x = * px ;
465+ Float_t p0 , p1 , p2 , p3 ;
466+ p0 = 3.14590e+01 ;
467+ p1 = 2.05000e+01 ; // scaled from pp 13TeV (p1=23.08) for PbPb
468+ p2 = 1.40822e+00 ;
469+ p3 = 9.38026e+00 ;
470+ return (p0 * x / TMath ::Power (1. + TMath ::Power (x / p1 , p2 ), p3 ));
471+ }
472+
473+ //-------------------------------------------------------------------------//
474+ static Double_t YUpsilon3SPbPb5TeV (const Double_t * py , const Double_t * /*dummy*/ )
475+ {
476+ // Upsilon(3S) y in PbPb at 5.36 TeV
477+ Double_t x = * py ;
478+ Float_t p0 , p1 ;
479+ p0 = 3.69961e+02 ;
480+ p1 = -3.54650e-02 ;
481+ return (p0 * (1. + p1 * x * x ));
482+ }
483+
484+ //-------------------------------------------------------------------------//
485+ static Double_t V2Upsilon3SPbPb5TeV (const Double_t * /*dummy*/ , const Double_t * /*dummy*/ )
486+ {
487+ return 0. ;
488+ }
489+
490+ //-------------------------------------------------------------------------//
491+ static Int_t IpUpsilon3SPbPb5TeV (TRandom * )
492+ {
493+ return 200553 ; // PDG code Upsilon(3S)
494+ }
495+
496+ private :
497+ GeneratorParam * paramUpsilon3S = nullptr ;
498+ };
499+
500+ } // namespace eventgen
501+ } // namespace o2
502+
503+ // ==================================
504+ // NEW COCKTAIL FUCNTION FOR PbPb ===
505+ // ==================================
506+
507+ FairGenerator * GeneratorCocktailBottomoniaToMuonEvtGen_PbPb5TeV ()
508+ {
509+ auto genCocktailEvtGen = new o2 ::eventgen ::GeneratorEvtGen < GeneratorCocktail > ( );
510+
511+ auto genUpsilon1S = new o2 ::eventgen ::O2_GeneratorParamUpsilon1SFwdY_PbPb5TeV ;
512+ genUpsilon1S -> SetNSignalPerEvent (1 );
513+
514+ auto genUpsilon2S = new o2 ::eventgen ::O2_GeneratorParamUpsilon2SFwdY_PbPb5TeV ;
515+ genUpsilon2S -> SetNSignalPerEvent (1 );
516+
517+ auto genUpsilon3S = new o2 ::eventgen ::O2_GeneratorParamUpsilon3SFwdY_PbPb5TeV ;
518+ genUpsilon3S -> SetNSignalPerEvent (1 );
519+
520+ genCocktailEvtGen -> AddGenerator (genUpsilon1S , 1 );
521+ genCocktailEvtGen -> AddGenerator (genUpsilon2S , 1 );
522+ genCocktailEvtGen -> AddGenerator (genUpsilon3S , 1 );
523+
524+ TString pdgs = "553;100553;200553" ;
525+ std ::string spdg ;
526+ TObjArray * obj = pdgs .Tokenize (";" );
527+ genCocktailEvtGen -> SetSizePdg (obj -> GetEntriesFast ());
528+ for (int i = 0 ; i < obj -> GetEntriesFast (); i ++ ) {
529+ spdg = obj -> At (i )-> GetName ();
530+ genCocktailEvtGen -> AddPdg (std ::stoi (spdg ), i );
531+ printf ("PDG %d \n" , std ::stoi (spdg ));
532+ }
533+ genCocktailEvtGen -> SetForceDecay (kEvtDiMuon ); // Υ → μ⁺μ⁻ via EvtGen
534+
535+ return genCocktailEvtGen ;
536+ }
537+ // ==== END of cocktail function ======
0 commit comments