Skip to content

Commit de4c4ab

Browse files
PWGDQ: add PbPb 5.36 TeV Bottomonia generator parameters (#2397)
* PWGDQ: add PbPb 5.36 TeV Bottomonia generator parameters * PWGDQ: add PbPb Bottomonia gap-trigger generator case * PWGDQ: fix PbPb bottomonia generator parameterization --------- Co-authored-by: Koushik Barai <iamkoushikb.com>
1 parent 1e7bf82 commit de4c4ab

2 files changed

Lines changed: 262 additions & 2 deletions

File tree

MC/config/PWGDQ/external/generator/GeneratorBottomonia.C

Lines changed: 259 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ R__ADD_INCLUDE_PATH($O2DPG_MC_CONFIG_ROOT/MC/config/PWGDQ/EvtGen)
66
R__LOAD_LIBRARY(libpythia6)
77
#include "GeneratorCocktail.C"
88
#include "GeneratorEvtGen.C"
9-
9+
// ==========================
10+
// === pp 13 TeV classes ====
11+
// ==========================
1012
namespace o2
1113
{
1214
namespace 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 ======

MC/config/PWGDQ/external/generator/generator_pythia8_withInjectedBottomoniaSignals_gaptriggered_dq.C

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ public:
2424
case 0: // generate bottomonia cocktail at forward rapidity
2525
mGeneratorParam = (Generator*)GeneratorCocktailBottomoniaToMuonEvtGen_pp13TeV();
2626
break;
27+
case 1: // generate bottomonia cocktail at FwdY for PbPb 5p36TeV
28+
mGeneratorParam = (Generator*)GeneratorCocktailBottomoniaToMuonEvtGen_PbPb5TeV();
29+
break;
2730
}
2831
mGeneratorParam->Init();
2932
}

0 commit comments

Comments
 (0)