예제 #1
0
RooStats::ModelConfig * Tprime::SetBModel( void ) {
    //
    // Define model config and parameter snapshot to describe the b model.
    // Import to workspace.
    //

    std::string legend = "[Tprime::SetBModel]: ";

    // full signal+background model
    //RooStats::ModelConfig * pSBModel = (RooStats::ModelConfig *)pWs->genobj("ModelConfig");

    // let's make the b model (bg-only) from the alt model (s+b) with xsec=0
    //RooStats::ModelConfig * pBModel =
    //  new RooStats::ModelConfig(*(RooStats::ModelConfig *)pWs->genobj("ModelConfig"));
    RooStats::ModelConfig * _sbModel = (RooStats::ModelConfig *)pWs->genobj("ModelConfig");
    RooStats::ModelConfig * pBModel = _sbModel->Clone("BModel");

    //pBModel->SetName("BModel");

    pBModel->SetWorkspace(*pWs);

    //pBModel->SetParametersOfInterest(RooArgSet());
    pWs->import(*pBModel);

    // set POI to the b model value and take snapshot
    RooRealVar * pPoi = (RooRealVar *)pBModel->GetParametersOfInterest()->first();
    pPoi->setVal(0.0);
    pBModel->SetSnapshot(*pPoi);

    pBModel->Print();

    return pBModel;
}
예제 #2
0
RooAbsData * Tprime::GetPseudoData( void ) {
    //
    // Generate pseudo data, return a pointer.
    // Class member pointer data set to point to the dataset.
    // Caller does not take ownership.
    //

    static int n_toys = 0;

    // legend for printouts
    std::string legend = "[Tprime::GetPseudoData()]: ";

    delete data;

    // We will use ToyMCSampler to generate pseudo-data (and test statistic, eventually)
    // We are responsible for randomizing nuisances and global observables,
    // ToyMCSampler only generates observables (as of ROOT 5.30.00-rc1 and before)

    // MC sampler and test statistic
    if(n_toys == 0) { // on first entry
        // get B model config from workspace
        RooStats::ModelConfig * pBModel = (RooStats::ModelConfig *)pWs->obj("BModel");
        pBModel->SetWorkspace(*pWs);

        // get parameter of interest set
        //const RooArgSet * poi = pSbModel->GetParametersOfInterest();

        //RooStats::TestStatistic * pTestStatistic = new RooStats::ProfileLikelihoodTestStat(*pBModel->GetPdf());
        //RooStats::ToyMCSampler toymcs(*pTestStatistic, 1);
        pTestStatistic = new RooStats::ProfileLikelihoodTestStat(*pBModel->GetPdf());
        pToyMcSampler = new RooStats::ToyMCSampler(*pTestStatistic, 1);
        pToyMcSampler->SetPdf(*pBModel->GetPdf());
        pToyMcSampler->SetObservables(*pBModel->GetObservables());
        pToyMcSampler->SetParametersForTestStat(*pBModel->GetParametersOfInterest()); // just POI
        pToyMcSampler->SetGlobalObservables(*pBModel->GetGlobalObservables());
    }

    // load parameter point
    pWs->loadSnapshot("parametersToGenerateData");

    RooArgSet dummySet;
    data = pToyMcSampler->GenerateToyData(dummySet);
    std::cout << legend << "generated the following background-only pseudo-data:" << std::endl;
    data->Print();

    // count number of generated toys
    ++n_toys;

    return data;
}
예제 #3
0
Int_t Tprime::RunMcmc( std::string channel, // ejets, mujets, combined
                       std::string mode,    // observed, expected
                       double peak,         // resonance mass
                       std::string suffix,  // suffix for output file names
                       Int_t ntoys,         // number of pseudoexperiments for expected limit
                       Int_t mcmc_iter,     // number of MCMC iterations
                       Int_t mcmc_burnin,   // number of MCMC burn in steps to be discarded
                       std::string inputdir // input dir name
                     ) {
    //
    // Bayesian MCMC calculation
    //

    std::string legend = "[tprime::RunMcmc()]: ";

    // print out inputs
    std::cout << legend << std::endl;
    std::cout << legend << "Input parameters specified. Some of them are not used and defaults are entered" << std::endl;
    std::cout << legend << "------------------------------" << std::endl;
    std::cout << legend << "channel: " << channel << std::endl;
    std::cout << legend << "mode: " << mode << std::endl;
    std::cout << legend << "input directory: " << inputdir << std::endl;
    std::cout << legend << "resonance peak mass: " << peak << std::endl;
    std::cout << legend << "suffix: ->" << suffix << "<-" << std::endl;
    std::cout << legend << "number of pseudo-experiments: "<< ntoys << std::endl;
    std::cout << legend << std::endl;
    std::cout << legend << "Bayesian MCMC parameters" << std::endl;
    std::cout << legend << "------------------------------" << std::endl;
    std::cout << legend << "number of iterations: " << mcmc_iter << std::endl;
    std::cout << legend << "number of burn-in steps to discard: " << mcmc_burnin << std::endl;
    std::cout << legend << std::endl;

    // compose the workspace file name
    char buf[1024];
    sprintf(buf, "%sresults_%04.0f/tprime_%s_tprimeCrossSection_model.root", inputdir.c_str(), peak, channel.c_str());
    std::string _file = buf;
    std::cout << legend << "guessed name of the file with the workspace: >" << _file << "<" << std::endl;

    //load workspace
    LoadWorkspace(_file, channel);

    // change POI range
    double poiUpper = GetPoiUpper(channel, peak);
    std::cout << legend << "setting POI range to [0; " << poiUpper << "]" << std::endl;
    pWs->var("xsec")->setRange(0.0, poiUpper);

    // timer
    TStopwatch t;
    t.Start();

    int pe_counter = 0;
    std::vector<Double_t> _limits;
    while (pe_counter < ntoys) {

        // for mass limit, add k-factor systematics to the nsig systematics
        // FIXME: this is a correlated part of the uncertainty!!!
        //  - different uncertainties for graviton and Z' models
        if ( mode.find("mass_") != std::string::npos ) {

            std::cout << legend << std::endl;
            std::cout << legend << "this a mass limit calculation," << std::endl;
            std::cout << legend << "I would add k-factor uncertainty to the nsig uncertainty" << std::endl;
            std::cout << legend << "I would do it " << ntoys << " times, so one can average. " << pe_counter+1 << " of " << ntoys << std::endl;
            std::cout << legend << "Not implemented yet " << std::endl;
            std::cout << legend << std::endl;

            //Double_t kfactor_err = GetKfactorUncertainty(peak, mode);

            //double nsig_kappa = ws->var("nsig_kappa_dimuon")->getVal();
            //nsig_kappa = sqrt(nsig_kappa*nsig_kappa + kfactor_err*kfactor_err);
            //ws->var("nsig_kappa_dimuon")->setVal(nsig_kappa);

            //ntoys = 1;

        }

        else if ( mode.find("expected") != std::string::npos ) {

            std::cout << legend << std::endl;
            std::cout << legend << "this is pseudoexperiment " << pe_counter+1 << " of " << ntoys << std::endl;
            std::cout << legend << "for the expected limit estimate" << std::endl;
            std::cout << legend << std::endl;

            // prepare PE data
            GetPseudoData();

        }

        else { //  "regular" observed limit

            std::cout << legend << std::endl;
            std::cout << legend << "calculating an observed limit..." << std::endl;
            std::cout << legend << "I will do it " << ntoys << " times, so one can average. " << pe_counter+1 << " of " << ntoys << std::endl;
            std::cout << legend << std::endl;

            GetWorkspaceData("obsData");

            //ntoys = 1;
        }

        mcInt = GetMcmcInterval(0.95,        // conf level
                                mcmc_iter,   // number of iterations
                                mcmc_burnin, // number of burn-in to discard
                                0.0,         // left side tail fraction, 0 for upper limit
                                100);        // number of bins in posterior, only for plotting

        ++pe_counter;

        if (!mcInt) {
            continue;
        }
        else {

            std::string _outfile = "tprime_"+channel+"_xsec_mcmc_limit_" + suffix + ".ascii";
            printMcmcUpperLimit( peak, _outfile );

            // limits for averaging/medianing
            RooStats::ModelConfig * pSbModel = GetModelConfig("ModelConfig");
            RooRealVar * firstPOI = (RooRealVar*) pSbModel->GetParametersOfInterest()->first();
            double _limit = mcInt->UpperLimit(*firstPOI);
            _limits.push_back(_limit);

        } // end of valid mcInt block

    } // end of while

    // write median limit to a file
    if (_limits.size() > 0) {
        Double_t _median_limit = TMath::Median(_limits.size(), &_limits[0]);
        std::vector<Double_t> _mass_limit;
        _mass_limit.push_back(peak);
        _mass_limit.push_back(_median_limit);
        std::string _outfile = "tprime_"+channel+"_xsec_mcmc_median_limit_" + suffix + ".ascii";
        PrintToFile(_outfile, _mass_limit, "#  mass         median_limit");
    }

    std::string _outfile = "tprime_"+channel+"_xsec_mcmc_posterior_" + suffix + ".pdf";
    makeMcmcPosteriorPlot( _outfile );

    // timer
    t.Print();

    return 0;
}
예제 #4
0
Int_t Tprime::SetParameterPoints( std::string sbModelName,
                                  std::string bModelName ) {
    //
    // Fit the data with S+B model.
    // Make a snapshot of the S+B parameter point.
    // Profile with POI=0.
    // Make a snapshot of the B parameter point
    // (B model is the S+B model with POI=0
    //

    Double_t poi_value_for_b_model = 0.0;

    // get S+B model config from workspace
    RooStats::ModelConfig * pSbModel = (RooStats::ModelConfig *)pWs->obj(sbModelName.c_str());
    pSbModel->SetWorkspace(*pWs);

    // get parameter of interest set
    const RooArgSet * poi = pSbModel->GetParametersOfInterest();

    // get B model config from workspace
    RooStats::ModelConfig * pBModel = (RooStats::ModelConfig *)pWs->obj(bModelName.c_str());
    pBModel->SetWorkspace(*pWs);

    // make sure that data has been loaded
    if (!data) return -1;

    // find parameter point for global maximum with the S+B model,
    // with conditional MLEs for nuisance parameters
    // and save the parameter point snapshot in the Workspace
    RooAbsReal * nll = pSbModel->GetPdf()->createNLL(*data);
    RooAbsReal * profile = nll->createProfile(RooArgSet());
    profile->getVal(); // this will do fit and set POI and nuisance parameters to fitted values
    RooArgSet * poiAndNuisance = new RooArgSet();
    if(pSbModel->GetNuisanceParameters())
        poiAndNuisance->add(*pSbModel->GetNuisanceParameters());
    poiAndNuisance->add(*pSbModel->GetParametersOfInterest());
    pWs->defineSet("SPlusBModelParameters", *poiAndNuisance);
    pWs->saveSnapshot("SPlusBFitParameters",*poiAndNuisance);
    pSbModel->SetSnapshot(*poi);
    RooArgSet * sbModelFitParams = (RooArgSet *)poiAndNuisance->snapshot();
    cout << "\nWill save these parameter points that correspond to the fit to data" << endl;
    sbModelFitParams->Print("v");
    delete profile;
    delete nll;
    delete poiAndNuisance;
    delete sbModelFitParams;

    //

    // Find a parameter point for generating pseudo-data
    // with the background-only data.
    // Save the parameter point snapshot in the Workspace
    nll = pBModel->GetPdf()->createNLL(*data);
    profile = nll->createProfile(*poi);
    ((RooRealVar *)poi->first())->setVal(poi_value_for_b_model);
    profile->getVal(); // this will do fit and set nuisance parameters to profiled values
    poiAndNuisance = new RooArgSet();
    if(pBModel->GetNuisanceParameters())
        poiAndNuisance->add(*pBModel->GetNuisanceParameters());
    poiAndNuisance->add(*pBModel->GetParametersOfInterest());
    pWs->defineSet("parameterPointToGenerateData", *poiAndNuisance);
    pWs->saveSnapshot("parametersToGenerateData",*poiAndNuisance);
    pBModel->SetSnapshot(*poi);
    RooArgSet * paramsToGenerateData = (RooArgSet *)poiAndNuisance->snapshot();
    cout << "\nShould use these parameter points to generate pseudo data for bkg only" << endl;
    paramsToGenerateData->Print("v");
    delete profile;
    delete nll;
    delete poiAndNuisance;
    delete paramsToGenerateData;

    return 0;
}