diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ddacd1d..61e9257 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,88 +1,158 @@ stages: - build - test variables: LCG_VERSION: "98" BUILD_ROOFIT_TASK: "OFF" .production_image: variables: LCG_OS: x86_64-centos7 image: gitlab-registry.cern.ch/ci-tools/ci-worker:cc7 tags: - cvmfs .lcg_setup: before_script: - set +e && source /cvmfs/sft.cern.ch/lcg/views/setupViews.sh LCG_$LCG_VERSION $LCG_OS-$LCG_COMPILER; set -e .build_template: stage: build extends: - .lcg_setup script: - mkdir install - mkdir build && cd build - cmake -DCMAKE_BUILD_TYPE:STRING=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX:PATH=$CI_PROJECT_DIR/install -DLAURA_BUILD_EXAMPLES:BOOL=ON -DLAURA_BUILD_DOCS:BOOL=ON -DLAURA_BUILD_ROOFIT_TASK:BOOL=$BUILD_ROOFIT_TASK $CI_PROJECT_DIR - cmake --build . - cmake --build . --target install build_clang10_opt: variables: LCG_COMPILER: "clang10-opt" BUILD_TYPE: "Release" extends: - .production_image - .build_template build_gcc10_opt: variables: LCG_COMPILER: "gcc10-opt" BUILD_TYPE: "Release" BUILD_ROOFIT_TASK: "ON" extends: - .production_image - .build_template allow_failure: true build_gcc9_opt: variables: LCG_COMPILER: "gcc9-opt" BUILD_TYPE: "Release" extends: - .production_image - .build_template build_gcc9_dbg: variables: LCG_COMPILER: "gcc9-dbg" BUILD_TYPE: "Debug" extends: - .production_image - .build_template artifacts: paths: - install expire_in: 1 day -test_placeholder: +.test_template: stage: test variables: LCG_COMPILER: "gcc9-dbg" extends: - .production_image - .lcg_setup dependencies: - build_gcc9_dbg artifacts: paths: - runtests expire_in: 1 day script: - export PATH=$CI_PROJECT_DIR/install/bin:$PATH - mkdir runtests && cd runtests - curl -O https://laura.hepforge.org/CI-files/histogram.root - - Test_Dpipi gen --dtype QFS --dta-model hist - - Test_Dpipi gen --dtype CPEven --dta-model hist - - $CI_PROJECT_DIR/examples/runTimeDepTest.sh 1 0 2 1 1 + - $CI_PROJECT_DIR/examples/runTimeDepTest.sh 0 $DTA_MODEL $DTR $DTR_PEREVENT + +test_flatDTA_noDTR: + variables: + DTA_MODEL: "flat" + DTR: "0" + DTR_PEREVENT: "0" + extends: + - .test_template + +test_flatDTA_avgDTR: + variables: + DTA_MODEL: "flat" + DTR: "1" + DTR_PEREVENT: "0" + extends: + - .test_template + +test_flatDTA_evtDTR: + variables: + DTA_MODEL: "flat" + DTR: "1" + DTR_PEREVENT: "1" + extends: + - .test_template + +test_histDTA_noDTR: + variables: + DTA_MODEL: "hist" + DTR: "0" + DTR_PEREVENT: "0" + extends: + - .test_template + +test_histDTA_avgDTR: + variables: + DTA_MODEL: "hist" + DTR: "1" + DTR_PEREVENT: "0" + extends: + - .test_template + +test_histDTA_evtDTR: + variables: + DTA_MODEL: "hist" + DTR: "1" + DTR_PEREVENT: "1" + extends: + - .test_template + +test_splineDTA_noDTR: + variables: + DTA_MODEL: "spline" + DTR: "0" + DTR_PEREVENT: "0" + extends: + - .test_template + +test_splineDTA_avgDTR: + variables: + DTA_MODEL: "spline" + DTR: "1" + DTR_PEREVENT: "0" + extends: + - .test_template + +test_splineDTA_evtDTR: + variables: + DTA_MODEL: "spline" + DTR: "1" + DTR_PEREVENT: "1" + extends: + - .test_template diff --git a/examples/ProgOpts/Test_Dpipi_ProgOpts.cc b/examples/ProgOpts/Test_Dpipi_ProgOpts.cc index 247f352..4de0f17 100644 --- a/examples/ProgOpts/Test_Dpipi_ProgOpts.cc +++ b/examples/ProgOpts/Test_Dpipi_ProgOpts.cc @@ -1,137 +1,138 @@ #include #include "boost/program_options.hpp" #include "Test_Dpipi_ProgOpts.hh" namespace po = boost::program_options; void validate( boost::any& v, const std::vector& values, Command* /*target_type*/, int) { // Make sure no previous assignment to 'v' has been made po::validators::check_first_occurrence(v); // Extract the first string from 'values'. If there is more than // one string, it's an error, and exception will be thrown. const std::string& s { po::validators::get_single_string(values) }; if ( s == "gen" ) { v = boost::any( Command::Generate ); } else if ( s == "fit" ) { v = boost::any( Command::Fit ); } else if ( s == "simfit" ) { v = boost::any( Command::SimFit ); } else { throw po::validation_error(po::validation_error::invalid_option_value, "command", s, 3); } } void validate( boost::any& v, const std::vector& values, LauTimeDepFitModel::CPEigenvalue* /*target_type*/, int) { // Make sure no previous assignment to 'v' has been made po::validators::check_first_occurrence(v); // Extract the first string from 'values'. If there is more than // one string, it's an error, and exception will be thrown. const std::string& s { po::validators::get_single_string(values) }; if ( s == "QFS" ) { v = boost::any( LauTimeDepFitModel::CPEigenvalue::QFS ); } else if ( s == "CPEven" ) { v = boost::any( LauTimeDepFitModel::CPEigenvalue::CPEven ); } else if ( s == "CPOdd" ) { v = boost::any( LauTimeDepFitModel::CPEigenvalue::CPOdd ); } else { throw po::validation_error(po::validation_error::invalid_option_value); } } void validate( boost::any& v, const std::vector& values, LauDecayTimePdf::EfficiencyMethod* /*target_type*/, int) { // Make sure no previous assignment to 'v' has been made po::validators::check_first_occurrence(v); // Extract the first string from 'values'. If there is more than // one string, it's an error, and exception will be thrown. const std::string& s { po::validators::get_single_string(values) }; if ( s == "flat" ) { v = boost::any( LauDecayTimePdf::EfficiencyMethod::Flat ); } else if ( s == "hist" || s == "binned" ) { v = boost::any( LauDecayTimePdf::EfficiencyMethod::Binned ); } else if ( s == "spline" ) { v = boost::any( LauDecayTimePdf::EfficiencyMethod::Spline ); } else { throw po::validation_error(po::validation_error::invalid_option_value); } } TestDpipi_ProgramSettings::TestDpipi_ProgramSettings(const int argc, const char ** argv) { po::options_description main_desc{"Main options"}; main_desc.add_options() ("command", po::value(&command)->required(), "main command: gen, fit, or simfit") ; po::positional_options_description p; p.add("command", 1); po::options_description common_desc{"Common options"}; common_desc.add_options() ("help", "produce help message") ("dtype", po::value(&dType)->default_value(LauTimeDepFitModel::CPEigenvalue::QFS,"QFS"), "type of D decay: QFS, CPOdd, or CPEven") ("dta-model", po::value(&timeEffModel)->default_value(LauDecayTimePdf::EfficiencyMethod::Flat,"flat"), "decay-time acceptance model: flat, hist/binned, spline") ("dtr", po::value(&timeResolution)->default_value(kTRUE), "enable/disable decay-time resolution") + ("dtr-perevent", po::value(&perEventTimeErr)->default_value(kFALSE), "enable/disable use of per-event decay-time error (requires decay-time resolution to be enabled to take effect)") ; po::options_description gen_desc{"Generation options"}; gen_desc.add_options() ("firstExptGen", po::value(&firstExptGen)->default_value(0), "first experiment to generate") ("nExptGen", po::value(&nExptGen)->default_value(1), "number of experiments to generate") ; po::options_description fit_desc{"Fitting options"}; fit_desc.add_options() ("firstExpt", po::value(&firstExptFit)->default_value(0), "first experiment to fit") ("nExpt", po::value(&nExptFit)->default_value(1), "number of experiments to fit") - ("iFit", po::value(&iFit), "fit ID - used to distinguish multiple fits to a given dataset (used to disentangle multiple minima)") + ("iFit", po::value(&iFit)->default_value(0), "fit ID - used to distinguish multiple fits to a given dataset (used to disentangle multiple minima)") ; po::options_description simfit_desc{"Simultaneous fitting options"}; simfit_desc.add_options() ("port", po::value(&port)->default_value(0), "port number on which sim fit coordinator is listening") ; po::options_description all_desc; all_desc.add(main_desc).add(common_desc).add(gen_desc).add(fit_desc).add(simfit_desc); po::variables_map vm; try { po::store(po::command_line_parser(argc, argv). options(all_desc). positional(p). run(), vm); po::notify(vm); } catch ( boost::wrapexcept& e ) { std::cout << argv[0] << " requires a command, one of 'gen', 'fit', or 'simfit'\n" << "Append --help to those commands to see help on the related options" << std::endl; parsedOK = kFALSE; return; } catch ( po::validation_error& e ) { std::cerr << e.what() << std::endl; parsedOK = kFALSE; return; } if ( vm.count("help") ) { po::options_description help_desc; help_desc.add(common_desc).add(gen_desc).add(fit_desc).add(simfit_desc); std::cout << help_desc << std::endl; helpRequested = kTRUE; return; } } diff --git a/examples/ProgOpts/Test_Dpipi_ProgOpts.hh b/examples/ProgOpts/Test_Dpipi_ProgOpts.hh index bc0af4a..e33f1c0 100644 --- a/examples/ProgOpts/Test_Dpipi_ProgOpts.hh +++ b/examples/ProgOpts/Test_Dpipi_ProgOpts.hh @@ -1,29 +1,30 @@ #ifndef TEST_DPIPI_PROGOPTS #define TEST_DPIPI_PROGOPTS #include "Rtypes.h" #include "LauDecayTimePdf.hh" #include "LauTimeDepFitModel.hh" #include "Command.hh" struct TestDpipi_ProgramSettings { TestDpipi_ProgramSettings(const int argc, const char ** argv); Bool_t parsedOK{kTRUE}; Bool_t helpRequested{kFALSE}; Command command{Command::Generate}; LauTimeDepFitModel::CPEigenvalue dType{LauTimeDepFitModel::CPEigenvalue::QFS}; UInt_t firstExptGen{0}; UInt_t nExptGen{1}; UInt_t firstExptFit{0}; UInt_t nExptFit{1}; UInt_t iFit{0}; UInt_t port{0}; LauDecayTimePdf::EfficiencyMethod timeEffModel{LauDecayTimePdf::EfficiencyMethod::Flat}; Bool_t timeResolution{kTRUE}; + Bool_t perEventTimeErr{kFALSE}; }; #endif diff --git a/examples/Test_Dpipi.cc b/examples/Test_Dpipi.cc index 8fa56ac..0d9efc0 100644 --- a/examples/Test_Dpipi.cc +++ b/examples/Test_Dpipi.cc @@ -1,334 +1,346 @@ #include #include #include #include #include "TFile.h" #include "TH2.h" #include "TRandom.h" #include "TString.h" #include "TSystem.h" #include "TF1.h" #include "TCanvas.h" #include "LauDaughters.hh" #include "LauDecayTimePdf.hh" #include "LauEffModel.hh" #include "LauIsobarDynamics.hh" #include "LauMagPhaseCoeffSet.hh" #include "LauRandom.hh" #include "LauRealImagCoeffSet.hh" #include "LauTimeDepFitModel.hh" #include "LauVetoes.hh" #include "LauFlavTag.hh" #include "Lau1DHistPdf.hh" #include "Lau1DCubicSpline.hh" #include "Test_Dpipi_ProgOpts.hh" int main(const int argc, const char ** argv) { const TestDpipi_ProgramSettings settings{argc,argv}; if ( settings.helpRequested ) { return EXIT_SUCCESS; } if ( ! settings.parsedOK ) { return EXIT_FAILURE; } - TString dTypeStr; + const Bool_t fixPhiMix{ settings.dType == LauTimeDepFitModel::CPEigenvalue::QFS }; + const Bool_t useSinCos{kTRUE}; + + Double_t nSigEvents{0}; switch (settings.dType) { case LauTimeDepFitModel::CPEigenvalue::CPEven : - dTypeStr = "CPEven"; + nSigEvents = 15000; break; case LauTimeDepFitModel::CPEigenvalue::CPOdd : - dTypeStr = "CPOdd"; + nSigEvents = 5000; break; case LauTimeDepFitModel::CPEigenvalue::QFS : - dTypeStr = "QFS"; + nSigEvents = 50000; break; } - Bool_t fixPhiMix(kFALSE); - Bool_t useSinCos(kTRUE); + LauDaughters* daughtersB0bar = new LauDaughters("B0_bar", "pi+", "pi-", "D0"); + LauDaughters* daughtersB0 = new LauDaughters("B0", "pi+", "pi-", "D0_bar"); - Double_t nSigEvents(0); - if (dTypeStr=="CPEven"){ - nSigEvents = 15000; - } else { - nSigEvents = 10000; - } - - LauDaughters* daughtersB0bar(0); - LauDaughters* daughtersB0(0); - LauEffModel* effModelB0bar(0); - LauEffModel* effModelB0(0); + // efficiency LauVetoes* vetoes = new LauVetoes(); //vetoes->addMassVeto( 2, 2.00776, 2.01276 ); - - daughtersB0bar = new LauDaughters("B0_bar", "pi+", "pi-", "D0"); - daughtersB0 = new LauDaughters("B0", "pi+", "pi-", "D0_bar"); - - // efficiency - effModelB0bar = new LauEffModel(daughtersB0bar, vetoes); - effModelB0 = new LauEffModel(daughtersB0, vetoes); - - LauIsobarDynamics* sigModelB0bar(0); - LauIsobarDynamics* sigModelB0(0); - LauTimeDepFitModel* fitModel(0); - - std::vector params; + LauEffModel* effModelB0bar = new LauEffModel(daughtersB0bar, vetoes); + LauEffModel* effModelB0 = new LauEffModel(daughtersB0, vetoes); //Args for flavTag: useAveDelta - kFALSE and useEtaPrime - kFALSE LauFlavTag* flavTag = new LauFlavTag(kFALSE,kFALSE); flavTag->setTrueTagVarName("trueTag"); - TFile* etafile(0); - TH1* etahist(0); - Lau1DHistPdf* etahistpdf(0); - etafile = TFile::Open("histogram.root"); - etahist = dynamic_cast(etafile->Get("htemp")); - etahistpdf = new Lau1DHistPdf("eta",etahist,0.0,0.54,kTRUE,kFALSE); + TFile* etafile = TFile::Open("histogram.root"); + TH1* etahist = dynamic_cast(etafile->Get("htemp")); + Lau1DHistPdf* etahistpdf = new Lau1DHistPdf("eta",etahist,0.0,0.54,kTRUE,kFALSE); + + std::pair tagEff {0.5, 0.5}; + std::pair calib0 {0.4, 0.4}; + std::pair calib1 {1.0, 1.0}; + flavTag->addTagger("OSTagger","tagVal_OS","mistagVal_OS", etahistpdf,tagEff,calib0,calib1); // signal dynamics - sigModelB0bar = new LauIsobarDynamics(daughtersB0bar, effModelB0bar); + LauIsobarDynamics* sigModelB0bar = new LauIsobarDynamics(daughtersB0bar, effModelB0bar); sigModelB0bar->setIntFileName("integ_B0bar.dat"); sigModelB0bar->addResonance("D*+_2", 2, LauAbsResonance::RelBW); sigModelB0bar->addResonance("D*+_0", 2, LauAbsResonance::RelBW); sigModelB0bar->addResonance("rho0(770)", 3, LauAbsResonance::RelBW); sigModelB0bar->addResonance("f_0(980)", 3, LauAbsResonance::RelBW); sigModelB0bar->addResonance("f_2(1270)", 3, LauAbsResonance::RelBW); - sigModelB0 = new LauIsobarDynamics(daughtersB0, effModelB0); + LauIsobarDynamics* sigModelB0 = new LauIsobarDynamics(daughtersB0, effModelB0); sigModelB0->setIntFileName("integ_B0.dat"); sigModelB0->addResonance("D*-_2", 1, LauAbsResonance::RelBW); sigModelB0->addResonance("D*-_0", 1, LauAbsResonance::RelBW); sigModelB0->addResonance("rho0(770)", 3, LauAbsResonance::RelBW); sigModelB0->addResonance("f_0(980)", 3, LauAbsResonance::RelBW); sigModelB0->addResonance("f_2(1270)", 3, LauAbsResonance::RelBW); // fit model - fitModel = new LauTimeDepFitModel(sigModelB0bar,sigModelB0,flavTag); + LauTimeDepFitModel* fitModel = new LauTimeDepFitModel(sigModelB0bar,sigModelB0,flavTag); std::vector coeffset; - coeffset.push_back( new LauRealImagCoeffSet("D*-_2", 1.00, 0.00, kTRUE, kTRUE) ); - coeffset.push_back( new LauRealImagCoeffSet("D*-_0", 0.53*TMath::Cos( 3.00), 0.53*TMath::Sin( 3.00), kFALSE, kFALSE) ); + coeffset.push_back( new LauRealImagCoeffSet("D*+_2", 1.00, 0.00, kTRUE, kTRUE) ); + coeffset.push_back( new LauRealImagCoeffSet("D*+_0", 0.53*TMath::Cos( 3.00), 0.53*TMath::Sin( 3.00), kFALSE, kFALSE) ); coeffset.push_back( new LauRealImagCoeffSet("rho0(770)", 1.22*TMath::Cos( 2.25), 1.22*TMath::Sin( 2.25), kFALSE, kFALSE) ); coeffset.push_back( new LauRealImagCoeffSet("f_0(980)", 0.19*TMath::Cos(-2.48), 0.19*TMath::Sin(-2.48), kFALSE, kFALSE) ); coeffset.push_back( new LauRealImagCoeffSet("f_2(1270)", 0.75*TMath::Cos( 2.97), 0.75*TMath::Sin( 2.97), kFALSE, kFALSE) ); for (std::vector::iterator iter=coeffset.begin(); iter!=coeffset.end(); ++iter) { fitModel->setAmpCoeffSet(*iter); } fitModel->setCPEigenvalue( settings.dType ); fitModel->setPhiMix( 2.0*LauConstants::beta, fixPhiMix, useSinCos ); + // production asymmetry fitModel->setAsymmetries(0.0,kTRUE); - std::pair tagEff (0.5, 0.5); - std::pair calib0 (0.4, 0.4); - std::pair calib1 (1.0, 1.0); - - flavTag->addTagger("OSTagger","tagVal_OS","mistagVal_OS", etahistpdf,tagEff,calib0,calib1); - // Delta t PDFs const Double_t minDt(0.0); const Double_t maxDt(20.0); const Double_t minDtErr(0.0); const Double_t maxDtErr(2.5); - const Int_t nGauss(3); - std::vector scale(nGauss); - scale[0] = kTRUE; - scale[1] = kTRUE; - scale[2] = kFALSE; + const std::vector scale { + settings.perEventTimeErr && kTRUE, + settings.perEventTimeErr && kTRUE, + settings.perEventTimeErr && kFALSE + }; + const UInt_t nGauss(scale.size()); - std::vector dtPars(10); TString mean0Name("dt_"); mean0Name += "_mean_0"; TString mean1Name("dt_"); mean1Name += "_mean_1"; TString mean2Name("dt_"); mean2Name += "_mean_2"; TString sigma0Name("dt_"); sigma0Name += "_sigma_0"; TString sigma1Name("dt_"); sigma1Name += "_sigma_1"; TString sigma2Name("dt_"); sigma2Name += "_sigma_2"; TString frac1Name("dt_"); frac1Name += "_frac_1"; TString frac2Name("dt_"); frac2Name += "_frac_2"; TString tauName("dt_"); tauName += "_tau"; TString freqName("dt_"); freqName += "_deltaM"; LauParameter * mean0 = new LauParameter(mean0Name, 0.0); LauParameter * mean1 = new LauParameter(mean1Name, 0.0); LauParameter * mean2 = new LauParameter(mean2Name, 0.0); LauParameter * sigma0 = new LauParameter(sigma0Name, 1.0); LauParameter * sigma1 = new LauParameter(sigma1Name, 2.0); LauParameter * sigma2 = new LauParameter(sigma2Name, 8.0); LauParameter * frac1 = new LauParameter(frac1Name, 0.095); LauParameter * frac2 = new LauParameter(frac2Name, 0.005); LauParameter * tau = new LauParameter(tauName, 1.520); LauParameter * freq = new LauParameter(freqName, 0.5064); - dtPars[0] = mean0; - dtPars[1] = mean1; - dtPars[2] = mean2; - dtPars[3] = sigma0; - dtPars[4] = sigma1; - dtPars[5] = sigma2; - dtPars[6] = frac1; - dtPars[7] = frac2; - dtPars[8] = tau; - dtPars[9] = freq; - - //Decay time acceptance spline - same for all tag cats (though doesn't have to be) + std::vector dtPars { + mean0, + mean1, + mean2, + sigma0, + sigma1, + sigma2, + frac1, + frac2, + tau, + freq + }; + + //Decay time acceptance spline knot x- and y-values std::vector dtvals; dtvals.push_back(0.0); dtvals.push_back(1.0); dtvals.push_back(2.0); dtvals.push_back(4.0); dtvals.push_back(6.0); dtvals.push_back(8.0); dtvals.push_back(11.0); dtvals.push_back(14.0); dtvals.push_back(17.0); dtvals.push_back(20.0); std::vector effvals; effvals.push_back(0.0); effvals.push_back(0.15); effvals.push_back(0.25); effvals.push_back(0.33); effvals.push_back(0.38); effvals.push_back(0.4); effvals.push_back(0.43); effvals.push_back(0.45); effvals.push_back(0.47); effvals.push_back(0.50); LauDecayTimePdf * dtPdf = new LauDecayTimePdf( "decayTime", "decayTimeErr", dtPars, minDt, maxDt, minDtErr, maxDtErr, LauDecayTimePdf::ExpTrig, nGauss, scale, LauDecayTimePdf::DecayTime, settings.timeEffModel ); dtPdf->doSmearing(settings.timeResolution); switch(settings.timeEffModel) { case LauDecayTimePdf::EfficiencyMethod::Spline: { fitModel->setASqMaxValue(0.34); Lau1DCubicSpline* dtEffSpline = new Lau1DCubicSpline(dtvals,effvals,Lau1DCubicSpline::AkimaSpline,Lau1DCubicSpline::Natural,Lau1DCubicSpline::Natural); dtPdf->setEffiSpline(dtEffSpline); break; } case LauDecayTimePdf::EfficiencyMethod::Binned: { fitModel->setASqMaxValue(0.34); const UInt_t upscale = 5; //This value must be >= 1 this linearly interpolates a histogram between the points of the spline const Int_t nBins = upscale * (dtvals.size()-1) ; Double_t edges[nBins + 1]; for(Int_t i = 0; i < nBins + 1; ++i) { Double_t binWidth = dtvals[i/upscale + 1] - dtvals[i/upscale]; //This is the width of the bin if upscale is 1, it is the distance between the current 2 knots edges[i] = dtvals[i/upscale] + (i%upscale)*binWidth/upscale; } std::cout << "Bins: "; for (int i = 0; i < nBins + 1; ++i){std::cout << edges[i] << ", ";} std::cout << std::endl; Double_t binFilling[nBins]; TH1D* dtEffHist = new TH1D("dtEffHist","Histogram of efficiencies", nBins, edges); for(Int_t i = 0; i < nBins; ++i) { Double_t lknot = effvals[i/upscale]; Double_t rknot = effvals[i/upscale + 1]; Double_t pos = 0.5*(edges[i]+edges[i+1]); //edges[i] + (edges[i+1]-edges[i]) * (1.0*(i%upscale)/upscale); Double_t weight = (pos - dtvals[i/upscale])/(dtvals[i/upscale + 1] - dtvals[i/upscale]); Double_t filling= lknot*(1-weight) + rknot*weight; std::cout << "lknot: " << lknot << "; rknot: " << rknot << "; pos: " << pos << "; filling: " << filling << std::endl; - binFilling[i] = filling; + binFilling[i] = filling; dtEffHist->SetBinContent(i+1, binFilling[i]); } dtPdf->setEffiHist(dtEffHist); break; } case LauDecayTimePdf::EfficiencyMethod::Flat: { fitModel->setASqMaxValue(3.4); break; } } fitModel->setSignalDtPdf( dtPdf ); // set the number of signal events std::cout<<"nSigEvents = "<setNSigEvents(nSigPar); // set the number of experiments if (settings.command == Command::Generate) { fitModel->setNExpts(settings.nExptGen, settings.firstExptGen); } else { fitModel->setNExpts(settings.nExptFit, settings.firstExptFit); } fitModel->useAsymmFitErrors(kFALSE); //fitModel->useRandomInitFitPars(kTRUE); fitModel->useRandomInitFitPars(kFALSE); fitModel->doPoissonSmearing(kFALSE); fitModel->doEMLFit(kFALSE); fitModel->writeLatexTable(kFALSE); + TString dTypeStr; + switch (settings.dType) { + case LauTimeDepFitModel::CPEigenvalue::CPEven : + dTypeStr = "CPEven"; + break; + case LauTimeDepFitModel::CPEigenvalue::CPOdd : + dTypeStr = "CPOdd"; + break; + case LauTimeDepFitModel::CPEigenvalue::QFS : + dTypeStr = "QFS"; + break; + } + TString dataFile(""); TString treeName("fitTree"); TString rootFileName(""); TString tableFileName(""); TString fitToyFileName(""); TString splotFileName(""); - + dataFile = "TEST-Dpipi"; + + dataFile += "_"+dTypeStr; + switch(settings.timeEffModel) { case LauDecayTimePdf::EfficiencyMethod::Spline: dataFile += "_Spline"; break; case LauDecayTimePdf::EfficiencyMethod::Binned: dataFile += "_Hist"; break; case LauDecayTimePdf::EfficiencyMethod::Flat: dataFile += "_Flat"; break; } - dataFile += "_"+dTypeStr+"_expts"; dataFile += settings.firstExptGen; dataFile += "-"; dataFile += settings.firstExptGen+settings.nExptGen-1; + + if (settings.timeResolution) { + if (settings.perEventTimeErr) { + dataFile += "_DTRperevt"; + } else { + dataFile += "_DTRavg"; + } + } else { + dataFile += "_DTRoff"; + } + + dataFile += "_expts"; + dataFile += settings.firstExptGen; + dataFile += "-"; + dataFile += settings.firstExptGen+settings.nExptGen-1; + dataFile += ".root"; if (settings.command == Command::Generate) { rootFileName = "dummy.root"; tableFileName = "genResults"; } else { rootFileName = "fit"; rootFileName += settings.iFit; rootFileName += "_Results_"; rootFileName += dTypeStr; rootFileName += "_expts"; rootFileName += settings.firstExptFit; rootFileName += "-"; rootFileName += settings.firstExptFit+settings.nExptFit-1; rootFileName += ".root"; tableFileName = "fit"; tableFileName += settings.iFit; tableFileName += "_Results_"; tableFileName += dTypeStr; tableFileName += "_expts"; tableFileName += settings.firstExptFit; tableFileName += "-"; tableFileName += settings.firstExptFit+settings.nExptFit-1; fitToyFileName = "fit"; fitToyFileName += settings.iFit; fitToyFileName += "_ToyMC_"; fitToyFileName += dTypeStr; fitToyFileName += "_expts"; fitToyFileName += settings.firstExptFit; fitToyFileName += "-"; fitToyFileName += settings.firstExptFit+settings.nExptFit-1; fitToyFileName += ".root"; splotFileName = "fit"; splotFileName += settings.iFit; splotFileName += "_sPlot_"; splotFileName += dTypeStr; splotFileName += "_expts"; splotFileName += settings.firstExptFit; splotFileName += "-"; splotFileName += settings.firstExptFit+settings.nExptFit-1; splotFileName += ".root"; } // Generate toy from the fitted parameters //fitModel->compareFitData(1, fitToyFileName); // Write out per-event likelihoods and sWeights //fitModel->writeSPlotData(splotFileName, "splot", kFALSE); // Execute the generation/fit switch (settings.command) { case Command::Generate : fitModel->run( "gen", dataFile, treeName, rootFileName, tableFileName ); break; case Command::Fit : fitModel->run( "fit", dataFile, treeName, rootFileName, tableFileName ); break; case Command::SimFit : fitModel->runTask( dataFile, treeName, rootFileName, tableFileName, "localhost", settings.port ); break; } return EXIT_SUCCESS; } diff --git a/examples/runTimeDepTest.sh b/examples/runTimeDepTest.sh index 0e7a53d..e734313 100755 --- a/examples/runTimeDepTest.sh +++ b/examples/runTimeDepTest.sh @@ -1,73 +1,82 @@ #!/bin/bash -#!/bin/bash - # Copyright 2020 University of Warwick # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Laura++ package authors: # John Back # Paul Harrison # Thomas Latham -# Number of experiments to fit, number of the first experiment, number of tasks to run, fit id, number of experiments generated -if [ $# -lt 5 ] +# Fit ID, decay time acceptance model (flat, hist, spline), decay time resolution (0 or 1), per-event decay time error (0 or 1) +if [ $# -lt 1 ] then - echo "Usage: $0 " + echo "Usage: $0 " exit 1 fi - -nexpt=$1 -firstexpt=$2 -numtasks=$3 -i=$4 -nExptGen=$5 - -if [ $numtasks -lt 2 ] + +iFit=$1 +dta_model=$2 +dtr=$3 +dtr_perevent=$4 + +# Modify these if you want to run more experiments +nExpt=1 +firstExpt=0 + +logName_genQFS=gen-QFS-dtamodel_$dta_model-dtr_$dtr-dtrperevent_$dtr_perevent.log +logName_genCPE=gen-CPEven-dtamodel_$dta_model-dtr_$dtr-dtrperevent_$dtr_perevent.log + +logName_coord=coordinator-dtamodel_$dta_model-dtr_$dtr-dtrperevent_$dtr_perevent-$iFit.log +logName_taskQFS=task-QFS-dtamodel_$dta_model-dtr_$dtr-dtrperevent_$dtr_perevent-$iFit.log +logName_taskCPE=task-CPEven-dtamodel_$dta_model-dtr_$dtr-dtrperevent_$dtr_perevent-$iFit.log + +if [ $iFit == 0 ] then - echo "Number of task must be at least 2" - exit 1 + echo "Generating QFS samples..." + Test_Dpipi gen --dtype QFS --dta-model $dta_model --dtr $dtr --dtr-perevent $dtr_perevent --firstExptGen $firstExpt --nExptGen $nExpt > $logName_genQFS 2>&1 + + echo "Generating CPEven samples..." + Test_Dpipi gen --dtype CPEven --dta-model $dta_model --dtr $dtr --dtr-perevent $dtr_perevent --firstExptGen $firstExpt --nExptGen $nExpt > $logName_genCPE 2>&1 fi -echo " $# --- nexpt $nexpt firstexpt $firstexpt numtasks $numtasks i $i nexptgen $nExptGen" -echo "Running fit $i" +echo "Running fit $iFit" -SimFitCoordinator $i $nexpt $firstexpt $numtasks > coordinator-$i.log 2>&1 & +SimFitCoordinator $iFit $nExpt $firstExpt 2 > $logName_coord 2>&1 & -echo "Initialised coordinator process for fit $i" +echo "Initialised coordinator process for fit $iFit" sleep 10 -port=`tail -1 coordinator-${i}.log | awk '{print $NF}'` +port=`tail -1 $logName_coord | awk '{print $NF}'` echo "Coordinator is listening on port $port" echo "Initialising tasks..." -sleep 1 -Test_Dpipi simfit --dtype CPEven --port $port --iFit $i --firstExpt $firstexpt --nExpt $nexpt --nExptGen $nExptGen --dta-model hist > task-CPEven-perevt-${i}.log 2>&1 & -sleep 1 -Test_Dpipi simfit --dtype QFS --port $port --iFit $i --firstExpt $firstexpt --nExpt $nexpt --nExptGen $nExptGen --dta-model hist > task-QFS-perevt-${i}.log 2>&1 +Test_Dpipi simfit --dtype CPEven --port $port --iFit $iFit --dta-model $dta_model --dtr $dtr --dtr-perevent $dtr_perevent --firstExpt $firstExpt --nExpt $nExpt --firstExptGen $firstExpt --nExptGen $nExpt > $logName_taskCPE 2>&1 & +sleep 5 +Test_Dpipi simfit --dtype QFS --port $port --iFit $iFit --dta-model $dta_model --dtr $dtr --dtr-perevent $dtr_perevent --firstExpt $firstExpt --nExpt $nExpt --firstExptGen $firstExpt --nExptGen $nExpt > $logName_taskQFS 2>&1 echo "Fit completed" echo "Warnings/Errors from coordinator:" -grep -e ERROR -e WARNING -e Error -e Warning coordinator-$i.log +grep -e ERROR -e WARNING -e Error -e Warning $logName_coord echo "Warnings/Errors from CPeven task:" -grep -e ERROR -e WARNING -e Error -e Warning task-CPEven-perevt-$i.log +grep -e ERROR -e WARNING -e Error -e Warning $logName_taskCPE echo "Warnings/Errors from QFS task:" -grep -e ERROR -e WARNING -e Error -e Warning task-QFS-perevt-$i.log +grep -e ERROR -e WARNING -e Error -e Warning $logName_taskQFS echo "Tests against reference gen/fit output to be implemented here"