diff --git a/bin/mem_test.cc b/bin/mem_test.cc
index 9f50a060ee4cac1350dc4cc9687a82a0ef4885a8..0426a22205d9123873684c97414aeeca2f4fea57 100644
--- a/bin/mem_test.cc
+++ b/bin/mem_test.cc
@@ -60,7 +60,8 @@ int main(){
       },
       {},
       {},
-      lv_met
+      lv_met,
+      -1
     );
     std::cout << "mem=" << res.p << std::endl;
   }
diff --git a/bin/mem_test_dl.cc b/bin/mem_test_dl.cc
index 867663c6b8b0f28c4e3c05fe064d63c1d56aa547..29d00fd6edd325279495083171cf11f5700a29bc 100644
--- a/bin/mem_test_dl.cc
+++ b/bin/mem_test_dl.cc
@@ -87,7 +87,8 @@ int main(){
       },
       {},
       {},
-      lv_met
+      lv_met,
+      -1
     );
     std::cout << "mem=" << res.p << std::endl;
   }
diff --git a/data/transfer.root b/data/transfer.root
index 6fbb788aa38af23c786cd9b4cf7f2d474ed6f1fc..a6d46c218cecd707359f81b31235a6b90d791bcc 100644
Binary files a/data/transfer.root and b/data/transfer.root differ
diff --git a/interface/MEMClassifier.h b/interface/MEMClassifier.h
index 9e9df83748c4d4130a271599194f783a6bc73d87..3583e516511260ea0c847e6a73d4b3588fb04a82 100644
--- a/interface/MEMClassifier.h
+++ b/interface/MEMClassifier.h
@@ -54,6 +54,7 @@ class MEMClassifier {
 
     //The constructor loads the transfer functions and b-tag PDF-s
     MEMClassifier();
+    MEMClassifier(MEM::MEMConfig _cfg);
     ~MEMClassifier();
 
     // Call this method to return the MEM output, provide all necessary inputs.
@@ -68,7 +69,8 @@ class MEMClassifier {
         const std::vector<JetType>& selectedJetType,
         const std::vector<TLorentzVector>& looseSelectedJetP4,
         const std::vector<double>& looseSelectedJetCSV,
-        TLorentzVector& metP4
+        TLorentzVector& metP4,
+        int ncalls=1
     );
 
     void setup_mem(
diff --git a/setup/install_mem.sh b/setup/install_mem.sh
index 8aab14a3550062812a55f19a8e5a9f6dff869978..4ee68b3a331feb076ded0b64e92181ae1bffda7c 100644
--- a/setup/install_mem.sh
+++ b/setup/install_mem.sh
@@ -7,7 +7,7 @@ if [ -e "${CMSSW_BASE}" ]; then
 	cd src/TTH
 
 	#get the MEM code
-	git clone https://github.com/bianchini/Code.git MEIntegratorStandalone
+	git clone https://github.com/bianchini/Code.git MEIntegratorStandalone --branch v0.1
 
 	#copy the OpenLoops ME libraries
 	cp $CMSSW_BASE/src/TTH/MEIntegratorStandalone/libs/*.so $CMSSW_BASE/lib/$SCRAM_ARCH/
diff --git a/src/MEMClassifier.cc b/src/MEMClassifier.cc
index a2b120e3a887b759adc50d21dbe07d5b635b0b07..6037946743b91d92fd85a3a52d59632a074420bc 100644
--- a/src/MEMClassifier.cc
+++ b/src/MEMClassifier.cc
@@ -87,7 +87,7 @@ void MEMClassifier::setup_mem(
 
     // Fallback
     default: {
-        std::cout << "Warning! Fallback case reached. Invalid MEM Hypo!!!" << std::endl;
+        std::cerr << "Warning! Fallback case reached. Invalid MEM Hypo!!!" << std::endl;
         throw 1;
     }
 
@@ -152,7 +152,7 @@ void MEMClassifier::setup_mem_sl_0w2h2t(
     for (auto* jet : tagged) {
         objs.push_back(jet);
         integrand->push_back_object(jet);
-        std::cout << "adding jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
+        //std::cout << "adding jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
     }
 
     for (unsigned int il=0; il < selectedLeptonP4.size(); il++) {
@@ -222,14 +222,14 @@ void MEMClassifier::setup_mem_sl_2w2h2t(
     for (auto* jet : tagged) {
         objs.push_back(jet);
         integrand->push_back_object(jet);
-        std::cout << "adding tagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
+        //std::cout << "adding tagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
     }
 
     assert(untagged.size() >= 2);
     for (auto* jet : untagged) {
         objs.push_back(jet);
         integrand->push_back_object(jet);
-        std::cout << "adding untagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
+        //std::cout << "adding untagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
     }
 
     for (unsigned int il=0; il < selectedLeptonP4.size(); il++) {
@@ -296,7 +296,7 @@ void MEMClassifier::setup_mem_dl_0w2h2t(
     for (auto* jet : tagged) {
         objs.push_back(jet);
         integrand->push_back_object(jet);
-        std::cout << "adding jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
+        //std::cout << "adding jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
     }
 
     for (unsigned int il=0; il < selectedLeptonP4.size(); il++) {
@@ -399,13 +399,13 @@ void MEMClassifier::setup_mem_sl_2w2h2t_sj(
     for (auto* jet : tagged) {
         objs.push_back(jet);
         integrand->push_back_object(jet);
-        std::cout << "adding tagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
+        //std::cout << "adding tagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
     }
 
     for (auto* jet : untagged) {
         objs.push_back(jet);
         integrand->push_back_object(jet);
-        std::cout << "adding untagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
+        //std::cout << "adding untagged jet " << jet->p4().Pt() << " btag " << jet->getObs(MEM::Observable::BTAG) << std::endl;
     }
 
     for (unsigned int il=0; il < selectedLeptonP4.size(); il++) {
@@ -414,16 +414,15 @@ void MEMClassifier::setup_mem_sl_2w2h2t_sj(
         MEM::Object* lep = make_lepton(lep_p4.Pt(), lep_p4.Eta(), lep_p4.Phi(), lep_p4.M(), selectedLeptonCharge[il]);
         objs.push_back(lep);
         integrand->push_back_object(lep);
-        std::cout << "adding lep " << lep->p4().Pt() << " charge " << lep->getObs(MEM::Observable::CHARGE) << std::endl;
+        //std::cout << "adding lep " << lep->p4().Pt() << " charge " << lep->getObs(MEM::Observable::CHARGE) << std::endl;
     }
 
     assert(metP4.Pt() > 0);
     MEM::Object* met = new MEM::Object(metP4, MEM::ObjectType::MET );
-    std::cout << "adding met pt " << met->p4().Pt() << " phi " << met->p4().Phi() << std::endl;
+    //std::cout << "adding met pt " << met->p4().Pt() << " phi " << met->p4().Phi() << std::endl;
     integrand->push_back_object(met);
 }
 
-
 MEMResult MEMClassifier::GetOutput(
     const Hypothesis hypo,
     const std::vector<TLorentzVector>& selectedLeptonP4,
@@ -433,7 +432,8 @@ MEMResult MEMClassifier::GetOutput(
     const std::vector<JetType>& selectedJetType,
     const std::vector<TLorentzVector>& looseSelectedJetP4,
     const std::vector<double>& looseSelectedJetCSV,
-    TLorentzVector& metP4
+    TLorentzVector& metP4,
+    int ncalls
 ) {
 
     // Make sure vector sizes match up
@@ -471,48 +471,48 @@ MEMResult MEMClassifier::GetOutput(
 
     // Single Lepton - Boosted 222
     case SL_2W2H2T_SJ: {
-        std::cout << "MEM running signal" << std::endl;
-        res_sig = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTH, {}, {});
+        //std::cout << "MEM running signal" << std::endl;
+        res_sig = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTH, {}, {}, ncalls);
 
-        std::cout << "MEM running background" << std::endl;
-        res_bkg = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTBB, {}, {});
+        //std::cout << "MEM running background" << std::endl;
+        res_bkg = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTBB, {}, {}, ncalls);
 
         break;
     }
     
     // Single Lepton - Boosted 222
     case SL_2W2H2T: {
-        std::cout << "MEM running signal" << std::endl;
-        res_sig = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTH, {}, {});
+        //std::cout << "MEM running signal" << std::endl;
+        res_sig = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTH, {}, {}, ncalls);
 
-        std::cout << "MEM running background" << std::endl;
-        res_bkg = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTBB, {}, {});
+        //std::cout << "MEM running background" << std::endl;
+        res_bkg = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTBB, {}, {}, ncalls);
 
         break;
     }
 
     // Single Lepton - Resolved 022
     case SL_0W2H2T: {
-        std::cout << "MEM running signal" << std::endl;
+        //std::cout << "MEM running signal" << std::endl;
         res_sig = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTH, {},
-        {MEM::PSVar::cos_q1, MEM::PSVar::phi_q1, MEM::PSVar::cos_qbar1, MEM::PSVar::phi_qbar1});
+        {MEM::PSVar::cos_q1, MEM::PSVar::phi_q1, MEM::PSVar::cos_qbar1, MEM::PSVar::phi_qbar1}, ncalls);
 
-        std::cout << "MEM running background" << std::endl;
+        //std::cout << "MEM running background" << std::endl;
         res_bkg = integrand->run(MEM::FinalState::LH, MEM::Hypothesis::TTBB, {},
-        {MEM::PSVar::cos_q1, MEM::PSVar::phi_q1, MEM::PSVar::cos_qbar1, MEM::PSVar::phi_qbar1});
+        {MEM::PSVar::cos_q1, MEM::PSVar::phi_q1, MEM::PSVar::cos_qbar1, MEM::PSVar::phi_qbar1}, ncalls);
 
         break;
     }
 
     // Di Lepton - Resolved 022
     case DL_0W2H2T: {
-        std::cout << "MEM running signal" << std::endl;
+        //std::cout << "MEM running signal" << std::endl;
         res_sig = integrand->run(MEM::FinalState::LL, MEM::Hypothesis::TTH, {},
-                                 {});
+                                 {}, ncalls);
 
-        std::cout << "MEM running background" << std::endl;
+        //std::cout << "MEM running background" << std::endl;
         res_bkg = integrand->run(MEM::FinalState::LL, MEM::Hypothesis::TTBB, {},
-                                 {});
+                                 {}, ncalls);
 
         break;
     }
@@ -586,7 +586,11 @@ TF1* MEMClassifier::getTransferFunction(const char* flavour, double eta) const {
     return tf;
 }
 
-MEMClassifier::MEMClassifier() : cfg(MEM::MEMConfig()) {
+MEMClassifier::MEMClassifier() : MEMClassifier(MEM::MEMConfig()) {
+}
+
+MEMClassifier::MEMClassifier(MEM::MEMConfig _cfg) :
+    cfg(_cfg) {
 
     const string cmssw_path(std::getenv("CMSSW_BASE"));
 
@@ -602,11 +606,11 @@ MEMClassifier::MEMClassifier() : cfg(MEM::MEMConfig()) {
         string("/src/TTH/CommonClassifier/data/btag_pdfs.root")
     ).c_str();
 
-    cout << "opening " << transfers_path << endl;
+    //cout << "opening " << transfers_path << endl;
     transfers = new TFile(transfers_path.c_str());
     assert(transfers != nullptr);
 
-    cout << "opening " << btagfile_path << endl;
+    //cout << "opening " << btagfile_path << endl;
     btagfile = new TFile(btagfile_path.c_str());
     assert(btagfile != nullptr);
 
diff --git a/test/mem.py b/test/mem.py
index 32242888f5c723060807046e8c566c12a4a93afe..009d8e4e18355fc9f5a40ab3349be3948cb5c990 100644
--- a/test/mem.py
+++ b/test/mem.py
@@ -1,22 +1,26 @@
-import ROOT, json
+import ROOT, json, sys
 ROOT.gSystem.Load("libTTHCommonClassifier")
+ROOT.gSystem.Load("libTTHMEIntegratorStandalone")
 CvectorLorentz = getattr(ROOT, "std::vector<TLorentzVector>")
 Cvectordouble = getattr(ROOT, "std::vector<double>")
 CvectorJetType = getattr(ROOT, "std::vector<int>")
 
+ncalls = [1000, 2000, 4000, 8000, 16000, 32000]
 f = ROOT.MEMClassifier()
 
-inf = open("root/events_6j.json")
-data = inf.read()
-events = data.split("\n\n\n")[:-1]
+if len(sys.argv)==2:
+    inf = open(sys.argv[1])
+else:
+    inf = sys.stdin
 
 def make_p4(pt, eta, phi, m):
     v = ROOT.TLorentzVector()
     v.SetPtEtaPhiM(pt, eta, phi, m)
     return v
 
-for ev in events:
+for ev in inf.readlines():
     print "----"
+    print ev
     jsev = json.loads(ev)
     jets_p4 = jsev["input"]["selectedJetsP4"]
     jets_csv = jsev["input"]["selectedJetsCSV"]
@@ -42,17 +46,20 @@ for ev in events:
 
     c_loosejets_p4 = CvectorLorentz()
     c_loosejets_csv = Cvectordouble()
+    out = {}
+    print "tthbb13 code cat={0}".format(jsev["event"]["cat"])
+    for _ncalls in ncalls:
+        if jsev["output"]["mem_cfg"] == "SL_2w2h2t":
+            ret = f.GetOutput(f.SL_2W2H2T, c_leps_p4, c_leps_charge, c_jets_p4, c_jets_csv, c_jets_jettype, c_loosejets_p4, c_loosejets_csv, met_p4, _ncalls)
+        elif jsev["output"]["mem_cfg"] == "SL_1w2h2t":
+            ret = f.GetOutput(f.SL_1W2H2T, c_leps_p4, c_leps_charge, c_jets_p4, c_jets_csv, c_jets_jettype, c_loosejets_p4, c_loosejets_csv, met_p4, _ncalls)
+        elif jsev["output"]["mem_cfg"] == "SL_0w2h2t":
+            ret = f.GetOutput(f.SL_0W2H2T, c_leps_p4, c_leps_charge, c_jets_p4, c_jets_csv, c_jets_jettype, c_loosejets_p4, c_loosejets_csv, met_p4, _ncalls)
+        out["output__{0}".format(_ncalls)] = {
+            "p_sig": ret.p_sig,
+            "p_err_sig": ret.p_err_sig,
+            "p_bkg": ret.p_bkg,
+            "p_err_bkg": ret.p_err_bkg
+        }
+    print "out:", json.dumps(out)
 
-    print "tthbb13 code blr=", jsev["event"]["blr"], "mem=", jsev["output"]["p_tth"], jsev["output"]["p_ttbb"], jsev["output"]["p"]
-    if jsev["event"]["cat"].startswith("dl"):
-        print "DL_0w2h2t"
-        ret = f.GetOutput(f.DL_0W2H2T, c_leps_p4, c_leps_charge, c_jets_p4, c_jets_csv, c_jets_jettype, c_loosejets_p4, c_loosejets_csv, met_p4)
-        print "mem.py blr=", ret.blr_4b/(ret.blr_4b + ret.blr_2b), "mem=", ret.p_sig, ret.p_bkg, ret.p
-    elif jsev["event"]["cat"].startswith("sl_jge6"):
-        print "SL_2w2h2t"
-        ret = f.GetOutput(f.SL_2W2H2T, c_leps_p4, c_leps_charge, c_jets_p4, c_jets_csv, c_jets_jettype, c_loosejets_p4, c_loosejets_csv, met_p4)
-        print "mem.py blr=", ret.blr_4b/(ret.blr_4b + ret.blr_2b), "mem=", ret.p_sig, ret.p_bkg, ret.p
-    elif jsev["event"]["cat"].startswith("sl"):
-        print "SL_0w2h2t"
-        ret = f.GetOutput(f.SL_0W2H2T, c_leps_p4, c_leps_charge, c_jets_p4, c_jets_csv, c_jets_jettype, c_loosejets_p4, c_loosejets_csv, met_p4)
-        print "mem.py blr=", ret.blr_4b/(ret.blr_4b + ret.blr_2b), "mem=", ret.p_sig, ret.p_bkg, ret.p