17#include "GaudiKernel/MsgStream.h"
18#include "CLHEP/Random/RandFlat.h"
27#include "CRMChepevt.h"
29#include "CRMCinterface.h"
33static std::string epos_rndm_stream =
"EPOS_INIT";
34static CLHEP::HepRandomEngine* p_rndmEngine{};
39 return CLHEP::RandFlat::shoot(p_rndmEngine);
48extern "C" double dranf_(
int* dummy )
62extern "C" void ranfini_(
int* ,
int* ,
int* ) {}
70 r =
static_cast<float>(
dranf_( &dummy ) );
78 int idummy =
static_cast<int>( *dummy );
88 void crmc_init_f_(
double &m_degymx,
int &iSeed,
int &model,
int &itab,
int &itypout,
const char *paramFile,
const char *output,
int &lout);
90 void crmc_set_f_(
int &
nEvents,
double &beamMomentum,
double &targetMomentum,
int &primaryParticle,
int &targetParticle);
93 void crmc_f_(
int &iout,
int &ievent,
int &nParticles,
double &impactParam,
int &partPdg,
94 double &partPx,
double &partPy,
double &partPz,
double &partEnergy,
double &partMass,
int &outstat );
97 void crmc_xsection_f_(
double &xsigtot,
double &xsigine,
double &xsigela,
double &xsigdd,
98 double &xsigsd,
double &xsloela,
double &xsigtotaa,
double &xsigineaa,
double &xsigelaaa);
102Epos::Epos(
const std::string &name, ISvcLocator *pSvcLocator ):
106 epos_rndm_stream =
"EPOS_INIT";
145 ATH_MSG_INFO(
"signal_rocess_id 101-ND, 105-DD, 102-CD, 103 AB->XB, 104 AB->AX \n");
148 const long *sip = p_rndmEngine->getSeeds();
149 long int si1 = sip[0];
151 int iSeed = si1%1000000000;
158 epos_rndm_stream =
"EPOS";
162 return StatusCode::SUCCESS;
172 const EventContext& ctx = Gaudi::Hive::currentContext();
174 p_rndmEngine->setSeeds(seeds, 0);
177 const long *s = p_rndmEngine->getSeeds();
186 double impactParameter = -1.0;
192 return StatusCode::SUCCESS;
200 std::cout <<
"MetaData: generator = Epos " << std::endl;
203 double xsigtot, xsigine, xsigela, xsigdd, xsigsd, xsloela, xsigtotaa, xsigineaa, xsigelaaa;
204 xsigtot = xsigine = xsigela = xsigdd = xsigsd = xsloela = xsigtotaa = xsigineaa = xsigelaaa = 0.0;
206 crmc_xsection_f_(xsigtot, xsigine, xsigela, xsigdd, xsigsd, xsloela, xsigtotaa, xsigineaa, xsigelaaa);
209 std::cout <<
"MetaData: cross-section (nb) = " << xsigtot << std::endl;
211 std::cout <<
"MetaData: cross-section inelastic (cut + projectile diffraction)[nb] = " << xsigine << std::endl;
213 std::cout <<
"MetaData: cross-section elastic (includes target diffraction)[nb] = " << xsigela << std::endl;
215 std::cout <<
"MetaData: cross-section dd (nb) = " << xsigdd << std::endl;
217 std::cout <<
"MetaData: cross-section sd (nb) = " << xsigsd << std::endl;
221 return StatusCode::SUCCESS;
227 CRMChepevt<HepMC::GenParticlePtr, HepMC::GenVertexPtr, HepMC::FourVector, HepMC::GenEvent> hepevtconverter;
228 hepevtconverter.convert(*evt);
232 evt->weights().push_back(1.0);
233 m_runinfo = std::make_shared<HepMC3::GenRunInfo>();
234 std::vector<std::string> names = {
"Default"};
237 evt->set_units(HepMC3::Units::MEV, HepMC3::Units::MM);
239 std::vector<HepMC::GenParticlePtr> beams;
242 if (p->status() == 4) {
243 beams.push_back(std::move(p));
247 if (beams.size() >= 2) {
248 evt->set_beam_particles(beams[0], beams[1]);
250 ATH_MSG_INFO(
"EPOS event has only " << beams.size() <<
" beam particles" );
256 ion->Ncoll_hard=cevt_.kohevt;
257 ion->Npart_proj=cevt_.npjevt;
258 ion->Npart_targ=cevt_.ntgevt;
259 ion->Ncoll=cevt_.kolevt;
260 ion->spectator_neutrons=cevt_.npnevt + cevt_.ntnevt;
261 ion->spectator_protons=cevt_.nppevt + cevt_.ntpevt;
262 ion->N_Nwounded_collisions=-1;
263 ion->Nwounded_N_collisions=-1;
264 ion->Nwounded_Nwounded_collisions=-1;
265 ion->impact_parameter= cevt_.bimevt;
266 ion->event_plane_angle=cevt_.phievt;
267 ion->eccentricity=-1;
268 ion->sigma_inel_NN=1e9*hadr5_.sigine;
270 evt->set_heavy_ion(std::move(ion));
275 switch (
int(c2evt_.typevt))
277 case 1: sig_id = 101;
break;
278 case -1: sig_id = 101;
break;
279 case 2: sig_id = 105;
break;
280 case -2: sig_id = 105;
break;
281 case 3: sig_id = 102;
break;
282 case -3: sig_id = 102;
break;
283 case 4: sig_id = 103;
break;
284 case -4: sig_id = 104;
break;
285 default:
ATH_MSG_INFO(
"Signal ID not recognised for setting HEPEVT \n");
290 double xsigtot, xsigine, xsigela, xsigdd, xsigsd, xsloela, xsigtotaa, xsigineaa, xsigelaaa;
291 xsigtot = xsigine = xsigela = xsigdd = xsigsd = xsloela = xsigtotaa = xsigineaa = xsigelaaa = 0.0;
292 crmc_xsection_f_(xsigtot, xsigine, xsigela, xsigdd, xsigsd, xsloela, xsigtotaa, xsigineaa, xsigelaaa);
294 std::shared_ptr<HepMC3::GenCrossSection> xsec = std::make_shared<HepMC3::GenCrossSection>();
295 xsec->set_cross_section(xsigine, 0.0);
296 evt->set_cross_section(std::move(xsec));
298 return StatusCode::SUCCESS;
void crmc_f_(int &iout, int &ievent, int &nParticles, double &impactParam, int &partPdg, double &partPx, double &partPy, double &partPz, double &partEnergy, double &partMass, int &outstat)
double atl_epos_rndm_(int *)
double drangen_(double *dummy)
void crmc_set_f_(int &nEvents, double &beamMomentum, double &targetMomentum, int &primaryParticle, int &targetParticle)
void crmc_init_f_(double &m_degymx, int &iSeed, int &model, int &itab, int &itypout, const char *paramFile, const char *output, int &lout)
void crmc_xsection_f_(double &xsigtot, double &xsigine, double &xsigela, double &xsigdd, double &xsigsd, double &xsloela, double &xsigtotaa, double &xsigineaa, double &xsigelaaa)
double dranf_(int *dummy)
void ranfini_(int *, int *, int *)
ATLAS-specific HepMC functions.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
std::vector< double > m_partPy
std::vector< int > m_partStat
static const size_t kMaxParticles
std::vector< double > m_partPx
std::vector< double > m_partPz
virtual StatusCode genInitialize()
For initializing the generator, if required.
Epos(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< long int > m_seeds
std::vector< int > m_partID
virtual StatusCode genFinalize()
For finalising the generator, if required.
CRMCinterface * m_interface
virtual StatusCode fillEvt(HepMC::GenEvent *evt)
For filling the HepMC event object.
virtual StatusCode callGenerator()
For calling the generator on each iteration of the event loop.
std::vector< double > m_partEnergy
std::vector< double > m_partMass
GenModule(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
CLHEP::HepRandomEngine * getRandomEngineDuringInitialize(const std::string &streamName, unsigned long int randomSeedOffset, unsigned int conditionsRun=1, unsigned int lbn=1) const
IntegerProperty m_randomSeed
Seed for random number engine.
std::shared_ptr< HepMC3::GenRunInfo > m_runinfo
The run info for HepMC3.
void calculateSeedsMC21(long *seeds, const std::string &algName, uint64_t ev, uint64_t run, uint64_t offset=0)
Set the random seed using a string (e.g.
HepMC3::GenHeavyIonPtr GenHeavyIonPtr
void set_signal_process_id(GenEvent *e, const int i=0)
void set_random_states(GenEvent *e, std::vector< long int > &a)
void fillBarcodesAttribute(GenEvent *e)
HepMC3::GenEvent GenEvent