Newer
Older
#include <iostream>
#include <cstring>
#include <string>
#include <sstream>
#include <vector>
#include <map>
#include <boost/shared_ptr.hpp>
#include "Examples/JpsiGamKsKlKK/JpsiGamKsKlKKParser.hh"
#include "Examples/JpsiGamKsKlKK/JpsiGamKsKlKKEventList.hh"
#include "Examples/JpsiGamKsKlKK/JpsiGamKsKlKKHist.hh"
#include "Examples/JpsiGamKsKlKK/JpsiGamKsKlKKReader.hh"
#include "Examples/JpsiGamKsKlKK/JpsiGamKsKlKKProdLh.hh"
#include "Examples/JpsiGamKsKlKK/JpsiGamKsKlKKData.hh"
#include "Examples/JpsiGamKsKlKK/JpsiGamKsKlKKFitParams.hh"
#include "PwaUtils/StreamFitParmsBase.hh"
#include "PwaUtils/PwaFcnBase.hh"
#include "PwaUtils/AbsLh.hh"
#include "Setup/PwaEnv.hh"
#include "Particle/ParticleTable.hh"
#include "Particle/Particle.hh"
#include "Event/EventList.hh"
#include "Event/Event.hh"
#include "Particle/PdtParser.hh"
#include "qft++/topincludes/tensor.hh"
#include "ErrLogger/ErrLogger.hh"
#include "Minuit2/MnUserParameters.h"
#include "Minuit2/MnMigrad.h"
#include "Minuit2/FunctionMinimum.h"
#include "Minuit2/MnMinos.h"
#include "Minuit2/MnStrategy.h"
#include "Minuit2/MnPrint.h"
#include "Minuit2/MnScan.h"
#include "Examples/JpsiGamKsKlKK/FitParamErrorMatrix.hh"
#include "Examples/JpsiGamKsKlKK/FitParamIndex.hh"
#include "Examples/JpsiGamKsKlKK/FitParamErrorMatrixStreamer.hh"
using namespace ROOT::Minuit2;
void setErrLogMode( const JpsiGamKsKlKKParser::enErrLogMode& erlMode ) {
switch(erlMode) {
case JpsiGamKsKlKKParser::debug :
ErrLogger::instance()->setLevel(log4cpp::Priority::DEBUG);
break;
case JpsiGamKsKlKKParser::trace :
ErrLogger::instance()->setLevel(log4cpp::Priority::INFO);
break;
case JpsiGamKsKlKKParser::routine :
ErrLogger::instance()->setLevel(log4cpp::Priority::INFO);
break;
case JpsiGamKsKlKKParser::warning :
ErrLogger::instance()->setLevel(log4cpp::Priority::WARN);
break;
case JpsiGamKsKlKKParser::error :
ErrLogger::instance()->setLevel(log4cpp::Priority::ERROR);
break;
case JpsiGamKsKlKKParser::alert :
ErrLogger::instance()->setLevel(log4cpp::Priority::ALERT);
break;
default:
ErrLogger::instance()->setLevel(log4cpp::Priority::DEBUG);
}
}
int main(int __argc,char *__argv[]){
// Parse the command line
static JpsiGamKsKlKKParser theAppParams(__argc, __argv);
// Set the desired error logging mode
setErrLogMode(theAppParams.getErrLogMode());
std::string theCfgFile = theAppParams.getConfigFile();
const std::string datFile=theAppParams.dataFile();
const std::string mcFile=theAppParams.mcFile();
Info << "data file: " << datFile ; // << endmsg;
Info << "mc file: " << mcFile ; // << 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::pair<double, double> massRange = theAppParams.massRange();
Info << "Mass range: " << massRange.first << " " << massRange.second ;
std::vector<std::string> fileNames;
fileNames.push_back(datFile);
JpsiGamKsKlKKReader eventReader(fileNames, 5, 0);
EventList eventsData;
eventReader.fillMassRange(eventsData, massRange );
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
if (!eventsData.findParticleTypes(pTable))
Warning << "could not find all particles" ; // << endmsg;
Info << "\nFile has " << eventsData.size() << " events. Each event has "
<< eventsData.nextEvent()->size() << " final state particles.\n" ; // << endmsg;
eventsData.rewind();
Event* anEvent;
int evtCount = 0;
while ((anEvent = eventsData.nextEvent()) != 0 && evtCount < 20) {
Info << "\n"
<< *(anEvent->p4(0)) << "\tm = " << anEvent->p4(0)->Mass() << "\n"
<< *(anEvent->p4(1)) << "\tm = " << anEvent->p4(1)->Mass() << "\n"
<< *(anEvent->p4(2)) << "\tm = " << anEvent->p4(2)->Mass() << "\n"
<< *(anEvent->p4(3)) << "\tm = " << anEvent->p4(3)->Mass() << "\n"
<< *(anEvent->p4(4)) << "\tm = " << anEvent->p4(4)->Mass() << "\n"
; // << endmsg;
++evtCount;
}
eventsData.rewind();
std::vector<std::string> fileNamesMc;
fileNamesMc.push_back(mcFile);
JpsiGamKsKlKKReader eventReaderMc(fileNamesMc, 5, 0);
EventList eventsMc;
eventReaderMc.fillMassRange(eventsMc, massRange);
eventsMc.rewind();
//
//calculate helicity angles, fill map with D-functions
//
boost::shared_ptr<const JpsiGamKsKlKKEventList> theJpsiGamKsKlKKEventListPtr(new JpsiGamKsKlKKEventList(eventsData, eventsMc));
//
hypMap["etacHyp"] =false;
hypMap["eta2225Hyp"]=false;
hypMap["f02020Hyp"]=false;
hypMap["f02020FlatteHyp"]=false;
hypMap["f22300Hyp"]=false;
hypMap["eta21870Hyp"]=false;
hypMap["f1Hyp"]=false;
hypMap["usePhasespace"]=false;
const std::vector<std::string> enabledHyps=theAppParams.enabledHyps();
std::vector<std::string>::const_iterator itStr;
for (itStr=enabledHyps.begin(); itStr!=enabledHyps.end(); ++itStr){
std::map<const std::string, bool>::const_iterator iter= hypMap.find( (*itStr) );
if (iter !=hypMap.end()){
hypMap[iter->first]= true;
Info<< "hypothesis " << iter->first << " enabed" ; // << endmsg;
else { Alert << "hypothesis " << (*itStr) << " can not be enabled"; // << endmsg;
JpsiGamKsKlKKProdLh* theProdLh = new JpsiGamKsKlKKProdLh(theJpsiGamKsKlKKEventListPtr, hypMap);
theProdLh->massIndependentFit( theAppParams.massIndependentFit() );
theProdLh->useCommonProductionPhase( theAppParams.useCommonProductionPhases() );
std::string startWithHyp=theAppParams.startHypo();
if (startWithHyp=="production"){
theLhPtr = boost::shared_ptr<AbsLh> (theProdLh);
}
else {
Alert << "start with hypothesis " << startWithHyp << " not supported!!!!" ; // << endmsg;
exit(1);
}
std::string mode=theAppParams.mode();
if (mode=="dumpDefaultParams"){
fitParams defaultVal;
fitParams defaultErr;
theLhPtr->getDefaultParams(defaultVal, defaultErr);
std::ofstream theStreamDefault ( "defaultparams.dat");
boost::shared_ptr<FitParamsBase> theFitParamBase=boost::shared_ptr<FitParamsBase>(new JpsiGamKsKlKKFitParams(defaultVal, defaultErr));
theFitParamBase->dumpParams(theStreamDefault, defaultVal, defaultErr);
return 0;
std::string paramStreamerPath=theAppParams.fitParamFile();
StreamFitParmsBase theParamStreamer(paramStreamerPath, boost::shared_ptr<FitParamsBase> (new JpsiGamKsKlKKFitParams()));
fitParams theStartparams=theParamStreamer.getFitParamVal();
fitParams theErrorparams=theParamStreamer.getFitParamErr();
boost::shared_ptr<FitParamsBase> theFitParamBase
=boost::shared_ptr<FitParamsBase>(new JpsiGamKsKlKKFitParams(theStartparams, theErrorparams));
if (mode=="qaMode"){
Info << "\nThe parameter values are: " << "\n" << endmsg;
theFitParamBase->printParams(theStartparams);
Info << "\nThe parameter errors are: " << "\n" << endmsg;
theFitParamBase->printParams(theErrorparams);
double theLh=theLhPtr->calcLogLh(theStartparams);
Info <<"theLh = "<< theLh << endmsg;
std::string errFile = "finalErrorMatrix.dat";
FitParamErrorMatrixStreamer theErrStreamer( errFile );
std::vector<double> theErrData;
int ncols(0);
theErrStreamer.matrixData( theErrData, ncols );
FitParamErrorMatrix theErrorMatrix(theErrData, ncols );
JpsiGamKsKlKKHist theHist(theProdLh, theStartparams, &theErrorMatrix);
theHist.setMassRange(theAppParams.massRange() );
theHist.fill();
if(theAppParams.massIndependentFit()){
//calculate intensity contributions
//std::ofstream theStream ( "componentIntensity.dat");
//theProdLh->dumpComponentIntensity( theStream, theStartparams, theErrorMatrix );
end= clock();
double cpuTime= (end-start)/ (CLOCKS_PER_SEC);
Info << "cpuTime:\t" << cpuTime << "\tsec" << endmsg;
return 0;
}
if (mode=="pwa"){
PwaFcnBase theFcn(theLhPtr, theFitParamBase);
MnUserParameters upar;
theFitParamBase->setMnUsrParams(upar);
std::cout << "\n\n**************** Minuit Fit parameter **************************" << std::endl;
for (int i=0; i<int(upar.Params().size()); ++i){
std::cout << upar.Name(i) << "\t" << upar.Value(i) << "\t" << upar.Error(i) << std::endl;
}
const std::vector<std::string> fixedParams=theAppParams.fixedParams();
std::vector<std::string>::const_iterator itFix;
for (itFix=fixedParams.begin(); itFix!=fixedParams.end(); ++itFix){
upar.Fix( (*itFix) );
}
bool prescan=false;
if(prescan){
upar.Fix(0);
MnScan theScan(theFcn, upar);
FunctionMinimum smin = theScan();
MnUserParameterState sState = smin.UserState();
cout << "After scan" << endl;
cout << sState << endl;
upar = smin.UserParameters();
upar.Release(0);
}
MnMigrad migrad(theFcn, upar);
Info <<"start migrad "<< endmsg;
if(!min.IsValid()) {
//try with higher strategy
Info <<"FM is invalid, try with strategy = 2."<< endmsg;
MnMigrad migrad2(theFcn, min.UserState(), MnStrategy(2));
min = migrad2();
}
MnUserParameters finalUsrParameters=min.UserParameters();
const std::vector<double> finalParamVec=finalUsrParameters.Params();
fitParams finalFitParams=theFitParamBase->getFitParamVal(finalParamVec);
//MnUserCovariance theCov = min.UserCovariance() ;
//cout << "User vov : "<< endl;
//cout << theCov << endl;
MnUserParameterState theState = min.UserState();
cout << "User state " << theState << endl;
theFitParamBase->printParams(finalFitParams);
double theLh=theLhPtr->calcLogLh(finalFitParams);
Info <<"theLh = "<< theLh << endmsg;
// print and dump final fit result
const std::vector<double> finalParamErrorVec=finalUsrParameters.Errors();
for (size_t i=0; i<finalParamVec.size(); i++)
{
Info << "Value: " << finalParamVec[i] << "\t Error: " << finalParamErrorVec[i] << endmsg;
}
fitParams finalFitErrs=theFitParamBase->getFitParamVal(finalParamErrorVec);
std::ofstream theStream ( "finalResult.dat");
theFitParamBase->dumpParams(theStream, finalFitParams, finalFitErrs);
MnUserCovariance theCovMatrix = min.UserCovariance();
std::cout << min << std::endl;
std::ofstream theErrMatStream ( "finalErrorMatrix.dat");
FitParamErrorMatrix theErrMatrix(theCovMatrix, finalUsrParameters );
theErrMatrix.Write(theErrMatStream);
//std::ofstream theCompStream ( "componentIntensity.dat");
//theProdLh->dumpComponentIntensity( theCompStream, finalFitParams, theErrMatrix );
JpsiGamKsKlKKHist theHist(theProdLh, finalFitParams, &theErrMatrix);
theHist.setMassRange(theAppParams.massRange() );