void ZJetsToLL_App_bflavor( TString myMethodList = "" ) { #ifdef __CINT__ gROOT->ProcessLine( ".O0" ); // turn off optimization in CINT #endif //--------------------------------------------------------------- // This loads the library TMVA::Tools::Instance(); // Default MVA methods to be trained + tested std::map<std::string,int> Use; // --- Cut optimisation Use["Cuts"] = 0; Use["CutsD"] = 0; Use["CutsPCA"] = 0; Use["CutsGA"] = 0; Use["CutsSA"] = 0; // // --- 1-dimensional likelihood ("naive Bayes estimator") Use["Likelihood"] = 0; Use["LikelihoodD"] = 0; // the "D" extension indicates decorrelated input variables (see option strings) Use["LikelihoodPCA"] = 0; // the "PCA" extension indicates PCA-transformed input variables (see option strings) Use["LikelihoodKDE"] = 0; Use["LikelihoodMIX"] = 0; // // --- Mutidimensional likelihood and Nearest-Neighbour methods Use["PDERS"] = 0; Use["PDERSD"] = 0; Use["PDERSPCA"] = 0; Use["PDEFoam"] = 0; Use["PDEFoamBoost"] = 0; // uses generalised MVA method boosting Use["KNN"] = 0; // k-nearest neighbour method // // --- Linear Discriminant Analysis Use["LD"] = 0; // Linear Discriminant identical to Fisher Use["Fisher"] = 0; Use["FisherG"] = 0; Use["BoostedFisher"] = 0; // uses generalised MVA method boosting Use["HMatrix"] = 0; // // --- Function Discriminant analysis Use["FDA_GA"] = 0; // minimisation of user-defined function using Genetics Algorithm Use["FDA_SA"] = 0; Use["FDA_MC"] = 0; Use["FDA_MT"] = 0; Use["FDA_GAMT"] = 0; Use["FDA_MCMT"] = 0; // // --- Neural Networks (all are feed-forward Multilayer Perceptrons) Use["MLP"] = 0; // Recommended ANN Use["MLPBFGS"] = 0; // Recommended ANN with optional training method Use["MLPBNN"] = 0; // Recommended ANN with BFGS training method and bayesian regulator Use["CFMlpANN"] = 0; // Depreciated ANN from ALEPH Use["TMlpANN"] = 0; // ROOT's own ANN // // --- Support Vector Machine Use["SVM"] = 0; // // --- Boosted Decision Trees using this Use["BDT"] = 1; // uses Adaptive Boost Use["BDTG"] = 0; // uses Gradient Boost Use["BDTB"] = 0; // uses Bagging Use["BDTD"] = 0; // decorrelation + Adaptive Boost // // --- Friedman's RuleFit method, ie, an optimised series of cuts ("rules") Use["RuleFit"] = 0; // --------------------------------------------------------------- Use["Plugin"] = 0; Use["Category"] = 0; Use["SVM_Gauss"] = 0; Use["SVM_Poly"] = 0; Use["SVM_Lin"] = 0; std::cout << std::endl; std::cout << "==> Start ZJetsToLL_App_bflavor" << std::endl; // Select methods (don't look at this code - not of interest) if (myMethodList != "") { for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) it->second = 0; std::vector<TString> mlist = gTools().SplitString( myMethodList, ',' ); for (UInt_t i=0; i<mlist.size(); i++) { std::string regMethod(mlist[i]); if (Use.find(regMethod) == Use.end()) { std::cout << "Method \"" << regMethod << "\" not known in TMVA under this name. Choose among the following:" << std::endl; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { std::cout << it->first << " "; } std::cout << std::endl; return; } Use[regMethod] = 1; } } // -------------------------------------------------------------------------------------------------- // --- Create the Reader object TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); // Create a set of variables and declare them to the reader // - the variable names MUST corresponds in name and type to those given in the weight file(s) used Float_t Hmass, Zmass; Float_t Hpt, Zpt; Float_t CSV0, CSV1; Float_t DeltaPhiHV, DetaJJ; Int_t nJets, eventFlavor; Float_t Naj, nSV; Float_t BDTvalue, Trigweight, B2011PUweight, btag2CSF, MET; Float_t alpha_j, qtb1, jetPhi0, jetPhi1, jetEta0, jetEta1, Zphi, Hphi; Float_t Ht, EvntShpCircularity, jetCHF0, jetCHF1; Float_t EtaStandDev, muonPFiso0, muonPFiso1, EvntShpIsotropy; Float_t mu0pt, mu1pt, UnweightedEta, DphiJJ, RMS_eta, EvntShpSphericity; Float_t PtbalZH, EventPt, Angle, Centrality, EvntShpAplanarity; reader->AddVariable( "Hmass", &Hmass ); // reader->AddVariable( "Zmass", &Zmass ); reader->AddVariable( "Hpt", &Hpt ); reader->AddVariable( "CSV0", &CSV0 ); reader->AddVariable( "CSV1", &CSV1 ); reader->AddVariable( "Zpt", &Zpt ); reader->AddVariable( "DeltaPhiHV:= abs(deltaPhi(Hphi,Zphi))", &DeltaPhiHV ); reader->AddVariable( "DetaJJ:= abs(jetEta1-jetEta0)", &DetaJJ ); reader->AddVariable( "Naj", &Naj); reader->AddVariable( "UnweightedEta", &UnweightedEta ); reader->AddVariable( "EvntShpCircularity", &EvntShpCircularity ); reader->AddVariable( "alpha_j", &alpha_j ); reader->AddVariable( "qtb1", &qtb1 ); reader->AddVariable( "nSV", &nSV ); reader->AddVariable( "mu0pt", &mu0pt ); reader->AddVariable( "mu1pt", &mu1pt ); reader->AddVariable( "PtbalZH", &PtbalZH ); reader->AddVariable( "Angle", &Angle ); reader->AddVariable( "Centrality", &Centrality ); reader->AddVariable( "MET", &MET ); reader->AddVariable( "EvntShpAplanarity", &EvntShpAplanarity ); // Spectator variables declared in the training have to be added to the reader, too Float_t UnweightedEta, mu0pt; // reader->AddSpectator( "UnweightedEta", &UnweightedEta ); // reader->AddSpectator( "mu0pt", &mu0pt ); /* Float_t Category_cat1, Category_cat2, Category_cat3; if (Use["Category"]){ // Add artificial spectators for distinguishing categories reader->AddSpectator( "Category_cat1 := var3<=0", &Category_cat1 ); reader->AddSpectator( "Category_cat2 := (var3>0)&&(var4<0)", &Category_cat2 ); reader->AddSpectator( "Category_cat3 := (var3>0)&&(var4>=0)", &Category_cat3 ); } */ // --- Book the MVA methods TString dir = "weights/"; TString prefix = "TMVAClassification"; // Book method(s) for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { if (it->second) { TString methodName = TString(it->first) + TString(" method"); TString weightfile = dir + prefix + TString("_") + TString(it->first) + TString(".weights.xml"); reader->BookMVA( methodName, weightfile ); } } // Book output histograms TH1F* hCHFb0_OpenSelection= new TH1F ("hCHFb0_OpenSelection", "charged Hadron Energy Fraction b1", 40, 0.0, 1.2); TH1F* hCHFb1_OpenSelection= new TH1F ("hCHFb1_OpenSelection", "charged Hadron Energy Fraction b2", 40, 0.0, 1.2); TH1F* hPtjj_OpenSelection= new TH1F ("hPtjj_OpenSelection","Pt of two b jets with highest CSV ", 50, 0.0, 400); TH1F* hPtmumu_OpenSelection= new TH1F ("hPtmumu_OpenSelection","Pt of two muons with highest pt ", 50, 0.0, 400); TH1F* hPtbalZH_OpenSelection= new TH1F ("hPtbalZH_OpenSelection", "Pt balance of Z and H", 40, -80, 80); TH1F* hPtmu0_OpenSelection= new TH1F ("hPtmu0_OpenSelection","Pt of muon with highest pt ", 30, 0.0, 300); TH1F* hPtmu1_OpenSelection= new TH1F ("hPtmu1_OpenSelection","Pt of muon with second highest pt ", 30, 0.0, 300); TH1F* hPFRelIsomu0_OpenSelection= new TH1F ("hPFRelIsomu0_OpenSelection", "PF Rel Iso of muon with highest Pt", 40, 0., 0.2); TH1F* hPFRelIsomu1_OpenSelection= new TH1F ("hPFRelIsomu1_OpenSelection", "PF Rel Iso of muon with second highest Pt", 40, 0., 0.2); TH1F* hCSV0_OpenSelection= new TH1F ("hCSV0_OpenSelection","Jet with highest CSV ", 40, 0, 1.5); TH1F* hCSV1_OpenSelection= new TH1F ("hCSV1_OpenSelection","Jet with second highest CSV ", 40, 0, 1.5); TH1F* hdphiVH_OpenSelection= new TH1F ("hdphiVH_OpenSelection","Delta phi between Z and Higgs ", 50, -0.1, 4.5); TH1F* hdetaJJ_OpenSelection= new TH1F ("hdetaJJ_OpenSelection","Delta eta between two jets ", 60, -4, 4); TH1F* hNjets_OpenSelection= new TH1F ("hNjets_OpenSelection", "Number of Jets", 13, -2.5, 10.5); TH1F* hMjj_OpenSelection = new TH1F ("hMjj_OpenSelection", "Invariant Mass of two Jets ", 50, 0, 300); TH1F* hMmumu_OpenSelection = new TH1F ("hMmumu_OpenSelection", "Invariant Mass of two muons ", 75, 0, 200); TH1F* hRMSeta_OpenSelection= new TH1F ("hRMSeta_OpenSelection", "RMS Eta", 30, 0, 3); TH1F* hStaDeveta_OpenSelection= new TH1F ("hStaDeveta_OpenSelection", "Standard Deviation Eta", 30, 0, 3); TH1F* hUnweightedEta_OpenSelection= new TH1F ("hUnweightedEta_OpenSelection", "Unweighted Eta ", 50, 0, 15); TH1F* hdphiJJ_vect_OpenSelection= new TH1F ("hdphiJJ_vect_OpenSelection", "Delta phi between two jets", 30, -3.5, 4); TH1F* hCircularity_OpenSelection= new TH1F("hCircularity_OpenSelection","EventShapeVariables circularity", 30, 0.0, 1.2); TH1F* hHt_OpenSelection= new TH1F("hHt_OpenSelection","scalar sum of pt of four particles", 50, 0.0, 500); TH1F* hCentrality_OpenSelection= new TH1F ("hCentrality_OpenSelection", "Centrality", 40, 0.0, 0.8); TH1F* hEventPt_OpenSelection= new TH1F ("hEventPt_OpenSelection", "Pt of HV system", 50, 0.0, 100); TH1F* hAngle_OpenSelection= new TH1F ("hAngle_OpenSelection", "Angle between H and Z", 45, 0, 4.5); TH1F* hSphericity_OpenSelection= new TH1F ("hSphericity_OpenSelection", "EventShapeVariables sphericity", 50, 0.0, 1); TH1F* hAplanarity_OpenSelection= new TH1F ("hAplanarity_OpenSelection", "EventShapeVariables Aplanarity", 50, -0.1, .4); TH1F* hIsotropy_OpenSelection= new TH1F ("hIsotropy_OpenSelection", "EventShapeVariables isotropy", 30, 0.0, 1.3); TH2F* hDphiDetajj_OpenSelection= new TH2F ("hDphiDetajj_OpenSelection", "#Delta#phi vs #Delta#eta JJ", 25, -5, 5, 25, -5, 5); TTree *treeWithBDT = new TTree("treeWithBDT","Tree wiht BDT output"); treeWithBDT->SetDirectory(0); treeWithBDT->Branch("nJets",&nJets, "nJets/I"); treeWithBDT->Branch("Naj",&Naj, "Naj/F"); treeWithBDT->Branch("eventFlavor",&eventFlavor, "eventFlavor/I"); treeWithBDT->Branch("CSV0",&CSV0, "CSV0/F"); treeWithBDT->Branch("CSV1",&CSV1, "CSV1/F"); treeWithBDT->Branch("Zmass",&Zmass, "Zmass/F"); treeWithBDT->Branch("Hmass",&Hmass, "Hmass/F"); treeWithBDT->Branch("DeltaPhiHV",&DeltaPhiHV, "DeltaPhiHV/F"); treeWithBDT->Branch("Hpt",&Hpt, "Hpt/F"); treeWithBDT->Branch("Zpt",&Zpt, "Zpt/F"); treeWithBDT->Branch("mu0pt",&mu0pt, "mu0pt/F"); treeWithBDT->Branch("Ht",&Ht, "Ht/F"); treeWithBDT->Branch("EtaStandDev",&EtaStandDev, "EtaStandDev/F"); treeWithBDT->Branch("UnweightedEta",&UnweightedEta, "UnweightedEta/F"); treeWithBDT->Branch("EvntShpCircularity",&EvntShpCircularity, "EvntShpCircularity/F"); treeWithBDT->Branch("alpha_j",&alpha_j, "alpha_j/F"); treeWithBDT->Branch("qtb1",&qtb1, "qtb1/F"); treeWithBDT->Branch("nSV",&nSV, "nSV/F"); treeWithBDT->Branch("Trigweight",&Trigweight, "Trigweight/F"); treeWithBDT->Branch("B2011PUweight",&B2011PUweight, "B2011PUweight/F"); treeWithBDT->Branch("btag2CSF",&btag2CSF, "btag2CSF/F"); treeWithBDT->Branch("DetaJJ",&DetaJJ, "DetaJJ/F"); treeWithBDT->Branch("jetCHF0",&jetCHF0, "jetCHF0/F"); treeWithBDT->Branch("jetCHF1",&jetCHF1, "jetCHF1/F"); treeWithBDT->Branch("jetPhi0",&jetPhi0, "jetPhi0/F"); treeWithBDT->Branch("jetPhi1",&jetPhi1, "jetPhi1/F"); treeWithBDT->Branch("jetEta0",&jetEta0, "jetEta0/F"); treeWithBDT->Branch("jetEta1",&jetEta1, "jetEta1/F"); treeWithBDT->Branch("mu1pt",&mu1pt, "mu1pt/F"); treeWithBDT->Branch("muonPFiso0",&muonPFiso0, "muonPFiso0/F"); treeWithBDT->Branch("muonPFiso1",&muonPFiso1, "muonPFiso1/F"); treeWithBDT->Branch("DphiJJ",&DphiJJ, "DphiJJ/F"); treeWithBDT->Branch("RMS_eta",&RMS_eta, "RMS_eta/F"); treeWithBDT->Branch("PtbalZH",&PtbalZH, "PtbalZH/F"); treeWithBDT->Branch("EventPt",&EventPt, "EventPt/F"); treeWithBDT->Branch("Angle",&Angle, "Angle/F"); treeWithBDT->Branch("Centrality",&Centrality, "Centrality/F"); treeWithBDT->Branch("MET",&MET, "MET/F"); treeWithBDT->Branch("EvntShpAplanarity",&EvntShpAplanarity, "EvntShpAplanarity/F"); treeWithBDT->Branch("EvntShpSphericity",&EvntShpSphericity, "EvntShpSphericity/F"); treeWithBDT->Branch("EvntShpIsotropy",&EvntShpIsotropy, "EvntShpIsotropy/F"); treeWithBDT->Branch("Zphi",&Zphi, "Zphi/F"); treeWithBDT->Branch("Hphi",&Hphi, "Hphi/F"); treeWithBDT->Branch("BDTvalue",&BDTvalue, "BDTvalue/F"); UInt_t nbin = 15; TH1F *histLk(0), *histLkD(0), *histLkPCA(0), *histLkKDE(0), *histLkMIX(0), *histPD(0), *histPDD(0); TH1F *histPDPCA(0), *histPDEFoam(0), *histPDEFoamErr(0), *histPDEFoamSig(0), *histKNN(0), *histHm(0); TH1F *histFi(0), *histFiG(0), *histFiB(0), *histLD(0), *histNn(0),*histNnbfgs(0),*histNnbnn(0); TH1F *histNnC(0), *histNnT(0), *histBdt(0), *histBdtG(0), *histBdtD(0), *histRf(0), *histSVMG(0); TH1F *histSVMP(0), *histSVML(0), *histFDAMT(0), *histFDAGA(0), *histCat(0), *histPBdt(0); if (Use["Likelihood"]) histLk = new TH1F( "MVA_Likelihood", "MVA_Likelihood", nbin, -1, 1 ); if (Use["LikelihoodD"]) histLkD = new TH1F( "MVA_LikelihoodD", "MVA_LikelihoodD", nbin, -1, 0.9999 ); if (Use["LikelihoodPCA"]) histLkPCA = new TH1F( "MVA_LikelihoodPCA", "MVA_LikelihoodPCA", nbin, -1, 1 ); if (Use["LikelihoodKDE"]) histLkKDE = new TH1F( "MVA_LikelihoodKDE", "MVA_LikelihoodKDE", nbin, -0.00001, 0.99999 ); if (Use["LikelihoodMIX"]) histLkMIX = new TH1F( "MVA_LikelihoodMIX", "MVA_LikelihoodMIX", nbin, 0, 1 ); if (Use["PDERS"]) histPD = new TH1F( "MVA_PDERS", "MVA_PDERS", nbin, 0, 1 ); if (Use["PDERSD"]) histPDD = new TH1F( "MVA_PDERSD", "MVA_PDERSD", nbin, 0, 1 ); if (Use["PDERSPCA"]) histPDPCA = new TH1F( "MVA_PDERSPCA", "MVA_PDERSPCA", nbin, 0, 1 ); if (Use["KNN"]) histKNN = new TH1F( "MVA_KNN", "MVA_KNN", nbin, 0, 1 ); if (Use["HMatrix"]) histHm = new TH1F( "MVA_HMatrix", "MVA_HMatrix", nbin, -0.95, 1.55 ); if (Use["Fisher"]) histFi = new TH1F( "MVA_Fisher", "MVA_Fisher", nbin, -4, 4 ); if (Use["FisherG"]) histFiG = new TH1F( "MVA_FisherG", "MVA_FisherG", nbin, -1, 1 ); if (Use["BoostedFisher"]) histFiB = new TH1F( "MVA_BoostedFisher", "MVA_BoostedFisher", nbin, -2, 2 ); if (Use["LD"]) histLD = new TH1F( "MVA_LD", "MVA_LD", nbin, -2, 2 ); if (Use["MLP"]) histNn = new TH1F( "MVA_MLP", "MVA_MLP", nbin, -1.25, 1.5 ); if (Use["MLPBFGS"]) histNnbfgs = new TH1F( "MVA_MLPBFGS", "MVA_MLPBFGS", nbin, -1.25, 1.5 ); if (Use["MLPBNN"]) histNnbnn = new TH1F( "MVA_MLPBNN", "MVA_MLPBNN", nbin, -1.25, 1.5 ); if (Use["CFMlpANN"]) histNnC = new TH1F( "MVA_CFMlpANN", "MVA_CFMlpANN", nbin, 0, 1 ); if (Use["TMlpANN"]) histNnT = new TH1F( "MVA_TMlpANN", "MVA_TMlpANN", nbin, -1.3, 1.3 ); if (Use["BDT"]) { histMattBdt = new TH1F( "Matt_BDT", "Matt_BDT", 15, -1.1, 0.35 ); histTMVABdt = new TH1F( "TMVA_BDT", "TMVA_BDT", 88, -1.0, 0.1 ); } if (Use["BDTD"]) histBdtD = new TH1F( "MVA_BDTD", "MVA_BDTD", nbin, -0.8, 0.8 ); if (Use["BDTG"]) histBdtG = new TH1F( "MVA_BDTG", "MVA_BDTG", nbin, -1.0, 1.0 ); if (Use["RuleFit"]) histRf = new TH1F( "MVA_RuleFit", "MVA_RuleFit", nbin, -2.0, 2.0 ); if (Use["SVM_Gauss"]) histSVMG = new TH1F( "MVA_SVM_Gauss", "MVA_SVM_Gauss", nbin, 0.0, 1.0 ); if (Use["SVM_Poly"]) histSVMP = new TH1F( "MVA_SVM_Poly", "MVA_SVM_Poly", nbin, 0.0, 1.0 ); if (Use["SVM_Lin"]) histSVML = new TH1F( "MVA_SVM_Lin", "MVA_SVM_Lin", nbin, 0.0, 1.0 ); if (Use["FDA_MT"]) histFDAMT = new TH1F( "MVA_FDA_MT", "MVA_FDA_MT", nbin, -2.0, 3.0 ); if (Use["FDA_GA"]) histFDAGA = new TH1F( "MVA_FDA_GA", "MVA_FDA_GA", nbin, -2.0, 3.0 ); if (Use["Category"]) histCat = new TH1F( "MVA_Category", "MVA_Category", nbin, -2., 2. ); if (Use["Plugin"]) histPBdt = new TH1F( "MVA_PBDT", "MVA_BDT", nbin, -0.8, 0.8 ); // PDEFoam also returns per-event error, fill in histogram, and also fill significance if (Use["PDEFoam"]) { histPDEFoam = new TH1F( "MVA_PDEFoam", "MVA_PDEFoam", nbin, 0, 1 ); histPDEFoamErr = new TH1F( "MVA_PDEFoamErr", "MVA_PDEFoam error", nbin, 0, 1 ); histPDEFoamSig = new TH1F( "MVA_PDEFoamSig", "MVA_PDEFoam significance", nbin, 0, 10 ); } // Book example histogram for probability (the other methods are done similarly) TH1F *probHistFi(0), *rarityHistFi(0); if (Use["Fisher"]) { probHistFi = new TH1F( "MVA_Fisher_Proba", "MVA_Fisher_Proba", nbin, 0, 1 ); rarityHistFi = new TH1F( "MVA_Fisher_Rarity", "MVA_Fisher_Rarity", nbin, 0, 1 ); } // Prepare input tree (this must be replaced by your data source) // in this example, there is a toy tree with signal and one with background events // we'll later on use only the "signal" events for the test in this example. // TFile *input(0); TString fname = "/home/hep/wilken/Weights/CMSSW_4_2_8_patch3/src/UserCode/wilken/CSVShapeCorr/ZJetsToLL.root"; double lumi = 100.0; Double_t ZJetsToLL_weight = lumi/((2349387.0/80*1000)/2.0); //ZJetsToLL_Pt-100_7TeV-herwigpp //ZJetsToLL_weight = ZJetsToLL_weight*(9000/85684.0); if (!gSystem->AccessPathName( fname )) input = TFile::Open( fname ); // check if file in local directory exists else input = TFile::Open( "http://root.cern.ch/files/tmva_class_example.root" ); // if not: download from ROOT server if (!input) { std::cout << "ERROR: could not open data file" << std::endl; exit(1); } std::cout << "--- TMVAClassificationApp : Using input file: " << input->GetName() << std::endl; // --- Event loop // Prepare the event tree // - here the variable names have to corresponds to your tree // - you can use the same variables as above which is slightly faster, // but of course you can use different ones and copy the values inside the event loop // std::cout << "--- Select signal sample" << std::endl; TTree* theTree = (TTree*)input->Get("BDT_btree"); theTree->SetBranchAddress( "Hmass", &Hmass ); theTree->SetBranchAddress( "Zmass", &Zmass ); theTree->SetBranchAddress( "Hpt", &Hpt ); theTree->SetBranchAddress( "Zpt", &Zpt ); theTree->SetBranchAddress( "CSV0", &CSV0 ); theTree->SetBranchAddress( "CSV1", &CSV1 ); theTree->SetBranchAddress( "DeltaPhiHV", &DeltaPhiHV ); theTree->SetBranchAddress( "DetaJJ", &DetaJJ ); theTree->SetBranchAddress( "UnweightedEta", &UnweightedEta ); theTree->SetBranchAddress( "mu0pt", &mu0pt ); theTree->SetBranchAddress( "Ht", &Ht ); theTree->SetBranchAddress( "EvntShpCircularity", &EvntShpCircularity ); theTree->SetBranchAddress( "nJets", &nJets ); theTree->SetBranchAddress( "Naj", &Naj ); theTree->SetBranchAddress( "mu1pt", &mu1pt ); theTree->SetBranchAddress( "mu0pt", &mu0pt ); theTree->SetBranchAddress( "EtaStandDev", &EtaStandDev ); theTree->SetBranchAddress( "UnweightedEta", &UnweightedEta ); theTree->SetBranchAddress( "jetCHF0", &jetCHF0 ); theTree->SetBranchAddress( "jetCHF1", &jetCHF1 ); theTree->SetBranchAddress( "muonPFiso0", &muonPFiso0 ); theTree->SetBranchAddress( "muonPFiso1", &muonPFiso1 ); theTree->SetBranchAddress( "DphiJJ", &DphiJJ ); theTree->SetBranchAddress( "RMS_eta", &RMS_eta ); theTree->SetBranchAddress( "PtbalZH", &PtbalZH ); theTree->SetBranchAddress( "EventPt", &EventPt ); theTree->SetBranchAddress( "Angle", &Angle ); theTree->SetBranchAddress( "Centrality", &Centrality ); theTree->SetBranchAddress( "EvntShpAplanarity", &EvntShpAplanarity ); theTree->SetBranchAddress( "EvntShpSphericity", &EvntShpSphericity ); theTree->SetBranchAddress( "EvntShpIsotropy", &EvntShpIsotropy ); theTree->SetBranchAddress( "Trigweight", &Trigweight ); theTree->SetBranchAddress( "B2011PUweight", &B2011PUweight ); theTree->SetBranchAddress( "btag2CSF", &btag2CSF ); theTree->SetBranchAddress( "MET", &MET ); theTree->SetBranchAddress( "eventFlavor", &eventFlavor ); // Efficiency calculator for cut method Int_t nSelCutsGA = 0; Double_t effS = 0.7; TTree* TMVATree = (TTree*)input->Get("TMVA_tree"); int NumInTree = theTree->GetEntries(); int NumberTMVAtree = TMVATree->GetEntries(); ZJetsToLL_weight = ZJetsToLL_weight* ( NumInTree /float(NumberTMVAtree)) ; std::vector<Float_t> vecVar(4); // vector for EvaluateMVA tests std::cout << "--- Processing: " << theTree->GetEntries() << " events" << std::endl; TStopwatch sw; sw.Start(); for (Long64_t ievt=0; ievt<NumInTree;ievt++) { if (ievt%1000 == 0) std::cout << "--- ... Processing event: " << ievt << std::endl; theTree->GetEntry(ievt); // var1 = userVar1 + userVar2; // var2 = userVar1 - userVar2; // --- Return the MVA outputs and fill into histograms if (Use["CutsGA"]) { // Cuts is a special case: give the desired signal efficienciy Bool_t passed = reader->EvaluateMVA( "CutsGA method", effS ); if (passed) nSelCutsGA++; } if (Use["Likelihood" ]) histLk ->Fill( reader->EvaluateMVA( "Likelihood method" ) ); if (Use["LikelihoodD" ]) histLkD ->Fill( reader->EvaluateMVA( "LikelihoodD method" ) ); if (Use["LikelihoodPCA"]) histLkPCA ->Fill( reader->EvaluateMVA( "LikelihoodPCA method" ) ); if (Use["LikelihoodKDE"]) histLkKDE ->Fill( reader->EvaluateMVA( "LikelihoodKDE method" ) ); if (Use["LikelihoodMIX"]) histLkMIX ->Fill( reader->EvaluateMVA( "LikelihoodMIX method" ) ); if (Use["PDERS" ]) histPD ->Fill( reader->EvaluateMVA( "PDERS method" ) ); if (Use["PDERSD" ]) histPDD ->Fill( reader->EvaluateMVA( "PDERSD method" ) ); if (Use["PDERSPCA" ]) histPDPCA ->Fill( reader->EvaluateMVA( "PDERSPCA method" ) ); if (Use["KNN" ]) histKNN ->Fill( reader->EvaluateMVA( "KNN method" ) ); if (Use["HMatrix" ]) histHm ->Fill( reader->EvaluateMVA( "HMatrix method" ) ); if (Use["Fisher" ]) histFi ->Fill( reader->EvaluateMVA( "Fisher method" ) ); if (Use["FisherG" ]) histFiG ->Fill( reader->EvaluateMVA( "FisherG method" ) ); if (Use["BoostedFisher"]) histFiB ->Fill( reader->EvaluateMVA( "BoostedFisher method" ) ); if (Use["LD" ]) histLD ->Fill( reader->EvaluateMVA( "LD method" ) ); if (Use["MLP" ]) histNn ->Fill( reader->EvaluateMVA( "MLP method" ) ); if (Use["MLPBFGS" ]) histNnbfgs ->Fill( reader->EvaluateMVA( "MLPBFGS method" ) ); if (Use["MLPBNN" ]) histNnbnn ->Fill( reader->EvaluateMVA( "MLPBNN method" ) ); if (Use["CFMlpANN" ]) histNnC ->Fill( reader->EvaluateMVA( "CFMlpANN method" ) ); if (Use["TMlpANN" ]) histNnT ->Fill( reader->EvaluateMVA( "TMlpANN method" ) ); if (Use["BDT" ]) { BDTvalue = reader->EvaluateMVA( "BDT method" ); } if (Use["BDTD" ]) histBdtD ->Fill( reader->EvaluateMVA( "BDTD method" ) ); if (Use["BDTG" ]) histBdtG ->Fill( reader->EvaluateMVA( "BDTG method" ) ); if (Use["RuleFit" ]) histRf ->Fill( reader->EvaluateMVA( "RuleFit method" ) ); if (Use["SVM_Gauss" ]) histSVMG ->Fill( reader->EvaluateMVA( "SVM_Gauss method" ) ); if (Use["SVM_Poly" ]) histSVMP ->Fill( reader->EvaluateMVA( "SVM_Poly method" ) ); if (Use["SVM_Lin" ]) histSVML ->Fill( reader->EvaluateMVA( "SVM_Lin method" ) ); if (Use["FDA_MT" ]) histFDAMT ->Fill( reader->EvaluateMVA( "FDA_MT method" ) ); if (Use["FDA_GA" ]) histFDAGA ->Fill( reader->EvaluateMVA( "FDA_GA method" ) ); if (Use["Category" ]) histCat ->Fill( reader->EvaluateMVA( "Category method" ) ); if (Use["Plugin" ]) histPBdt ->Fill( reader->EvaluateMVA( "P_BDT method" ) ); // Retrieve also per-event error if (Use["PDEFoam"]) { Double_t val = reader->EvaluateMVA( "PDEFoam method" ); Double_t err = reader->GetMVAError(); histPDEFoam ->Fill( val ); histPDEFoamErr->Fill( err ); if (err>1.e-50) histPDEFoamSig->Fill( val/err ); } // Retrieve probability instead of MVA output if (Use["Fisher"]) { probHistFi ->Fill( reader->GetProba ( "Fisher method" ) ); rarityHistFi->Fill( reader->GetRarity( "Fisher method" ) ); } // std::cout << "Ht is "<< Ht << endl; if (eventFlavor == 5 ) { histMattBdt ->Fill( BDTvalue,ZJetsToLL_weight ); histTMVABdt ->Fill( BDTvalue,ZJetsToLL_weight ); hMjj_OpenSelection->Fill(Hmass,ZJetsToLL_weight); hMmumu_OpenSelection->Fill(Zmass,ZJetsToLL_weight); hPtjj_OpenSelection->Fill(Hpt,ZJetsToLL_weight); hPtmumu_OpenSelection->Fill(Zpt,ZJetsToLL_weight); hCSV0_OpenSelection->Fill(CSV0,ZJetsToLL_weight); hCSV1_OpenSelection->Fill(CSV1,ZJetsToLL_weight); hdphiVH_OpenSelection->Fill(DeltaPhiHV,ZJetsToLL_weight); hdetaJJ_OpenSelection->Fill(DetaJJ,ZJetsToLL_weight); hUnweightedEta_OpenSelection->Fill(UnweightedEta,ZJetsToLL_weight); hPtmu0_OpenSelection->Fill(mu0pt,ZJetsToLL_weight); hHt_OpenSelection->Fill(Ht,ZJetsToLL_weight); hCircularity_OpenSelection->Fill(EvntShpCircularity,ZJetsToLL_weight); hCHFb0_OpenSelection->Fill(jetCHF0, ZJetsToLL_weight); hCHFb1_OpenSelection->Fill(jetCHF1, ZJetsToLL_weight); hPtbalZH_OpenSelection->Fill(PtbalZH, ZJetsToLL_weight); hPtmu1_OpenSelection->Fill(mu1pt, ZJetsToLL_weight); hPFRelIsomu0_OpenSelection->Fill(muonPFiso0, ZJetsToLL_weight); hPFRelIsomu1_OpenSelection->Fill(muonPFiso1, ZJetsToLL_weight); hNjets_OpenSelection->Fill(nJets, ZJetsToLL_weight); hRMSeta_OpenSelection->Fill(RMS_eta, ZJetsToLL_weight); hStaDeveta_OpenSelection->Fill(EtaStandDev, ZJetsToLL_weight); hdphiJJ_vect_OpenSelection->Fill(DphiJJ, ZJetsToLL_weight); hCentrality_OpenSelection->Fill(Centrality, ZJetsToLL_weight); hEventPt_OpenSelection->Fill(EventPt, ZJetsToLL_weight); hAngle_OpenSelection->Fill(Angle, ZJetsToLL_weight); hSphericity_OpenSelection->Fill(EvntShpSphericity, ZJetsToLL_weight); hAplanarity_OpenSelection->Fill(EvntShpAplanarity, ZJetsToLL_weight); hIsotropy_OpenSelection->Fill(EvntShpIsotropy, ZJetsToLL_weight); hDphiDetajj_OpenSelection->Fill(DphiJJ, DetaJJ, ZJetsToLL_weight); }// only fill if b quark treeWithBDT->Fill(); }//end event loop // Get elapsed time sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); // Get efficiency for cuts classifier if (Use["CutsGA"]) std::cout << "--- Efficiency for CutsGA method: " << double(nSelCutsGA)/theTree->GetEntries() << " (for a required signal efficiency of " << effS << ")" << std::endl; if (Use["CutsGA"]) { // test: retrieve cuts for particular signal efficiency // CINT ignores dynamic_casts so we have to use a cuts-secific Reader function to acces the pointer TMVA::MethodCuts* mcuts = reader->FindCutsMVA( "CutsGA method" ) ; if (mcuts) { std::vector<Double_t> cutsMin; std::vector<Double_t> cutsMax; mcuts->GetCuts( 0.7, cutsMin, cutsMax ); std::cout << "--- -------------------------------------------------------------" << std::endl; std::cout << "--- Retrieve cut values for signal efficiency of 0.7 from Reader" << std::endl; for (UInt_t ivar=0; ivar<cutsMin.size(); ivar++) { std::cout << "... Cut: " << cutsMin[ivar] << " < \"" << mcuts->GetInputVar(ivar) << "\" <= " << cutsMax[ivar] << std::endl; } std::cout << "--- -------------------------------------------------------------" << std::endl; } } // --- Write histograms TFile *target = new TFile( "TMVApp_ZJetsToLL_bflavor.root","RECREATE" ); if (Use["Likelihood" ]) histLk ->Write(); if (Use["LikelihoodD" ]) histLkD ->Write(); if (Use["LikelihoodPCA"]) histLkPCA ->Write(); if (Use["LikelihoodKDE"]) histLkKDE ->Write(); if (Use["LikelihoodMIX"]) histLkMIX ->Write(); if (Use["PDERS" ]) histPD ->Write(); if (Use["PDERSD" ]) histPDD ->Write(); if (Use["PDERSPCA" ]) histPDPCA ->Write(); if (Use["KNN" ]) histKNN ->Write(); if (Use["HMatrix" ]) histHm ->Write(); if (Use["Fisher" ]) histFi ->Write(); if (Use["FisherG" ]) histFiG ->Write(); if (Use["BoostedFisher"]) histFiB ->Write(); if (Use["LD" ]) histLD ->Write(); if (Use["MLP" ]) histNn ->Write(); if (Use["MLPBFGS" ]) histNnbfgs ->Write(); if (Use["MLPBNN" ]) histNnbnn ->Write(); if (Use["CFMlpANN" ]) histNnC ->Write(); if (Use["TMlpANN" ]) histNnT ->Write(); if (Use["BDT" ]) { histMattBdt ->Write(); histTMVABdt ->Write(); } if (Use["BDTD" ]) histBdtD ->Write(); if (Use["BDTG" ]) histBdtG ->Write(); if (Use["RuleFit" ]) histRf ->Write(); if (Use["SVM_Gauss" ]) histSVMG ->Write(); if (Use["SVM_Poly" ]) histSVMP ->Write(); if (Use["SVM_Lin" ]) histSVML ->Write(); if (Use["FDA_MT" ]) histFDAMT ->Write(); if (Use["FDA_GA" ]) histFDAGA ->Write(); if (Use["Category" ]) histCat ->Write(); if (Use["Plugin" ]) histPBdt ->Write(); // Write also error and significance histos if (Use["PDEFoam"]) { histPDEFoam->Write(); histPDEFoamErr->Write(); histPDEFoamSig->Write(); } // Write also probability hists if (Use["Fisher"]) { if (probHistFi != 0) probHistFi->Write(); if (rarityHistFi != 0) rarityHistFi->Write(); } hCHFb0_OpenSelection->Write(); hCHFb1_OpenSelection->Write(); hPtbalZH_OpenSelection->Write(); hPtmu1_OpenSelection->Write(); hPFRelIsomu0_OpenSelection->Write(); hPFRelIsomu1_OpenSelection->Write(); hMjj_OpenSelection->Write(); hMmumu_OpenSelection->Write(); hPtjj_OpenSelection->Write(); hPtmumu_OpenSelection->Write(); hCSV0_OpenSelection->Write(); hCSV1_OpenSelection->Write(); hdphiVH_OpenSelection->Write(); hdetaJJ_OpenSelection->Write(); hUnweightedEta_OpenSelection->Write(); hPtmu0_OpenSelection->Write(); hCircularity_OpenSelection->Write(); hHt_OpenSelection->Write(); hNjets_OpenSelection->Write(); hRMSeta_OpenSelection->Write(); hStaDeveta_OpenSelection->Write(); hdphiJJ_vect_OpenSelection->Write(); hCentrality_OpenSelection->Write(); hEventPt_OpenSelection->Write(); hAngle_OpenSelection->Write(); hSphericity_OpenSelection->Write(); hAplanarity_OpenSelection->Write(); hIsotropy_OpenSelection->Write(); hDphiDetajj_OpenSelection->Write(); treeWithBDT->Write(); target->Close(); delete reader; hCHFb0_OpenSelection->Delete(); hCHFb1_OpenSelection->Delete(); hPtbalZH_OpenSelection->Delete(); hPtmu1_OpenSelection->Delete(); hPFRelIsomu0_OpenSelection->Delete(); hPFRelIsomu1_OpenSelection->Delete(); hMjj_OpenSelection->Delete(); hMmumu_OpenSelection->Delete(); hPtjj_OpenSelection->Delete(); hPtmumu_OpenSelection->Delete(); hCSV0_OpenSelection->Delete(); hCSV1_OpenSelection->Delete(); hdphiVH_OpenSelection->Delete(); hdetaJJ_OpenSelection->Delete(); hUnweightedEta_OpenSelection->Delete(); hPtmu0_OpenSelection->Delete(); hCircularity_OpenSelection->Delete(); hHt_OpenSelection->Delete(); hNjets_OpenSelection->Delete(); hRMSeta_OpenSelection->Delete(); hStaDeveta_OpenSelection->Delete(); hdphiJJ_vect_OpenSelection->Delete(); hCentrality_OpenSelection->Delete(); hEventPt_OpenSelection->Delete(); hAngle_OpenSelection->Delete(); hSphericity_OpenSelection->Delete(); hAplanarity_OpenSelection->Delete(); hIsotropy_OpenSelection->Delete(); hDphiDetajj_OpenSelection->Delete(); treeWithBDT->Delete(); if (Use["BDT" ]) { histMattBdt ->Delete(); histTMVABdt ->Delete(); } std::cout << "==> ZJetsToLL_App_bflavor is done!" << endl << std::endl; gROOT->ProcessLine(".q"); }
int testPyKerasRegression(){ // Get data file std::cout << "Get test data..." << std::endl; TString fname = "./tmva_reg_example.root"; if (gSystem->AccessPathName(fname)) // file does not exist in local directory gSystem->Exec("curl -O http://root.cern.ch/files/tmva_reg_example.root"); TFile *input = TFile::Open(fname); // Build model from python file std::cout << "Generate keras model..." << std::endl; UInt_t ret; ret = gSystem->Exec("echo '"+pythonSrc+"' > generateKerasModelRegression.py"); if(ret!=0){ std::cout << "[ERROR] Failed to write python code to file" << std::endl; return 1; } ret = gSystem->Exec("python generateKerasModelRegression.py"); if(ret!=0){ std::cout << "[ERROR] Failed to generate model using python" << std::endl; return 1; } // Setup PyMVA and factory std::cout << "Setup TMVA..." << std::endl; TMVA::PyMethodBase::PyInitialize(); TFile* outputFile = TFile::Open("ResultsTestPyKerasRegression.root", "RECREATE"); TMVA::Factory *factory = new TMVA::Factory("testPyKerasRegression", outputFile, "!V:Silent:Color:!DrawProgressBar:AnalysisType=Regression"); // Load data TMVA::DataLoader *dataloader = new TMVA::DataLoader("datasetTestPyKerasRegression"); TTree *tree = (TTree*)input->Get("TreeR"); dataloader->AddRegressionTree(tree); dataloader->AddVariable("var1"); dataloader->AddVariable("var2"); dataloader->AddTarget("fvalue"); dataloader->PrepareTrainingAndTestTree("", "SplitMode=Random:NormMode=NumEvents:!V"); // Book and train method factory->BookMethod(dataloader, TMVA::Types::kPyKeras, "PyKeras", "!H:!V:VarTransform=D,G:FilenameModel=kerasModelRegression.h5:FilenameTrainedModel=trainedKerasModelRegression.h5:NumEpochs=10:BatchSize=32:SaveBestOnly=false:Verbose=0"); std::cout << "Train model..." << std::endl; factory->TrainAllMethods(); // Clean-up delete factory; delete dataloader; delete outputFile; // Setup reader UInt_t numEvents = 100; std::cout << "Run reader and estimate target of " << numEvents << " events..." << std::endl; TMVA::Reader *reader = new TMVA::Reader("!Color:Silent"); Float_t vars[3]; reader->AddVariable("var1", vars+0); reader->AddVariable("var2", vars+1); reader->BookMVA("PyKeras", "datasetTestPyKerasRegression/weights/testPyKerasRegression_PyKeras.weights.xml"); // Get mean squared error on events tree->SetBranchAddress("var1", vars+0); tree->SetBranchAddress("var2", vars+1); tree->SetBranchAddress("fvalue", vars+2); Float_t meanMvaError = 0; for(UInt_t i=0; i<numEvents; i++){ tree->GetEntry(i); meanMvaError += std::pow(vars[2]-reader->EvaluateMVA("PyKeras"),2); } meanMvaError = meanMvaError/float(numEvents); // Check whether the response is obviously better than guessing std::cout << "Mean squared error: " << meanMvaError << std::endl; if(meanMvaError > 30.0){ std::cout << "[ERROR] Mean squared error is " << meanMvaError << " (>30.0)" << std::endl; return 1; } return 0; }
//_____________________________________________________________________________ void dumpCats(bool debug, TString fileName, TString dirName, bool smearMassError) { TFile* file = TFile::Open(fileName.Data()); TDirectory* theDir = (TDirectory*) file->FindObjectAny(dirName.Data()); TTree* theTree = (TTree*) theDir->Get("hPhotonTree"); UInt_t run, lumi, evt; float rho, mass; Int_t tth, vhLep, vhMet, vhHad, vbf, cat; theTree->SetBranchAddress("run", &run); theTree->SetBranchAddress("lumi",&lumi); theTree->SetBranchAddress("evt", &evt); theTree->SetBranchAddress("mass",&mass); theTree->SetBranchAddress("rho",&rho); theTree->SetBranchAddress("tthTag",&tth); theTree->SetBranchAddress("VHLepTag",&vhLep); theTree->SetBranchAddress("VHHadTag",&vhHad); theTree->SetBranchAddress("vbfTag",&vbf); float ph1e, ph1pt, ph1eerr, ph1eerrsmeared, teta1, phi1; float ph2e, ph2pt, ph2eerr, ph2eerrsmeared, teta2, phi2; theTree->SetBranchAddress("ph1.pt",&ph1pt); theTree->SetBranchAddress("ph1.e",&ph1e); theTree->SetBranchAddress("ph1.eerr",&ph1eerr); theTree->SetBranchAddress("ph1.eerrsmeared",&ph1eerrsmeared); theTree->SetBranchAddress("ph1.eta",&teta1); theTree->SetBranchAddress("ph1.phi",&phi1); theTree->SetBranchAddress("ph2.pt",&ph2pt); theTree->SetBranchAddress("ph2.e",&ph2e); theTree->SetBranchAddress("ph2.eerr",&ph2eerr); theTree->SetBranchAddress("ph2.eerrsmeared",&ph2eerrsmeared); theTree->SetBranchAddress("ph2.eta",&teta2); theTree->SetBranchAddress("ph2.phi",&phi2); Float_t ele1_pt, ele1_eta; Float_t mu1_pt, mu1_eta; theTree->SetBranchAddress("elePt" , &ele1_pt ); theTree->SetBranchAddress("eleEta" , &ele1_eta); theTree->SetBranchAddress("muonPt" , &mu1_pt ); theTree->SetBranchAddress("muonEta", &mu1_eta ); float jet1pt, jet1eta, jet1phi; float jet2pt, jet2eta, jet2phi; theTree->SetBranchAddress("jet1pt",&jet1pt); theTree->SetBranchAddress("jet1eta",&jet1eta); theTree->SetBranchAddress("jet1phi",&jet1phi); theTree->SetBranchAddress("jet2pt",&jet2pt); theTree->SetBranchAddress("jet2eta",&jet2eta); theTree->SetBranchAddress("jet2phi",&jet2phi); float masserr, masserrwvtx, masserr_ns, masserrwvtx_ns, vtxprob, idmva_1, idmva_2; theTree->SetBranchAddress("masserrsmeared",&masserr); theTree->SetBranchAddress("masserrsmearedwrongvtx",&masserrwvtx); theTree->SetBranchAddress("masserr",&masserr_ns); theTree->SetBranchAddress("masserrwrongvtx",&masserrwvtx_ns); theTree->SetBranchAddress("vtxprob",&vtxprob); theTree->SetBranchAddress("ph1.idmva",&idmva_1); theTree->SetBranchAddress("ph2.idmva",&idmva_2); // MET tag stuff float corrpfmet, corrpfmetphi, pfmet, pfmetphi; theTree->SetBranchAddress("corrpfmet",&corrpfmet); theTree->SetBranchAddress("corrpfmetphi",&corrpfmetphi); theTree->SetBranchAddress("pfmet",&pfmet); theTree->SetBranchAddress("pfmetphi",&pfmetphi); float phigg, jetleadNoIDpt, jetleadNoIDphi, jetleadNoIDeta; float ph1sceta, ph1scphi; float ph2sceta, ph2scphi; theTree->SetBranchAddress("phigg",&phigg); theTree->SetBranchAddress("jetleadNoIDpt",&jetleadNoIDpt); theTree->SetBranchAddress("jetleadNoIDphi",&jetleadNoIDphi); theTree->SetBranchAddress("jetleadNoIDeta",&jetleadNoIDeta); theTree->SetBranchAddress("ph1.sceta",&ph1sceta); theTree->SetBranchAddress("ph1.scphi",&ph1scphi); theTree->SetBranchAddress("ph2.sceta",&ph2sceta); theTree->SetBranchAddress("ph2.scphi",&ph2scphi); // Setup the diphoton BDT Float_t rVtxSigmaMoM, wVtxSigmaMoM, cosDPhi; Float_t pho1_ptOverM; Float_t pho2_ptOverM; Float_t diphoMVA; TMVA::Reader* reader = new TMVA::Reader("Silent"); reader->AddVariable("masserrsmeared/mass" , &rVtxSigmaMoM); reader->AddVariable("masserrsmearedwrongvtx/mass", &wVtxSigmaMoM); reader->AddVariable("vtxprob" , &vtxprob ); reader->AddVariable("ph1.pt/mass" , &pho1_ptOverM); reader->AddVariable("ph2.pt/mass" , &pho2_ptOverM); reader->AddVariable("ph1.eta" , &teta1 ); reader->AddVariable("ph2.eta" , &teta2 ); reader->AddVariable("TMath::Cos(ph1.phi-ph2.phi)", &cosDPhi ); reader->AddVariable("ph1.idmva" , &idmva_1 ); reader->AddVariable("ph2.idmva" , &idmva_2 ); const char *diphotonWeights = ( "/home/veverka/cms/cmssw/031/CMSSW_5_3_10_patch1/src/MitPhysics/data/" "HggBambu_SMDipho_Oct01_redqcdweightallsigevenbkg_BDTG.weights.xml" ); reader->BookMVA("BDTG", diphotonWeights); TRandom3 rng(0); int eventCounter=0; // Loop over the entries. std::cout << "Looping over " << theTree->GetEntries() << " entries." << std::endl; for (int i=0; i < theTree->GetEntries(); ++i) { if (eventCounter > 9 && debug ) break; if (debug) { cout << "Processing entry " << i << " :" << endl << " mass: " << mass << endl << " ph1pt: " << ph1pt << endl << " ph2pt: " << ph2pt << endl << " idmva_1:" << idmva_1 << endl << " idmva_2:" << idmva_2 << endl; } theTree->GetEntry(i); // MET category vhMet = 0; double dEtaJPh1 = ph1sceta - jetleadNoIDeta; double dPhiJPh1 = TMath::ACos(TMath::Cos(ph1scphi - jetleadNoIDphi)); double dRJPh1 = TMath::Sqrt(TMath::Power(dEtaJPh1, 2) + TMath::Power(dPhiJPh1, 2)); double dEtaJPh2 = ph2sceta - jetleadNoIDeta; double dPhiJPh2 = TMath::ACos(TMath::Cos(ph2scphi - jetleadNoIDphi)); double dRJPh2 = TMath::Sqrt(TMath::Power(dEtaJPh2, 2) + TMath::Power(dPhiJPh2, 2)); double dPhiMetGG = TMath::ACos(TMath::Cos(phigg - corrpfmetphi)); double dPhiMetJet = TMath::ACos( TMath::Cos(TMath::Abs(jetleadNoIDphi - corrpfmetphi)) ); if (TMath::Abs(ph1sceta) < 1.4442 && TMath::Abs(ph2sceta) < 1.4442 && corrpfmet > 70. && ph1pt/mass > 45./120. && dPhiMetGG > 2.1 && ( jetleadNoIDpt < 50. || dRJPh1 < 0.5 || dRJPh2 < 0.5 || dPhiMetJet < 2.7 ) && ph2pt > mass/4) { vhMet = 1; } // Calculate needed variables for the diphoMVA if (smearMassError) { rVtxSigmaMoM = masserr / mass; // with smearing wVtxSigmaMoM = masserrwvtx / mass; // with smearing } else { rVtxSigmaMoM = masserr_ns / mass; // no smearing wVtxSigmaMoM = masserrwvtx_ns / mass; // no smearing } cosDPhi = TMath::Cos(phi1 - phi2); pho1_ptOverM = ph1pt / mass; pho2_ptOverM = ph2pt / mass; diphoMVA = reader->EvaluateMVA("BDTG"); bool passPreselection = (mass > 100 && mass < 180 && ph1pt > mass/3 && ph2pt > mass/4 && idmva_1 > -0.2 && idmva_2 > -0.2); if (passPreselection == false) { if (debug) { cout << " passPreselection: " << passPreselection << endl; } continue; } if (debug) { cout << " ... passed preselection." << endl; } eventCounter++; if (tth == 1) tth = 2; else if (tth == 2) tth = 1; if (vhHad == 2) vhHad = 1; cat = kIncl0; if (tth == 2) cat = kTTHLep; else if (vhLep == 2) cat = kVHLepTight; else if (vhLep == 1) cat = kVHLepLoose; else if (vbf > 0) cat = kDijet0; else if (vhMet == 1) cat = kVHMet; else if (tth == 1) cat = kTTHHad; else if (vhHad == 1) cat = kVHHad; // if (cat == kIncl0 && diphoMVA < -0.4) continue; // Event Variables dumpVar("run" , run ); // 1 dumpVar("lumi" , lumi ); // 2 dumpVar("event" , evt ); // 3 dumpVar("cat" , cat ); dumpVar("tth" , tth ); dumpVar("vhLep" , vhLep ); dumpVar("vhMet" , vhMet ); dumpVar("vhHad" , vhHad ); dumpVar("vbf" , vbf ); // Leading Photon Variables dumpVar("pho1_e" , ph1e ); // 10 dumpVar("pho1_eErr" , ph1eerr ); // 11 dumpVar("pho1_eta" , teta1 ); // 8 dumpVar("pho1_phi" , phi1 ); // 9 dumpVar("pho1_idMVA" , idmva_1 ); // Trailing Photon Variables dumpVar("pho2_e" , ph2e ); // 36 dumpVar("pho2_eErr" , ph2eerr ); // 37 dumpVar("pho2_eta" , teta2 ); // 34 dumpVar("pho2_phi" , phi2 ); // 35 dumpVar("pho2_idMVA" , idmva_2 ); // Diphoton Variables dumpVar("mass" , mass ); dumpVar("met" , corrpfmet ); dumpVar("met_phi" , corrpfmetphi ); dumpVar("uncorrMet" , pfmet ); dumpVar("uncorrMet_phi" , pfmetphi ); dumpVar("diphoMVA" , diphoMVA ); // Muon Variables if (mu1_pt < 0) { mu1_pt = -999; mu1_eta = -999; } dumpVar("mu1_pt" , mu1_pt ); dumpVar("mu1_eta" , mu1_eta ); // Electron Variables if (ele1_pt < 0) { ele1_pt = -999; ele1_eta = -999; } dumpVar("ele1_pt" , ele1_pt ); dumpVar("ele1_eta" , ele1_eta ); // Leading Jet Variables if (jet1pt < 0) { jet1pt = -999; jet1eta = -999; } dumpVar("jet1_pt" , jet1pt ); // 69 dumpVar("jet1_eta" , jet1eta ); // 70 dumpVar("jet1_phi" , jet1phi ); // 70 // Trailing Jet Variables if (jet2pt < 0) { jet2pt = -999; jet2eta = -999; } dumpVar("jet2_pt" , jet2pt ); // 72 dumpVar("jet2_eta" , jet2eta ); // 73 dumpVar("jet2_phi" , jet2phi ); // 70 std::cout << std::endl; } // Loop over the tree entries. return; } // void dumpMvaInputs(bool debug, TString fileName)
//should include inttype 11, 12, 13 as the signal void TMVAClassificationApplication_cc1presv2_bdt_ver3noveract( TString myMethodList = "", TString fname ) { #ifdef __CINT__ gROOT->ProcessLine( ".O0" ); // turn off optimization in CINT #endif //--------------------------------------------------------------- // This loads the library TMVA::Tools::Instance(); // Default MVA methods to be trained + tested std::map<std::string,int> Use; // // --- Boosted Decision Trees Use["BDT"] = 1; // uses Adaptive Boost std::cout << std::endl; std::cout << "==> Start TMVAClassificationApplication" << std::endl; // Select methods (don't look at this code - not of interest) if (myMethodList != "") { for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) it->second = 0; std::vector<TString> mlist = gTools().SplitString( myMethodList, ',' ); for (UInt_t i=0; i<mlist.size(); i++) { std::string regMethod(mlist[i]); if (Use.find(regMethod) == Use.end()) { std::cout << "Method \"" << regMethod << "\" not known in TMVA under this name. Choose among the following:" << std::endl; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { std::cout << it->first << " "; } std::cout << std::endl; return; } Use[regMethod] = 1; } } // -------------------------------------------------------------------------------------------------- // --- Create the Reader object TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); // Create a set of variables and declare them to the reader // - the variable names MUST corresponds in name and type to those given in the weight file(s) used Float_t mumucl, pmucl; Float_t pang_t, muang_t; Float_t veract; Float_t ppe, mupe; Float_t range, coplanarity; Float_t opening;//newadd reader->AddVariable( "mumucl", &mumucl ); reader->AddVariable( "pmucl", &pmucl ); reader->AddVariable( "pang_t", &pang_t ); reader->AddVariable( "muang_t", &muang_t ); //reader->AddVariable( "veract", &veract ); reader->AddVariable( "ppe", &ppe); reader->AddVariable( "mupe", &mupe); reader->AddVariable( "range", &range); reader->AddVariable( "coplanarity", &coplanarity); reader->AddVariable( "opening", &opening);//newadd // Spectator variables declared in the training have to be added to the reader, too Int_t fileIndex, inttype; Float_t nuE, norm, totcrsne; reader->AddSpectator( "fileIndex", &fileIndex ); reader->AddSpectator( "nuE", &nuE ); reader->AddSpectator( "inttype", &inttype ); reader->AddSpectator( "norm", &norm ); reader->AddSpectator( "totcrsne", &totcrsne ); reader->AddSpectator( "veract", &veract ); // --- Book the MVA methods TString dir = "weights/"; TString prefix = "TMVAClassification_cc1presv2_ver3noveract";//newchange // Book method(s) for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { if (it->second) { TString methodName = TString(it->first) + TString(" method"); TString weightfile = dir + prefix + TString("_") + TString(it->first) + TString(".weights.xml"); reader->BookMVA( methodName, weightfile ); } } // Prepare input tree (this must be replaced by your data source) // in this example, there is a toy tree with signal and one with background events // we'll later on use only the "signal" events for the test in this example. // /*//TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/data_merged_ccqe_addpid_ver3noveract_pid1pres.root"; //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/pm_merged_ccqe_tot_addpid_ver3noveract_pid1pres.root"; //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/pmbar_merged_ccqe_addpid_ver3noveract_pid1pres.root"; //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/ingrid_merged_nd3_ccqe_tot_addpid_ver3noveract_pid1pres.root"; //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/wall_merged_ccqe_tot_addpid_ver3noveract_pid1pres.root"; //check genie signal TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/genie_merged_ccqe_coh_addpid_ver3noveract_pid1pres.root";*/ //add for event with more than 2 track //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/data_merged_ccqe_processl2trk.root"; //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/pm_merged_ccqe_tot_processl2trk.root"; //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/pmbar_merged_ccqe_processl2trk.root"; //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/ingrid_merged_nd3_ccqe_tot_processl2trk.root"; //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/wall_merged_ccqe_tot_processl2trk.root"; //check genie signal //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/genie_merged_ccqe_coh_processl2trk.root"; //for correct cc1pres pid //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/data_merged_ccqe_correct1pres.root"; //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/pm_merged_ccqe_tot_correct1pres.root"; //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/pmbar_merged_ccqe_correct1pres.root"; //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/ingrid_merged_nd3_ccqe_tot_correct1pres.root"; //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/wall_merged_ccqe_tot_correct1pres.root"; //TString fname = "/home/cvson/cc1picoh/frkikawa/meAna/ip4tmva/genie_merged_ccqe_coh_correct1pres.root"; //for correct prange/pang_t and additional information //TString fname = "/home/cvson/cc1picoh/dataProcess/fix20150420/data_merged_ccqe_addpidFF.root"; // TString fname = "/home/cvson/cc1picoh/dataProcess/fix20150420/pm_merged_ccqe_tot_addpidFF.root"; //TString fname = "/home/cvson/cc1picoh/dataProcess/fix20150420/pmbar_merged_ccqe_addpidFF.root"; //TString fname = "/home/cvson/cc1picoh/dataProcess/fix20150420/ingrid_merged_nd3_ccqe_tot_addpidFF.root"; //TString fname = "/home/cvson/cc1picoh/dataProcess/fix20150420/wall_merged_ccqe_tot_addpidFF.root"; //TString fname = "/home/cvson/cc1picoh/dataProcess/fix20150420/genie_merged_ccqe_tot_addpidFF.root"; // std::cout << "--- Selecting data sample" << std::endl; TFile *pfile = new TFile(fname,"update"); TTree* theTree = (TTree*)pfile->Get("tree"); theTree->SetBranchAddress( "mumucl", &mumucl ); theTree->SetBranchAddress( "pmucl", &pmucl ); theTree->SetBranchAddress( "pang_t", &pang_t ); theTree->SetBranchAddress( "muang_t", &muang_t ); theTree->SetBranchAddress( "veract", &veract ); theTree->SetBranchAddress( "ppe", &ppe); theTree->SetBranchAddress( "mupe", &mupe); theTree->SetBranchAddress( "range", &range); theTree->SetBranchAddress( "coplanarity", &coplanarity); theTree->SetBranchAddress( "opening", &opening); Int_t Ntrack; theTree->SetBranchAddress( "Ntrack", &Ntrack ); Float_t pid1pres; TBranch *bpid1pres = theTree->Branch("pid1pres",&pid1pres,"pid1pres/F"); std::vector<Float_t> vecVar(9); // vector for EvaluateMVA tests Long64_t nentries = theTree->GetEntriesFast(); Long64_t iprintProcess = Long64_t(nentries/100.); std::cout << "--- Processing: " << nentries << " events" << std::endl; TStopwatch sw; sw.Start(); for (Long64_t ievt=0; ievt<nentries;ievt++) { if (ievt%iprintProcess == 0) cout<<"Processing "<<int(ievt*100./nentries)<<"% of events"<<endl; theTree->GetEntry(ievt); Float_t pid_tem; if (Use["BDT"]) { //if (Ntrack!=2) pid_tem = -999;//change here if (Ntrack<2) pid_tem = -999; else pid_tem = reader->EvaluateMVA("BDT method"); } pid1pres = pid_tem; bpid1pres->Fill(); } theTree->Write(); delete pfile; // Get elapsed time sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); delete reader; std::cout << "==> TMVAClassificationApplication is done!" << endl << std::endl; }
void applyBDT(std::string iName="/mnt/hscratch/dabercro/skims2/BDT_Signal.root", TString inputVariables = "trainingVars.txt", TString inputTree = "DMSTree", std::string iWeightFile="weights/TMVAClassificationCategory_BDT_simple_alpha.weights.xml", TString outName = "Output.root", TString fOutputName = "TMVA.root", TString fMethodName = "BDT", TString fUniformVariable = "fjet1MassTrimmed", TString fWeight = "f**k", Int_t NumBins = 10, Double_t VarMin = 10, Double_t VarMax = 190, Int_t NumMapPoints = 501) { Double_t binWidth = (VarMax - VarMin)/NumBins; Double_t VarVals[NumBins+1]; for (Int_t i0 = 0; i0 < NumBins + 1; i0++) VarVals[i0] = VarMin + i0 * binWidth; std::vector<TGraph*> transformGraphs; TGraph *tempGraph; if (fUniformVariable != "") { // First scale the BDT to be uniform // Make the background shape TFile *TMVAFile = TFile::Open(fOutputName); TTree *BackgroundTree = (TTree*) TMVAFile->Get("TrainTree"); mithep::PlotHists *HistPlotter = new mithep::PlotHists(); HistPlotter->SetDefaultTree(BackgroundTree); HistPlotter->SetDefaultExpr(fMethodName); Double_t binWidth = 2.0/(NumMapPoints - 1); Double_t BDTBins[NumMapPoints]; for (Int_t i0 = 0; i0 < NumMapPoints; i0++) BDTBins[i0] = i0 * binWidth - 1; for (Int_t iVarBin = 0; iVarBin < NumBins; iVarBin++) { TString BinCut = TString::Format("%s*(%s>=%f&&%s<%f)", fWeight.Data(), fUniformVariable.Data(), VarVals[iVarBin], fUniformVariable.Data(), VarVals[iVarBin+1]); HistPlotter->AddWeight(fWeight + TString("*(classID == 1 && ") + BinCut + ")"); } std::vector<TH1D*> BDTHists = HistPlotter->MakeHists(NumMapPoints,-1,1); for (Int_t iVarBin = 0; iVarBin < NumBins; iVarBin++) { tempGraph = new TGraph(NumMapPoints); transformGraphs.push_back(tempGraph); Double_t FullIntegral = BDTHists[iVarBin]->Integral(); for (Int_t iMapPoint = 0; iMapPoint < NumMapPoints; iMapPoint++) { transformGraphs[iVarBin]->SetPoint(iMapPoint, BDTBins[iMapPoint], BDTHists[iVarBin]->Integral(0,iMapPoint)/FullIntegral); } } for (UInt_t iHist = 0; iHist < BDTHists.size(); iHist++) delete BDTHists[iHist]; TMVAFile->Close(); } TMVA::Tools::Instance(); TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); TString BDTName; ifstream configFile; configFile.open(inputVariables.Data()); TString tempFormula; std::vector<float> Evaluated; std::vector<TString> Strings; TTreeFormula *Formulas[40]; configFile >> BDTName; // Is the name of the BDT while(!configFile.eof()){ configFile >> tempFormula; if(tempFormula != ""){ Evaluated.push_back(0.); Strings.push_back(tempFormula); } } TFile *lFile = new TFile(iName.c_str()); TTree *lTree = (TTree*) lFile->FindObjectAny(inputTree); if(lTree->GetBranch(BDTName) == NULL){ for(unsigned int i0 = 0;i0 < Strings.size();i0++){ if (i0 == 0) reader->AddSpectator(Strings[i0],&Evaluated[i0]); else reader->AddVariable(Strings[i0],&Evaluated[i0]); Formulas[i0] = new TTreeFormula(Strings[i0],Strings[i0],lTree); } std::string lJetName = "BDT"; reader->BookMVA(lJetName .c_str(),iWeightFile.c_str()); int lNEvents = lTree->GetEntries(); TFile *lOFile = new TFile(outName,"RECREATE"); TTree *lOTree = new TTree(inputTree,inputTree); float lMVA = 0; lOTree->Branch(BDTName,&lMVA ,BDTName+TString("/F")); for (Long64_t i0=0; i0<lNEvents;i0++) { if (i0 % 10000 == 0) std::cout << "--- ... Processing event: " << double(i0)/double(lNEvents) << std::endl; lTree->GetEntry(i0); for(unsigned int i1 = 0;i1 < Strings.size();i1++){ Evaluated[i1] = Formulas[i1]->EvalInstance(); } lMVA = float(reader->EvaluateMVA(lJetName.c_str())); if (fUniformVariable != "") { if (Evaluated[0] >= VarVals[0] && Evaluated[0] < VarVals[NumBins]) { for (Int_t iBin = 0; iBin < NumBins; iBin++) { if (Evaluated[0] < VarVals[iBin + 1]) { lMVA = Float_t(transformGraphs[iBin]->Eval(lMVA)); break; } } } } lOTree->Fill(); } lOTree->Write(); lOFile->Close(); } else std::cout << "Skipping " << iName.c_str() << std::endl; delete reader; for (UInt_t iGraph = 0; iGraph < transformGraphs.size(); iGraph++) delete transformGraphs[iGraph]; }
void rezamyTMVAClassificationApplication1systematic( TString myMethodList = "" ) { #ifdef __CINT__ gROOT->ProcessLine( ".O0" ); // turn off optimization in CINT #endif //--------------------------------------------------------------- // This loads the library TMVA::Tools::Instance(); // Default MVA methods to be trained + tested std::map<std::string,int> Use; // --- Cut optimisation Use["Cuts"] = 0; Use["CutsD"] = 0; Use["CutsPCA"] = 0; Use["CutsGA"] = 0; Use["CutsSA"] = 0; // // --- 1-dimensional likelihood ("naive Bayes estimator") Use["Likelihood"] = 0; Use["LikelihoodD"] = 0; // the "D" extension indicates decorrelated input variables (see option strings) Use["LikelihoodPCA"] = 0; // the "PCA" extension indicates PCA-transformed input variables (see option strings) Use["LikelihoodKDE"] = 0; Use["LikelihoodMIX"] = 0; // // --- Mutidimensional likelihood and Nearest-Neighbour methods Use["PDERS"] = 0; Use["PDERSD"] = 0; Use["PDERSPCA"] = 0; Use["PDEFoam"] = 0; Use["PDEFoamBoost"] = 0; // uses generalised MVA method boosting Use["KNN"] = 0; // k-nearest neighbour method // // --- Linear Discriminant Analysis Use["LD"] = 0; // Linear Discriminant identical to Fisher Use["Fisher"] = 0; Use["FisherG"] = 0; Use["BoostedFisher"] = 0; // uses generalised MVA method boosting Use["HMatrix"] = 0; // // --- Function Discriminant analysis Use["FDA_GA"] = 0; // minimisation of user-defined function using Genetics Algorithm Use["FDA_SA"] = 0; Use["FDA_MC"] = 0; Use["FDA_MT"] = 0; Use["FDA_GAMT"] = 0; Use["FDA_MCMT"] = 0; // // --- Neural Networks (all are feed-forward Multilayer Perceptrons) Use["MLP"] = 0; // Recommended ANN Use["MLPBFGS"] = 0; // Recommended ANN with optional training method Use["MLPBNN"] = 0; // Recommended ANN with BFGS training method and bayesian regulator Use["CFMlpANN"] = 0; // Depreciated ANN from ALEPH Use["TMlpANN"] = 0; // ROOT's own ANN // // --- Support Vector Machine Use["SVM"] = 0; // // --- Boosted Decision Trees Use["BDT"] = 1; // uses Adaptive Boost Use["BDTG"] = 0; // uses Gradient Boost Use["BDTB"] = 0; // uses Bagging Use["BDTD"] = 0; // decorrelation + Adaptive Boost // // --- Friedman's RuleFit method, ie, an optimised series of cuts ("rules") Use["RuleFit"] = 0; // --------------------------------------------------------------- Use["Plugin"] = 0; Use["Category"] = 0; Use["SVM_Gauss"] = 0; Use["SVM_Poly"] = 0; Use["SVM_Lin"] = 0; std::cout << std::endl; std::cout << "==> Start TMVAClassificationApplication" << std::endl; // Select methods (don't look at this code - not of interest) if (myMethodList != "") { for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) it->second = 0; std::vector<TString> mlist = gTools().SplitString( myMethodList, ',' ); for (UInt_t i=0; i<mlist.size(); i++) { std::string regMethod(mlist[i]); if (Use.find(regMethod) == Use.end()) { std::cout << "Method \"" << regMethod << "\" not known in TMVA under this name. Choose among the following:" << std::endl; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { std::cout << it->first << " "; } std::cout << std::endl; return; } Use[regMethod] = 1; } } // -------------------------------------------------------------------------------------------------- // --- Create the Reader object TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); Float_t ptphoton,etaphoton,ptmuon,etamuon,ptjet,etajet,masstop,mtw,deltaRphotonjet,deltaRphotonmuon,ht,costopphoton,deltaphiphotonmet,cvsdiscriminant; Float_t jetmultiplicity,bjetmultiplicity,leptoncharge; // Create a set of variables and declare them to the reader // - the variable names MUST corresponds in name and type to those given in the weight file(s) used reader->AddVariable ("ptphoton", &ptphoton); // reader->AddVariable ("etaphoton", &etaphoton); reader->AddVariable ("ptmuon", &ptmuon); // reader->AddVariable ("etamuon", &etamuon); reader->AddVariable ("ptjet", &ptjet); // reader->AddVariable ("etajet", &etajet); // reader->AddVariable ("masstop", &masstop); // reader->AddVariable ("mtw", &mtw); reader->AddVariable ("deltaRphotonjet", &deltaRphotonjet); reader->AddVariable ("deltaRphotonmuon", &deltaRphotonmuon); // reader->AddVariable ("ht", &ht); // reader->AddVariable ("photonmuonmass", &photonmuonmass); reader->AddVariable ("costopphoton", &costopphoton); // reader->AddVariable ("topphotonmass", &topphotonmass); //reader->AddVariable ("pttop", &pttop); //reader->AddVariable ("etatop", &etatop); reader->AddVariable ("jetmultiplicity", &jetmultiplicity); // reader->AddVariable ("bjetmultiplicity", &bjetmultiplicity); reader->AddVariable ("deltaphiphotonmet", &deltaphiphotonmet); reader->AddVariable ("cvsdiscriminant", &cvsdiscriminant); // reader->AddVariable ("leptoncharge", &leptoncharge); /* // Spectator variables declared in the training have to be added to the reader, too reader->AddSpectator( "spec1 := var1*2", &spec1 ); reader->AddSpectator( "spec2 := var1*3", &spec2 ); Float_t Category_cat1, Category_cat2, Category_cat3; if (Use["Category"]){ // Add artificial spectators for distinguishing categories reader->AddSpectator( "Category_cat1 := var3<=0", &Category_cat1 ); reader->AddSpectator( "Category_cat2 := (var3>0)&&(var4<0)", &Category_cat2 ); reader->AddSpectator( "Category_cat3 := (var3>0)&&(var4>=0)", &Category_cat3 ); } */ // --- Book the MVA methods TString dir = "weights/"; TString prefix = "TMVA"; // Book method(s) for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { if (it->second) { TString methodName = TString(it->first) + TString(" method"); TString weightfile = dir + prefix + TString("_") + TString(it->first) + TString(".weights.xml"); reader->BookMVA( methodName, weightfile ); } } // Book output histograms UInt_t nbin = 40; TH1F *histLk(0), *histLkD(0), *histLkPCA(0), *histLkKDE(0), *histLkMIX(0), *histPD(0), *histPDD(0); TH1F *histPDPCA(0), *histPDEFoam(0), *histPDEFoamErr(0), *histPDEFoamSig(0), *histKNN(0), *histHm(0); TH1F *histFi(0), *histFiG(0), *histFiB(0), *histLD(0), *histNn(0),*histNnbfgs(0),*histNnbnn(0); TH1F *histNnC(0), *histNnT(0), *histBdt(0), *histBdtG(0), *histBdtD(0), *histRf(0), *histSVMG(0); TH1F *histSVMP(0), *histSVML(0), *histFDAMT(0), *histFDAGA(0), *histCat(0), *histPBdt(0); if (Use["Likelihood"]) histLk = new TH1F( "MVA_Likelihood", "MVA_Likelihood", nbin, -1, 1 ); if (Use["LikelihoodD"]) histLkD = new TH1F( "MVA_LikelihoodD", "MVA_LikelihoodD", nbin, -1, 0.9999 ); if (Use["LikelihoodPCA"]) histLkPCA = new TH1F( "MVA_LikelihoodPCA", "MVA_LikelihoodPCA", nbin, -1, 1 ); if (Use["LikelihoodKDE"]) histLkKDE = new TH1F( "MVA_LikelihoodKDE", "MVA_LikelihoodKDE", nbin, -0.00001, 0.99999 ); if (Use["LikelihoodMIX"]) histLkMIX = new TH1F( "MVA_LikelihoodMIX", "MVA_LikelihoodMIX", nbin, 0, 1 ); if (Use["PDERS"]) histPD = new TH1F( "MVA_PDERS", "MVA_PDERS", nbin, 0, 1 ); if (Use["PDERSD"]) histPDD = new TH1F( "MVA_PDERSD", "MVA_PDERSD", nbin, 0, 1 ); if (Use["PDERSPCA"]) histPDPCA = new TH1F( "MVA_PDERSPCA", "MVA_PDERSPCA", nbin, 0, 1 ); if (Use["KNN"]) histKNN = new TH1F( "MVA_KNN", "MVA_KNN", nbin, 0, 1 ); if (Use["HMatrix"]) histHm = new TH1F( "MVA_HMatrix", "MVA_HMatrix", nbin, -0.95, 1.55 ); if (Use["Fisher"]) histFi = new TH1F( "MVA_Fisher", "MVA_Fisher", nbin, -4, 4 ); if (Use["FisherG"]) histFiG = new TH1F( "MVA_FisherG", "MVA_FisherG", nbin, -1, 1 ); if (Use["BoostedFisher"]) histFiB = new TH1F( "MVA_BoostedFisher", "MVA_BoostedFisher", nbin, -2, 2 ); if (Use["LD"]) histLD = new TH1F( "MVA_LD", "MVA_LD", nbin, -2, 2 ); if (Use["MLP"]) histNn = new TH1F( "MVA_MLP", "MVA_MLP", nbin, -1.25, 1.5 ); if (Use["MLPBFGS"]) histNnbfgs = new TH1F( "MVA_MLPBFGS", "MVA_MLPBFGS", nbin, -1.25, 1.5 ); if (Use["MLPBNN"]) histNnbnn = new TH1F( "MVA_MLPBNN", "MVA_MLPBNN", nbin, -1.25, 1.5 ); if (Use["CFMlpANN"]) histNnC = new TH1F( "MVA_CFMlpANN", "MVA_CFMlpANN", nbin, 0, 1 ); if (Use["TMlpANN"]) histNnT = new TH1F( "MVA_TMlpANN", "MVA_TMlpANN", nbin, -1.3, 1.3 ); if (Use["BDT"]) histBdt = new TH1F( "MVA_BDT", "MVA_BDT", nbin, -0.8, 0.8 ); if (Use["BDTD"]) histBdtD = new TH1F( "MVA_BDTD", "MVA_BDTD", nbin, -0.8, 0.8 ); if (Use["BDTG"]) histBdtG = new TH1F( "MVA_BDTG", "MVA_BDTG", nbin, -1.0, 1.0 ); if (Use["RuleFit"]) histRf = new TH1F( "MVA_RuleFit", "MVA_RuleFit", nbin, -2.0, 2.0 ); if (Use["SVM_Gauss"]) histSVMG = new TH1F( "MVA_SVM_Gauss", "MVA_SVM_Gauss", nbin, 0.0, 1.0 ); if (Use["SVM_Poly"]) histSVMP = new TH1F( "MVA_SVM_Poly", "MVA_SVM_Poly", nbin, 0.0, 1.0 ); if (Use["SVM_Lin"]) histSVML = new TH1F( "MVA_SVM_Lin", "MVA_SVM_Lin", nbin, 0.0, 1.0 ); if (Use["FDA_MT"]) histFDAMT = new TH1F( "MVA_FDA_MT", "MVA_FDA_MT", nbin, -2.0, 3.0 ); if (Use["FDA_GA"]) histFDAGA = new TH1F( "MVA_FDA_GA", "MVA_FDA_GA", nbin, -2.0, 3.0 ); if (Use["Category"]) histCat = new TH1F( "MVA_Category", "MVA_Category", nbin, -2., 2. ); if (Use["Plugin"]) histPBdt = new TH1F( "MVA_PBDT", "MVA_BDT", nbin, -0.8, 0.8 ); // PDEFoam also returns per-event error, fill in histogram, and also fill significance if (Use["PDEFoam"]) { histPDEFoam = new TH1F( "MVA_PDEFoam", "MVA_PDEFoam", nbin, 0, 1 ); histPDEFoamErr = new TH1F( "MVA_PDEFoamErr", "MVA_PDEFoam error", nbin, 0, 1 ); histPDEFoamSig = new TH1F( "MVA_PDEFoamSig", "MVA_PDEFoam significance", nbin, 0, 10 ); } // Book example histogram for probability (the other methods are done similarly) TH1F *probHistFi(0), *rarityHistFi(0); if (Use["Fisher"]) { probHistFi = new TH1F( "MVA_Fisher_Proba", "MVA_Fisher_Proba", nbin, 0, 1 ); rarityHistFi = new TH1F( "MVA_Fisher_Rarity", "MVA_Fisher_Rarity", nbin, 0, 1 ); } // Prepare input tree (this must be replaced by your data source) // in this example, there is a toy tree with signal and one with background events // we'll later on use only the "signal" events for the test in this example. // TFile *input(0); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// std::vector<string> samples_; std::vector<string> datasamples_; std::vector<TH1F*> datahists; std::vector<TH1F*> revDATAhists; float scales[] = {0.0978,1.491,0.0961,0.0253,0.0224,0.0145,0.0125,0.0160,0.0158,0.0341,0.0341,0.0341,0.020,0.0017,0.0055,0.0032,0.00084,0.02,19.145*0.0169,19.145*0.0169,19.145*0.0169,19.145*0.0169,19.145*0.0169}; //samples_.push_back("WJET.root"); samples_.push_back("ZJET.root"); samples_.push_back("PHJET200400.root"); samples_.push_back("WPHJET.root"); samples_.push_back("T-W-CH.root"); samples_.push_back("TBAR-W-CH.root"); samples_.push_back("T-S-CH.root"); samples_.push_back("TBAR-S-CH.root"); samples_.push_back("T-T-CH.root"); samples_.push_back("TBAR-T-CH.root"); samples_.push_back("TTBAR1.root"); samples_.push_back("TTBAR2.root"); samples_.push_back("TTBAR3.root"); samples_.push_back("TTG.root"); samples_.push_back("WWG.root"); samples_.push_back("WW.root"); samples_.push_back("WZ.root"); samples_.push_back("ZZ.root"); samples_.push_back("ZGAMMA.root"); samples_.push_back("SIGNAL.root"); samples_.push_back("SIGNAL.root"); samples_.push_back("SIGNAL.root"); samples_.push_back("SIGNAL.root"); samples_.push_back("SIGNAL.root"); datasamples_.push_back("REALDATA1.root"); datasamples_.push_back("REALDATA2.root"); datasamples_.push_back("REALDATA3.root"); std::vector<string> datasamplesreverse_; datasamplesreverse_.push_back("etarev/REALDATA1.root"); datasamplesreverse_.push_back("etarev/REALDATA2.root"); datasamplesreverse_.push_back("etarev/REALDATA3.root"); std::vector<string> systematics; //systematics.push_back("__JES__plus"); //systematics.push_back("__JES__minus"); //systematics.push_back("__JER__plus"); //systematics.push_back("__JER__minus"); systematics.push_back("__PU__plus"); systematics.push_back("__PU__minus"); systematics.push_back("__TRIG__plus"); systematics.push_back("__TRIG__minus"); systematics.push_back("__BTAG__plus"); systematics.push_back("__BTAG__minus"); systematics.push_back("__MISSTAG__plus"); systematics.push_back("__MISSTAG__minus"); systematics.push_back("__MUON__plus"); systematics.push_back("__MUON__minus"); systematics.push_back("__PHOTON__plus"); systematics.push_back("__PHOTON__minus"); systematics.push_back(""); map<string, double> eventwight; TList* hList = new TList(); // list of histograms to store std::vector<TFile*> files; for(unsigned int idx=0; idx<samples_.size(); ++idx){ files.push_back(new TFile(samples_[idx].c_str())); } std::vector<TFile*> datafiles; for(unsigned int idx=0; idx<datasamples_.size(); ++idx){ datafiles.push_back(new TFile(datasamples_[idx].c_str())); } for(unsigned int phi=0; phi<systematics.size(); ++phi){ std::vector<TH1F*> hists; TH1F *wphjethist(0), *zjethist(0) , *phjethist(0), *wjethist(0), *twchhist(0), *tbarwhist(0), *tschhist(0), *tbarschhist(0), *ttchhist(0), *tbartchhist(0), *tt1hist(0) ,*tt2hist(0), *tt3hist(0), *ttphhist(0), *wwphhist(0), *wwhist(0), *wzhist(0), *zzhist(0), *zgammahist(0), *signalhist5(0) , *signalhist10(0), *signalhist20(0), *signalhist30(0), *signalhist40(0); TH1F *data1histrev(0), *data2histrev(0) ,*data3histrev(0); wphjethist = new TH1F( std::string("BDT__wphjethist").append(systematics[phi]).c_str(), std::string("BDT__wphjethist").append(systematics[phi]).c_str() , nbin, -1, 1 ); zjethist = new TH1F( std::string("BDT__zjethist").append(systematics[phi]).c_str(), std::string("BDT__zjethist").append(systematics[phi]).c_str(), nbin, -1, 1 ); phjethist = new TH1F( std::string("BDT__phjethist").append(systematics[phi]).c_str(),std::string("BDT__phjethist").append(systematics[phi]).c_str() , nbin, -1, 1 ); //wjethist = new TH1F( std::string("BDT__wjethist").append(systematics[phi]).c_str(),std::string("BDT__wjethist").append(systematics[phi]).c_str() , nbin, -0.8, 0.8 ); twchhist = new TH1F( std::string("BDT__twchhist").append(systematics[phi]).c_str(),std::string("BDT__twchhist").append(systematics[phi]).c_str() ,nbin, -1, 1 ); tbarwhist = new TH1F( std::string("BDT__tbarwhist").append(systematics[phi]).c_str(),std::string("BDT__tbarwhist").append(systematics[phi]).c_str() ,nbin, -1, 1 ); tschhist = new TH1F( std::string("BDT__tschhist").append(systematics[phi]).c_str(), std::string("BDT__tschhist").append(systematics[phi]).c_str(), nbin, -1, 1 ); tbarschhist = new TH1F( std::string("BDT__tbarschhist").append(systematics[phi]).c_str(),std::string("BDT__tbarschhist").append(systematics[phi]).c_str(), nbin, -1, 1 ); ttchhist = new TH1F( std::string("BDT__ttchhist").append(systematics[phi]).c_str(),std::string("BDT__ttchhist").append(systematics[phi]).c_str(), nbin, -1, 1 ); tbartchhist = new TH1F( std::string("BDT__tbartchhist").append(systematics[phi]).c_str(), std::string("BDT__tbartchhist").append(systematics[phi]).c_str(), nbin, -1, 1 ); tt1hist = new TH1F( std::string("BDT__tt1hist").append(systematics[phi]).c_str(), std::string("BDT__tt1hist").append(systematics[phi]).c_str(), nbin, -1, 1 ); tt2hist = new TH1F( std::string("BDT__tt2hist").append(systematics[phi]).c_str(), std::string("BDT__tt2hist").append(systematics[phi]).c_str(), nbin, -1, 1 ); tt3hist = new TH1F( std::string("BDT__tt3hist").append(systematics[phi]).c_str(),std::string("BDT__tt3hist").append(systematics[phi]).c_str() , nbin, -1, 1 ); ttphhist = new TH1F( std::string("BDT__ttphhist").append(systematics[phi]).c_str(),std::string("BDT__ttphhist").append(systematics[phi]).c_str() ,nbin, -1, 1 ); wwphhist = new TH1F( std::string("BDT__wwphhist").append(systematics[phi]).c_str(),std::string("BDT__wwphhist").append(systematics[phi]).c_str(), nbin, -1, 1 ); wwhist = new TH1F( std::string("BDT__wwhist").append(systematics[phi]).c_str(),std::string("BDT__wwhist").append(systematics[phi]).c_str() ,nbin, -1, 1 ); wzhist = new TH1F( std::string("BDT__wzhist").append(systematics[phi]).c_str(),std::string("BDT__wzhist").append(systematics[phi]).c_str(), nbin, -1, 1 ); zzhist = new TH1F( std::string("BDT__zzhist").append(systematics[phi]).c_str(),std::string("BDT__zzhist").append(systematics[phi]).c_str() ,nbin, -1, 1 ); zgammahist = new TH1F( std::string("BDT__zgammahist").append(systematics[phi]).c_str(),std::string("BDT__zgammahist").append(systematics[phi]).c_str() ,nbin, -1, 1 ); signalhist5 = new TH1F( std::string("BDT__signal5").append(systematics[phi]).c_str(),std::string("BDT__signal5").append(systematics[phi]).c_str() ,nbin, -1, 1 ); signalhist10 = new TH1F( std::string("BDT__signal10").append(systematics[phi]).c_str(),std::string("BDT__signal10").append(systematics[phi]).c_str() ,nbin, -1, 1 ); signalhist20 = new TH1F( std::string("BDT__signal20").append(systematics[phi]).c_str(),std::string("BDT__signal20").append(systematics[phi]).c_str() ,nbin, -1, 1 ); signalhist30 = new TH1F( std::string("BDT__signal30").append(systematics[phi]).c_str(),std::string("BDT__signal30").append(systematics[phi]).c_str() ,nbin, -1, 1 ); signalhist40 = new TH1F( std::string("BDT__signal40").append(systematics[phi]).c_str(),std::string("BDT__signal40").append(systematics[phi]).c_str() ,nbin, -1, 1 ); hists.push_back(zjethist); hists.push_back(phjethist); hists.push_back(wphjethist); //hists.push_back(wjethist); hists.push_back(twchhist); hists.push_back(tbarwhist); hists.push_back(tschhist); hists.push_back(tbarschhist); hists.push_back(ttchhist); hists.push_back(tbartchhist); hists.push_back(tt1hist); hists.push_back(tt2hist); hists.push_back(tt3hist); hists.push_back(ttphhist); hists.push_back(wwphhist); hists.push_back(wwhist); hists.push_back(wzhist); hists.push_back(zzhist); hists.push_back(zgammahist); hists.push_back(signalhist5); hists.push_back(signalhist10); hists.push_back(signalhist20); hists.push_back(signalhist30); hists.push_back(signalhist40); for(unsigned int idx=0; idx<samples_.size(); ++idx){ TFile *input(0); TString fname =samples_[idx]; if (!gSystem->AccessPathName( fname )) input = TFile::Open( fname ); // check if file in local directory exists else input = TFile::Open( "http://root.cern.ch/files/tmva_class_example.root" ); // if not: download from ROOT server if (!input) { std::cout << "ERROR: could not open data file" << std::endl; exit(1); } std::cout << "--- TMVAClassificationApp : Using input file: " << input->GetName() << std::endl; // --- Event loop // Prepare the event tree // - here the variable names have to corres[1]ponds to your tree // - you can use the same variables as above which is slightly faster, // but of course you can use different ones and copy the values inside the event loop // //Double_t myptphoton,myetaphoton,myptmuon,myetamuon,myptjet,myetajet,mymasstop,mymtw,mydeltaRphotonjet,mydeltaRphotonmuon,myht,mycostopphoton,mydeltaphiphotonmet,mycvsdiscriminant,myjetmultiplicity,mybjetmultiplicity,myleptoncharge; std::vector<double> *myptphoton=0; std::vector<double> *myetaphoton=0; std::vector<double> *myptmuon=0; std::vector<double> *myetamuon=0; std::vector<double> *myptjet=0; std::vector<double> *myetajet=0; std::vector<double> *mymasstop=0; //std::vector<double> *mymtw=0; std::vector<double> *mydeltaRphotonjet=0; std::vector<double> *mydeltaRphotonmuon=0; //std::vector<double> *myht=0; std::vector<double> *mycostopphoton=0; std::vector<double> *mydeltaphiphotonmet=0; std::vector<double> *mycvsdiscriminant=0; std::vector<double> *myjetmultiplicity=0; //std::vector<double> *mybjetmultiplicity=0; //std::vector<double> *myleptoncharge=0; std::vector<double> *myweight=0; std::vector<double> *mybtagSF=0; std::vector<double> *mybtagSFup=0; std::vector<double> *mybtagSFdown=0; std::vector<double> *mymistagSFup=0; std::vector<double> *mymistagSFdown=0; std::vector<double> *mytriggerSF=0; std::vector<double> *mytriggerSFup=0; std::vector<double> *mytriggerSFdown=0; std::vector<double> *myphotonSF=0; std::vector<double> *myphotonSFup=0; std::vector<double> *myphotonSFdown=0; std::vector<double> *mypileupSF=0; std::vector<double> *mypileupSFup=0; std::vector<double> *mypileupSFdown=0; std::vector<double> *mymuonSFup=0; std::vector<double> *mymuonSFdown=0; std::vector<double> *mymuonSF=0; std::cout << "--- Select signal sample" << std::endl; TTree* theTree = (TTree*)input->Get("analyzestep2/atq"); // Int_t myjetmultiplicity, mybjetmultiplicity , myleptoncharge; // Float_t userVar1, userVar2; theTree->SetBranchAddress("ptphoton", &myptphoton ); theTree->SetBranchAddress( "etaphoton", &myetaphoton ); theTree->SetBranchAddress( "ptmuon", &myptmuon ); theTree->SetBranchAddress( "etamuon", &myetamuon ); theTree->SetBranchAddress( "ptjet", &myptjet ); theTree->SetBranchAddress( "etajet", &myetajet ); theTree->SetBranchAddress( "masstop", &mymasstop ); // theTree->SetBranchAddress( "mtw", &mymtw ); theTree->SetBranchAddress( "deltaRphotonjet", &mydeltaRphotonjet ); theTree->SetBranchAddress( "deltaRphotonmuon", &mydeltaRphotonmuon ); // theTree->SetBranchAddress( "ht", &myht ); theTree->SetBranchAddress( "costopphoton", &mycostopphoton ); theTree->SetBranchAddress( "jetmultiplicity", &myjetmultiplicity ); // theTree->SetBranchAddress( "bjetmultiplicity", &mybjetmultiplicity ); theTree->SetBranchAddress( "deltaphiphotonmet", &mydeltaphiphotonmet ); theTree->SetBranchAddress( "cvsdiscriminant", &mycvsdiscriminant ); // theTree->SetBranchAddress( "leptoncharge", &myleptoncharge ); theTree->SetBranchAddress( "weight", &myweight); theTree->SetBranchAddress( "btagSF", &mybtagSF); theTree->SetBranchAddress( "btagSFup", &mybtagSFup); theTree->SetBranchAddress( "btagSFdown", &mybtagSFdown); theTree->SetBranchAddress( "mistagSFup", &mymistagSFup); theTree->SetBranchAddress( "mistagSFdown", &mymistagSFdown); theTree->SetBranchAddress( "triggerSF", &mytriggerSF); theTree->SetBranchAddress( "triggerSFup", &mytriggerSFup); theTree->SetBranchAddress( "triggerSFdown", &mytriggerSFdown); theTree->SetBranchAddress( "photonSF", &myphotonSF); theTree->SetBranchAddress( "photonSFup", &myphotonSFup); theTree->SetBranchAddress( "photonSFdown", &myphotonSFdown); theTree->SetBranchAddress( "muonSF", &mymuonSF); theTree->SetBranchAddress( "muonSFup", &mymuonSFup); theTree->SetBranchAddress( "muonSFdown", &mymuonSFdown); theTree->SetBranchAddress( "pileupSF", &mypileupSF); theTree->SetBranchAddress( "pileupSFup", &mypileupSFup); theTree->SetBranchAddress( "pileupSFdown", &mypileupSFdown); // Efficiency calculator for cut method Int_t nSelCutsGA = 0; Double_t effS = 0.7; std::vector<Float_t> vecVar(4); // vector for EvaluateMVA tests // std::cout << "--- Processing: " << theTree->GetEntries() << " events" << std::endl; TStopwatch sw; sw.Start(); for (Long64_t ievt=0; ievt<theTree->GetEntries();ievt++) { // std::cout << "--- ... Processing event: " << ievt << std::endl; double finalweight; if (ievt%1000 == 0) std::cout << "--- ... Processing event: " << ievt << std::endl; theTree->GetEntry(ievt); //for (int l=0;l<sizeof(myptphoton);l++){ //std::cout << "--- ... reza: " << myptphoton[l] <<std::endl; //} //std::cout << "--- ......................."<< (*mycvsdiscriminant)[0]<<std::endl; // --- Return the MVA outputs and fill into histograms ptphoton=(float)(*myptphoton)[0]; etaphoton=(float)(*myetaphoton )[0]; ptmuon=(float)(*myptmuon )[0]; etamuon=(float)(*myetamuon )[0]; ptjet=(float)(*myptjet )[0]; etajet=(float)(*myetajet )[0]; masstop=(float)(*mymasstop )[0]; //mtw=(float)(*mymtw )[0]; deltaRphotonjet=(float)(*mydeltaRphotonjet )[0]; deltaRphotonmuon=(float)(*mydeltaRphotonmuon )[0]; //ht=(float)(*myht )[0]; costopphoton=(float)(*mycostopphoton )[0]; jetmultiplicity=(float)(*myjetmultiplicity )[0]; //bjetmultiplicity=(float)(*mybjetmultiplicity )[0]; deltaphiphotonmet=(float)(*mydeltaphiphotonmet )[0]; cvsdiscriminant=(float)(*mycvsdiscriminant)[0]; //leptoncharge=(float)(*myleptoncharge )[0]; finalweight=(*myweight)[0]; //cout<<(*myweight)[0]<<endl; eventwight["__PU__plus"]=(*myweight)[0]*(*mypileupSFup)[0]/(*mypileupSF)[0]; eventwight["__PU__minus"]=(*myweight)[0]*(*mypileupSFdown)[0]/(*mypileupSF)[0]; eventwight["__TRIG__plus"]=(*myweight)[0]*(*mytriggerSFup)[0]/(*mytriggerSF)[0]; eventwight["__TRIG__minus"]=(*myweight)[0]*(*mytriggerSFdown)[0]/(*mytriggerSF)[0]; eventwight["__BTAG__plus"]=(*myweight)[0]*(*mybtagSFup)[0]/(*mybtagSF)[0]; eventwight["__BTAG__minus"]=(*myweight)[0]*(*mybtagSFdown)[0]/(*mybtagSF)[0]; eventwight["__MISSTAG__plus"]=(*myweight)[0]*(*mymistagSFup)[0]/(*mybtagSF)[0]; eventwight["__MISSTAG__minus"]=(*myweight)[0]*(*mymistagSFdown)[0]/(*mybtagSF)[0]; eventwight["__MUON__plus"]=(*myweight)[0]*(*mymuonSFup)[0]/(*mymuonSF)[0]; eventwight["__MUON__minus"]=(*myweight)[0]*(*mymuonSFdown)[0]/(*mymuonSF)[0]; eventwight["__PHOTON__plus"]=(*myweight)[0]*(*myphotonSFup)[0]/(*myphotonSF)[0]; eventwight["__PHOTON__minus"]=(*myweight)[0]*(*myphotonSFdown)[0]/(*myphotonSF)[0]; eventwight[""]=(*myweight)[0]; finalweight=eventwight[systematics[phi].c_str()]; if (samples_[idx]=="SIGNAL.root") finalweight=(*myweight)[0]; //if (samples_[idx]=="WPHJET") finalweight=(*mypileupSF)[0]*(*mytriggerSF)[0]*(*mybtagSF)[0]*(*mymuonSF)[0]*(*myphotonSF)[0]; //if (finalweight<0) finalweight=30; //cout<<"negative event weight"<<finalweight<<" "<<ptphoton<<endl; if (Use["CutsGA"]) { // Cuts is a special case: give the desired signal efficienciy Bool_t passed = reader->EvaluateMVA( "CutsGA method", effS ); if (passed) nSelCutsGA++; } hists[idx] ->Fill( reader->EvaluateMVA( "BDT method" ),finalweight* scales[idx] ); //cout<<reader->EvaluateMVA( "BDT method")<<" "<<finalweight<<endl; //cout<<(*myweight)[0]<<endl; // Retrieve also per-event error if (Use["PDEFoam"]) { Double_t val = reader->EvaluateMVA( "PDEFoam method" ); Double_t err = reader->GetMVAError(); histPDEFoam ->Fill( val ); histPDEFoamErr->Fill( err ); if (err>1.e-50) histPDEFoamSig->Fill( val/err ); } // Retrieve probability instead of MVA output if (Use["Fisher"]) { probHistFi ->Fill( reader->GetProba ( "Fisher method" ) ); rarityHistFi->Fill( reader->GetRarity( "Fisher method" ) ); } //delete finalweight; } // Get elapsed time sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); // Get efficiency for cuts classifier if (Use["CutsGA"]) std::cout << "--- Efficiency for CutsGA method: " << double(nSelCutsGA)/theTree->GetEntries() << " (for a required signal efficiency of " << effS << ")" << std::endl; if (Use["CutsGA"]) { // test: retrieve cuts for particular signal efficiency // CINT ignores dynamic_casts so we have to use a cuts-secific Reader function to acces the pointer TMVA::MethodCuts* mcuts = reader->FindCutsMVA( "CutsGA method" ) ; if (mcuts) { std::vector<Double_t> cutsMin; std::vector<Double_t> cutsMax; mcuts->GetCuts( 0.7, cutsMin, cutsMax ); std::cout << "--- -------------------------------------------------------------" << std::endl; std::cout << "--- Retrieve cut values for signal efficiency of 0.7 from Reader" << std::endl; for (UInt_t ivar=0; ivar<cutsMin.size(); ivar++) { std::cout << "... Cut: " << cutsMin[ivar] << " < \"" << mcuts->GetInputVar(ivar) << "\" <= " << cutsMax[ivar] << std::endl; } std::cout << "--- -------------------------------------------------------------" << std::endl; } } delete myptphoton; delete myetaphoton; delete myptmuon; delete myetamuon; delete myptjet; delete myetajet; delete mymasstop; //delete mymtw; delete mydeltaRphotonjet; delete mydeltaRphotonmuon; //delete myht; delete mycostopphoton; delete mydeltaphiphotonmet; delete mycvsdiscriminant; delete myjetmultiplicity; //delete mybjetmultiplicity; //delete myleptoncharge; //delete myplot; delete mybtagSF; delete mybtagSFup; delete mybtagSFdown; delete mymistagSFup; delete mytriggerSF; delete mytriggerSFup; delete mytriggerSFdown; delete myphotonSF; delete myphotonSFup; delete myphotonSFdown; delete mypileupSF; delete mypileupSFup; delete mypileupSFdown; delete input; if (idx==samples_.size()-5) hists[idx]->Scale(5/hists[idx]->Integral()); if (idx==samples_.size()-4) hists[idx]->Scale(10/hists[idx]->Integral()); if (idx==samples_.size()-3) hists[idx]->Scale(20/hists[idx]->Integral()); if (idx==samples_.size()-2) hists[idx]->Scale(30/hists[idx]->Integral()); if (idx==samples_.size()-1) hists[idx]->Scale(40/hists[idx]->Integral()); if (samples_[idx]=="WPHJET.root") hists[idx]->Scale(3173/hists[idx]->Integral()); if (samples_[idx]=="TTBAR2.root") hists[idx]->Add(hists[idx-1]); if (samples_[idx]=="TTBAR3.root") hists[idx]->Add(hists[idx-1]); if (!(samples_[idx]=="TTBAR1.root" || samples_[idx]=="TTBAR2.root")) hList->Add(hists[idx]); } } TH1F *data1hist(0), *data2hist(0) ,*data3hist(0); data1hist = new TH1F( "mu_BDT__data1hist", "mu_BDT__data1hist", nbin, -1, 1 ); data2hist = new TH1F( "mu_BDT__data2hist", "mu_BDT__data2hist", nbin, -1, 1 ); data3hist = new TH1F( "BDT__DATA", "BDT__DATA", nbin, -1, 1 ); datahists.push_back(data1hist); datahists.push_back(data2hist); datahists.push_back(data3hist); for(unsigned int idx=0; idx<datasamples_.size(); ++idx){ TFile *input(0); TString fname =datasamples_[idx]; if (!gSystem->AccessPathName( fname )) input = TFile::Open( fname ); // check if file in local directory exists else input = TFile::Open( "http://root.cern.ch/files/tmva_class_example.root" ); // if not: download from ROOT server if (!input) { std::cout << "ERROR: could not open data file" << std::endl; exit(1); } std::cout << "--- TMVAClassificationApp : Using input file: " << input->GetName() << std::endl; // --- Event loop // Prepare the event tree // - here the variable names have to corres[1]ponds to your tree // - you can use the same variables as above which is slightly faster, // but of course you can use different ones and copy the values inside the event loop // std::vector<double> *myptphoton=0; std::vector<double> *myetaphoton=0; std::vector<double> *myptmuon=0; std::vector<double> *myetamuon=0; std::vector<double> *myptjet=0; std::vector<double> *myetajet=0; std::vector<double> *mymasstop=0; //std::vector<double> *mymtw=0; std::vector<double> *mydeltaRphotonjet=0; std::vector<double> *mydeltaRphotonmuon=0; //std::vector<double> *myht=0; std::vector<double> *mycostopphoton=0; std::vector<double> *mydeltaphiphotonmet=0; std::vector<double> *mycvsdiscriminant=0; std::vector<double> *myjetmultiplicity=0; //std::vector<double> *mybjetmultiplicity=0; //std::vector<double> *myleptoncharge=0; std::cout << "--- Select signal sample" << std::endl; TTree* theTree = (TTree*)input->Get("analyzestep2/atq"); // Int_t myjetmultiplicity, mybjetmultiplicity , myleptoncharge; // Float_t userVar1, userVar2; theTree->SetBranchAddress("ptphoton", &myptphoton ); theTree->SetBranchAddress( "etaphoton", &myetaphoton ); theTree->SetBranchAddress( "ptmuon", &myptmuon ); theTree->SetBranchAddress( "etamuon", &myetamuon ); theTree->SetBranchAddress( "ptjet", &myptjet ); theTree->SetBranchAddress( "etajet", &myetajet ); theTree->SetBranchAddress( "masstop", &mymasstop ); // theTree->SetBranchAddress( "mtw", &mymtw ); theTree->SetBranchAddress( "deltaRphotonjet", &mydeltaRphotonjet ); theTree->SetBranchAddress( "deltaRphotonmuon", &mydeltaRphotonmuon ); // theTree->SetBranchAddress( "ht", &myht ); theTree->SetBranchAddress( "costopphoton", &mycostopphoton ); theTree->SetBranchAddress( "jetmultiplicity", &myjetmultiplicity ); // theTree->SetBranchAddress( "bjetmultiplicity", &mybjetmultiplicity ); theTree->SetBranchAddress( "deltaphiphotonmet", &mydeltaphiphotonmet ); theTree->SetBranchAddress( "cvsdiscriminant", &mycvsdiscriminant ); // theTree->SetBranchAddress( "leptoncharge", &myleptoncharge ); // Efficiency calculator for cut method Int_t nSelCutsGA = 0; Double_t effS = 0.7; std::vector<Float_t> vecVar(4); // vector for EvaluateMVA tests std::cout << "--- Processing: " << theTree->GetEntries() << " events" << std::endl; TStopwatch sw; sw.Start(); for (Long64_t ievt=0; ievt<theTree->GetEntries();ievt++) { // std::cout << "--- ... Processing event: " << ievt << std::endl; if (ievt%1000 == 0) std::cout << "--- ... Processing event: " << ievt << std::endl; theTree->GetEntry(ievt); //for (int l=0;l<sizeof(myptphoton);l++){ //std::cout << "--- ... reza: " << myptphoton[l] <<std::endl; //} //std::cout << "--- ......................."<< (*mycvsdiscriminant)[0]<<std::endl; // --- Return the MVA outputs and fill into histograms ptphoton=(float)(*myptphoton)[0]; etaphoton=(float)(*myetaphoton )[0]; ptmuon=(float)(*myptmuon )[0]; etamuon=(float)(*myetamuon )[0]; ptjet=(float)(*myptjet )[0]; etajet=(float)(*myetajet )[0]; masstop=(float)(*mymasstop )[0]; //mtw=(float)(*mymtw )[0]; deltaRphotonjet=(float)(*mydeltaRphotonjet )[0]; deltaRphotonmuon=(float)(*mydeltaRphotonmuon )[0]; //ht=(float)(*myht )[0]; costopphoton=(float)(*mycostopphoton )[0]; jetmultiplicity=(float)(*myjetmultiplicity )[0]; //bjetmultiplicity=(float)(*mybjetmultiplicity )[0]; deltaphiphotonmet=(float)(*mydeltaphiphotonmet )[0]; cvsdiscriminant=(float)(*mycvsdiscriminant)[0]; //leptoncharge=(float)(*myleptoncharge )[0]; if (Use["CutsGA"]) { // Cuts is a special case: give the desired signal efficienciy Bool_t passed = reader->EvaluateMVA( "CutsGA method", effS ); if (passed) nSelCutsGA++; } if (Use["Likelihood" ]) histLk ->Fill( reader->EvaluateMVA( "Likelihood method" ) ); if (Use["LikelihoodD" ]) histLkD ->Fill( reader->EvaluateMVA( "LikelihoodD method" ) ); if (Use["LikelihoodPCA"]) histLkPCA ->Fill( reader->EvaluateMVA( "LikelihoodPCA method" ) ); if (Use["LikelihoodKDE"]) histLkKDE ->Fill( reader->EvaluateMVA( "LikelihoodKDE method" ) ); if (Use["LikelihoodMIX"]) histLkMIX ->Fill( reader->EvaluateMVA( "LikelihoodMIX method" ) ); if (Use["PDERS" ]) histPD ->Fill( reader->EvaluateMVA( "PDERS method" ) ); if (Use["PDERSD" ]) histPDD ->Fill( reader->EvaluateMVA( "PDERSD method" ) ); if (Use["PDERSPCA" ]) histPDPCA ->Fill( reader->EvaluateMVA( "PDERSPCA method" ) ); if (Use["KNN" ]) histKNN ->Fill( reader->EvaluateMVA( "KNN method" ) ); if (Use["HMatrix" ]) histHm ->Fill( reader->EvaluateMVA( "HMatrix method" ) ); if (Use["Fisher" ]) histFi ->Fill( reader->EvaluateMVA( "Fisher method" ) ); if (Use["FisherG" ]) histFiG ->Fill( reader->EvaluateMVA( "FisherG method" ) ); if (Use["BoostedFisher"]) histFiB ->Fill( reader->EvaluateMVA( "BoostedFisher method" ) ); if (Use["LD" ]) histLD ->Fill( reader->EvaluateMVA( "LD method" ) ); if (Use["MLP" ]) histNn ->Fill( reader->EvaluateMVA( "MLP method" ) ); if (Use["MLPBFGS" ]) histNnbfgs ->Fill( reader->EvaluateMVA( "MLPBFGS method" ) ); if (Use["MLPBNN" ]) histNnbnn ->Fill( reader->EvaluateMVA( "MLPBNN method" ) ); if (Use["CFMlpANN" ]) histNnC ->Fill( reader->EvaluateMVA( "CFMlpANN method" ) ); if (Use["TMlpANN" ]) histNnT ->Fill( reader->EvaluateMVA( "TMlpANN method" ) ); if (Use["BDT" ]) histBdt ->Fill( reader->EvaluateMVA( "BDT method" ) ); if (Use["BDTD" ]) histBdtD ->Fill( reader->EvaluateMVA( "BDTD method" ) ); if (Use["BDTG" ]) histBdtG ->Fill( reader->EvaluateMVA( "BDTG method" ) ); if (Use["RuleFit" ]) histRf ->Fill( reader->EvaluateMVA( "RuleFit method" ) ); if (Use["SVM_Gauss" ]) histSVMG ->Fill( reader->EvaluateMVA( "SVM_Gauss method" ) ); if (Use["SVM_Poly" ]) histSVMP ->Fill( reader->EvaluateMVA( "SVM_Poly method" ) ); if (Use["SVM_Lin" ]) histSVML ->Fill( reader->EvaluateMVA( "SVM_Lin method" ) ); if (Use["FDA_MT" ]) histFDAMT ->Fill( reader->EvaluateMVA( "FDA_MT method" ) ); if (Use["FDA_GA" ]) histFDAGA ->Fill( reader->EvaluateMVA( "FDA_GA method" ) ); if (Use["Category" ]) histCat ->Fill( reader->EvaluateMVA( "Category method" ) ); if (Use["Plugin" ]) histPBdt ->Fill( reader->EvaluateMVA( "P_BDT method" ) ); datahists[idx] ->Fill( reader->EvaluateMVA( "BDT method" ) ); } // Get elapsed time sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); delete myptphoton; delete myetaphoton; delete myptmuon; delete myetamuon; delete myptjet; delete myetajet; delete mymasstop; //delete mymtw; delete mydeltaRphotonjet; delete mydeltaRphotonmuon; //delete myht; delete mycostopphoton; delete mydeltaphiphotonmet; delete mycvsdiscriminant; delete myjetmultiplicity; //delete mybjetmultiplicity; //delete myleptoncharge; //delete myplot; delete input; } for(unsigned int idx=1; idx<datasamples_.size(); ++idx){ datahists[idx]->Add(datahists[idx-1]); } hList->Add(datahists[2]); TH1F *data1histrev(0), *data2histrev(0) ,*data3histrev(0); data1histrev = new TH1F( "BDT__data1histrev", "BDT__data1histrev", nbin, -1, 1 ); data2histrev = new TH1F( "BDT__data2histrev", "BDT__data2histrev", nbin, -1, 1 ); data3histrev = new TH1F( "BDT__wjet", "BDT__wjet", nbin, -1, 1 ); revDATAhists.push_back(data1histrev); revDATAhists.push_back(data2histrev); revDATAhists.push_back(data3histrev); for(unsigned int idx=0; idx<datasamplesreverse_.size(); ++idx){ TFile *input(0); TString fname =datasamplesreverse_[idx]; if (!gSystem->AccessPathName( fname )) input = TFile::Open( fname ); // check if file in local directory exists else input = TFile::Open( "http://root.cern.ch/files/tmva_class_example.root" ); // if not: download from ROOT server if (!input) { std::cout << "ERROR: could not open data file" << std::endl; exit(1); } std::cout << "--- TMVAClassificationApp : Using input file: " << input->GetName() << std::endl; // --- Event loop // // // Prepare the event tree // // - here the variable names have to corres[1]ponds to your tree // // - you can use the same variables as above which is slightly faster, // // but of course you can use different ones and copy the values inside the event loop // // // Double_t myptphoton,myetaphoton,myptmuon,myetamuon,myptjet,myetajet,mymasstop,mymtw,mydeltaRphotonjet,mydeltaRphotonmuon,myht,mycostopphoton,mydeltaphiphotonmet,mycvsdiscriminant,myjetmultiplicity,mybjetmultiplicity,myleptoncharge; std::vector<double> *myptphoton=0; std::vector<double> *myetaphoton=0; std::vector<double> *myptmuon=0; std::vector<double> *myetamuon=0; std::vector<double> *myptjet=0; std::vector<double> *myetajet=0; std::vector<double> *mymasstop=0; //std::vector<double> *mymtw=0; std::vector<double> *mydeltaRphotonjet=0; std::vector<double> *mydeltaRphotonmuon=0; //std::vector<double> *myht=0; std::vector<double> *mycostopphoton=0; std::vector<double> *mydeltaphiphotonmet=0; std::vector<double> *mycvsdiscriminant=0; std::vector<double> *myjetmultiplicity=0; //std::vector<double> *mybjetmultiplicity=0; //std::vector<double> *myleptoncharge=0; TTree* theTree = (TTree*)input->Get("analyzestep2/atq"); theTree->SetBranchAddress("ptphoton", &myptphoton ); theTree->SetBranchAddress( "etaphoton", &myetaphoton ); theTree->SetBranchAddress( "ptmuon", &myptmuon ); theTree->SetBranchAddress( "etamuon", &myetamuon ); theTree->SetBranchAddress( "ptjet", &myptjet ); theTree->SetBranchAddress( "etajet", &myetajet ); theTree->SetBranchAddress( "masstop", &mymasstop ); // theTree->SetBranchAddress( "mtw", &mymtw ); theTree->SetBranchAddress( "deltaRphotonjet", &mydeltaRphotonjet ); theTree->SetBranchAddress( "deltaRphotonmuon", &mydeltaRphotonmuon ); // theTree->SetBranchAddress( "ht", &myht ); theTree->SetBranchAddress( "costopphoton", &mycostopphoton ); theTree->SetBranchAddress( "jetmultiplicity", &myjetmultiplicity ); // theTree->SetBranchAddress( "bjetmultiplicity", &mybjetmultiplicity ); theTree->SetBranchAddress( "deltaphiphotonmet", &mydeltaphiphotonmet ); theTree->SetBranchAddress( "cvsdiscriminant", &mycvsdiscriminant ); // theTree->SetBranchAddress( "leptoncharge", &myleptoncharge ); // Efficiency calculator for cut method Int_t nSelCutsGA = 0; Double_t effS = 0.7; std::vector<Float_t> vecVar(4); // vector for EvaluateMVA tests std::cout << "--- Processing: " << theTree->GetEntries() << " events" << std::endl; TStopwatch sw; sw.Start(); for (Long64_t ievt=0; ievt<theTree->GetEntries();ievt++) { // std::cout << "--- ... Processing event: " << ievt << std::endl; if (ievt%1000 == 0) std::cout << "--- ... Processing event: " << ievt << std::endl; theTree->GetEntry(ievt); //for (int l=0;l<sizeof(myptphoton);l++){ //std::cout << "--- ... reza: " << myptphoton[l] <<std::endl; //} // std::cout << "--- ......................."<< (*mycvsdiscriminant)[0]<<std::endl; // --- Return the MVA outputs and fill into histograms ptphoton=(float)(*myptphoton)[0]; etaphoton=(float)(*myetaphoton )[0]; ptmuon=(float)(*myptmuon )[0]; etamuon=(float)(*myetamuon )[0]; ptjet=(float)(*myptjet )[0]; etajet=(float)(*myetajet )[0]; masstop=(float)(*mymasstop )[0]; //mtw=(float)(*mymtw )[0]; deltaRphotonjet=(float)(*mydeltaRphotonjet )[0]; deltaRphotonmuon=(float)(*mydeltaRphotonmuon )[0]; //ht=(float)(*myht )[0]; costopphoton=(float)(*mycostopphoton )[0]; jetmultiplicity=(float)(*myjetmultiplicity )[0]; //bjetmultiplicity=(float)(*mybjetmultiplicity )[0]; deltaphiphotonmet=(float)(*mydeltaphiphotonmet )[0]; cvsdiscriminant=(float)(*mycvsdiscriminant)[0]; //leptoncharge=(float)(*myleptoncharge )[0]; if (Use["Likelihood" ]) histLk ->Fill( reader->EvaluateMVA( "Likelihood method" ) ); if (Use["LikelihoodD" ]) histLkD ->Fill( reader->EvaluateMVA( "LikelihoodD method" ) ); if (Use["LikelihoodPCA"]) histLkPCA ->Fill( reader->EvaluateMVA( "LikelihoodPCA method" ) ); if (Use["LikelihoodKDE"]) histLkKDE ->Fill( reader->EvaluateMVA( "LikelihoodKDE method" ) ); if (Use["LikelihoodMIX"]) histLkMIX ->Fill( reader->EvaluateMVA( "LikelihoodMIX method" ) ); if (Use["PDERS" ]) histPD ->Fill( reader->EvaluateMVA( "PDERS method" ) ); if (Use["PDERSD" ]) histPDD ->Fill( reader->EvaluateMVA( "PDERSD method" ) ); if (Use["PDERSPCA" ]) histPDPCA ->Fill( reader->EvaluateMVA( "PDERSPCA method" ) ); if (Use["KNN" ]) histKNN ->Fill( reader->EvaluateMVA( "KNN method" ) ); if (Use["HMatrix" ]) histHm ->Fill( reader->EvaluateMVA( "HMatrix method" ) ); if (Use["Fisher" ]) histFi ->Fill( reader->EvaluateMVA( "Fisher method" ) ); if (Use["FisherG" ]) histFiG ->Fill( reader->EvaluateMVA( "FisherG method" ) ); if (Use["BoostedFisher"]) histFiB ->Fill( reader->EvaluateMVA( "BoostedFisher method" ) ); if (Use["LD" ]) histLD ->Fill( reader->EvaluateMVA( "LD method" ) ); if (Use["MLP" ]) histNn ->Fill( reader->EvaluateMVA( "MLP method" ) ); if (Use["MLPBFGS" ]) histNnbfgs ->Fill( reader->EvaluateMVA( "MLPBFGS method" ) ); if (Use["MLPBNN" ]) histNnbnn ->Fill( reader->EvaluateMVA( "MLPBNN method" ) ); if (Use["CFMlpANN" ]) histNnC ->Fill( reader->EvaluateMVA( "CFMlpANN method" ) ); if (Use["TMlpANN" ]) histNnT ->Fill( reader->EvaluateMVA( "TMlpANN method" ) ); if (Use["BDT" ]) histBdt ->Fill( reader->EvaluateMVA( "BDT method" ) ); if (Use["BDTD" ]) histBdtD ->Fill( reader->EvaluateMVA( "BDTD method" ) ); if (Use["BDTG" ]) histBdtG ->Fill( reader->EvaluateMVA( "BDTG method" ) ); if (Use["RuleFit" ]) histRf ->Fill( reader->EvaluateMVA( "RuleFit method" ) ); if (Use["SVM_Gauss" ]) histSVMG ->Fill( reader->EvaluateMVA( "SVM_Gauss method" ) ); if (Use["SVM_Poly" ]) histSVMP ->Fill( reader->EvaluateMVA( "SVM_Poly method" ) ); if (Use["SVM_Lin" ]) histSVML ->Fill( reader->EvaluateMVA( "SVM_Lin method" ) ); if (Use["FDA_MT" ]) histFDAMT ->Fill( reader->EvaluateMVA( "FDA_MT method" ) ); if (Use["FDA_GA" ]) histFDAGA ->Fill( reader->EvaluateMVA( "FDA_GA method" ) ); if (Use["Category" ]) histCat ->Fill( reader->EvaluateMVA( "Category method" ) ); if (Use["Plugin" ]) histPBdt ->Fill( reader->EvaluateMVA( "P_BDT method" ) ); revDATAhists[idx]->Fill( reader->EvaluateMVA( "BDT method" ) );} sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); delete myptphoton; delete myetaphoton; delete myptmuon; delete myetamuon; delete myptjet; delete myetajet; delete mymasstop; //delete mymtw; delete mydeltaRphotonjet; delete mydeltaRphotonmuon; //delete myht; delete mycostopphoton; delete mydeltaphiphotonmet; delete mycvsdiscriminant; delete myjetmultiplicity; ////delete mybjetmultiplicity; ////delete myleptoncharge; ////delete myplot; // delete input; } for(unsigned int idx=1; idx<datasamplesreverse_.size(); ++idx){ revDATAhists[idx]->Add(revDATAhists[idx-1]); } revDATAhists[2]->Scale(620.32/revDATAhists[2]->Integral()); hList->Add(revDATAhists[2]); cout<<revDATAhists[2]->Integral()<<endl; TFile *target = new TFile( "MVApp.root","RECREATE" ); hList->Write(); target->Close(); }
void cutFlowStudyMu( TString weightFile = "TMVAClassificationPtOrd_qqH115vsWZttQCD_Cuts.weights.xml", Double_t effS_ = 0.3) { ofstream out("cutFlow-MuTauStream.txt"); out.precision(4); TMVA::Tools::Instance(); TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); Float_t pt1, pt2; Float_t Deta, Mjj; Float_t eta1,eta2; reader->AddVariable( "pt1", &pt1); reader->AddVariable( "pt2", &pt2); reader->AddVariable( "Deta",&Deta); reader->AddVariable( "Mjj", &Mjj); reader->AddSpectator("eta1",&eta1); reader->AddSpectator("eta2",&eta2); reader->BookMVA( "Cuts", TString("/home/llr/cms/lbianchini/CMSSW_3_9_9/src/Bianchi/TauTauStudies/test/Macro/weights/")+weightFile ); TFile *fFullSignalVBF = new TFile("/data_CMS/cms/lbianchini//MuTauStream2011/treeMuTauStream_VBFH115-Mu-powheg-PUS1.root","READ"); TFile *fFullSignalGGH = new TFile("/data_CMS/cms/lbianchini//MuTauStream2011/treeMuTauStream_GGFH115-Mu-powheg-PUS1.root","READ"); TFile *fFullBackgroundDYTauTau = new TFile("/data_CMS/cms/lbianchini//MuTauStream2011/treeMuTauStream_DYToTauTau-Mu-20-PUS1.root","READ"); TFile *fFullBackgroundDYMuMu = new TFile("/data_CMS/cms/lbianchini//MuTauStream2011/treeMuTauStream_DYToMuMu-20-PUS1.root","READ"); TFile *fFullBackgroundWJets = new TFile("/data_CMS/cms/lbianchini//MuTauStream2011/treeMuTauStream_WJets-Mu-madgraph-PUS1.root","READ"); TFile *fFullBackgroundQCD = new TFile("/data_CMS/cms/lbianchini//MuTauStream2011/treeMuTauStream_QCDmu.root","READ"); TFile *fFullBackgroundTTbar = new TFile("/data_CMS/cms/lbianchini//MuTauStream2011/treeMuTauStream_TTJets-Mu-madgraph-PUS1.root","READ"); TFile *fFullBackgroundDiBoson = new TFile("/data_CMS/cms/lbianchini//MuTauStream2011/treeMuTauStream_DiBoson-Mu.root","READ"); // OpenNTuples TString fSignalNameVBF = "/data_CMS/cms/lbianchini/VbfJetsStudy/OpenNtuples/MuTauStream2011/v2/nTupleVBFH115-Mu-powheg-PUS1_Open_MuTauStream.root"; TString fSignalNameGGH = "/data_CMS/cms/lbianchini/VbfJetsStudy/OpenNtuples/MuTauStream2011/v2/nTupleGGFH115-Mu-powheg-PUS1_Open_MuTauStream.root"; TString fBackgroundNameDYTauTau = "/data_CMS/cms/lbianchini/VbfJetsStudy/OpenNtuples/MuTauStream2011/v2/nTupleDYToTauTau-Mu-20-PUS1_Open_MuTauStream.root"; TString fBackgroundNameDYMuMu = "/data_CMS/cms/lbianchini/VbfJetsStudy/OpenNtuples/MuTauStream2011/v2/nTupleDYToMuMu-20-PUS1_Open_MuTauStream.root"; TString fBackgroundNameWJets = "/data_CMS/cms/lbianchini/VbfJetsStudy/OpenNtuples/MuTauStream2011/v2/nTupleWJets-Mu-madgraph-PUS1_Open_MuTauStream.root"; TString fBackgroundNameQCD = "/data_CMS/cms/lbianchini/VbfJetsStudy/OpenNtuples/MuTauStream2011/v2/nTupleQCDmu_Open_MuTauStream.root"; TString fBackgroundNameTTbar = "/data_CMS/cms/lbianchini/VbfJetsStudy/OpenNtuples/MuTauStream2011/v2/nTupleTTJets-Mu-madgraph-PUS1_Open_MuTauStream.root"; TString fBackgroundNameDiBoson = "/data_CMS/cms/lbianchini/VbfJetsStudy/OpenNtuples/MuTauStream2011/v2/nTupleDiBoson-Mu_Open_MuTauStream.root"; TFile *fSignalVBF(0); TFile *fSignalGGH(0); TFile *fBackgroundDYTauTau(0); TFile *fBackgroundDYMuMu(0); TFile *fBackgroundWJets(0); TFile *fBackgroundQCD(0); TFile *fBackgroundTTbar(0); TFile *fBackgroundDiBoson(0); fSignalVBF = TFile::Open( fSignalNameVBF ); fSignalGGH = TFile::Open( fSignalNameGGH ); fBackgroundDYTauTau = TFile::Open( fBackgroundNameDYTauTau ); fBackgroundDYMuMu = TFile::Open( fBackgroundNameDYMuMu ); fBackgroundWJets = TFile::Open( fBackgroundNameWJets ); fBackgroundQCD = TFile::Open( fBackgroundNameQCD ); fBackgroundTTbar = TFile::Open( fBackgroundNameTTbar ); fBackgroundDiBoson = TFile::Open( fBackgroundNameDiBoson ); if(!fSignalVBF || !fBackgroundDYTauTau || !fBackgroundWJets || !fBackgroundQCD || !fBackgroundTTbar || !fSignalGGH || !fBackgroundDYMuMu || !fBackgroundDiBoson ){ std::cout << "ERROR: could not open files" << std::endl; exit(1); } TString tree = "outTreePtOrd"; TTree *signalVBF = (TTree*)fSignalVBF->Get(tree); TTree *signalGGH = (TTree*)fSignalGGH->Get(tree); TTree *backgroundDYTauTau = (TTree*)fBackgroundDYTauTau->Get(tree); TTree *backgroundDYMuMu = (TTree*)fBackgroundDYMuMu->Get(tree); TTree *backgroundWJets = (TTree*)fBackgroundWJets->Get(tree); TTree *backgroundQCD = (TTree*)fBackgroundQCD->Get(tree); TTree *backgroundTTbar = (TTree*)fBackgroundTTbar->Get(tree); TTree *backgroundDiBoson = (TTree*)fBackgroundDiBoson->Get(tree); // here I define the map between a sample name and its tree std::map<std::string,TTree*> tMap; tMap["ggH115"]=signalGGH; tMap["qqH115"]=signalVBF; tMap["Ztautau"]=backgroundDYTauTau; tMap["Zmumu"]=backgroundDYMuMu; tMap["Wjets"]=backgroundWJets; tMap["QCD"]=backgroundQCD; tMap["TTbar"]=backgroundTTbar; tMap["DiBoson"]=backgroundDiBoson; std::map<std::string,TTree*>::iterator jt; Float_t pt1_, pt2_; Float_t Deta_, Mjj_; Float_t Dphi,diTauSVFitPt,diTauSVFitEta,diTauVisMass,diTauSVFitMass,ptL1,ptL2,etaL1,etaL2,diTauCharge,MtLeg1,numPV,combRelIsoLeg1,sampleWeight,ptVeto,HLT; Int_t tightestHPSWP; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // here I choose the order in the stack std::vector<string> samples; samples.push_back("ggH115"); samples.push_back("qqH115"); samples.push_back("DiBoson"); samples.push_back("TTbar"); samples.push_back("Wjets"); samples.push_back("Zmumu"); samples.push_back("Ztautau"); samples.push_back("QCD"); std::map<std::string,float> crossSec; crossSec["ggH115"]=( 7.65e-02 * 18.13 ); crossSec["qqH115"]=( 0.1012); crossSec["DiBoson"]=( -1 ); crossSec["TTbar"]=( 157.5 ); crossSec["Wjets"]=( 31314.0); crossSec["Zmumu"]=( 1666 ); crossSec["Ztautau"]=( 1666 ); crossSec["QCD"]=( 296600000*0.0002855 ); float Lumi = 1000; // here I choose the order in the stack std::vector<string> filters; filters.push_back("total"); filters.push_back("vertex"); filters.push_back("1-mu"); filters.push_back("0-e"); filters.push_back("mu-ID"); filters.push_back("tau-ID"); filters.push_back("Delta R mu-tau"); filters.push_back("mu-iso"); filters.push_back("tau-iso"); filters.push_back("Mt"); filters.push_back("OS"); filters.push_back("2-jets"); filters.push_back("VBF cuts"); filters.push_back("jet-veto"); filters.push_back("HLT"); // here I define the map between a sample name and its file ptr std::map<std::string,TFile*> fullMap; fullMap["ggH115"] = fFullSignalGGH; fullMap["qqH115"] = fFullSignalVBF; fullMap["Ztautau"] = fFullBackgroundDYTauTau; fullMap["Zmumu"] = fFullBackgroundDYMuMu; fullMap["Wjets"] = fFullBackgroundWJets; fullMap["QCD"] = fFullBackgroundQCD; fullMap["TTbar"] = fFullBackgroundTTbar; fullMap["DiBoson"] = fFullBackgroundDiBoson; std::map<std::string,TFile*>::iterator it; std::map<std::string,float> cutMap_allEventsFilter; std::map<std::string,float> cutMap_allEventsFilterE; for(it = fullMap.begin(); it != fullMap.end(); it++){ TH1F* allEvents = (TH1F*)(it->second)->Get("allEventsFilter/totalEvents"); float totalEvents = allEvents->GetBinContent(1); float totalEquivalentEvents = allEvents->GetEffectiveEntries(); float tot = totalEvents; if(crossSec[it->first]>0) tot *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; cutMap_allEventsFilter[it->first] = tot; cutMap_allEventsFilterE[it->first] = totalEquivalentEvents>0 ? sqrt(totalEquivalentEvents)*(tot/totalEquivalentEvents) : 0; } std::map<std::string,float> cutMap_vertexScrapingFilter; std::map<std::string,float> cutMap_vertexScrapingFilterE; for(it = fullMap.begin(); it != fullMap.end(); it++){ TH1F* allEvents = (TH1F*)(it->second)->Get("allEventsFilter/totalEvents"); float totalEvents = allEvents->GetBinContent(1); allEvents = (TH1F*)(it->second)->Get("vertexScrapingFilter/totalEvents"); float tot = allEvents->GetBinContent(1); float totalEquivalentEvents = allEvents->GetEffectiveEntries(); if(crossSec[it->first]>0){ tot *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; //totalEquivalentEvents *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; } cutMap_vertexScrapingFilter[it->first] = tot; cutMap_vertexScrapingFilterE[it->first] = totalEquivalentEvents>0 ? sqrt(totalEquivalentEvents)*(tot/totalEquivalentEvents) : 0; } std::map<std::string,float> cutMap_oneElectronFilter; std::map<std::string,float> cutMap_oneElectronFilterE; for(it = fullMap.begin(); it != fullMap.end(); it++){ TH1F* allEvents = (TH1F*)(it->second)->Get("allEventsFilter/totalEvents"); float totalEvents = allEvents->GetBinContent(1); allEvents = (TH1F*)(it->second)->Get("oneMuonFilter/totalEvents"); float tot = allEvents->GetBinContent(1); float totalEquivalentEvents = allEvents->GetEffectiveEntries(); if(crossSec[it->first]>0){ tot *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; //totalEquivalentEvents *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; } cutMap_oneElectronFilter[it->first] = tot; cutMap_oneElectronFilterE[it->first] = totalEquivalentEvents>0 ? sqrt(totalEquivalentEvents)*(tot/totalEquivalentEvents) : 0; } std::map<std::string,float> cutMap_noMuonFilter; std::map<std::string,float> cutMap_noMuonFilterE; for(it = fullMap.begin(); it != fullMap.end(); it++){ TH1F* allEvents = (TH1F*)(it->second)->Get("allEventsFilter/totalEvents"); float totalEvents = allEvents->GetBinContent(1); allEvents = (TH1F*)(it->second)->Get("noElecFilter/totalEvents"); float tot = allEvents->GetBinContent(1); float totalEquivalentEvents = allEvents->GetEffectiveEntries(); if(crossSec[it->first]>0){ tot *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; //totalEquivalentEvents *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; } cutMap_noMuonFilter[it->first] = tot; cutMap_noMuonFilterE[it->first] = totalEquivalentEvents>0 ? sqrt(totalEquivalentEvents)*(tot/totalEquivalentEvents) : 0; } std::map<std::string,float> cutMap_electronLegFilter; std::map<std::string,float> cutMap_electronLegFilterE; for(it = fullMap.begin(); it != fullMap.end(); it++){ TH1F* allEvents = (TH1F*)(it->second)->Get("allEventsFilter/totalEvents"); float totalEvents = allEvents->GetBinContent(1); allEvents = (TH1F*)(it->second)->Get("muonLegFilter/totalEvents"); float tot = allEvents->GetBinContent(1); float totalEquivalentEvents = allEvents->GetEffectiveEntries(); if(crossSec[it->first]>0){ tot *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; //totalEquivalentEvents *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; } cutMap_electronLegFilter[it->first] = tot; cutMap_electronLegFilterE[it->first] = totalEquivalentEvents>0 ? sqrt(totalEquivalentEvents)*(tot/totalEquivalentEvents) : 0; } std::map<std::string,float> cutMap_tauLegFilter; std::map<std::string,float> cutMap_tauLegFilterE; for(it = fullMap.begin(); it != fullMap.end(); it++){ TH1F* allEvents = (TH1F*)(it->second)->Get("allEventsFilter/totalEvents"); float totalEvents = allEvents->GetBinContent(1); allEvents = (TH1F*)(it->second)->Get("tauLegFilter/totalEvents"); float tot = allEvents->GetBinContent(1); float totalEquivalentEvents = allEvents->GetEffectiveEntries(); if(crossSec[it->first]>0){ tot *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; //totalEquivalentEvents *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; } cutMap_tauLegFilter[it->first] = tot; cutMap_tauLegFilterE[it->first] = totalEquivalentEvents>0 ? sqrt(totalEquivalentEvents)*(tot/totalEquivalentEvents) : 0; } std::map<std::string,float> cutMap_atLeastOneDiTauFilter; std::map<std::string,float> cutMap_atLeastOneDiTauFilterE; for(it = fullMap.begin(); it != fullMap.end(); it++){ TH1F* allEvents = (TH1F*)(it->second)->Get("allEventsFilter/totalEvents"); float totalEvents = allEvents->GetBinContent(1); allEvents = (TH1F*)(it->second)->Get("atLeastOneDiTauFilter/totalEvents"); float tot = allEvents->GetBinContent(1); float totalEquivalentEvents = allEvents->GetEffectiveEntries(); if(crossSec[it->first]>0){ tot *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; //totalEquivalentEvents *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; } cutMap_atLeastOneDiTauFilter[it->first] = tot; cutMap_atLeastOneDiTauFilterE[it->first] = totalEquivalentEvents>0 ? sqrt(totalEquivalentEvents)*(tot/totalEquivalentEvents) : 0; } std::map<std::string,float> cutMap_ElecIso; std::map<std::string,float> cutMap_ElecIsoE; for(it = fullMap.begin(); it != fullMap.end(); it++){ cout<<it->first<<endl; TH1F* allEvents = (TH1F*)(it->second)->Get("allEventsFilter/totalEvents"); float totalEvents = allEvents->GetBinContent(1); TH1F* h1 = new TH1F("h1","",1,-10,10); TCut cut = (crossSec[it->first]>0) ? "(chIsoLeg1+nhIsoLeg1+phIsoLeg1)/diTauLegsP4[0].Pt()<0.1" : "weight*((chIsoLeg1+nhIsoLeg1+phIsoLeg1)/diTauLegsP4[0].Pt()<0.1)"; ((TTree*) (it->second->Get("muTauStreamAnalyzer/tree")) )->Draw("diTauLegsP4[0].Eta()>>h1",cut); float tot = h1->Integral(); float totalEquivalentEvents = h1->GetEffectiveEntries(); if(crossSec[it->first]>0){ tot *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; //totalEquivalentEvents *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; } cutMap_ElecIso[it->first] = tot; cutMap_ElecIsoE[it->first] = totalEquivalentEvents>0 ? sqrt(totalEquivalentEvents)*(tot/totalEquivalentEvents) : 0; delete h1; } std::map<std::string,float> cutMap_TauIso; std::map<std::string,float> cutMap_TauIsoE; for(it = fullMap.begin(); it != fullMap.end(); it++){ cout<<it->first<<endl; TH1F* allEvents = (TH1F*)(it->second)->Get("allEventsFilter/totalEvents"); float totalEvents = allEvents->GetBinContent(1); TH1F* h1 = new TH1F("h1","",1,-10,10); TCut cut = (crossSec[it->first]>0) ? "(chIsoLeg1+nhIsoLeg1+phIsoLeg1)/diTauLegsP4[0].Pt()<0.1 && tightestHPSWP>0" : "weight*((chIsoLeg1+nhIsoLeg1+phIsoLeg1)/diTauLegsP4[0].Pt()<0.1 && tightestHPSWP>0)"; ((TTree*) (it->second->Get("muTauStreamAnalyzer/tree")) )->Draw("diTauLegsP4[0].Eta()>>h1",cut); float tot = h1->Integral(); float totalEquivalentEvents = h1->GetEffectiveEntries(); if(crossSec[it->first]>0){ tot *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; //totalEquivalentEvents *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; } cutMap_TauIso[it->first] = tot; cutMap_TauIsoE[it->first] = totalEquivalentEvents>0 ? sqrt(totalEquivalentEvents)*(tot/totalEquivalentEvents) : 0; delete h1; } std::map<std::string,float> cutMap_Mt; std::map<std::string,float> cutMap_MtE; for(it = fullMap.begin(); it != fullMap.end(); it++){ cout<<it->first<<endl; TH1F* allEvents = (TH1F*)(it->second)->Get("allEventsFilter/totalEvents"); float totalEvents = allEvents->GetBinContent(1); TH1F* h1 = new TH1F("h1","",1,-10,10); TCut cut = (crossSec[it->first]>0) ? "(chIsoLeg1+nhIsoLeg1+phIsoLeg1)/diTauLegsP4[0].Pt()<0.1 && tightestHPSWP>0 && MtLeg1<40" : "weight*((chIsoLeg1+nhIsoLeg1+phIsoLeg1)/diTauLegsP4[0].Pt()<0.1 && tightestHPSWP>0 && MtLeg1<40)"; ((TTree*) (it->second->Get("muTauStreamAnalyzer/tree")) )->Draw("diTauLegsP4[0].Eta()>>h1",cut); float tot = h1->Integral(); float totalEquivalentEvents = h1->GetEffectiveEntries(); if(crossSec[it->first]>0){ tot *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; //totalEquivalentEvents *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; } cutMap_Mt[it->first] = tot; cutMap_MtE[it->first] = totalEquivalentEvents>0 ? sqrt(totalEquivalentEvents)*(tot/totalEquivalentEvents) : 0; delete h1; } std::map<std::string,float> cutMap_OS; std::map<std::string,float> cutMap_OSE; for(it = fullMap.begin(); it != fullMap.end(); it++){ cout<<it->first<<endl; TH1F* allEvents = (TH1F*)(it->second)->Get("allEventsFilter/totalEvents"); float totalEvents = allEvents->GetBinContent(1); TH1F* h1 = new TH1F("h1","",1,-10,10); TCut cut = (crossSec[it->first]>0) ? "(chIsoLeg1+nhIsoLeg1+phIsoLeg1)/diTauLegsP4[0].Pt()<0.1 && tightestHPSWP>0 && diTauCharge==0 && MtLeg1<40" : "weight*((chIsoLeg1+nhIsoLeg1+phIsoLeg1)/diTauLegsP4[0].Pt()<0.1 && tightestHPSWP>0 && diTauCharge==0 && MtLeg1<40)"; ((TTree*) (it->second->Get("muTauStreamAnalyzer/tree")) )->Draw("diTauLegsP4[0].Eta()>>h1",cut); float tot = h1->Integral(); float totalEquivalentEvents = h1->GetEffectiveEntries(); if(crossSec[it->first]>0){ tot *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; //totalEquivalentEvents *= (Lumi/ (totalEvents/crossSec[it->first]) ) ; } cutMap_OS[it->first] = tot; cutMap_OSE[it->first] = totalEquivalentEvents>0 ? sqrt(totalEquivalentEvents)*(tot/totalEquivalentEvents) : 0; delete h1; } std::map<std::string,float> cutMap_VBFPre; std::map<std::string,float> cutMap_VBFPreE; for(jt = tMap.begin(); jt != tMap.end(); jt++){ cout<<jt->first<<endl; TH1F* h1 = new TH1F("h1","",1,-10,10); TCut cut = "sampleWeight*(pt1>0 && combRelIsoLeg1<0.1 && tightestHPSWP>0 && diTauCharge==0 && MtLeg1<40)"; jt->second->Draw("etaL1>>h1",cut); float tot = h1->Integral(); float totalEquivalentEvents = h1->GetEffectiveEntries(); cutMap_VBFPre[jt->first] = tot; cutMap_VBFPreE[jt->first] = totalEquivalentEvents>0 ? sqrt(totalEquivalentEvents)*(tot/totalEquivalentEvents) : 0; delete h1; } std::map<std::string,float> cutMap_VBF; std::map<std::string,float> cutMap_VBFE; std::map<std::string,float> cutMap_JetVeto; std::map<std::string,float> cutMap_JetVetoE; std::map<std::string,float> cutMap_HLT; std::map<std::string,float> cutMap_HLTE; for(jt = tMap.begin(); jt != tMap.end(); jt++){ cout<<jt->first<<endl; TCut cut = "(pt1>0 && combRelIsoLeg1<0.1 && tightestHPSWP>0 && diTauCharge==0 && MtLeg1<40)"; TFile* dummy = new TFile("dummy.root","RECREATE"); TTree* currentTree = (TTree*)(jt->second)->CopyTree(cut); float tot = 0; int counter = 0; float tot2 = 0; int counter2 = 0; float tot3 = 0; int counter3 = 0; currentTree->SetBranchAddress( "pt1", &pt1_ ); currentTree->SetBranchAddress( "pt2", &pt2_ ); currentTree->SetBranchAddress( "Deta",&Deta_ ); currentTree->SetBranchAddress( "Mjj", &Mjj_ ); currentTree->SetBranchAddress( "diTauSVFitPt",&diTauSVFitPt); //currentTree->SetBranchAddress( "diTauSVFitEta",&diTauSVFitEta); currentTree->SetBranchAddress( "diTauSVFitMass",&diTauSVFitMass); currentTree->SetBranchAddress( "diTauVisMass",&diTauVisMass); currentTree->SetBranchAddress( "ptL1", &ptL1 ); currentTree->SetBranchAddress( "ptL2", &ptL2 ); currentTree->SetBranchAddress( "etaL1", &etaL1 ); currentTree->SetBranchAddress( "etaL2", &etaL2 ); currentTree->SetBranchAddress( "combRelIsoLeg1",&combRelIsoLeg1); currentTree->SetBranchAddress( "tightestHPSWP",&tightestHPSWP); currentTree->SetBranchAddress( "diTauCharge",&diTauCharge); currentTree->SetBranchAddress( "MtLeg1",&MtLeg1); currentTree->SetBranchAddress( "numPV",&numPV); currentTree->SetBranchAddress( "sampleWeight",&sampleWeight); currentTree->SetBranchAddress( "ptVeto",&ptVeto); currentTree->SetBranchAddress( "HLT",&HLT); for (Long64_t ievt=0; ievt<currentTree->GetEntries();ievt++) { currentTree->GetEntry(ievt); if (ievt%10000 == 0){ std::cout << (jt->first) << " ---> processing event: " << ievt << " ..." <<std::endl; } pt1 = pt1_; pt2 = pt2_; Deta = Deta_; Mjj = Mjj_; bool pass = effS_>0 ? reader->EvaluateMVA( "Cuts", effS_ ) : (pt1>0); if(pass){ tot+=sampleWeight; counter++; if(ptVeto<20){ tot2+=sampleWeight; counter2++; if(HLT>0.5 && HLT<1.5){ tot3+=sampleWeight; counter3++; } } } }// end loop cutMap_VBF[jt->first] = tot; cutMap_VBFE[jt->first] = counter>0 ? sqrt(counter)*tot/counter : 0; cutMap_JetVeto[jt->first] = tot2; cutMap_JetVetoE[jt->first] = counter2>0 ? sqrt(counter2)*tot2/counter2 : 0; cutMap_HLT[jt->first] = tot3; cutMap_HLTE[jt->first] = counter3>0 ? sqrt(counter3)*tot3/counter3 : 0; } std::vector< std::map<std::string,float> > allFilters; allFilters.push_back(cutMap_allEventsFilter); allFilters.push_back(cutMap_vertexScrapingFilter); allFilters.push_back(cutMap_oneElectronFilter); allFilters.push_back(cutMap_noMuonFilter); allFilters.push_back(cutMap_electronLegFilter); allFilters.push_back(cutMap_tauLegFilter); allFilters.push_back(cutMap_atLeastOneDiTauFilter); allFilters.push_back(cutMap_ElecIso); allFilters.push_back(cutMap_TauIso); allFilters.push_back(cutMap_Mt); allFilters.push_back(cutMap_OS); allFilters.push_back(cutMap_VBFPre); allFilters.push_back(cutMap_VBF); allFilters.push_back(cutMap_JetVeto); allFilters.push_back(cutMap_HLT); std::vector< std::map<std::string,float> > allFiltersE; allFiltersE.push_back(cutMap_allEventsFilterE); allFiltersE.push_back(cutMap_vertexScrapingFilterE); allFiltersE.push_back(cutMap_oneElectronFilterE); allFiltersE.push_back(cutMap_noMuonFilterE); allFiltersE.push_back(cutMap_electronLegFilterE); allFiltersE.push_back(cutMap_tauLegFilterE); allFiltersE.push_back(cutMap_atLeastOneDiTauFilterE); allFiltersE.push_back(cutMap_ElecIsoE); allFiltersE.push_back(cutMap_TauIsoE); allFiltersE.push_back(cutMap_MtE); allFiltersE.push_back(cutMap_OSE); allFiltersE.push_back(cutMap_VBFPreE); allFiltersE.push_back(cutMap_VBFE); allFiltersE.push_back(cutMap_JetVetoE); allFiltersE.push_back(cutMap_HLTE); //out<<"\\begin{center}"<<endl; out<<"\\begin{tabular}[!htbp]{|c"; for(int k = 0 ; k < samples.size(); k++) out<<"|c"; out<<"|} \\hline"<<endl; out<< "Cut & "; for(int k = 0 ; k < samples.size(); k++){ out << (fullMap.find(samples[k]))->first; if(k!=samples.size()-1) out <<" & " ; else out << " \\\\ " << endl; } out << " \\hline" << endl; for(int i = 0; i < allFilters.size(); i++){ out << filters[i] << " & "; for(int k = 0 ; k < samples.size(); k++){ out << (allFilters[i].find(samples[k]))->second << " $\\pm$ " << (allFiltersE[i].find(samples[k]))->second; if(k!=samples.size()-1) out <<" & " ; else out << " \\\\ " << endl; } out << " \\hline" << endl; } out<<"\\end{tabular}"<<endl; //out<<"\\end{center}"<<endl; return; }
void PlotDecisionBoundary( TString weightFile = "weights/TMVAClassification_BDT.weights.xml",TString v0="var0", TString v1="var1", TString dataFileName = "/home/hvoss/TMVA/TMVA_data/data/data_circ.root") { //--------------------------------------------------------------- // default MVA methods to be trained + tested // this loads the library TMVA::Tools::Instance(); std::cout << std::endl; std::cout << "==> Start TMVAClassificationApplication" << std::endl; // // create the Reader object // TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); // create a set of variables and declare them to the reader // - the variable names must corresponds in name and type to // those given in the weight file(s) that you use Double_t var0, var1; reader->AddVariable( v0, &var0 ); reader->AddVariable( v1, &var1 ); // // book the MVA method // reader->BookMVA( "MyMVAMethod", weightFile ); TFile *f = new TFile(dataFileName); TTree *signal = (TTree*)f->Get("TreeS"); TTree *background = (TTree*)f->Get("TreeB"); //Declaration of leaves types Float_t svar0; Float_t svar1; Float_t bvar0; Float_t bvar1; Float_t sWeight=1.0; // just in case you have weight defined, also set these branchaddresses Float_t bWeight=1.0*signal->GetEntries()/background->GetEntries(); // just in case you have weight defined, also set these branchaddresses // Set branch addresses. signal->SetBranchAddress(v0,&svar0); signal->SetBranchAddress(v1,&svar1); background->SetBranchAddress(v0,&bvar0); background->SetBranchAddress(v1,&bvar1); UInt_t nbin = 50; Float_t xmax = signal->GetMaximum(v0.Data()); Float_t xmin = signal->GetMinimum(v0.Data()); Float_t ymax = signal->GetMaximum(v1.Data()); Float_t ymin = signal->GetMinimum(v1.Data()); xmax = TMath::Max(xmax,(Float_t)background->GetMaximum(v0.Data())); xmin = TMath::Min(xmin,(Float_t)background->GetMinimum(v0.Data())); ymax = TMath::Max(ymax,(Float_t)background->GetMaximum(v1.Data())); ymin = TMath::Min(ymin,(Float_t)background->GetMinimum(v1.Data())); TH2D *hs=new TH2D("hs","",nbin,xmin,xmax,nbin,ymin,ymax); TH2D *hb=new TH2D("hb","",nbin,xmin,xmax,nbin,ymin,ymax); hs->SetXTitle(v0); hs->SetYTitle(v1); hb->SetXTitle(v0); hb->SetYTitle(v1); hs->SetMarkerColor(4); hb->SetMarkerColor(2); TH2F * hist = new TH2F( "MVA", "MVA", nbin,xmin,xmax,nbin,ymin,ymax); // Prepare input tree (this must be replaced by your data source) // in this example, there is a toy tree with signal and one with background events // we'll later on use only the "signal" events for the test in this example. Float_t MinMVA=10000, MaxMVA=-100000; for (UInt_t ibin=1; ibin<nbin+1; ibin++){ for (UInt_t jbin=1; jbin<nbin+1; jbin++){ var0 = hs->GetXaxis()->GetBinCenter(ibin); var1 = hs->GetYaxis()->GetBinCenter(jbin); Float_t mvaVal=reader->EvaluateMVA( "MyMVAMethod" ) ; if (MinMVA>mvaVal) MinMVA=mvaVal; if (MaxMVA<mvaVal) MaxMVA=mvaVal; hist->SetBinContent(ibin,jbin, mvaVal); } } // now you need to try to find the MVA-value at which you cut for the plotting of the decision boundary // (Use the smallest number of misclassifications as criterion) const Int_t nValBins=100; Double_t sum = 0.; TH1F *mvaS= new TH1F("mvaS","",nValBins,MinMVA,MaxMVA); mvaS->SetXTitle("MVA-ouput"); mvaS->SetYTitle("#entries"); TH1F *mvaB= new TH1F("mvaB","",nValBins,MinMVA,MaxMVA); mvaB->SetXTitle("MVA-ouput"); mvaB->SetYTitle("#entries"); TH1F *mvaSC= new TH1F("mvaSC","",nValBins,MinMVA,MaxMVA); mvaSC->SetXTitle("MVA-ouput"); mvaSC->SetYTitle("cummulation"); TH1F *mvaBC= new TH1F("mvaBC","",nValBins,MinMVA,MaxMVA); mvaBC->SetXTitle("MVA-ouput"); mvaBC->SetYTitle("cummulation"); Long64_t nentries; nentries = signal->GetEntries(); for (Long64_t is=0; is<nentries;is++) { signal->GetEntry(is); sum +=sWeight; var0 = svar0; var1 = svar1; Float_t mvaVal=reader->EvaluateMVA( "MyMVAMethod" ) ; hs->Fill(svar0,svar1); mvaS->Fill(mvaVal,sWeight); } nentries = background->GetEntries(); for (Long64_t ib=0; ib<nentries;ib++) { background->GetEntry(ib); sum +=bWeight; var0 = bvar0; var1 = bvar1; Float_t mvaVal=reader->EvaluateMVA( "MyMVAMethod" ) ; hb->Fill(bvar0,bvar1); mvaB->Fill(mvaVal,bWeight); } SeparationBase *sepGain = new MisClassificationError(); //SeparationBase *sepGain = new GiniIndex(); //SeparationBase *sepGain = new CrossEntropy(); Double_t sTot = mvaS->GetSum(); Double_t bTot = mvaB->GetSum(); mvaSC->SetBinContent(1,mvaS->GetBinContent(1)); mvaBC->SetBinContent(1,mvaB->GetBinContent(1)); Double_t sSel=mvaSC->GetBinContent(1); Double_t bSel=mvaBC->GetBinContent(1); Double_t sSelBest=0; Double_t bSelBest=0; Double_t separationGain=sepGain->GetSeparationGain(sSel,bSel,sTot,bTot); Double_t mvaCut=mvaSC->GetBinCenter(1); Double_t mvaCutOrientation=1; // 1 if mva > mvaCut --> Signal and -1 if mva < mvaCut (i.e. mva*-1 > mvaCut*-1) --> Signal for (UInt_t ibin=2;ibin<nValBins;ibin++){ mvaSC->SetBinContent(ibin,mvaS->GetBinContent(ibin)+mvaSC->GetBinContent(ibin-1)); mvaBC->SetBinContent(ibin,mvaB->GetBinContent(ibin)+mvaBC->GetBinContent(ibin-1)); sSel=mvaSC->GetBinContent(ibin); bSel=mvaBC->GetBinContent(ibin); if (separationGain < sepGain->GetSeparationGain(sSel,bSel,sTot,bTot)){ separationGain = sepGain->GetSeparationGain(sSel,bSel,sTot,bTot); mvaCut=mvaSC->GetBinCenter(ibin); if (sSel/bSel > (sTot-sSel)/(bTot-bSel)) mvaCutOrientation=-1; else mvaCutOrientation=1; sSelBest=sSel; bSelBest=bSel; } } cout << "Min="<<MinMVA << " Max=" << MaxMVA << " sTot=" << sTot << " bTot=" << bTot << " sSel=" << sSelBest << " bSel=" << bSelBest << " sepGain="<<separationGain << " cut=" << mvaCut << " cutOrientation="<<mvaCutOrientation << endl; delete reader; gStyle->SetPalette(1); plot(hs,hb,hist ,v0,v1,mvaCut); TCanvas *cm=new TCanvas ("cm","",900,1200); cm->cd(); cm->Divide(1,2); cm->cd(1); mvaS->SetLineColor(4); mvaB->SetLineColor(2); mvaS->Draw(); mvaB->Draw("same"); cm->cd(2); mvaSC->SetLineColor(4); mvaBC->SetLineColor(2); mvaBC->Draw(); mvaSC->Draw("same"); // TH1F *add=(TH1F*)mvaBC->Clone("add"); // add->Add(mvaSC); // add->Draw(); // errh->Draw("same"); // // write histograms // TFile *target = new TFile( "TMVAPlotDecisionBoundary.root","RECREATE" ); hs->Write(); hb->Write(); hist->Write(); target->Close(); }
void TMVARegressionApplication( int wMs,int wM, string st,string st2,string option="",TString myMethodList = "" ) { //--------------------------------------------------------------- // This loads the library TMVA::Tools::Instance(); // Default MVA methods to be trained + tested std::map<std::string,int> Use; // --- Mutidimensional likelihood and Nearest-Neighbour methods Use["PDERS"] = 0; Use["PDEFoam"] = 0; Use["KNN"] = 0; // // --- Linear Discriminant Analysis Use["LD"] = 0; // // --- Function Discriminant analysis Use["FDA_GA"] = 0; Use["FDA_MC"] = 0; Use["FDA_MT"] = 0; Use["FDA_GAMT"] = 0; // // --- Neural Network Use["MLP"] = 0; // // --- Support Vector Machine Use["SVM"] = 0; // // --- Boosted Decision Trees Use["BDT"] = 0; Use["BDTG"] = 1; // --------------------------------------------------------------- std::cout << std::endl; std::cout << "==> Start TMVARegressionApplication" << std::endl; // Select methods (don't look at this code - not of interest) if (myMethodList != "") { for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) it->second = 0; std::vector<TString> mlist = gTools().SplitString( myMethodList, ',' ); for (UInt_t i=0; i<mlist.size(); i++) { std::string regMethod(mlist[i]); if (Use.find(regMethod) == Use.end()) { std::cout << "Method \"" << regMethod << "\" not known in TMVA under this name. Choose among the following:" << std::endl; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) std::cout << it->first << " "; std::cout << std::endl; return; } Use[regMethod] = 1; } } // -------------------------------------------------------------------------------------------------- // --- Create the Reader object TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); // Create a set of variables and declare them to the reader // - the variable names MUST corresponds in name and type to those given in the weight file(s) used //Float_t var1, var2; //reader->AddVariable( "var1", &var1 ); //reader->AddVariable( "var2", &var2 ); Float_t pt_AK8MatchedToHbb,eta_AK8MatchedToHbb,nsv_AK8MatchedToHbb,sv0mass_AK8MatchedToHbb,sv1mass_AK8MatchedToHbb, nch_AK8MatchedToHbb,nmu_AK8MatchedToHbb,nel_AK8MatchedToHbb,muenfr_AK8MatchedToHbb,emenfr_AK8MatchedToHbb; reader->AddVariable( "pt_AK8MatchedToHbb", &pt_AK8MatchedToHbb ); reader->AddVariable( "eta_AK8MatchedToHbb", &eta_AK8MatchedToHbb ); reader->AddVariable( "nsv_AK8MatchedToHbb", &nsv_AK8MatchedToHbb ); reader->AddVariable( "sv0mass_AK8MatchedToHbb", &sv0mass_AK8MatchedToHbb ); reader->AddVariable( "sv1mass_AK8MatchedToHbb", &sv1mass_AK8MatchedToHbb ); reader->AddVariable( "nch_AK8MatchedToHbb", &nch_AK8MatchedToHbb ); reader->AddVariable( "nmu_AK8MatchedToHbb", &nmu_AK8MatchedToHbb ); reader->AddVariable( "nel_AK8MatchedToHbb", &nel_AK8MatchedToHbb ); reader->AddVariable( "muenfr_AK8MatchedToHbb", &muenfr_AK8MatchedToHbb ); reader->AddVariable( "emenfr_AK8MatchedToHbb", &emenfr_AK8MatchedToHbb ); // Spectator variables declared in the training have to be added to the reader, too Float_t spec1,spec2; reader->AddSpectator( "spec1:=n_pv", &spec1 ); reader->AddSpectator( "spec2:=msoftdrop_AK8MatchedToHbb", &spec2 ); // --- Book the MVA methods TString dir = "weights/"; TString prefix = "TMVARegression"; // Book method(s) for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { if (it->second) { TString methodName = it->first + " method"; TString weightfile = dir + prefix + "_" + TString(it->first) + ".weights.xml"; reader->BookMVA( methodName, weightfile ); } } TH1* hists[100]; Int_t nhists = -1; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { TH1* h = new TH1F( it->first.c_str(), TString(it->first) + " method", 100, -100, 600 ); if (it->second) hists[++nhists] = h; } nhists++; //1=signal ,0=QCD ,2=data int nameRoot=1; if((st2.find("QCD")!= std::string::npos)|| (st2.find("bGen")!= std::string::npos)|| (st2.find("bEnriched")!= std::string::npos))nameRoot=0; if(st2.find("data")!= std::string::npos)nameRoot=2; cout<<"nameRoot = "<<nameRoot<<endl; //option----------------------------------------------------------- int JESOption=0; // Prepare input tree (this must be replaced by your data source) // in this example, there is a toy tree with signal and one with background events // we'll later on use only the "signal" events for the test in this example. // TFile *f; TTree *tree; int nPass[20]= {0}; int total=0; double fixScaleNum[2]= {0}; TH1D* th1=new TH1D("a","a",150,50,200); string massName[nMass]= {"Thea","HCorr","Reg"}; string catName[nCat]= {"PP","PF","FP","FF"}; string tau21Name[3]= {"withTau21","woTau21","antiTau21"}; TH1D* th2[nMass][nCat][3]; TH1D* th3[nMass][nCat][3]; TH1D* th4[nMass][nCat][3]; for(int i=0; i<nMass; i++) { for(int j=0; j<nCat; j++) { for(int k=0; k<3; k++) { th2[i][j][k]=(TH1D*)th1->Clone(Form("loose_%s_%s_%s",massName[i].data(),catName[j].data(),tau21Name[k].data())); th3[i][j][k]=(TH1D*)th1->Clone(Form("tight_%s_%s_%s",massName[i].data(),catName[j].data(),tau21Name[k].data())); th4[i][j][k]=(TH1D*)th1->Clone(Form("tl_%s_%s_%s",massName[i].data(),catName[j].data(),tau21Name[k].data())); th2[i][j][k]->Sumw2(); th3[i][j][k]->Sumw2(); th4[i][j][k]->Sumw2(); } } } for (int w=wMs; w<wM; w++) { if(w%20==0)cout<<w<<endl; if (nameRoot!=1)f = TFile::Open(Form("%s%d.root",st.data(),w)); else f = TFile::Open(st.data()); if (!f || !f->IsOpen())continue; /*TDirectory * dir; if (nameRoot!=1)dir = (TDirectory*)f->Get(Form("%s%d.root:/tree",st.data(),w)); else dir = (TDirectory*)f->Get(Form("%s:/tree",st.data())); dir->GetObject("treeMaker",tree); */ tree=(TTree*)f->Get("treeMaker"); TreeReader data(tree); total+=data.GetEntriesFast(); for(Long64_t jEntry=0; jEntry<data.GetEntriesFast() ; jEntry++) { data.GetEntry(jEntry); Int_t nVtx = data.GetInt("nVtx"); //0. has a good vertex if(nVtx<1)continue; nPass[0]++; //1.trigger std::string* trigName = data.GetPtrString("hlt_trigName"); vector<bool> &trigResult = *((vector<bool>*) data.GetPtr("hlt_trigResult")); bool passTrigger=false; for(int it=0; it< data.GetPtrStringSize(); it++) { std::string thisTrig= trigName[it]; bool results = trigResult[it]; if( ((thisTrig.find("HLT_PFHT800")!= std::string::npos|| thisTrig.find("HLT_AK8DiPFJet300_200_TrimMass30_BTagCSV_p20")!= std::string::npos ) && results==1)) { passTrigger=true; break; } } if(!passTrigger && nameRoot==2)continue; nPass[1]++; const int nAK8Jet=data.GetInt("AK8PuppinJet"); //2.nJets if(nAK8Jet<2)continue; nPass[2]++; int* AK8PuppinSubSDJet=data.GetPtrInt("AK8PuppinSubSDJet"); if(AK8PuppinSubSDJet[0]!=2||AK8PuppinSubSDJet[1]!=2)continue; TClonesArray* AK8PuppijetP4 = (TClonesArray*) data.GetPtrTObject("AK8PuppijetP4"); float* AK8PuppijetCorrUncUp = data.GetPtrFloat("AK8PuppijetCorrUncUp"); float* AK8PuppijetCorrUncDown = data.GetPtrFloat("AK8PuppijetCorrUncDown"); TLorentzVector* thisJet ,* thatJet; thisJet=(TLorentzVector*)AK8PuppijetP4->At(0); thatJet=(TLorentzVector*)AK8PuppijetP4->At(1); //3. Pt if(thisJet->Pt()>99998 ||thatJet->Pt()>99998 )continue; if(thisJet->Pt()<300)continue; if(thatJet->Pt()<300)continue; nPass[3]++; //4tightId----------------------------------------- vector<bool> &AK8PuppijetPassIDTight = *((vector<bool>*) data.GetPtr("AK8PuppijetPassIDTight")); if(AK8PuppijetPassIDTight[0]==0)continue; if(AK8PuppijetPassIDTight[1]==0)continue; Float_t* AK8PuppijetCEmEF = data.GetPtrFloat("AK8PuppijetCEmEF"); Float_t* AK8PuppijetMuoEF = data.GetPtrFloat("AK8PuppijetMuoEF"); if(AK8PuppijetMuoEF[0]>0.8)continue; if(AK8PuppijetCEmEF[0]>0.9)continue; if(AK8PuppijetMuoEF[1]>0.8)continue; if(AK8PuppijetCEmEF[1]>0.9)continue; nPass[4]++; //5. Eta----------------------------------------- if(fabs(thisJet->Eta())>2.4)continue; if(fabs(thatJet->Eta())>2.4)continue; nPass[5]++; //6. DEta----------------------------------------- float dEta = fabs(thisJet->Eta()-thatJet->Eta()); if(dEta>1.3)continue; nPass[6]++; //7. Mjj----------------------------------------- //float mjjRed = (*thisJet+*thatJet).M()+250-thisJet->M()-thatJet->M(); //if(mjjRed<1000)continue; nPass[7]++; //8. fatjetPRmassL2L3Corr----------------------------------------- nPass[8]++; //9.----------------------------------------- Float_t* AK8Puppijet_DoubleSV = data.GetPtrFloat("AK8Puppijet_DoubleSV"); int looseStat=-1; int tightStat=-1; int tlStat=-1; if(AK8Puppijet_DoubleSV[0]>0.3 && AK8Puppijet_DoubleSV[1]>0.3)looseStat=0; else if(AK8Puppijet_DoubleSV[0]>0.3 && AK8Puppijet_DoubleSV[1]<0.3)looseStat=1; else if(AK8Puppijet_DoubleSV[0]<0.3 && AK8Puppijet_DoubleSV[1]>0.3)looseStat=2; else looseStat=3; if(AK8Puppijet_DoubleSV[0]>0.8 && AK8Puppijet_DoubleSV[1]>0.8)tightStat=0; else if(AK8Puppijet_DoubleSV[0]>0.8 && AK8Puppijet_DoubleSV[1]<0.8)tightStat=1; else if(AK8Puppijet_DoubleSV[0]<0.3 && AK8Puppijet_DoubleSV[1]>0.8)tightStat=2; else if(AK8Puppijet_DoubleSV[0]<0.3 && AK8Puppijet_DoubleSV[1]<0.8)tightStat=3; else tightStat=-1; if(AK8Puppijet_DoubleSV[0]>0.8 && AK8Puppijet_DoubleSV[1]>0.3)tlStat=0; else if(AK8Puppijet_DoubleSV[0]>0.8 && AK8Puppijet_DoubleSV[1]<0.3)tlStat=1; else if(AK8Puppijet_DoubleSV[0]<0.3 && AK8Puppijet_DoubleSV[1]>0.3)tlStat=2; else if(AK8Puppijet_DoubleSV[0]<0.3 && AK8Puppijet_DoubleSV[1]<0.3)tlStat=3; else tlStat=-1; double varTemp[2]; Float_t* AK8PuppijetSDmass = data.GetPtrFloat("AK8PuppijetSDmass"); Int_t* AK8Puppijet_nSV=data.GetPtrInt("AK8Puppijet_nSV"); vector<float> *AK8Puppijet_SVMass = data.GetPtrVectorFloat("AK8Puppijet_SVMass"); int nEle= data.GetInt("nEle"); int nMu=data.GetInt("nMu"); Float_t* AK8PuppijetEleEF = data.GetPtrFloat("AK8PuppijetEleEF"); //Float_t* AK8PuppijetMuoEF = data.GetPtrFloat("AK8PuppijetMuoEF"); Int_t* AK8PuppijetCMulti=data.GetPtrInt("AK8PuppijetCMulti"); Int_t* AK8PuppijetEleMulti=data.GetPtrInt("AK8PuppijetEleMulti"); Int_t* AK8PuppijetMuoMulti=data.GetPtrInt("AK8PuppijetMuoMulti"); for(int i=0; i<2; i++) { TLorentzVector* thisAK8Jet ; if(i==1)thisAK8Jet=thatJet; else thisAK8Jet=thisJet; pt_AK8MatchedToHbb=thisAK8Jet->Pt(); eta_AK8MatchedToHbb=thisAK8Jet->Eta(); nsv_AK8MatchedToHbb=AK8Puppijet_nSV[i]; sv0mass_AK8MatchedToHbb=AK8Puppijet_SVMass[i][0]; sv1mass_AK8MatchedToHbb=AK8Puppijet_SVMass[i][1]; nmu_AK8MatchedToHbb=AK8PuppijetMuoMulti[i]; nel_AK8MatchedToHbb=AK8PuppijetEleMulti[i]; muenfr_AK8MatchedToHbb=AK8PuppijetMuoEF[i]; nch_AK8MatchedToHbb=AK8PuppijetCMulti[i]; emenfr_AK8MatchedToHbb=AK8PuppijetEleEF[i]; spec1=nVtx; spec2=AK8PuppijetSDmass[i]; Float_t val ; for (Int_t ih=0; ih<nhists; ih++) { TString title = hists[ih]->GetTitle(); val= (reader->EvaluateRegression( title ))[0]; } varTemp[i]=val; } double PUPPIweight[2]= {0}; PUPPIweight[0]=getPUPPIweight(thisJet->Pt(),thisJet->Eta()); PUPPIweight[1]=getPUPPIweight(thatJet->Pt(),thatJet->Eta()); double PUPPIweightThea[2]= {0}; PUPPIweightThea[0]=getPUPPIweight_o(thisJet->Pt(),thisJet->Eta()); PUPPIweightThea[1]=getPUPPIweight_o(thatJet->Pt(),thatJet->Eta()); TLorentzVector thisJetReg, thatJetReg; thisJetReg=(*thisJet)*varTemp[0]; thatJetReg=(*thatJet)*varTemp[1]; double PUPPIweightOnRegressed[2]= {0}; PUPPIweightOnRegressed[0]=getPUPPIweightOnRegressed(thisJetReg.Pt(),thisJetReg.Eta()); PUPPIweightOnRegressed[1]=getPUPPIweightOnRegressed(thatJetReg.Pt(),thatJetReg.Eta()); double mass_j0=0,mass_j1=0; for(int i=0; i<nMass; i++) { if(i==0) { mass_j0=AK8PuppijetSDmass[0]*PUPPIweightThea[0]; mass_j1=AK8PuppijetSDmass[1]*PUPPIweightThea[1]; } else if (i==1) { mass_j0=AK8PuppijetSDmass[0]*PUPPIweight[0]; mass_j1=AK8PuppijetSDmass[1]*PUPPIweight[1]; } else { mass_j0=AK8PuppijetSDmass[0]*varTemp[0]*PUPPIweightOnRegressed[0]; mass_j1=AK8PuppijetSDmass[1]*varTemp[1]*PUPPIweightOnRegressed[1]; } if(mass_j1<50)continue; if(mass_j0>100 && mass_j0<145)continue; //cout<<mass_j0<<","<<mass_j1<<",stat="<<looseStat<<","<<tightStat<<endl; th2[i][looseStat][1]->Fill(mass_j0); if(tightStat>=0)th3[i][tightStat][1]->Fill(mass_j0); if(tlStat>=0)th4[i][tlStat][1]->Fill(mass_j0); } Float_t* AK8PuppijetTau1 = data.GetPtrFloat("AK8PuppijetTau1"); Float_t* AK8PuppijetTau2 = data.GetPtrFloat("AK8PuppijetTau2"); double puppiTau21[2]; puppiTau21[0]=(AK8PuppijetTau2[0]/AK8PuppijetTau1[0]),puppiTau21[1]=(AK8PuppijetTau2[1]/AK8PuppijetTau1[1]); if(puppiTau21[0]>0.6 && puppiTau21[1]<0.6) { for(int i=0; i<nMass; i++) { if(i==0) { mass_j0=AK8PuppijetSDmass[0]*PUPPIweightThea[0]; mass_j1=AK8PuppijetSDmass[1]*PUPPIweightThea[1]; } else if (i==1) { mass_j0=AK8PuppijetSDmass[0]*PUPPIweight[0]; mass_j1=AK8PuppijetSDmass[1]*PUPPIweight[1]; } else { mass_j0=AK8PuppijetSDmass[0]*varTemp[0]*PUPPIweightOnRegressed[0]; mass_j1=AK8PuppijetSDmass[1]*varTemp[1]*PUPPIweightOnRegressed[1]; } if(mass_j1<50)continue; if(mass_j0>100 && mass_j0<145)continue; th2[i][looseStat][2]->Fill(mass_j0); if(tightStat>=0)th3[i][tightStat][2]->Fill(mass_j0); if(tlStat>=0)th4[i][tlStat][2]->Fill(mass_j0); } } if(puppiTau21[0]>0.6 || puppiTau21[1]>0.6) continue; for(int i=0; i<nMass; i++) { if(i==0) { mass_j0=AK8PuppijetSDmass[0]*PUPPIweightThea[0]; mass_j1=AK8PuppijetSDmass[1]*PUPPIweightThea[1]; } else if (i==1) { mass_j0=AK8PuppijetSDmass[0]*PUPPIweight[0]; mass_j1=AK8PuppijetSDmass[1]*PUPPIweight[1]; } else { mass_j0=AK8PuppijetSDmass[0]*varTemp[0]*PUPPIweightOnRegressed[0]; mass_j1=AK8PuppijetSDmass[1]*varTemp[1]*PUPPIweightOnRegressed[1]; } if(mass_j1<50)continue; if(mass_j0>100 && mass_j0<145)continue; th2[i][looseStat][0]->Fill(mass_j0); if(tightStat>=0)th3[i][tightStat][0]->Fill(mass_j0); if(tlStat>=0)th4[i][tlStat][0]->Fill(mass_j0); } } } for(int i=0; i<10; i++)cout<<"npass["<<i<<"]="<<nPass[i]<<endl; TFile* outFile;//= new TFile(Form("PFRatio/%s.root",st2.data()),"recreate"); outFile= new TFile(Form("PFRatio/%s/%d.root",st2.data(),wMs),"recreate"); for(int i=0; i<nMass; i++) { for(int j=0; j<nCat; j++) { for(int k=0; k<3; k++) { th2[i][j][k]->Write(); th3[i][j][k]->Write(); th4[i][j][k]->Write(); } } } outFile->Close(); for(int i=0; i<nMass; i++) { for(int j=0; j<nCat; j++) { for(int k=0; k<2; k++) { delete th2[i][j][k]; delete th3[i][j][k]; delete th4[i][j][k]; } } } delete reader; }
void TMVAClassificationCategoryApplication() { // --------------------------------------------------------------- // default MVA methods to be trained + tested std::map<std::string,int> Use; // --- Use["LikelihoodCat"] = 1; Use["FisherCat"] = 1; // --------------------------------------------------------------- std::cout << std::endl << "==> Start TMVAClassificationCategoryApplication" << std::endl; // --- Create the Reader object TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); // Create a set of variables and spectators and declare them to the reader // - the variable names MUST corresponds in name and type to those given in the weight file(s) used Float_t var1, var2, var3, var4, eta; reader->AddVariable( "var1", &var1 ); reader->AddVariable( "var2", &var2 ); reader->AddVariable( "var3", &var3 ); reader->AddVariable( "var4", &var4 ); reader->AddSpectator( "eta", &eta ); // --- Book the MVA methods for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { if (it->second) { TString methodName = it->first + " method"; TString weightfile = "dataset/weights/TMVAClassificationCategory_" + TString(it->first) + ".weights.xml"; reader->BookMVA( methodName, weightfile ); } } // Book output histograms UInt_t nbin = 100; std::map<std::string,TH1*> hist; hist["LikelihoodCat"] = new TH1F( "MVA_LikelihoodCat", "MVA_LikelihoodCat", nbin, -1, 0.9999 ); hist["FisherCat"] = new TH1F( "MVA_FisherCat", "MVA_FisherCat", nbin, -4, 4 ); // Prepare input tree (this must be replaced by your data source) // in this example, there is a toy tree with signal and one with background events // we'll later on use only the "signal" events for the test in this example. // TString fname = TString(gSystem->DirName(__FILE__) ) + "/data/"; // if directory data not found try using tutorials dir if (gSystem->AccessPathName( fname )) { fname = TString(gROOT->GetTutorialsDir()) + "/tmva/data/"; } if (UseOffsetMethod) fname += "toy_sigbkg_categ_offset.root"; else fname += "toy_sigbkg_categ_varoff.root"; std::cout << "--- TMVAClassificationApp : Accessing " << fname << "!" << std::endl; TFile *input = TFile::Open(fname); if (!input) { std::cout << "ERROR: could not open data file: " << fname << std::endl; exit(1); } // --- Event loop // Prepare the tree // - here the variable names have to corresponds to your tree // - you can use the same variables as above which is slightly faster, // but of course you can use different ones and copy the values inside the event loop // TTree* theTree = (TTree*)input->Get("TreeS"); std::cout << "--- Use signal sample for evalution" << std::endl; theTree->SetBranchAddress( "var1", &var1 ); theTree->SetBranchAddress( "var2", &var2 ); theTree->SetBranchAddress( "var3", &var3 ); theTree->SetBranchAddress( "var4", &var4 ); theTree->SetBranchAddress( "eta", &eta ); // spectator std::cout << "--- Processing: " << theTree->GetEntries() << " events" << std::endl; TStopwatch sw; sw.Start(); for (Long64_t ievt=0; ievt<theTree->GetEntries();ievt++) { if (ievt%1000 == 0) std::cout << "--- ... Processing event: " << ievt << std::endl; theTree->GetEntry(ievt); // --- Return the MVA outputs and fill into histograms for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { if (!it->second) continue; TString methodName = it->first + " method"; hist[it->first]->Fill( reader->EvaluateMVA( methodName ) ); } } sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); // --- Write histograms TFile *target = new TFile( "TMVApp.root","RECREATE" ); for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) if (it->second) hist[it->first]->Write(); target->Close(); std::cout << "--- Created root file: \"TMVApp.root\" containing the MVA output histograms" << std::endl; delete reader; std::cout << "==> TMVAClassificationApplication is done!" << std::endl << std::endl; }
void TMVAClassificationApplication( TString myMethodList = "" ) { #ifdef __CINT__ gROOT->ProcessLine( ".O0" ); // turn off optimization in CINT #endif //--------------------------------------------------------------- // This loads the library TMVA::Tools::Instance(); // set verbosity //TMVA::Tools::Instance().Log().SetMinType(kINFO); // Default MVA methods to be trained + tested std::map<std::string,int> Use; Use["BDT"] = 1; // uses Adaptive Boost Use["Category"] = 1; std::cout << std::endl; std::cout << "==> Start TMVAClassificationApplication" << std::endl; // Select methods (don't look at this code - not of interest) if (myMethodList != "") { for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) it->second = 0; std::vector<TString> mlist = gTools().SplitString( myMethodList, ',' ); for (UInt_t i=0; i<mlist.size(); i++) { std::string regMethod(mlist[i]); if (Use.find(regMethod) == Use.end()) { std::cout << "Method \"" << regMethod << "\" not known in TMVA under this name. Choose among the following:" << std::endl; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { std::cout << it->first << " "; } std::cout << std::endl; return; } Use[regMethod] = 1; } } // -------------------------------------------------------------------------------------------------- // --- Create the Reader object TMVA::Reader *reader = new TMVA::Reader( "Color:!Silent" ); reader->SetMsgType(kINFO); // CMS STATS: // // Create a set of variables and declare them to the reader // - the variable names MUST corresponds in name and type to those given in the weight file(s) used Float_t met; Float_t HT; Float_t minMLB; Float_t leptonJetsMETSum; reader->AddVariable( "met", &met ); reader->AddVariable( "HT", &HT ); reader->AddVariable( "minMLB", &minMLB ); reader->AddVariable( "leptonJetsMETSum", &leptonJetsMETSum ); // CMS STATS: // *** VERY IMPORTANT! *** // TMVA notoriously has problems with integer and other non-float branches. // Better not to use them at all and convert them to Float_t. If you happen // to have integer branches that you need, as in this example, you should create // corresponding float spectator variables and assign them in the event loop. // // Spectator variables declared in the training have to be added to the reader, too // // Note that the corresponding branches are integer, so we create floats too! Int_t nBTag; Int_t nJets; Int_t nLeptons; Int_t isMuon1; Int_t isMuon2; Int_t isMuon3; Int_t isMuon4; Float_t nBTagFloat; Float_t nJetsFloat; Float_t nLeptonsFloat; Float_t isMuon1Float; Float_t isMuon2Float; Float_t isMuon3Float; Float_t isMuon4Float; Float_t leptonSumMass; reader->AddSpectator( "nBTag", &nBTagFloat ); reader->AddSpectator( "nJets", &nJetsFloat ); reader->AddSpectator( "nLeptons", &nLeptonsFloat ); reader->AddSpectator( "isMuon1", &isMuon1Float ); reader->AddSpectator( "isMuon2", &isMuon2Float ); reader->AddSpectator( "isMuon3", &isMuon3Float ); reader->AddSpectator( "isMuon4", &isMuon4Float ); reader->AddSpectator( "leptonSumMass", &leptonSumMass ); // CMS STATS: // cut definitions. Define categories and overall selection. #include "TMVA_tprime_cuts.C" // Add artificial spectators for distinguishing categories Float_t Category_mycat1, Category_mycat2, Category_mycat3, Category_mycat4; TString sCat1("Category_cat1:="); TString sCat2("Category_cat2:="); TString sCat3("Category_cat3:="); TString sCat4("Category_cat4:="); sCat1.Append(cut_os_cat1); sCat2.Append(cut_os_cat2); sCat3.Append(cut_ss); sCat4.Append(cut_tri); reader->AddSpectator( sCat1, &Category_mycat1 ); reader->AddSpectator( sCat2, &Category_mycat2 ); reader->AddSpectator( sCat3, &Category_mycat3 ); reader->AddSpectator( sCat4, &Category_mycat4 ); // --- Book the MVA methods TString dir = "weights/"; TString prefix = "TMVAClassification"; // Book method(s) for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { if (it->second) { TString methodName = TString(it->first) + TString(" method"); TString weightfile = dir + prefix + TString("_") + TString(it->first) + TString(".weights.xml"); reader->BookMVA( methodName, weightfile ); } } // Book output histograms UInt_t nbin = 100; TH1F * histBdt(0); TH1F * histCat(0); if (Use["BDT"]) histBdt = new TH1F( "MVA_BDT", "MVA_BDT", nbin, -0.8, 0.8 ); if (Use["Category"]) histCat = new TH1F( "MVA_Category", "MVA_Category", nbin, -2., 2. ); // Prepare input tree (this must be replaced by your data source) // in this example, there is a toy tree with signal and one with background events // we'll later on use only the "signal" events for the test in this example. // TFile *input(0); // CMS STATS: // Specify files with data, for which you want to compute the classifier values TString fname = "./data/pass7_OS_test1/TTbar_MuMu/all.root"; //TString fname = "./data/pass7_TRI_test1/TTbar_MuMu/all.root"; if (!gSystem->AccessPathName( fname )) input = TFile::Open( fname ); // check if file in local directory exists if (!input) { std::cout << "ERROR: could not open data file" << std::endl; exit(1); } std::cout << "--- TMVAClassificationApp : Using input file: " << input->GetName() << std::endl; // --- Event loop // Prepare the event tree // - here the variable names have to corresponds to your tree // - you can use the same variables as above which is slightly faster, // but of course you can use different ones and copy the values inside the event loop // std::cout << "--- Select signal sample" << std::endl; TTree* theTree = (TTree*)input->Get("MVA"); //Float_t userVar1, userVar2; theTree->SetBranchAddress( "met", &met ); theTree->SetBranchAddress( "HT", &HT ); theTree->SetBranchAddress( "minMLB", &minMLB ); theTree->SetBranchAddress( "leptonJetsMETSum", &leptonJetsMETSum ); // spectators theTree->SetBranchAddress( "leptonSumMass", &leptonSumMass ); theTree->SetBranchAddress( "nJets", &nJets ); theTree->SetBranchAddress( "nBTag", &nBTag ); theTree->SetBranchAddress( "nLeptons", &nLeptons ); theTree->SetBranchAddress( "isMuon1", &isMuon1 ); theTree->SetBranchAddress( "isMuon2", &isMuon2 ); theTree->SetBranchAddress( "isMuon3", &isMuon3 ); theTree->SetBranchAddress( "isMuon4", &isMuon4 ); std::vector<Float_t> vecVar(4); // vector for EvaluateMVA tests // CMS STATS: // // A little trick: loop over only selected events // make event list theTree->Draw(">>EvtList", mycut); TEventList * pEvtList = (TEventList *)gROOT->FindObject("EvtList"); long int nEvents = pEvtList->GetN(); //std::cout << "--- Processing: " << theTree->GetEntries() << " events" << std::endl; std::cout << "--- Processing: " << nEvents << " events" << std::endl; TStopwatch sw; sw.Start(); //for (Long64_t ievt=0; ievt<theTree->GetEntries();ievt++) { for (Long64_t ievt=0; ievt<nEvents; ++ievt) { if (ievt%1000 == 0) std::cout << "--- ... Processing event: " << ievt << std::endl; //theTree->GetEntry(ievt); theTree->GetEntry(pEvtList->GetEntry(ievt)); // CMS STATS: // *** HERE we assign integer branches' values to float spectator variables // Otherwise our category cuts would fail // nBTagFloat=(Float_t)nBTag; nJetsFloat=(Float_t)nJets; nLeptonsFloat=(Float_t)nLeptons; isMuon1Float = (Float_t)isMuon1; isMuon2Float = (Float_t)isMuon2; isMuon3Float = (Float_t)isMuon3; isMuon4Float = (Float_t)isMuon4; // --- Return the MVA outputs and fill into histograms if (Use["BDT" ]) histBdt ->Fill( reader->EvaluateMVA( "BDT method" ) ); if (Use["Category" ]) histCat ->Fill( reader->EvaluateMVA( "Category method" ) ); } // Get elapsed time sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); // --- Write histograms TFile *target = new TFile( "TMVApp.root","RECREATE" ); if (Use["BDT" ]) histBdt ->Write(); if (Use["Category" ]) histCat ->Write(); target->Close(); std::cout << "--- Created root file: \"TMVApp.root\" containing the MVA output histograms" << std::endl; delete reader; std::cout << "==> TMVAClassificationApplication is done!" << endl << std::endl; }
void TMVAMulticlassApplication( TString myMethodList = "" ) { #ifdef __CINT__ gROOT->ProcessLine( ".O0" ); // turn off optimization in CINT #endif TMVA::Tools::Instance(); //--------------------------------------------------------------- // default MVA methods to be trained + tested std::map<std::string,int> Use; Use["MLP"] = 1; Use["BDTG"] = 1; Use["FDA_GA"] = 0; //--------------------------------------------------------------- std::cout << std::endl; std::cout << "==> Start TMVAMulticlassApplication" << std::endl; if (myMethodList != "") { for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) it->second = 0; std::vector<TString> mlist = gTools().SplitString( myMethodList, ',' ); for (UInt_t i=0; i<mlist.size(); i++) { std::string regMethod(mlist[i]); if (Use.find(regMethod) == Use.end()) { std::cout << "Method \"" << regMethod << "\" not known in TMVA under this name. Choose among the following:" << std::endl; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) std::cout << it->first << " " << std::endl; std::cout << std::endl; return; } Use[regMethod] = 1; } } // create the Reader object TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); // create a set of variables and declare them to the reader // - the variable names must corresponds in name and type to // those given in the weight file(s) that you use Float_t var1, var2, var3, var4; reader->AddVariable( "var1", &var1 ); reader->AddVariable( "var2", &var2 ); reader->AddVariable( "var3", &var3 ); reader->AddVariable( "var4", &var4 ); // book the MVA methods TString dir = "weights/"; TString prefix = "TMVAMulticlass"; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { if (it->second) { TString methodName = TString(it->first) + TString(" method"); TString weightfile = dir + prefix + TString("_") + TString(it->first) + TString(".weights.xml"); reader->BookMVA( methodName, weightfile ); } } // book output histograms UInt_t nbin = 100; TH1F *histMLP_signal(0), *histBDTG_signal(0), *histFDAGA_signal(0); if (Use["MLP"]) histMLP_signal = new TH1F( "MVA_MLP_signal", "MVA_MLP_signal", nbin, 0., 1.1 ); if (Use["BDTG"]) histBDTG_signal = new TH1F( "MVA_BDTG_signal", "MVA_BDTG_signal", nbin, 0., 1.1 ); if (Use["FDA_GA"]) histFDAGA_signal = new TH1F( "MVA_FDA_GA_signal", "MVA_FDA_GA_signal", nbin, 0., 1.1 ); TFile *input(0); TString fname = "./tmva_example_multiple_background.root"; if (!gSystem->AccessPathName( fname )) { input = TFile::Open( fname ); // check if file in local directory exists } if (!input) { std::cout << "ERROR: could not open data file, please generate example data first!" << std::endl; exit(1); } std::cout << "--- TMVAMulticlassApp : Using input file: " << input->GetName() << std::endl; // prepare the tree // - here the variable names have to corresponds to your tree // - you can use the same variables as above which is slightly faster, // but of course you can use different ones and copy the values inside the event loop TTree* theTree = (TTree*)input->Get("TreeS"); std::cout << "--- Select signal sample" << std::endl; theTree->SetBranchAddress( "var1", &var1 ); theTree->SetBranchAddress( "var2", &var2 ); theTree->SetBranchAddress( "var3", &var3 ); theTree->SetBranchAddress( "var4", &var4 ); std::cout << "--- Processing: " << theTree->GetEntries() << " events" << std::endl; TStopwatch sw; sw.Start(); for (Long64_t ievt=0; ievt<theTree->GetEntries();ievt++) { if (ievt%1000 == 0){ std::cout << "--- ... Processing event: " << ievt << std::endl; } theTree->GetEntry(ievt); if (Use["MLP"]) histMLP_signal->Fill((reader->EvaluateMulticlass( "MLP method" ))[0]); if (Use["BDTG"]) histBDTG_signal->Fill((reader->EvaluateMulticlass( "BDTG method" ))[0]); if (Use["FDA_GA"]) histFDAGA_signal->Fill((reader->EvaluateMulticlass( "FDA_GA method" ))[0]); } // get elapsed time sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); TFile *target = new TFile( "TMVAMulticlassApp.root","RECREATE" ); if (Use["MLP"]) histMLP_signal->Write(); if (Use["BDTG"]) histBDTG_signal->Write(); if (Use["FDA_GA"]) histFDAGA_signal->Write(); target->Close(); std::cout << "--- Created root file: \"TMVMulticlassApp.root\" containing the MVA output histograms" << std::endl; delete reader; std::cout << "==> TMVAClassificationApplication is done!" << std::endl << std::endl; }
TString TMVAPredict(TString method_name, EnumPredictMode predictMode = EnumPredictMode::FINAL) { std::cout << "------------ predict with : " << method_name << " ------ " << std::endl; std::vector<std::string> inputNames = {"training","test","check_correlation","check_agreement"}; std::map<std::string,std::vector<std::string>> varsForInput; std::vector<std::string> variableOrder = {"id", "signal", "mass", "min_ANNmuon", "prediction"}; varsForInput["training"].emplace_back ("prediction"); if (predictMode != EnumPredictMode::INTERMEDIATE) { varsForInput["training"].emplace_back ("id"); varsForInput["training"].emplace_back ("signal"); varsForInput["training"].emplace_back ("mass"); varsForInput["training"].emplace_back ("min_ANNmuon"); varsForInput["test"].emplace_back ("prediction"); varsForInput["test"].emplace_back ("id"); varsForInput["check_agreement"].emplace_back ("signal"); varsForInput["check_agreement"].emplace_back ("weight"); varsForInput["check_agreement"].emplace_back ("prediction"); varsForInput["check_correlation"].emplace_back ("mass"); varsForInput["check_correlation"].emplace_back ("prediction"); } std::map<std::string,std::vector<std::string>> createForInput; createForInput["training"].emplace_back ("root"); if (predictMode != EnumPredictMode::INTERMEDIATE) { createForInput["training"].emplace_back ("csv"); createForInput["test"].emplace_back ("csv"); createForInput["check_agreement"].emplace_back ("csv"); createForInput["check_correlation"].emplace_back ("csv"); } // -------- prepare the Reader ------ TMVA::Tools::Instance(); std::cout << "==> Start TMVAPredict" << std::endl; TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); std::vector<Float_t> variables (variableNames.size ()); auto itVar = begin (variables); for (auto varName : variableNames) { Float_t* pVar = &(*itVar); auto localVarName = varName; localVarName.substr(0,localVarName.find(":=")); reader->AddVariable(varName.c_str(), pVar); (*itVar) = 0.0; ++itVar; } // spectators not known for the reader (in test.csv) for (auto varName : spectatorNames) { Float_t spectator (0.0); reader->AddSpectator (varName.c_str(), &spectator); ++itVar; } TString dir = "weights/"; TString prefix = "TMVAClassification"; TString weightfile = dir + prefix + TString("_") + method_name + TString(".weights.xml"); std::cout << "weightfile name : " << weightfile.Data () << std::endl; reader->BookMVA( method_name, weightfile ); // --------- for each of the input files for (auto inputName : inputNames) { // --- define variables Int_t id; Float_t prediction; Float_t weight; Float_t min_ANNmuon; Float_t mass; Float_t signal; // --- open input file TFile *input(0); std::stringstream infilename; infilename << pathToData.Data () << inputName << ".root"; std::cout << "infilename = " << infilename.str ().c_str () << std::endl; input = TFile::Open (infilename.str ().c_str ()); TTree* tree = (TTree*)input->Get("data"); // --- prepare branches on input file // id field if needed if (contains (varsForInput, inputName, "id")) tree->SetBranchAddress("id", &id); // signal field if needed if (contains (varsForInput, inputName, "signal")) tree->SetBranchAddress("signal", &signal); // min_ANNmuon field if needed if (contains (varsForInput, inputName, "min_ANNmuon")) tree->SetBranchAddress("min_ANNmuon", &min_ANNmuon); // mass field if needed if (contains (varsForInput, inputName, "mass")) tree->SetBranchAddress("mass", &mass); // weight field if needed if (contains (varsForInput, inputName, "weight")) tree->SetBranchAddress("weight", &weight); // variables for prediction itVar = begin (variables); for (auto inputName : variableNames) { Float_t* pVar = &(*itVar); tree->SetBranchAddress(inputName.c_str(), pVar); ++itVar; } // ---- make ROOT file TString rootFileName; TFile* outRootFile (NULL); TTree* outTree (NULL); if (contains (createForInput, inputName, "root")) { rootFileName = TString (inputName.c_str ()) + TString ("_prediction__") + method_name + TString (".root"); outRootFile = new TFile (rootFileName.Data (), "RECREATE"); outTree = new TTree("data","data"); if (contains (varsForInput, inputName, "id")) outTree->Branch ("id", &id, "F"); if (contains (varsForInput, inputName, "signal")) outTree->Branch ("signal", &signal, "F"); if (contains (varsForInput, inputName, "min_ANNmuon")) outTree->Branch ("min_ANNmuon", &min_ANNmuon, "F"); if (contains (varsForInput, inputName, "mass")) outTree->Branch ("mass", &mass, "F"); if (contains (varsForInput, inputName, "weight")) outTree->Branch ("weight", &weight, "F"); if (contains (varsForInput, inputName, "prediction")) outTree->Branch ("prediction", &prediction, "F"); } // ---- prepare csv file std::ofstream outfile; if (contains (createForInput, inputName, "csv")) { std::stringstream outfilename; outfilename << inputName << "_prediction__" << method_name.Data () << ".csv"; std::cout << outfilename.str () << std::endl; /* return; */ outfile.open (outfilename.str ()); bool isFirst = true; for (auto varName : variableOrder) { if (contains (varsForInput, inputName, varName)) { if (!isFirst) outfile << ","; isFirst = false; outfile << varName; } } outfile << "\n"; } bool doCSV = contains (createForInput, inputName, "csv"); bool doROOT = contains (createForInput, inputName, "root"); for (Long64_t ievt=0; ievt < tree->GetEntries(); ievt++) { tree->GetEntry(ievt); // predict prediction = reader->EvaluateMVA (method_name); prediction = std::max<double> (0.0, std::min<double> (1.0, prediction)); //prediction = (prediction + 1.0)/2.0; if (doCSV) { for (auto varName : variableOrder) { if (varName == "id" && contains (varsForInput, inputName, "id")) outfile << id << ","; if (varName == "signal" && contains (varsForInput, inputName, "signal")) outfile << signal << ","; if (varName == "min_ANNmuon" && contains (varsForInput, inputName, "min_ANNmuon")) outfile << min_ANNmuon << ","; if (varName == "mass" && contains (varsForInput, inputName, "mass")) outfile << mass << ","; if (varName == "weight" && contains (varsForInput, inputName, "weight")) outfile << weight << ","; if (varName == "prediction" && contains (varsForInput, inputName, "prediction")) outfile << prediction; } outfile << "\n"; } if (doROOT) { outTree->Fill (); } } outfile.close(); input->Close(); if (doROOT) { outRootFile->Write (); } if (predictMode == EnumPredictMode::INTERMEDIATE) { delete reader; std::cout << "DONE predict INTERMEDIATE" << std::endl; return rootFileName; } } delete reader; if (predictMode == EnumPredictMode::FINAL) { std::cout << "DONE predict FINAL" << std::endl; TString cmd (".! python tests.py "); cmd += method_name; gROOT->ProcessLine (cmd); } return method_name; }
TString useAutoencoder (TString method_name) { TMVA::Tools::Instance(); std::cout << "==> Start useAutoencoder" << std::endl; TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); Float_t signal = 0.0; Float_t outSignal = 0.0; Float_t inSignal = 0.0; std::vector<std::string> localVariableNames (variableNames+additionalVariableNames); std::vector<Float_t> variables (localVariableNames.size ()); auto itVar = begin (variables); for (auto varName : localVariableNames) { Float_t* pVar = &(*itVar); reader->AddVariable(varName.c_str(), pVar); (*itVar) = 0.0; ++itVar; } int idxSignal = std::distance (localVariableNames.begin (), std::find (localVariableNames.begin (), localVariableNames.end (),std::string ("signal"))); TString dir = "weights/"; TString prefix = "TMVAAutoencoder"; TString weightfile = dir + prefix + TString("_") + method_name + TString(".weights.xml"); TString outPrefix = "transformed"; TString outfilename = pathToData + outPrefix + TString("_") + method_name + TString(".root"); reader->BookMVA( method_name, weightfile ); TFile* outFile = new TFile (outfilename.Data (), "RECREATE"); std::vector<std::string> inputNames = {"training"}; std::map<std::string,std::vector<std::string>> varsForInput; varsForInput["training"].emplace_back ("id"); varsForInput["training"].emplace_back ("signal"); for (auto inputName : inputNames) { std::stringstream outfilename; outfilename << inputName << "_transformed__" << method_name.Data () << ".root"; std::cout << outfilename.str () << std::endl; /* return; */ std::stringstream infilename; infilename << pathToData.Data () << inputName << ".root"; TTree* outTree = new TTree("transformed","transformed"); std::vector<Float_t> outVariables (localVariableNames.size ()); itVar = begin (variables); auto itOutVar = begin (outVariables); for (auto varName : localVariableNames) { Float_t* pOutVar = &(*itOutVar); outTree->Branch (varName.c_str (), pOutVar, "F"); (*itOutVar) = 0.0; ++itOutVar; Float_t* pVar = &(*itVar); std::stringstream svar; svar << varName << "_in"; outTree->Branch (svar.str ().c_str (), pVar, "F"); (*itVar) = 0.0; ++itVar; } Float_t signal_original = 0.0; outTree->Branch ("signal_original", &signal_original, "F"); TFile *input(0); std::cout << "infilename = " << infilename.str ().c_str () << std::endl; input = TFile::Open (infilename.str ().c_str ()); TTree* tree = (TTree*)input->Get("data"); Int_t ids; // id field if needed if (std::find (varsForInput[inputName].begin (), varsForInput[inputName].end (), "id") != varsForInput[inputName].end ()) tree->SetBranchAddress("id", &ids); // variables for prediction itVar = begin (variables); for (auto inputName : localVariableNames) { Float_t* pVar = &(*itVar); tree->SetBranchAddress (inputName.c_str(), pVar); ++itVar; } for (Long64_t ievt=0; ievt < tree->GetEntries(); ievt++) { tree->GetEntry(ievt); // predict signal_original = variables.at (idxSignal); for (int forcedSignal = 0; forcedSignal <= 1; ++forcedSignal) { variables.at (idxSignal) = forcedSignal; std::vector<Float_t> regressionValues = reader->EvaluateRegression (method_name); size_t idx = 0; for (auto it = std::begin (regressionValues), itEnd = std::end (regressionValues); it != itEnd; ++it) { outVariables.at (idx) = *it; ++idx; } outTree->Fill (); } } outFile->Write (); input->Close(); } delete reader; return outfilename; }
/* void allBranches(TTree* inTree){ inTree->SetBranchAddress("fullpmet",&fullpmet); inTree->SetBranchAddress("trkpmet",&trkpmet); inTree->SetBranchAddress("ratioMet",&ratioMet); inTree->SetBranchAddress("ptll",&ptll); inTree->SetBranchAddress("mth",&mth); inTree->SetBranchAddress("jetpt1",&jetpt1); inTree->SetBranchAddress("ptWW",&ptWW); inTree->SetBranchAddress("dphilljet",&dphilljet); inTree->SetBranchAddress("dphillmet",&dphillmet); inTree->SetBranchAddress("dphijet1met",&dphijet1met); inTree->SetBranchAddress("nvtx",&nvtx); inTree->SetBranchAddress("baseW",&baseW); } void createOutput(TTree* outTree){ outTree->Branch("fullpmet",&fullpmet); outTree->Branch("trkpmet",&trkpmet); outTree->Branch("ratioMet",&ratioMet); outTree->Branch("ptll",&ptll); outTree->Branch("mth",&mth); outTree->Branch("jetpt1",&jetpt1); outTree->Branch("ptWW",&ptWW); outTree->Branch("dphilljet",&dphilljet); outTree->Branch("dphillmet",&dphillmet); outTree->Branch("dphijet1met",&dphijet1met); outTree->Branch("nvtx",&nvtx); outTree->Branch("baseW",&baseW); } */ void read(TString sampleName = "WW") { //calling the reader of the MVA analysis TMVA::Reader* reader = new TMVA::Reader(""); reader->AddVariable("fullpmet",&fullpmet); reader->AddVariable("trkpmet",&trkpmet); reader->AddVariable("ratioMet",&ratioMet); reader->AddVariable("ptll",&ptll); reader->AddVariable("mth",&mth); reader->AddVariable("jetpt1",&jetpt1); reader->AddVariable("ptWW",&ptWW); reader->AddVariable("dphilljet",&dphilljet); reader->AddVariable("dphillmet",&dphillmet); reader->AddVariable("dphijet1met",&dphijet1met); reader->AddVariable("nvtx",&nvtx); //reader->BookMVA("Fisher", "weights/MVAnalysis_Fisher.weights.xml"); reader->BookMVA("BDT", "weights/" + sampleName + "_BDT.weights.xml"); /* //Calling WW Signal File and Tree and Creating Output Signal Trees TFile *MySigFile = new TFile("../rootFiles/AllJet/OF/WW.root","READ"); TTree* MySigTree = (TTree*)MySigFile->Get("nt"); MySigTree->SetBranchAddress("fullpmet",&fullpmet); MySigTree->SetBranchAddress("trkpmet",&trkpmet); MySigTree->SetBranchAddress("ratioMet",&ratioMet); MySigTree->SetBranchAddress("ptll",&ptll); MySigTree->SetBranchAddress("mth",&mth); MySigTree->SetBranchAddress("jetpt1",&jetpt1); MySigTree->SetBranchAddress("ptWW",&ptWW); MySigTree->SetBranchAddress("dphilljet",&dphilljet); MySigTree->SetBranchAddress("dphillmet",&dphillmet); MySigTree->SetBranchAddress("dphijet1met",&dphijet1met); MySigTree->SetBranchAddress("nvtx",&nvtx); TTree *outSigTree = new TTree ("Out","Out"); outSigTree -> SetDirectory(0); createOutput(outSigTree); */ const int nProcesses = 2; enum{iWW, iDY}; TFile *MyFile[nProcesses]; TTree *MyTree[nProcesses]; TTree *outTree[nProcesses]; TString MyName[nProcesses]; MyName[iWW] = "WW"; MyName[iDY] = "DY"; Float_t pt1; Float_t pt2; Float_t ptll; Float_t mll; Float_t mth; Float_t pfType1Met; Float_t drll; Float_t dphill; Float_t dphilljet; Float_t dphillmet; Float_t trkMet; Float_t Mt1; Float_t Mt2; Float_t mpmet; Float_t Mc; Float_t ptWW; Float_t Ht; Float_t cutpt1 = 20; Float_t cutpt2 = 20; Float_t cutptll = 0; Float_t cutmll = 0; Float_t cutmth = 0; Float_t cutpfType1Met = 0; Float_t cutdrll = 0; Float_t cutdphill = 0; Float_t cutdphilljet = 0; Float_t cutdphillmet = 0; Float_t cuttrkMet = 0; Float_t cutMt1 = 0; Float_t cutMt2 = 0; Float_t cutmpmet = 0; Float_t cutMc = 0; Float_t cutptWW = 0; Float_t cutHt = 0; Float_t cutValue = 0.022; Float_t value = 0; //Loop Over All Processes for (int i = 0; i < nProcesses; ++i){ MyFile[i] = new TFile("../rootFiles/SF/MediumIDTighterIP/" + MyName[i] + ".root","READ"); MyTree[i] = (TTree*)MyFile[i]->Get("nt"); //Calling Processes Trees MyTree[i]->SetBranchAddress("fullpmet",&fullpmet); MyTree[i]->SetBranchAddress("trkpmet",&trkpmet); MyTree[i]->SetBranchAddress("ratioMet",&ratioMet); MyTree[i]->SetBranchAddress("ptll",&ptll); MyTree[i]->SetBranchAddress("mth",&mth); MyTree[i]->SetBranchAddress("jetpt1",&jetpt1); MyTree[i]->SetBranchAddress("ptWW",&ptWW); MyTree[i]->SetBranchAddress("dphilljet",&dphilljet); MyTree[i]->SetBranchAddress("dphillmet",&dphillmet); MyTree[i]->SetBranchAddress("dphijet1met",&dphijet1met); MyTree[i]->SetBranchAddress("nvtx",&nvtx); MyTree[i]->SetBranchAddress("pt1",&pt1); MyTree[i]->SetBranchAddress("pt2",&pt2); MyTree[i]->SetBranchAddress("ptll",&ptll); MyTree[i]->SetBranchAddress("mll",&mll); MyTree[i]->SetBranchAddress("mth",&mth); MyTree[i]->SetBranchAddress("pfType1Met",&pfType1Met); MyTree[i]->SetBranchAddress("drll",&drll); MyTree[i]->SetBranchAddress("dphill",&dphill); MyTree[i]->SetBranchAddress("dphilljet",&dphilljet); MyTree[i]->SetBranchAddress("dphillmet",&dphillmet); MyTree[i]->SetBranchAddress("trkMet",&trkMet); //MyTree[i]->SetBranchAddress("Mt1",&Mt1); //MyTree[i]->SetBranchAddress("Mt2",&Mt2); MyTree[i]->SetBranchAddress("mpmet",&mpmet); //MyTree[i]->SetBranchAddress("Mc",&Mc); MyTree[i]->SetBranchAddress("ptWW",&ptWW); MyTree[i]->SetBranchAddress("Ht",&Ht); //Creating Output Trees outTree[i] = new TTree (MyName[i],MyName[i]); outTree[i] -> SetDirectory(0); outTree[i] -> Branch("fullpmet",&fullpmet); outTree[i] -> Branch("trkpmet",&trkpmet); outTree[i] -> Branch("ratioMet",&ratioMet); outTree[i] -> Branch("ptll",&ptll); outTree[i] -> Branch("mth",&mth); outTree[i] -> Branch("jetpt1",&jetpt1); outTree[i] -> Branch("ptWW",&ptWW); outTree[i] -> Branch("dphilljet",&dphilljet); outTree[i] -> Branch("dphillmet",&dphillmet); outTree[i] -> Branch("dphijet1met",&dphijet1met); outTree[i] -> Branch("nvtx",&nvtx); outTree[i] -> Branch("baseW",&baseW); outTree[i] -> Branch("pt1",&pt1); outTree[i] -> Branch("pt2",&pt2); outTree[i] -> Branch("ptll",&ptll); outTree[i] -> Branch("mll",&mll); outTree[i] -> Branch("mth",&mth); outTree[i] -> Branch("pfType1Met",&pfType1Met); outTree[i] -> Branch("drll",&drll); outTree[i] -> Branch("dphill",&dphill); outTree[i] -> Branch("dphilljet",&dphilljet); outTree[i] -> Branch("dphillmet",&dphillmet); outTree[i] -> Branch("trkMet",&trkMet); //outTree[i] -> Branch("Mt1",&Mt1); //outTree[i] -> Branch("Mt2",&Mt2); outTree[i] -> Branch("mpmet",&mpmet); //outTree[i] -> Branch("Mc",&Mc); outTree[i] -> Branch("ptWW",&ptWW); outTree[i] -> Branch("Ht",&Ht); //Applying Selections Int_t cont = 0; for (int j = 0; j < MyTree[i]->GetEntries(); ++j){ if (j == 0) cout<<MyName[i]<<": "<<MyTree[i]->GetEntries()<<endl; MyTree[i]->GetEntry(j); if (pt1 < cutpt1) continue; if (pt2 < cutpt2) continue; if (ptll < cutptll) continue; if (mll < cutmll) continue; if (mth < cutmth) continue; if (pfType1Met < cutpfType1Met) continue; if (drll < cutdrll) continue; if (dphill < cutdphill) continue; if (dphilljet < cutdphilljet) continue; if (dphillmet < cutdphillmet) continue; if (trkMet < cuttrkMet) continue; // if (Mt1 < cutMt1) continue; //if (Mt2 < cutMt2) continue; if (mpmet < cutmpmet) continue; //if (Mc < cutMc) continue; if (ptWW < cutptWW) continue; if (Ht < cutHt) continue; value = reader->EvaluateMVA("BDT"); if(value < cutValue) continue; ++cont; outTree[i]->Fill(); } cout<<MyName[i]<<" survived: "<<cont<<" ("<<100 * cont / MyTree[i]->GetEntries()<<"%)"<<endl; } /* //applying selections on ZH sample Int_t contZH = 0; for (int i = 0; i < ZHTree->GetEntries(); ++i){ if (i == 0) cout<<"ZH Entries : "<<ZHTree->GetEntries()<<endl; ZHTree->GetEntry(i); if (pt1 < cutpt1) continue; if (pt2 < cutpt2) continue; if (ptll < cutptll) continue; if (mll < cutmll) continue; if (mth < cutmth) continue; if (pfType1Met < cutpfType1Met) continue; if (drll < cutdrll) continue; if (dphill < cutdphill) continue; if (dphilljet < cutdphilljet) continue; if (dphillmet < cutdphillmet) continue; if (trkMet < cuttrkMet) continue; if (Mt1 < cutMt1) continue; if (Mt2 < cutMt2) continue; if (mpmet < cutmpmet) continue; if (Mc < cutMc) continue; if (ptWW < cutptWW) continue; if (Ht < cutHt) continue; value = reader->EvaluateMVA("BDT"); if(value < cutValue) continue; ++contZH; outZHTree->Fill(); } cout<<"ZH survived: "<<contZH<<endl; //applying selections on HWW sample Int_t contHWW = 0; for (int i = 0; i < HWWTree->GetEntries(); ++i){ if (i == 0) cout<<"HWW Entries : "<<HWWTree->GetEntries()<<endl; HWWTree->GetEntry(i); if (pt1 < cutpt1) continue; if (pt2 < cutpt2) continue; if (ptll < cutptll) continue; if (mll < cutmll) continue; if (mth < cutmth) continue; if (pfType1Met < cutpfType1Met) continue; if (drll < cutdrll) continue; if (dphill < cutdphill) continue; if (dphilljet < cutdphilljet) continue; if (dphillmet < cutdphillmet) continue; if (trkMet < cuttrkMet) continue; if (Mt1 < cutMt1) continue; if (Mt2 < cutMt2) continue; if (mpmet < cutmpmet) continue; if (Mc < cutMc) continue; if (ptWW < cutptWW) continue; if (Ht < cutHt) continue; value = reader->EvaluateMVA("BDT"); if(value < cutValue) continue; ++contHWW; outHWWTree->Fill(); } cout<<"HWW survived: "<<contHWW<<endl; //applying selections on WW sample Int_t contWW = 0; for (int i = 0; i < WWTree->GetEntries(); ++i){ if (i == 0) cout<<"WW Entries : "<<WWTree->GetEntries()<<endl; WWTree->GetEntry(i); if (pt1 < cutpt1) continue; if (pt2 < cutpt2) continue; if (ptll < cutptll) continue; if (mll < cutmll) continue; if (mth < cutmth) continue; if (pfType1Met < cutpfType1Met) continue; if (drll < cutdrll) continue; if (dphill < cutdphill) continue; if (dphilljet < cutdphilljet) continue; if (dphillmet < cutdphillmet) continue; if (trkMet < cuttrkMet) continue; if (Mt1 < cutMt1) continue; if (Mt2 < cutMt2) continue; if (mpmet < cutmpmet) continue; if (Mc < cutMc) continue; if (ptWW < cutptWW) continue; if (Ht < cutHt) continue; value = reader->EvaluateMVA("BDT"); if(value < cutValue) continue; ++contWW; outWWTree->Fill(); } cout<<"WW survived: "<<contWW<<endl; */ //saving trees TFile *outMVA = new TFile("outMVA" + sampleName + ".root","RECREATE"); outMVA -> cd(); for (int y = 0; y < nProcesses; ++y) outTree[y] -> Write(); outMVA -> Close(); }
void TMVAClassificationApplication( TString myMethodList = "", TString filename="" ) { //--------------------------------------------------------------- // default MVA methods to be trained + tested // this loads the library TMVA::Tools::Instance(); std::map<std::string,int> Use; Use["CutsGA"] = 1; // other "Cuts" methods work identically // --- Use["Likelihood"] = 1; Use["LikelihoodD"] = 1; // the "D" extension indicates decorrelated input variables (see option strings) Use["LikelihoodPCA"] = 0; // the "PCA" extension indicates PCA-transformed input variables (see option strings) Use["LikelihoodKDE"] = 0; Use["LikelihoodMIX"] = 0; // --- Use["PDERS"] = 1; Use["PDERSD"] = 0; Use["PDERSPCA"] = 0; Use["PDERSkNN"] = 0; // depreciated until further notice Use["PDEFoam"] = 1; // -- Use["KNN"] = 1; // --- Use["HMatrix"] = 0; Use["Fisher"] = 1; Use["FisherG"] = 0; Use["BoostedFisher"] = 0; Use["LD"] = 1; // --- Use["FDA_GA"] = 0; Use["FDA_SA"] = 0; Use["FDA_MC"] = 0; Use["FDA_MT"] = 1; Use["FDA_GAMT"] = 0; Use["FDA_MCMT"] = 0; // --- Use["MLP"] = 1; // this is the recommended ANN Use["MLPBFGS"] = 0; // recommended ANN with optional training method Use["CFMlpANN"] = 0; // *** missing Use["TMlpANN"] = 0; // --- Use["SVM"] = 1; // --- Use["BDT"] = 1; Use["BDTD"] = 0; Use["BDTG"] = 1; Use["BDTB"] = 0; // --- Use["RuleFit"] = 0; // --- Use["Plugin"] = 0; // --------------------------------------------------------------- std::cout << std::endl; std::cout << "==> Start TMVAClassificationApplication" << std::endl; if (myMethodList != "") { for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) it->second = 0; std::vector<TString> mlist = gTools().SplitString( myMethodList, ',' ); for (UInt_t i=0; i<mlist.size(); i++) { std::string regMethod(mlist[i]); if (Use.find(regMethod) == Use.end()) { std::cout << "Method \"" << regMethod << "\" not known in TMVA under this name. Choose among the following:" << std::endl; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) std::cout << it->first << " "; std::cout << std::endl; return; } Use[regMethod] = 1; } } // // create the Reader object // TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); // create a set of variables and declare them to the reader // - the variable names must corresponds in name and type to // those given in the weight file(s) that you use ///Our variables here: /************************************************************************************************************ * Row * nEvt * sumEt * Et1 * lepeta * MET * dphiMETle * detajet2j * detajet3j * ************************************************************************************************************ mindijetmass maxdijetmass */ Float_t sumEt; Float_t Et1; Float_t lepeta; Float_t MET; Float_t dphiMETlepton; Float_t detajet2jet3; Float_t detajet3jet4; Float_t mindijetmass; Float_t maxdijetmass; reader->AddVariable( "sumEt", &sumEt ); reader->AddVariable( "Et1", &Et1 ); reader->AddVariable( "lepeta", &lepeta ); reader->AddVariable( "MET", &MET ); reader->AddVariable( "dphiMETlepton", &dphiMETlepton ); reader->AddVariable( "detajet2jet3", &detajet2jet3 ); reader->AddVariable( "detajet3jet4", &detajet3jet4 ); reader->AddVariable( "mindijetmass", &mindijetmass ); reader->AddVariable( "maxdijetmass", &maxdijetmass ); TString TreeName = "KinVars"; TFile * input = TFile::Open(filename+".root"); TTree* theTree = (TTree*)input->Get(TreeName); Float_t userVar1, userVar2; theTree->SetBranchAddress( "MassOfJets", &MassOfJets ); theTree->SetBranchAddress( "DeltaPhiOfJets", &DeltaPhiOfJets ); theTree->SetBranchAddress( "DeltaPhiLeadingJet", &DeltaPhiLeadingJet ); theTree->SetBranchAddress( "Pbalance", &Pbalance ); theTree->SetBranchAddress( "Sphericity", &Sphericity ); Double_t _Weight=1.0; if (filename.Contains("hbb_120GeV")) _Weight = 5.09999999999999967e-02; if (filename.Contains("qcd_15to30Gev")) _Weight = 3.54815799999999990e+03; if (filename.Contains("qcd_30to50Gev")) _Weight = 3.36987000000000023e+02; if (filename.Contains("qcd_50to150Gev")) _Weight = 1.08418000000000006e+02; if (filename.Contains("qcd_150toInfGev")) _Weight = 4.70999999999999996e+00; if (filename.Contains("data")) _Weight = -1e0; // // book the MVA methods // TString dir = "weights/"; TString prefix = "TMVAClassification"; // book method(s) for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { if (it->second) { TString methodName = it->first + " method"; TString weightfile = dir + prefix + "_" + TString(it->first) + ".weights.xml"; reader->BookMVA( methodName, weightfile ); } } // example how to use your own method as plugin if (Use["Plugin"]) { // the weight file contains a line // Method : MethodName::InstanceName // if MethodName is not a known TMVA method, it is assumed to be // a user implemented method which has to be loaded via the // plugin mechanism // for user implemented methods the line in the weight file can be // Method : PluginName::InstanceName // where PluginName can be anything // before usage the plugin has to be defined, which can happen // either through the following line in .rootrc: // # plugin handler plugin class library constructor format // Plugin.TMVA@@MethodBase: PluginName MethodClassName UserPackage "MethodName(DataSet&,TString)" // // or by telling the global plugin manager directly gPluginMgr->AddHandler("TMVA@@MethodBase", "PluginName", "MethodClassName", "UserPackage", "MethodName(DataSet&,TString)"); // the class is then looked for in libUserPackage.so // now the method can be booked like any other reader->BookMVA( "User method", dir + prefix + "_User.weights.txt" ); } // book output histograms UInt_t nbin = 100; TH1F *histLk(0), *histLkD(0), *histLkPCA(0), *histLkKDE(0), *histLkMIX(0), *histPD(0), *histPDD(0); TH1F *histPDPCA(0), *histPDEFoam(0), *histPDEFoamErr(0), *histPDEFoamSig(0), *histKNN(0), *histHm(0); TH1F *histFi(0), *histFiG(0), *histFiB(0), *histLD(0), *histNn(0), *histNnC(0), *histNnT(0), *histBdt(0), *histBdtG(0), *histBdtD(0); TH1F *histRf(0), *histSVMG(0), *histSVMP(0), *histSVML(0), *histFDAMT(0), *histFDAGA(0), *histPBdt(0); if (Use["Likelihood"]) histLk = new TH1F( "MVA_Likelihood", "MVA_Likelihood", nbin, -1, 1 ); if (Use["LikelihoodD"]) histLkD = new TH1F( "MVA_LikelihoodD", "MVA_LikelihoodD", nbin, -1, 0.9999 ); if (Use["LikelihoodPCA"]) histLkPCA = new TH1F( "MVA_LikelihoodPCA", "MVA_LikelihoodPCA", nbin, -1, 1 ); if (Use["LikelihoodKDE"]) histLkKDE = new TH1F( "MVA_LikelihoodKDE", "MVA_LikelihoodKDE", nbin, -0.00001, 0.99999 ); if (Use["LikelihoodMIX"]) histLkMIX = new TH1F( "MVA_LikelihoodMIX", "MVA_LikelihoodMIX", nbin, 0, 1 ); if (Use["PDERS"]) histPD = new TH1F( "MVA_PDERS", "MVA_PDERS", nbin, 0, 1 ); if (Use["PDERSD"]) histPDD = new TH1F( "MVA_PDERSD", "MVA_PDERSD", nbin, 0, 1 ); if (Use["PDERSPCA"]) histPDPCA = new TH1F( "MVA_PDERSPCA", "MVA_PDERSPCA", nbin, 0, 1 ); if (Use["KNN"]) histKNN = new TH1F( "MVA_KNN", "MVA_KNN", nbin, 0, 1 ); if (Use["HMatrix"]) histHm = new TH1F( "MVA_HMatrix", "MVA_HMatrix", nbin, -0.95, 1.55 ); if (Use["Fisher"]) histFi = new TH1F( "MVA_Fisher", "MVA_Fisher", nbin, -4, 4 ); if (Use["FisherG"]) histFiG = new TH1F( "MVA_FisherG", "MVA_FisherG", nbin, -1, 1 ); if (Use["BoostedFisher"]) histFiB = new TH1F( "MVA_BoostedFisher", "MVA_BoostedFisher", nbin, -2, 2 ); if (Use["LD"]) histLD = new TH1F( "MVA_LD", "MVA_LD", nbin, -2, 2 ); if (Use["MLP"]) histNn = new TH1F( "MVA_MLP", "MVA_MLP", nbin, -1.25, 1.5 ); if (Use["CFMlpANN"]) histNnC = new TH1F( "MVA_CFMlpANN", "MVA_CFMlpANN", nbin, 0, 1 ); if (Use["TMlpANN"]) histNnT = new TH1F( "MVA_TMlpANN", "MVA_TMlpANN", nbin, -1.3, 1.3 ); if (Use["BDT"]) histBdt = new TH1F( "MVA_BDT", "MVA_BDT", nbin, -0.8, 0.8 ); if (Use["BDTD"]) histBdtD = new TH1F( "MVA_BDTD", "MVA_BDTD", nbin, -0.8, 0.8 ); if (Use["BDTG"]) histBdtG = new TH1F( "MVA_BDTG", "MVA_BDTG", nbin, -1.0, 1.0 ); if (Use["RuleFit"]) histRf = new TH1F( "MVA_RuleFit", "MVA_RuleFit", nbin, -2.0, 2.0 ); if (Use["SVM_Gauss"]) histSVMG = new TH1F( "MVA_SVM_Gauss", "MVA_SVM_Gauss", nbin, 0.0, 1.0 ); if (Use["SVM_Poly"]) histSVMP = new TH1F( "MVA_SVM_Poly", "MVA_SVM_Poly", nbin, 0.0, 1.0 ); if (Use["SVM_Lin"]) histSVML = new TH1F( "MVA_SVM_Lin", "MVA_SVM_Lin", nbin, 0.0, 1.0 ); if (Use["FDA_MT"]) histFDAMT = new TH1F( "MVA_FDA_MT", "MVA_FDA_MT", nbin, -2.0, 3.0 ); if (Use["FDA_GA"]) histFDAGA = new TH1F( "MVA_FDA_GA", "MVA_FDA_GA", nbin, -2.0, 3.0 ); if (Use["Plugin"]) histPBdt = new TH1F( "MVA_PBDT", "MVA_BDT", nbin, -0.8, 0.8 ); // PDEFoam also returns per-event error, fill in histogram, and also fill significance if (Use["PDEFoam"]) { histPDEFoam = new TH1F( "MVA_PDEFoam", "MVA_PDEFoam", nbin, 0, 1 ); histPDEFoamErr = new TH1F( "MVA_PDEFoamErr", "MVA_PDEFoam error", nbin, 0, 1 ); histPDEFoamSig = new TH1F( "MVA_PDEFoamSig", "MVA_PDEFoam significance", nbin, 0, 10 ); } // book example histogram for probability (the other methods are done similarly) TH1F *probHistFi(0), *rarityHistFi(0); if (Use["Fisher"]) { probHistFi = new TH1F( "MVA_Fisher_Proba", "MVA_Fisher_Proba", nbin, 0, 1 ); rarityHistFi = new TH1F( "MVA_Fisher_Rarity", "MVA_Fisher_Rarity", nbin, 0, 1 ); } // Prepare input tree (this must be replaced by your data source) // in this example, there is a toy tree with signal and one with background events // we'll later on use only the "signal" events for the test in this example. // /*TFile *input(0); TString fname = "./tmva_example.root"; if (!gSystem->AccessPathName( fname )) { input = TFile::Open( fname ); // check if file in local directory exists } else { input = TFile::Open( "http://root.cern.ch/files/tmva_class_example.root" ); // if not: download from ROOT server } if (!input) { std::cout << "ERROR: could not open data file" << std::endl; exit(1); } std::cout << "--- TMVAClassificationApp : Using input file: " << input->GetName() << std::endl; */ // // prepare the tree // - here the variable names have to corresponds to your tree // - you can use the same variables as above which is slightly faster, // but of course you can use different ones and copy the values inside the event loop // // efficiency calculator for cut method Int_t nSelCutsGA = 0; Double_t effS = 0.7; std::cout << "--- Processing: " << theTree->GetEntries() << " events" << std::endl; TStopwatch sw; sw.Start(); for (Long64_t ievt=0; ievt<theTree->GetEntries();ievt++) { cout<<"Entry # "<<ievt<<endl; if (ievt%1000 == 0){ std::cout << "--- ... Processing event: " << ievt << std::endl; } theTree->GetEntry(ievt); // // return the MVAs and fill to histograms // /* if (Use["CutsGA"]) { // Cuts is a special case: give the desired signal efficienciy Bool_t passed = reader->EvaluateMVA( "CutsGA method", effS ); if (passed) nSelCutsGA++; } */ if (Use["Likelihood" ]) histLk ->Fill( reader->EvaluateMVA( "Likelihood method" ) ); if (Use["Likelihood" ]) cout<<"MVA value: "<<reader->EvaluateMVA( "Likelihood method" )<<endl; continue; /* if (Use["LikelihoodD" ]) histLkD ->Fill( reader->EvaluateMVA( "LikelihoodD method" ) ); if (Use["LikelihoodPCA"]) histLkPCA ->Fill( reader->EvaluateMVA( "LikelihoodPCA method" ) ); if (Use["LikelihoodKDE"]) histLkKDE ->Fill( reader->EvaluateMVA( "LikelihoodKDE method" ) ); if (Use["LikelihoodMIX"]) histLkMIX ->Fill( reader->EvaluateMVA( "LikelihoodMIX method" ) ); if (Use["PDERS" ]) histPD ->Fill( reader->EvaluateMVA( "PDERS method" ) ); if (Use["PDERSD" ]) histPDD ->Fill( reader->EvaluateMVA( "PDERSD method" ) ); if (Use["PDERSPCA" ]) histPDPCA ->Fill( reader->EvaluateMVA( "PDERSPCA method" ) ); if (Use["KNN" ]) histKNN ->Fill( reader->EvaluateMVA( "KNN method" ) ); if (Use["HMatrix" ]) histHm ->Fill( reader->EvaluateMVA( "HMatrix method" ) ); if (Use["Fisher" ]) histFi ->Fill( reader->EvaluateMVA( "Fisher method" ) ); if (Use["FisherG" ]) histFiG ->Fill( reader->EvaluateMVA( "FisherG method" ) ); if (Use["BoostedFisher"]) histFiB ->Fill( reader->EvaluateMVA( "BoostedFisher method" ) ); if (Use["LD" ]) histLD ->Fill( reader->EvaluateMVA( "LD method" ) ); if (Use["MLP" ]) histNn ->Fill( reader->EvaluateMVA( "MLP method" ) ); if (Use["CFMlpANN" ]) histNnC ->Fill( reader->EvaluateMVA( "CFMlpANN method" ) ); if (Use["TMlpANN" ]) histNnT ->Fill( reader->EvaluateMVA( "TMlpANN method" ) ); if (Use["BDT" ]) histBdt ->Fill( reader->EvaluateMVA( "BDT method" ) ); if (Use["BDTD" ]) histBdtD ->Fill( reader->EvaluateMVA( "BDTD method" ) ); if (Use["BDTG" ]) histBdtG ->Fill( reader->EvaluateMVA( "BDTG method" ) ); if (Use["RuleFit" ]) histRf ->Fill( reader->EvaluateMVA( "RuleFit method" ) ); if (Use["SVM_Gauss" ]) histSVMG ->Fill( reader->EvaluateMVA( "SVM_Gauss method" ) ); if (Use["SVM_Poly" ]) histSVMP ->Fill( reader->EvaluateMVA( "SVM_Poly method" ) ); if (Use["SVM_Lin" ]) histSVML ->Fill( reader->EvaluateMVA( "SVM_Lin method" ) ); if (Use["FDA_MT" ]) histFDAMT ->Fill( reader->EvaluateMVA( "FDA_MT method" ) ); if (Use["FDA_GA" ]) histFDAGA ->Fill( reader->EvaluateMVA( "FDA_GA method" ) ); if (Use["Plugin" ]) histPBdt ->Fill( reader->EvaluateMVA( "P_BDT method" ) ); // retrieve also per-event error if (Use["PDEFoam"]) { Double_t val = reader->EvaluateMVA( "PDEFoam method" ); Double_t err = reader->GetMVAError(); histPDEFoam ->Fill( val ); histPDEFoamErr->Fill( err ); histPDEFoamSig->Fill( val/err ); } // retrieve probability instead of MVA output if (Use["Fisher"]) { probHistFi ->Fill( reader->GetProba ( "Fisher method" ) ); rarityHistFi->Fill( reader->GetRarity( "Fisher method" ) ); } */ cout<<"End of processing"<<endl; } // get elapsed time sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); // get efficiency for cuts classifier if (Use["CutsGA"]) std::cout << "--- Efficiency for CutsGA method: " << double(nSelCutsGA)/theTree->GetEntries() << " (for a required signal efficiency of " << effS << ")" << std::endl; if (Use["CutsGA"]) { // test: retrieve cuts for particular signal efficiency // CINT ignores dynamic_casts so we have to use a cuts-secific Reader function to acces the pointer TMVA::MethodCuts* mcuts = reader->FindCutsMVA( "CutsGA method" ) ; if (mcuts) { std::vector<Double_t> cutsMin; std::vector<Double_t> cutsMax; mcuts->GetCuts( 0.7, cutsMin, cutsMax ); std::cout << "--- -------------------------------------------------------------" << std::endl; std::cout << "--- Retrieve cut values for signal efficiency of 0.7 from Reader" << std::endl; for (UInt_t ivar=0; ivar<cutsMin.size(); ivar++) { std::cout << "... Cut: " << cutsMin[ivar] << " < \"" << mcuts->GetInputVar(ivar) << "\" <= " << cutsMax[ivar] << std::endl; } std::cout << "--- -------------------------------------------------------------" << std::endl; } } // // write histograms // TFile *target = new TFile( filename+"_out"+".root","RECREATE" ); if (Use["Likelihood" ]) {if (_Weight>0)histLk->Scale(_Weight);histLk ->Write();} if (Use["LikelihoodD" ]) {if (_Weight>0)histLkD->Scale(_Weight);histLkD ->Write();} if (Use["LikelihoodPCA"]) {if (_Weight>0)histLkPCA->Scale(_Weight);histLkPCA ->Write();} if (Use["LikelihoodKDE"]) {if (_Weight>0)histLkKDE->Scale(_Weight);histLkKDE ->Write();} if (Use["LikelihoodMIX"]) {if (_Weight>0)histLkMIX->Scale(_Weight);histLkMIX ->Write();} if (Use["PDERS" ]) histPD ->Write(); if (Use["PDERSD" ]) histPDD ->Write(); if (Use["PDERSPCA" ]) histPDPCA ->Write(); if (Use["KNN" ]) histKNN ->Write(); if (Use["HMatrix" ]) histHm ->Write(); if (Use["Fisher" ]) histFi ->Write(); if (Use["FisherG" ]) histFiG ->Write(); if (Use["BoostedFisher"]) histFiB ->Write(); if (Use["LD" ]) histLD ->Write(); if (Use["MLP" ]) histNn ->Write(); if (Use["CFMlpANN" ]) histNnC ->Write(); if (Use["TMlpANN" ]) histNnT ->Write(); if (Use["BDT" ]) histBdt ->Write(); if (Use["BDTD" ]) histBdtD ->Write(); if (Use["BDTG" ]) histBdtG ->Write(); if (Use["RuleFit" ]) histRf ->Write(); if (Use["SVM_Gauss" ]) histSVMG ->Write(); if (Use["SVM_Poly" ]) histSVMP ->Write(); if (Use["SVM_Lin" ]) histSVML ->Write(); if (Use["FDA_MT" ]) histFDAMT ->Write(); if (Use["FDA_GA" ]) histFDAGA ->Write(); if (Use["Plugin" ]) histPBdt ->Write(); // write also error and significance histos if (Use["PDEFoam"]) { histPDEFoam->Write(); histPDEFoamErr->Write(); histPDEFoamSig->Write(); } // write also probability hists if (Use["Fisher"]) { if (probHistFi != 0) probHistFi->Write(); if (rarityHistFi != 0) rarityHistFi->Write(); } target->Close(); std::cout << "--- Created root file: \"TMVApp.root\" containing the MVA output histograms" << std::endl; delete reader; std::cout << "==> TMVAClassificationApplication is done!" << endl << std::endl; }
void TMVAClassificationApplicationCompact(TString signal = "data") { #ifdef __CINT__ gROOT->ProcessLine( ".O0" ); // turn off optimization in CINT #endif //--------------------------------------------------------------- // This loads the library TMVA::Tools::Instance(); // -------------------------------------------------------------------------------------------------- // --- Create the Reader object TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); // Create a set of variables and declare them to the reader // - the variable names MUST corresponds in name and type to those given in the weight file(s) used Float_t jetpt; Float_t jeteta; Float_t jetphi; Float_t metpt; Float_t metpro; Float_t lep0pt; Float_t lep1pt; Float_t lep0eta; Float_t lep1eta; Float_t lep0phi; Float_t lep1phi; Float_t ptsys; Float_t ht; Float_t oblateness; Float_t sphericity; Float_t aplanarity; Float_t njetw; Float_t sqrts; Float_t deltarleps; Float_t deltaphileps; Float_t deltaetaleps; Float_t philepmetclose; Float_t philepmetfar; Float_t rlepmetclose; Float_t rlepmetfar; Float_t philepjetclose; Float_t philepjetfar; Float_t rlepjetclose; Float_t rlepjetfar; Float_t phijetmet; Float_t rjetmet; Float_t mll; Float_t htnomet; Float_t ptsysnomet; Float_t metphi; Float_t metminusptsysnomet; /* reader->AddVariable ("jetpt", &jetpt); reader->AddVariable ("jeteta", &jeteta); reader->AddVariable ("jetphi", &jetphi); reader->AddVariable ("metpt", &metpt); reader->AddVariable ("metpro",&metpro); reader->AddVariable ("lep0pt",&lep0pt); reader->AddVariable ("lep1pt",&lep1pt); reader->AddVariable ("lep0eta",&lep0eta); reader->AddVariable ("lep1eta",&lep1eta); reader->AddVariable ("lep0phi",&lep0phi); reader->AddVariable ("lep1phi",&lep1phi);*/ reader->AddVariable ("ptsys",&ptsys); /* reader->AddVariable ("ht",&ht); reader->AddVariable ("oblateness", &oblateness); reader->AddVariable ("sphericity", &sphericity); reader->AddVariable ("aplanarity", &aplanarity); reader->AddVariable ("njetw", &njetw); reader->AddVariable ("sqrts", &sqrts);*/ reader->AddVariable ("deltarleps", &deltarleps); /* reader->AddVariable ("deltaphileps", &deltaphileps); reader->AddVariable ("deltaetaleps", &deltaetaleps); reader->AddVariable ("philepmetclose", &philepmetclose); reader->AddVariable ("philepmetfar", &philepmetfar);*/ reader->AddVariable ("rlepmetclose", &rlepmetclose); /* reader->AddVariable ("rlepmetfar", &rlepmetfar); reader->AddVariable ("philepjetclose", &philepjetclose); reader->AddVariable ("philepjetfar", &philepjetfar);*/ reader->AddVariable ("rlepjetclose", &rlepjetclose); /*reader->AddVariable ("rlepjetfar", &rlepjetfar); reader->AddVariable ("phijetmet", &phijetmet);*/ reader->AddVariable ("rjetmet", &rjetmet); /* reader->AddVariable ("mll", &mll); reader->AddVariable ("htnomet", &htnomet); reader->AddVariable ("ptsysnomet", &ptsysnomet); reader->AddVariable ("metphi", &metphi); reader->AddVariable ("metminusptsysnomet", &metminusptsysnomet);*/ // ************************************************* // --- Book the MVA methods TString dir = "weights/"; TString prefix = "test_tw_short_01"; TString name = "BDT_"+prefix; std::cout<<"********* name = "<<name<<std::endl; // // book the MVA methods // reader->BookMVA( "BDT method", dir + prefix + "_BDT.weights.xml" ); // book output histograms Int_t nbin = 100; histBdt = new TH1F( "MVA_BDT", "MVA_BDT", nbin, -1.0, 1.0 ); // book example histogram for probability (the other methods are done similarly) probHistBDT = new TH1F( "Probability_MVA_BDT", "Probability_MVA_BDT", nbin, -1, 1); rarityHistBDT = new TH1F( "Rarity_MVA_BDT", "Rarity_MVA_BDT", nbin, -1, 1); // Prepare input tree (this must be replaced by your data source) // in this example, there is a toy tree with signal and one with background events // we'll later on use only the "signal" events for the test in this example. // TFile *input(0); TString folder = "rootfiles/"; if(signal == "data") { TString fname = folder+"tmva_test_1_data.root"; } if(signal == "tw"){ TString fname = folder+"tmva_test_1_twdr.root"; } if(signal == "ww"){ TString fname = folder+"tmva_test_1_ww.root"; } if(signal == "qcd"){ TString fname = folder+"tmva_test_1_qcd_mu.root"; } if(signal == "wz"){ TString fname = folder+"tmva_test_1_wz.root"; } if(signal == "zz"){ TString fname = folder+"tmva_test_1_zz.root"; } if(signal == "st"){ TString fname = folder+"tmva_test_1_st.root"; } if(signal == "tt"){ TString fname = folder+"tmva_test_1_tt.root"; } if(signal == "wjets"){ TString fname = folder+"tmva_test_1_wjets.root"; } if(signal == "zjets"){ TString fname = folder+"tmva_test_1_zjets.root"; } if(signal == "di"){TString fname = folder + "tmva_test_1_di.root";} input = TFile::Open( fname,"UPDATE"); if (!input) { cout << "ERROR: could not open data file: " << fname << endl; exit(1); } // --- Event loop // Prepare the event tree // - here the variable names have to corresponds to your tree // - you can use the same variables as above which is slightly faster, // but of course you can use different ones and copy the values inside the event loop // input->cd(); TTree* theTree = (TTree*)input->Get("myTree"); cout << "--- Select signal sample" << endl; double userjetpt; double userjeteta; double userjetphi; double usermetpt; double usermetpro; double userlep0pt; double userlep1pt; double userlep0eta; double userlep1eta; double userlep0phi; double userlep1phi; double userptsys; double userht; double useroblateness; double usersphericity; double useraplanarity; double usernjetw; double usersqrts; double userdeltarleps; double userdeltaphileps; double userdeltaetaleps; double userphilepmetclose; double userphilepmetfar; double userrlepmetclose; double userrlepmetfar; double userphilepjetclose; double userphilepjetfar; double userrlepjetclose; double userrlepjetfar; double userphijetmet; double userrjetmet; double userweight; double userweightnopu; double usermll; double userhtnomet; double userptsysnomet; double usermetphi; double usermetminusptsysnomet; theTree->SetBranchAddress ("savetheweight", &userweight); theTree->SetBranchAddress ("weightnopu", &userweightnopu); theTree->SetBranchAddress ("jetpt", &userjetpt); theTree->SetBranchAddress ("jeteta", &userjeteta); theTree->SetBranchAddress ("jetphi", &userjetphi); theTree->SetBranchAddress ("metpt", &usermetpt); theTree->SetBranchAddress ("metpro",&usermetpro); theTree->SetBranchAddress ("lep0pt",&userlep0pt); theTree->SetBranchAddress ("lep1pt",&userlep1pt); theTree->SetBranchAddress ("lep0eta",&userlep0eta); theTree->SetBranchAddress ("lep1eta",&userlep1eta); theTree->SetBranchAddress ("lep0phi",&userlep0phi); theTree->SetBranchAddress ("lep1phi",&userlep1phi); theTree->SetBranchAddress ("ptsys",&userptsys); theTree->SetBranchAddress ("ht",&userht); theTree->SetBranchAddress ("oblateness", &useroblateness); theTree->SetBranchAddress ("sphericity", &usersphericity); theTree->SetBranchAddress ("aplanarity", &useraplanarity); theTree->SetBranchAddress ("njetw", &usernjetw); theTree->SetBranchAddress ("sqrts", &usersqrts); theTree->SetBranchAddress ("deltarleps", &userdeltarleps); theTree->SetBranchAddress ("deltaphileps", &userdeltaphileps); theTree->SetBranchAddress ("deltaetaleps", &userdeltaetaleps); theTree->SetBranchAddress ("philepmetclose", &userphilepmetclose); theTree->SetBranchAddress ("philepmetfar", &userphilepmetfar); theTree->SetBranchAddress ("rlepmetclose", &userrlepmetclose); theTree->SetBranchAddress ("rlepmetfar", &userrlepmetfar); theTree->SetBranchAddress ("philepjetclose", &userphilepjetclose); theTree->SetBranchAddress ("philepjetfar", &userphilepjetfar); theTree->SetBranchAddress ("rlepjetclose", &userrlepjetclose); theTree->SetBranchAddress ("rlepjetfar", &userrlepjetfar); theTree->SetBranchAddress ("phijetmet", &userphijetmet); theTree->SetBranchAddress ("rjetmet", &userrjetmet); theTree->SetBranchAddress ("mll", &usermll); theTree->SetBranchAddress ("htnomet", &userhtnomet); theTree->SetBranchAddress ("ptsysnomet", &userptsysnomet); theTree->SetBranchAddress ("metphi", &usermetphi); theTree->SetBranchAddress ("metminusptsysnomet", &usermetminusptsysnomet); Double_t tBDT; TTree* BDTTree = new TTree(name,""); BDTTree->Branch("BDT",&tBDT,"BDT/D"); double tweight = 1; std::cout<<" ... opening file : "<<fname<<std::endl; cout << "--- Processing: " << theTree->GetEntries() << " events" << endl; TH1F *hBDT = new TH1F("hBDT","",100,-1.0,1.0); TStopwatch sw; sw.Start(); for (Long64_t ievt=0; ievt<theTree->GetEntries();ievt++) { if (ievt%1000 == 0) cout << "--- ... Processing event: " << ievt << endl; theTree->GetEntry(ievt); tweight = userweight; jetpt = userjetpt; jeteta = userjeteta; jetphi = userjetphi; metpt = usermetpt; metpro = usermetpro; lep0pt = userlep0pt; lep1pt = userlep1pt; lep0eta = userlep0eta; lep1eta = userlep1eta; lep0phi = userlep0phi; lep1phi = userlep1phi; ptsys = userptsys; ht = userht; oblateness = useroblateness; sphericity = usersphericity; aplanarity = useraplanarity; njetw = usernjetw; sqrts = usersqrts; deltarleps = userdeltarleps; deltaphileps = userdeltaphileps; deltaetaleps = userdeltaetaleps; philepmetclose = userphilepmetclose; philepmetfar = userphilepmetfar; rlepmetclose = userrlepmetclose; rlepmetfar = userrlepmetfar; philepjetclose = userphilepjetclose; philepjetfar = userphilepjetfar; rlepjetclose = userrlepjetclose; rlepjetfar = userrlepjetfar; phijetmet = userphijetmet; rjetmet = userrjetmet; mll = usermll; htnomet = userhtnomet; ptsysnomet = userptsysnomet; metphi = usermetphi; metminusptsysnomet = usermetminusptsysnomet; double bdt = reader->EvaluateMVA("BDT method"); tBDT = bdt; BDTTree->Fill(); if (signal == "data") tweight = 1; hBDT->Fill(bdt,tweight); double bdt_ = reader->EvaluateMVA("BDT method"); histBdt ->Fill(bdt_); } // Get elapsed time sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); input->cd(); hBDT->Write(); BDTTree->Write(); input->Close(); // --- Write histograms TFile *target = new TFile( "TMVApp.root","RECREATE" ); histBdt ->Write(); std::cout << "--- Created root file: \"TMVApp.root\" containing the MVA output histograms" << std::endl; delete reader; std::cout << "==> TMVAClassificationApplication is done!" << endl << std::endl; }
void TMVAClassificationApplication_tW(TString sample = "TWChannel", TString syst = "",TString region = "1j1t", TString directory = "v4", TString chanName = "emu", TString bdtTraining = "AdaBoost500TreesMET50", int variableSet = -1) { #ifdef __CINT__ gROOT->ProcessLine( ".O0" ); // turn off optimization in CINT #endif cout << sample << "\t" << syst << "\t" << region << "\t" << directory << "\t" << chanName << "\t" << bdtTraining << endl; //--------------------------------------------------------------- // This loads the library TMVA::Tools::Instance(); // -------------------------------------------------------------------------------------------------- // --- Create the Reader object TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); // Create a set of variables and declare them to the reader // - the variable names MUST corresponds in name and type to those given in the weight file(s) used Float_t ptjet; Float_t ptsys; Float_t ht; Float_t NlooseJet20; Float_t NlooseJet20Central; Float_t NbtaggedlooseJet20; Float_t centralityJLL; Float_t loosejetPt; Float_t ptsys_ht; Float_t msys; Float_t htleps_ht; Float_t ptjll; Float_t met; if (variableSet == -1 || variableSet == 0){ reader->AddVariable ("ptjet", &ptjet); reader->AddVariable ("ptsys",&ptsys); reader->AddVariable ("ht",&ht); reader->AddVariable ("NlooseJet20", &NlooseJet20); reader->AddVariable ("NlooseJet20Central", &NlooseJet20Central); reader->AddVariable ("NbtaggedlooseJet20", &NbtaggedlooseJet20); reader->AddVariable ("centralityJLL", ¢ralityJLL); reader->AddVariable ("loosejetPt", &loosejetPt); reader->AddVariable ("ptsys_ht",&ptsys_ht); reader->AddVariable ("msys", &msys); reader->AddVariable ("htleps_ht", &htleps_ht); reader->AddVariable ("ptjll", &ptjll); reader->AddVariable ("met", &met); } if (variableSet == 1){ //NoMET reader->AddVariable ("ptjet", &ptjet); reader->AddVariable ("ptsys",&ptsys); reader->AddVariable ("ht",&ht); reader->AddVariable ("NlooseJet20", &NlooseJet20); reader->AddVariable ("NlooseJet20Central", &NlooseJet20Central); reader->AddVariable ("NbtaggedlooseJet20", &NbtaggedlooseJet20); reader->AddVariable ("centralityJLL", ¢ralityJLL); reader->AddVariable ("loosejetPt", &loosejetPt); reader->AddVariable ("ptsys_ht",&ptsys_ht); reader->AddVariable ("msys", &msys); reader->AddVariable ("htleps_ht", &htleps_ht); reader->AddVariable ("ptjll", &ptjll); } if (variableSet == 2){ //NoMET, jetpt, loosejetPt, or NlooseJetCentral reader->AddVariable ("ptsys",&ptsys); reader->AddVariable ("ht",&ht); reader->AddVariable ("NlooseJet20", &NlooseJet20); reader->AddVariable ("NbtaggedlooseJet20", &NbtaggedlooseJet20); reader->AddVariable ("centralityJLL", ¢ralityJLL); reader->AddVariable ("ptsys_ht",&ptsys_ht); reader->AddVariable ("msys", &msys); reader->AddVariable ("htleps_ht", &htleps_ht); reader->AddVariable ("ptjll", &ptjll); } if (variableSet == 3){ //No MET or jet variables reader->AddVariable ("ptsys",&ptsys); reader->AddVariable ("ht",&ht); reader->AddVariable ("centralityJLL", ¢ralityJLL); reader->AddVariable ("ptsys_ht",&ptsys_ht); reader->AddVariable ("msys", &msys); reader->AddVariable ("htleps_ht", &htleps_ht); reader->AddVariable ("ptjll", &ptjll); } if (variableSet == 4){ reader->AddVariable ("ptjet", &ptjet); reader->AddVariable ("ptsys",&ptsys); reader->AddVariable ("ht",&ht); reader->AddVariable ("NlooseJet20", &NlooseJet20); reader->AddVariable ("NlooseJet20Central", &NlooseJet20Central); reader->AddVariable ("NbtaggedlooseJet20", &NbtaggedlooseJet20); reader->AddVariable ("loosejetPt", &loosejetPt); reader->AddVariable ("ptsys_ht",&ptsys_ht); reader->AddVariable ("msys", &msys); reader->AddVariable ("htleps_ht", &htleps_ht); reader->AddVariable ("ptjll", &ptjll); reader->AddVariable ("met", &met); } if (variableSet == 5){ reader->AddVariable ("ptjet", &ptjet); reader->AddVariable ("ptsys",&ptsys); reader->AddVariable ("ht",&ht); reader->AddVariable ("ptsys_ht",&ptsys_ht); reader->AddVariable ("msys", &msys); reader->AddVariable ("htleps_ht", &htleps_ht); reader->AddVariable ("ptjll", &ptjll); reader->AddVariable ("met", &met); } if (variableSet == 6){ reader->AddVariable ("ptjet", &ptjet); reader->AddVariable ("ptsys",&ptsys); reader->AddVariable ("ht",&ht); reader->AddVariable ("NlooseJet20Central", &NlooseJet20Central); reader->AddVariable ("NbtaggedlooseJet20", &NbtaggedlooseJet20); reader->AddVariable ("centralityJLL", ¢ralityJLL); reader->AddVariable ("loosejetPt", &loosejetPt); reader->AddVariable ("ptsys_ht",&ptsys_ht); reader->AddVariable ("msys", &msys); reader->AddVariable ("htleps_ht", &htleps_ht); reader->AddVariable ("ptjll", &ptjll); reader->AddVariable ("met", &met); } if (variableSet == 7){ reader->AddVariable ("ptjet", &ptjet); reader->AddVariable ("ptsys",&ptsys); reader->AddVariable ("ht",&ht); reader->AddVariable ("centralityJLL", ¢ralityJLL); reader->AddVariable ("ptsys_ht",&ptsys_ht); reader->AddVariable ("msys", &msys); reader->AddVariable ("htleps_ht", &htleps_ht); reader->AddVariable ("ptjll", &ptjll); reader->AddVariable ("met", &met); } if (variableSet == 8){ reader->AddVariable ("ptjet", &ptjet); reader->AddVariable ("ptsys",&ptsys); reader->AddVariable ("NlooseJet20", &NlooseJet20); reader->AddVariable ("centralityJLL", ¢ralityJLL); reader->AddVariable ("msys", &msys); reader->AddVariable ("htleps_ht", &htleps_ht); reader->AddVariable ("ptjll", &ptjll); } // ************************************************* // --- Book the MVA methods TString dir = "weights/"; TString extra = bdtTraining; TString prefix = "test_tw_00_"; TString name = extra +"_"+ chanName + "_" + region; if (bdtTraining == "AdaBoost500Trees") prefix = "test_tw_00_AdaBoostTests_13Vars_NtreeTests"; // // book the MVA methods // reader->BookMVA( "BDT method", dir + prefix + extra+".weights.xml" ); // book output histograms // Prepare input tree (this must be replaced by your data source) // in this example, there is a toy tree with signal and one with background events // we'll later on use only the "signal" events for the test in this example. // TFile *input(0); TString folder = "tmvaFiles/"+directory+"/"; TString systlabel = ""; if (syst != ""){ systlabel = "_"+syst; } // TString fname = folder + "TWChannel.root"; TString fname = folder + sample + systlabel + ".root"; cout << fname << endl; // input->SetCacheSize(20*1024*1024); input = TFile::Open( fname,"r"); if (!input) { cout << "ERROR: could not open data file: " << fname << endl; exit(1); } // --- Event loop // Prepare the event tree // - here the variable names have to corresponds to your tree // - you can use the same variables as above which is slightly faster, // but of course you can use different ones and copy the values inside the event loop // TString treeName = chanName + "Channel/"+region; TTree* theTree = (TTree*)input->Get(treeName); cout << "--- Select signal sample" << endl; theTree->SetCacheSize(20*1024*1024); Double_t userptjet; Double_t userptsys; Double_t userht; Int_t userNlooseJet20; Int_t userNlooseJet20Central; Int_t userNbtaggedlooseJet20; Double_t usercentralityJLL; Double_t userloosejetPt; Double_t userptsys_ht; Double_t usermsys; Double_t userhtleps_ht; Double_t userptjll; Double_t usermet; Double_t userweightA; Double_t userweightB; Double_t userweightC; Double_t userweightD; theTree->SetBranchAddress ("ptjet", &userptjet); theTree->SetBranchAddress ("ptsys",&userptsys); theTree->SetBranchAddress ("ht",&userht); theTree->SetBranchAddress ("NlooseJet20", &userNlooseJet20); theTree->SetBranchAddress ("NlooseJet20Central", &userNlooseJet20Central); theTree->SetBranchAddress ("NbtaggedlooseJet20", &userNbtaggedlooseJet20); theTree->SetBranchAddress ("centralityJLL", &usercentralityJLL); theTree->SetBranchAddress ("loosejetPt", &userloosejetPt); theTree->SetBranchAddress ("ptsys_ht",&userptsys_ht); theTree->SetBranchAddress ("msys", &usermsys); theTree->SetBranchAddress ("htleps_ht", &userhtleps_ht); theTree->SetBranchAddress ("ptjll", &userptjll); theTree->SetBranchAddress ("met", &usermet); theTree->SetBranchAddress ("weightA", &userweightA); theTree->SetBranchAddress ("weightB", &userweightB); theTree->SetBranchAddress ("weightC", &userweightC); theTree->SetBranchAddress ("weightD", &userweightD); Double_t tBDT; Double_t tweightA; Double_t tweightB; Double_t tweightC; Double_t tweightD; TFile *output(0); TString outName = folder +bdtTraining+"/"+ sample+systlabel+"_Output.root"; cout << "Output root file: " << outName << endl; output = TFile::Open(outName,"UPDATE"); TTree* BDTTree = new TTree(name,""); BDTTree->Branch("BDT",&tBDT,"BDT/D"); BDTTree->Branch("weightA",&tweightA,"weightA/D"); BDTTree->Branch("weightB",&tweightB,"weightB/D"); BDTTree->Branch("weightC",&tweightC,"weightC/D"); BDTTree->Branch("weightD",&tweightD,"weightD/D"); std::cout<<" ... opening file : "<<fname<<std::endl; cout << "--- Processing: " << theTree->GetEntries() << " events" << endl; TStopwatch sw; sw.Start(); for (Long64_t ievt=0; ievt<theTree->GetEntries();ievt++) { if (ievt%1000 == 0) cout << "--- ... Processing event: " << ievt << endl; theTree->GetEntry(ievt); ptjet = userptjet; ptsys = userptsys; ht = userht; NlooseJet20 = userNlooseJet20; NlooseJet20Central = userNlooseJet20Central; NbtaggedlooseJet20 = userNbtaggedlooseJet20; centralityJLL = usercentralityJLL; loosejetPt = userloosejetPt; ptsys_ht = userptsys_ht; msys = usermsys; htleps_ht = userhtleps_ht; ptjll = userptjll; met = usermet; // sw.Print(); double bdt = reader->EvaluateMVA("BDT method"); tBDT = bdt; tweightA = userweightA; tweightB = userweightB; tweightC = userweightC; tweightD = userweightD; BDTTree->Fill(); } // Get elapsed time sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); input->Close(); output->cd(); BDTTree->Write(); output->Close(); // --- Write histograms delete reader; std::cout << "==> TMVAClassificationApplication is done!" << endl << std::endl; }
void TMVARegressionApplication( TString myMethodList = "" ) { //--------------------------------------------------------------- // This loads the library TMVA::Tools::Instance(); // Default MVA methods to be trained + tested std::map<std::string,int> Use; // --- Mutidimensional likelihood and Nearest-Neighbour methods Use["PDERS"] = 0; Use["PDEFoam"] = 1; Use["KNN"] = 1; // // --- Linear Discriminant Analysis Use["LD"] = 1; // // --- Function Discriminant analysis Use["FDA_GA"] = 1; Use["FDA_MC"] = 0; Use["FDA_MT"] = 0; Use["FDA_GAMT"] = 0; // // --- Neural Network Use["MLP"] = 1; // // --- Support Vector Machine Use["SVM"] = 0; // // --- Boosted Decision Trees Use["BDT"] = 0; Use["BDTG"] = 1; // --------------------------------------------------------------- std::cout << std::endl; std::cout << "==> Start TMVARegressionApplication" << std::endl; // Select methods (don't look at this code - not of interest) if (myMethodList != "") { for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) it->second = 0; std::vector<TString> mlist = gTools().SplitString( myMethodList, ',' ); for (UInt_t i=0; i<mlist.size(); i++) { std::string regMethod(mlist[i]); if (Use.find(regMethod) == Use.end()) { std::cout << "Method \"" << regMethod << "\" not known in TMVA under this name. Choose among the following:" << std::endl; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) std::cout << it->first << " "; std::cout << std::endl; return; } Use[regMethod] = 1; } } // -------------------------------------------------------------------------------------------------- // --- Create the Reader object TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); // Create a set of variables and declare them to the reader // - the variable names MUST corresponds in name and type to those given in the weight file(s) used Float_t var1, var2; reader->AddVariable( "var1", &var1 ); reader->AddVariable( "var2", &var2 ); // Spectator variables declared in the training have to be added to the reader, too Float_t spec1,spec2; reader->AddSpectator( "spec1:=var1*2", &spec1 ); reader->AddSpectator( "spec2:=var1*3", &spec2 ); // --- Book the MVA methods TString dir = "weights/"; TString prefix = "TMVARegression"; // Book method(s) for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { if (it->second) { TString methodName = it->first + " method"; TString weightfile = dir + prefix + "_" + TString(it->first) + ".weights.xml"; reader->BookMVA( methodName, weightfile ); } } // Book output histograms TH1* hists[100]; Int_t nhists = -1; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { TH1* h = new TH1F( it->first.c_str(), TString(it->first) + " method", 100, -100, 600 ); if (it->second) hists[++nhists] = h; } nhists++; // Prepare input tree (this must be replaced by your data source) // in this example, there is a toy tree with signal and one with background events // we'll later on use only the "signal" events for the test in this example. // TFile *input(0); TString fname = "./tmva_reg_example.root"; if (!gSystem->AccessPathName( fname )) { input = TFile::Open( fname ); // check if file in local directory exists } else { input = TFile::Open( "http://root.cern.ch/files/tmva_reg_example.root" ); // if not: download from ROOT server } if (!input) { std::cout << "ERROR: could not open data file" << std::endl; exit(1); } std::cout << "--- TMVARegressionApp : Using input file: " << input->GetName() << std::endl; // --- Event loop // Prepare the tree // - here the variable names have to corresponds to your tree // - you can use the same variables as above which is slightly faster, // but of course you can use different ones and copy the values inside the event loop // TTree* theTree = (TTree*)input->Get("TreeR"); std::cout << "--- Select signal sample" << std::endl; theTree->SetBranchAddress( "var1", &var1 ); theTree->SetBranchAddress( "var2", &var2 ); std::cout << "--- Processing: " << theTree->GetEntries() << " events" << std::endl; TStopwatch sw; sw.Start(); for (Long64_t ievt=0; ievt<theTree->GetEntries();ievt++) { if (ievt%1000 == 0) { std::cout << "--- ... Processing event: " << ievt << std::endl; } theTree->GetEntry(ievt); // Retrieve the MVA target values (regression outputs) and fill into histograms // NOTE: EvaluateRegression(..) returns a vector for multi-target regression for (Int_t ih=0; ih<nhists; ih++) { TString title = hists[ih]->GetTitle(); Float_t val = (reader->EvaluateRegression( title ))[0]; hists[ih]->Fill( val ); } } sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); // --- Write histograms TFile *target = new TFile( "TMVARegApp.root","RECREATE" ); for (Int_t ih=0; ih<nhists; ih++) hists[ih]->Write(); target->Close(); std::cout << "--- Created root file: \"" << target->GetName() << "\" containing the MVA output histograms" << std::endl; delete reader; std::cout << "==> TMVARegressionApplication is done!" << std::endl << std::endl; }
void TMVAClassificationApplication( TString myMethodList = "" , TString decay_mode) { #ifdef __CINT__ gROOT->ProcessLine( ".O0" ); // turn off optimization in CINT #endif //--------------------------------------------------------------- // This loads the library TMVA::Tools::Instance(); // Default MVA methods to be trained + tested std::map<std::string,int> Use; // --- Cut optimisation Use["Cuts"] = 1; Use["CutsD"] = 1; Use["CutsPCA"] = 0; Use["CutsGA"] = 0; Use["CutsSA"] = 0; // // --- 1-dimensional likelihood ("naive Bayes estimator") Use["Likelihood"] = 1; Use["LikelihoodD"] = 0; // the "D" extension indicates decorrelated input variables (see option strings) Use["LikelihoodPCA"] = 1; // the "PCA" extension indicates PCA-transformed input variables (see option strings) Use["LikelihoodKDE"] = 0; Use["LikelihoodMIX"] = 0; // // --- Mutidimensional likelihood and Nearest-Neighbour methods Use["PDERS"] = 1; Use["PDERSD"] = 0; Use["PDERSPCA"] = 0; Use["PDEFoam"] = 1; Use["PDEFoamBoost"] = 0; // uses generalised MVA method boosting Use["KNN"] = 1; // k-nearest neighbour method // // --- Linear Discriminant Analysis Use["LD"] = 1; // Linear Discriminant identical to Fisher Use["Fisher"] = 0; Use["FisherG"] = 0; Use["BoostedFisher"] = 0; // uses generalised MVA method boosting Use["HMatrix"] = 0; // // --- Function Discriminant analysis Use["FDA_GA"] = 1; // minimisation of user-defined function using Genetics Algorithm Use["FDA_SA"] = 0; Use["FDA_MC"] = 0; Use["FDA_MT"] = 0; Use["FDA_GAMT"] = 0; Use["FDA_MCMT"] = 0; // // --- Neural Networks (all are feed-forward Multilayer Perceptrons) Use["MLP"] = 0; // Recommended ANN Use["MLPBFGS"] = 0; // Recommended ANN with optional training method Use["MLPBNN"] = 1; // Recommended ANN with BFGS training method and bayesian regulator Use["CFMlpANN"] = 0; // Depreciated ANN from ALEPH Use["TMlpANN"] = 0; // ROOT's own ANN // // --- Support Vector Machine Use["SVM"] = 1; // // --- Boosted Decision Trees Use["BDT"] = 1; // uses Adaptive Boost Use["BDTG"] = 0; // uses Gradient Boost Use["BDTB"] = 0; // uses Bagging Use["BDTD"] = 0; // decorrelation + Adaptive Boost // // --- Friedman's RuleFit method, ie, an optimised series of cuts ("rules") Use["RuleFit"] = 1; // --------------------------------------------------------------- Use["Plugin"] = 0; Use["Category"] = 0; Use["SVM_Gauss"] = 0; Use["SVM_Poly"] = 0; Use["SVM_Lin"] = 0; std::cout << std::endl; std::cout << "==> Start TMVAClassificationApplication" << std::endl; // Select methods (don't look at this code - not of interest) if (myMethodList != "") { for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) it->second = 0; std::vector<TString> mlist = gTools().SplitString( myMethodList, ',' ); for (UInt_t i=0; i<mlist.size(); i++) { std::string regMethod(mlist[i]); if (Use.find(regMethod) == Use.end()) { std::cout << "Method \"" << regMethod << "\" not known in TMVA under this name. Choose among the following:" << std::endl; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { std::cout << it->first << " "; } std::cout << std::endl; return; } Use[regMethod] = 1; } } // -------------------------------------------------------------------------------------------------- // --- Create the Reader object TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); // Create a set of variables and declare them to the reader // - the variable names MUST corresponds in name and type to those given in the weight file(s) used Float_t met, mT, mT2W; reader->AddVariable("met", &met); reader->AddVariable("mT", &mT); reader->AddVariable("mT2W",&mT2W); // Spectator variables declared in the training have to be added to the reader, too /* Float_t spec1,spec2; reader->AddSpectator( "spec1 := var1*2", &spec1 ); reader->AddSpectator( "spec2 := var1*3", &spec2 ); Float_t Category_cat1, Category_cat2, Category_cat3; if (Use["Category"]){ // Add artificial spectators for distinguishing categories reader->AddSpectator( "Category_cat1 := var3<=0", &Category_cat1 ); reader->AddSpectator( "Category_cat2 := (var3>0)&&(var4<0)", &Category_cat2 ); reader->AddSpectator( "Category_cat3 := (var3>0)&&(var4>=0)", &Category_cat3 ); } */ // --- Book the MVA methods TString dir = "weights/"; TString prefix = "TMVAClassification"; // Book method(s) for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { if (it->second) { TString methodName = TString(it->first) + TString(" method"); TString weightfile = dir + prefix + TString("_") + TString(it->first) + TString(".weights.xml"); reader->BookMVA( methodName, weightfile ); } } // Book output histograms UInt_t nbin = 100; TH1F *histLk(0), *histLkD(0), *histLkPCA(0), *histLkKDE(0), *histLkMIX(0), *histPD(0), *histPDD(0); TH1F *histPDPCA(0), *histPDEFoam(0), *histPDEFoamErr(0), *histPDEFoamSig(0), *histKNN(0), *histHm(0); TH1F *histFi(0), *histFiG(0), *histFiB(0), *histLD(0), *histNn(0),*histNnbfgs(0),*histNnbnn(0); TH1F *histNnC(0), *histNnT(0), *histBdt(0), *histBdtG(0), *histBdtD(0), *histRf(0), *histSVMG(0); TH1F *histSVMP(0), *histSVML(0), *histFDAMT(0), *histFDAGA(0), *histCat(0), *histPBdt(0); if (Use["Likelihood"]) histLk = new TH1F( "MVA_Likelihood", "MVA_Likelihood", nbin, -1, 1 ); if (Use["LikelihoodD"]) histLkD = new TH1F( "MVA_LikelihoodD", "MVA_LikelihoodD", nbin, -1, 0.9999 ); if (Use["LikelihoodPCA"]) histLkPCA = new TH1F( "MVA_LikelihoodPCA", "MVA_LikelihoodPCA", nbin, -1, 1 ); if (Use["LikelihoodKDE"]) histLkKDE = new TH1F( "MVA_LikelihoodKDE", "MVA_LikelihoodKDE", nbin, -0.00001, 0.99999 ); if (Use["LikelihoodMIX"]) histLkMIX = new TH1F( "MVA_LikelihoodMIX", "MVA_LikelihoodMIX", nbin, 0, 1 ); if (Use["PDERS"]) histPD = new TH1F( "MVA_PDERS", "MVA_PDERS", nbin, 0, 1 ); if (Use["PDERSD"]) histPDD = new TH1F( "MVA_PDERSD", "MVA_PDERSD", nbin, 0, 1 ); if (Use["PDERSPCA"]) histPDPCA = new TH1F( "MVA_PDERSPCA", "MVA_PDERSPCA", nbin, 0, 1 ); if (Use["KNN"]) histKNN = new TH1F( "MVA_KNN", "MVA_KNN", nbin, 0, 1 ); if (Use["HMatrix"]) histHm = new TH1F( "MVA_HMatrix", "MVA_HMatrix", nbin, -0.95, 1.55 ); if (Use["Fisher"]) histFi = new TH1F( "MVA_Fisher", "MVA_Fisher", nbin, -4, 4 ); if (Use["FisherG"]) histFiG = new TH1F( "MVA_FisherG", "MVA_FisherG", nbin, -1, 1 ); if (Use["BoostedFisher"]) histFiB = new TH1F( "MVA_BoostedFisher", "MVA_BoostedFisher", nbin, -2, 2 ); if (Use["LD"]) histLD = new TH1F( "MVA_LD", "MVA_LD", nbin, -2, 2 ); if (Use["MLP"]) histNn = new TH1F( "MVA_MLP", "MVA_MLP", nbin, -1.25, 1.5 ); if (Use["MLPBFGS"]) histNnbfgs = new TH1F( "MVA_MLPBFGS", "MVA_MLPBFGS", nbin, -1.25, 1.5 ); if (Use["MLPBNN"]) histNnbnn = new TH1F( "MVA_MLPBNN", "MVA_MLPBNN", nbin, -1.25, 1.5 ); if (Use["CFMlpANN"]) histNnC = new TH1F( "MVA_CFMlpANN", "MVA_CFMlpANN", nbin, 0, 1 ); if (Use["TMlpANN"]) histNnT = new TH1F( "MVA_TMlpANN", "MVA_TMlpANN", nbin, -1.3, 1.3 ); if (Use["BDT"]) histBdt = new TH1F( "MVA_BDT", "MVA_BDT", nbin, -0.8, 0.8 ); if (Use["BDTD"]) histBdtD = new TH1F( "MVA_BDTD", "MVA_BDTD", nbin, -0.8, 0.8 ); if (Use["BDTG"]) histBdtG = new TH1F( "MVA_BDTG", "MVA_BDTG", nbin, -1.0, 1.0 ); if (Use["RuleFit"]) histRf = new TH1F( "MVA_RuleFit", "MVA_RuleFit", nbin, -2.0, 2.0 ); if (Use["SVM_Gauss"]) histSVMG = new TH1F( "MVA_SVM_Gauss", "MVA_SVM_Gauss", nbin, 0.0, 1.0 ); if (Use["SVM_Poly"]) histSVMP = new TH1F( "MVA_SVM_Poly", "MVA_SVM_Poly", nbin, 0.0, 1.0 ); if (Use["SVM_Lin"]) histSVML = new TH1F( "MVA_SVM_Lin", "MVA_SVM_Lin", nbin, 0.0, 1.0 ); if (Use["FDA_MT"]) histFDAMT = new TH1F( "MVA_FDA_MT", "MVA_FDA_MT", nbin, -2.0, 3.0 ); if (Use["FDA_GA"]) histFDAGA = new TH1F( "MVA_FDA_GA", "MVA_FDA_GA", nbin, -2.0, 3.0 ); if (Use["Category"]) histCat = new TH1F( "MVA_Category", "MVA_Category", nbin, -2., 2. ); if (Use["Plugin"]) histPBdt = new TH1F( "MVA_PBDT", "MVA_BDT", nbin, -0.8, 0.8 ); // PDEFoam also returns per-event error, fill in histogram, and also fill significance if (Use["PDEFoam"]) { histPDEFoam = new TH1F( "MVA_PDEFoam", "MVA_PDEFoam", nbin, 0, 1 ); histPDEFoamErr = new TH1F( "MVA_PDEFoamErr", "MVA_PDEFoam error", nbin, 0, 1 ); histPDEFoamSig = new TH1F( "MVA_PDEFoamSig", "MVA_PDEFoam significance", nbin, 0, 10 ); } // Book example histogram for probability (the other methods are done similarly) TH1F *probHistFi(0), *rarityHistFi(0); if (Use["Fisher"]) { probHistFi = new TH1F( "MVA_Fisher_Proba", "MVA_Fisher_Proba", nbin, 0, 1 ); rarityHistFi = new TH1F( "MVA_Fisher_Rarity", "MVA_Fisher_Rarity", nbin, 0, 1 ); } TString fname; Double_t event_weight; // events weights are: xsection * efficiency (preselection) if (decay_mode == "TT_1Lep") {fname = "Example_Rootfiles/ttbar_1l/output/ttbar_1l.root"; event_weight = 0.153;} if (decay_mode == "TT_2Lep") {fname = "Example_Rootfiles/ttbar_2l/output/ttbar_2l.root"; event_weight = 0.129;} if (decay_mode == "WJets") {fname = "Example_Rootfiles/wjets_all/output/wjets_all.root"; event_weight = 0.67;} if (decay_mode == "Others") {fname = "Example_Rootfiles/others_all/output/others_all.root"; event_weight = 0.106;} if (decay_mode == "T2tt_R1") { fname = "Example_Rootfiles/t2tt_all/R1/output/t2tt_all_R1.root"; event_weight = 1592./24845.;} if (decay_mode == "T2tt_R2") { fname = "Example_Rootfiles/t2tt_all/R2/output/t2tt_all_R2.root"; event_weight = 1018./24994.;} if (decay_mode == "T2tt_R3") { fname = "Example_Rootfiles/t2tt_all/R3/output/t2tt_all_R3.root"; event_weight = 306./25006.;} if (decay_mode == "T2tt_R4") { fname = "Example_Rootfiles/t2tt_all/R4/output/t2tt_all_R4.root"; event_weight = 87./25094.;} if (decay_mode == "T2tt_R5") { fname = "Example_Rootfiles/t2tt_all/R5/output/t2tt_all_R5.root"; event_weight = 28./25075.;} if (decay_mode == "T2tt_R6") { fname = "Example_Rootfiles/t2tt_all/R6/output/t2tt_all_R6.root"; event_weight = 9./24863.;} TFile *input = TFile::Open( fname ); std::cout << "--- TMVAClassification : Using input file: " << input->GetName() << std::endl; // --- //Event loop // Prepare the event tree // - here the variable names have to corresponds to your tree // - you can use the same variables as above which is slightly faster, // but of course you can use different ones and copy the values inside the event loop // std::cout << "--- Select signal sample" << std::endl; TTree *theTree = (TTree*)input->Get("BDTtree"); Float_t met, mT, mT2W; Int_t event; theTree->SetBranchAddress("met", &met); theTree->SetBranchAddress("mT", &mT); theTree->SetBranchAddress("mT2W", &mT2W); theTree->SetBranchAddress("event", &event); // Efficiency calculator for cut method Int_t nSelCutsGA = 0; Double_t effS = 0.7; std::vector<Float_t> vecVar(4); // vector for EvaluateMVA tests Int_t totevt; if (string(decay_mode).find("T2tt") != std::string::npos) totevt = 50000; // Takes too long (for exercise) to run over all the signal events else totevt = theTree->GetEntries(); std::cout << "--- Processing: " << totevt << " events" << std::endl; TStopwatch sw; sw.Start(); for (Long64_t ievt=0; ievt<totevt; ievt++) { theTree->GetEntry(ievt); if (ievt%1000 == 0) std::cout << "--- ... Processing event: " << ievt << std::endl; if ( event%2 == 1 ) continue; // remove all odd numbers from our actual analysis // --- Return the MVA outputs and fill into histograms // this gives you the mva value per event // cout << reader->EvaluateMVA("BDT method") << endl; if (Use["CutsGA"]) { // Cuts is a special case: give the desired signal efficienciy Bool_t passed = reader->EvaluateMVA( "CutsGA method", effS ); if (passed) nSelCutsGA++; } if (Use["Likelihood" ]) histLk ->Fill( reader->EvaluateMVA( "Likelihood method" ) ); if (Use["LikelihoodD" ]) histLkD ->Fill( reader->EvaluateMVA( "LikelihoodD method" ) ); if (Use["LikelihoodPCA"]) histLkPCA ->Fill( reader->EvaluateMVA( "LikelihoodPCA method" ) ); if (Use["LikelihoodKDE"]) histLkKDE ->Fill( reader->EvaluateMVA( "LikelihoodKDE method" ) ); if (Use["LikelihoodMIX"]) histLkMIX ->Fill( reader->EvaluateMVA( "LikelihoodMIX method" ) ); if (Use["PDERS" ]) histPD ->Fill( reader->EvaluateMVA( "PDERS method" ) ); if (Use["PDERSD" ]) histPDD ->Fill( reader->EvaluateMVA( "PDERSD method" ) ); if (Use["PDERSPCA" ]) histPDPCA ->Fill( reader->EvaluateMVA( "PDERSPCA method" ) ); if (Use["KNN" ]) histKNN ->Fill( reader->EvaluateMVA( "KNN method" ) ); if (Use["HMatrix" ]) histHm ->Fill( reader->EvaluateMVA( "HMatrix method" ) ); if (Use["Fisher" ]) histFi ->Fill( reader->EvaluateMVA( "Fisher method" ) ); if (Use["FisherG" ]) histFiG ->Fill( reader->EvaluateMVA( "FisherG method" ) ); if (Use["BoostedFisher"]) histFiB ->Fill( reader->EvaluateMVA( "BoostedFisher method" ) ); if (Use["LD" ]) histLD ->Fill( reader->EvaluateMVA( "LD method" ) ); if (Use["MLP" ]) histNn ->Fill( reader->EvaluateMVA( "MLP method" ) ); if (Use["MLPBFGS" ]) histNnbfgs ->Fill( reader->EvaluateMVA( "MLPBFGS method" ) ); if (Use["MLPBNN" ]) histNnbnn ->Fill( reader->EvaluateMVA( "MLPBNN method" ) ); if (Use["CFMlpANN" ]) histNnC ->Fill( reader->EvaluateMVA( "CFMlpANN method" ) ); if (Use["TMlpANN" ]) histNnT ->Fill( reader->EvaluateMVA( "TMlpANN method" ) ); if (Use["BDT" ]) histBdt ->Fill( reader->EvaluateMVA( "BDT method" ), event_weight ); //if (Use["BDT" ]) histBdt ->Fill( reader->EvaluateMVA( "BDT method" )); if (Use["BDTD" ]) histBdtD ->Fill( reader->EvaluateMVA( "BDTD method" ) ); if (Use["BDTG" ]) histBdtG ->Fill( reader->EvaluateMVA( "BDTG method" ) ); if (Use["RuleFit" ]) histRf ->Fill( reader->EvaluateMVA( "RuleFit method" ) ); if (Use["SVM_Gauss" ]) histSVMG ->Fill( reader->EvaluateMVA( "SVM_Gauss method" ) ); if (Use["SVM_Poly" ]) histSVMP ->Fill( reader->EvaluateMVA( "SVM_Poly method" ) ); if (Use["SVM_Lin" ]) histSVML ->Fill( reader->EvaluateMVA( "SVM_Lin method" ) ); if (Use["FDA_MT" ]) histFDAMT ->Fill( reader->EvaluateMVA( "FDA_MT method" ) ); if (Use["FDA_GA" ]) histFDAGA ->Fill( reader->EvaluateMVA( "FDA_GA method" ) ); if (Use["Category" ]) histCat ->Fill( reader->EvaluateMVA( "Category method" ) ); if (Use["Plugin" ]) histPBdt ->Fill( reader->EvaluateMVA( "P_BDT method" ) ); // Retrieve also per-event error if (Use["PDEFoam"]) { Double_t val = reader->EvaluateMVA( "PDEFoam method" ); Double_t err = reader->GetMVAError(); histPDEFoam ->Fill( val ); histPDEFoamErr->Fill( err ); if (err>1.e-50) histPDEFoamSig->Fill( val/err ); } // Retrieve probability instead of MVA output if (Use["Fisher"]) { probHistFi ->Fill( reader->GetProba ( "Fisher method" ) ); rarityHistFi->Fill( reader->GetRarity( "Fisher method" ) ); } } // Get elapsed time sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); // Get efficiency for cuts classifier if (Use["CutsGA"]) std::cout << "--- Efficiency for CutsGA method: " << double(nSelCutsGA)/theTree->GetEntries() << " (for a required signal efficiency of " << effS << ")" << std::endl; if (Use["CutsGA"]) { // test: retrieve cuts for particular signal efficiency // CINT ignores dynamic_casts so we have to use a cuts-secific Reader function to acces the pointer TMVA::MethodCuts* mcuts = reader->FindCutsMVA( "CutsGA method" ) ; if (mcuts) { std::vector<Double_t> cutsMin; std::vector<Double_t> cutsMax; mcuts->GetCuts( 0.7, cutsMin, cutsMax ); std::cout << "--- -------------------------------------------------------------" << std::endl; std::cout << "--- Retrieve cut values for signal efficiency of 0.7 from Reader" << std::endl; for (UInt_t ivar=0; ivar<cutsMin.size(); ivar++) { std::cout << "... Cut: " << cutsMin[ivar] << " < \"" << mcuts->GetInputVar(ivar) << "\" <= " << cutsMax[ivar] << std::endl; } std::cout << "--- -------------------------------------------------------------" << std::endl; } } // --- Write histograms TFile *target = new TFile( "results_"+decay_mode+".root","RECREATE" ); if (Use["Likelihood" ]) histLk ->Write(); if (Use["LikelihoodD" ]) histLkD ->Write(); if (Use["LikelihoodPCA"]) histLkPCA ->Write(); if (Use["LikelihoodKDE"]) histLkKDE ->Write(); if (Use["LikelihoodMIX"]) histLkMIX ->Write(); if (Use["PDERS" ]) histPD ->Write(); if (Use["PDERSD" ]) histPDD ->Write(); if (Use["PDERSPCA" ]) histPDPCA ->Write(); if (Use["KNN" ]) histKNN ->Write(); if (Use["HMatrix" ]) histHm ->Write(); if (Use["Fisher" ]) histFi ->Write(); if (Use["FisherG" ]) histFiG ->Write(); if (Use["BoostedFisher"]) histFiB ->Write(); if (Use["LD" ]) histLD ->Write(); if (Use["MLP" ]) histNn ->Write(); if (Use["MLPBFGS" ]) histNnbfgs ->Write(); if (Use["MLPBNN" ]) histNnbnn ->Write(); if (Use["CFMlpANN" ]) histNnC ->Write(); if (Use["TMlpANN" ]) histNnT ->Write(); if (Use["BDT" ]) histBdt ->Write(); if (Use["BDTD" ]) histBdtD ->Write(); if (Use["BDTG" ]) histBdtG ->Write(); if (Use["RuleFit" ]) histRf ->Write(); if (Use["SVM_Gauss" ]) histSVMG ->Write(); if (Use["SVM_Poly" ]) histSVMP ->Write(); if (Use["SVM_Lin" ]) histSVML ->Write(); if (Use["FDA_MT" ]) histFDAMT ->Write(); if (Use["FDA_GA" ]) histFDAGA ->Write(); if (Use["Category" ]) histCat ->Write(); if (Use["Plugin" ]) histPBdt ->Write(); // Write also error and significance histos if (Use["PDEFoam"]) { histPDEFoam->Write(); histPDEFoamErr->Write(); histPDEFoamSig->Write(); } // Write also probability hists if (Use["Fisher"]) { if (probHistFi != 0) probHistFi->Write(); if (rarityHistFi != 0) rarityHistFi->Write(); } target->Close(); std::cout << "--- Created root file: \"results_"+decay_mode+".root\" containing the MVA output histograms" << std::endl; delete reader; std::cout << "==> TMVAClassificationApplication is done!" << endl << std::endl; }
void TMVAReaderPracticeDT0818() { bool isTT=0; string masspoint[13]={"600","800","1000","1200","1400","1600","1800","2000","2500","3000","3500","4000","4500"}; //for (int massP=0;massP<13;massP++){ for (int massP=0;massP<1;massP++){ //Sig // TString endfix =Form("treeV4DT/signal-%s.root",masspoint[massP].data());for(int w=1;w<2;w++){f = TFile::Open(Form("/data2/syu/13TeV/ZprimeZhbb/ZprimeToZhToZlephbb_narrow_M-%s_13TeV-madgraph.root",masspoint[massP].data()));if (!f || !f->IsOpen())continue;TDirectory * dir = (TDirectory*)f->Get(Form("/data2/syu/13TeV/ZprimeZhbb/ZprimeToZhToZlephbb_narrow_M-%s_13TeV-madgraph.root:/tree",masspoint[massP].data()));dir->GetObject("treeMaker",tree); //DY100-200 //for(int w=1;w<90;w++){ f = TFile::Open(Form("/data7/khurana/NCUGlobalTuples/SPRING15/DYJetsHTBins25nsSamples/DYJetsToLL_M-50_HT-100to200_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/crab_DYJetsToLL_M-50_HT-100to200_TuneCUETP8M1_13TeV-madgraphMLM-pythia8_0803/150812_162742/0000/NCUGlobalTuples_%d.root",w));if (!f || !f->IsOpen())continue;TDirectory * dir = (TDirectory*)f->Get(Form("/data7/khurana/NCUGlobalTuples/SPRING15/DYJetsHTBins25nsSamples/DYJetsToLL_M-50_HT-100to200_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/crab_DYJetsToLL_M-50_HT-100to200_TuneCUETP8M1_13TeV-madgraphMLM-pythia8_0803/150812_162742/0000/NCUGlobalTuples_%d.root:/tree",w)); dir->GetObject("treeMaker",tree);TString endfix =Form("treeV4DT/DYHT100-%d.root",w); //DY200-400 // for(int w=1;w<45;w++){f = TFile::Open(Form("/data7/khurana/NCUGlobalTuples/SPRING15/DYJetsHTBins25nsSamples/DYJetsToLL_M-50_HT-200to400_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/crab_DYJetsToLL_M-50_HT-200to400_TuneCUETP8M1_13TeV-madgraphMLM-pythia8_0803/150812_162821/0000/NCUGlobalTuples_%d.root",w));if (!f || !f->IsOpen())continue;TDirectory * dir = (TDirectory*)f->Get(Form("/data7/khurana/NCUGlobalTuples/SPRING15/DYJetsHTBins25nsSamples/DYJetsToLL_M-50_HT-200to400_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/crab_DYJetsToLL_M-50_HT-200to400_TuneCUETP8M1_13TeV-madgraphMLM-pythia8_0803/150812_162821/0000/NCUGlobalTuples_%d.root:/tree",w)); dir->GetObject("treeMaker",tree);TString endfix =Form("treeV4DT/DYHT200-%d.root",w); //DY400-600 // for(int w=1;w<45;w++){f = TFile::Open(Form("/data7/khurana/NCUGlobalTuples/SPRING15/DYJetsHTBins25nsSamples/DYJetsToLL_M-50_HT-400to600_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/crab_DYJetsToLL_M-50_HT-400to600_TuneCUETP8M1_13TeV-madgraphMLM-pythia8_0803/150812_162858/0000/NCUGlobalTuples_%d.root",w));if (!f || !f->IsOpen())continue;TDirectory * dir = (TDirectory*)f->Get(Form("/data7/khurana/NCUGlobalTuples/SPRING15/DYJetsHTBins25nsSamples/DYJetsToLL_M-50_HT-400to600_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/crab_DYJetsToLL_M-50_HT-400to600_TuneCUETP8M1_13TeV-madgraphMLM-pythia8_0803/150812_162858/0000/NCUGlobalTuples_%d.root:/tree",w)); dir->GetObject("treeMaker",tree);TString endfix =Form("treeV4DT/DYHT400-%d.root",w); //DY600-inf // for(int w=1;w<48;w++){f = TFile::Open(Form("/data7/khurana/NCUGlobalTuples/SPRING15/DYJetsHTBins25nsSamples/DYJetsToLL_M-50_HT-600toInf_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/crab_DYJetsToLL_M-50_HT-600toInf_TuneCUETP8M1_13TeV-madgraphMLM-pythia8_0803/150812_162937/0000/NCUGlobalTuples_%d.root",w));if (!f || !f->IsOpen())continue;TDirectory * dir = (TDirectory*)f->Get(Form("/data7/khurana/NCUGlobalTuples/SPRING15/DYJetsHTBins25nsSamples/DYJetsToLL_M-50_HT-600toInf_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/crab_DYJetsToLL_M-50_HT-600toInf_TuneCUETP8M1_13TeV-madgraphMLM-pythia8_0803/150812_162937/0000/NCUGlobalTuples_%d.root:/tree",w)); dir->GetObject("treeMaker",tree);TString endfix =Form("treeV4DT/DYHT600-%d.root",w); //tt isTT=1; for (int w=1;w<174;w++){f = TFile::Open(Form("/data7/khurana/NCUGlobalTuples/SPRING15/crab_TT_TuneCUETP8M1_13TeV-powheg-pythia8_0803/150803_175618/0000/NCUGlobalTuples_%d.root",w)); if (!f || !f->IsOpen())continue;TDirectory * dir = (TDirectory*)f->Get(Form("/data7/khurana/NCUGlobalTuples/SPRING15/crab_TT_TuneCUETP8M1_13TeV-powheg-pythia8_0803/150803_175618/0000/NCUGlobalTuples_%d.root:/tree",w)); dir->GetObject("treeMaker",tree);TString endfix =Form("treeV4DT/TT-%d.root",w); // TFile *fw; // TTree* treeP; // if(w==1){fw = new TFile("tree/DY.root","recreate"); // treeP=new TTree("treeP","treeP"); // } // else {fw = new TFile("tree/DY.root","update"); // treeP =(TTree*)fw->FindObjectAny("treeP");} TFile *fw=new TFile(endfix.Data(),"recreate"); float fatPt; float fatCSV; float sub1Pt; float sub1CSV; float sub2Pt; float sub2CSV; float delta_R; float tau21; float tau1; float tau2; cout<<massP<<","<<w<<endl; TreeReader data(tree); //data.Print(); Long64_t nentries = data.GetEntriesFast(); TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); reader->AddVariable( "fatPt", &fatPt ); reader->AddVariable( "fatCSV", &fatCSV ); reader->AddVariable( "sub1Pt", &sub1Pt ); reader->AddVariable( "sub1CSV", &sub1CSV ); reader->AddVariable( "sub2Pt", &sub2Pt ); reader->AddVariable( "sub2CSV", &sub2CSV ); reader->AddVariable( "delta_R", &delta_R ); reader->AddVariable( "tau21", &tau21 ); reader->AddVariable( "tau1", &tau1 ); reader->AddVariable( "tau2", &tau2 ); reader->BookMVA("BDT method","weights/DT.xml"); TH1F *th1 =new TH1F("BDT","BDT",100,-0.8,0.8); for (Long64_t jentry=0; jentry<nentries;jentry++) { data.GetEntry(jentry); Int_t FATnJet=data.GetInt("FATnJet"); if(FATnJet==0)continue; TClonesArray* eleP4 = (TClonesArray*) data.GetPtrTObject("eleP4"); TClonesArray* muP4 = (TClonesArray*) data.GetPtrTObject("muP4"); vector<bool> eleIsPassVeto= *((vector<bool>*) data.GetPtr("eleIsPassVeto")); vector<bool> isLooseMuon= *((vector<bool>*) data.GetPtr("isLooseMuon")); Int_t nMu=data.GetInt("nMu"); Int_t nEle=data.GetInt("nEle"); vector<int> mus,eles; for(int i=0;i<nEle;i++){ TLorentzVector* thisEle =(TLorentzVector*)eleP4->At(i) ; if(thisEle->Pt()<10 ||fabs(thisEle->Eta())>2.5 || eleIsPassVeto[i]==0 )continue; eles.push_back(i); } for(int i=0;i<nMu;i++){ TLorentzVector* thisMu =(TLorentzVector*)muP4->At(i) ; if(thisMu->Pt()<10 ||fabs(thisMu->Eta())>2.4 || isLooseMuon[i]==0 )continue; mus.push_back(i); } TClonesArray* FATjetP4 = (TClonesArray*) data.GetPtrTObject("FATjetP4"); Float_t* FATjetSDmass = data.GetPtrFloat("FATjetSDmass"); Float_t* FATjetCISVV2 = data.GetPtrFloat("FATjetCISVV2"); //if(>1 )continue; int FATi=0; bool isFAT=0; TLorentzVector* FATjetP4_1; //cout<<FATnJet<<endl; for (FATi=0;FATi<FATnJet;FATi++){ //cout<<"FATi="<<FATi<<endl; if(FATjetCISVV2[FATi]<0 ||FATjetCISVV2[FATi]>1 )continue; FATjetP4_1 = (TLorentzVector*)FATjetP4->At(FATi); bool isOverlap=0; for(int i=0;i<mus.size();i++){ TLorentzVector* thisMu =(TLorentzVector*)muP4->At(mus[i]) ; if(FATjetP4_1->DeltaR(*thisMu)<0.8){ isOverlap=1; break; } } if(!isOverlap){ for(int i=0;i<eles.size();i++){ TLorentzVector* thisEle =(TLorentzVector*)eleP4->At(eles[i]) ; if(FATjetP4_1->DeltaR(*thisEle)<0.8){ isOverlap=1; break; } } } if(isOverlap)continue; isFAT=1; break; } if(!isFAT)continue; if(FATjetP4_1->Pt()<200)continue; Int_t* FATnSubSDJet=data.GetPtrInt("FATnSubSDJet"); if(FATnSubSDJet[FATi]<2)continue; int nsub=FATnSubSDJet[FATi]; if(nsub!=2)cout<<"nsub="<<nsub<<endl;if(nsub!=2)cout<<"nsub="<<nsub<<endl; // float* FATjetTau1=data.GetPtrFloat("FATjetTau1"); float* FATjetTau2=data.GetPtrFloat("FATjetTau2"); vector<float> *FATsubjetSDCSV = data.GetPtrVectorFloat("FATsubjetSDCSV"); vector<float> *FATsubjetSDPx = data.GetPtrVectorFloat("FATsubjetSDPx"); vector<float> *FATsubjetSDPy = data.GetPtrVectorFloat("FATsubjetSDPy"); vector<float> *FATsubjetSDPz = data.GetPtrVectorFloat("FATsubjetSDPz"); vector<float> *FATsubjetSDCE = data.GetPtrVectorFloat("FATsubjetSDCE"); int subi=0,subj=0; bool isSubi=0,isSubj=0; for(int subij=0;subij<FATnSubSDJet[FATi];subij++){ if(FATsubjetSDCSV[FATi][subij]>1 ||FATsubjetSDCSV[FATi][subij]<0 )continue; if(!isSubi && !isSubj){ subi=subij;isSubi=1;continue; } if(isSubi && !isSubj){ subj=subij;isSubj=1;break; } } // if (!isSubi || !isSubj)continue; TLorentzVector FATsubjet_1,FATsubjet_2; FATsubjet_1.SetPxPyPzE(FATsubjetSDPx[FATi][subi],FATsubjetSDPy[FATi][subi],FATsubjetSDPz[FATi][subi],FATsubjetSDCE[FATi][subi]); FATsubjet_2.SetPxPyPzE(FATsubjetSDPx[FATi][subj],FATsubjetSDPy[FATi][subj],FATsubjetSDPz[FATi][subj],FATsubjetSDCE[FATi][subj]); fatPt=FATjetP4_1->Pt();//BfatPt->Fill(); fatCSV=FATjetCISVV2[FATi];//BfatCSV->Fill(); sub1Pt=FATsubjet_1.Pt();//Bsub1Pt->Fill(); //sub1Eta=FATsubjet_1.Eta();//Bsub1Eta->Fill(); sub1CSV=FATsubjetSDCSV[FATi][subi];//Bsub1CSV->Fill(); sub2Pt=FATsubjet_2.Pt();//Bsub2Pt->Fill(); //sub2Eta=FATsubjet_2.Eta();//Bsub2Eta->Fill(); sub2CSV=FATsubjetSDCSV[FATi][subj];//Bsub2CSV->Fill(); delta_R=FATsubjet_1.DeltaR(FATsubjet_2);//BdeltaR->Fill(); tau21=FATjetTau2[FATi]/FATjetTau1[FATi]; tau1=FATjetTau1[FATi]; tau2=FATjetTau2[FATi]; th1 ->Fill( reader->EvaluateMVA("BDT method")); } th1->Write(); fw->Close(); } } }
//_____________________________________________________________________________ void dumpMvaInputs(bool debug, TString fileName) { TFile* file = TFile::Open(fileName.Data()); const char *treeName = "PhotonTreeWriterPresel"; // const char *treeName = "PhotonTreeWriterPreselNoSmear"; TDirectory* theDir = (TDirectory*) file->FindObjectAny(treeName); TTree* theTree = (TTree*) theDir->Get("hPhotonTree"); // open the MVA files, if requested UInt_t run, lumi, evt; UInt_t ph1index, ph1scindex; UInt_t ph2index, ph2scindex; float ph1pt, ph1sceta, ph1iso1, ph1iso2, ph1iso3, ph1cov, ph1hoe, ph1r9; float ph2pt, ph2sceta, ph2iso1, ph2iso2, ph2iso3, ph2cov, ph2hoe, ph2r9; float ph1e, ph2e; float rho, mass; float ph1ecalIso3,ph1ecalIso4,ph1trackIsoSel03,ph1trackIsoWorst04; float ph2ecalIso3,ph2ecalIso4,ph2trackIsoSel03,ph2trackIsoWorst04; float ph1eerr, ph1eerrsmeared; float ph2eerr, ph2eerrsmeared; UChar_t ph1hasconversion; UChar_t ph2hasconversion; Float_t scetawidth1, scphiwidth1; Float_t scetawidth2, scphiwidth2; // 2012 id mva Float_t ph1_idmva_CoviEtaiPhi; Float_t ph1_idmva_s4ratio; Float_t ph1_idmva_GammaIso; Float_t ph1_idmva_ChargedIso_selvtx; Float_t ph1_idmva_ChargedIso_0p2_selvtx; Float_t ph1_idmva_ChargedIso_worstvtx; Float_t ph1_idmva_PsEffWidthSigmaRR; Float_t ph2_idmva_CoviEtaiPhi; Float_t ph2_idmva_s4ratio; Float_t ph2_idmva_GammaIso; Float_t ph2_idmva_ChargedIso_selvtx; Float_t ph2_idmva_ChargedIso_0p2_selvtx; Float_t ph2_idmva_ChargedIso_worstvtx; Float_t ph2_idmva_PsEffWidthSigmaRR; theTree->SetBranchAddress("run", &run); theTree->SetBranchAddress("lumi",&lumi); theTree->SetBranchAddress("evt", &evt); theTree->SetBranchAddress("mass",&mass); theTree->SetBranchAddress("rho",&rho); theTree->SetBranchAddress("ph1.index",&ph1index); theTree->SetBranchAddress("ph1.scindex",&ph1scindex); theTree->SetBranchAddress("ph1.pt",&ph1pt); theTree->SetBranchAddress("ph1.e",&ph1e); theTree->SetBranchAddress("ph1.eerr",&ph1eerr); theTree->SetBranchAddress("ph1.eerrsmeared",&ph1eerrsmeared); theTree->SetBranchAddress("ph1.sceta",&ph1sceta); theTree->SetBranchAddress("ph1.pfcic4_tIso1",&ph1iso1); theTree->SetBranchAddress("ph1.pfcic4_tIso2",&ph1iso2); theTree->SetBranchAddress("ph1.pfcic4_tIso3",&ph1iso3); theTree->SetBranchAddress("ph1.pfcic4_covIEtaIEta",&ph1cov); theTree->SetBranchAddress("ph1.pfcic4_HoE",&ph1hoe); theTree->SetBranchAddress("ph1.pfcic4_R9",&ph1r9); theTree->SetBranchAddress("ph1.pfcic4_ecalIso3",&ph1ecalIso3); theTree->SetBranchAddress("ph1.pfcic4_ecalIso4",&ph1ecalIso4); theTree->SetBranchAddress("ph1.pfcic4_trackIsoSel03",&ph1trackIsoSel03); theTree->SetBranchAddress("ph1.pfcic4_trackIsoWorst04",&ph1trackIsoWorst04); theTree->SetBranchAddress("ph1.hasconversion",&ph1hasconversion); theTree->SetBranchAddress("ph1.scetawidth",&scetawidth1); theTree->SetBranchAddress("ph1.scphiwidth",&scphiwidth1); theTree->SetBranchAddress("ph1.idmva_CoviEtaiPhi",&ph1_idmva_CoviEtaiPhi); theTree->SetBranchAddress("ph1.idmva_s4ratio",&ph1_idmva_s4ratio); theTree->SetBranchAddress("ph1.idmva_GammaIso",&ph1_idmva_GammaIso); theTree->SetBranchAddress("ph1.idmva_ChargedIso_selvtx", &ph1_idmva_ChargedIso_selvtx); theTree->SetBranchAddress("ph1.idmva_ChargedIso_0p2_selvtx", &ph1_idmva_ChargedIso_0p2_selvtx); theTree->SetBranchAddress("ph1.idmva_ChargedIso_worstvtx", &ph1_idmva_ChargedIso_worstvtx); theTree->SetBranchAddress("ph1.idmva_PsEffWidthSigmaRR", &ph1_idmva_PsEffWidthSigmaRR); theTree->SetBranchAddress("ph2.index",&ph2index); theTree->SetBranchAddress("ph2.scindex",&ph2scindex); theTree->SetBranchAddress("ph2.pt",&ph2pt); theTree->SetBranchAddress("ph2.e",&ph2e); theTree->SetBranchAddress("ph2.eerr",&ph2eerr); theTree->SetBranchAddress("ph2.eerrsmeared",&ph2eerrsmeared); theTree->SetBranchAddress("ph2.sceta",&ph2sceta); theTree->SetBranchAddress("ph2.pfcic4_tIso1",&ph2iso1); theTree->SetBranchAddress("ph2.pfcic4_tIso2",&ph2iso2); theTree->SetBranchAddress("ph2.pfcic4_tIso3",&ph2iso3); theTree->SetBranchAddress("ph2.pfcic4_covIEtaIEta",&ph2cov); theTree->SetBranchAddress("ph2.pfcic4_HoE",&ph2hoe); theTree->SetBranchAddress("ph2.pfcic4_R9",&ph2r9); theTree->SetBranchAddress("ph2.pfcic4_ecalIso3",&ph2ecalIso3); theTree->SetBranchAddress("ph2.pfcic4_ecalIso4",&ph2ecalIso4); theTree->SetBranchAddress("ph2.pfcic4_trackIsoSel03",&ph2trackIsoSel03); theTree->SetBranchAddress("ph2.pfcic4_trackIsoWorst04",&ph2trackIsoWorst04); theTree->SetBranchAddress("ph2.hasconversion",&ph2hasconversion); theTree->SetBranchAddress("ph2.scetawidth",&scetawidth2); theTree->SetBranchAddress("ph2.scphiwidth",&scphiwidth2); theTree->SetBranchAddress("ph2.idmva_CoviEtaiPhi",&ph2_idmva_CoviEtaiPhi); theTree->SetBranchAddress("ph2.idmva_s4ratio",&ph2_idmva_s4ratio); theTree->SetBranchAddress("ph2.idmva_GammaIso",&ph2_idmva_GammaIso); theTree->SetBranchAddress("ph2.idmva_ChargedIso_selvtx", &ph2_idmva_ChargedIso_selvtx); theTree->SetBranchAddress("ph2.idmva_ChargedIso_0p2_selvtx", &ph2_idmva_ChargedIso_0p2_selvtx); theTree->SetBranchAddress("ph2.idmva_ChargedIso_worstvtx", &ph2_idmva_ChargedIso_worstvtx); theTree->SetBranchAddress("ph2.idmva_PsEffWidthSigmaRR", &ph2_idmva_PsEffWidthSigmaRR); float jet1pt, jet2pt, jet1eta, jet2eta, dijetmass, zeppenfeld, dphidijetgg; theTree->SetBranchAddress("jet1pt",&jet1pt); theTree->SetBranchAddress("jet2pt",&jet2pt); theTree->SetBranchAddress("jet1eta",&jet1eta); theTree->SetBranchAddress("jet2eta",&jet2eta); theTree->SetBranchAddress("dijetmass",&dijetmass); theTree->SetBranchAddress("zeppenfeld",&zeppenfeld); theTree->SetBranchAddress("dphidijetgg",&dphidijetgg); int numVtx; theTree->SetBranchAddress("nVtx",&numVtx); // presel vars float ecalisodr03_1,ecalisodr03_2; theTree->SetBranchAddress("ph1.ecalisodr03",&ecalisodr03_1); theTree->SetBranchAddress("ph2.ecalisodr03",&ecalisodr03_2); float hcalisodr03_1,hcalisodr03_2; theTree->SetBranchAddress("ph1.hcalisodr03",&hcalisodr03_1); theTree->SetBranchAddress("ph2.hcalisodr03",&hcalisodr03_2); float trkisohollowdr03_1,trkisohollowdr03_2; theTree->SetBranchAddress("ph1.trkisohollowdr03",&trkisohollowdr03_1); theTree->SetBranchAddress("ph2.trkisohollowdr03",&trkisohollowdr03_2); float hoveretower_1, hoveretower_2; theTree->SetBranchAddress("ph1.hoveretower", &hoveretower_1); theTree->SetBranchAddress("ph2.hoveretower", &hoveretower_2); float sieie_1,sieie_2; theTree->SetBranchAddress("ph1.sigietaieta",&sieie_1); theTree->SetBranchAddress("ph2.sigietaieta",&sieie_2); float idmva_ChargedIso_presel_1,idmva_ChargedIso_presel_2; theTree->SetBranchAddress("ph1.idmva_ChargedIso_selvtx",&idmva_ChargedIso_presel_1); theTree->SetBranchAddress("ph2.idmva_ChargedIso_selvtx",&idmva_ChargedIso_presel_2); float idmva_ChargedIso_0p2_presel_1,idmva_ChargedIso_0p2_presel_2; theTree->SetBranchAddress("ph1.idmva_ChargedIso_0p2_selvtx",&idmva_ChargedIso_0p2_presel_1); theTree->SetBranchAddress("ph2.idmva_ChargedIso_0p2_selvtx",&idmva_ChargedIso_0p2_presel_2); // float eleVeto_1, eleVeto_2; // theTree->SetBranchAddress("ph1.eleVeto",&eleVeto_1); // theTree->SetBranchAddress("ph2.eleVeto",&eleVeto_2); float idmva_1, idmva_2; theTree->SetBranchAddress("ph1.idmva",&idmva_1); theTree->SetBranchAddress("ph2.idmva",&idmva_2); float teta1, teta2; theTree->SetBranchAddress("ph1.eta",&teta1); theTree->SetBranchAddress("ph2.eta",&teta2); float vtxprob, ptgg, phi1, phi2, masserr, masserrwvtx, masserr_ns, masserrwvtx_ns; theTree->SetBranchAddress("vtxprob",&vtxprob); theTree->SetBranchAddress("ptgg",&ptgg); theTree->SetBranchAddress("ph1.phi",&phi1); theTree->SetBranchAddress("ph2.phi",&phi2); theTree->SetBranchAddress("masserrsmeared",&masserr); theTree->SetBranchAddress("masserrsmearedwrongvtx",&masserrwvtx); theTree->SetBranchAddress("masserr",&masserr_ns); theTree->SetBranchAddress("masserrwrongvtx",&masserrwvtx_ns); int vbfTag, leptonTag; theTree->SetBranchAddress("vbfTag",&vbfTag); theTree->SetBranchAddress("leptonTag",&leptonTag); float corrpfmet, corrpfmetphi, pfmet, pfmetphi; theTree->SetBranchAddress("corrpfmet",&corrpfmet); theTree->SetBranchAddress("corrpfmetphi",&corrpfmetphi); theTree->SetBranchAddress("pfmet",&pfmet); theTree->SetBranchAddress("pfmetphi",&pfmetphi); float mupt, mueta, mudr1, mudr2, mudz, mud0; theTree->SetBranchAddress("muonPt",&mupt); theTree->SetBranchAddress("muonEta",&mueta); theTree->SetBranchAddress("muDR1",&mudr1); theTree->SetBranchAddress("muDR2",&mudr2); theTree->SetBranchAddress("muD0",&mud0); theTree->SetBranchAddress("muDZ",&mudz); float elept, eleeta, elesceta, eledr1, eledr2, eleMass1, eleMass2; theTree->SetBranchAddress("elePt",&elept); theTree->SetBranchAddress("eleEta",&eleeta); theTree->SetBranchAddress("eleSCEta",&elesceta); theTree->SetBranchAddress("eleDR1",&eledr1); theTree->SetBranchAddress("eleDR2",&eledr2); theTree->SetBranchAddress("eleMass1",&eleMass1); theTree->SetBranchAddress("eleMass2",&eleMass2); int elemisshits; theTree->SetBranchAddress("eleNinnerHits",&elemisshits); // vertext stuff int vertexId1, vertexId2, vertexId3; float vertexMva1, vertexMva2, vertexMva3; //float ptbal, ptasym, sumpt2, p2conv; Float_t ptbal, ptasym, sumpt2, p2conv; int nleg1, nleg2; theTree->SetBranchAddress("vtxInd1",&vertexId1); theTree->SetBranchAddress("vtxInd2",&vertexId2); theTree->SetBranchAddress("vtxInd3",&vertexId3); theTree->SetBranchAddress("vtxMva1",&vertexMva1); theTree->SetBranchAddress("vtxMva2",&vertexMva2); theTree->SetBranchAddress("vtxMva3",&vertexMva3); theTree->SetBranchAddress("vtxBestPtbal",&ptbal); theTree->SetBranchAddress("vtxBestPtasym",&ptasym); theTree->SetBranchAddress("vtxBestSumpt2",&sumpt2); theTree->SetBranchAddress("vtxBestP2Conv",&p2conv); theTree->SetBranchAddress("vtxNleg1",&nleg1); theTree->SetBranchAddress("vtxNleg2",&nleg2); float convVtxZ1, convVtxRes1, convVtxChi1; float convVtxZ2, convVtxRes2, convVtxChi2; int convVtxIdx1, convVtxIdx2, vtxNconv; theTree->SetBranchAddress("vtxConv1Z",&convVtxZ1); theTree->SetBranchAddress("vtxConv1DZ",&convVtxRes1); theTree->SetBranchAddress("vtxConv1Prob",&convVtxChi1); theTree->SetBranchAddress("vtxConvIdx1",&convVtxIdx1); theTree->SetBranchAddress("vtxConv2Z",&convVtxZ2); theTree->SetBranchAddress("vtxConv2DZ",&convVtxRes2); theTree->SetBranchAddress("vtxConv2Prob",&convVtxChi2); theTree->SetBranchAddress("vtxConvIdx2",&convVtxIdx2); theTree->SetBranchAddress("vtxNconv",&vtxNconv); float vtxz1, vtxz2, vtxz3; theTree->SetBranchAddress("vtxMva1Z",&vtxz1); theTree->SetBranchAddress("vtxMva2Z",&vtxz2); theTree->SetBranchAddress("vtxMva3Z",&vtxz3); float eleIdMva; theTree->SetBranchAddress("eleIdMva",&eleIdMva); // additional MET tag stuff. float phigg, jetleadNoIDpt, jetleadNoIDphi, jetleadNoIDeta; float ph1scphi, ph2scphi; theTree->SetBranchAddress("phigg",&phigg); theTree->SetBranchAddress("jetleadNoIDpt",&jetleadNoIDpt); theTree->SetBranchAddress("jetleadNoIDphi",&jetleadNoIDphi); theTree->SetBranchAddress("jetleadNoIDeta",&jetleadNoIDeta); theTree->SetBranchAddress("ph1.scphi",&ph1scphi); theTree->SetBranchAddress("ph2.scphi",&ph2scphi); float ph1scrawe, ph1scpse, ph1e3x3, ph1e5x5, ph1e3x3seed, ph1e5x5seed; float ph2scrawe, ph2scpse, ph2e3x3, ph2e5x5, ph2e3x3seed, ph2e5x5seed; theTree->SetBranchAddress("ph1.scrawe",&ph1scrawe); theTree->SetBranchAddress("ph1.scpse",&ph1scpse); theTree->SetBranchAddress("ph1.e3x3",&ph1e3x3); theTree->SetBranchAddress("ph1.e3x3seed",&ph1e3x3seed); theTree->SetBranchAddress("ph1.e5x5",&ph1e5x5); theTree->SetBranchAddress("ph1.e5x5seed",&ph1e5x5seed); theTree->SetBranchAddress("ph2.scrawe",&ph2scrawe); theTree->SetBranchAddress("ph2.scpse",&ph2scpse); theTree->SetBranchAddress("ph2.e3x3",&ph2e3x3); theTree->SetBranchAddress("ph2.e3x3seed",&ph2e3x3seed); theTree->SetBranchAddress("ph2.e5x5",&ph2e5x5); theTree->SetBranchAddress("ph2.e5x5seed",&ph2e5x5seed); // Setup the diphoton BDT Float_t rVtxSigmaMoM, wVtxSigmaMoM, cosDPhi; Float_t pho1_ptOverM; Float_t pho2_ptOverM; Float_t diphoMVA; TMVA::Reader* reader = new TMVA::Reader(); reader->AddVariable("masserrsmeared/mass" , &rVtxSigmaMoM); reader->AddVariable("masserrsmearedwrongvtx/mass", &wVtxSigmaMoM); reader->AddVariable("vtxprob" , &vtxprob ); reader->AddVariable("ph1.pt/mass" , &pho1_ptOverM); reader->AddVariable("ph2.pt/mass" , &pho2_ptOverM); reader->AddVariable("ph1.eta" , &teta1 ); reader->AddVariable("ph2.eta" , &teta2 ); reader->AddVariable("TMath::Cos(ph1.phi-ph2.phi)", &cosDPhi ); reader->AddVariable("ph1.idmva" , &idmva_1 ); reader->AddVariable("ph2.idmva" , &idmva_2 ); const char *diphotonWeights = ( "/home/veverka/cms/cmssw/031/CMSSW_5_3_10_patch1/src/MitPhysics/data/" "HggBambu_SMDipho_Oct01_redqcdweightallsigevenbkg_BDTG.weights.xml" ); reader->BookMVA("BDTG", diphotonWeights); TRandom3 rng(0); int eventCounter=0; // Loop over the entries. std::cout << "Looping over " << theTree->GetEntries() << " entries." << std::endl; for (int i=0; i < theTree->GetEntries(); ++i) { if (eventCounter > 9 && debug ) break; theTree->GetEntry(i); bool passPreselection = (mass > 100 && mass < 180 && ph1pt > mass/3 && ph2pt > mass/4); if (passPreselection == false) continue; eventCounter++; // Calculate needed variables // rVtxSigmaMoM = masserr_ns / mass; // no smearing // wVtxSigmaMoM = masserrwvtx_ns / mass; // no smearing rVtxSigmaMoM = masserr / mass; // with smearing wVtxSigmaMoM = masserrwvtx / mass; // with smearing cosDPhi = TMath::Cos(phi1 - phi2); pho1_ptOverM = ph1pt / mass; pho2_ptOverM = ph2pt / mass; diphoMVA = reader->EvaluateMVA("BDTG"); // Event Variables dumpVar("run" , run ); // 1 dumpVar("lumi" , lumi ); // 2 dumpVar("event" , evt ); // 3 dumpVar("rho" , rho ); // 4 // Leading Photon Variables dumpVar("pho1_ind" , ph1index ); // 5 dumpVar("pho1_scInd" , /*ph1scindex*/ -999 ); // 6 dumpVar("pho1_pt" , ph1pt ); // 7 dumpVar("pho1_eta" , teta1 ); // 8 dumpVar("pho1_phi" , phi1 ); // 9 dumpVar("pho1_e" , ph1e ); // 10 dumpVar("pho1_eErr" , ph1eerr ); // 11 dumpVar("pho1_isConv" , (UInt_t) ph1hasconversion ); // 12 dumpVar("pho1_HoE" , hoveretower_1 ); // 13 dumpVar("pho1_hcalIso03" , hcalisodr03_1 - 0.005 * ph1pt ); // 14 dumpVar("pho1_trkIso03" , trkisohollowdr03_1 - 0.002 * ph1pt ); // 15 dumpVar("pho1_pfChargedIsoGood02", ph1_idmva_ChargedIso_0p2_selvtx ); // 16 dumpVar("pho1_pfChargedIsoGood03", ph1_idmva_ChargedIso_selvtx ); // 17 dumpVar("pho1_pfChargedIsoBad03" , ph1_idmva_ChargedIso_worstvtx ); // 18 dumpVar("pho1_pfPhotonIso03" , ph1_idmva_GammaIso ); // 19 // TODO: remove pho1_pfNeutralIso03, it's not used // dumpVar("pho1_pfNeutralIso03" , -999 ); // 20 dumpVar("pho1_sieie" , sieie_1 ); // 21 dumpVar("pho1_cieip" , ph1_idmva_CoviEtaiPhi ); // 22 dumpVar("pho1_etaWidth" , scetawidth1 ); // 23 dumpVar("pho1_phiWidth" , scphiwidth1 ); // 24 dumpVar("pho1_r9" , ph1r9 ); // 25 // TODO: remove pho1_lambdaRatio, it's not used // dumpVar("pho1_lambdaRatio" , -999 ); // 26 dumpVar("pho1_s4Ratio" , ph1_idmva_s4ratio ); // 27 dumpVar("pho1_scEta" , ph1sceta ); // 28 dumpVar("pho1_ESEffSigmaRR" , ph1_idmva_PsEffWidthSigmaRR ); // 29 dumpVar("pho1_ptOverM" , pho1_ptOverM ); // 30 dumpVar("pho1_scRawE" , ph1scrawe ); dumpVar("pho1_idMVA" , idmva_1 ); // Trailing Photon Variables dumpVar("pho2_ind" , ph2index ); // 31 dumpVar("pho2_scInd" , /*ph2scindex*/ -999 ); // 32 dumpVar("pho2_pt" , ph2pt ); // 33 dumpVar("pho2_eta" , teta2 ); // 34 dumpVar("pho2_phi" , phi2 ); // 35 dumpVar("pho2_e" , ph2e ); // 36 dumpVar("pho2_eErr" , ph2eerr ); // 37 dumpVar("pho2_isConv" , (UInt_t) ph2hasconversion ); // 38 dumpVar("pho2_HoE" , hoveretower_2 ); // 39 dumpVar("pho2_hcalIso03" , hcalisodr03_1 - 0.005 * ph2pt ); // 40 dumpVar("pho2_trkIso03" , trkisohollowdr03_1 - 0.002 * ph2pt ); // 41 dumpVar("pho2_pfChargedIsoGood02", ph2_idmva_ChargedIso_0p2_selvtx ); // 42 dumpVar("pho2_pfChargedIsoGood03", ph2_idmva_ChargedIso_selvtx ); // 43 dumpVar("pho2_pfChargedIsoBad03" , ph2_idmva_ChargedIso_worstvtx ); // 44 dumpVar("pho2_pfPhotonIso03" , ph2_idmva_GammaIso ); // 45 // dumpVar("pho2_pfNeutralIso03" , -999 ); // 46 dumpVar("pho2_sieie" , sieie_2 ); // 47 dumpVar("pho2_cieip" , ph2_idmva_CoviEtaiPhi ); // 48 dumpVar("pho2_etaWidth" , scetawidth2 ); // 49 dumpVar("pho2_phiWidth" , scphiwidth2 ); // 50 dumpVar("pho2_r9" , ph2r9 ); // 51 // dumpVar("pho2_lambdaRatio" , -999 ); // 52 dumpVar("pho2_s4Ratio" , ph2_idmva_s4ratio ); // 53 dumpVar("pho2_scEta" , ph2sceta ); // 54 dumpVar("pho2_ESEffSigmaRR" , ph2_idmva_PsEffWidthSigmaRR ); // 55 dumpVar("pho2_ptOverM" , pho2_ptOverM ); // 56 dumpVar("pho2_scRawE" , ph2scrawe ); dumpVar("pho2_idMVA" , idmva_2 ); // Diphoton Variables dumpVar("mass" , mass ); // 57 dumpVar("rVtxSigmaMoM" , rVtxSigmaMoM ); // 58 dumpVar("wVtxSigmaMoM" , wVtxSigmaMoM ); // 59 dumpVar("vtxProb" , vtxprob ); // 61 float logSPt2 = TMath::Log(sumpt2); if (vertexId1 < 0) { vertexId1 = ptbal = ptasym = logSPt2 = p2conv = vtxNconv = -999; } dumpVar("vtxIndex" , vertexId1 ); // 60 dumpVar("ptBal" , ptbal ); // 62 dumpVar("ptAsym" , ptasym ); // 63 dumpVar("logSPt2" , logSPt2 ); // 64 dumpVar("p2Conv" , p2conv ); // 65 dumpVar("nConv" , vtxNconv ); // 66 dumpVar("cosDPhi" , cosDPhi ); // 67 dumpVar("diphoMVA" , diphoMVA ); // Leading Jet Variables if (jet1pt < 0) { jet1pt = -999; jet1eta = -999; } dumpVar("jet1_ind" , -999 ); // 68 dumpVar("jet1_pt" , jet1pt ); // 69 dumpVar("jet1_eta" , jet1eta ); // 70 // Trailing Jet Variables if (jet2pt < 0) { jet2pt = -999; jet2eta = -999; } dumpVar("jet2_ind" , -999 ); // 71 dumpVar("jet2_pt" , jet2pt ); // 72 dumpVar("jet2_eta" , jet2eta ); // 73 // Dijet Variables float dijet_dEta = abs(jet1eta - jet2eta); if (jet1pt < 0 || jet2pt < 0) { dijet_dEta = -999; zeppenfeld = -999; dphidijetgg = -999; dijetmass = -999; } dumpVar("dijet_dEta" , dijet_dEta ); // 74 dumpVar("dijet_Zep" , zeppenfeld ); // 75 dumpVar("dijet_dPhi" , dphidijetgg ); // 76 dumpVar("dijet_mass" , dijetmass , false); // 77 std::cout << std::endl; } // Loop over the tree entries. return; } // void dumpMvaInputs(bool debug, TString fileName)
void TMVAClassificationApplicationLambda( TString myMethodList = "" ) { #ifdef __CINT__ gROOT->ProcessLine( ".O0" ); // turn off optimization in CINT #endif //--------------------------------------------------------------- // This loads the library TMVA::Tools::Instance(); // Default MVA methods to be trained + tested std::map<std::string,int> Use; // --- Cut optimisation Use["Cuts"] = 1; Use["CutsD"] = 1; Use["CutsPCA"] = 0; Use["CutsGA"] = 0; Use["CutsSA"] = 0; // // --- 1-dimensional likelihood ("naive Bayes estimator") Use["Likelihood"] = 1; Use["LikelihoodD"] = 0; // the "D" extension indicates decorrelated input variables (see option strings) Use["LikelihoodPCA"] = 1; // the "PCA" extension indicates PCA-transformed input variables (see option strings) Use["LikelihoodKDE"] = 0; Use["LikelihoodMIX"] = 0; // // --- Mutidimensional likelihood and Nearest-Neighbour methods Use["PDERS"] = 1; Use["PDERSD"] = 0; Use["PDERSPCA"] = 0; Use["PDEFoam"] = 1; Use["PDEFoamBoost"] = 0; // uses generalised MVA method boosting Use["KNN"] = 1; // k-nearest neighbour method // // --- Linear Discriminant Analysis Use["LD"] = 1; // Linear Discriminant identical to Fisher Use["Fisher"] = 0; Use["FisherG"] = 0; Use["BoostedFisher"] = 0; // uses generalised MVA method boosting Use["HMatrix"] = 0; // // --- Function Discriminant analysis Use["FDA_GA"] = 1; // minimisation of user-defined function using Genetics Algorithm Use["FDA_SA"] = 0; Use["FDA_MC"] = 0; Use["FDA_MT"] = 0; Use["FDA_GAMT"] = 0; Use["FDA_MCMT"] = 0; // // --- Neural Networks (all are feed-forward Multilayer Perceptrons) Use["MLP"] = 0; // Recommended ANN Use["MLPBFGS"] = 0; // Recommended ANN with optional training method Use["MLPBNN"] = 1; // Recommended ANN with BFGS training method and bayesian regulator Use["CFMlpANN"] = 0; // Depreciated ANN from ALEPH Use["TMlpANN"] = 0; // ROOT's own ANN // // --- Support Vector Machine Use["SVM"] = 1; // // --- Boosted Decision Trees Use["BDT"] = 1; // uses Adaptive Boost Use["BDTG"] = 0; // uses Gradient Boost Use["BDTB"] = 0; // uses Bagging Use["BDTD"] = 0; // decorrelation + Adaptive Boost // // --- Friedman's RuleFit method, ie, an optimised series of cuts ("rules") Use["RuleFit"] = 1; // --------------------------------------------------------------- Use["Plugin"] = 0; Use["Category"] = 0; Use["SVM_Gauss"] = 0; Use["SVM_Poly"] = 0; Use["SVM_Lin"] = 0; std::cout << std::endl; std::cout << "==> Start TMVAClassificationApplication" << std::endl; // Select methods (don't look at this code - not of interest) if (myMethodList != "") { for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) it->second = 0; std::vector<TString> mlist = gTools().SplitString( myMethodList, ',' ); for (UInt_t i=0; i<mlist.size(); i++) { std::string regMethod(mlist[i]); if (Use.find(regMethod) == Use.end()) { std::cout << "Method \"" << regMethod << "\" not known in TMVA under this name. Choose among the following:" << std::endl; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { std::cout << it->first << " "; } std::cout << std::endl; return; } Use[regMethod] = 1; } } // -------------------------------------------------------------------------------------------------- // --- Create the Reader object TMVA::Reader *reader = new TMVA::Reader( "!Color:!Silent" ); // Create a set of variables and declare them to the reader // - the variable names MUST corresponds in name and type to those given in the weight file(s) used //Float_t var1, var2; //Float_t var3, var4; Float_t la_agl, la_dlos, la_dau1_dzos, la_dau1_dxyos, la_dau2_dzos, la_dau2_dxyos; Float_t la_vtxChi2, la_dau1_nhit, la_dau2_nhit; reader->AddVariable( "la_agl", &la_agl ); reader->AddVariable( "la_dlos", &la_dlos ); reader->AddVariable( "la_dau1_dzos", &la_dau1_dzos ); reader->AddVariable( "la_dau2_dzos",&la_dau2_dzos); reader->AddVariable( "la_dau1_dxyos", &la_dau1_dxyos ); reader->AddVariable( "la_dau2_dxyos",&la_dau2_dxyos); reader->AddVariable( "la_vtxChi2",&la_vtxChi2); reader->AddVariable( "la_dau1_nhit",&la_dau1_nhit); reader->AddVariable( "la_dau2_nhit",&la_dau2_nhit); // Spectator variables declared in the training have to be added to the reader, too Float_t la_mass; reader->AddSpectator( "la_mass", &la_mass ); //reader->AddSpectator( "spec2 := var1*3", &spec2 ); /* Float_t Category_cat1, Category_cat2, Category_cat3; if (Use["Category"]){ // Add artificial spectators for distinguishing categories reader->AddSpectator( "Category_cat1 := var3<=0", &Category_cat1 ); reader->AddSpectator( "Category_cat2 := (var3>0)&&(var4<0)", &Category_cat2 ); reader->AddSpectator( "Category_cat3 := (var3>0)&&(var4>=0)", &Category_cat3 ); } */ // --- Book the MVA methods TString dir = "weights/"; TString prefix = "TMVAClassification"; // Book method(s) for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { if (it->second) { TString methodName = TString(it->first) + TString(" method"); TString weightfile = dir + prefix + TString("_") + TString(it->first) + TString(".weights.xml"); reader->BookMVA( methodName, weightfile ); } } // Book output histograms UInt_t nbin = 100; TH1F *histLk(0), *histLkD(0), *histLkPCA(0), *histLkKDE(0), *histLkMIX(0), *histPD(0), *histPDD(0); TH1F *histPDPCA(0), *histPDEFoam(0), *histPDEFoamErr(0), *histPDEFoamSig(0), *histKNN(0), *histHm(0); TH1F *histFi(0), *histFiG(0), *histFiB(0), *histLD(0), *histNn(0),*histNnbfgs(0),*histNnbnn(0); TH1F *histNnC(0), *histNnT(0), *histBdt(0), *histBdtG(0), *histBdtD(0), *histRf(0), *histSVMG(0); TH1F *histSVMP(0), *histSVML(0), *histFDAMT(0), *histFDAGA(0), *histCat(0), *histPBdt(0); if (Use["Likelihood"]) histLk = new TH1F( "MVA_Likelihood", "MVA_Likelihood", nbin, -1, 1 ); if (Use["LikelihoodD"]) histLkD = new TH1F( "MVA_LikelihoodD", "MVA_LikelihoodD", nbin, -1, 0.9999 ); if (Use["LikelihoodPCA"]) histLkPCA = new TH1F( "MVA_LikelihoodPCA", "MVA_LikelihoodPCA", nbin, -1, 1 ); if (Use["LikelihoodKDE"]) histLkKDE = new TH1F( "MVA_LikelihoodKDE", "MVA_LikelihoodKDE", nbin, -0.00001, 0.99999 ); if (Use["LikelihoodMIX"]) histLkMIX = new TH1F( "MVA_LikelihoodMIX", "MVA_LikelihoodMIX", nbin, 0, 1 ); if (Use["PDERS"]) histPD = new TH1F( "MVA_PDERS", "MVA_PDERS", nbin, 0, 1 ); if (Use["PDERSD"]) histPDD = new TH1F( "MVA_PDERSD", "MVA_PDERSD", nbin, 0, 1 ); if (Use["PDERSPCA"]) histPDPCA = new TH1F( "MVA_PDERSPCA", "MVA_PDERSPCA", nbin, 0, 1 ); if (Use["KNN"]) histKNN = new TH1F( "MVA_KNN", "MVA_KNN", nbin, 0, 1 ); if (Use["HMatrix"]) histHm = new TH1F( "MVA_HMatrix", "MVA_HMatrix", nbin, -0.95, 1.55 ); if (Use["Fisher"]) histFi = new TH1F( "MVA_Fisher", "MVA_Fisher", nbin, -4, 4 ); if (Use["FisherG"]) histFiG = new TH1F( "MVA_FisherG", "MVA_FisherG", nbin, -1, 1 ); if (Use["BoostedFisher"]) histFiB = new TH1F( "MVA_BoostedFisher", "MVA_BoostedFisher", nbin, -2, 2 ); if (Use["LD"]) histLD = new TH1F( "MVA_LD", "MVA_LD", nbin, -2, 2 ); if (Use["MLP"]) histNn = new TH1F( "MVA_MLP", "MVA_MLP", nbin, -1.25, 1.5 ); if (Use["MLPBFGS"]) histNnbfgs = new TH1F( "MVA_MLPBFGS", "MVA_MLPBFGS", nbin, -1.25, 1.5 ); if (Use["MLPBNN"]) histNnbnn = new TH1F( "MVA_MLPBNN", "MVA_MLPBNN", nbin, -1.25, 1.5 ); if (Use["CFMlpANN"]) histNnC = new TH1F( "MVA_CFMlpANN", "MVA_CFMlpANN", nbin, 0, 1 ); if (Use["TMlpANN"]) histNnT = new TH1F( "MVA_TMlpANN", "MVA_TMlpANN", nbin, -1.3, 1.3 ); if (Use["BDT"]) histBdt = new TH1F( "MVA_BDT", "MVA_BDT", nbin, -0.8, 0.8 ); if (Use["BDTD"]) histBdtD = new TH1F( "MVA_BDTD", "MVA_BDTD", nbin, -0.8, 0.8 ); if (Use["BDTG"]) histBdtG = new TH1F( "MVA_BDTG", "MVA_BDTG", nbin, -1.0, 1.0 ); if (Use["RuleFit"]) histRf = new TH1F( "MVA_RuleFit", "MVA_RuleFit", nbin, -2.0, 2.0 ); if (Use["SVM_Gauss"]) histSVMG = new TH1F( "MVA_SVM_Gauss", "MVA_SVM_Gauss", nbin, 0.0, 1.0 ); if (Use["SVM_Poly"]) histSVMP = new TH1F( "MVA_SVM_Poly", "MVA_SVM_Poly", nbin, 0.0, 1.0 ); if (Use["SVM_Lin"]) histSVML = new TH1F( "MVA_SVM_Lin", "MVA_SVM_Lin", nbin, 0.0, 1.0 ); if (Use["FDA_MT"]) histFDAMT = new TH1F( "MVA_FDA_MT", "MVA_FDA_MT", nbin, -2.0, 3.0 ); if (Use["FDA_GA"]) histFDAGA = new TH1F( "MVA_FDA_GA", "MVA_FDA_GA", nbin, -2.0, 3.0 ); if (Use["Category"]) histCat = new TH1F( "MVA_Category", "MVA_Category", nbin, -2., 2. ); if (Use["Plugin"]) histPBdt = new TH1F( "MVA_PBDT", "MVA_BDT", nbin, -0.8, 0.8 ); // PDEFoam also returns per-event error, fill in histogram, and also fill significance if (Use["PDEFoam"]) { histPDEFoam = new TH1F( "MVA_PDEFoam", "MVA_PDEFoam", nbin, 0, 1 ); histPDEFoamErr = new TH1F( "MVA_PDEFoamErr", "MVA_PDEFoam error", nbin, 0, 1 ); histPDEFoamSig = new TH1F( "MVA_PDEFoamSig", "MVA_PDEFoam significance", nbin, 0, 10 ); } // Book example histogram for probability (the other methods are done similarly) TH1F *probHistFi(0), *rarityHistFi(0); if (Use["Fisher"]) { probHistFi = new TH1F( "MVA_Fisher_Proba", "MVA_Fisher_Proba", nbin, 0, 1 ); rarityHistFi = new TH1F( "MVA_Fisher_Rarity", "MVA_Fisher_Rarity", nbin, 0, 1 ); } // Prepare input tree (this must be replaced by your data source) // in this example, there is a toy tree with signal and one with background events // we'll later on use only the "signal" events for the test in this example. // TFile *input(0); TString fname = "./tmva_example.root"; if (!gSystem->AccessPathName( fname )) input = TFile::Open( fname ); // check if file in local directory exists else input = TFile::Open( "~/2014Research/ROOT_file/V0reco_PbPb/MCPbPb_central1.root" ); // if not: download from ROOT server if (!input) { std::cout << "ERROR: could not open data file" << std::endl; exit(1); } std::cout << "--- TMVAClassificationApp : Using input file: " << input->GetName() << std::endl; // --- Event loop // Prepare the event tree // - here the variable names have to corresponds to your tree // - you can use the same variables as above which is slightly faster, // but of course you can use different ones and copy the values inside the event loop // std::cout << "--- Select signal sample" << std::endl; TTree* theTree = (TTree*)input->Get("ana/v0_Lambda"); //Float_t userVar1, userVar2; theTree->SetBranchAddress( "la_agl", &la_agl ); theTree->SetBranchAddress( "la_dlos", &la_dlos ); theTree->SetBranchAddress( "la_dau1_dzos", &la_dau1_dzos ); theTree->SetBranchAddress( "la_dau1_dxyos", &la_dau1_dxyos ); theTree->SetBranchAddress( "la_dau2_dzos",&la_dau2_dzos); theTree->SetBranchAddress( "la_dau2_dxyos",&la_dau2_dxyos); theTree->SetBranchAddress( "la_vtxChi2",&la_vtxChi2); theTree->SetBranchAddress( "la_dau1_nhit",&la_dau1_nhit); theTree->SetBranchAddress( "la_dau2_nhit",&la_dau2_nhit); theTree->SetBranchAddress( "la_mass", &la_mass ); // Efficiency calculator for cut method Int_t nSelCutsGA = 0; Double_t effS = 0.7; std::vector<Float_t> vecVar(4); // vector for EvaluateMVA tests std::cout << "--- Processing: " << theTree->GetEntries() << " events" << std::endl; TStopwatch sw; sw.Start(); TFile *target = new TFile( "TMVAppLambda.root","RECREATE" ); TNtuple *n1 = new TNtuple( "n1","n1","Lam_mass:MVA"); for (Long64_t ievt=0; ievt<theTree->GetEntries();ievt++) { if (ievt%1000 == 0) std::cout << "--- ... Processing event: " << ievt << std::endl; theTree->GetEntry(ievt); // --- Return the MVA outputs and fill into histograms if (Use["CutsGA"]) { // Cuts is a special case: give the desired signal efficienciy Bool_t passed = reader->EvaluateMVA( "CutsGA method", effS ); if (passed) nSelCutsGA++; } if (Use["Likelihood" ]) histLk ->Fill( reader->EvaluateMVA( "Likelihood method" ) ); if (Use["LikelihoodD" ]) histLkD ->Fill( reader->EvaluateMVA( "LikelihoodD method" ) ); if (Use["LikelihoodPCA"]) histLkPCA ->Fill( reader->EvaluateMVA( "LikelihoodPCA method" ) ); if (Use["LikelihoodKDE"]) histLkKDE ->Fill( reader->EvaluateMVA( "LikelihoodKDE method" ) ); if (Use["LikelihoodMIX"]) histLkMIX ->Fill( reader->EvaluateMVA( "LikelihoodMIX method" ) ); if (Use["PDERS" ]) histPD ->Fill( reader->EvaluateMVA( "PDERS method" ) ); if (Use["PDERSD" ]) histPDD ->Fill( reader->EvaluateMVA( "PDERSD method" ) ); if (Use["PDERSPCA" ]) histPDPCA ->Fill( reader->EvaluateMVA( "PDERSPCA method" ) ); if (Use["KNN" ]) histKNN ->Fill( reader->EvaluateMVA( "KNN method" ) ); if (Use["HMatrix" ]) histHm ->Fill( reader->EvaluateMVA( "HMatrix method" ) ); if (Use["Fisher" ]) histFi ->Fill( reader->EvaluateMVA( "Fisher method" ) ); if (Use["FisherG" ]) histFiG ->Fill( reader->EvaluateMVA( "FisherG method" ) ); if (Use["BoostedFisher"]) histFiB ->Fill( reader->EvaluateMVA( "BoostedFisher method" ) ); if (Use["LD" ]) histLD ->Fill( reader->EvaluateMVA( "LD method" ) ); if (Use["MLP" ]) histNn ->Fill( reader->EvaluateMVA( "MLP method" ) ); if (Use["MLPBFGS" ]) histNnbfgs ->Fill( reader->EvaluateMVA( "MLPBFGS method" ) ); if (Use["MLPBNN" ]) histNnbnn ->Fill( reader->EvaluateMVA( "MLPBNN method" ) ); if (Use["CFMlpANN" ]) histNnC ->Fill( reader->EvaluateMVA( "CFMlpANN method" ) ); if (Use["TMlpANN" ]) histNnT ->Fill( reader->EvaluateMVA( "TMlpANN method" ) ); if (Use["BDT" ]) { double Lam_mass = la_mass; histBdt ->Fill( reader->EvaluateMVA( "BDT method" ) ); double MVA = 0.0; MVA = reader->EvaluateMVA("BDT method"); n1->Fill(Lam_mass,MVA); // cout << "la mass: " << temp << endl } if (Use["BDTD" ]) { double Lam_mass = la_mass; histBdtD ->Fill( reader->EvaluateMVA( "BDTD method" ) ); double MVA = 0.0; MVA = reader->EvaluateMVA("BDTD method"); n1->Fill(Lam_mass,MVA); } if (Use["BDTG" ]) { double Lam_mass = la_mass; histBdtG ->Fill( reader->EvaluateMVA( "BDTG method" ) ); double MVA = 0.0; MVA = reader->EvaluateMVA("BDTG method"); n1->Fill(Lam_mass,MVA); } if (Use["RuleFit" ]) histRf ->Fill( reader->EvaluateMVA( "RuleFit method" ) ); if (Use["SVM_Gauss" ]) histSVMG ->Fill( reader->EvaluateMVA( "SVM_Gauss method" ) ); if (Use["SVM_Poly" ]) histSVMP ->Fill( reader->EvaluateMVA( "SVM_Poly method" ) ); if (Use["SVM_Lin" ]) histSVML ->Fill( reader->EvaluateMVA( "SVM_Lin method" ) ); if (Use["FDA_MT" ]) histFDAMT ->Fill( reader->EvaluateMVA( "FDA_MT method" ) ); if (Use["FDA_GA" ]) histFDAGA ->Fill( reader->EvaluateMVA( "FDA_GA method" ) ); if (Use["Category" ]) histCat ->Fill( reader->EvaluateMVA( "Category method" ) ); if (Use["Plugin" ]) histPBdt ->Fill( reader->EvaluateMVA( "P_BDT method" ) ); // Retrieve also per-event error if (Use["PDEFoam"]) { Double_t val = reader->EvaluateMVA( "PDEFoam method" ); Double_t err = reader->GetMVAError(); histPDEFoam ->Fill( val ); histPDEFoamErr->Fill( err ); if (err>1.e-50) histPDEFoamSig->Fill( val/err ); } // Retrieve probability instead of MVA output if (Use["Fisher"]) { probHistFi ->Fill( reader->GetProba ( "Fisher method" ) ); rarityHistFi->Fill( reader->GetRarity( "Fisher method" ) ); } } // Get elapsed time sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); // Get efficiency for cuts classifier if (Use["CutsGA"]) std::cout << "--- Efficiency for CutsGA method: " << double(nSelCutsGA)/theTree->GetEntries() << " (for a required signal efficiency of " << effS << ")" << std::endl; if (Use["CutsGA"]) { // test: retrieve cuts for particular signal efficiency // CINT ignores dynamic_casts so we have to use a cuts-secific Reader function to acces the pointer TMVA::MethodCuts* mcuts = reader->FindCutsMVA( "CutsGA method" ) ; if (mcuts) { std::vector<Double_t> cutsMin; std::vector<Double_t> cutsMax; mcuts->GetCuts( 0.7, cutsMin, cutsMax ); std::cout << "--- -------------------------------------------------------------" << std::endl; std::cout << "--- Retrieve cut values for signal efficiency of 0.7 from Reader" << std::endl; for (UInt_t ivar=0; ivar<cutsMin.size(); ivar++) { std::cout << "... Cut: " << cutsMin[ivar] << " < \"" << mcuts->GetInputVar(ivar) << "\" <= " << cutsMax[ivar] << std::endl; } std::cout << "--- -------------------------------------------------------------" << std::endl; } } // --- Write histograms if (Use["Likelihood" ]) histLk ->Write(); if (Use["LikelihoodD" ]) histLkD ->Write(); if (Use["LikelihoodPCA"]) histLkPCA ->Write(); if (Use["LikelihoodKDE"]) histLkKDE ->Write(); if (Use["LikelihoodMIX"]) histLkMIX ->Write(); if (Use["PDERS" ]) histPD ->Write(); if (Use["PDERSD" ]) histPDD ->Write(); if (Use["PDERSPCA" ]) histPDPCA ->Write(); if (Use["KNN" ]) histKNN ->Write(); if (Use["HMatrix" ]) histHm ->Write(); if (Use["Fisher" ]) histFi ->Write(); if (Use["FisherG" ]) histFiG ->Write(); if (Use["BoostedFisher"]) histFiB ->Write(); if (Use["LD" ]) histLD ->Write(); if (Use["MLP" ]) histNn ->Write(); if (Use["MLPBFGS" ]) histNnbfgs ->Write(); if (Use["MLPBNN" ]) histNnbnn ->Write(); if (Use["CFMlpANN" ]) histNnC ->Write(); if (Use["TMlpANN" ]) histNnT ->Write(); if (Use["BDT" ]){ histBdt ->Write(); n1->Write(); } if (Use["BDTD" ]){ histBdtD ->Write(); n1->Write(); } if (Use["BDTG" ]) { histBdtG ->Write(); n1->Write(); } if (Use["RuleFit" ]) histRf ->Write(); if (Use["SVM_Gauss" ]) histSVMG ->Write(); if (Use["SVM_Poly" ]) histSVMP ->Write(); if (Use["SVM_Lin" ]) histSVML ->Write(); if (Use["FDA_MT" ]) histFDAMT ->Write(); if (Use["FDA_GA" ]) histFDAGA ->Write(); if (Use["Category" ]) histCat ->Write(); if (Use["Plugin" ]) histPBdt ->Write(); // Write also error and significance histos if (Use["PDEFoam"]) { histPDEFoam->Write(); histPDEFoamErr->Write(); histPDEFoamSig->Write(); } // Write also probability hists if (Use["Fisher"]) { if (probHistFi != 0) probHistFi->Write(); if (rarityHistFi != 0) rarityHistFi->Write(); } target->Close(); std::cout << "--- Created root file: \"TMVApp.root\" containing the MVA output histograms" << std::endl; delete reader; std::cout << "==> TMVAClassificationApplication is done!" << endl << std::endl; }
int testPyGTBMulticlass(){ // Get data file std::cout << "Get test data..." << std::endl; TString fname = "./tmva_example_multiple_background.root"; if (gSystem->AccessPathName(fname)){ // file does not exist in local directory std::cout << "Create multiclass test data..." << std::endl; TString createDataMacro = TString(gROOT->GetTutorialsDir()) + "/tmva/createData.C"; gROOT->ProcessLine(TString::Format(".L %s",createDataMacro.Data())); gROOT->ProcessLine("create_MultipleBackground(200)"); std::cout << "Created " << fname << " for tests of the multiclass features" << std::endl; } TFile *input = TFile::Open(fname); // Setup PyMVA and factory std::cout << "Setup TMVA..." << std::endl; TMVA::PyMethodBase::PyInitialize(); TFile* outputFile = TFile::Open("ResultsTestPyGTBMulticlass.root", "RECREATE"); TMVA::Factory *factory = new TMVA::Factory("testPyGTBMulticlass", outputFile, "!V:Silent:Color:!DrawProgressBar:AnalysisType=multiclass"); // Load data TMVA::DataLoader *dataloader = new TMVA::DataLoader("datasetTestPyGTBMulticlass"); TTree *signal = (TTree*)input->Get("TreeS"); TTree *background0 = (TTree*)input->Get("TreeB0"); TTree *background1 = (TTree*)input->Get("TreeB1"); TTree *background2 = (TTree*)input->Get("TreeB2"); dataloader->AddTree(signal, "Signal"); dataloader->AddTree(background0, "Background_0"); dataloader->AddTree(background1, "Background_1"); dataloader->AddTree(background2, "Background_2"); dataloader->AddVariable("var1"); dataloader->AddVariable("var2"); dataloader->AddVariable("var3"); dataloader->AddVariable("var4"); dataloader->PrepareTrainingAndTestTree("", "SplitMode=Random:NormMode=NumEvents:!V"); // Book and train method factory->BookMethod(dataloader, TMVA::Types::kPyGTB, "PyGTB", "!H:!V:VarTransform=None:NEstimators=100:Verbose=0"); std::cout << "Train classifier..." << std::endl; factory->TrainAllMethods(); // Clean-up delete factory; delete dataloader; delete outputFile; // Setup reader UInt_t numEvents = 100; std::cout << "Run reader and classify " << numEvents << " events..." << std::endl; TMVA::Reader *reader = new TMVA::Reader("!Color:Silent"); Float_t vars[4]; reader->AddVariable("var1", vars+0); reader->AddVariable("var2", vars+1); reader->AddVariable("var3", vars+2); reader->AddVariable("var4", vars+3); reader->BookMVA("PyGTB", "datasetTestPyGTBMulticlass/weights/testPyGTBMulticlass_PyGTB.weights.xml"); // Get mean response of method on signal and background events signal->SetBranchAddress("var1", vars+0); signal->SetBranchAddress("var2", vars+1); signal->SetBranchAddress("var3", vars+2); signal->SetBranchAddress("var4", vars+3); background0->SetBranchAddress("var1", vars+0); background0->SetBranchAddress("var2", vars+1); background0->SetBranchAddress("var3", vars+2); background0->SetBranchAddress("var4", vars+3); background1->SetBranchAddress("var1", vars+0); background1->SetBranchAddress("var2", vars+1); background1->SetBranchAddress("var3", vars+2); background1->SetBranchAddress("var4", vars+3); background2->SetBranchAddress("var1", vars+0); background2->SetBranchAddress("var2", vars+1); background2->SetBranchAddress("var3", vars+2); background2->SetBranchAddress("var4", vars+3); Float_t meanMvaSignal = 0; Float_t meanMvaBackground0 = 0; Float_t meanMvaBackground1 = 0; Float_t meanMvaBackground2 = 0; for(UInt_t i=0; i<numEvents; i++){ signal->GetEntry(i); meanMvaSignal += reader->EvaluateMulticlass("PyGTB")[0]; background0->GetEntry(i); meanMvaBackground0 += reader->EvaluateMulticlass("PyGTB")[1]; background1->GetEntry(i); meanMvaBackground1 += reader->EvaluateMulticlass("PyGTB")[2]; background2->GetEntry(i); meanMvaBackground2 += reader->EvaluateMulticlass("PyGTB")[3]; } meanMvaSignal = meanMvaSignal/float(numEvents); meanMvaBackground0 = meanMvaBackground0/float(numEvents); meanMvaBackground1 = meanMvaBackground1/float(numEvents); meanMvaBackground2 = meanMvaBackground2/float(numEvents); // Check whether the response is obviously better than guessing std::cout << "Mean MVA response on signal: " << meanMvaSignal << std::endl; if(meanMvaSignal < 0.3){ std::cout << "[ERROR] Mean response on signal is " << meanMvaSignal << " (<0.3)" << std::endl; return 1; } std::cout << "Mean MVA response on background 0: " << meanMvaBackground0 << std::endl; if(meanMvaBackground0 < 0.3){ std::cout << "[ERROR] Mean response on background 0 is " << meanMvaBackground0 << " (<0.3)" << std::endl; return 1; } std::cout << "Mean MVA response on background 1: " << meanMvaBackground1 << std::endl; if(meanMvaBackground0 < 0.3){ std::cout << "[ERROR] Mean response on background 1 is " << meanMvaBackground1 << " (<0.3)" << std::endl; return 1; } std::cout << "Mean MVA response on background 2: " << meanMvaBackground2 << std::endl; if(meanMvaBackground0 < 0.3){ std::cout << "[ERROR] Mean response on background 2 is " << meanMvaBackground2 << " (<0.3)" << std::endl; return 1; } return 0; }