Newer
Older
#include <iostream>
#include <cstring>
#include <string>
#include <sstream>
#include <vector>
// Boost header files go here
#include "boost/date_time/posix_time/posix_time.hpp"
#include "boost/logic/tribool.hpp"
#include "Examples/pbarpToOmegaPiLS/AbsOmegaPiEventListLS.hh"
#include "Examples/pbarpToOmegaPiLS/OmegaPiEventListLS.hh"
#include "Examples/pbarpToOmegaPiLS/OmegaTo3PiEventListLS.hh"
#include "Examples/pbarpToOmegaPiLS/OmegaPiHistLS.hh"
#include "Examples/pbarpToOmegaPiLS/pbarpToOmegaPi0StatesLS.hh"
#include "Examples/pbarpToOmegaPiLS/GArgumentParserLS.hh"
#include "Examples/pbarpToOmegaPiLS/MinuitstartparamLS.hh"
#include "Examples/pbarpToOmegaPiLS/AbsOmegaPiLhLS.hh"
#include "Examples/pbarpToOmegaPiLS/OmegaPiLhPi0GammaLS.hh"
#include "Examples/pbarpToOmegaPiLS/OmegaTo3PiLhPi0GammaLS.hh"
#include "Examples/pbarpToOmegaPiLS/OmegaTo3PiLhProdLS.hh"
#include "Examples/pbarpToOmegaPiLS/MOmegaPiFcnLS.hh"
#include "Examples/pbarpToOmegaPiLS/SpinDensityHistLS.hh"
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
// The individual that should be optimized
#include "Examples/pbarpToOmegaPiLS/GOmegaPiIndividualLS.hh"
#include "Setup/PwaEnv.hh"
#include "Particle/ParticleTable.hh"
#include "Particle/Particle.hh"
#include "Event/EventList.hh"
#include "Event/Event.hh"
#include "Event/CBElsaReader.hh"
#include "Particle/PdtParser.hh"
#include "ErrLogger/ErrLogger.hh"
#include "PwaUtils/AbsStates.hh"
//#include "PwaUtils/pbarpStatesLS.hh"
#include "PwaUtils/DataUtils.hh"
#include "Minuit2/MnUserParameters.h"
#include "Minuit2/MnMigrad.h"
#include "Minuit2/FunctionMinimum.h"
#include "Minuit2/MnMinos.h"
#include "Minuit2/MnStrategy.h"
// GenEvA header files go here
#include <courtier/GAsioHelperFunctions.hpp>
#include <courtier/GAsioTCPClientT.hpp>
#include <courtier/GAsioTCPConsumerT.hpp>
#include <geneva/GBrokerEA.hpp>
#include <geneva/GEvolutionaryAlgorithm.hpp>
#include <geneva/GIndividual.hpp>
#include <geneva/GMultiThreadedEA.hpp>
/************************************************************************************************/
//Namespace aliases, so we do not need to quote the entire namespace name
namespace gg = Gem::Geneva;
namespace gp = Gem::Pawian;
namespace gc = Gem::Courtier;
namespace rm = ROOT::Minuit2;
namespace bp = boost::posix_time;
namespace bl = boost::logic;
/************************************************************************************************/
/**
* This function constructs the path to the file.
*/
void constructPath(const std::string &thePrefix, const unsigned pbarMom, std::string &outFilePath)
{
std::stringstream sstrDatFile; //String Stream for die construction of the path to the parameter File;
sstrDatFile << thePrefix;
sstrDatFile.width(4);
sstrDatFile.fill('0');
sstrDatFile << right << pbarMom << ".dat";
outFilePath = sstrDatFile.str();
}
/************************************************************************************************/
/**
* This function checks if the file in the path theFilePath exists
*/
bool checkFileExist(const std::string &theFilePath)
{
ifstream datChk(theFilePath.c_str());
if (datChk) { return true; }
else { return false; }
}
//
// @param erlMode The desired error logging mode
//
void setErrLogMode( const ApplicationParameterLS::enErrLogMode& erlMode ) {
switch(erlMode) {
case ApplicationParameterLS::debug :
ErrLogger::instance()->setLevel(log4cpp::Priority::DEBUG);
break;
case ApplicationParameterLS::trace :
ErrLogger::instance()->setLevel(log4cpp::Priority::INFO);
break;
case ApplicationParameterLS::routine :
ErrLogger::instance()->setLevel(log4cpp::Priority::INFO);
break;
case ApplicationParameterLS::warning :
ErrLogger::instance()->setLevel(log4cpp::Priority::WARN);
break;
case ApplicationParameterLS::error :
ErrLogger::instance()->setLevel(log4cpp::Priority::ERROR);
break;
case ApplicationParameterLS::alert :
ErrLogger::instance()->setLevel(log4cpp::Priority::ALERT);
break;
default:
ErrLogger::instance()->setLevel(log4cpp::Priority::DEBUG);
}
}
void emitExecutionMode( const ApplicationParameterLS::enExecMode& execMode ) {
switch(execMode) {
case ApplicationParameterLS::GenEvA:
Info << "Using minimization algorithm: " << "GenEvA" << "\n" << endmsg;
break;
case ApplicationParameterLS::Minuit:
Info << "Using minimization algorithm: " << "Minuit" << "\n" << endmsg;
break;
case ApplicationParameterLS::GenToMinuit:
Info << "Using minimization algorithm: " << "First GenEvA then Minuit with final fit parameters from GenEvA" << "\n" << endmsg;
break;
case ApplicationParameterLS::SpinDensity:
Info << "Calculating Spin Density" << "\n" << endmsg;
break;
case ApplicationParameterLS::QAmode:
Info << "using QA mode" << "\n" << endmsg;
break;
case ApplicationParameterLS::StatesTest:
Info << "using StatesTest mode" << "\n" << endmsg;
break;
case ApplicationParameterLS::HistTest:
Info << "using HistTest mode" << "\n" << endmsg;
break;
case ApplicationParameterLS::ParamStreamTest:
Info << "using test mode for streaming fit parameter" << "\n" << endmsg;
break;
}
}
bool streamFitParam(ApplicationParameterLS& appParam, MinuitStartParamLS& theUserPar){
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
if ( !appParam.getPathStartParamFile().empty() )
{
ifstream theFile(appParam.getPathStartParamFile().c_str());
if (theFile)
{
Info << "Using start parameters from file " << appParam.getPathStartParamFile() << "\n" << endmsg;
theUserPar.ParseStream(theFile);
Info << "The parameters are: " << endmsg;
theUserPar.printParamMap(std::cout);
}
else
{
Warning << "Start parameter file " << appParam.getPathStartParamFile() << " not found!" << endmsg;
result=false;
}
}
else
{
Info << "Start parameter file has to be set!" << endmsg;
result=false;
}
return result;
}
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
bool streamFixMinuitParam(ApplicationParameterLS& appParam, std::vector<std::string>& paramNameVec){
bool result=true;
if ( !appParam.getMinuitFixParamFile().empty() )
{
ifstream theFile(appParam.getMinuitFixParamFile().c_str());
if (theFile)
{
Info << "Using file for fixing MINUIT paameters" << appParam.getMinuitFixParamFile() << "\n" << endmsg;
std::string strTmp;
while (!theFile.eof()){
theFile >> strTmp;
if(theFile.eof()) break;
paramNameVec.push_back(strTmp);
}
Info << "The parameters fixed in MINUIT are as follows: " << "\n" << endmsg;
std::vector<std::string>::const_iterator it;
for (it=paramNameVec.begin(); it != paramNameVec.end(); ++it){
Info << (*it) << endmsg;
}
}
else
{
Warning << "file for fixing MINUIT paameters " << appParam.getMinuitFixParamFile() << " not found!" << endmsg;
result=false;
}
}
else
{
Info << "file for fixing MINUIT paameters has to be set!" << endmsg;
result=false;
}
return result;
}
void states(boost::shared_ptr<const pbarpToOmegaPi0StatesLS> &theStates){
theStates->print(std::cout);
}
void printEvents(EventList& theEvtList, unsigned int nEvtParticles, unsigned int nEvents){
theEvtList.rewind();
Event* anEvent;
unsigned int evtCount = 0;
while ((anEvent = theEvtList.nextEvent()) != 0 && evtCount < nEvents) {
Info << "\n" << endmsg;
for (unsigned int i=0; i<nEvtParticles;++i){
Info << *(anEvent->p4(i)) << "\tm = " << anEvent->p4(i)->Mass() << "\n" << endmsg;
}
++evtCount;
}
theEvtList.rewind();
}
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
void histTest(boost::shared_ptr<const AbsOmegaPiEventListLS>& theEvtList, const std::string &thePathToRootFile){
OmegaPiHistLS(theEvtList, thePathToRootFile);
}
void paramStreamTest(ApplicationParameterLS& appParam, boost::shared_ptr<AbsOmegaPiLhLS> theOmLh){
rm::MnUserParameters upar;
MinuitStartParamLS theUserPar;
bool setFitParam=streamFitParam(appParam, theUserPar);
if (!setFitParam) Warning << "using default start parameter" << endmsg;
theOmLh->setMnUsrParams(upar, theUserPar);
std::vector<double> theMinuitparams=upar.Params();
Info << "\nminuit start parameters are:" << endmsg;
for (unsigned int i=0; i<theMinuitparams.size(); ++i){
std::cout << upar.GetName(i) << "\tvalue: " << upar.Value(i) << "\t error: " << upar.Error(i) << std::endl;
}
OmegaPiDataLS::fitParamVal theParamVal;
theOmLh->getFitParamVal(theParamVal, theMinuitparams);
theOmLh->printFitParams(std::cout, theParamVal);
Info << "dump the fit parameter if file streamTestFitStartParams.txt" << endmsg;
std::ofstream theStream ("streamTestFitStartParams.txt");
theOmLh->dumpCurrentResult(theStream, theParamVal);
Info << "get again new MnUserParameters from current OmegaPiDataLS::fitParamVal" << endmsg;
rm::MnUserParameters upar1;
theOmLh->setMnUsrParams(upar1, theParamVal);
Info << "\nminuit parameters are:" << endmsg;
std::cout << "upar1.Params().size()= " << upar1.Params().size() << std::endl;
for (unsigned int i=0; i<upar1.Params().size(); ++i){
std::cout << upar1.GetName(i) << "\tvalue: " << upar1.Value(i) << "\t error: " << upar1.Error(i) << std::endl;
}
Info << "create default MnUserParameters" << endmsg;
rm::MnUserParameters upar2;
theOmLh->setMnUsrParams(upar2);
std::cout << "upar2.Params().size()= " << upar2.Params().size() << std::endl;
for (unsigned int i=0; i<upar2.Params().size(); ++i){
std::cout << upar2.GetName(i) << "\tvalue: " << upar2.Value(i) << "\t error: " << upar2.Error(i) << std::endl;
}
}
bl::tribool Minuit(
ApplicationParameterLS &theAppParams
, OmegaPiDataLS::fitParamVal &fitParam
, boost::shared_ptr<AbsOmegaPiLhLS> &omegaPiLh
) {
Info << "Minuit fit starts.\n" << endmsg;
// get pbarpToOmegaPi0States pointer back
rm::MOmegaPiFcnLS mOmegaPiFcn(omegaPiLh);
rm::MnUserParameters upar;
if (streamParams){
MinuitStartParamLS theUserPar;
bool setFitParam=streamFitParam(theAppParams, theUserPar);
if (!setFitParam) Warning << "using default start parameter" << endmsg;
omegaPiLh->setMnUsrParams(upar, theUserPar);
}
else{
omegaPiLh->setMnUsrParams(upar, fitParam);
}
//now look if some parameters have to be fixed
std::vector<std::string> fixedParams;
if(streamFixMinuitParam(theAppParams, fixedParams)){
omegaPiLh->fixMnUsrParams(upar, fixedParams);
}
rm::MnMigrad migrad(mOmegaPiFcn, upar);
Info <<"start migrad "<< endmsg;
rm::FunctionMinimum min = migrad();
if(!min.IsValid()) {
//try with higher strategy
Info <<"FM is invalid, try with strategy = 2."<< endmsg;
rm::MnMigrad migrad2(mOmegaPiFcn, min.UserState(), rm::MnStrategy(2));
min = migrad2();
}
rm::MnUserParameters finalUsrParameters=min.UserParameters();
// fill fitParam with the final fit result
const std::vector<double> finalParamVec=finalUsrParameters.Params();
omegaPiLh->getFitParamVal(fitParam, finalParamVec);
cout << endl << "Final fit parameters:" << endl;
omegaPiLh->printFitParams(cout, fitParam);
cout << endl << "Errors:" << endl;
const vector<double> finalParamErrors=finalUsrParameters.Errors();
vector<double>::const_iterator it;
int i;
for (it = finalParamErrors.begin(), i=0; it < finalParamErrors.end(); it++,i++)
{
std::string strName =finalUsrParameters.GetName(i);
cout << "Name:" << strName << " ";
cout << "Index:" << finalUsrParameters.Index(strName) << " ";
cout << *it << endl;
}
return bl::tribool(true);
}
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
/*******************************************************************************************
*****/
/**
* The actual optimization procedure using the Geneva library collection. Note that this fun
ction
* will return a boost::logic::indeterminate value if this is a Geneva client in networked m
ode
*
* @return A boost::logic::tribool indicating whether the fit was successful or this is a cl
ient in networked mode
*/
bl::tribool GenEvA(
ApplicationParameterLS &theAppParams
, OmegaPiDataLS::fitParamVal &fitParm
, boost::shared_ptr<AbsOmegaPiLhLS> &omegaPiLh
) {
//--------------------------------------------------------------------------------------------
// First check whether this is a client in networked mode. We then just start the listener and
// return when it has finished.
if(theAppParams.getParallelizationMode()==2 && !theAppParams.getServerMode()) {
// Create a model that holds the static data needed for processing
boost::shared_ptr<gp::GOmegaPiIndividualLS> gopi_ptr( new gp::GOmegaPiIndividualLS(omegaPiLh) );
// boost::shared_ptr<gc::GAsioTCPClientT<gg::GIndividual> > p(
// new gc::GAsioTCPClientT<gg::GIndividual>(
// theAppParams.getIp()
// , boost::lexical_cast<std::string>(theAppParams.getPort())
// , gopi_ptr
// )
// );
// p->setMaxStalls(0); // An infinite number of stalled data retrievals
// p->setMaxConnectionAttempts(100); // Up to 100 failed connection attempts
// // Prevent return of unsuccessful mutation attempts to the server
// p->returnResultIfUnsuccessful(theAppParams.getReturnRegardless());
// // Start the actual processing loop
// p->run();
return bl::indeterminate;
}
//--------------------------------------------------------------------------------------------
Info << "GenEvA fit start.\n" << endmsg;
// Create the first set of parent individuals. Initialization of parameters is done randomly.
std::vector<boost::shared_ptr<gp::GOmegaPiIndividualLS> > parentIndividuals;
for(std::size_t p = 0 ; p<theAppParams.getNParents(); p++) {
boost::shared_ptr<gp::GOmegaPiIndividualLS> gopi_ptr( new gp::GOmegaPiIndividualLS(omegaPiLh) );
gopi_ptr->setProcessingCycles(theAppParams.getProcessingCycles());
// Make sure we start with a unique individual
gopi_ptr->randomInit();
parentIndividuals.push_back(gopi_ptr);
}
//----------------------------------------------------------------------------------------------
// We can now start creating populations. We refer to them through the base class
// This smart pointer will hold the different population types
boost::shared_ptr<GEvolutionaryAlgorithm> pop_ptr;
// Create the actual populations
switch (theAppParams.getParallelizationMode()) {
case 0: // Serial execution
{
// Create an empty population
pop_ptr = boost::shared_ptr<GEvolutionaryAlgorithm>(new GEvolutionaryAlgorithm());
}
break;
case 1: // Multi-threaded execution
{
// Create the multi-threaded population
boost::shared_ptr<GMultiThreadedEA> popPar_ptr(new GMultiThreadedEA());
// Population-specific settings
popPar_ptr->setNThreads(theAppParams.getNEvaluationThreads());
// Assignment to the base pointer
pop_ptr = popPar_ptr;
}
break;
case 2: // Networked execution (server-side)
{
// Create a network consumer and enrol it with the broker
boost::shared_ptr<gc::GAsioTCPConsumerT<gg::GIndividual> > gatc(new gc::GAsioTCPConsumerT<gg::GIndividual>(theAppParams.getPort()));
gatc->setSerializationMode(theAppParams.getSerMode());
GINDIVIDUALBROKER->enrol(gatc);
// Create the actual broker population
boost::shared_ptr<GBrokerEA> popBroker_ptr(new GBrokerEA());
popBroker_ptr->setWaitFactor(theAppParams.getWaitFactor());
// Assignment to the base pointer
pop_ptr = popBroker_ptr;
}
break;
}
//----------------------------------------------------------------------------------------------
// Now we have suitable populations and can fill them with data
// Add individuals to the population
for(std::size_t p = 0 ; p<theAppParams.getNParents(); p++) {
pop_ptr->push_back(parentIndividuals[p]);
}
// Specify some general population settings
pop_ptr->setDefaultPopulationSize(theAppParams.getPopulationSize(),theAppParams.getNParents());
pop_ptr->setMaxIteration(theAppParams.getMaxIterations());
pop_ptr->setMaxTime(boost::posix_time::minutes(theAppParams.getMaxMinutes()));
pop_ptr->setReportIteration(theAppParams.getReportIteration());
pop_ptr->setRecombinationMethod(theAppParams.getRScheme());
pop_ptr->setSortingScheme(theAppParams.getSmode());
// Do the actual optimization
pop_ptr->optimize();
for(std::size_t i=0; i<pop_ptr->size(); i++) {
std::cout << i << ": " << pop_ptr->at(i)->fitness() << std::endl;
}
//----------------------------------------------------------------------------------------------
boost::shared_ptr<gp::GOmegaPiIndividualLS> bestIndividual_ptr=pop_ptr->getBestIndividual<gp::GOmegaPiIndividualLS>();
bool fitParamsSet=bestIndividual_ptr->getFitParams(fitParm);
if (!fitParamsSet){
std::cout << "fit parameters could not set properly " << std::endl;
exit(0);
}
omegaPiLh=bestIndividual_ptr->omegaPiLhPtr();
Info << "GenEvA done.\n" << endmsg;
return bl::tribool(true);
}
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
bl::tribool QAmode(ApplicationParameterLS &theAppParams,
OmegaPiDataLS::fitParamVal &finalFitParm,
boost::shared_ptr<AbsOmegaPiLhLS> &finalOmegaPiLh
)
{
Info << "QA mode start.\n" << endmsg;
rm::MOmegaPiFcnLS mOmegaPiFcn(finalOmegaPiLh);
rm::MnUserParameters upar;
MinuitStartParamLS theUserPar;
bool setFitParam=streamFitParam(theAppParams, theUserPar);
if (!setFitParam){
Alert << "parameter file not found" << endmsg;
exit(0);
}
finalOmegaPiLh->setMnUsrParams(upar, theUserPar);
const std::vector<double> finalParamVec=upar.Params();
finalOmegaPiLh->getFitParamVal(finalFitParm, finalParamVec);
cout << endl << " fit parameters:" << endl;
finalOmegaPiLh->printFitParams(cout, finalFitParm);
return bl::tribool(true);
}
bl::tribool calcSpinDensity(ApplicationParameterLS &theAppParams,
boost::shared_ptr<AbsOmegaPiLhLS> finalOmegaPiLh,
OmegaPiDataLS::fitParamVal &finalFitParm)
{
Info << "Starting spin density calculation." << "\n" << endmsg;
OmegaPiDataLS::fitParamVal theParamVal;
rm::MOmegaPiFcnLS mOmegaPiFcn(finalOmegaPiLh);
rm::MnUserParameters upar;
MinuitStartParamLS theUserPar;
bool setFitParam=streamFitParam(theAppParams, theUserPar);
if (!setFitParam){
Alert << "parameter file not found" << endmsg;
exit(0);
}
finalOmegaPiLh->setMnUsrParams(upar, theUserPar);
finalOmegaPiLh->getFitParamVal(theParamVal, upar.Params());
Info << "Using following fit parameter:\n" << endmsg;
finalOmegaPiLh->printFitParams(std::cout, theParamVal);
std::ostringstream theSpinDensityRootFile;
if (theAppParams.getCalcAllSpindensity())
{
Info << "Calculating all spin density elements.\n" << endmsg;
theSpinDensityRootFile << "./" << theAppParams.getName() << "SpinDensity" << "_Lmax" << theAppParams.getLMax() << "_mom" << theAppParams.getPbarMom() << ".root";
SpinDensityHistLS theSpinDensityHist(theSpinDensityRootFile.str(), finalOmegaPiLh, theParamVal);
theSpinDensityHist.createHistograms();
}
else
{
Info << "Calculating spin density elements for M=" << theAppParams.getM() << " M'=" << theAppParams.getM_() << ".\n" << endmsg;
theSpinDensityRootFile << "./" << theAppParams.getName() << "SpinDensity_M1" << theAppParams.getM() << "_M2" << theAppParams.getM_() << "_Lmax" << theAppParams.getLMax() << "_mom" << theAppParams.getPbarMom() << ".root";
SpinDensityHistLS theSpinDensityHist(theSpinDensityRootFile.str(), finalOmegaPiLh, theParamVal);
theSpinDensityHist.createHistogram(theAppParams.getM(),theAppParams.getM_());
}
Info << "Spin density calculation done." << "\n" << endmsg;
return bl::tribool(false);
}
int main(int __argc,char *__argv[]){
// Parse the command line
static ApplicationParameterLS theAppParams(__argc, __argv);
// Set the desired error logging mode
setErrLogMode(theAppParams.getErrLogMode());
// Inform the audience about the execution mode
emitExecutionMode(theAppParams.getAppExecMode());
std::string theCfgFile = theAppParams.getConfigFile();
Info << "The path to config file is " << theCfgFile << "\n" << endmsg;
Info << "Maximum orbital momentum content: " << theAppParams.getLMax() << endmsg;
Info << "pbar momentum: " << theAppParams.getPbarMom() << endmsg;
std::string theFixParamMinuitFile = theAppParams.getMinuitFixParamFile();
Info << "\n" << "The path to file for fixing MINUIT parameters is " << theFixParamMinuitFile << "\n" << endmsg;
int lmax=theAppParams.getLMax();
boost::shared_ptr<const pbarpToOmegaPi0StatesLS> pbarpToOmegaPi0StatesPtr(new pbarpToOmegaPi0StatesLS(lmax));
if (theAppParams.getAppExecMode()==ApplicationParameterLS::StatesTest){
states(pbarpToOmegaPi0StatesPtr);
exit(1);
}
std::string piomegaDatFile=theAppParams.dataFile();
std::string piomegaMcFile=theAppParams.mcFile();
Info << "data file: " << piomegaDatFile << endmsg;
Info << "mc file: " << piomegaMcFile << endmsg;
int nParticlesPerEvt=0;
bool readWeightData=true;
if (theAppParams.getLhMode()=="OmegaPiLhGamma" || (theAppParams.getLhMode()=="OmegaPiLhGammaBw") ){
nParticlesPerEvt=3;
}
else if (theAppParams.getLhMode()=="OmegaTo3PiLhGamma" || (theAppParams.getLhMode()=="OmegaTo3PiLhProd") || (theAppParams.getLhMode()=="OmegaTo3PiLhGammaBw")){
nParticlesPerEvt=4;
}
else {
Alert << "LhMode: " << theAppParams.getLhMode() << " does not exist!!!" << endmsg;
exit(0);
}
if (checkFileExist(piomegaDatFile)){
Info << "Using Data file " << piomegaDatFile << endmsg;
Alert <<"Data file for pbarMom= " << theAppParams.getPbarMom() << " not available !" << endmsg;
Alert << "File " << piomegaDatFile << " is missing !" << endmsg;
exit(1);
if (checkFileExist(piomegaMcFile)){
Info << "Using Monte Carlo file " << piomegaMcFile << endmsg;
Alert <<"Monte Carlo file for pbarMom= " << theAppParams.getPbarMom() << "not available !" << endmsg;
Alert << "File " << piomegaMcFile << " is missing !" << endmsg;
exit(1);
Info << "data file: " << piomegaDatFile << endmsg;
Info << "mc file: " << piomegaMcFile << endmsg;
ParticleTable pTable;
PdtParser parser;
std::string theSourcePath=getenv("CMAKE_SOURCE_DIR");
std::string pdtFile(theSourcePath+"/Particle/pdt.table");
if (!parser.parse(pdtFile, pTable)) {
Alert << "Error: could not parse " << pdtFile << endmsg;
exit(1);
}
std::vector<std::string> fileNames;
fileNames.push_back(piomegaDatFile);
EventList theDataEventList;
boost::shared_ptr<CBElsaReader> eventReaderPtr;
std::vector<std::string> fileNamesMc;
fileNamesMc.push_back(piomegaMcFile);
boost::shared_ptr<CBElsaReader> eventReaderMCPtr;
EventList theMcEventList;
eventReaderPtr = boost::shared_ptr<CBElsaReader>(new CBElsaReader(fileNames,nParticlesPerEvt, 0, readWeightData));
eventReaderPtr->fillAll(theDataEventList);
Info << "\nFile has " << theDataEventList.size() << " events. Each event has "
<< theDataEventList.nextEvent()->size() << " final state particles.\n" << endmsg;
if (!theDataEventList.findParticleTypes(pTable)) {
Warning << "could not find all particles" << endmsg;
}
theDataEventList.rewind();
Info << "\nThe first data events are: " << endmsg;
printEvents(theDataEventList,nParticlesPerEvt , 20);
eventReaderMCPtr= boost::shared_ptr<CBElsaReader>(new CBElsaReader(fileNamesMc, nParticlesPerEvt, 0));
eventReaderMCPtr->fillAll(theMcEventList);
theMcEventList.rewind();
Info << "\nThe first MC events are: " << endmsg;
printEvents(theMcEventList,nParticlesPerEvt , 20);
std::ostringstream theRootFilePath;
boost::shared_ptr<const AbsOmegaPiEventListLS> theOmegaPiEventPtr;
if (theAppParams.getLhMode()=="OmegaPiLhGamma" || (theAppParams.getLhMode()=="OmegaPiLhGammaBw") ){
theOmegaPiEventPtr = boost::shared_ptr<const AbsOmegaPiEventListLS>(new OmegaPiEventListLS (theDataEventList, theMcEventList, theAppParams.getLMax()+1, theAppParams.getPbarMom() ) );
theRootFilePath << "./" << theAppParams.getName() << "OmegaPi0Fit_Lmax" << theAppParams.getLMax() << "_mom" << theAppParams.getPbarMom() << ".root";
else if ( (theAppParams.getLhMode()=="OmegaTo3PiLhGamma") || (theAppParams.getLhMode()=="OmegaTo3PiLhProd") || (theAppParams.getLhMode()=="OmegaTo3PiLhGammaBw") ){
theOmegaPiEventPtr = boost::shared_ptr<const AbsOmegaPiEventListLS>(new OmegaTo3PiEventListLS (theDataEventList, theMcEventList, theAppParams.getLMax()+1, theAppParams.getPbarMom() ) );
theRootFilePath << "./" << theAppParams.getName() << "OmegaTo3PiFit_Lmax" << theAppParams.getLMax() << "_mom" << theAppParams.getPbarMom() << ".root";
if (theAppParams.getAppExecMode()==ApplicationParameterLS::HistTest){
histTest(theOmegaPiEventPtr, theRootFilePath.str());
exit(1);
}
// rm::MnUserParameters upar;
// MinuitStartParamLS theUserPar;
// bool setFitParam=streamFitParam(theAppParams, theUserPar);
boost::shared_ptr<AbsOmegaPiLhLS> theOmegaPiLh;
if (theAppParams.getLhMode()=="OmegaPiLhGamma"){
theOmegaPiLh = boost::shared_ptr<AbsOmegaPiLhLS>(new OmegaPiLhPi0GammaLS(theOmegaPiEventPtr, pbarpToOmegaPi0StatesPtr));
}
else if (theAppParams.getLhMode()=="OmegaPiLhGammaBw"){
// theOmegaPiLh = boost::shared_ptr<AbsOmegaPiLhLS>(new OmegaPiLhPi0GammaLS(theOmegaPiEventPtr, pbarpToOmegaPi0StatesPtr));
Alert << "LhMode OmegaPiLhGammaBw not implemented so far!!!" << endmsg;
}
else if (theAppParams.getLhMode()=="OmegaTo3PiLhGamma"){
theOmegaPiLh = boost::shared_ptr<AbsOmegaPiLhLS>(new OmegaTo3PiLhPi0GammaLS(theOmegaPiEventPtr, pbarpToOmegaPi0StatesPtr));
}
else if (theAppParams.getLhMode()=="OmegaTo3PiLhProd"){
theOmegaPiLh = boost::shared_ptr<AbsOmegaPiLhLS>(new OmegaTo3PiLhProdLS(theOmegaPiEventPtr, pbarpToOmegaPi0StatesPtr));
}
else{
Alert <<"LhMode " << theAppParams.getLhMode() << " doesn't exist !!! " << endmsg;
exit(1);
}
if (theAppParams.getAppExecMode()==ApplicationParameterLS::ParamStreamTest){
paramStreamTest(theAppParams, theOmegaPiLh);
exit(1);
}
bl::tribool bExecFinish=bl::tribool(false);
OmegaPiDataLS::fitParamVal theParamVal;
switch(theAppParams.getAppExecMode()) {
case ApplicationParameterLS::Minuit:
{
bExecFinish = Minuit(theAppParams, theParamVal, theOmegaPiLh, true);
//now dump the final fit result
std::ostringstream theParamFilePathMin;
theParamFilePathMin << "./" << theAppParams.getName() << "LastFitParamOmegaPi0Fit_Mmax" << theAppParams.getLMax() << "_mom" << theAppParams.getPbarMom() << ".txt";
ofstream outfileMin (theParamFilePathMin.str().c_str());
theOmegaPiLh->dumpCurrentResult(outfileMin, theParamVal);
outfileMin.close();
}
case ApplicationParameterLS::GenEvA:
{
bExecFinish = GenEvA(theAppParams, theParamVal, theOmegaPiLh);
if(bl::indeterminate(bExecFinish)) return 0; // Simply terminate -- this is a client in networked mode that has done its job
}
case ApplicationParameterLS::GenToMinuit:
{
bExecFinish = GenEvA(theAppParams, theParamVal, theOmegaPiLh);
Info << "Obtained NLL with GenEvA:\n" << theOmegaPiLh->calcLogLh(theParamVal) << endmsg;
Info << "\n and fit parameters are:\n" << endmsg;
theOmegaPiLh->printFitParams(std::cout, theParamVal);
//now dump this intermediate fit result
std::ostringstream theParamFilePathGen;
theParamFilePathGen << "./" << theAppParams.getName() << "GenevaLastFitParamOmegaPi0Fit_Lmax" << theAppParams.getLMax() << "_mom" << theAppParams.getPbarMom() << ".txt";
ofstream outfileGen (theParamFilePathGen.str().c_str());
theOmegaPiLh->dumpCurrentResult(outfileGen, theParamVal);
outfileGen.close();
//now fit with minuit
bExecFinish = Minuit(theAppParams, theParamVal, theOmegaPiLh, false);
//now dump the final fit result
std::ostringstream theParamFilePathMin;
theParamFilePathMin << "./" << theAppParams.getName() << "LastFitParamOmegaPi0Fit_Mmax" << theAppParams.getLMax() << "_mom" << theAppParams.getPbarMom() << ".txt";
ofstream outfileMin (theParamFilePathMin.str().c_str());
theOmegaPiLh->dumpCurrentResult(outfileMin, theParamVal);
outfileMin.close();
if(bl::indeterminate(bExecFinish)) return 0; // Simply terminate -- this is a client in networked mode that has done its job
case ApplicationParameterLS::SpinDensity:
{
bExecFinish = calcSpinDensity(theAppParams, theOmegaPiLh, theParamVal);
break;
case ApplicationParameterLS::QAmode:
{
bExecFinish = QAmode(theAppParams, theParamVal, theOmegaPiLh);
break;
}
default:
{
cerr << "Error unknown execution mode selected!" << endl;
}
}
//---------------------------------------------------------------------------
// Let the audience know
if (bExecFinish) {
cout << endl;
Info << "Fit results:\n" << endmsg;
Info << "Final logLH=" << theOmegaPiLh->calcLogLh(theParamVal) << "\n" << endmsg;
Info << "Final fit parameters:\n" << endmsg;
// printFitParameters(pbarpToOmegaPi0StatesPtr, finalFitParm);
theOmegaPiLh->printFitParams(std::cout, theParamVal);
std::ostringstream theRootFilePath;
theRootFilePath << "./" << theAppParams.getName() << "OmegaPi0Fit_Lmax" << theAppParams.getLMax() << "_mom" << theAppParams.getPbarMom() << ".root";
OmegaPiHistLS theHistogrammer(theOmegaPiLh,theParamVal,theRootFilePath.str());
}
}