14 const std::string& ModelConf_i,
15 const std::string& OutDirName_i,
16 const std::string& JobTag_i
18 : myInputParser(ModelF, ThObsF)
23 if (OutDirName_i !=
""){
36 MPI_Comm_rank(MPI_COMM_WORLD, &
rank);
37 MPI_Comm_size(MPI_COMM_WORLD, &
procnum);
48 boost::ptr_vector<Observable>().swap(
Obs);
63 gRandom->SetSeed(seed);
89 buff =
new double*[1];
90 buff[0] =
new double[1];
99 while (rem_iteration > 0) {
101 if (
rank < rem_iteration){
103 for (boost::ptr_vector<Observable>::iterator it =
Obs.begin(); it <
Obs.end(); it++) {
104 if (it->getObsType().compare(
"HiggsObservable") != 0) {
110 double hw = it->computeWeight();
111 std::vector<double> theoryValues;
112 it->getTheoryValues(theoryValues);
113 for (
int j = 0; j < it->getNTheoryValues() + 1 + it->getNChannels(); j++) {
120 for (std::vector<CorrelatedGaussianObservables>::iterator it1 =
CGO.begin(); it1 <
CGO.end(); it1++) {
121 std::vector<Observable> ObsInCGO = it1->getObs();
122 for (std::vector<Observable>::iterator it2 = ObsInCGO.begin(); it2 < ObsInCGO.end(); it2++) {
151 for (
int iproc = 0; iproc <
procnum; iproc++) {
154 for (std::vector<ModelParameter>::iterator it =
ModParsVar.begin(); it <
ModParsVar.end(); it++) {
158 if (
outputTerm == 0 && itno != 0) std::cout <<
"\nEvent No.: " << itno++ << std::endl;
159 else if (
outputTerm == 0 && itno++ == 0) std::cout <<
"\nThe central event is: " << std::endl;
160 if (
outputTerm == 0 &&
Obs.size() > 0) std::cout <<
"\nObservables: \n" << std::endl;
161 for (boost::ptr_vector<Observable>::iterator it =
Obs.begin(); it <
Obs.end(); it++) {
162 if (it->getObsType().compare(
"HiggsObservable") != 0) {
164 if (
weight && it->getDistr().compare(
"noweight") != 0) std::cout << it->getName() <<
" = " <<
buff[iproc][
positionID] <<
" (weight: " <<
buff_w[iproc][
positionID] <<
")" << std::endl;
165 else std::cout << it->getName() <<
" = " <<
buff[iproc][
positionID] << std::endl;
174 if (
weight) std::cout <<
"\n" << it->getName() <<
" :" <<
" (weight: " <<
buff_w[iproc][
positionID] <<
")" << std::endl;
175 else std::cout <<
"\n" << it->getName() <<
" :" << std::endl;
176 for (
int i = 0; i < it->getNTheoryValues(); i++) {
177 std::cout <<
" sigma(" << i + 1 <<
") = " <<
buff[iproc][
positionID] << std::endl;
182 for (
int i = it->getNTheoryValues() + 1; i < it->getNTheoryValues() + 1 + it->getNChannels(); i++) {
183 std::cout <<
" mu(" << i - (it->getNTheoryValues() + 1) + 1 <<
") = " <<
buff[iproc][
positionID] << std::endl;
187 for (
int i = 0; i < it->getNTheoryValues(); i++) {
193 for (
int i = it->getNTheoryValues() + 1; i < it->getNTheoryValues() + 1 + it->getNChannels(); i++) {
198 (*
ObsOut[it->getName()]) << std::endl;
202 if (
outputTerm == 0 &&
CGO.size() > 0) std::cout <<
"\nCorrelated Gaussian Observables: \n" << std::endl;
203 for (std::vector<CorrelatedGaussianObservables>::iterator it1 =
CGO.begin(); it1 <
CGO.end(); it1++) {
205 if (
weight && !(it1->isPrediction())) std::cout << it1->getName() <<
": (weight: " <<
buff_w[iproc][
positionID] <<
")" << std::endl;
206 else std::cout << it1->getName() << std::endl;
208 std::vector<Observable> ObsInCGO = it1->getObs();
209 for (std::vector<Observable>::iterator it2 = ObsInCGO.begin(); it2 < ObsInCGO.end(); it2++) {
211 if (
weight && it2->getDistr().compare(
"noweight") != 0) std::cout << it2->getName() <<
" = " <<
buff[iproc][
positionID] << std::endl;
212 else std::cout << it2->getName() <<
" = " <<
buff[iproc][
positionID] << std::endl;
229 for(
int iproc = 0; iproc <
procnum; iproc++){
230 it_comp = std::max(it_comp,
buff_int[iproc][0]);
232 rem_iteration -= it_comp;
237 for (std::vector<ModelParameter>::iterator it =
ModParsVar.begin(); it <
ModParsVar.end(); it++) {
238 ParsOut[it->getname()]->close();
240 for (boost::ptr_vector<Observable>::iterator it =
Obs.begin(); it <
Obs.end(); it++){
241 ObsOut[it->getName()]->close();
243 for (std::vector<CorrelatedGaussianObservables>::iterator it1 =
CGO.begin(); it1 <
CGO.end(); it1++){
244 CGOOut[it1->getName()]->close();
248 std::cout <<
"Output written to: " <<
OutDirName <<
"\n" << std::endl;
250 if (
rank == 0) std::cout << std::endl;
253 }
catch (std::string message) {
254 std::cerr << message << std::endl;
274 if (gSystem->GetPathInfo(
"GeneratedEvents", info) != 0) {
275 gSystem->MakeDirectory(
"GeneratedEvents");
277 if (gSystem->GetPathInfo(
"GeneratedEvents/DELETED", info) != 0) {
278 gSystem->MakeDirectory(
"GeneratedEvents/DELETED");
280 if (gSystem->GetPathInfo(
OutDirName.c_str(), info) == 0){
283 std::cout <<
"\nWARNING: Removed " <<
OldOutDirName << std::endl;
285 gSystem->Exec((
"mv -f " +
OutDirName +
" " +
"GeneratedEvents/DELETED/").c_str());
298 for (std::vector<ModelParameter>::iterator it =
ModParsVar.begin(); it <
ModParsVar.end(); it++) {
299 ParsOut[it->getname()] = boost::make_shared<std::ofstream>((
ParsDirName +
"/" + it->getname() +
".txt").c_str(), std::ios::out);
300 summary <<
"Parameter\t" << it->getname() <<
"\n";
303 for (boost::ptr_vector<Observable>::iterator it =
Obs.begin(); it <
Obs.end(); it++) {
304 ObsOut[it->getName()] = boost::make_shared<std::ofstream>((
ObsDirName +
"/" + it->getName() +
".txt").c_str(), std::ios::out);
305 if (
outputTerm != 0 && it->getObsType().compare(
"HiggsObservable") == 0) {
306 for (
int i = 0; i < it->getNTheoryValues(); i++) (*
ObsOut[it->getName()]) << std::setw(6) << std::left <<
"sigma(" << std::setw(1) << i << std::setw(3) << std::left <<
")";
307 (*
ObsOut[it->getName()]) << std::setw(10) << std::left <<
"BR";
308 for (
int i = it->getNTheoryValues() + 1; i < it->getNTheoryValues() + 1 + it->getNChannels(); i++) (*
ObsOut[it->getName()]) << std::setw(3) << std::left <<
"mu(" << std::setw(1) << i << std::setw(6) << std::left <<
")";
309 if (
weight) (*
ObsOut[it->getName()]) << std::setw(10) << std::left <<
"weight";
310 (*
ObsOut[it->getName()]) << std::endl;
312 summary <<
"Observable\t" << it->getName() <<
"\n";
314 for (std::vector<CorrelatedGaussianObservables>::iterator it =
CGO.begin(); it <
CGO.end(); it++){
315 CGOOut[it->getName()] = boost::make_shared<std::ofstream>((
CGODirName +
"/" + it->getName() +
".txt").c_str(), std::ios::out);
316 summary <<
"CGO\t" << it->getName() <<
"\n";
319 std::cout <<
"\nRunning in Event Generation mode..." << std::endl;
321 std::cout.precision(16);
322 std::cout <<
"\nRunning in Event Generation mode... \nWARNING: Output being sent to terminal, no data written to disk!!" << std::endl;
324 std::cout.precision(16);
325 std::cout << std::endl <<
"Running in Single Event mode...\nNo data will be written to disk!\n" << std::endl;
332 if (
Obs.size() == 0 &&
CGO.size() == 0) {
333 if (
rank == 0)
throw std::runtime_error(
"\nGenerateEvent::initModel(): No observables or correlated Gaussian observables defined in " +
ModelConf +
" file\n");
336 std::map<std::string, double> DP;
337 for (std::vector<ModelParameter>::iterator it =
ModPars.begin(); it <
ModPars.end(); it++) {
338 if (it->IsCorrelated()) {
339 for (
unsigned int i = 0; i <
CGP.size(); i++) {
340 if (
CGP[i].getName().compare(it->getCgp_name()) == 0) {
341 std::string index = it->getname().substr(
CGP[i].getName().size());
342 long int lindex = strtol(index.c_str(), NULL, 10);
343 if (lindex > 0) DP[
CGP[i].getPar(lindex - 1).getname()] =
CGP[i].getPar(lindex - 1).getave();
345 std::stringstream out;
346 out << it->getname();
347 throw std::runtime_error(
"GenerateEvents::initModel(): " + out.str() +
"seems to be part of a CorrelatedGaussianParameters object, but I couldn't find the corresponding object");
351 }
else DP[it->getname()] = it->getave();
355 if (
rank == 0) std::cout <<
"\nPlease set the following parameters in the model configuration files:\n" << std::endl;
357 if (
rank == 0) std::cout <<
"ModelParameter\t" << *it << std::endl;
359 std::cout << std::endl;
362 if (
rank == 0)
throw std::runtime_error(
"\nERROR: " +
ModelName +
" cannot be initialized");
366 for (std::vector<ModelParameter>::iterator it =
ModPars.begin(); it <
ModPars.end(); it++) {
367 if (it->geterrg() > 0. || it->geterrf() > 0.) {
368 if (std::find(unknownParameters.begin(), unknownParameters.end(), it->getname()) == unknownParameters.end())
ModParsVar.push_back(*it);
372 if (unknownParameters.size() > 0 &&
rank == 0) {
373 std::cout <<
"\n" << std::endl;
374 for (std::vector<std::string>::iterator it = unknownParameters.begin(); it != unknownParameters.end(); it++)
375 std::cout <<
"WARNING: unknown parameter " << *it <<
" in model initialization not added the Event Generation." << std::endl;
379 for (std::vector<CorrelatedGaussianObservables>::iterator it =
CGO.begin(); it <
CGO.end(); it++) {
382 for (boost::ptr_vector<Observable>::iterator it =
Obs.begin(); it <
Obs.end(); it++) {
383 if (it->getObsType().compare(
"HiggsObservable") == 0) {
384 buffersize += it->getNTheoryValues() + 1 + it->getNChannels();
392 if (
outputTerm == 0 &&
rank == 0) std::cout <<
"\nParameters varied in Event Generation:" << std::endl;
393 for (std::vector<ModelParameter>::const_iterator it =
ModParsVar.begin(); it <
ModParsVar.end(); it++) {
394 if (it->IsCorrelated()) {
395 for (
unsigned int i = 0; i <
CGP.size(); i++) {
396 if (
CGP[i].getName().compare(it->getCgp_name()) == 0) {
397 std::string index = it->getname().substr(
CGP[i].getName().size());
398 long int lindex = strtol(index.c_str(), NULL, 10);
400 if (
outputTerm == 0 &&
rank == 0) std::cout <<
CGP[i].getPar(lindex - 1).getname() <<
", ";
402 std::stringstream out;
403 out << it->getname();
404 throw std::runtime_error(
"MonteCarlo::Run(): " + out.str() +
"seems to be part of a CorrelatedGaussianParameters object, but I couldn't find the corresponding object");
408 }
else if (
outputTerm == 0 &&
rank == 0) std::cout << it->getname() <<
", ";
409 if (it->geterrf() == 0. && it->geterrg() != 0.) {
410 DDist[it->getname()] =
new TF1(it->getname().c_str(),
411 "1./sqrt(2.*TMath::Pi())/[1] * exp(-(x-[0])*(x-[0])/2./[1]/[1])",
412 it->getmin(), it->getmax());
413 DDist[it->getname()]->SetParameter(0, it->getave());
414 DDist[it->getname()]->SetParameter(1, it->geterrg());
415 }
else if (it->geterrg() == 0. && it->geterrf() != 0.) {
416 DDist[it->getname()] =
new TF1(it->getname().c_str(),
418 it->getmin(), it->getmax());
419 DDist[it->getname()]->SetParameter(0, it->getmin());
420 DDist[it->getname()]->SetParameter(1, it->getmax());
422 DDist[it->getname()] =
new TF1(it->getname().c_str(),
423 "(TMath::Erf((x-[0]+[2])/sqrt(2.)/[1])-TMath::Erf((x-[0]-[2])/sqrt(2.)/[1]))/4./[2]",
424 it->getmin(), it->getmax());
425 DDist[it->getname()]->SetParameter(0, it->getave());
426 DDist[it->getname()]->SetParameter(1, it->geterrg());
427 DDist[it->getname()]->SetParameter(2, it->geterrf());
436 std::vector<double> vec(
ModParsVar.size(), 0.);
437 for (
unsigned int i = 0; i < vec.size(); i++) {
438 if (iterationNo == 0) vec[i] =
ModParsVar[i].getave();
443 for (std::vector<ModelParameter>::const_iterator it =
ModParsVar.begin(); it <
ModParsVar.end(); it++) {
444 if (it->IsCorrelated()) {
445 for (
unsigned int i = 0; i <
CGP.size(); i++) {
446 if (
CGP[i].getName().compare(it->getCgp_name()) == 0) {
447 std::string index = it->getname().substr(
CGP[i].getName().size());
448 long int lindex = strtol(index.c_str(), NULL, 10);
454 std::stringstream out;
455 out << it->getname();
456 throw std::runtime_error(
"MonteCarlo::Run(): " + out.str() +
"seems to be part of a CorrelatedGaussianParameters object, but I couldn't find the corresponding object");
470 std::map<std::string, std::vector<double> > cgpmap;
473 for (std::vector<ModelParameter>::const_iterator it =
ModParsVar.begin(); it <
ModParsVar.end(); it++) {
475 if (it->IsCorrelated()) {
476 std::string index = it->getname().substr(it->getCgp_name().size());
477 unsigned long int lindex = strtol(index.c_str(), NULL, 10);
478 if (lindex - 1 == cgpmap[it->getCgp_name()].size()) cgpmap[it->getCgp_name()].push_back(parameters[k]);
480 std::stringstream out;
481 out << it->getname() <<
" " << lindex;
482 throw std::runtime_error(
"GenerateEvent::setDParsFromParameters(): " + out.str() +
"seems to be a CorrelatedGaussianParameters object but the corresponding parameters are missing or not in the right order");
485 }
else DPars_i[it->getname()] = parameters[k];
489 for (
unsigned int j = 0; j <
CGP.size(); j++) {
490 std::vector<double> current = cgpmap.at(
CGP[j].getName());
491 if (current.size() !=
CGP[j].getPars().size()) {
492 std::stringstream out;
493 out <<
CGP[j].getName();
494 throw std::runtime_error(
"GenerateEvent::setDParsFromParameters(): " + out.str() +
" appears to be represented in cgpmap with a wrong size");
497 std::vector<double> porig =
CGP[j].getOrigParsValue(current);
499 for (
unsigned int l = 0; l < porig.size(); l++) {
500 DPars_i[
CGP[j].getPar(l).getname()] = porig[l];