本文整理汇总了C++中RooRealVar::getMax方法的典型用法代码示例。如果您正苦于以下问题:C++ RooRealVar::getMax方法的具体用法?C++ RooRealVar::getMax怎么用?C++ RooRealVar::getMax使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类RooRealVar
的用法示例。
在下文中一共展示了RooRealVar::getMax方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ComputeUpperLimit
void ComputeUpperLimit(RooAbsData *data, RooStats::ModelConfig *model, float &UpperLimit, float &signif, RooRealVar *mu, RooArgSet *nullParams,RooWorkspace *ws,REGION region,const char* tag) {
bool StoreEverything=false; // activate if you want to store frames and all
RooStats::ProfileLikelihoodCalculator *plc = new RooStats::ProfileLikelihoodCalculator(*data, *model);
plc->SetParameters(*mu);
plc->SetNullParameters(*nullParams);
plc->SetTestSize(0.05);
RooStats::LikelihoodInterval *interval = plc->GetInterval();
bool ComputationSuccessful=false;
UpperLimit = interval->UpperLimit(*mu,ComputationSuccessful);
signif = 0.0; // plc->GetHypoTest()->Significance(); // deactivated significance (to make algorithm faster)
if(!ComputationSuccessful) {
cout << "There seems to have been a problem. Returned upper limit is " << UpperLimit << " but it will be set to -999" << endl;
UpperLimit=-999;
signif=-999;
}
if(StoreEverything) {
// Store it all
RooRealVar* minv = (RooRealVar*)model->GetObservables()->first();
minv->setBins(static_cast<int>((minv->getMax()-minv->getMin())/5.));
RooPlot* frameEE = minv->frame(RooFit::Title("ee sample"));
frameEE->GetXaxis()->CenterTitle(1);
frameEE->GetYaxis()->CenterTitle(1);
RooPlot* frameMM = minv->frame(RooFit::Title("mm sample"));
frameMM->GetXaxis()->CenterTitle(1);
frameMM->GetYaxis()->CenterTitle(1);
RooPlot* frameOF = minv->frame(RooFit::Title("OF sample"));
frameOF->GetXaxis()->CenterTitle(1);
frameOF->GetYaxis()->CenterTitle(1);
data->plotOn(frameMM,RooFit::Cut("catCentral==catCentral::MMCentral"));
model->GetPdf()->plotOn(frameMM,RooFit::Slice(*ws->cat("catCentral"), "MMCentral"),RooFit::ProjWData(*data));
data->plotOn(frameEE,RooFit::Cut("catCentral==catCentral::EECentral"));
model->GetPdf()->plotOn(frameEE,RooFit::Slice(*ws->cat("catCentral"), "EECentral"),RooFit::ProjWData(*data));
data->plotOn(frameOF,RooFit::Cut("catCentral==catCentral::OFOSCentral"));
model->GetPdf()->plotOn(frameOF,RooFit::Slice(*ws->cat("catCentral"), "OFOSCentral"),RooFit::ProjWData(*data));
TFile *fout = new TFile("fout.root","UPDATE");
frameMM->Write(Concatenate(Concatenate(data->GetName(),"_MM"),tag),TObject::kOverwrite);
frameEE->Write(Concatenate(Concatenate(data->GetName(),"_EE"),tag),TObject::kOverwrite);
frameOF->Write(Concatenate(Concatenate(data->GetName(),"_OF"),tag),TObject::kOverwrite);
fout->Close();
}
delete plc;
plc=0;
}
示例2: adjustBinning
void THSEventsPDF::adjustBinning(Int_t* offset1) const
{
RooRealVar* xvar = fx_off ;
if (!dynamic_cast<RooRealVar*>(xvar)) {
coutE(InputArguments) << "RooDataHist::adjustBinning(" << GetName() << ") ERROR: dimension " << xvar->GetName() << " must be real" << endl ;
assert(0) ;
}
Double_t xlo = xvar->getMin() ;
Double_t xhi = xvar->getMax() ;
//adjust bin range limits with new scale parameter
//cout<<scale<<" "<<fMean<<" "<<xlo<<" "<<xhi<<endl;
xlo=(xlo-fMean)/scale+fMean;
xhi=(xhi-fMean)/scale+fMean;
if(xvar->getBinning().lowBound()==xlo&&xvar->getBinning().highBound()==xhi) return;
xvar->setRange(xlo,xhi) ;
// Int_t xmin(0) ;
// cout<<"THSEventsPDF::adjustBinning( "<<xlo <<" "<<xhi<<endl;
//now adjust fitting range to bin limits??Possibly not
if (fRHist->GetXaxis()->GetXbins()->GetArray()) {
RooBinning xbins(fRHist->GetNbinsX(),fRHist->GetXaxis()->GetXbins()->GetArray()) ;
Double_t tolerance = 1e-6*xbins.averageBinWidth() ;
// Adjust xlo/xhi to nearest boundary
Double_t xloAdj = xbins.binLow(xbins.binNumber(xlo+tolerance)) ;
Double_t xhiAdj = xbins.binHigh(xbins.binNumber(xhi-tolerance)) ;
xbins.setRange(xloAdj,xhiAdj) ;
xvar->setBinning(xbins) ;
if (fabs(xloAdj-xlo)>tolerance||fabs(xhiAdj-xhi)<tolerance) {
coutI(DataHandling) << "RooDataHist::adjustBinning(" << GetName() << "): fit range of variable " << xvar->GetName() << " expanded to nearest bin boundaries: ["
<< xlo << "," << xhi << "] --> [" << xloAdj << "," << xhiAdj << "]" << endl ;
}
} else {
RooBinning xbins(fRHist->GetXaxis()->GetXmin(),fRHist->GetXaxis()->GetXmax()) ;
xbins.addUniform(fRHist->GetNbinsX(),fRHist->GetXaxis()->GetXmin(),fRHist->GetXaxis()->GetXmax()) ;
Double_t tolerance = 1e-6*xbins.averageBinWidth() ;
// Adjust xlo/xhi to nearest boundary
Double_t xloAdj = xbins.binLow(xbins.binNumber(xlo+tolerance)) ;
Double_t xhiAdj = xbins.binHigh(xbins.binNumber(xhi-tolerance)) ;
xbins.setRange(xloAdj,xhiAdj) ;
xvar->setRange(xloAdj,xhiAdj) ;
//xvar->setRange(xlo,xhi) ;
}
return;
}
示例3: getChisq
double getChisq(RooAbsData &dat, RooAbsPdf &pdf, RooRealVar &var, bool prt=false) {
// Find total number of events
double nEvt;
double nTot=0.0;
for(int j=0; j<dat.numEntries(); j++) {
dat.get(j);
nEvt=dat.weight();
nTot+=nEvt;
}
// Find chi-squared equivalent 2NLL
//RooRealVar *var=(RooRealVar*)(pdf.getParameters(*dat)->find("CMS_hgg_mass"));
double totNLL=0.0;
double prbSum=0.0;
for(int j=0; j<dat.numEntries(); j++) {
double m=dat.get(j)->getRealValue(var.GetName());
if ( m < var.getMin() || m > var.getMax()) continue;
// Find probability density and hence probability
var.setVal(m);
double prb = var.getBinWidth(0)*pdf.getVal(var);
prbSum+=prb;
dat.get(j);
nEvt=dat.weight();
double mubin=nTot*prb;
double contrib(0.);
if (nEvt < 1) contrib = mubin;
else contrib=mubin-nEvt+nEvt*log(nEvt/mubin);
totNLL+=contrib;
if(prt) cout << "Bin " << j << " prob = " << prb << " nEvt = " << nEvt << ", mu = " << mubin << " contribution " << contrib << endl;
}
totNLL*=2.0;
if(prt) cout << pdf.GetName() << " nTot = " << nTot << " 2NLL constant = " << totNLL << endl;
return totNLL;
}
示例4: createWorkspace
//.........这里部分代码省略.........
for(int iRAP = 1; iRAP < nRAP+1; iRAP++){
for(int iPT = 1; iPT < nPT+1; iPT++){
for(int iL = 1; iL < nL+1; iL++){
Double_t ptMin = bordersPT[iPT-1];;
Double_t ptMax = bordersPT[iPT];;
Double_t rapMin = bordersRAP[iRAP-1];;
Double_t rapMax = bordersRAP[iRAP]; ;
Double_t lMin = bordersL[iL-1];;
Double_t lMax = bordersL[iL]; ;
if(pt_jpsi>ptMin && pt_jpsi<ptMax && TMath::Abs(y_jpsi)>rapMin && TMath::Abs(y_jpsi)<rapMax && lifetime>lMin && lifetime<lMax){
iRAPindex=iRAP;
iPTindex=iPT;
iLindex=iL;
}
}
}
}
double lifetimeErrRand = h_ctauerr_2011[iRAPindex][iPTindex][iLindex]->GetRandom();
lifetimeErr = lifetimeErrRand;
if (ientries%10000==0){
std::cout << "Test output: lifetimeErr " << lifetimeErr << " randomly drawn from from " << h_ctauerr_2011[iRAPindex][iPTindex][iLindex]->GetName() << std::endl;
}
*/
if (
M > chicMass->getMin() && M < chicMass->getMax()
&& pt > chicPt->getMin() && pt < chicPt->getMax()
&& y > chicRap->getMin() && y < chicRap->getMax()
&& M_jpsi > JpsiMass->getMin() && M_jpsi < JpsiMass->getMax()
&& pt_jpsi > JpsiPt->getMin() && pt_jpsi < JpsiPt->getMax()
&& y_jpsi > JpsiRap->getMin() && y_jpsi < JpsiRap->getMax()
&& lifetime > Jpsict->getMin() && lifetime < Jpsict->getMax()
&& lifetimeErr > JpsictErr->getMin() && lifetimeErr < JpsictErr->getMax()
) {
chicPt ->setVal(pt);
chicRap ->setVal(y);
chicMass ->setVal(M);
JpsiMass ->setVal(M_jpsi);
JpsiPt ->setVal(pt_jpsi);
JpsiRap ->setVal(y_jpsi);
Jpsict ->setVal(lifetime);
JpsictErr ->setVal(lifetimeErr);
//cout<<"JpsiRap->getVal() "<<JpsiRap->getVal()<<endl;
fullData->add(dataVars);
numEntriesInAnalysis++;
}
else {
numEntriesNotInAnalysis++;
//if (M < chicMass->getMin() || M > chicMass->getMax()) cout << "M " << M << endl;
//if (pt < chicPt->getMin() || pt > chicPt->getMax()) cout << "pt " << pt << endl;
//if (y < chicRap->getMin() || y > chicRap->getMax()) cout << "y " << y << endl;
//if (lifetime < Jpsict->getMin() || lifetime > Jpsict->getMax()) cout << "lifetime " << lifetime << endl;
//if (lifetimeErr < JpsictErr->getMin() || lifetimeErr > JpsictErr->getMax()) cout << "lifetimeErr " << lifetimeErr << endl;
//cout << "M " << M << endl;
//cout << "pt " << pt << endl;
示例5: slrts
//.........这里部分代码省略.........
RatioOfProfiledLikelihoodsTestStat
ropl(*sbModel->GetPdf(), *bModel->GetPdf(), bModel->GetSnapshot());
ropl.SetSubtractMLE(false);
//MyProfileLikelihoodTestStat profll(*sbModel->GetPdf());
ProfileLikelihoodTestStat profll(*sbModel->GetPdf());
if (testStatType == 3) profll.SetOneSided(1);
if (optimize) profll.SetReuseNLL(true);
TestStatistic * testStat = &slrts;
if (testStatType == 1) testStat = &ropl;
if (testStatType == 2 || testStatType == 3) testStat = &profll;
HypoTestCalculatorGeneric * hc = 0;
if (type == 0) hc = new FrequentistCalculator(*data, *bModel, *sbModel);
else hc = new HybridCalculator(*data, *bModel, *sbModel);
ToyMCSampler *toymcs = (ToyMCSampler*)hc->GetTestStatSampler();
//=== DEBUG
///// toymcs->SetWS( w ) ;
//=== DEBUG
toymcs->SetNEventsPerToy(1);
toymcs->SetTestStatistic(testStat);
if (optimize) toymcs->SetUseMultiGen(true);
if (type == 1) {
HybridCalculator *hhc = (HybridCalculator*) hc;
hhc->SetToys(ntoys,ntoys);
// check for nuisance prior pdf
if (bModel->GetPriorPdf() && sbModel->GetPriorPdf() ) {
hhc->ForcePriorNuisanceAlt(*bModel->GetPriorPdf());
hhc->ForcePriorNuisanceNull(*sbModel->GetPriorPdf());
}
else {
if (bModel->GetNuisanceParameters() || sbModel->GetNuisanceParameters() ) {
Error("RA2bHypoTestInvDemo","Cannnot run Hybrid calculator because no prior on the nuisance parameter is specified");
return 0;
}
}
}
else
((FrequentistCalculator*) hc)->SetToys(ntoys,ntoys);
// Get the result
RooMsgService::instance().getStream(1).removeTopic(RooFit::NumIntegration);
TStopwatch tw; tw.Start();
const RooArgSet * poiSet = sbModel->GetParametersOfInterest();
RooRealVar *poi = (RooRealVar*)poiSet->first();
// fit the data first
sbModel->GetPdf()->fitTo(*data);
double poihat = poi->getVal();
HypoTestInverter calc(*hc);
calc.SetConfidenceLevel(0.95);
calc.UseCLs(useCls);
calc.SetVerbose(true);
// can speed up using proof-lite
if (useProof && nworkers > 1) {
ProofConfig pc(*w, nworkers, "", kFALSE);
toymcs->SetProofConfig(&pc); // enable proof
}
printf(" npoints = %d, poimin = %7.2f, poimax = %7.2f\n\n", npoints, poimin, poimax ) ;
cout << flush ;
if ( npoints==1 ) {
std::cout << "Evaluating one point : " << poimax << std::endl;
calc.RunOnePoint(poimax);
} else if (npoints > 0) {
if (poimin >= poimax) {
// if no min/max given scan between MLE and +4 sigma
poimin = int(poihat);
poimax = int(poihat + 4 * poi->getError());
}
std::cout << "Doing a fixed scan in interval : " << poimin << " , " << poimax << std::endl;
calc.SetFixedScan(npoints,poimin,poimax);
}
else {
//poi->setMax(10*int( (poihat+ 10 *poi->getError() )/10 ) );
std::cout << "Doing an automatic scan in interval : " << poi->getMin() << " , " << poi->getMax() << std::endl;
}
cout << "\n\n right before calc.GetInterval(), ntoys = " << ntoys << " \n\n" << flush ;
HypoTestInverterResult * r = calc.GetInterval();
return r;
}
示例6: OneSidedFrequentistUpperLimitWithBands_intermediate
//.........这里部分代码省略.........
ProofConfig pc(*w, 4, "",false);
if(mc->GetGlobalObservables()){
cout << "will use global observables for unconditional ensemble"<<endl;
mc->GetGlobalObservables()->Print();
toymcsampler->SetGlobalObservables(*mc->GetGlobalObservables());
}
toymcsampler->SetProofConfig(&pc); // enable proof
// Now get the interval
PointSetInterval* interval = fc.GetInterval();
ConfidenceBelt* belt = fc.GetConfidenceBelt();
// print out the iterval on the first Parameter of Interest
cout << "\n95% interval on " <<firstPOI->GetName()<<" is : ["<<
interval->LowerLimit(*firstPOI) << ", "<<
interval->UpperLimit(*firstPOI) <<"] "<<endl;
// get observed UL and value of test statistic evaluated there
RooArgSet tmpPOI(*firstPOI);
double observedUL = interval->UpperLimit(*firstPOI);
firstPOI->setVal(observedUL);
double obsTSatObsUL = fc.GetTestStatSampler()->EvaluateTestStatistic(*data,tmpPOI);
// Ask the calculator which points were scanned
RooDataSet* parameterScan = (RooDataSet*) fc.GetPointsToScan();
RooArgSet* tmpPoint;
// make a histogram of parameter vs. threshold
TH1F* histOfThresholds = new TH1F("histOfThresholds","",
parameterScan->numEntries(),
firstPOI->getMin(),
firstPOI->getMax());
histOfThresholds->GetXaxis()->SetTitle(firstPOI->GetName());
histOfThresholds->GetYaxis()->SetTitle("Threshold");
// loop through the points that were tested and ask confidence belt
// what the upper/lower thresholds were.
// For FeldmanCousins, the lower cut off is always 0
for(Int_t i=0; i<parameterScan->numEntries(); ++i){
tmpPoint = (RooArgSet*) parameterScan->get(i)->clone("temp");
double arMax = belt->GetAcceptanceRegionMax(*tmpPoint);
double poiVal = tmpPoint->getRealValue(firstPOI->GetName()) ;
histOfThresholds->Fill(poiVal,arMax);
}
TCanvas* c1 = new TCanvas();
c1->Divide(2);
c1->cd(1);
histOfThresholds->SetMinimum(0);
histOfThresholds->Draw();
c1->cd(2);
/////////////////////////////////////////////////////////////
// Now we generate the expected bands and power-constriant
////////////////////////////////////////////////////////////
// First: find parameter point for mu=0, with conditional MLEs for nuisance parameters
RooAbsReal* nll = mc->GetPdf()->createNLL(*data);
RooAbsReal* profile = nll->createProfile(*mc->GetParametersOfInterest());
firstPOI->setVal(0.);
profile->getVal(); // this will do fit and set nuisance parameters to profiled values
RooArgSet* poiAndNuisance = new RooArgSet();
if(mc->GetNuisanceParameters())
poiAndNuisance->add(*mc->GetNuisanceParameters());
poiAndNuisance->add(*mc->GetParametersOfInterest());
开发者ID:gerbaudo,项目名称:hlfv-fitmodel,代码行数:67,代码来源:OneSidedFrequentistUpperLimitWithBands_intermediate.C
示例7: fitPtOverMCJLST
//.........这里部分代码省略.........
sprintf(fileToSave,"bb%s",changeParName.c_str()); bb.SetName(fileToSave);
sprintf(fileToSave,"bb2%s",changeParName.c_str()); bb2.SetName(fileToSave);
sprintf(fileToSave,"fexp%s",changeParName.c_str()); fexp.SetName(fileToSave);
sprintf(fileToSave,"T%s",changeParName.c_str()); T.SetName(fileToSave);
}
(RooArgSet(m,n,n2,bb,bb2,fexp,T)).writeToStream(os1,false);
os1.close();
RooRealVar mup("mup","emme", 1.,0.01, 30.);
RooRealVar nup("nup","enne", 0.93, 0.5, 15.);
RooRealVar n2up("n2up","enne2", 0.75, 0.5, 15.);
RooRealVar bbup("bbup","bibi",0.02, 0.00005, 20.0);
RooRealVar Tup("Tup","tti",0.2,0.00000005,1.);
RooRealVar bb2up("bb2up","bibi2",0.02, 0.0005, 10.0);
RooRealVar fexpup("fexpup","f_exp",0.02, 0.0, 1.0);
RooModifTsallis* rt3up = new RooModifTsallis("rt3up","rt3up",*ptoverm,mup,nup,n2up,bbup,bb2up,Tup,fexpup);
// ws->import(*rt3up);
RooRealVar mdown("mdown","emme", 1.,0.01, 30.);
RooRealVar ndown("ndown","enne", 0.93, 0.5, 15.);
RooRealVar n2down("n2down","enne2", 0.75, 0.5, 15.);
RooRealVar bbdown("bbdown","bibi",0.02, 0.00005, 20.0);
RooRealVar Tdown("Tdown","tti",0.2,0.00000005,1.);
RooRealVar bb2down("bb2down","bibi2",0.02, 0.0005, 10.0);
RooRealVar fexpdown("fexpdown","f_exp",0.02, 0.0, 1.0);
RooModifTsallis* rt3down = new RooModifTsallis("rt3down","rt3down",*ptoverm,mdown,ndown,n2down,bbdown,bb2down,Tdown,fexpdown);
// ws->import(*rt3down);
RooPlot *frame = ptoverm->frame();
char reducestr[300];
sprintf(reducestr,"ptoverm > %f && ptoverm < %f",ptoverm->getMin(),ptoverm->getMax());
rdh->plotOn(frame,DataError(RooAbsData::SumW2),Cut(reducestr));
static RooHist *hpull;
float chi2 = 0.;
if (changeParName == "") {
sprintf(fileToSave,"text/paramsPTOverMCJLST_%s%d_%dTeV_Default.txt",nameSample[whichtype].c_str(),mass,LHCsqrts);
ifstream is1(fileToSave);
(RooArgSet(mup,nup,n2up,bbup,bb2up,fexpup,Tup)).readFromStream(is1,false);
mdown.setVal(fabs(3*mup.getVal() - 2*m.getVal()));
ndown.setVal(fabs(3*nup.getVal() - 2*n.getVal()));
n2down.setVal(fabs(3*n2up.getVal() - 2*n2.getVal()));
bbdown.setVal(fabs(3*bbup.getVal() - 2*bb.getVal()));
Tdown.setVal(fabs(3*Tup.getVal() - 2*T.getVal()));
bb2down.setVal(fabs(3*bb2up.getVal() - 2*bb2.getVal()));
fexpdown.setVal(fabs(3*fexpup.getVal() - 2*fexp.getVal()));
if (showErrorPDFs) {
rt3->plotOn(frame,LineColor(kRed),LineStyle(kDashed),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent));
hpull = frame->pullHist();
rt3up->plotOn(frame,LineColor(kBlue),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent));
if (systString.find("Mela") == string::npos) rt3down->plotOn(frame,LineColor(kRed),LineStyle(kDashed),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent));
} else {
rt3->plotOn(frame,LineColor(kBlue),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent));
hpull = frame->pullHist();
}
} else {
mup.setVal(m.getVal() + m.getError()); cout << "mup = " << mup.getVal() << endl;
nup.setVal(n.getVal() + n.getError());
n2up.setVal(n2.getVal() + n2.getError());
bbup.setVal(bb.getVal() + bb.getError());
示例8: slrts
//.........这里部分代码省略.........
nuisPdf = RooStats::MakeNuisancePdf(*sbModel,"nuisancePdf_sbmodel");
}
if (!nuisPdf ) {
if (bModel->GetPriorPdf()) {
nuisPdf = bModel->GetPriorPdf();
Info("StandardHypoTestInvDemo","No nuisance pdf given - try to use %s that is defined as a prior pdf in the B model",nuisPdf->GetName());
}
else {
Error("StandardHypoTestInvDemo","Cannnot run Hybrid calculator because no prior on the nuisance parameter is specified or can be derived");
return 0;
}
}
assert(nuisPdf);
Info("StandardHypoTestInvDemo","Using as nuisance Pdf ... " );
nuisPdf->Print();
const RooArgSet * nuisParams = (bModel->GetNuisanceParameters() ) ? bModel->GetNuisanceParameters() : sbModel->GetNuisanceParameters();
RooArgSet * np = nuisPdf->getObservables(*nuisParams);
if (np->getSize() == 0) {
Warning("StandardHypoTestInvDemo","Prior nuisance does not depend on nuisance parameters. They will be smeared in their full range");
}
delete np;
hhc->ForcePriorNuisanceAlt(*nuisPdf);
hhc->ForcePriorNuisanceNull(*nuisPdf);
}
}
else if (type == 2 || type == 3) {
if (testStatType == 3) ((AsymptoticCalculator*) hc)->SetOneSided(true);
if (testStatType != 2 && testStatType != 3)
Warning("StandardHypoTestInvDemo","Only the PL test statistic can be used with AsymptoticCalculator - use by default a two-sided PL");
}
else if (type == 0 || type == 1)
((FrequentistCalculator*) hc)->SetToys(ntoys,ntoys/mNToysRatio);
// Get the result
RooMsgService::instance().getStream(1).removeTopic(RooFit::NumIntegration);
HypoTestInverter calc(*hc);
calc.SetConfidenceLevel(0.95);
calc.UseCLs(useCLs);
calc.SetVerbose(true);
// can speed up using proof-lite
if (mUseProof && mNWorkers > 1) {
ProofConfig pc(*w, mNWorkers, "", kFALSE);
toymcs->SetProofConfig(&pc); // enable proof
}
if (npoints > 0) {
if (poimin > poimax) {
// if no min/max given scan between MLE and +4 sigma
poimin = int(poihat);
poimax = int(poihat + 4 * poi->getError());
}
std::cout << "Doing a fixed scan in interval : " << poimin << " , " << poimax << std::endl;
calc.SetFixedScan(npoints,poimin,poimax);
}
else {
//poi->setMax(10*int( (poihat+ 10 *poi->getError() )/10 ) );
std::cout << "Doing an automatic scan in interval : " << poi->getMin() << " , " << poi->getMax() << std::endl;
}
tw.Start();
HypoTestInverterResult * r = calc.GetInterval();
std::cout << "Time to perform limit scan \n";
tw.Print();
if (mRebuild) {
calc.SetCloseProof(1);
tw.Start();
SamplingDistribution * limDist = calc.GetUpperLimitDistribution(true,mNToyToRebuild);
std::cout << "Time to rebuild distributions " << std::endl;
tw.Print();
if (limDist) {
std::cout << "expected up limit " << limDist->InverseCDF(0.5) << " +/- "
<< limDist->InverseCDF(0.16) << " "
<< limDist->InverseCDF(0.84) << "\n";
//update r to a new updated result object containing the rebuilt expected p-values distributions
// (it will not recompute the expected limit)
if (r) delete r; // need to delete previous object since GetInterval will return a cloned copy
r = calc.GetInterval();
}
else
std::cout << "ERROR : failed to re-build distributions " << std::endl;
}
return r;
}
示例9: DiagnosisMacro
//.........这里部分代码省略.........
// Construct unbinned likelihood
RooAbsReal* nll = model->createNLL(*data, NumCPU(CPUused));
// Minimize likelihood w.r.t all parameters before making plots
RooMinuit(*nll).migrad();
//////////////////////////////////////////////////////
/////////////////// L O O P O V E R P A R A M E T E R S
/////////////////////////////////////////////////////
/// Set up loop over parameters
TString ParamName;
double ParamValue;
double ParamError;
double ParamLimitLow;
double ParamLimitHigh;
double FitRangeLow;
double FitRangeHigh;
RooRealVar* vParam;
int counter = 0;
// Loop start
TIterator* iter = paramSet2->createIterator();
TObject* var = iter->Next();
while (var != 0) {
counter++;
ParamName = var->GetName();
vParam = w->var(ParamName);
ParamValue = vParam->getVal();
ParamError = vParam->getError();
ParamLimitLow = vParam->getMin();
ParamLimitHigh = vParam->getMax();
cout << ParamName << " has value " << ParamValue << " with error: " << ParamError << " and limits: " << ParamLimitLow << " to " << ParamLimitHigh << endl << endl;
if (ParamError == 0) { //Skipping fixed parameters
cout << "Parameter was fixed, skipping its fitting" << endl;
cout << endl << "DONE WITH " << counter << " PARAMETER OUT OF " << Nparams << endl << endl;
var = iter->Next();
continue;
}
// determining fit range: Nsigma sigma on each side unless it would be outside of parameter limits
if ((ParamValue - Nsigma * ParamError) > ParamLimitLow) {
FitRangeLow = (ParamValue - Nsigma * ParamError);
}
else {
FitRangeLow = ParamLimitLow;
}
if ((ParamValue + Nsigma * ParamError) < ParamLimitHigh) {
FitRangeHigh = (ParamValue + Nsigma * ParamError);
}
else {
FitRangeHigh = ParamLimitHigh;
}
// P l o t p l a i n l i k e l i h o o d a n d C o n s t r u c t p r o f i l e l i k e l i h o o d
// ---------------------------------------------------
RooPlot* frame1;
RooAbsReal* pll=NULL;
if (Nbins != 0) {
frame1 = vParam->frame(Bins(Nbins), Range(FitRangeLow, FitRangeHigh), Title(TString::Format("LL and profileLL in %s", ParamName.Data())));
示例10: test_counting_experiment
//.........这里部分代码省略.........
ModelConfig * sbModel = (ModelConfig*) mc.Clone();
sbModel->SetName("S+B Model");
RooRealVar* poi = (RooRealVar*) sbModel->GetParametersOfInterest()->first();
poi->setVal(1); // set POI snapshot in S+B model for expected significance
sbModel->SetSnapshot(*poi);
ModelConfig * bModel = (ModelConfig*) mc.Clone();
bModel->SetName("B Model");
RooRealVar* poi2 = (RooRealVar*) bModel->GetParametersOfInterest()->first();
poi2->setVal(0);
bModel->SetSnapshot( *poi2 );
//------------------Limit calculation for N_th event expected = 10
AsymptoticCalculator ac(data, *bModel, *sbModel);
//ac.SetOneSidedDiscovery(true); // for one-side discovery test
// ac.SetOneSided(true); // for one-side tests (limits)
ac.SetQTilde(true);
ac.SetPrintLevel(2); // to suppress print level
// create hypotest inverter
// passing the desired calculator
HypoTestInverter *calc = new HypoTestInverter(ac); // for asymptotic
//HypoTestInverter calc(fc); // for frequentist
calc->SetConfidenceLevel(0.90);
//calc->UseCLs(false);
calc->UseCLs(true);
int npoints = 500; // number of points to scan
//int npoints = 1000; // number of points to scan default 1000
// min and max (better to choose smaller intervals)
double poimin = poi->getMin();
double poimax = poi->getMax();
//poimin = 0; poimax=10;
std::cout << "Doing a fixed scan in interval : " << poimin << " , " << poimax << std::endl;
calc->SetFixedScan(npoints,poimin,poimax);
calc->SetVerbose(2);
HypoTestInverterResult * r = calc->GetInterval();
double upperLimit = r->UpperLimit();
std::cout << "The computed Expected upper limit is: " << r->GetExpectedUpperLimit(0) << std::endl;
//------------ Getting the interval as function of m --------------//
/* ifstream in;
in.open("integral_mass.dat");
vector <double> masses_v;
vector <double> observed_v;
vector <double> expected_v;
vector <double> expected_gaud_v;
vector <double> expected_S1_up_v;
vector <double> expected_S1_dw_v;
vector <double> expected_S2_up_v;
vector <double> expected_S2_dw_v;
double mass_itr =0.;
double Nev_exp_th_itr =0.;
double xsec_modifier = 10.;
double N_tot_theory = w.var("N_tot_theory")->getValV();
while(mass_itr <1000.){
in >> mass_itr;
示例11: progressBar
///
/// Perform the 1d Prob scan.
/// Saves chi2 values and the prob-Scan p-values in a root tree
/// For the datasets stuff, we do not yet have a MethodDatasetsProbScan class, so we do it all in
/// MethodDatasetsProbScan
/// \param nRun Part of the root tree file name to facilitate parallel production.
///
int MethodDatasetsProbScan::scan1d(bool fast, bool reverse)
{
if (fast) return 0; // tmp
if ( arg->debug ) cout << "MethodDatasetsProbScan::scan1d() : starting ... " << endl;
// Set limit to all parameters.
this->loadParameterLimits(); /// Default is "free", if not changed by cmd-line parameter
// Define scan parameter and scan range.
RooRealVar *parameterToScan = w->var(scanVar1);
float parameterToScan_min = hCL->GetXaxis()->GetXmin();
float parameterToScan_max = hCL->GetXaxis()->GetXmax();
// do a free fit
RooFitResult *result = this->loadAndFit(this->pdf); // fit on data
assert(result);
RooSlimFitResult *slimresult = new RooSlimFitResult(result,true);
slimresult->setConfirmed(true);
solutions.push_back(slimresult);
double freeDataFitValue = w->var(scanVar1)->getVal();
// Define outputfile
system("mkdir -p root");
TString probResName = Form("root/scan1dDatasetsProb_" + this->pdf->getName() + "_%ip" + "_" + scanVar1 + ".root", arg->npoints1d);
TFile* outputFile = new TFile(probResName, "RECREATE");
// Set up toy root tree
this->probScanTree = new ToyTree(this->pdf, arg);
this->probScanTree->init();
this->probScanTree->nrun = -999; //\todo: why does this branch even exist in the output tree of the prob scan?
// Save parameter values that were active at function
// call. We'll reset them at the end to be transparent
// to the outside.
RooDataSet* parsFunctionCall = new RooDataSet("parsFunctionCall", "parsFunctionCall", *w->set(pdf->getParName()));
parsFunctionCall->add(*w->set(pdf->getParName()));
// start scan
cout << "MethodDatasetsProbScan::scan1d_prob() : starting ... with " << nPoints1d << " scanpoints..." << endl;
ProgressBar progressBar(arg, nPoints1d);
for ( int i = 0; i < nPoints1d; i++ )
{
progressBar.progress();
// scanpoint is calculated using min, max, which are the hCL x-Axis limits set in this->initScan()
// this uses the "scan" range, as expected
// don't add half the bin size. try to solve this within plotting method
float scanpoint = parameterToScan_min + (parameterToScan_max - parameterToScan_min) * (double)i / ((double)nPoints1d - 1);
if (arg->debug) cout << "DEBUG in MethodDatasetsProbScan::scan1d_prob() " << scanpoint << " " << parameterToScan_min << " " << parameterToScan_max << endl;
this->probScanTree->scanpoint = scanpoint;
if (arg->debug) cout << "DEBUG in MethodDatasetsProbScan::scan1d_prob() - scanpoint in step " << i << " : " << scanpoint << endl;
// don't scan in unphysical region
// by default this means checking against "free" range
if ( scanpoint < parameterToScan->getMin() || scanpoint > parameterToScan->getMax() + 2e-13 ) {
cout << "it seems we are scanning in an unphysical region: " << scanpoint << " < " << parameterToScan->getMin() << " or " << scanpoint << " > " << parameterToScan->getMax() + 2e-13 << endl;
exit(EXIT_FAILURE);
}
// FIT TO REAL DATA WITH FIXED HYPOTHESIS(=SCANPOINT).
// THIS GIVES THE NUMERATOR FOR THE PROFILE LIKELIHOOD AT THE GIVEN HYPOTHESIS
// THE RESULTING NUISANCE PARAMETERS TOGETHER WITH THE GIVEN HYPOTHESIS ARE ALSO
// USED WHEN SIMULATING THE TOY DATA FOR THE FELDMAN-COUSINS METHOD FOR THIS HYPOTHESIS(=SCANPOINT)
// Here the scanvar has to be fixed -> this is done once per scanpoint
// and provides the scanner with the DeltaChi2 for the data as reference
// additionally the nuisances are set to the resulting fit values
parameterToScan->setVal(scanpoint);
parameterToScan->setConstant(true);
RooFitResult *result = this->loadAndFit(this->pdf); // fit on data
assert(result);
if (arg->debug) {
cout << "DEBUG in MethodDatasetsProbScan::scan1d_prob() - minNll data scan at scan point " << scanpoint << " : " << 2 * result->minNll() << ": "<< 2 * pdf->getMinNll() << endl;
}
this->probScanTree->statusScanData = result->status();
// set chi2 of fixed fit: scan fit on data
// CAVEAT: chi2min from fitresult gives incompatible results to chi2min from pdf
// this->probScanTree->chi2min = 2 * result->minNll();
this->probScanTree->chi2min = 2 * pdf->getMinNll();
this->probScanTree->covQualScanData = result->covQual();
this->probScanTree->scanbest = freeDataFitValue;
// After doing the fit with the parameter of interest constrained to the scanpoint,
// we are now saving the fit values of the nuisance parameters. These values will be
// used to generate toys according to the PLUGIN method.
this->probScanTree->storeParsScan(); // \todo : figure out which one of these is semantically the right one
//.........这里部分代码省略.........
示例12: createWorkspace
void createWorkspace(const std::string &infilename, int nState, bool correctCtau, bool drawRapPt2D, bool drawPtCPM2D){
gROOT->SetStyle("Plain");
gStyle->SetTitleBorderSize(0);
// Set some strings
const std::string workspacename = "ws_masslifetime",
treename = "selectedData";
// Get the tree from the data file
TFile *f = TFile::Open(infilename.c_str());
TTree *tree = (TTree*)f->Get(treename.c_str());
// Set branch addresses in tree to be able to import tree to roofit
TLorentzVector* jpsi = new TLorentzVector;
tree->SetBranchAddress("JpsiP",&jpsi);
double CPMval = 0;
tree->SetBranchAddress("CPM",&CPMval);
double massErr = 0;
tree->SetBranchAddress("JpsiMassErr",&massErr);
double Vprob = 0;
tree->SetBranchAddress("JpsiVprob",&Vprob);
double lifetime = 0;
tree->SetBranchAddress("Jpsict",&lifetime);
double lifetimeErr = 0;
tree->SetBranchAddress("JpsictErr",&lifetimeErr);
// define variables necessary for J/Psi(Psi(2S)) mass,lifetime fit
RooRealVar* JpsiMass =
new RooRealVar("JpsiMass", "M [GeV]", onia::massMin, onia::massMax);
RooRealVar* JpsiMassErr =
new RooRealVar("JpsiMassErr", "#delta M [GeV]", 0, 5);
RooRealVar* JpsiRap =
new RooRealVar("JpsiRap", "y", -onia::rap, onia::rap);
RooRealVar* JpsiPt =
new RooRealVar("JpsiPt", "p_{T} [GeV]", 0. ,100.);
RooRealVar* JpsiCPM =
new RooRealVar("JpsiCPM", "N_{ch}", 0. ,100.);
RooRealVar* Jpsict =
new RooRealVar("Jpsict", "lifetime [mm]", -1., 2.5);
RooRealVar* JpsictErr =
new RooRealVar("JpsictErr", "Error on lifetime [mm]", 0.0001, 1);
RooRealVar* JpsiVprob =
new RooRealVar("JpsiVprob", "", 0.01, 1.);
// Set bins
Jpsict->setBins(10000,"cache");
Jpsict->setBins(100);
JpsiMass->setBins(100);
JpsictErr->setBins(100);
// The list of data variables
RooArgList dataVars(*JpsiMass,*JpsiMassErr,*JpsiRap,*JpsiPt,*JpsiCPM,*Jpsict,*JpsictErr,*JpsiVprob);
// construct dataset to contain events
RooDataSet* fullData = new RooDataSet("fullData","The Full Data From the Input ROOT Trees",dataVars);
int entries = tree->GetEntries();
cout << "entries " << entries << endl;
// loop through events in tree and save them to dataset
for (int ientries = 0; ientries < entries; ientries++) {
if (ientries%100000==0) std::cout << "event " << ientries << " of " << entries << std::endl;
tree->GetEntry(ientries);
double M =jpsi->M();
double y=jpsi->Rapidity();
double pt=jpsi->Pt();
double cpm=CPMval;
if (M > JpsiMass->getMin() && M < JpsiMass->getMax()
&& massErr > JpsiMassErr->getMin() && massErr < JpsiMassErr->getMax()
&& pt > JpsiPt->getMin() && pt < JpsiPt->getMax()
&& cpm > JpsiCPM->getMin() && cpm < JpsiCPM->getMax()
&& y > JpsiRap->getMin() && y < JpsiRap->getMax()
&& lifetime > Jpsict->getMin() && lifetime < Jpsict->getMax()
&& lifetimeErr > JpsictErr->getMin() && lifetimeErr < JpsictErr->getMax()
&& Vprob > JpsiVprob->getMin() && Vprob < JpsiVprob->getMax()
){
JpsiPt ->setVal(pt);
JpsiCPM ->setVal(cpm);
JpsiRap ->setVal(y);
JpsiMass ->setVal(M);
JpsiMassErr ->setVal(massErr);
JpsiVprob ->setVal(Vprob);
//cout<<"before lifetime correction \n"
// <<"Jpsict: "<<lifetime<<" JpsictErr: "<<lifetimeErr<<endl;
if(correctCtau){
lifetime = lifetime * onia::MpsiPDG / M ;
lifetimeErr = lifetimeErr * onia::MpsiPDG / M ;
Jpsict ->setVal(lifetime);
JpsictErr ->setVal(lifetimeErr);
//cout<<"MpsiPDG: "<<onia::MpsiPDG<<endl;
//cout<<"after lifetime correction \n"
// <<"Jpsict: "<<lifetime<<" JpsictErr: "<<lifetimeErr<<endl;
//.........这里部分代码省略.........
示例13: StandardTestStatDistributionDemo
void StandardTestStatDistributionDemo(const char* infile = "",
const char* workspaceName = "combined",
const char* modelConfigName = "ModelConfig",
const char* dataName = "obsData"){
// the number of toy MC used to generate the distribution
int nToyMC = 1000;
// The parameter below is needed for asymptotic distribution to be chi-square,
// but set to false if your model is not numerically stable if mu<0
bool allowNegativeMu=true;
/////////////////////////////////////////////////////////////
// First part is just to access a user-defined file
// or create the standard example file if it doesn't exist
////////////////////////////////////////////////////////////
const char* filename = "";
if (!strcmp(infile,"")) {
filename = "results/example_combined_GaussExample_model.root";
bool fileExist = !gSystem->AccessPathName(filename); // note opposite return code
// if file does not exists generate with histfactory
if (!fileExist) {
#ifdef _WIN32
cout << "HistFactory file cannot be generated on Windows - exit" << endl;
return;
#endif
// Normally this would be run on the command line
cout <<"will run standard hist2workspace example"<<endl;
gROOT->ProcessLine(".! prepareHistFactory .");
gROOT->ProcessLine(".! hist2workspace config/example.xml");
cout <<"\n\n---------------------"<<endl;
cout <<"Done creating example input"<<endl;
cout <<"---------------------\n\n"<<endl;
}
}
else
filename = infile;
// Try to open the file
TFile *file = TFile::Open(filename);
// if input file was specified byt not found, quit
if(!file ){
cout <<"StandardRooStatsDemoMacro: Input file " << filename << " is not found" << endl;
return;
}
/////////////////////////////////////////////////////////////
// Now get the data and workspace
////////////////////////////////////////////////////////////
// get the workspace out of the file
RooWorkspace* w = (RooWorkspace*) file->Get(workspaceName);
if(!w){
cout <<"workspace not found" << endl;
return;
}
// get the modelConfig out of the file
ModelConfig* mc = (ModelConfig*) w->obj(modelConfigName);
// get the modelConfig out of the file
RooAbsData* data = w->data(dataName);
// make sure ingredients are found
if(!data || !mc){
w->Print();
cout << "data or ModelConfig was not found" <<endl;
return;
}
mc->Print();
/////////////////////////////////////////////////////////////
// Now find the upper limit based on the asymptotic results
////////////////////////////////////////////////////////////
RooRealVar* firstPOI = (RooRealVar*) mc->GetParametersOfInterest()->first();
ProfileLikelihoodCalculator plc(*data,*mc);
LikelihoodInterval* interval = plc.GetInterval();
double plcUpperLimit = interval->UpperLimit(*firstPOI);
delete interval;
cout << "\n\n--------------------------------------"<<endl;
cout <<"Will generate sampling distribution at " << firstPOI->GetName() << " = " << plcUpperLimit <<endl;
int nPOI = mc->GetParametersOfInterest()->getSize();
if(nPOI>1){
cout <<"not sure what to do with other parameters of interest, but here are their values"<<endl;
mc->GetParametersOfInterest()->Print("v");
}
/////////////////////////////////////////////
// create thte test stat sampler
ProfileLikelihoodTestStat ts(*mc->GetPdf());
// to avoid effects from boundary and simplify asymptotic comparison, set min=-max
if(allowNegativeMu)
firstPOI->setMin(-1*firstPOI->getMax());
// temporary RooArgSet
//.........这里部分代码省略.........
示例14: if
///
/// Perform 1d Prob scan.
///
/// - Scan range defined through limit "scan".
/// - Will fill the hCL histogram with the 1-CL curve.
/// - Start at a scan value that is in the middle of the allowed
/// range, preferably a solution, and scan up and down from there.
/// - use the "probforce" command line flag to enable force minimum finding
///
/// \param fast This will scan each scanpoint only once.
/// \param reverse This will scan in reverse direction.
/// When using the drag mode, this can sometimes make a difference.
/// \return status: 2 = new global minimum found, 1 = error
///
int MethodProbScan::scan1d(bool fast, bool reverse)
{
if ( arg->debug ) cout << "MethodProbScan::scan1d() : starting ... " << endl;
nScansDone++;
// The "improve" method doesn't need multiple scans.
if ( arg->probforce || arg->probimprove ) fast = true;
if ( arg->probforce ) scanDisableDragMode = true;
// Save parameter values that were active at function call.
if ( startPars ) delete startPars;
startPars = new RooDataSet("startPars", "startPars", *w->set(parsName));
startPars->add(*w->set(parsName));
// // start scan from global minimum (not always a good idea as we need to set from other places as well)
// setParameters(w, parsName, globalMin);
// load scan parameter and scan range
setLimit(w, scanVar1, "scan");
RooRealVar *par = w->var(scanVar1);
assert(par);
float min = hCL->GetXaxis()->GetXmin();
float max = hCL->GetXaxis()->GetXmax();
if ( fabs(par->getMin()-min)>1e-6 || fabs(par->getMax()-max)>1e-6 ){
cout << "MethodProbScan::scan1d() : WARNING : Scan range was changed after initScan()" << endl;
cout << " was called so the old range will be used." << endl;
}
if ( arg->verbose ){
cout << "\nProb configuration:" << endl;
cout << " combination : " << title << endl;
cout << " scan variable : " << scanVar1 << endl;
cout << " scan range : " << min << " ... " << max << endl;
cout << " scan steps : " << nPoints1d << endl;
cout << " fast mode : " << fast << endl;
cout << endl;
}
// Set limit to all parameters.
combiner->loadParameterLimits();
// fix scan parameter
par->setConstant(true);
// j =
// 0 : start value -> upper limit
// 1 : upper limit -> start value
// 2 : start value -> lower limit
// 3 : lower limit -> start value
float startValue = par->getVal();
bool scanUp;
// for the status bar
float nTotalSteps = nPoints1d;
nTotalSteps *= fast ? 1 : 2;
float nStep = 0;
float printFreq = nTotalSteps>15 ? 10 : nTotalSteps;
// Report on the smallest new minimum we come across while scanning.
// Sometimes the scan doesn't find the minimum
// that was found before. Warn if this happens.
double bestMinOld = chi2minGlobal;
double bestMinFoundInScan = 100.;
for ( int jj=0; jj<4; jj++ )
{
int j = jj;
if ( reverse ) switch(jj)
{
case 0: j = 2; break;
case 1: j = 3; break;
case 2: j = 0; break;
case 3: j = 1; break;
}
float scanStart, scanStop;
switch(j)
{
case 0:
// UP
setParameters(w, parsName, startPars->get(0));
scanStart = startValue;
scanStop = par->getMax();
scanUp = true;
break;
case 1:
// DOWN
//.........这里部分代码省略.........
示例15: OneSidedFrequentistUpperLimitWithBands
//.........这里部分代码省略.........
}
if(mc->GetGlobalObservables()){
cout << "will use global observables for unconditional ensemble"<<endl;
mc->GetGlobalObservables()->Print();
toymcsampler->SetGlobalObservables(*mc->GetGlobalObservables());
}
// Now get the interval
PointSetInterval* interval = fc.GetInterval();
ConfidenceBelt* belt = fc.GetConfidenceBelt();
// print out the interval on the first Parameter of Interest
cout << "\n95% interval on " <<firstPOI->GetName()<<" is : ["<<
interval->LowerLimit(*firstPOI) << ", "<<
interval->UpperLimit(*firstPOI) <<"] "<<endl;
// get observed UL and value of test statistic evaluated there
RooArgSet tmpPOI(*firstPOI);
double observedUL = interval->UpperLimit(*firstPOI);
firstPOI->setVal(observedUL);
double obsTSatObsUL = fc.GetTestStatSampler()->EvaluateTestStatistic(*data,tmpPOI);
// Ask the calculator which points were scanned
RooDataSet* parameterScan = (RooDataSet*) fc.GetPointsToScan();
RooArgSet* tmpPoint;
// make a histogram of parameter vs. threshold
TH1F* histOfThresholds = new TH1F("histOfThresholds","",
parameterScan->numEntries(),
firstPOI->getMin(),
firstPOI->getMax());
histOfThresholds->GetXaxis()->SetTitle(firstPOI->GetName());
histOfThresholds->GetYaxis()->SetTitle("Threshold");
// loop through the points that were tested and ask confidence belt
// what the upper/lower thresholds were.
// For FeldmanCousins, the lower cut off is always 0
for(Int_t i=0; i<parameterScan->numEntries(); ++i){
tmpPoint = (RooArgSet*) parameterScan->get(i)->clone("temp");
//cout <<"get threshold"<<endl;
double arMax = belt->GetAcceptanceRegionMax(*tmpPoint);
double poiVal = tmpPoint->getRealValue(firstPOI->GetName()) ;
histOfThresholds->Fill(poiVal,arMax);
}
TCanvas* c1 = new TCanvas();
c1->Divide(2);
c1->cd(1);
histOfThresholds->SetMinimum(0);
histOfThresholds->Draw();
c1->cd(2);
// -------------------------------------------------------
// Now we generate the expected bands and power-constraint
// First: find parameter point for mu=0, with conditional MLEs for nuisance parameters
RooAbsReal* nll = mc->GetPdf()->createNLL(*data);
RooAbsReal* profile = nll->createProfile(*mc->GetParametersOfInterest());
firstPOI->setVal(0.);
profile->getVal(); // this will do fit and set nuisance parameters to profiled values
RooArgSet* poiAndNuisance = new RooArgSet();
if(mc->GetNuisanceParameters())
poiAndNuisance->add(*mc->GetNuisanceParameters());
poiAndNuisance->add(*mc->GetParametersOfInterest());