294 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
" create input formulas for tree " << tr->
GetName() <<
Endl;
295 std::vector<TTreeFormula*>::const_iterator formIt, formItEnd;
296 for (formIt = fInputFormulas.begin(), formItEnd=fInputFormulas.end(); formIt!=formItEnd; ++formIt)
if (*formIt)
delete *formIt;
297 fInputFormulas.clear();
299 fInputTableFormulas.clear();
301 bool firstArrayVar =
kTRUE;
302 int firstArrayVarIndex = -1;
311 fInputFormulas.emplace_back(ttf);
312 fInputTableFormulas.emplace_back(std::make_pair(ttf, (
Int_t) 0));
321 fInputFormulas.push_back(ttf);
325 firstArrayVarIndex = i;
330 fInputTableFormulas.push_back(std::make_pair(ttf, (
Int_t) i-firstArrayVarIndex));
331 if (
int(i)-firstArrayVarIndex == arraySize-1 ) {
333 firstArrayVar =
kTRUE;
334 firstArrayVarIndex = -1;
344 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"transform regression targets" <<
Endl;
345 for (formIt = fTargetFormulas.begin(), formItEnd = fTargetFormulas.end(); formIt!=formItEnd; ++formIt)
if (*formIt)
delete *formIt;
346 fTargetFormulas.clear();
351 fTargetFormulas.push_back( ttf );
357 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"transform spectator variables" <<
Endl;
358 for (formIt = fSpectatorFormulas.begin(), formItEnd = fSpectatorFormulas.end(); formIt!=formItEnd; ++formIt)
if (*formIt)
delete *formIt;
359 fSpectatorFormulas.clear();
364 fSpectatorFormulas.push_back( ttf );
370 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"transform cuts" <<
Endl;
371 for (formIt = fCutFormulas.begin(), formItEnd = fCutFormulas.end(); formIt!=formItEnd; ++formIt)
if (*formIt)
delete *formIt;
372 fCutFormulas.clear();
379 Bool_t worked = CheckTTreeFormula( ttf, tmpCutExp, hasDollar );
385 fCutFormulas.push_back( ttf );
391 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"transform weights" <<
Endl;
392 for (formIt = fWeightFormula.begin(), formItEnd = fWeightFormula.end(); formIt!=formItEnd; ++formIt)
if (*formIt)
delete *formIt;
393 fWeightFormula.clear();
398 fWeightFormula.push_back( 0 );
404 ttf =
new TTreeFormula(
"FormulaWeight", tmpWeight, tr );
405 Bool_t worked = CheckTTreeFormula( ttf, tmpWeight, hasDollar );
414 fWeightFormula.push_back( ttf );
419 Log() << kDEBUG <<
Form(
"Dataset[%s] : ", dsi.
GetName()) <<
"enable branches" <<
Endl;
424 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"enable branches: input variables" <<
Endl;
426 for (formIt = fInputFormulas.begin(); formIt!=fInputFormulas.end(); ++formIt) {
433 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"enable branches: targets" <<
Endl;
434 for (formIt = fTargetFormulas.begin(); formIt!=fTargetFormulas.end(); ++formIt) {
440 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"enable branches: spectators" <<
Endl;
441 for (formIt = fSpectatorFormulas.begin(); formIt!=fSpectatorFormulas.end(); ++formIt) {
447 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"enable branches: cuts" <<
Endl;
448 for (formIt = fCutFormulas.begin(); formIt!=fCutFormulas.end(); ++formIt) {
455 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"enable branches: weights" <<
Endl;
456 for (formIt = fWeightFormula.begin(); formIt!=fWeightFormula.end(); ++formIt) {
463 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"tree initialized" <<
Endl;
735 for (
size_t i=0; i<nclasses; i++) {
736 eventCounts[i].varAvLength =
new Float_t[nvars];
737 for (
UInt_t ivar=0; ivar<nvars; ivar++)
738 eventCounts[i].varAvLength[ivar] = 0;
748 std::map<TString, int> nanInfWarnings;
749 std::map<TString, int> nanInfErrors;
753 for (
UInt_t cl=0; cl<nclasses; cl++) {
757 EventStats& classEventCounts = eventCounts[cl];
771 std::vector<Float_t> vars(nvars);
772 std::vector<Float_t> tgts(ntgts);
773 std::vector<Float_t> vis(nvis);
783 ChangeToNewTree( currentInfo, dsi );
793 for (
Long64_t evtIdx = 0; evtIdx < nEvts; evtIdx++) {
800 ChangeToNewTree( currentInfo, dsi );
804 Int_t sizeOfArrays = 1;
805 Int_t prevArrExpr = 0;
817 for (
UInt_t ivar = 0; ivar < nvars; ivar++) {
820 auto inputFormula = fInputTableFormulas[ivar].first;
822 Int_t ndata = inputFormula->GetNdata();
825 if (ndata == 1)
continue;
826 haveAllArrayData =
kTRUE;
829 if (sizeOfArrays == 1) {
830 sizeOfArrays = ndata;
833 else if (sizeOfArrays!=ndata) {
834 Log() << kERROR <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"ERROR while preparing training and testing trees:" <<
Endl;
835 Log() <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
" multiple array-type expressions of different length were encountered" <<
Endl;
836 Log() <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
" location of error: event " << evtIdx
839 Log() <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
" expression " << inputFormula->GetTitle() <<
" has "
840 <<
Form(
"Dataset[%s] : ",dsi.
GetName()) << ndata <<
" entries, while" <<
Endl;
841 Log() <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
" expression " << fInputTableFormulas[prevArrExpr].first->GetTitle() <<
" has "
842 <<
Form(
"Dataset[%s] : ",dsi.
GetName())<< fInputTableFormulas[prevArrExpr].first->GetNdata() <<
" entries" <<
Endl;
843 Log() << kFATAL <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"Need to abort" <<
Endl;
848 for (
Int_t idata = 0; idata<sizeOfArrays; idata++) {
851 auto checkNanInf = [&](std::map<TString, int> &msgMap,
Float_t value,
const char *
what,
const char *formulaTitle) {
853 contains_NaN_or_inf =
kTRUE;
854 ++msgMap[
TString::Format(
"Dataset[%s] : %s expression resolves to indeterminate value (NaN): %s", dsi.
GetName(),
what, formulaTitle)];
856 contains_NaN_or_inf =
kTRUE;
857 ++msgMap[
TString::Format(
"Dataset[%s] : %s expression resolves to infinite value (+inf or -inf): %s", dsi.
GetName(),
what, formulaTitle)];
865 formula = fCutFormulas[cl];
871 checkNanInf(nanInfErrors, cutVal,
"Cut", formula->
GetTitle());
875 auto &nanMessages = cutVal < 0.5 ? nanInfWarnings : nanInfErrors;
878 for (
UInt_t ivar=0; ivar<nvars; ivar++) {
879 auto formulaMap = fInputTableFormulas[ivar];
880 formula = formulaMap.first;
881 int inputVarIndex = formulaMap.second;
888 if (ndata < arraySize) {
890 <<
" in the current tree " << currentInfo.
GetTree()->
GetName() <<
" for the event " << evtIdx
891 <<
" is " << ndata <<
" instead of " << arraySize <<
Endl;
892 }
else if (ndata > arraySize && !foundLargerArraySize) {
894 <<
" in the current tree " << currentInfo.
GetTree()->
GetName() <<
" for the event "
895 << evtIdx <<
" is " << ndata <<
", larger than " << arraySize <<
Endl;
896 Log() << kWARNING <<
"Some data will then be ignored. This WARNING is printed only once, "
897 <<
" check in case for the other variables and events " <<
Endl;
899 foundLargerArraySize =
kTRUE;
904 vars[ivar] = ( !haveAllArrayData ?
907 checkNanInf(nanMessages, vars[ivar],
"Input", formula->
GetTitle());
911 for (
UInt_t itrgt=0; itrgt<ntgts; itrgt++) {
912 formula = fTargetFormulas[itrgt];
914 tgts[itrgt] = (ndata == 1 ?
917 checkNanInf(nanMessages, tgts[itrgt],
"Target", formula->
GetTitle());
921 for (
UInt_t itVis=0; itVis<nvis; itVis++) {
922 formula = fSpectatorFormulas[itVis];
924 vis[itVis] = (ndata == 1 ?
927 checkNanInf(nanMessages, vis[itVis],
"Spectator", formula->
GetTitle());
933 formula = fWeightFormula[cl];
936 weight *= (ndata == 1 ?
939 checkNanInf(nanMessages, weight,
"Weight", formula->
GetTitle());
949 if (cutVal<0.5)
continue;
958 if (contains_NaN_or_inf) {
959 Log() << kWARNING <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"NaN or +-inf in Event " << evtIdx <<
Endl;
960 if (sizeOfArrays>1) Log() << kWARNING <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
" rejected" <<
Endl;
970 event_v.push_back(
new Event(vars, tgts , vis, cl , weight));
977 if (!nanInfWarnings.empty()) {
978 Log() << kWARNING <<
"Found events with NaN and/or +-inf values" <<
Endl;
979 for (
const auto &warning : nanInfWarnings) {
980 auto &log = Log() << kWARNING << warning.first;
981 if (warning.second > 1) log <<
" (" << warning.second <<
" times)";
984 Log() << kWARNING <<
"These NaN and/or +-infs were all removed by the specified cut, continuing." <<
Endl;
988 if (!nanInfErrors.empty()) {
989 Log() << kWARNING <<
"Found events with NaN and/or +-inf values (not removed by cut)" <<
Endl;
990 for (
const auto &error : nanInfErrors) {
991 auto &log = Log() << kWARNING << error.first;
992 if (error.second > 1) log <<
" (" << error.second <<
" times)";
995 Log() << kFATAL <<
"How am I supposed to train a NaN or +-inf?!" <<
Endl;
1001 Log() << kHEADER <<
Form(
"[%s] : ",dsi.
GetName()) <<
"Number of events in input trees" <<
Endl;
1002 Log() << kDEBUG <<
"(after possible flattening of arrays):" <<
Endl;
1009 <<
" -- number of events : "
1010 << std::setw(5) << eventCounts[cl].nEvBeforeCut
1011 <<
" / sum of weights: " << std::setw(5) << eventCounts[cl].nWeEvBeforeCut <<
Endl;
1017 <<
" tree -- total number of entries: "
1021 if (fScaleWithPreselEff)
1023 <<
"\tPreselection: (will affect number of requested training and testing events)" <<
Endl;
1026 <<
"\tPreselection: (will NOT affect number of requested training and testing events)" <<
Endl;
1032 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
" "
1034 <<
" -- number of events passed: "
1035 << std::setw(5) << eventCounts[cl].nEvAfterCut
1036 <<
" / sum of weights: " << std::setw(5) << eventCounts[cl].nWeEvAfterCut <<
Endl;
1037 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
" "
1039 <<
" -- efficiency : "
1040 << std::setw(6) << eventCounts[cl].nWeEvAfterCut/eventCounts[cl].nWeEvBeforeCut <<
Endl;
1043 else Log() << kDEBUG
1044 <<
" No preselection cuts applied on event classes" <<
Endl;
1067 if (splitMode.
Contains(
"RANDOM" ) ) {
1071 if( ! unspecifiedEvents.empty() ) {
1072 Log() << kDEBUG <<
"randomly shuffling "
1073 << unspecifiedEvents.size()
1074 <<
" events of class " << cls
1075 <<
" which are not yet associated to testing or training" <<
Endl;
1076 std::shuffle(unspecifiedEvents.begin(), unspecifiedEvents.end(), rndm);
1082 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"SPLITTING ========" <<
Endl;
1084 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"---- class " << cls <<
Endl;
1085 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"check number of training/testing events, requested and available number of events and for class " << cls <<
Endl;
1092 Int_t availableTraining = eventVectorTraining.size();
1093 Int_t availableTesting = eventVectorTesting.size();
1094 Int_t availableUndefined = eventVectorUndefined.size();
1097 if (fScaleWithPreselEff) {
1098 presel_scale = eventCounts[cls].cutScaling();
1099 if (presel_scale < 1)
1100 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
" you have opted for scaling the number of requested training/testing events\n to be scaled by the preselection efficiency"<<
Endl;
1103 if (eventCounts[cls].cutScaling() < 1)
1104 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
" you have opted for interpreting the requested number of training/testing events\n to be the number of events AFTER your preselection cuts" <<
Endl;
1111 if(eventCounts[cls].TrainTestSplitRequested < 1.0 && eventCounts[cls].TrainTestSplitRequested > 0.0){
1112 eventCounts[cls].nTrainingEventsRequested =
Int_t(eventCounts[cls].TrainTestSplitRequested*(availableTraining+availableTesting+availableUndefined));
1113 eventCounts[cls].nTestingEventsRequested =
Int_t(0);
1115 else if(eventCounts[cls].TrainTestSplitRequested != 0.0) Log() << kFATAL <<
Form(
"The option TrainTestSplit_<class> has to be in range (0, 1] but is set to %f.",eventCounts[cls].TrainTestSplitRequested) <<
Endl;
1116 Int_t requestedTraining =
Int_t(eventCounts[cls].nTrainingEventsRequested * presel_scale);
1117 Int_t requestedTesting =
Int_t(eventCounts[cls].nTestingEventsRequested * presel_scale);
1119 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"events in training trees : " << availableTraining <<
Endl;
1120 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"events in testing trees : " << availableTesting <<
Endl;
1121 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"events in unspecified trees : " << availableUndefined <<
Endl;
1122 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"requested for training : " << requestedTraining <<
Endl;
1125 Log() <<
" ( " << eventCounts[cls].nTrainingEventsRequested
1126 <<
" * " << presel_scale <<
" preselection efficiency)" <<
Endl;
1129 Log() << kDEBUG <<
"requested for testing : " << requestedTesting;
1131 Log() <<
" ( " << eventCounts[cls].nTestingEventsRequested
1132 <<
" * " << presel_scale <<
" preselection efficiency)" <<
Endl;
1183 Int_t useForTesting(0),useForTraining(0);
1184 Int_t allAvailable(availableUndefined + availableTraining + availableTesting);
1186 if( (requestedTraining == 0) && (requestedTesting == 0)){
1190 if ( availableUndefined >=
TMath::Abs(availableTraining - availableTesting) ) {
1192 useForTraining = useForTesting = allAvailable/2;
1195 useForTraining = availableTraining;
1196 useForTesting = availableTesting;
1197 if (availableTraining < availableTesting)
1198 useForTraining += availableUndefined;
1200 useForTesting += availableUndefined;
1202 requestedTraining = useForTraining;
1203 requestedTesting = useForTesting;
1206 else if (requestedTesting == 0){
1208 useForTraining =
TMath::Max(requestedTraining,availableTraining);
1209 if (allAvailable < useForTraining) {
1210 Log() << kFATAL <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"More events requested for training ("
1211 << requestedTraining <<
") than available ("
1212 << allAvailable <<
")!" <<
Endl;
1214 useForTesting = allAvailable - useForTraining;
1215 requestedTesting = useForTesting;
1218 else if (requestedTraining == 0){
1219 useForTesting =
TMath::Max(requestedTesting,availableTesting);
1220 if (allAvailable < useForTesting) {
1221 Log() << kFATAL <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"More events requested for testing ("
1222 << requestedTesting <<
") than available ("
1223 << allAvailable <<
")!" <<
Endl;
1225 useForTraining= allAvailable - useForTesting;
1226 requestedTraining = useForTraining;
1235 Int_t stillNeedForTraining =
TMath::Max(requestedTraining-availableTraining,0);
1236 Int_t stillNeedForTesting =
TMath::Max(requestedTesting-availableTesting,0);
1238 int NFree = availableUndefined - stillNeedForTraining - stillNeedForTesting;
1239 if (NFree <0) NFree = 0;
1240 useForTraining =
TMath::Max(requestedTraining,availableTraining) + NFree/2;
1241 useForTesting= allAvailable - useForTraining;
1244 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"determined event sample size to select training sample from="<<useForTraining<<
Endl;
1245 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"determined event sample size to select test sample from="<<useForTesting<<
Endl;
1250 if( splitMode ==
"ALTERNATE" ){
1251 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"split 'ALTERNATE'" <<
Endl;
1252 Int_t nTraining = availableTraining;
1253 for( EventVector::iterator it = eventVectorUndefined.begin(), itEnd = eventVectorUndefined.end(); it != itEnd; ){
1255 if( nTraining <= requestedTraining ){
1256 eventVectorTraining.insert( eventVectorTraining.end(), (*it) );
1260 eventVectorTesting.insert( eventVectorTesting.end(), (*it) );
1265 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"split '" << splitMode <<
"'" <<
Endl;
1268 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"availableundefined : " << availableUndefined <<
Endl;
1269 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"useForTraining : " << useForTraining <<
Endl;
1270 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"useForTesting : " << useForTesting <<
Endl;
1271 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"availableTraining : " << availableTraining <<
Endl;
1272 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"availableTesting : " << availableTesting <<
Endl;
1274 if( availableUndefined<(useForTraining-availableTraining) ||
1275 availableUndefined<(useForTesting -availableTesting ) ||
1276 availableUndefined<(useForTraining+useForTesting-availableTraining-availableTesting ) ){
1277 Log() << kFATAL <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"More events requested than available!" <<
Endl;
1281 if (useForTraining>availableTraining){
1282 eventVectorTraining.insert( eventVectorTraining.end() , eventVectorUndefined.begin(), eventVectorUndefined.begin()+ useForTraining- availableTraining );
1283 eventVectorUndefined.erase( eventVectorUndefined.begin(), eventVectorUndefined.begin() + useForTraining- availableTraining);
1285 if (useForTesting>availableTesting){
1286 eventVectorTesting.insert( eventVectorTesting.end() , eventVectorUndefined.begin(), eventVectorUndefined.begin()+ useForTesting- availableTesting );
1289 eventVectorUndefined.clear();
1292 if (splitMode.
Contains(
"RANDOM" )){
1293 UInt_t sizeTraining = eventVectorTraining.size();
1294 if( sizeTraining >
UInt_t(requestedTraining) ){
1295 std::vector<UInt_t> indicesTraining( sizeTraining );
1299 std::shuffle(indicesTraining.begin(), indicesTraining.end(), rndm);
1301 indicesTraining.erase( indicesTraining.begin()+sizeTraining-
UInt_t(requestedTraining), indicesTraining.end() );
1303 for( std::vector<UInt_t>::iterator it = indicesTraining.begin(), itEnd = indicesTraining.end(); it != itEnd; ++it ){
1304 delete eventVectorTraining.at( (*it) );
1305 eventVectorTraining.at( (*it) ) = NULL;
1308 eventVectorTraining.erase( std::remove( eventVectorTraining.begin(), eventVectorTraining.end(), (
void*)NULL ), eventVectorTraining.end() );
1311 UInt_t sizeTesting = eventVectorTesting.size();
1312 if( sizeTesting >
UInt_t(requestedTesting) ){
1313 std::vector<UInt_t> indicesTesting( sizeTesting );
1317 std::shuffle(indicesTesting.begin(), indicesTesting.end(), rndm);
1319 indicesTesting.erase( indicesTesting.begin()+sizeTesting-
UInt_t(requestedTesting), indicesTesting.end() );
1321 for( std::vector<UInt_t>::iterator it = indicesTesting.begin(), itEnd = indicesTesting.end(); it != itEnd; ++it ){
1322 delete eventVectorTesting.at( (*it) );
1323 eventVectorTesting.at( (*it) ) = NULL;
1326 eventVectorTesting.erase( std::remove( eventVectorTesting.begin(), eventVectorTesting.end(), (
void*)NULL ), eventVectorTesting.end() );
1330 if( eventVectorTraining.size() <
UInt_t(requestedTraining) )
1331 Log() << kWARNING <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"DataSetFactory/requested number of training samples larger than size of eventVectorTraining.\n"
1332 <<
"There is probably an issue. Please contact the TMVA developers." <<
Endl;
1333 else if (eventVectorTraining.size() >
UInt_t(requestedTraining)) {
1334 std::for_each( eventVectorTraining.begin()+requestedTraining, eventVectorTraining.end(), DeleteFunctor<Event>() );
1335 eventVectorTraining.erase(eventVectorTraining.begin()+requestedTraining,eventVectorTraining.end());
1337 if( eventVectorTesting.size() <
UInt_t(requestedTesting) )
1338 Log() << kWARNING <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"DataSetFactory/requested number of testing samples larger than size of eventVectorTesting.\n"
1339 <<
"There is probably an issue. Please contact the TMVA developers." <<
Endl;
1340 else if ( eventVectorTesting.size() >
UInt_t(requestedTesting) ) {
1341 std::for_each( eventVectorTesting.begin()+requestedTesting, eventVectorTesting.end(), DeleteFunctor<Event>() );
1342 eventVectorTesting.erase(eventVectorTesting.begin()+requestedTesting,eventVectorTesting.end());
1349 Int_t trainingSize = 0;
1350 Int_t testingSize = 0;
1364 trainingEventVector->reserve( trainingSize );
1365 testingEventVector->reserve( testingSize );
1371 Log() << kDEBUG <<
" MIXING ============= " <<
Endl;
1373 if( mixMode ==
"ALTERNATE" ){
1378 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"Training sample: You are trying to mix events in alternate mode although the classes have different event numbers. This works but the alternation stops at the last event of the smaller class."<<
Endl;
1381 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"Testing sample: You are trying to mix events in alternate mode although the classes have different event numbers. This works but the alternation stops at the last event of the smaller class."<<
Endl;
1384 typedef EventVector::iterator EvtVecIt;
1385 EvtVecIt itEvent, itEventEnd;
1388 Log() << kDEBUG <<
"insert class 0 into training and test vector" <<
Endl;
1390 testingEventVector->insert( testingEventVector->end(), tmpEventVector[
Types::kTesting].at(0).begin(), tmpEventVector[
Types::kTesting].at(0).end() );
1395 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"insert class " << cls <<
Endl;
1397 itTarget = trainingEventVector->begin() - 1;
1399 for( itEvent = tmpEventVector[
Types::kTraining].at(cls).begin(), itEventEnd = tmpEventVector[
Types::kTraining].at(cls).end(); itEvent != itEventEnd; ++itEvent ){
1401 if( (trainingEventVector->end() - itTarget) <
Int_t(cls+1) ) {
1402 itTarget = trainingEventVector->end();
1403 trainingEventVector->insert( itTarget, itEvent, itEventEnd );
1407 trainingEventVector->insert( itTarget, (*itEvent) );
1411 itTarget = testingEventVector->begin() - 1;
1413 for( itEvent = tmpEventVector[
Types::kTesting].at(cls).begin(), itEventEnd = tmpEventVector[
Types::kTesting].at(cls).end(); itEvent != itEventEnd; ++itEvent ){
1415 if( ( testingEventVector->end() - itTarget ) <
Int_t(cls+1) ) {
1416 itTarget = testingEventVector->end();
1417 testingEventVector->insert( itTarget, itEvent, itEventEnd );
1421 testingEventVector->insert( itTarget, (*itEvent) );
1427 trainingEventVector->insert( trainingEventVector->end(), tmpEventVector[
Types::kTraining].at(cls).begin(), tmpEventVector[
Types::kTraining].at(cls).end() );
1428 testingEventVector->insert ( testingEventVector->end(), tmpEventVector[
Types::kTesting].at(cls).begin(), tmpEventVector[
Types::kTesting].at(cls).end() );
1437 if (mixMode ==
"RANDOM") {
1438 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"shuffling events"<<
Endl;
1440 std::shuffle(trainingEventVector->begin(), trainingEventVector->end(), rndm);
1441 std::shuffle(testingEventVector->begin(), testingEventVector->end(), rndm);
1444 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"trainingEventVector " << trainingEventVector->size() <<
Endl;
1445 Log() << kDEBUG <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"testingEventVector " << testingEventVector->size() <<
Endl;
1457 Log() << kFATAL <<
"Dataset " << std::string(dsi.
GetName()) <<
" does not have any training events, I better stop here and let you fix that one first " <<
Endl;
1461 Log() << kERROR <<
"Dataset " << std::string(dsi.
GetName()) <<
" does not have any testing events, guess that will cause problems later..but for now, I continue " <<
Endl;
1464 delete trainingEventVector;
1465 delete testingEventVector;
1495 Double_t trainingSumSignalWeights = 0;
1496 Double_t trainingSumBackgrWeights = 0;
1497 Double_t testingSumSignalWeights = 0;
1498 Double_t testingSumBackgrWeights = 0;
1503 trainingSizePerClass.at(cls) = tmpEventVector[
Types::kTraining].at(cls).size();
1504 testingSizePerClass.at(cls) = tmpEventVector[
Types::kTesting].at(cls).size();
1517 trainingSumWeightsPerClass.at(cls) =
1522 testingSumWeightsPerClass.at(cls) =
1528 trainingSumSignalWeights += trainingSumWeightsPerClass.at(cls);
1529 testingSumSignalWeights += testingSumWeightsPerClass.at(cls);
1531 trainingSumBackgrWeights += trainingSumWeightsPerClass.at(cls);
1532 testingSumBackgrWeights += testingSumWeightsPerClass.at(cls);
1552 if (normMode ==
"NONE") {
1553 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"No weight renormalisation applied: use original global and event weights" <<
Endl;
1559 else if (normMode ==
"NUMEVENTS") {
1561 <<
"\tWeight renormalisation mode: \"NumEvents\": renormalises all event classes " <<
Endl;
1563 <<
" such that the effective (weighted) number of events in each class equals the respective " <<
Endl;
1565 <<
" number of events (entries) that you demanded in PrepareTrainingAndTestTree(\"\",\"nTrain_Signal=.. )" <<
Endl;
1567 <<
" ... i.e. such that Sum[i=1..N_j]{w_i} = N_j, j=0,1,2..." <<
Endl;
1569 <<
" ... (note that N_j is the sum of TRAINING events (nTrain_j...with j=Signal,Background.." <<
Endl;
1571 <<
" ..... Testing events are not renormalised nor included in the renormalisation factor! )"<<
Endl;
1577 renormFactor.at(cls) = ((
Float_t)trainingSizePerClass.at(cls) )/
1578 (trainingSumWeightsPerClass.at(cls)) ;
1581 else if (normMode ==
"EQUALNUMEVENTS") {
1587 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"Weight renormalisation mode: \"EqualNumEvents\": renormalises all event classes ..." <<
Endl;
1588 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
" such that the effective (weighted) number of events in each class is the same " <<
Endl;
1589 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
" (and equals the number of events (entries) given for class=0 )" <<
Endl;
1590 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"... i.e. such that Sum[i=1..N_j]{w_i} = N_classA, j=classA, classB, ..." <<
Endl;
1591 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
"... (note that N_j is the sum of TRAINING events" <<
Endl;
1592 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) <<
" ..... Testing events are not renormalised nor included in the renormalisation factor!)" <<
Endl;
1595 UInt_t referenceClass = 0;
1597 renormFactor.at(cls) =
Float_t(trainingSizePerClass.at(referenceClass))/
1598 (trainingSumWeightsPerClass.at(cls));
1602 Log() << kFATAL <<
Form(
"Dataset[%s] : ",dsi.
GetName())<<
"<PrepareForTrainingAndTesting> Unknown NormMode: " << normMode <<
Endl;
1610 <<
"--> Rescale " << setiosflags(ios::left) << std::setw(maxL)
1612 for (EventVector::iterator it = tmpEventVector[
Types::kTraining].at(cls).begin(),
1613 itEnd = tmpEventVector[
Types::kTraining].at(cls).end(); it != itEnd; ++it){
1614 (*it)->SetWeight ((*it)->GetWeight() * renormFactor.at(cls));
1625 <<
"Number of training and testing events" <<
Endl;
1626 Log() << kDEBUG <<
"\tafter rescaling:" <<
Endl;
1628 <<
"---------------------------------------------------------------------------" <<
Endl;
1630 trainingSumSignalWeights = 0;
1631 trainingSumBackgrWeights = 0;
1632 testingSumSignalWeights = 0;
1633 testingSumBackgrWeights = 0;
1636 trainingSumWeightsPerClass.at(cls) =
1641 testingSumWeightsPerClass.at(cls) =
1647 trainingSumSignalWeights += trainingSumWeightsPerClass.at(cls);
1648 testingSumSignalWeights += testingSumWeightsPerClass.at(cls);
1650 trainingSumBackgrWeights += trainingSumWeightsPerClass.at(cls);
1651 testingSumBackgrWeights += testingSumWeightsPerClass.at(cls);
1657 << setiosflags(ios::left) << std::setw(maxL)
1659 <<
"training events : " << trainingSizePerClass.at(cls) <<
Endl;
1660 Log() << kDEBUG <<
"\t(sum of weights: " << trainingSumWeightsPerClass.at(cls) <<
")"
1661 <<
" - requested were " << eventCounts[cls].nTrainingEventsRequested <<
" events" <<
Endl;
1663 << setiosflags(ios::left) << std::setw(maxL)
1665 <<
"testing events : " << testingSizePerClass.at(cls) <<
Endl;
1666 Log() << kDEBUG <<
"\t(sum of weights: " << testingSumWeightsPerClass.at(cls) <<
")"
1667 <<
" - requested were " << eventCounts[cls].nTestingEventsRequested <<
" events" <<
Endl;
1669 << setiosflags(ios::left) << std::setw(maxL)
1671 <<
"training and testing events: "
1672 << (trainingSizePerClass.at(cls)+testingSizePerClass.at(cls)) <<
Endl;
1673 Log() << kDEBUG <<
"\t(sum of weights: "
1674 << (trainingSumWeightsPerClass.at(cls)+testingSumWeightsPerClass.at(cls)) <<
")" <<
Endl;
1675 if(eventCounts[cls].nEvAfterCut<eventCounts[cls].nEvBeforeCut) {
1676 Log() << kINFO <<
Form(
"Dataset[%s] : ",dsi.
GetName()) << setiosflags(ios::left) << std::setw(maxL)
1678 <<
"due to the preselection a scaling factor has been applied to the numbers of requested events: "
1679 << eventCounts[cls].cutScaling() <<
Endl;
1682 Log() << kINFO <<
Endl;