137#pragma warning ( disable : 4355 )
158 fMultiGraph =
nullptr;
172 std::cerr <<
kERROR <<
"IPythonInteractive::Init: already initialized..." << std::endl;
176 for(
auto& title : graphTitles){
177 fGraphs.push_back(
new TGraph() );
178 fGraphs.back()->SetTitle(title);
179 fGraphs.back()->SetName(title);
180 fGraphs.back()->SetFillColor(color);
181 fGraphs.back()->SetLineColor(color);
182 fGraphs.back()->SetMarkerColor(color);
183 fMultiGraph->Add(fGraphs.back());
195 for(
Int_t i=0; i<fNumGraphs; i++){
209 fGraphs[0]->Set(fIndex+1);
210 fGraphs[1]->Set(fIndex+1);
211 fGraphs[0]->SetPoint(fIndex,
x,
y1);
212 fGraphs[1]->SetPoint(fIndex,
x,
y2);
225 for(
Int_t i=0; i<fNumGraphs;i++){
226 fGraphs[i]->Set(fIndex+1);
227 fGraphs[i]->SetPoint(fIndex, dat[0], dat[i+1]);
247 fAnalysisType (
Types::kNoAnalysisType ),
248 fRegressionReturnVal ( 0 ),
249 fMulticlassReturnVal ( 0 ),
250 fDataSetInfo ( dsi ),
251 fSignalReferenceCut ( 0.5 ),
252 fSignalReferenceCutOrientation( 1. ),
253 fVariableTransformType (
Types::kSignal ),
254 fJobName ( jobName ),
255 fMethodName ( methodTitle ),
256 fMethodType ( methodType ),
260 fConstructedFromWeightFile (
kFALSE ),
262 fMethodBaseDir ( 0 ),
265 fModelPersistence (
kTRUE),
276 fSplTrainEffBvsS ( 0 ),
277 fVarTransformString (
"None" ),
278 fTransformationPointer ( 0 ),
279 fTransformation ( dsi, methodTitle ),
281 fVerbosityLevelString (
"Default" ),
284 fIgnoreNegWeightsInTraining(
kFALSE ),
286 fBackgroundClass ( 0 ),
311 fAnalysisType (
Types::kNoAnalysisType ),
312 fRegressionReturnVal ( 0 ),
313 fMulticlassReturnVal ( 0 ),
314 fDataSetInfo ( dsi ),
315 fSignalReferenceCut ( 0.5 ),
316 fVariableTransformType (
Types::kSignal ),
318 fMethodName (
"MethodBase" ),
319 fMethodType ( methodType ),
321 fTMVATrainingVersion ( 0 ),
322 fROOTTrainingVersion ( 0 ),
323 fConstructedFromWeightFile (
kTRUE ),
325 fMethodBaseDir ( 0 ),
328 fModelPersistence (
kTRUE),
329 fWeightFile ( weightFile ),
339 fSplTrainEffBvsS ( 0 ),
340 fVarTransformString (
"None" ),
341 fTransformationPointer ( 0 ),
342 fTransformation ( dsi,
"" ),
344 fVerbosityLevelString (
"Default" ),
347 fIgnoreNegWeightsInTraining(
kFALSE ),
349 fBackgroundClass ( 0 ),
367 if (!fSetupCompleted)
Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Calling destructor of method which got never setup" <<
Endl;
370 if (fInputVars != 0) { fInputVars->clear();
delete fInputVars; }
371 if (fRanking != 0)
delete fRanking;
374 if (fDefaultPDF!= 0) {
delete fDefaultPDF; fDefaultPDF = 0; }
375 if (fMVAPdfS != 0) {
delete fMVAPdfS; fMVAPdfS = 0; }
376 if (fMVAPdfB != 0) {
delete fMVAPdfB; fMVAPdfB = 0; }
379 if (fSplS) {
delete fSplS; fSplS = 0; }
380 if (fSplB) {
delete fSplB; fSplB = 0; }
381 if (fSpleffBvsS) {
delete fSpleffBvsS; fSpleffBvsS = 0; }
382 if (fSplRefS) {
delete fSplRefS; fSplRefS = 0; }
383 if (fSplRefB) {
delete fSplRefB; fSplRefB = 0; }
384 if (fSplTrainRefS) {
delete fSplTrainRefS; fSplTrainRefS = 0; }
385 if (fSplTrainRefB) {
delete fSplTrainRefB; fSplTrainRefB = 0; }
386 if (fSplTrainEffBvsS) {
delete fSplTrainEffBvsS; fSplTrainEffBvsS = 0; }
388 for (
Int_t i = 0; i < 2; i++ ) {
389 if (fEventCollections.at(i)) {
390 for (std::vector<Event*>::const_iterator it = fEventCollections.at(i)->begin();
391 it != fEventCollections.at(i)->end(); ++it) {
394 delete fEventCollections.at(i);
395 fEventCollections.at(i) = 0;
399 if (fRegressionReturnVal)
delete fRegressionReturnVal;
400 if (fMulticlassReturnVal)
delete fMulticlassReturnVal;
410 if (fSetupCompleted)
Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Calling SetupMethod for the second time" <<
Endl;
412 DeclareBaseOptions();
415 fSetupCompleted =
kTRUE;
425 ProcessBaseOptions();
435 CheckForUnusedOptions();
443 SetConfigDescription(
"Configuration options for classifier architecture and tuning" );
451 fSplTrainEffBvsS = 0;
458 fTxtWeightsOnly =
kTRUE;
468 fInputVars =
new std::vector<TString>;
469 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
470 fInputVars->push_back(DataInfo().GetVariableInfo(ivar).GetLabel());
472 fRegressionReturnVal = 0;
473 fMulticlassReturnVal = 0;
475 fEventCollections.resize( 2 );
476 fEventCollections.at(0) = 0;
477 fEventCollections.at(1) = 0;
480 if (DataInfo().GetClassInfo(
"Signal") != 0) {
481 fSignalClass = DataInfo().GetClassInfo(
"Signal")->GetNumber();
483 if (DataInfo().GetClassInfo(
"Background") != 0) {
484 fBackgroundClass = DataInfo().GetClassInfo(
"Background")->GetNumber();
487 SetConfigDescription(
"Configuration options for MVA method" );
488 SetConfigName(
TString(
"Method") + GetMethodTypeName() );
511 DeclareOptionRef( fVerbose,
"V",
"Verbose output (short form of \"VerbosityLevel\" below - overrides the latter one)" );
513 DeclareOptionRef( fVerbosityLevelString=
"Default",
"VerbosityLevel",
"Verbosity level" );
514 AddPreDefVal(
TString(
"Default") );
515 AddPreDefVal(
TString(
"Debug") );
516 AddPreDefVal(
TString(
"Verbose") );
517 AddPreDefVal(
TString(
"Info") );
518 AddPreDefVal(
TString(
"Warning") );
519 AddPreDefVal(
TString(
"Error") );
520 AddPreDefVal(
TString(
"Fatal") );
524 fTxtWeightsOnly =
kTRUE;
527 DeclareOptionRef( fVarTransformString,
"VarTransform",
"List of variable transformations performed before training, e.g., \"D_Background,P_Signal,G,N_AllClasses\" for: \"Decorrelation, PCA-transformation, Gaussianisation, Normalisation, each for the given class of events ('AllClasses' denotes all events of all classes, if no class indication is given, 'All' is assumed)\"" );
529 DeclareOptionRef( fHelp,
"H",
"Print method-specific help message" );
531 DeclareOptionRef( fHasMVAPdfs,
"CreateMVAPdfs",
"Create PDFs for classifier outputs (signal and background)" );
533 DeclareOptionRef( fIgnoreNegWeightsInTraining,
"IgnoreNegWeightsInTraining",
534 "Events with negative weights are ignored in the training (but are included for testing and performance evaluation)" );
546 fDefaultPDF =
new PDF(
TString(GetName())+
"_PDF", GetOptions(),
"MVAPdf" );
547 fDefaultPDF->DeclareOptions();
548 fDefaultPDF->ParseOptions();
549 fDefaultPDF->ProcessOptions();
550 fMVAPdfB =
new PDF(
TString(GetName())+
"_PDFBkg", fDefaultPDF->GetOptions(),
"MVAPdfBkg", fDefaultPDF );
551 fMVAPdfB->DeclareOptions();
552 fMVAPdfB->ParseOptions();
553 fMVAPdfB->ProcessOptions();
554 fMVAPdfS =
new PDF(
TString(GetName())+
"_PDFSig", fMVAPdfB->GetOptions(),
"MVAPdfSig", fDefaultPDF );
555 fMVAPdfS->DeclareOptions();
556 fMVAPdfS->ParseOptions();
557 fMVAPdfS->ProcessOptions();
560 SetOptions( fMVAPdfS->GetOptions() );
565 GetTransformationHandler(),
569 if (fDefaultPDF!= 0) {
delete fDefaultPDF; fDefaultPDF = 0; }
570 if (fMVAPdfS != 0) {
delete fMVAPdfS; fMVAPdfS = 0; }
571 if (fMVAPdfB != 0) {
delete fMVAPdfB; fMVAPdfB = 0; }
575 fVerbosityLevelString =
TString(
"Verbose");
578 else if (fVerbosityLevelString ==
"Debug" )
Log().SetMinType(
kDEBUG );
579 else if (fVerbosityLevelString ==
"Verbose" )
Log().SetMinType(
kVERBOSE );
580 else if (fVerbosityLevelString ==
"Info" )
Log().SetMinType(
kINFO );
581 else if (fVerbosityLevelString ==
"Warning" )
Log().SetMinType(
kWARNING );
582 else if (fVerbosityLevelString ==
"Error" )
Log().SetMinType(
kERROR );
583 else if (fVerbosityLevelString ==
"Fatal" )
Log().SetMinType(
kFATAL );
584 else if (fVerbosityLevelString !=
"Default" ) {
585 Log() <<
kFATAL <<
"<ProcessOptions> Verbosity level type '"
586 << fVerbosityLevelString <<
"' unknown." <<
Endl;
598 DeclareOptionRef( fNormalise=
kFALSE,
"Normalise",
"Normalise input variables" );
599 DeclareOptionRef( fUseDecorr=
kFALSE,
"D",
"Use-decorrelated-variables flag" );
600 DeclareOptionRef( fVariableTransformTypeString=
"Signal",
"VarTransformType",
601 "Use signal or background events to derive for variable transformation (the transformation is applied on both types of, course)" );
602 AddPreDefVal(
TString(
"Signal") );
603 AddPreDefVal(
TString(
"Background") );
604 DeclareOptionRef( fTxtWeightsOnly=
kTRUE,
"TxtWeightFilesOnly",
"If True: write all training results (weights) as text files (False: some are written in ROOT format)" );
614 DeclareOptionRef( fNbinsMVAPdf = 60,
"NbinsMVAPdf",
"Number of bins used for the PDFs of classifier outputs" );
615 DeclareOptionRef( fNsmoothMVAPdf = 2,
"NsmoothMVAPdf",
"Number of smoothing iterations for classifier PDFs" );
629 Log() <<
kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Parameter optimization is not yet implemented for method "
630 << GetName() <<
Endl;
631 Log() <<
kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Currently we need to set hardcoded which parameter is tuned in which ranges"<<
Endl;
633 std::map<TString,Double_t> tunedParameters;
634 tunedParameters.size();
635 return tunedParameters;
656 if (Help()) PrintHelpMessage();
659 if(!IsSilentFile()) BaseDir()->cd();
663 GetTransformationHandler().CalcTransformations(Data()->GetEventCollection());
667 <<
"Begin training" <<
Endl;
668 Long64_t nEvents = Data()->GetNEvents();
669 Timer traintimer( nEvents, GetName(),
kTRUE );
672 <<
"\tEnd of training " <<
Endl;
675 <<
"Elapsed time for training with " << nEvents <<
" events: "
679 <<
"\tCreate MVA output for ";
682 if (DoMulticlass()) {
683 Log() <<
Form(
"[%s] : ",DataInfo().GetName())<<
"Multiclass classification on training sample" <<
Endl;
686 else if (!DoRegression()) {
688 Log() <<
Form(
"[%s] : ",DataInfo().GetName())<<
"classification on training sample" <<
Endl;
697 Log() <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"regression on training sample" <<
Endl;
701 Log() <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Create PDFs" <<
Endl;
708 if (fModelPersistence ) WriteStateToFile();
711 if ((!DoRegression()) && (fModelPersistence)) MakeClass();
718 WriteMonitoringHistosToFile();
726 if (!DoRegression())
Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Trying to use GetRegressionDeviation() with a classification job" <<
Endl;
729 bool truncate =
false;
730 TH1F*
h1 = regRes->QuadraticDeviation( tgtNum , truncate, 1.);
735 TH1F* h2 = regRes->QuadraticDeviation( tgtNum , truncate, yq[0]);
746 Data()->SetCurrentType(
type);
752 Long64_t nEvents = Data()->GetNEvents();
759 regRes->Resize( nEvents );
764 Int_t totalProgressDraws = 100;
765 Int_t drawProgressEvery = 1;
766 if(nEvents >= totalProgressDraws) drawProgressEvery = nEvents/totalProgressDraws;
768 for (
Int_t ievt=0; ievt<nEvents; ievt++) {
770 Data()->SetCurrentEvent(ievt);
771 std::vector< Float_t > vals = GetRegressionValues();
772 regRes->SetValue( vals, ievt );
775 if(ievt % drawProgressEvery == 0 || ievt==nEvents-1) timer.
DrawProgressBar( ievt );
778 Log() <<
kINFO <<
Form(
"Dataset[%s] : ",DataInfo().GetName())
779 <<
"Elapsed time for evaluation of " << nEvents <<
" events: "
786 TString histNamePrefix(GetTestvarName());
788 regRes->CreateDeviationHistograms( histNamePrefix );
796 Data()->SetCurrentType(
type);
801 if (!resMulticlass)
Log() <<
kFATAL<<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"unable to create pointer in AddMulticlassOutput, exiting."<<
Endl;
803 Long64_t nEvents = Data()->GetNEvents();
811 resMulticlass->Resize( nEvents );
812 for (
Int_t ievt=0; ievt<nEvents; ievt++) {
813 Data()->SetCurrentEvent(ievt);
814 std::vector< Float_t > vals = GetMulticlassValues();
815 resMulticlass->SetValue( vals, ievt );
819 Log() <<
kINFO <<
Form(
"Dataset[%s] : ",DataInfo().GetName())
820 <<
"Elapsed time for evaluation of " << nEvents <<
" events: "
827 TString histNamePrefix(GetTestvarName());
830 resMulticlass->CreateMulticlassHistos( histNamePrefix, fNbinsMVAoutput, fNbinsH );
831 resMulticlass->CreateMulticlassPerformanceHistos(histNamePrefix);
838 if (errUpper) *errUpper=-1;
845 Double_t val = GetMvaValue(err, errUpper);
855 return GetMvaValue()*GetSignalReferenceCutOrientation() > GetSignalReferenceCut()*GetSignalReferenceCutOrientation() ?
kTRUE :
kFALSE;
862 return mvaVal*GetSignalReferenceCutOrientation() > GetSignalReferenceCut()*GetSignalReferenceCutOrientation() ?
kTRUE :
kFALSE;
870 Data()->SetCurrentType(
type);
875 Long64_t nEvents = Data()->GetNEvents();
880 std::vector<Double_t> mvaValues = GetMvaValues(0, nEvents,
true);
887 for (
Int_t ievt = 0; ievt < nEvents; ievt++) {
890 auto ev = Data()->GetEvent(ievt);
891 clRes->
SetValue(mvaValues[ievt], ievt, DataInfo().IsSignal(ev));
900 Long64_t nEvents = Data()->GetNEvents();
901 if (firstEvt > lastEvt || lastEvt > nEvents) lastEvt = nEvents;
902 if (firstEvt < 0) firstEvt = 0;
903 std::vector<Double_t> values(lastEvt-firstEvt);
905 nEvents = values.size();
914 <<
" sample (" << nEvents <<
" events)" <<
Endl;
916 for (
Int_t ievt=firstEvt; ievt<lastEvt; ievt++) {
917 Data()->SetCurrentEvent(ievt);
918 values[ievt] = GetMvaValue();
923 if (modulo <= 0 ) modulo = 1;
929 <<
"Elapsed time for evaluation of " << nEvents <<
" events: "
942 auto result = GetMvaValues(firstEvt, lastEvt, logProgress);
952 Data()->SetCurrentType(
type);
957 Long64_t nEvents = Data()->GetNEvents();
965 mvaProb->
Resize( nEvents );
966 for (
Int_t ievt=0; ievt<nEvents; ievt++) {
968 Data()->SetCurrentEvent(ievt);
970 if (proba < 0)
break;
971 mvaProb->
SetValue( proba, ievt, DataInfo().IsSignal( Data()->GetEvent()) );
975 if (modulo <= 0 ) modulo = 1;
979 Log() <<
kDEBUG <<
Form(
"Dataset[%s] : ",DataInfo().GetName())
980 <<
"Elapsed time for evaluation of " << nEvents <<
" events: "
999 Data()->SetCurrentType(
type);
1001 bias = 0; biasT = 0; dev = 0; devT = 0; rms = 0; rmsT = 0;
1004 const Int_t nevt = GetNEvents();
1009 Log() <<
kINFO <<
"Calculate regression for all events" <<
Endl;
1011 for (
Long64_t ievt=0; ievt<nevt; ievt++) {
1013 const Event* ev = Data()->GetEvent(ievt);
1016 Float_t r = GetRegressionValues()[0];
1035 m1 += t*
w;
s1 += t*t*
w;
1040 if (ievt % modulo == 0)
1044 Log() <<
kINFO <<
"Elapsed time for evaluation of " << nevt <<
" events: "
1056 corr = s12/sumw - m1*
m2;
1067 for (
Long64_t ievt=0; ievt<nevt; ievt++) {
1069 hist->
Fill( rV[ievt], tV[ievt], wV[ievt] );
1070 if (
d >= devMin &&
d <= devMax) {
1072 biasT += wV[ievt] *
d;
1074 rmsT += wV[ievt] *
d *
d;
1075 histT->
Fill( rV[ievt], tV[ievt], wV[ievt] );
1092 Data()->SetCurrentType(savedType);
1102 if (!resMulticlass)
Log() <<
kFATAL<<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"unable to create pointer in TestMulticlass, exiting."<<
Endl;
1111 TString histNamePrefix(GetTestvarName());
1112 TString histNamePrefixTest{histNamePrefix +
"_Test"};
1113 TString histNamePrefixTrain{histNamePrefix +
"_Train"};
1134 if (0==mvaRes && !(GetMethodTypeName().Contains(
"Cuts"))) {
1135 Log()<<
Form(
"Dataset[%s] : ",DataInfo().GetName()) <<
"mvaRes " << mvaRes <<
" GetMethodTypeName " << GetMethodTypeName()
1136 <<
" contains " << !(GetMethodTypeName().Contains(
"Cuts")) <<
Endl;
1137 Log() <<
kFATAL<<
Form(
"Dataset[%s] : ",DataInfo().GetName()) <<
"<TestInit> Test variable " << GetTestvarName()
1138 <<
" not found in tree" <<
Endl;
1143 fMeanS, fMeanB, fRmsS, fRmsB, fXmin, fXmax, fSignalClass );
1151 fCutOrientation = (fMeanS > fMeanB) ? kPositive : kNegative;
1163 TestvarName=
Form(
"[%s]%s",DataInfo().GetName(),GetTestvarName().Data());
1166 TestvarName=GetTestvarName();
1168 TH1* mva_s =
new TH1D( TestvarName +
"_S",TestvarName +
"_S", fNbinsMVAoutput, fXmin, sxmax );
1169 TH1* mva_b =
new TH1D( TestvarName +
"_B",TestvarName +
"_B", fNbinsMVAoutput, fXmin, sxmax );
1170 mvaRes->
Store(mva_s,
"MVA_S");
1171 mvaRes->
Store(mva_b,
"MVA_B");
1181 proba_s =
new TH1D( TestvarName +
"_Proba_S", TestvarName +
"_Proba_S", fNbinsMVAoutput, 0.0, 1.0 );
1182 proba_b =
new TH1D( TestvarName +
"_Proba_B", TestvarName +
"_Proba_B", fNbinsMVAoutput, 0.0, 1.0 );
1183 mvaRes->
Store(proba_s,
"Prob_S");
1184 mvaRes->
Store(proba_b,
"Prob_B");
1189 rarity_s =
new TH1D( TestvarName +
"_Rarity_S", TestvarName +
"_Rarity_S", fNbinsMVAoutput, 0.0, 1.0 );
1190 rarity_b =
new TH1D( TestvarName +
"_Rarity_B", TestvarName +
"_Rarity_B", fNbinsMVAoutput, 0.0, 1.0 );
1191 mvaRes->
Store(rarity_s,
"Rar_S");
1192 mvaRes->
Store(rarity_b,
"Rar_B");
1198 TH1* mva_eff_s =
new TH1D( TestvarName +
"_S_high", TestvarName +
"_S_high", fNbinsH, fXmin, sxmax );
1199 TH1* mva_eff_b =
new TH1D( TestvarName +
"_B_high", TestvarName +
"_B_high", fNbinsH, fXmin, sxmax );
1200 mvaRes->
Store(mva_eff_s,
"MVA_HIGHBIN_S");
1201 mvaRes->
Store(mva_eff_b,
"MVA_HIGHBIN_B");
1210 Log() <<
kHEADER <<
Form(
"[%s] : ",DataInfo().GetName())<<
"Loop over test events and fill histograms with classifier response..." <<
Endl <<
Endl;
1211 if (mvaProb)
Log() <<
kINFO <<
"Also filling probability and rarity histograms (on request)..." <<
Endl;
1215 if ( mvaRes->
GetSize() != GetNEvents() ) {
1217 assert(mvaRes->
GetSize() == GetNEvents());
1220 for (
Long64_t ievt=0; ievt<GetNEvents(); ievt++) {
1222 const Event* ev = GetEvent(ievt);
1226 if (DataInfo().IsSignal(ev)) {
1230 proba_s->
Fill( (*mvaProb)[ievt][0],
w );
1231 rarity_s->
Fill( GetRarity(
v ),
w );
1234 mva_eff_s ->
Fill(
v,
w );
1240 proba_b->
Fill( (*mvaProb)[ievt][0],
w );
1241 rarity_b->
Fill( GetRarity(
v ),
w );
1243 mva_eff_b ->
Fill(
v,
w );
1258 if (fSplS) {
delete fSplS; fSplS = 0; }
1259 if (fSplB) {
delete fSplB; fSplB = 0; }
1273 tf << prefix <<
"#GEN -*-*-*-*-*-*-*-*-*-*-*- general info -*-*-*-*-*-*-*-*-*-*-*-" << std::endl << prefix << std::endl;
1274 tf << prefix <<
"Method : " << GetMethodTypeName() <<
"::" <<
GetMethodName() << std::endl;
1275 tf.setf(std::ios::left);
1276 tf << prefix <<
"TMVA Release : " << std::setw(10) << GetTrainingTMVAVersionString() <<
" ["
1277 << GetTrainingTMVAVersionCode() <<
"]" << std::endl;
1278 tf << prefix <<
"ROOT Release : " << std::setw(10) << GetTrainingROOTVersionString() <<
" ["
1279 << GetTrainingROOTVersionCode() <<
"]" << std::endl;
1280 tf << prefix <<
"Creator : " << userInfo->
fUser << std::endl;
1281 tf << prefix <<
"Date : ";
TDatime *
d =
new TDatime; tf <<
d->AsString() << std::endl;
delete d;
1284 tf << prefix <<
"Training events: " << Data()->GetNTrainingEvents() << std::endl;
1288 tf << prefix <<
"Analysis type : " <<
"[" << ((GetAnalysisType()==
Types::kRegression) ?
"Regression" :
"Classification") <<
"]" << std::endl;
1289 tf << prefix << std::endl;
1294 tf << prefix << std::endl << prefix <<
"#OPT -*-*-*-*-*-*-*-*-*-*-*-*- options -*-*-*-*-*-*-*-*-*-*-*-*-" << std::endl << prefix << std::endl;
1295 WriteOptionsToStream( tf, prefix );
1296 tf << prefix << std::endl;
1299 tf << prefix << std::endl << prefix <<
"#VAR -*-*-*-*-*-*-*-*-*-*-*-* variables *-*-*-*-*-*-*-*-*-*-*-*-" << std::endl << prefix << std::endl;
1300 WriteVarsToStream( tf, prefix );
1301 tf << prefix << std::endl;
1318 AddRegressionOutput(
type );
1320 AddMulticlassOutput(
type );
1322 AddClassifierOutput(
type );
1324 AddClassifierOutputProb(
type );
1334 if (!parent)
return;
1339 AddInfoItem( gi,
"TMVA Release", GetTrainingTMVAVersionString() +
" [" +
gTools().StringFromInt(GetTrainingTMVAVersionCode()) +
"]" );
1340 AddInfoItem( gi,
"ROOT Release", GetTrainingROOTVersionString() +
" [" +
gTools().StringFromInt(GetTrainingROOTVersionCode()) +
"]");
1341 AddInfoItem( gi,
"Creator", userInfo->
fUser);
1345 AddInfoItem( gi,
"Training events",
gTools().StringFromInt(Data()->GetNTrainingEvents()));
1346 AddInfoItem( gi,
"TrainingTime",
gTools().StringFromDouble(
const_cast<TMVA::MethodBase*
>(
this)->GetTrainTime()));
1351 AddInfoItem( gi,
"AnalysisType", analysisType );
1355 AddOptionsXMLTo( parent );
1358 AddVarsXMLTo( parent );
1361 if (fModelPersistence)
1362 AddSpectatorsXMLTo( parent );
1365 AddClassesXMLTo(parent);
1368 if (DoRegression()) AddTargetsXMLTo(parent);
1371 GetTransformationHandler(
false).AddXMLTo( parent );
1375 if (fMVAPdfS) fMVAPdfS->AddXMLTo(pdfs);
1376 if (fMVAPdfB) fMVAPdfB->AddXMLTo(pdfs);
1379 AddWeightsXMLTo( parent );
1395 ReadWeightsFromStream( rf );
1408 TString tfname( GetWeightFileName() );
1413 <<
"Creating xml weight file: "
1419 WriteStateToXML(rootnode);
1431 TString tfname(GetWeightFileName());
1434 <<
"Reading weight file: "
1440 Log() <<
kFATAL <<
"Error parsing XML file " << tfname <<
Endl;
1443 ReadStateFromXML(rootnode);
1448 fb.open(tfname.
Data(),std::ios::in);
1449 if (!fb.is_open()) {
1450 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<ReadStateFromFile> "
1451 <<
"Unable to open input weight file: " << tfname <<
Endl;
1453 std::istream fin(&fb);
1454 ReadStateFromStream(fin);
1457 if (!fTxtWeightsOnly) {
1460 Log() <<
kINFO <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Reading root weight file: "
1463 ReadStateFromStream( *rfile );
1473 ReadStateFromXML(rootnode);
1487 fMethodName = fullMethodName(fullMethodName.
Index(
"::")+2,fullMethodName.
Length());
1490 Log().SetSource( GetName() );
1492 <<
"Read method \"" <<
GetMethodName() <<
"\" of type \"" << GetMethodTypeName() <<
"\"" <<
Endl;
1502 if (nodeName==
"GeneralInfo") {
1507 while (antypeNode) {
1510 if (
name ==
"TrainingTime")
1513 if (
name ==
"AnalysisType") {
1519 else Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Analysis type " << val <<
" is not known." <<
Endl;
1522 if (
name ==
"TMVA Release" ||
name ==
"TMVA") {
1525 fTMVATrainingVersion =
TString(
s(
s.Index(
"[")+1,
s.Index(
"]")-
s.Index(
"[")-1)).
Atoi();
1526 Log() <<
kDEBUG <<
Form(
"[%s] : ",DataInfo().GetName()) <<
"MVA method was trained with TMVA Version: " << GetTrainingTMVAVersionString() <<
Endl;
1529 if (
name ==
"ROOT Release" ||
name ==
"ROOT") {
1532 fROOTTrainingVersion =
TString(
s(
s.Index(
"[")+1,
s.Index(
"]")-
s.Index(
"[")-1)).
Atoi();
1534 <<
"MVA method was trained with ROOT Version: " << GetTrainingROOTVersionString() <<
Endl;
1539 else if (nodeName==
"Options") {
1540 ReadOptionsFromXML(ch);
1544 else if (nodeName==
"Variables") {
1545 ReadVariablesFromXML(ch);
1547 else if (nodeName==
"Spectators") {
1548 ReadSpectatorsFromXML(ch);
1550 else if (nodeName==
"Classes") {
1551 if (DataInfo().GetNClasses()==0) ReadClassesFromXML(ch);
1553 else if (nodeName==
"Targets") {
1554 if (DataInfo().GetNTargets()==0 && DoRegression()) ReadTargetsFromXML(ch);
1556 else if (nodeName==
"Transformations") {
1557 GetTransformationHandler().ReadFromXML(ch);
1559 else if (nodeName==
"MVAPdfs") {
1561 if (fMVAPdfS) {
delete fMVAPdfS; fMVAPdfS=0; }
1562 if (fMVAPdfB) {
delete fMVAPdfB; fMVAPdfB=0; }
1566 fMVAPdfS =
new PDF(pdfname);
1567 fMVAPdfS->ReadXML(pdfnode);
1570 fMVAPdfB =
new PDF(pdfname);
1571 fMVAPdfB->ReadXML(pdfnode);
1574 else if (nodeName==
"Weights") {
1575 ReadWeightsFromXML(ch);
1578 Log() <<
kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Unparsed XML node: '" << nodeName <<
"'" <<
Endl;
1585 if (GetTransformationHandler().GetCallerName() ==
"") GetTransformationHandler().SetCallerName( GetName() );
1605 methodType = methodType(methodType.
Last(
' '),methodType.
Length());
1610 if (methodName ==
"") methodName = methodType;
1611 fMethodName = methodName;
1613 Log() <<
kINFO <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Read method \"" <<
GetMethodName() <<
"\" of type \"" << GetMethodTypeName() <<
"\"" <<
Endl;
1616 Log().SetSource( GetName() );
1631 ReadOptionsFromStream(fin);
1635 fin.getline(buf,512);
1637 ReadVarsFromStream(fin);
1642 if (IsNormalised()) {
1648 if ( fVarTransformString ==
"None") {
1651 }
else if ( fVarTransformString ==
"Decorrelate" ) {
1653 }
else if ( fVarTransformString ==
"PCA" ) {
1654 varTrafo = GetTransformationHandler().AddTransformation(
new VariablePCATransform(DataInfo()), -1 );
1655 }
else if ( fVarTransformString ==
"Uniform" ) {
1656 varTrafo = GetTransformationHandler().AddTransformation(
new VariableGaussTransform(DataInfo(),
"Uniform"), -1 );
1657 }
else if ( fVarTransformString ==
"Gauss" ) {
1659 }
else if ( fVarTransformString ==
"GaussDecorr" ) {
1663 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<ProcessOptions> Variable transform '"
1664 << fVarTransformString <<
"' unknown." <<
Endl;
1667 if (GetTransformationHandler().GetTransformationList().GetSize() > 0) {
1668 fin.getline(buf,512);
1672 varTrafo->ReadTransformationFromStream(fin, trafo );
1683 fin.getline(buf,512);
1685 if (fMVAPdfS != 0) {
delete fMVAPdfS; fMVAPdfS = 0; }
1686 if (fMVAPdfB != 0) {
delete fMVAPdfB; fMVAPdfB = 0; }
1687 fMVAPdfS =
new PDF(
TString(GetName()) +
" MVA PDF Sig");
1688 fMVAPdfB =
new PDF(
TString(GetName()) +
" MVA PDF Bkg");
1689 fMVAPdfS->SetReadingVersion( GetTrainingTMVAVersionCode() );
1690 fMVAPdfB->SetReadingVersion( GetTrainingTMVAVersionCode() );
1697 fin.getline(buf,512);
1699 fin.getline(buf,512);
1700 ReadWeightsFromStream( fin );;
1703 if (GetTransformationHandler().GetCallerName() ==
"") GetTransformationHandler().SetCallerName( GetName() );
1713 o << prefix <<
"NVar " << DataInfo().GetNVariables() << std::endl;
1714 std::vector<VariableInfo>::const_iterator varIt = DataInfo().GetVariableInfos().begin();
1715 for (; varIt!=DataInfo().GetVariableInfos().end(); ++varIt) { o << prefix; varIt->WriteToStream(o); }
1716 o << prefix <<
"NSpec " << DataInfo().GetNSpectators() << std::endl;
1717 varIt = DataInfo().GetSpectatorInfos().begin();
1718 for (; varIt!=DataInfo().GetSpectatorInfos().end(); ++varIt) { o << prefix; varIt->WriteToStream(o); }
1730 istr >> dummy >> readNVar;
1732 if (readNVar!=DataInfo().GetNVariables()) {
1733 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"You declared "<< DataInfo().GetNVariables() <<
" variables in the Reader"
1734 <<
" while there are " << readNVar <<
" variables declared in the file"
1740 std::vector<VariableInfo>::iterator varIt = DataInfo().GetVariableInfos().begin();
1742 for (; varIt!=DataInfo().GetVariableInfos().end(); ++varIt, ++varIdx) {
1749 Log() <<
kINFO <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"ERROR in <ReadVarsFromStream>" <<
Endl;
1750 Log() <<
kINFO <<
"The definition (or the order) of the variables found in the input file is" <<
Endl;
1751 Log() <<
kINFO <<
"is not the same as the one declared in the Reader (which is necessary for" <<
Endl;
1752 Log() <<
kINFO <<
"the correct working of the method):" <<
Endl;
1753 Log() <<
kINFO <<
" var #" << varIdx <<
" declared in Reader: " << varIt->GetExpression() <<
Endl;
1755 Log() <<
kFATAL <<
"The expression declared to the Reader needs to be checked (name or order are wrong)" <<
Endl;
1768 for (
UInt_t idx=0; idx<DataInfo().GetVariableInfos().size(); idx++) {
1784 for (
UInt_t idx=0; idx<DataInfo().GetSpectatorInfos().size(); idx++) {
1786 VariableInfo& vi = DataInfo().GetSpectatorInfos()[idx];
1804 UInt_t nClasses=DataInfo().GetNClasses();
1809 for (
UInt_t iCls=0; iCls<nClasses; ++iCls) {
1810 ClassInfo *classInfo=DataInfo().GetClassInfo (iCls);
1827 for (
UInt_t idx=0; idx<DataInfo().GetTargetInfos().size(); idx++) {
1843 if (readNVar!=DataInfo().GetNVariables()) {
1844 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"You declared "<< DataInfo().GetNVariables() <<
" variables in the Reader"
1845 <<
" while there are " << readNVar <<
" variables declared in the file"
1855 existingVarInfo = DataInfo().GetVariableInfos()[varIdx];
1860 existingVarInfo = readVarInfo;
1863 Log() <<
kINFO <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"ERROR in <ReadVariablesFromXML>" <<
Endl;
1864 Log() <<
kINFO <<
"The definition (or the order) of the variables found in the input file is" <<
Endl;
1865 Log() <<
kINFO <<
"not the same as the one declared in the Reader (which is necessary for the" <<
Endl;
1866 Log() <<
kINFO <<
"correct working of the method):" <<
Endl;
1869 Log() <<
kFATAL <<
"The expression declared to the Reader needs to be checked (name or order are wrong)" <<
Endl;
1883 if (readNSpec!=DataInfo().GetNSpectators(
kFALSE)) {
1884 Log() <<
kFATAL<<
Form(
"Dataset[%s] : ",DataInfo().GetName()) <<
"You declared "<< DataInfo().GetNSpectators(
kFALSE) <<
" spectators in the Reader"
1885 <<
" while there are " << readNSpec <<
" spectators declared in the file"
1895 existingSpecInfo = DataInfo().GetSpectatorInfos()[specIdx];
1900 existingSpecInfo = readSpecInfo;
1903 Log() <<
kINFO <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"ERROR in <ReadSpectatorsFromXML>" <<
Endl;
1904 Log() <<
kINFO <<
"The definition (or the order) of the spectators found in the input file is" <<
Endl;
1905 Log() <<
kINFO <<
"not the same as the one declared in the Reader (which is necessary for the" <<
Endl;
1906 Log() <<
kINFO <<
"correct working of the method):" <<
Endl;
1909 Log() <<
kFATAL <<
"The expression declared to the Reader needs to be checked (name or order are wrong)" <<
Endl;
1928 for (
UInt_t icls = 0; icls<readNCls;++icls) {
1930 DataInfo().AddClass(classname);
1938 DataInfo().AddClass(className);
1945 if (DataInfo().GetClassInfo(
"Signal") != 0) {
1946 fSignalClass = DataInfo().GetClassInfo(
"Signal")->GetNumber();
1950 if (DataInfo().GetClassInfo(
"Background") != 0) {
1951 fBackgroundClass = DataInfo().GetClassInfo(
"Background")->GetNumber();
1971 DataInfo().AddTarget(expression,
"",
"",0,0);
1983 if (fBaseDir != 0)
return fBaseDir;
1984 Log()<<
kDEBUG<<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
" Base Directory for " <<
GetMethodName() <<
" not set yet --> check if already there.." <<
Endl;
1986 if (IsSilentFile()) {
1987 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ", DataInfo().GetName())
1988 <<
"MethodBase::BaseDir() - No directory exists when running a Method without output file. Enable the "
1989 "output when creating the factory"
1995 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"MethodBase::BaseDir() - MethodBaseDir() return a NULL pointer!" <<
Endl;
2001 Log()<<
kDEBUG<<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
" Base Directory for " << GetMethodTypeName() <<
" does not exist yet--> created it" <<
Endl;
2002 sdir = methodDir->
mkdir(defaultDir);
2005 if (fModelPersistence) {
2008 wfilePath.
Write(
"TrainingPath" );
2009 wfileName.
Write(
"WeightFileName" );
2013 Log()<<
kDEBUG<<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
" Base Directory for " << GetMethodTypeName() <<
" existed, return it.." <<
Endl;
2023 if (fMethodBaseDir != 0) {
2024 return fMethodBaseDir;
2027 const char *datasetName = DataInfo().
GetName();
2029 Log() <<
kDEBUG <<
Form(
"Dataset[%s] : ", datasetName) <<
" Base Directory for " << GetMethodTypeName()
2030 <<
" not set yet --> check if already there.." <<
Endl;
2033 if (!factoryBaseDir)
return nullptr;
2034 fMethodBaseDir = factoryBaseDir->
GetDirectory(datasetName);
2035 if (!fMethodBaseDir) {
2036 fMethodBaseDir = factoryBaseDir->
mkdir(datasetName,
Form(
"Base directory for dataset %s", datasetName));
2037 if (!fMethodBaseDir) {
2038 Log() <<
kFATAL <<
"Can not create dir " << datasetName;
2041 TString methodTypeDir =
Form(
"Method_%s", GetMethodTypeName().Data());
2042 fMethodBaseDir = fMethodBaseDir->GetDirectory(methodTypeDir.
Data());
2044 if (!fMethodBaseDir) {
2046 TString methodTypeDirHelpStr =
Form(
"Directory for all %s methods", GetMethodTypeName().Data());
2047 fMethodBaseDir = datasetDir->
mkdir(methodTypeDir.
Data(), methodTypeDirHelpStr);
2049 <<
" does not exist yet--> created it" <<
Endl;
2053 <<
"Return from MethodBaseDir() after creating base directory " <<
Endl;
2054 return fMethodBaseDir;
2071 fWeightFile = theWeightFile;
2079 if (fWeightFile!=
"")
return fWeightFile;
2084 TString wFileDir(GetWeightFileDir());
2087 if (wFileDir.
IsNull() )
return wFileName;
2089 return ( wFileDir + (wFileDir[wFileDir.
Length()-1]==
'/' ?
"" :
"/")
2101 if (0 != fMVAPdfS) {
2102 fMVAPdfS->GetOriginalHist()->Write();
2103 fMVAPdfS->GetSmoothedHist()->Write();
2104 fMVAPdfS->GetPDFHist()->Write();
2106 if (0 != fMVAPdfB) {
2107 fMVAPdfB->GetOriginalHist()->Write();
2108 fMVAPdfB->GetSmoothedHist()->Write();
2109 fMVAPdfB->GetPDFHist()->Write();
2115 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<WriteEvaluationHistosToFile> Unknown result: "
2117 <<
"/kMaxAnalysisType" <<
Endl;
2122 GetTransformationHandler().PlotVariables (GetEventCollection(
Types::kTesting ), BaseDir() );
2125 <<
" variable plots are not produces ! The number of variables is " << DataInfo().GetNVariables()
2145 fin.getline(buf,512);
2147 if (
line.BeginsWith(
"TMVA Release")) {
2151 std::stringstream
s(code.
Data());
2152 s >> fTMVATrainingVersion;
2153 Log() <<
kINFO <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"MVA method was trained with TMVA Version: " << GetTrainingTMVAVersionString() <<
Endl;
2155 if (
line.BeginsWith(
"ROOT Release")) {
2159 std::stringstream
s(code.
Data());
2160 s >> fROOTTrainingVersion;
2161 Log() <<
kINFO <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"MVA method was trained with ROOT Version: " << GetTrainingROOTVersionString() <<
Endl;
2163 if (
line.BeginsWith(
"Analysis type")) {
2167 std::stringstream
s(code.
Data());
2168 std::string analysisType;
2170 if (analysisType ==
"regression" || analysisType ==
"Regression") SetAnalysisType(
Types::kRegression );
2171 else if (analysisType ==
"classification" || analysisType ==
"Classification") SetAnalysisType(
Types::kClassification );
2172 else if (analysisType ==
"multiclass" || analysisType ==
"Multiclass") SetAnalysisType(
Types::kMulticlass );
2173 else Log() <<
kFATAL <<
"Analysis type " << analysisType <<
" from weight-file not known!" << std::endl;
2175 Log() <<
kINFO <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Method was trained for "
2195 if (mvaRes==0 || mvaRes->
GetSize()==0) {
2196 Log() <<
kERROR<<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<CreateMVAPdfs> No result of classifier testing available" <<
Endl;
2203 TH1* histMVAPdfS =
new TH1D( GetMethodTypeName() +
"_tr_S", GetMethodTypeName() +
"_tr_S",
2204 fMVAPdfS->GetHistNBins( mvaRes->
GetSize() ), minVal, maxVal );
2205 TH1* histMVAPdfB =
new TH1D( GetMethodTypeName() +
"_tr_B", GetMethodTypeName() +
"_tr_B",
2206 fMVAPdfB->GetHistNBins( mvaRes->
GetSize() ), minVal, maxVal );
2210 histMVAPdfS->
Sumw2();
2211 histMVAPdfB->
Sumw2();
2216 Double_t theWeight = Data()->GetEvent(ievt)->GetWeight();
2218 if (DataInfo().IsSignal(Data()->GetEvent(ievt))) histMVAPdfS->
Fill( theVal, theWeight );
2219 else histMVAPdfB->
Fill( theVal, theWeight );
2228 histMVAPdfS->
Write();
2229 histMVAPdfB->
Write();
2232 fMVAPdfS->BuildPDF ( histMVAPdfS );
2233 fMVAPdfB->BuildPDF ( histMVAPdfB );
2234 fMVAPdfS->ValidatePDF( histMVAPdfS );
2235 fMVAPdfB->ValidatePDF( histMVAPdfB );
2237 if (DataInfo().GetNClasses() == 2) {
2238 Log() <<
kINFO<<
Form(
"Dataset[%s] : ",DataInfo().GetName())
2239 <<
Form(
"<CreateMVAPdfs> Separation from histogram (PDF): %1.3f (%1.3f)",
2240 GetSeparation( histMVAPdfS, histMVAPdfB ), GetSeparation( fMVAPdfS, fMVAPdfB ) )
2252 if (!fMVAPdfS || !fMVAPdfB) {
2253 Log() <<
kINFO<<
Form(
"Dataset[%s] : ",DataInfo().GetName()) <<
"<GetProba> MVA PDFs for Signal and Background don't exist yet, we'll create them on demand" <<
Endl;
2256 Double_t sigFraction = DataInfo().GetTrainingSumSignalWeights() / (DataInfo().GetTrainingSumSignalWeights() + DataInfo().GetTrainingSumBackgrWeights() );
2259 return GetProba(mvaVal,sigFraction);
2267 if (!fMVAPdfS || !fMVAPdfB) {
2268 Log() <<
kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<GetProba> MVA PDFs for Signal and Background don't exist" <<
Endl;
2271 Double_t p_s = fMVAPdfS->GetVal( mvaVal );
2272 Double_t p_b = fMVAPdfB->GetVal( mvaVal );
2274 Double_t denom = p_s*ap_sig + p_b*(1 - ap_sig);
2276 return (denom > 0) ? (p_s*ap_sig) / denom : -1;
2289 Log() <<
kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<GetRarity> Required MVA PDF for Signal or Background does not exist: "
2290 <<
"select option \"CreateMVAPdfs\"" <<
Endl;
2305 Data()->SetCurrentType(
type);
2315 else if (list->
GetSize() > 2) {
2316 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<GetEfficiency> Wrong number of arguments"
2317 <<
" in string: " << theString
2318 <<
" | required format, e.g., Efficiency:0.05, or empty string" <<
Endl;
2326 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<GetEfficiency> Binning mismatch between signal and background histos" <<
Endl;
2334 TH1 * effhist = results->
GetHist(
"MVA_HIGHBIN_S");
2341 if (results->
DoesExist(
"MVA_EFF_S")==0) {
2344 TH1* eff_s =
new TH1D( GetTestvarName() +
"_effS", GetTestvarName() +
" (signal)", fNbinsH,
xmin,
xmax );
2345 TH1* eff_b =
new TH1D( GetTestvarName() +
"_effB", GetTestvarName() +
" (background)", fNbinsH,
xmin,
xmax );
2346 results->
Store(eff_s,
"MVA_EFF_S");
2347 results->
Store(eff_b,
"MVA_EFF_B");
2350 Int_t sign = (fCutOrientation == kPositive) ? +1 : -1;
2354 for (
UInt_t ievt=0; ievt<Data()->GetNEvents(); ievt++) {
2357 Bool_t isSignal = DataInfo().IsSignal(GetEvent(ievt));
2358 Float_t theWeight = GetEvent(ievt)->GetWeight();
2359 Float_t theVal = (*mvaRes)[ievt];
2362 TH1* theHist = isSignal ? eff_s : eff_b;
2365 if (isSignal) nevtS+=theWeight;
2369 if (sign > 0 && maxbin > fNbinsH)
continue;
2370 if (sign < 0 && maxbin < 1 )
continue;
2371 if (sign > 0 && maxbin < 1 ) maxbin = 1;
2372 if (sign < 0 && maxbin > fNbinsH) maxbin = fNbinsH;
2377 for (
Int_t ibin=maxbin+1; ibin<=fNbinsH; ibin++) theHist->
AddBinContent( ibin , theWeight );
2379 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<GetEfficiency> Mismatch in sign" <<
Endl;
2390 TH1* eff_BvsS =
new TH1D( GetTestvarName() +
"_effBvsS", GetTestvarName() +
"", fNbins, 0, 1 );
2391 results->
Store(eff_BvsS,
"MVA_EFF_BvsS");
2396 TH1* rej_BvsS =
new TH1D( GetTestvarName() +
"_rejBvsS", GetTestvarName() +
"", fNbins, 0, 1 );
2397 results->
Store(rej_BvsS);
2399 rej_BvsS->
SetYTitle(
"Backgr rejection (1-eff)" );
2402 TH1* inveff_BvsS =
new TH1D( GetTestvarName() +
"_invBeffvsSeff",
2403 GetTestvarName(), fNbins, 0, 1 );
2404 results->
Store(inveff_BvsS);
2406 inveff_BvsS->
SetYTitle(
"Inverse backgr. eff (1/eff)" );
2412 fSplRefS =
new TSpline1(
"spline2_signal",
new TGraph( eff_s ) );
2413 fSplRefB =
new TSpline1(
"spline2_background",
new TGraph( eff_b ) );
2427 for (
Int_t bini=1; bini<=fNbins; bini++) {
2449 Double_t effS = 0., rejB, effS_ = 0., rejB_ = 0.;
2450 Int_t nbins_ = 5000;
2451 for (
Int_t bini=1; bini<=nbins_; bini++) {
2454 effS = (bini - 0.5)/
Float_t(nbins_);
2455 rejB = 1.0 - fSpleffBvsS->Eval( effS );
2458 if ((effS - rejB)*(effS_ - rejB_) < 0)
break;
2465 SetSignalReferenceCut( cut );
2470 if (0 == fSpleffBvsS) {
2476 Double_t effS = 0, effB = 0, effS_ = 0, effB_ = 0;
2477 Int_t nbins_ = 1000;
2483 for (
Int_t bini=1; bini<=nbins_; bini++) {
2486 effS = (bini - 0.5)/
Float_t(nbins_);
2487 effB = fSpleffBvsS->Eval( effS );
2488 integral += (1.0 - effB);
2502 for (
Int_t bini=1; bini<=nbins_; bini++) {
2505 effS = (bini - 0.5)/
Float_t(nbins_);
2506 effB = fSpleffBvsS->Eval( effS );
2509 if ((effB - effBref)*(effB_ - effBref) <= 0)
break;
2515 effS = 0.5*(effS + effS_);
2518 if (nevtS > 0) effSerr =
TMath::Sqrt( effS*(1.0 - effS)/nevtS );
2543 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<GetTrainingEfficiency> Wrong number of arguments"
2544 <<
" in string: " << theString
2545 <<
" | required format, e.g., Efficiency:0.05" <<
Endl;
2558 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<GetTrainingEfficiency> Binning mismatch between signal and background histos"
2566 TH1 * effhist = results->
GetHist(
"MVA_HIGHBIN_S");
2571 if (results->
DoesExist(
"MVA_TRAIN_S")==0) {
2577 TH1* mva_s_tr =
new TH1D( GetTestvarName() +
"_Train_S",GetTestvarName() +
"_Train_S", fNbinsMVAoutput, fXmin, sxmax );
2578 TH1* mva_b_tr =
new TH1D( GetTestvarName() +
"_Train_B",GetTestvarName() +
"_Train_B", fNbinsMVAoutput, fXmin, sxmax );
2579 results->
Store(mva_s_tr,
"MVA_TRAIN_S");
2580 results->
Store(mva_b_tr,
"MVA_TRAIN_B");
2585 TH1* mva_eff_tr_s =
new TH1D( GetTestvarName() +
"_trainingEffS", GetTestvarName() +
" (signal)",
2587 TH1* mva_eff_tr_b =
new TH1D( GetTestvarName() +
"_trainingEffB", GetTestvarName() +
" (background)",
2589 results->
Store(mva_eff_tr_s,
"MVA_TRAINEFF_S");
2590 results->
Store(mva_eff_tr_b,
"MVA_TRAINEFF_B");
2593 Int_t sign = (fCutOrientation == kPositive) ? +1 : -1;
2595 std::vector<Double_t> mvaValues = GetMvaValues(0,Data()->GetNEvents());
2596 assert( (
Long64_t) mvaValues.size() == Data()->GetNEvents());
2599 for (
Int_t ievt=0; ievt<Data()->GetNEvents(); ievt++) {
2601 Data()->SetCurrentEvent(ievt);
2602 const Event* ev = GetEvent();
2607 TH1* theEffHist = DataInfo().IsSignal(ev) ? mva_eff_tr_s : mva_eff_tr_b;
2608 TH1* theClsHist = DataInfo().IsSignal(ev) ? mva_s_tr : mva_b_tr;
2610 theClsHist->
Fill( theVal, theWeight );
2614 if (sign > 0 && maxbin > fNbinsH)
continue;
2615 if (sign < 0 && maxbin < 1 )
continue;
2616 if (sign > 0 && maxbin < 1 ) maxbin = 1;
2617 if (sign < 0 && maxbin > fNbinsH) maxbin = fNbinsH;
2619 if (sign > 0)
for (
Int_t ibin=1; ibin<=maxbin; ibin++) theEffHist->
AddBinContent( ibin , theWeight );
2620 else for (
Int_t ibin=maxbin+1; ibin<=fNbinsH; ibin++) theEffHist->
AddBinContent( ibin , theWeight );
2633 TH1* eff_bvss =
new TH1D( GetTestvarName() +
"_trainingEffBvsS", GetTestvarName() +
"", fNbins, 0, 1 );
2635 TH1* rej_bvss =
new TH1D( GetTestvarName() +
"_trainingRejBvsS", GetTestvarName() +
"", fNbins, 0, 1 );
2636 results->
Store(eff_bvss,
"EFF_BVSS_TR");
2637 results->
Store(rej_bvss,
"REJ_BVSS_TR");
2643 if (fSplTrainRefS)
delete fSplTrainRefS;
2644 if (fSplTrainRefB)
delete fSplTrainRefB;
2645 fSplTrainRefS =
new TSpline1(
"spline2_signal",
new TGraph( mva_eff_tr_s ) );
2646 fSplTrainRefB =
new TSpline1(
"spline2_background",
new TGraph( mva_eff_tr_b ) );
2659 fEffS = results->
GetHist(
"MVA_TRAINEFF_S");
2660 for (
Int_t bini=1; bini<=fNbins; bini++) {
2678 fSplTrainEffBvsS =
new TSpline1(
"effBvsS",
new TGraph( eff_bvss ) );
2682 if (0 == fSplTrainEffBvsS)
return 0.0;
2685 Double_t effS = 0., effB, effS_ = 0., effB_ = 0.;
2686 Int_t nbins_ = 1000;
2687 for (
Int_t bini=1; bini<=nbins_; bini++) {
2690 effS = (bini - 0.5)/
Float_t(nbins_);
2691 effB = fSplTrainEffBvsS->Eval( effS );
2694 if ((effB - effBref)*(effB_ - effBref) <= 0)
break;
2699 return 0.5*(effS + effS_);
2708 if (!resMulticlass)
Log() <<
kFATAL<<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"unable to create pointer in GetMulticlassEfficiency, exiting."<<
Endl;
2720 if (!resMulticlass)
Log() <<
kFATAL<<
"unable to create pointer in GetMulticlassTrainingEfficiency, exiting."<<
Endl;
2722 Log() <<
kINFO <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Determine optimal multiclass cuts for training data..." <<
Endl;
2723 for (
UInt_t icls = 0; icls<DataInfo().GetNClasses(); ++icls) {
2754 Log() <<
kFATAL <<
"Cannot get confusion matrix for non-multiclass analysis." << std::endl;
2758 Data()->SetCurrentType(
type);
2762 if (resMulticlass ==
nullptr) {
2763 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ", DataInfo().GetName())
2764 <<
"unable to create pointer in GetMulticlassEfficiency, exiting." <<
Endl;
2781 return (rms > 0) ?
TMath::Abs(fMeanS - fMeanB)/rms : 0;
2805 if ((!pdfS && pdfB) || (pdfS && !pdfB))
2806 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<GetSeparation> Mismatch in pdfs" <<
Endl;
2807 if (!pdfS) pdfS = fSplS;
2808 if (!pdfB) pdfB = fSplB;
2810 if (!fSplS || !fSplB) {
2811 Log()<<
kDEBUG<<
Form(
"[%s] : ",DataInfo().GetName())<<
"could not calculate the separation, distributions"
2812 <<
" fSplS or fSplB are not yet filled" <<
Endl;
2827 if ((!histS && histB) || (histS && !histB))
2828 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<GetROCIntegral(TH1D*, TH1D*)> Mismatch in hists" <<
Endl;
2830 if (histS==0 || histB==0)
return 0.;
2843 for (
UInt_t i=0; i<nsteps; i++) {
2849 return integral*step;
2861 if ((!pdfS && pdfB) || (pdfS && !pdfB))
2862 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<GetSeparation> Mismatch in pdfs" <<
Endl;
2863 if (!pdfS) pdfS = fSplS;
2864 if (!pdfB) pdfB = fSplB;
2866 if (pdfS==0 || pdfB==0)
return 0.;
2875 for (
UInt_t i=0; i<nsteps; i++) {
2879 return integral*step;
2889 Double_t& max_significance_value )
const
2894 Double_t effS(0),effB(0),significance(0);
2895 TH1D *temp_histogram =
new TH1D(
"temp",
"temp", fNbinsH, fXmin, fXmax );
2897 if (SignalEvents <= 0 || BackgroundEvents <= 0) {
2898 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<GetMaximumSignificance> "
2899 <<
"Number of signal or background events is <= 0 ==> abort"
2903 Log() <<
kINFO <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Using ratio SignalEvents/BackgroundEvents = "
2904 << SignalEvents/BackgroundEvents <<
Endl;
2909 if ( (eff_s==0) || (eff_b==0) ) {
2910 Log() <<
kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Efficiency histograms empty !" <<
Endl;
2911 Log() <<
kWARNING <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"no maximum cut found, return 0" <<
Endl;
2915 for (
Int_t bin=1; bin<=fNbinsH; bin++) {
2920 significance =
sqrt(SignalEvents)*( effS )/
sqrt( effS + ( BackgroundEvents / SignalEvents) * effB );
2930 delete temp_histogram;
2932 Log() <<
kINFO <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"Optimal cut at : " << max_significance <<
Endl;
2933 Log() <<
kINFO<<
Form(
"Dataset[%s] : ",DataInfo().GetName()) <<
"Maximum significance: " << max_significance_value <<
Endl;
2935 return max_significance;
2949 Data()->SetCurrentType(treeType);
2951 Long64_t entries = Data()->GetNEvents();
2955 Log() <<
kFATAL <<
Form(
"Dataset[%s] : ",DataInfo().GetName())<<
"<CalculateEstimator> Wrong tree type: " << treeType <<
Endl;
2958 UInt_t varIndex = DataInfo().FindVarIndex( theVarName );
2972 for (
Int_t ievt = 0; ievt < entries; ievt++) {
2974 const Event* ev = GetEvent(ievt);
2979 if (DataInfo().IsSignal(ev)) {
2981 meanS += weight*theVar;
2982 rmsS += weight*theVar*theVar;
2986 meanB += weight*theVar;
2987 rmsB += weight*theVar*theVar;
2993 meanS = meanS/sumwS;
2994 meanB = meanB/sumwB;
2998 Data()->SetCurrentType(previousTreeType);
3008 if (theClassFileName ==
"")
3009 classFileName = GetWeightFileDir() +
"/" + GetJobName() +
"_" +
GetMethodName() +
".class.C";
3011 classFileName = theClassFileName;
3015 TString tfname( classFileName );
3017 <<
"Creating standalone class: "
3020 std::ofstream fout( classFileName );
3022 Log() <<
kFATAL <<
"<MakeClass> Unable to open file: " << classFileName <<
Endl;
3027 fout <<
"// Class: " << className << std::endl;
3028 fout <<
"// Automatically generated by MethodBase::MakeClass" << std::endl <<
"//" << std::endl;
3032 fout <<
"/* configuration options =====================================================" << std::endl << std::endl;
3033 WriteStateToStream( fout );
3035 fout <<
"============================================================================ */" << std::endl;
3038 fout <<
"" << std::endl;
3039 fout <<
"#include <array>" << std::endl;
3040 fout <<
"#include <vector>" << std::endl;
3041 fout <<
"#include <cmath>" << std::endl;
3042 fout <<
"#include <string>" << std::endl;
3043 fout <<
"#include <iostream>" << std::endl;
3044 fout <<
"" << std::endl;
3047 this->MakeClassSpecificHeader( fout, className );
3049 fout <<
"#ifndef IClassifierReader__def" << std::endl;
3050 fout <<
"#define IClassifierReader__def" << std::endl;
3052 fout <<
"class IClassifierReader {" << std::endl;
3054 fout <<
" public:" << std::endl;
3056 fout <<
" // constructor" << std::endl;
3057 fout <<
" IClassifierReader() : fStatusIsClean( true ) {}" << std::endl;
3058 fout <<
" virtual ~IClassifierReader() {}" << std::endl;
3060 fout <<
" // return classifier response" << std::endl;
3062 fout <<
" virtual std::vector<double> GetMulticlassValues( const std::vector<double>& inputValues ) const = 0;" << std::endl;
3064 fout <<
" virtual double GetMvaValue( const std::vector<double>& inputValues ) const = 0;" << std::endl;
3067 fout <<
" // returns classifier status" << std::endl;
3068 fout <<
" bool IsStatusClean() const { return fStatusIsClean; }" << std::endl;
3070 fout <<
" protected:" << std::endl;
3072 fout <<
" bool fStatusIsClean;" << std::endl;
3073 fout <<
"};" << std::endl;
3075 fout <<
"#endif" << std::endl;
3077 fout <<
"class " << className <<
" : public IClassifierReader {" << std::endl;
3079 fout <<
" public:" << std::endl;
3081 fout <<
" // constructor" << std::endl;
3082 fout <<
" " << className <<
"( std::vector<std::string>& theInputVars )" << std::endl;
3083 fout <<
" : IClassifierReader()," << std::endl;
3084 fout <<
" fClassName( \"" << className <<
"\" )," << std::endl;
3085 fout <<
" fNvars( " << GetNvar() <<
" )" << std::endl;
3086 fout <<
" {" << std::endl;
3087 fout <<
" // the training input variables" << std::endl;
3088 fout <<
" const char* inputVars[] = { ";
3089 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
3090 fout <<
"\"" << GetOriginalVarName(ivar) <<
"\"";
3091 if (ivar<GetNvar()-1) fout <<
", ";
3093 fout <<
" };" << std::endl;
3095 fout <<
" // sanity checks" << std::endl;
3096 fout <<
" if (theInputVars.size() <= 0) {" << std::endl;
3097 fout <<
" std::cout << \"Problem in class \\\"\" << fClassName << \"\\\": empty input vector\" << std::endl;" << std::endl;
3098 fout <<
" fStatusIsClean = false;" << std::endl;
3099 fout <<
" }" << std::endl;
3101 fout <<
" if (theInputVars.size() != fNvars) {" << std::endl;
3102 fout <<
" std::cout << \"Problem in class \\\"\" << fClassName << \"\\\": mismatch in number of input values: \"" << std::endl;
3103 fout <<
" << theInputVars.size() << \" != \" << fNvars << std::endl;" << std::endl;
3104 fout <<
" fStatusIsClean = false;" << std::endl;
3105 fout <<
" }" << std::endl;
3107 fout <<
" // validate input variables" << std::endl;
3108 fout <<
" for (size_t ivar = 0; ivar < theInputVars.size(); ivar++) {" << std::endl;
3109 fout <<
" if (theInputVars[ivar] != inputVars[ivar]) {" << std::endl;
3110 fout <<
" std::cout << \"Problem in class \\\"\" << fClassName << \"\\\": mismatch in input variable names\" << std::endl" << std::endl;
3111 fout <<
" << \" for variable [\" << ivar << \"]: \" << theInputVars[ivar].c_str() << \" != \" << inputVars[ivar] << std::endl;" << std::endl;
3112 fout <<
" fStatusIsClean = false;" << std::endl;
3113 fout <<
" }" << std::endl;
3114 fout <<
" }" << std::endl;
3116 fout <<
" // initialize min and max vectors (for normalisation)" << std::endl;
3117 for (
UInt_t ivar = 0; ivar < GetNvar(); ivar++) {
3118 fout <<
" fVmin[" << ivar <<
"] = " << std::setprecision(15) << GetXmin( ivar ) <<
";" << std::endl;
3119 fout <<
" fVmax[" << ivar <<
"] = " << std::setprecision(15) << GetXmax( ivar ) <<
";" << std::endl;
3122 fout <<
" // initialize input variable types" << std::endl;
3123 for (
UInt_t ivar=0; ivar<GetNvar(); ivar++) {
3124 fout <<
" fType[" << ivar <<
"] = \'" << DataInfo().GetVariableInfo(ivar).GetVarType() <<
"\';" << std::endl;
3127 fout <<
" // initialize constants" << std::endl;
3128 fout <<
" Initialize();" << std::endl;
3130 if (GetTransformationHandler().GetTransformationList().GetSize() != 0) {
3131 fout <<
" // initialize transformation" << std::endl;
3132 fout <<
" InitTransform();" << std::endl;
3134 fout <<
" }" << std::endl;
3136 fout <<
" // destructor" << std::endl;
3137 fout <<
" virtual ~" << className <<
"() {" << std::endl;
3138 fout <<
" Clear(); // method-specific" << std::endl;
3139 fout <<
" }" << std::endl;
3141 fout <<
" // the classifier response" << std::endl;
3142 fout <<
" // \"inputValues\" is a vector of input values in the same order as the" << std::endl;
3143 fout <<
" // variables given to the constructor" << std::endl;
3145 fout <<
" std::vector<double> GetMulticlassValues( const std::vector<double>& inputValues ) const override;" << std::endl;
3147 fout <<
" double GetMvaValue( const std::vector<double>& inputValues ) const override;" << std::endl;
3150 fout <<
" private:" << std::endl;
3152 fout <<
" // method-specific destructor" << std::endl;
3153 fout <<
" void Clear();" << std::endl;
3155 if (GetTransformationHandler().GetTransformationList().GetSize()!=0) {
3156 fout <<
" // input variable transformation" << std::endl;
3157 GetTransformationHandler().MakeFunction(fout, className,1);
3158 fout <<
" void InitTransform();" << std::endl;
3159 fout <<
" void Transform( std::vector<double> & iv, int sigOrBgd ) const;" << std::endl;
3162 fout <<
" // common member variables" << std::endl;
3163 fout <<
" const char* fClassName;" << std::endl;
3165 fout <<
" const size_t fNvars;" << std::endl;
3166 fout <<
" size_t GetNvar() const { return fNvars; }" << std::endl;
3167 fout <<
" char GetType( int ivar ) const { return fType[ivar]; }" << std::endl;
3169 fout <<
" // normalisation of input variables" << std::endl;
3170 fout <<
" double fVmin[" << GetNvar() <<
"];" << std::endl;
3171 fout <<
" double fVmax[" << GetNvar() <<
"];" << std::endl;
3172 fout <<
" double NormVariable( double x, double xmin, double xmax ) const {" << std::endl;
3173 fout <<
" // normalise to output range: [-1, 1]" << std::endl;
3174 fout <<
" return 2*(x - xmin)/(xmax - xmin) - 1.0;" << std::endl;
3175 fout <<
" }" << std::endl;
3177 fout <<
" // type of input variable: 'F' or 'I'" << std::endl;
3178 fout <<
" char fType[" << GetNvar() <<
"];" << std::endl;
3180 fout <<
" // initialize internal variables" << std::endl;
3181 fout <<
" void Initialize();" << std::endl;
3183 fout <<
" std::vector<double> GetMulticlassValues__( const std::vector<double>& inputValues ) const;" << std::endl;
3185 fout <<
" double GetMvaValue__( const std::vector<double>& inputValues ) const;" << std::endl;
3187 fout <<
"" << std::endl;
3188 fout <<
" // private members (method specific)" << std::endl;
3191 MakeClassSpecific( fout, className );
3194 fout <<
"inline std::vector<double> " << className <<
"::GetMulticlassValues( const std::vector<double>& inputValues ) const" << std::endl;
3196 fout <<
"inline double " << className <<
"::GetMvaValue( const std::vector<double>& inputValues ) const" << std::endl;
3198 fout <<
"{" << std::endl;
3199 fout <<
" // classifier response value" << std::endl;
3201 fout <<
" std::vector<double> retval;" << std::endl;
3203 fout <<
" double retval = 0;" << std::endl;
3206 fout <<
" // classifier response, sanity check first" << std::endl;
3207 fout <<
" if (!IsStatusClean()) {" << std::endl;
3208 fout <<
" std::cout << \"Problem in class \\\"\" << fClassName << \"\\\": cannot return classifier response\"" << std::endl;
3209 fout <<
" << \" because status is dirty\" << std::endl;" << std::endl;
3210 fout <<
" }" << std::endl;
3211 fout <<
" else {" << std::endl;
3212 if (IsNormalised()) {
3213 fout <<
" // normalise variables" << std::endl;
3214 fout <<
" std::vector<double> iV;" << std::endl;
3215 fout <<
" iV.reserve(inputValues.size());" << std::endl;
3216 fout <<
" int ivar = 0;" << std::endl;
3217 fout <<
" for (std::vector<double>::const_iterator varIt = inputValues.begin();" << std::endl;
3218 fout <<
" varIt != inputValues.end(); varIt++, ivar++) {" << std::endl;
3219 fout <<
" iV.push_back(NormVariable( *varIt, fVmin[ivar], fVmax[ivar] ));" << std::endl;
3220 fout <<
" }" << std::endl;
3221 if (GetTransformationHandler().GetTransformationList().GetSize() != 0 && GetMethodType() !=
Types::kLikelihood &&
3223 fout <<
" Transform( iV, -1 );" << std::endl;
3227 fout <<
" retval = GetMulticlassValues__( iV );" << std::endl;
3229 fout <<
" retval = GetMvaValue__( iV );" << std::endl;
3232 if (GetTransformationHandler().GetTransformationList().GetSize() != 0 && GetMethodType() !=
Types::kLikelihood &&
3234 fout <<
" std::vector<double> iV(inputValues);" << std::endl;
3235 fout <<
" Transform( iV, -1 );" << std::endl;
3237 fout <<
" retval = GetMulticlassValues__( iV );" << std::endl;
3239 fout <<
" retval = GetMvaValue__( iV );" << std::endl;
3243 fout <<
" retval = GetMulticlassValues__( inputValues );" << std::endl;
3245 fout <<
" retval = GetMvaValue__( inputValues );" << std::endl;
3249 fout <<
" }" << std::endl;
3251 fout <<
" return retval;" << std::endl;
3252 fout <<
"}" << std::endl;
3255 if (GetTransformationHandler().GetTransformationList().GetSize()!=0)
3256 GetTransformationHandler().MakeFunction(fout, className,2);
3268 std::streambuf* cout_sbuf = std::cout.rdbuf();
3269 std::ofstream* o = 0;
3270 if (
gConfig().WriteOptionsReference()) {
3271 Log() <<
kINFO <<
"Print Help message for class " << GetName() <<
" into file: " << GetReferenceFile() <<
Endl;
3272 o =
new std::ofstream( GetReferenceFile(), std::ios::app );
3274 Log() <<
kFATAL <<
"<PrintHelpMessage> Unable to append to output file: " << GetReferenceFile() <<
Endl;
3276 std::cout.rdbuf( o->rdbuf() );
3283 <<
"================================================================"
3287 <<
"H e l p f o r M V A m e t h o d [ " << GetName() <<
" ] :"
3292 Log() <<
"Help for MVA method [ " << GetName() <<
" ] :" <<
Endl;
3300 Log() <<
"<Suppress this message by specifying \"!H\" in the booking option>" <<
Endl;
3302 <<
"================================================================"
3309 Log() <<
"# End of Message___" <<
Endl;
3312 std::cout.rdbuf( cout_sbuf );
3327 retval = fSplRefS->Eval( theCut );
3329 else retval = fEffS->GetBinContent( fEffS->FindBin( theCut ) );
3338 if (theCut-fXmin < eps) retval = (GetCutOrientation() == kPositive) ? 1.0 : 0.0;
3339 else if (fXmax-theCut < eps) retval = (GetCutOrientation() == kPositive) ? 0.0 : 1.0;
3352 if (GetTransformationHandler().GetTransformationList().GetEntries() <= 0) {
3353 return (Data()->GetEventCollection(
type));
3360 if (fEventCollections.at(idx) == 0) {
3361 fEventCollections.at(idx) = &(Data()->GetEventCollection(
type));
3362 fEventCollections.at(idx) = GetTransformationHandler().CalcTransformations(*(fEventCollections.at(idx)),
kTRUE);
3364 return *(fEventCollections.at(idx));
3372 UInt_t a = GetTrainingTMVAVersionCode() & 0xff0000;
a>>=16;
3373 UInt_t b = GetTrainingTMVAVersionCode() & 0x00ff00;
b>>=8;
3374 UInt_t c = GetTrainingTMVAVersionCode() & 0x0000ff;
3384 UInt_t a = GetTrainingROOTVersionCode() & 0xff0000;
a>>=16;
3385 UInt_t b = GetTrainingROOTVersionCode() & 0x00ff00;
b>>=8;
3386 UInt_t c = GetTrainingROOTVersionCode() & 0x0000ff;
3397 if (mvaRes != NULL) {
3400 TH1D *mva_s_tr =
dynamic_cast<TH1D*
> (mvaRes->
GetHist(
"MVA_TRAIN_S"));
3401 TH1D *mva_b_tr =
dynamic_cast<TH1D*
> (mvaRes->
GetHist(
"MVA_TRAIN_B"));
3403 if ( !mva_s || !mva_b || !mva_s_tr || !mva_b_tr)
return -1;
3405 if (SorB ==
's' || SorB ==
'S')
const Bool_t Use_Splines_for_Eff_
const Int_t NBIN_HIST_HIGH
#define ROOT_VERSION_CODE
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t b
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h length
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Option_t Option_t TPoint TPoint const char y1
TMatrixT< Double_t > TMatrixD
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
R__EXTERN TSystem * gSystem
#define TMVA_VERSION_CODE
Class to manage histogram axis.
Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0) override
Write all objects in this collection.
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
This class stores the date and time with a precision of one second in an unsigned 32 bit word (950130...
const char * AsString() const
Return the date & time as a string (ctime() format).
TObject * Get(const char *namecycle) override
Return pointer to object identified by namecycle.
Describe directory structure in memory.
virtual TDirectory * GetDirectory(const char *namecycle, Bool_t printError=false, const char *funcname="GetDirectory")
Find a directory using apath.
virtual Bool_t cd()
Change current directory to "this" directory.
virtual TDirectory * mkdir(const char *name, const char *title="", Bool_t returnExistingDirectory=kFALSE)
Create a sub-directory "a" or a hierarchy of sub-directories "a/b/c/...".
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
void Close(Option_t *option="") override
Close a file.
A TGraph is an object made of two arrays X and Y with npoints each.
1-D histogram with a double per channel (see TH1 documentation)}
1-D histogram with a float per channel (see TH1 documentation)}
TH1 is the base class of all histogram classes in ROOT.
virtual Double_t GetBinCenter(Int_t bin) const
Return bin center for 1D histogram.
virtual void AddBinContent(Int_t bin)
Increment bin content by 1.
virtual Double_t GetMean(Int_t axis=1) const
For axis = 1,2 or 3 returns the mean value of the histogram along X,Y or Z axis.
virtual void SetXTitle(const char *title)
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
virtual Double_t GetMaximum(Double_t maxval=FLT_MAX) const
Return maximum value smaller than maxval of bins in the range, unless the value has been overridden b...
virtual Int_t GetNbinsX() const
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
virtual void SetBinContent(Int_t bin, Double_t content)
Set bin content see convention for numbering bins in TH1::GetBin In case the bin number is greater th...
virtual Int_t GetMaximumBin() const
Return location of bin with maximum value in the range.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
virtual Int_t GetQuantiles(Int_t nprobSum, Double_t *q, const Double_t *probSum=nullptr)
Compute Quantiles for this histogram Quantile x_q of a probability distribution Function F is defined...
virtual void SetYTitle(const char *title)
virtual void Scale(Double_t c1=1, Option_t *option="")
Multiply this histogram by a constant c1.
virtual Int_t FindBin(Double_t x, Double_t y=0, Double_t z=0)
Return Global bin number corresponding to x,y,z.
virtual Double_t KolmogorovTest(const TH1 *h2, Option_t *option="") const
Statistical test of compatibility in shape between this histogram and h2, using Kolmogorov test.
virtual void Sumw2(Bool_t flag=kTRUE)
Create structure to store sum of squares of weights.
static Bool_t AddDirectoryStatus()
Static function: cannot be inlined on Windows/NT.
2-D histogram with a float per channel (see TH1 documentation)}
Int_t Fill(Double_t) override
Invalid Fill method.
TObject * At(Int_t idx) const override
Returns the object at position idx. Returns 0 if idx is out of range.
Class that contains all the information of a class.
TString fWeightFileExtension
Int_t fMaxNumOfAllowedVariables
VariablePlotting & GetVariablePlotting()
class TMVA::Config::VariablePlotting fVariablePlotting
MsgLogger * fLogger
! message logger
Class that contains all the data information.
Class that contains all the data information.
Float_t GetValue(UInt_t ivar) const
return value of i'th variable
Double_t GetWeight() const
return the event weight - depending on whether the flag IgnoreNegWeightsInTraining is or not.
static void SetIsTraining(Bool_t)
when this static function is called, it sets the flag whether events with negative event weight shoul...
Float_t GetTarget(UInt_t itgt) const
static void SetIgnoreNegWeightsInTraining(Bool_t)
when this static function is called, it sets the flag whether events with negative event weight shoul...
Interface for all concrete MVA method implementations.
void Init(std::vector< TString > &graphTitles)
This function gets some title and it creates a TGraph for every title.
IPythonInteractive()
standard constructor
~IPythonInteractive()
standard destructor
void ClearGraphs()
This function sets the point number to 0 for all graphs.
void AddPoint(Double_t x, Double_t y1, Double_t y2)
This function is used only in 2 TGraph case, and it will add new data points to graphs.
Virtual base Class for all MVA method.
TDirectory * MethodBaseDir() const
returns the ROOT directory where all instances of the corresponding MVA method are stored
virtual Double_t GetKSTrainingVsTest(Char_t SorB, TString opt="X")
MethodBase(const TString &jobName, Types::EMVA methodType, const TString &methodTitle, DataSetInfo &dsi, const TString &theOption="")
standard constructor
virtual Double_t GetMvaValue(Double_t *errLower=nullptr, Double_t *errUpper=nullptr)=0
virtual Double_t GetSeparation(TH1 *, TH1 *) const
compute "separation" defined as
void ReadClassesFromXML(void *clsnode)
read number of classes from XML
void SetWeightFileDir(TString fileDir)
set directory of weight file
void WriteStateToXML(void *parent) const
general method used in writing the header of the weight files where the used variables,...
void DeclareBaseOptions()
define the options (their key words) that can be set in the option string here the options valid for ...
virtual void TestRegression(Double_t &bias, Double_t &biasT, Double_t &dev, Double_t &devT, Double_t &rms, Double_t &rmsT, Double_t &mInf, Double_t &mInfT, Double_t &corr, Types::ETreeType type)
calculate <sum-of-deviation-squared> of regression output versus "true" value from test sample
virtual void DeclareCompatibilityOptions()
options that are used ONLY for the READER to ensure backward compatibility they are hence without any...
virtual Double_t GetSignificance() const
compute significance of mean difference
virtual Double_t GetProba(const Event *ev)
const char * GetName() const
virtual TMatrixD GetMulticlassConfusionMatrix(Double_t effB, Types::ETreeType type)
Construct a confusion matrix for a multiclass classifier.
void PrintHelpMessage() const
prints out method-specific help method
virtual void WriteEvaluationHistosToFile(Types::ETreeType treetype)
writes all MVA evaluation histograms to file
virtual void TestMulticlass()
test multiclass classification
const std::vector< TMVA::Event * > & GetEventCollection(Types::ETreeType type)
returns the event collection (i.e.
virtual std::vector< Double_t > GetDataMvaValues(DataSet *data=nullptr, Long64_t firstEvt=0, Long64_t lastEvt=-1, Bool_t logProgress=false)
get all the MVA values for the events of the given Data type
void SetupMethod()
setup of methods
TDirectory * BaseDir() const
returns the ROOT directory where info/histograms etc of the corresponding MVA method instance are sto...
virtual std::vector< Float_t > GetMulticlassEfficiency(std::vector< std::vector< Float_t > > &purity)
void AddInfoItem(void *gi, const TString &name, const TString &value) const
xml writing
virtual void AddClassifierOutputProb(Types::ETreeType type)
prepare tree branch with the method's discriminating variable
virtual Double_t GetEfficiency(const TString &, Types::ETreeType, Double_t &err)
fill background efficiency (resp.
TString GetTrainingTMVAVersionString() const
calculates the TMVA version string from the training version code on the fly
void Statistics(Types::ETreeType treeType, const TString &theVarName, Double_t &, Double_t &, Double_t &, Double_t &, Double_t &, Double_t &)
calculates rms,mean, xmin, xmax of the event variable this can be either done for the variables as th...
Bool_t GetLine(std::istream &fin, char *buf)
reads one line from the input stream checks for certain keywords and interprets the line if keywords ...
void ProcessSetup()
process all options the "CheckForUnusedOptions" is done in an independent call, since it may be overr...
virtual std::vector< Double_t > GetMvaValues(Long64_t firstEvt=0, Long64_t lastEvt=-1, Bool_t logProgress=false)
get all the MVA values for the events of the current Data type
virtual Bool_t IsSignalLike()
uses a pre-set cut on the MVA output (SetSignalReferenceCut and SetSignalReferenceCutOrientation) for...
virtual ~MethodBase()
destructor
virtual Double_t GetMaximumSignificance(Double_t SignalEvents, Double_t BackgroundEvents, Double_t &optimal_significance_value) const
plot significance, , curve for given number of signal and background events; returns cut for maximum ...
virtual Double_t GetTrainingEfficiency(const TString &)
void SetWeightFileName(TString)
set the weight file name (depreciated)
virtual void MakeClass(const TString &classFileName=TString("")) const
create reader class for method (classification only at present)
TString GetWeightFileName() const
retrieve weight file name
virtual void TestClassification()
initialization
void AddOutput(Types::ETreeType type, Types::EAnalysisType analysisType)
virtual void WriteMonitoringHistosToFile() const
write special monitoring histograms to file dummy implementation here --------------—
virtual void AddRegressionOutput(Types::ETreeType type)
prepare tree branch with the method's discriminating variable
void InitBase()
default initialization called by all constructors
virtual void GetRegressionDeviation(UInt_t tgtNum, Types::ETreeType type, Double_t &stddev, Double_t &stddev90Percent) const
void ReadStateFromXMLString(const char *xmlstr)
for reading from memory
void CreateMVAPdfs()
Create PDFs of the MVA output variables.
TString GetTrainingROOTVersionString() const
calculates the ROOT version string from the training version code on the fly
virtual Double_t GetValueForRoot(Double_t)
returns efficiency as function of cut
void ReadStateFromFile()
Function to write options and weights to file.
void WriteVarsToStream(std::ostream &tf, const TString &prefix="") const
write the list of variables (name, min, max) for a given data transformation method to the stream
void ReadVarsFromStream(std::istream &istr)
Read the variables (name, min, max) for a given data transformation method from the stream.
void ReadSpectatorsFromXML(void *specnode)
read spectator info from XML
void SetTestvarName(const TString &v="")
void ReadVariablesFromXML(void *varnode)
read variable info from XML
virtual std::map< TString, Double_t > OptimizeTuningParameters(TString fomType="ROCIntegral", TString fitType="FitGA")
call the Optimizer with the set of parameters and ranges that are meant to be tuned.
virtual std::vector< Float_t > GetMulticlassTrainingEfficiency(std::vector< std::vector< Float_t > > &purity)
void WriteStateToStream(std::ostream &tf) const
general method used in writing the header of the weight files where the used variables,...
virtual Double_t GetRarity(Double_t mvaVal, Types::ESBType reftype=Types::kBackground) const
compute rarity:
virtual void SetTuneParameters(std::map< TString, Double_t > tuneParameters)
set the tuning parameters according to the argument This is just a dummy .
void ReadStateFromStream(std::istream &tf)
read the header from the weight files of the different MVA methods
void AddVarsXMLTo(void *parent) const
write variable info to XML
void AddTargetsXMLTo(void *parent) const
write target info to XML
void ReadTargetsFromXML(void *tarnode)
read target info from XML
void ProcessBaseOptions()
the option string is decoded, for available options see "DeclareOptions"
void ReadStateFromXML(void *parent)
void NoErrorCalc(Double_t *const err, Double_t *const errUpper)
void WriteStateToFile() const
write options and weights to file note that each one text file for the main configuration information...
void AddClassesXMLTo(void *parent) const
write class info to XML
virtual void AddClassifierOutput(Types::ETreeType type)
prepare tree branch with the method's discriminating variable
void AddSpectatorsXMLTo(void *parent) const
write spectator info to XML
virtual Double_t GetROCIntegral(TH1D *histS, TH1D *histB) const
calculate the area (integral) under the ROC curve as a overall quality measure of the classification
virtual void AddMulticlassOutput(Types::ETreeType type)
prepare tree branch with the method's discriminating variable
virtual void CheckSetup()
check may be overridden by derived class (sometimes, eg, fitters are used which can only be implement...
void SetSource(const std::string &source)
PDF wrapper for histograms; uses user-defined spline interpolation.
Double_t GetVal(Double_t x) const
returns value PDF(x)
Double_t GetIntegral(Double_t xmin, Double_t xmax)
computes PDF integral within given ranges
Class that is the base-class for a vector of result.
void Resize(Int_t entries)
std::vector< Float_t > * GetValueVector()
void SetValue(Float_t value, Int_t ievt, Bool_t type)
set MVA response
Class which takes the results of a multiclass classification.
TMatrixD GetConfusionMatrix(Double_t effB)
Returns a confusion matrix where each class is pitted against each other.
Float_t GetAchievablePur(UInt_t cls)
std::vector< Double_t > GetBestMultiClassCuts(UInt_t targetClass)
calculate the best working point (optimal cut values) for the multiclass classifier
void CreateMulticlassHistos(TString prefix, Int_t nbins, Int_t nbins_high)
this function fills the mva response histos for multiclass classification
Float_t GetAchievableEff(UInt_t cls)
void CreateMulticlassPerformanceHistos(TString prefix)
Create performance graphs for this classifier a multiclass setting.
Class that is the base-class for a vector of result.
Class that is the base-class for a vector of result.
Bool_t DoesExist(const TString &alias) const
Returns true if there is an object stored in the result for a given alias, false otherwise.
void Store(TObject *obj, const char *alias=nullptr)
TH1 * GetHist(const TString &alias) const
TList * GetStorage() const
Root finding using Brents algorithm (translated from CERNLIB function RZERO)
Double_t Root(Double_t refValue)
Root finding using Brents algorithm; taken from CERNLIB function RZERO.
Linear interpolation of TGraph.
Timing information for training and evaluation of MVA methods.
Double_t ElapsedSeconds(void)
computes elapsed tim in seconds
TString GetElapsedTime(Bool_t Scientific=kTRUE)
returns pretty string with elapsed time
void DrawProgressBar(Int_t, const TString &comment="")
draws progress bar in color or B&W caution:
Singleton class for Global types used by TMVA.
@ kSignal
Never change this number - it is elsewhere assumed to be zero !
Class for type info of MVA input variable.
void ReadFromXML(void *varnode)
read VariableInfo from stream
const TString & GetExpression() const
void ReadFromStream(std::istream &istr)
read VariableInfo from stream
void AddToXML(void *varnode)
write class to XML
void SetExternalLink(void *p)
void * GetExternalLink() const
A TMultiGraph is a collection of TGraph (or derived) objects.
const char * GetName() const override
Returns name of object.
Collectable string class.
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
void ToLower()
Change string to lower-case.
Int_t Atoi() const
Return integer value of string.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
Ssiz_t Last(char c) const
Find last occurrence of a character c.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
virtual const char * GetBuildNode() const
Return the build node name.
virtual int mkdir(const char *name, Bool_t recursive=kFALSE)
Make a file system directory.
virtual const char * WorkingDirectory()
Return working directory.
virtual UserGroup_t * GetUserInfo(Int_t uid)
Returns all user info in the UserGroup_t structure.
void SaveDoc(XMLDocPointer_t xmldoc, const char *filename, Int_t layout=1)
store document content to file if layout<=0, no any spaces or newlines will be placed between xmlnode...
void FreeDoc(XMLDocPointer_t xmldoc)
frees allocated document data and deletes document itself
XMLNodePointer_t DocGetRootElement(XMLDocPointer_t xmldoc)
returns root node of document
XMLDocPointer_t NewDoc(const char *version="1.0")
creates new xml document with provided version
XMLDocPointer_t ParseFile(const char *filename, Int_t maxbuf=100000)
Parses content of file and tries to produce xml structures.
XMLDocPointer_t ParseString(const char *xmlstring)
parses content of string and tries to produce xml structures
void DocSetRootElement(XMLDocPointer_t xmldoc, XMLNodePointer_t xmlnode)
set main (root) node for document
VecExpr< UnaryOp< Sqrt< T >, VecExpr< A, T, D >, T >, T, D > sqrt(const VecExpr< A, T, D > &rhs)
void Init(TClassEdit::TInterpreterLookupHelper *helper)
static constexpr double s
static constexpr double m2
void GetMethodName(TString &name, TKey *mkey)
void CreateVariableTransforms(const TString &trafoDefinition, TMVA::DataSetInfo &dataInfo, TMVA::TransformationHandler &transformationHandler, TMVA::MsgLogger &log)
MsgLogger & Endl(MsgLogger &ml)
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Double_t Log(Double_t x)
Returns the natural logarithm of x.
Double_t Sqrt(Double_t x)
Returns the square root of x.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.