7 #include "TTreeFormula.h" 14 #include "TMVA/Factory.h" 15 #include "TMVA/Reader.h" 22 fJobName(
"TmvaClassifier"),
26 fOutputName(
"TMVA.root"),
29 fApplicationDirectory(
""),
30 fApplicationTree(
"Events"),
31 fApplicationOutput(
"WithBDT"),
57 std::ifstream configFile;
61 std::vector<TString> Strings;
65 while(!configFile.eof()){
66 configFile >> tempFormula;
67 if(tempFormula !=
""){
78 TFile *TMVAOutput =
new TFile(
fOutputName,
"RECREATE");
79 TMVA::Factory *factory =
new TMVA::Factory(
fJobName, TMVAOutput,
80 "V:!Silent:Color:DrawProgressBar:Transformations=I;N");
82 for (UInt_t iVar = 0; iVar !=
fVariables.size(); ++iVar)
91 std::vector<TreeContainer*> SignalTrees;
99 SignalTrees.push_back(tempTree);
102 std::vector<TreeContainer*> BackgroundTrees;
109 BackgroundTrees.push_back(tempTree);
112 factory->SetWeightExpression(
fWeight.GetTitle());
113 factory->PrepareTrainingAndTestTree(
"1",
"SplitMode=Alternate:NormMode=NumEvents:V");
116 factory->TrainAllMethods();
117 factory->TestAllMethods();
118 factory->EvaluateAllMethods();
123 for (UInt_t iTree = 0; iTree != SignalTrees.size(); ++iTree)
124 delete SignalTrees[iTree];
126 for (UInt_t iTree = 0; iTree != BackgroundTrees.size(); ++iTree)
127 delete BackgroundTrees[iTree];
129 SignalTrees.resize(0);
130 BackgroundTrees.resize(0);
144 Double_t binWidth = (VarMax - VarMin)/NumBins;
145 Double_t VarVals[NumBins+1];
146 for (Int_t i0 = 0; i0 != NumBins + 1; ++i0)
147 VarVals[i0] = VarMin + i0 * binWidth;
149 Apply(NumBins, VarVals, NumMapPoints);
158 std::vector<TGraph*> transformGraphs;
168 TTree *BackgroundTree = TrainingTreeContainer->
ReturnTree(
"TrainTree");
174 Double_t binWidth = 2.0/(NumMapPoints - 1);
175 Double_t BDTBins[NumMapPoints];
176 for (Int_t i0 = 0; i0 != NumMapPoints; ++i0)
177 BDTBins[i0] = i0 * binWidth - 1;
179 for (Int_t iVarBin = 0; iVarBin != NumBins; ++iVarBin) {
181 sprintf(buffer,
"(%s>=%f&&%s<%f)",
184 TCut BinCut = TCut(buffer);
188 std::cout <<
"Making hists." << std::endl;
190 std::vector<TH1D*> BDTHists = HistPlotter->
MakeHists(NumMapPoints,-1,1);
192 std::cout <<
"Finished hists." << std::endl;
195 delete TrainingTreeContainer;
197 std::cout <<
"Deleted containers." << std::endl;
199 for (Int_t iVarBin = 0; iVarBin != NumBins; ++iVarBin) {
200 tempGraph =
new TGraph(NumMapPoints);
201 transformGraphs.push_back(tempGraph);
202 Double_t FullIntegral = BDTHists[iVarBin]->Integral();
203 for (Int_t iMapPoint = 0; iMapPoint != NumMapPoints; ++iMapPoint) {
204 transformGraphs[iVarBin]->SetPoint(iMapPoint, BDTBins[iMapPoint],
205 BDTHists[iVarBin]->Integral(0,iMapPoint)/FullIntegral);
209 std::cout <<
"Got map points." << std::endl;
211 for (UInt_t iHist = 0; iHist != BDTHists.size(); ++iHist)
212 delete BDTHists[iHist];
215 std::cout <<
"About to apply." << std::endl;
218 TMVA::Reader* reader =
new TMVA::Reader(
"Color:!Silent");
220 std::vector<Int_t> discreteVars;
221 std::vector<Float_t> continuousVars;
222 std::vector<TTreeFormula*> discreteFormulae;
223 std::vector<TTreeFormula*> continuousFormulae;
225 Int_t numDiscrete = 0;
226 Int_t numContinuous = 0;
228 TTreeFormula* tempFormula;
233 std::vector<TTree*> CopiedTrees;
234 std::vector<TString> FileList = ApplicationTreesContainer->
ReturnFileNames();
236 Float_t UniformVar = 0.;
242 for (UInt_t iVar = 0; iVar !=
fVariables.size(); ++iVar) {
244 discreteVars.push_back(0);
246 discreteFormulae.push_back(tempFormula);
247 reader->AddVariable(
fVariables[iVar], &discreteVars[numDiscrete]);
251 continuousVars.push_back(0);
253 continuousFormulae.push_back(tempFormula);
254 reader->AddVariable(
fVariables[iVar], &continuousVars[numContinuous]);
260 continuousVars.push_back(0);
262 continuousFormulae.push_back(tempFormula);
269 for (UInt_t iTree = 0; iTree != ApplicationTrees.size(); ++iTree) {
271 TTree *tempTree = ApplicationTrees[iTree]->CloneTree();
273 Float_t BDTOutput = 0.;
276 for (UInt_t iForm = 0; iForm != discreteFormulae.size(); ++iForm)
277 discreteFormulae[iForm]->SetTree(ApplicationTrees[iTree]);
279 Int_t NEntries = ApplicationTrees[iTree]->GetEntriesFast();
280 for (Int_t iEntry = 0; iEntry != NEntries; ++iEntry) {
282 std::cout <<
"Processing event... " << iEntry <<
": " << float(iEntry)/NEntries * 100 <<
"%" << std::endl;
284 ApplicationTrees[iTree]->GetEntry(iEntry);
286 for (UInt_t iForm = 0; iForm != discreteFormulae.size(); ++iForm)
287 discreteVars[iForm] = discreteFormulae[iForm]->EvalInstance();
289 for (UInt_t iForm = 0; iForm != continuousFormulae.size(); ++iForm)
290 continuousVars[iForm] = continuousFormulae[iForm]->EvalInstance();
295 UniformVar = UniformFormula->EvalInstance();
297 if (UniformVar >= VarVals[0] && UniformVar < VarVals[NumBins]) {
298 for (Int_t iBin = 0; iBin != NumBins; ++iBin) {
299 if (UniformVar < VarVals[iBin + 1]) {
300 BDTOutput = transformGraphs[iBin]->Eval(BDTOutput);
308 tempTree->Write(0, TObject::kOverwrite);
313 delete UniformFormula;
315 for (UInt_t iForm = 0; iForm != discreteFormulae.size(); ++iForm)
316 delete discreteFormulae[iForm];
318 for (UInt_t iForm = 0; iForm != continuousFormulae.size(); ++iForm)
319 delete continuousFormulae[iForm];
321 delete ApplicationTreesContainer;
325 for (Int_t iGraph = 0; iGraph != NumBins; ++iGraph)
326 delete transformGraphs[iGraph];