6 #include "GaudiKernel/MsgStream.h"
13 #include "ATOOLS/Org/CXXFLAGS_PACKAGES.H"
19 #include "SHERPA/Main/Sherpa.H"
20 #include "SHERPA/Initialization/Initialization_Handler.H"
22 #include "ATOOLS/Phys/Variations.H"
24 #include "SHERPA/Tools/Variations.H"
26 #include "ATOOLS/Org/Exception.H"
27 #include "ATOOLS/Org/Run_Parameter.H"
35 #include "CLHEP/Random/RandFlat.h"
51 if (m_plugincode !=
"") {
52 compilePlugin(m_plugincode);
54 m_params.value().push_back(
"SHERPA_LDADD=Sherpa_iPlugin");
70 if (m_plugincode !=
"") {
71 compilePlugin(m_plugincode);
73 m_inputfiles[
"Base.yaml"] +=
"SHERPA_LDADD: Sherpa_iPlugin \n";
75 m_params.value().push_back(
"SHERPA_LDADD=Sherpa_iPlugin");
80 p_rndEngine = getRandomEngineDuringInitialize(
"SHERPA", m_randomSeed, m_dsid);
85 m_inputfiles[
"Base.yaml"] +=
"\nEVT_OUTPUT: 0 \n";
88 m_inputfiles[
"Base.yaml"] +=
"\nEVT_OUTPUT: 2 \n";
91 m_inputfiles[
"Base.yaml"] +=
"\nEVT_OUTPUT: 15 \n";
94 m_inputfiles[
"Base.yaml"] +=
"\nEVT_OUTPUT: 15 \n";
109 char**
argv =
new char*[2];
110 argv[0] =
new char[7];
111 argv[1] =
new char[34];
112 strcpy(
argv[0],
"Sherpa");
113 strcpy(
argv[1],
"RUNDATA: [Base.yaml, Sherpa.yaml]");
114 p_sherpa =
new SHERPA::Sherpa(
argc,
argv);
117 p_sherpa =
new SHERPA::Sherpa();
124 std::set_terminate(ATOOLS::Terminate);
125 std::set_unexpected(ATOOLS::Terminate);
127 signal(SIGSEGV,ATOOLS::HandleSignal);
128 signal(SIGINT,ATOOLS::HandleSignal);
129 signal(SIGPIPE,ATOOLS::HandleSignal);
130 signal(SIGBUS,ATOOLS::HandleSignal);
131 signal(SIGFPE,ATOOLS::HandleSignal);
132 signal(SIGABRT,ATOOLS::HandleSignal);
133 signal(SIGTERM,ATOOLS::HandleSignal);
134 signal(SIGXCPU,ATOOLS::HandleSignal);
135 signal(SIGUSR1,ATOOLS::HandleSignal);
138 p_sherpa->InitializeTheRun();
139 p_sherpa->InitializeTheEventHandler();
141 catch (
const ATOOLS::normal_exit&
exception) {
145 return StatusCode::FAILURE;
147 catch (
const ATOOLS::Exception&
exception) {
150 return StatusCode::FAILURE;
153 signal(SIGSEGV,ATOOLS::SignalHandler);
154 signal(SIGINT,ATOOLS::SignalHandler);
155 signal(SIGBUS,ATOOLS::SignalHandler);
156 signal(SIGFPE,ATOOLS::SignalHandler);
157 signal(SIGABRT,ATOOLS::SignalHandler);
158 signal(SIGTERM,ATOOLS::SignalHandler);
159 signal(SIGXCPU,ATOOLS::SignalHandler);
165 p_sherpa->InitializeTheRun(
argc,(
char **)
argv);
168 p_sherpa->InitializeTheEventHandler();
170 catch (
const ATOOLS::Exception&
exception) {
171 if (
exception.Class()==
"Matrix_Element_Handler" &&
exception.Type()==ATOOLS::ex::normal_exit) {
179 return StatusCode::FAILURE;
184 return StatusCode::FAILURE;
188 m_runinfo = std::make_shared<HepMC3::GenRunInfo>();
190 struct HepMC3::GenRunInfo::ToolInfo
generator = {
191 std::string(
"SHERPA"),
192 std::string(SHERPA_VERSION)+
"." + std::string(SHERPA_SUBVERSION),
193 std::string(
"Used generator")
197 return StatusCode::SUCCESS;
205 const EventContext& ctx = Gaudi::Hive::currentContext();
211 }
while (p_sherpa->GenerateOneEvent()==
false);
213 const size_t genEvents = ATOOLS::rpa->gen.NumberOfGeneratedEvents();
214 if (genEvents%1000==0) {
218 return StatusCode::SUCCESS;
224 if (!
event->run_info())
event->set_run_info(m_runinfo);
226 p_sherpa->FillHepMCEvent(*
event);
231 if (
event->weights().size()>2) {
232 double nominal =
event->weight(
"Weight");
233 for (
const auto&
name:
event->weight_names()) {
234 if (
name ==
"WeightNormalisation")
continue;
235 if (
name ==
"NTrials")
continue;
236 if (
name ==
"Weight")
continue;
237 if (
name ==
"NTrials")
continue;
238 if (std::abs(
event->weight(
name)) > m_variation_weight_cap*std::abs(nominal)) {
240 event->weight(
name) *= m_variation_weight_cap*std::abs(nominal)/std::abs(
event->weight(
name));
246 if (
event->weights().size()>2) {
247 for (
size_t i=0;
i<
event->weights().
size(); ++
i) {
250 if (std::abs(
event->weights()[
i]) > m_variation_weight_cap*std::abs(
event->weights()[0])) {
252 event->weights()[
i] *= m_variation_weight_cap*std::abs(
event->weights()[0])/std::abs(
event->weights()[
i]);
267 return StatusCode::SUCCESS;
274 std::cout <<
"MetaData: generator = Sherpa" << SHERPA_VERSION <<
"." << SHERPA_SUBVERSION << std::endl;
275 std::cout <<
"MetaData: cross-section (nb)= " << p_sherpa->TotalXS()/1000.0*m_xsscale << std::endl;
277 std::cout <<
"MetaData: PDF = " << p_sherpa->PDFInfo() << std::endl;
279 std::cout <<
"Named variations initialised by Sherpa:" << std::endl;
280 std::cout << *p_sherpa->GetInitHandler()->GetVariations() << std::endl;
282 p_sherpa->SummarizeRun();
286 ATH_MSG_INFO(
"Deleting left-over files from working directory.");
287 system(
"rm -rf Results.db Process MIG_*.db MPI_*.dat libSherpa*.so libProc*.so");
290 return StatusCode::SUCCESS;
296 std::vector<std::string>
params;
299 params.push_back(
"EXTERNAL_RNG=Atlas_RNG");
305 std::string verbose_arg;
308 params.push_back(
"OUTPUT=0");
310 else if(
log.level()==MSG::INFO){
311 params.push_back(
"OUTPUT=2");
314 params.push_back(
"OUTPUT=3");
317 params.push_back(
"OUTPUT=15");
321 if (m_runcard !=
"") m_params.value().push_back(
"RUNDATA=Run.dat");
327 if (m_runcard !=
"") {
328 FILE *
file = fopen(
"Run.dat",
"w");
329 fputs(m_runcard.value().c_str(),
file);
338 argv[0] =
new char[7];
339 strcpy(
argv[0],
"Sherpa");
349 ATH_MSG_INFO(
"Further Sherpa initialisation output will be redirected to the LOG_FILE specified above.");
356 FILE *
file = fopen(
"Sherpa_iPlugin.C",
"w");
357 fputs(pluginCode.c_str(),
file);
363 command +=
"tail -n +2 Sherpa_iPlugin.C | head -n -1 > Sherpa_iPlugin.C.tmp; mv Sherpa_iPlugin.C.tmp Sherpa_iPlugin.C; ";
364 command +=
"g++ -shared -std=c++0x -g ";
365 command +=
"-I`Sherpa-config --incdir` ";
366 command +=
"`Sherpa-config --ldflags` ";
367 command +=
"-I$FASTJETPATH/include ";
368 command +=
"-fPIC -o libSherpa_iPlugin.so Sherpa_iPlugin.C";
370 if (system(
command.c_str())!=0) {
381 External_RNG(), p_engine(engine), m_filename(
"Config.conf")
389 return CLHEP::RandFlat::shoot(
p_engine);
396 char alphabet[nMax] = {
'a',
'b',
'c',
'd',
'e',
'f',
'g',
397 'h',
'i',
'j',
'k',
'l',
'm',
'n',
398 'o',
'p',
'q',
'r',
's',
't',
'u',
399 'v',
'w',
'x',
'y',
'z' };
400 for (
size_t i = 0;
i < 6; ++
i) {
414 std::cout <<
"RNG state being saved to: " <<
m_filename << std::endl;
424 DECLARE_GETTER(
Atlas_RNG,
"Atlas_RNG",External_RNG,RNG_Key);
427 template <>
class Getter<External_RNG,RNG_Key,
Atlas_RNG,std::
less<std::string>>:
428 public Getter_Function<External_RNG,RNG_Key,std::less<std::string>> {
430 static Getter<External_RNG,RNG_Key,Atlas_RNG,std::less<std::string>>
s_initializer;
436 Getter_Function<External_RNG,RNG_Key,std::
less<std::string>>(
"Atlas_RNG")
440 ATOOLS::Getter<External_RNG,RNG_Key,Atlas_RNG>
441 ATOOLS::Getter<External_RNG,RNG_Key,Atlas_RNG>::s_initializer(
true);
447 void ATOOLS::Getter<External_RNG,RNG_Key,Atlas_RNG>::PrintInfo(std::ostream &
str,
const size_t)
const
448 {
str<<
"Atlas RNG interface"; }