|
| 1 | +R__LOAD_LIBRARY(libUpcgenlib.so) |
| 2 | +R__ADD_INCLUDE_PATH($upcgen_ROOT/include) |
| 3 | + |
| 4 | +#include "UpcGenerator.h" |
| 5 | + |
| 6 | +// usage: o2-sim -n 100 -g external --configKeyValues 'GeneratorExternal.fileName=GeneratorUpcgen.C;GeneratorExternal.funcName=GeneratorUpcgen("kDiTau")' |
| 7 | + |
| 8 | +namespace o2 { |
| 9 | +namespace eventgen { |
| 10 | +class GeneratorUPCgen_class : public Generator { |
| 11 | +public: |
| 12 | + GeneratorUPCgen_class() { mUPCgen = new UpcGenerator(); }; |
| 13 | + ~GeneratorUPCgen_class() = default; |
| 14 | + void selectConfiguration(std::string val) { mSelectedConfiguration = val; }; |
| 15 | + void setLumiFileDirectory(std::string lumiFileDirectory) { |
| 16 | + mUPCgen->setLumiFileDirectory(lumiFileDirectory); |
| 17 | + }; |
| 18 | + void setCollisionSystem(float energyCM, int beamZ, int beamA) { |
| 19 | + eCM = energyCM; |
| 20 | + projZ = beamZ; |
| 21 | + projA = beamA; |
| 22 | + }; |
| 23 | + void setSeed(int seed) { mUPCgen->setSeed(seed); } |
| 24 | + |
| 25 | + // predefined generator configurations |
| 26 | + const static int nProcess = 5; |
| 27 | + const static int nElements = 9; |
| 28 | + const struct UpcgenConfig { |
| 29 | + std::string pnames[nElements]{"PROC_ID", "LEP_A", "ALP_MASS", |
| 30 | + "ALP_WIDTH", "PT_MIN", "ETA_MIN", |
| 31 | + "ETA_MAX", "FLUX_POINT", "BREAKUP_MODE"}; |
| 32 | + const struct definitions { |
| 33 | + const char *name; |
| 34 | + std::string elements[nElements]; |
| 35 | + } sets[nProcess] = { |
| 36 | + {"kDiElectron", |
| 37 | + {"11", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}}, |
| 38 | + {"kDiMuon", |
| 39 | + {"13", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}}, |
| 40 | + {"kDiTau", {"15", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}}, |
| 41 | + {"kLightByLight", |
| 42 | + {"22", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}}, |
| 43 | + {"kAxionLike", |
| 44 | + {"51", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}}}; |
| 45 | + } upcgenConfig; |
| 46 | + |
| 47 | + bool Config() { |
| 48 | + // select a specific set of parameters |
| 49 | + int idx = -1; |
| 50 | + for (int i = 0; i < nProcess; ++i) { |
| 51 | + if (mSelectedConfiguration.compare(upcgenConfig.sets[i].name) == 0) { |
| 52 | + idx = i; |
| 53 | + break; |
| 54 | + } |
| 55 | + } |
| 56 | + |
| 57 | + if (idx == -1) { |
| 58 | + std::cout << "UPCGEN process " << mSelectedConfiguration |
| 59 | + << " is not supported" << std::endl; |
| 60 | + return false; |
| 61 | + } |
| 62 | + |
| 63 | + // new generator |
| 64 | + mUPCgen->setDebugLevel(0); |
| 65 | + mUPCgen->setNumThreads(1); |
| 66 | + |
| 67 | + // update generator parameters - configure |
| 68 | + mUPCgen->setParameterValue("DO_PT_CUT", "1"); |
| 69 | + mUPCgen->setParameterValue("DO_ETA_CUT", "1"); |
| 70 | + mUPCgen->setParameterValue("USE_ROOT_OUTPUT", "0"); |
| 71 | + mUPCgen->setParameterValue("USE_HEPMC_OUTPUT", "0"); |
| 72 | + |
| 73 | + for (int i = 0; i < nElements; ++i) { |
| 74 | + mUPCgen->setParameterValue(upcgenConfig.pnames[i], |
| 75 | + upcgenConfig.sets[idx].elements[i]); |
| 76 | + } |
| 77 | + |
| 78 | + return true; |
| 79 | + } |
| 80 | + |
| 81 | + bool Init() override { |
| 82 | + Generator::Init(); |
| 83 | + |
| 84 | + // initialize the generator |
| 85 | + mUPCgen->init(); |
| 86 | + |
| 87 | + return true; |
| 88 | + }; |
| 89 | + |
| 90 | + bool generateEvent() override { |
| 91 | + if (!mUPCgen) { |
| 92 | + std::cout << "GenerateEvent: upcgen class/object not properly constructed" |
| 93 | + << std::endl; |
| 94 | + return false; |
| 95 | + } |
| 96 | + |
| 97 | + // generate a new event |
| 98 | + vector<int> pdgs; |
| 99 | + vector<int> statuses; |
| 100 | + vector<int> mothers; |
| 101 | + vector<TLorentzVector> particles; |
| 102 | + // events can be rejected due to applied cuts |
| 103 | + bool goon = true; |
| 104 | + while (goon) { |
| 105 | + auto stat = mUPCgen->generateEvent(pdgs, statuses, mothers, particles); |
| 106 | + if (stat == 0) { |
| 107 | + nRejected++; |
| 108 | + } else { |
| 109 | + nAccepted++; |
| 110 | + goon = false; |
| 111 | + } |
| 112 | + } |
| 113 | + |
| 114 | + return true; |
| 115 | + }; |
| 116 | + |
| 117 | + bool importParticles() override { |
| 118 | + std::cout << "\n"; |
| 119 | + auto upcgenParticles = mUPCgen->getParticles(); |
| 120 | + for (auto part : upcgenParticles) { |
| 121 | + part.Print(); |
| 122 | + TParticle particle(part.GetPdgCode(), 1, part.GetFirstMother(), -1, |
| 123 | + part.GetFirstDaughter(), part.GetLastDaughter(), |
| 124 | + part.Px(), part.Py(), part.Pz(), part.Energy(), 0., 0., |
| 125 | + 0., 0.); |
| 126 | + mParticles.push_back(particle); |
| 127 | + o2::mcutils::MCGenHelper::encodeParticleStatusAndTracking( |
| 128 | + mParticles.back(), true); |
| 129 | + } |
| 130 | + return true; |
| 131 | + }; |
| 132 | + |
| 133 | + long int acceptedEvents() { return nAccepted; } |
| 134 | + long int rejectedEvents() { return nRejected; } |
| 135 | + double fiducialXSection() { |
| 136 | + return mUPCgen->totNuclX() * nAccepted / (nAccepted + nRejected); |
| 137 | + } |
| 138 | + |
| 139 | +private: |
| 140 | + UpcGenerator *mUPCgen = 0x0; |
| 141 | + std::string mSelectedConfiguration = ""; |
| 142 | + |
| 143 | + // keep track of the rejected and accepted events |
| 144 | + long int nAccepted{0}; |
| 145 | + long int nRejected{0}; |
| 146 | + |
| 147 | + float eCM = 5020; |
| 148 | + int projZ = 82; |
| 149 | + int projA = 208; |
| 150 | +}; |
| 151 | + |
| 152 | +} // namespace eventgen |
| 153 | +} // namespace o2 |
| 154 | + |
| 155 | +FairGenerator *GeneratorUpcgen(std::string configuration = "kDiTau", |
| 156 | + std::string lumiFileDirectory = ".", |
| 157 | + float energyCM = 5020., int beamZ = 82, |
| 158 | + int beamA = 208) { |
| 159 | + // create generator |
| 160 | + auto gen = new o2::eventgen::GeneratorUPCgen_class(); |
| 161 | + |
| 162 | + // set generator parameters |
| 163 | + gen->selectConfiguration(configuration); |
| 164 | + gen->setLumiFileDirectory(lumiFileDirectory); |
| 165 | + gen->setCollisionSystem(energyCM, beamZ, beamA); |
| 166 | + |
| 167 | + // configure the generator |
| 168 | + cout << "Upcgen is initialized ..."; |
| 169 | + gen->Config(); |
| 170 | + cout << " config done ..."; |
| 171 | + gen->Init(); |
| 172 | + cout << " init done!\n"; |
| 173 | + |
| 174 | + return gen; |
| 175 | +} |
0 commit comments