diff --git a/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/cmt/requirements b/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/cmt/requirements
new file mode 100644
index 0000000000000000000000000000000000000000..cff4f20b9b81b678b68f052f0042030da3a56464
--- /dev/null
+++ b/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/cmt/requirements
@@ -0,0 +1,17 @@
+package ExoticsN2N
+
+use AtlasPolicy AtlasPolicy-*
+
+
+private
+use AtlasROOT   AtlasROOT-*   External
+
+branches doc python share
+
+apply_pattern declare_joboptions files="*.py"
+apply_pattern declare_python_modules files="*.py"
+
+application ExoticsMultiJetSkim ../src/ExoticsMultiJetSkim.cxx
+macro_append ExoticsMultiJetSkim_use_linkopts " -L$(ROOTSYS)/lib -lCintex -lCore -lCint -lHist -lGraf -lGraf3d -lGpad -lTree -lTreePlayer -lRint -lPostscript -lMatrix -lPhysics -lm -ldl -lpthread -rdynamic"
+
+end_private
diff --git a/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/python/ExoticsN2NFlags.py b/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/python/ExoticsN2NFlags.py
new file mode 100644
index 0000000000000000000000000000000000000000..77a7422edbd912f5fb5e7b0e0c93d36b1a490372
--- /dev/null
+++ b/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/python/ExoticsN2NFlags.py
@@ -0,0 +1,50 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+from AthenaCommon.JobProperties import JobProperty, JobPropertyContainer
+from AthenaCommon.JobProperties import jobproperties
+
+class ExoticsN2NFlags (JobPropertyContainer):
+    """Flags for Exotics N2N making.
+    """
+
+jobproperties.add_Container (ExoticsN2NFlags)
+
+class EXMJTriggers (JobProperty):
+    """Triggers for event selection"""
+    statusOn     = True
+    allowedTypes = ['str']
+    StoredValue  = 'EF_j170_a4tchad_ht700,EF_j15_a4tchad,EF_j25_a4tchad,EF_j35_a4tchad,EF_j45_a4tchad,EF_j55_a4tchad,EF_j80_a4tchad,EF_j110_a4tchad,EF_j145_a4tchad,EF_j180_a4tchad,EF_j220_a4tchad,EF_j280_a4tchad,EF_j360_a4tchad,EF_j460_a4tchad'
+jobproperties.ExoticsN2NFlags.add_JobProperty(EXMJTriggers)
+
+class EXMJDoMC (JobProperty):
+    """Keep MC Truth"""
+    statusOn     = True
+    allowedTypes = ['bool']
+    StoredValue  = True
+jobproperties.ExoticsN2NFlags.add_JobProperty(EXMJDoMC)
+
+class EXMJDoMCSlim (JobProperty):
+    """Do MC Slimming (keep hard process and stable)"""
+    """note: hard process is valid only for Pythia8"""
+    statusOn     = True
+    allowedTypes = ['bool']
+    StoredValue  = True
+jobproperties.ExoticsN2NFlags.add_JobProperty(EXMJDoMCSlim)
+
+class EXMJDoBH (JobProperty):
+    """Do blackhole reconstruction from hard process"""
+    """note: hard process is valid only for Pythia8"""
+    statusOn     = True
+    allowedTypes = ['bool']
+    StoredValue  = True
+jobproperties.ExoticsN2NFlags.add_JobProperty(EXMJDoBH)
+
+class EXMJDoMCSkim (JobProperty):
+    """Force skim even for MC samples"""
+    statusOn     = True
+    allowedTypes = ['bool']
+    StoredValue  = False
+jobproperties.ExoticsN2NFlags.add_JobProperty(EXMJDoMCSkim)
+
+# shortcut name
+ExoticsN2NFlags = jobproperties.ExoticsN2NFlags
diff --git a/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/python/ExoticsN2NProdFlags.py b/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/python/ExoticsN2NProdFlags.py
new file mode 100644
index 0000000000000000000000000000000000000000..3d867e52eb4094f18f7ee72264fdfd12e9795be0
--- /dev/null
+++ b/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/python/ExoticsN2NProdFlags.py
@@ -0,0 +1,16 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+from AthenaCommon.JobProperties import JobProperty
+
+class WriteEXMJNTUP (JobProperty):
+    """NTUP for exotics multijet"""
+    statusOn = True
+    allowedTypes = ['bool']
+    StoredValue = False
+    StreamName = 'StreamNTUP_EXMJ'
+    FileName = ''
+    isVirtual = False
+    SkimNTUPScript = "ExoticsN2N/EXMJNTUP_prodJobOFragment.py" 
+    TreeNames = ['susy']
+    SubSteps = ['n2n']
+
diff --git a/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/python/__init__.py b/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/python/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..ae1ceb1157d018a36168194d12f016e5525d3802
--- /dev/null
+++ b/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/python/__init__.py
@@ -0,0 +1,4 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+# template __init__.py defined in the GaudiPolicy package.
+
diff --git a/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/share/EXMJNTUP_prodJobOFragment.py b/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/share/EXMJNTUP_prodJobOFragment.py
new file mode 100644
index 0000000000000000000000000000000000000000..8507881605fdf705c372e0610eeee336ba924b7b
--- /dev/null
+++ b/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/share/EXMJNTUP_prodJobOFragment.py
@@ -0,0 +1,67 @@
+# This jobO should not be included more than once:
+include.block( "ExoticsN2N/EXMJNTUP_prodJobOFragment.py" )
+# Common import(s):
+from AthenaCommon.JobProperties import jobproperties
+prodFlags = jobproperties.SkimNTUP_ProdFlags
+from PrimaryDPDMaker.PrimaryDPDHelpers import buildFileName
+from AthenaCommon.SystemOfUnits import GeV
+
+exmjntup=prodFlags.WriteEXMJNTUP
+
+# Set up a logger:
+from AthenaCommon.Logging import logging
+EXMJStream_msg = logging.getLogger( 'EXMJNTUP_prodJobOFragment' )
+
+# Check if the configuration makes sense:
+if exmjntup.isVirtual:
+    EXMJStream_msg.error( "NTUP stream can't be virtual! " +
+                                 "It's a configuration error!" )
+    raise NameError( "NTUP set to be a virtual stream" )
+    pass
+
+## Construct the stream and file names:
+streamName = exmjntup.StreamName
+if exmjntup.FileName=='':
+    fileName   = buildFileName( exmjntup )
+else:
+    fileName   = exmjntup.FileName
+EXMJStream_msg.info( "Configuring NTUP_EXMJ with streamName '%s' and fileName '%s'" % \
+                            ( streamName, fileName ) )
+
+## set command
+from ExoticsN2N.ExoticsN2NFlags import ExoticsN2NFlags
+import subprocess
+def boolToStr(flag):
+    if flag:return "1"
+    else:return "0"
+
+cmd=['ExoticsMultiJetSkim.exe',
+     '-n',prodFlags.TreeName(),
+     '-o',fileName,
+     '-t',ExoticsN2NFlags.EXMJTriggers(),
+     '-m',boolToStr(ExoticsN2NFlags.EXMJDoMC()),
+     '-s',boolToStr(ExoticsN2NFlags.EXMJDoMCSlim()),
+     '-b',boolToStr(ExoticsN2NFlags.EXMJDoBH()),
+     '-f',boolToStr(ExoticsN2NFlags.EXMJDoMCSkim()),
+     '-e',str(athenaCommonFlags.EvtMax()),
+     '-S',str(athenaCommonFlags.SkipEvents()),
+     ]
+
+inputs=athenaCommonFlags.FilesInput()
+if isinstance(inputs,str):
+    inputs=[inputs]
+cmd+=inputs
+print 'cmd =',cmd
+proc=subprocess.Popen( args=cmd, bufsize = 1, shell = False,stdout = subprocess.PIPE, stderr = subprocess.STDOUT )
+
+while proc.poll() is None:
+    line = proc.stdout.readline()
+    if line:
+        print line.rstrip()
+
+rc=proc.returncode
+print 'rc =',rc
+
+if not rc==0:
+    raise RuntimeError("ExoticsMultiJetSkim.exe returned with value {0:d} instead of 0. Stopping!".format(rc))
+
diff --git a/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/src/ExoticsMultiJetSkim.cxx b/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/src/ExoticsMultiJetSkim.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..d159d00a9546e3559f57d275216b8945ca8a63b7
--- /dev/null
+++ b/PhysicsAnalysis/NTUPtoNTUP/ExoticsN2N/src/ExoticsMultiJetSkim.cxx
@@ -0,0 +1,923 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include <iostream>
+#include <stdio.h>
+#include <vector>
+#include <iomanip>
+#include <stdlib.h>
+#include <unistd.h>
+#include "TChain.h"
+#include "TRegexp.h"
+#include "TH1F.h"
+#include "TFile.h"
+#include "TLorentzVector.h"
+#include "TApplication.h"
+#include "TROOT.h"
+
+using namespace std;
+
+// Input information
+TString def_treeName="susy";
+TString def_outputFile="output.root";
+TString def_triggers="";
+bool def_doElectron=true;
+bool def_doMuon=true;
+bool def_doPhoton=true;
+bool def_doJet=true;
+bool def_doMET=true;
+bool def_doTrack=true;
+bool def_doMC=true;
+bool def_doMCSlim=true;
+bool def_doBH=true;
+bool def_doMCSkim=false;
+
+
+void help(char*exe){
+  cout << "Usage: " << exe << " " << "[options] [inputFile1 [inputFile2 [inputFile3...]]" << endl;
+  cout << endl;
+  cout << "Arguments:" << endl;
+  cout << "  -n  Set tree name (default:" << def_treeName << ")" << endl;
+  cout << "  -o  Set output file name (default:" << def_outputFile << ")" << endl;
+  cout << "  -i  Set input file name, multiple input can be used" << endl;
+  cout << "      Multiple inputs can be set in one argument with \",\" as a separator (-i file1,file2)" << endl;
+  cout << "  -E  Do Electron (default:" <<  def_doElectron << ")" << endl;
+  cout << "  -M  Do Muon (default: " << def_doMuon << ")" << endl;
+  cout << "  -P  Do Photon (default: " << def_doPhoton << ")" << endl;
+  cout << "  -J  Do Jet (default: " << def_doJet << ")" << endl;
+  cout << "  -I  Do MET (default: " << def_doMET << ")" << endl;
+  cout << "  -T  Do Track (default: " << def_doTrack << ")" << endl;
+  cout << "  -t  Set trigger name for skimming, can set multiple triggers (default: no skim)" << endl;
+  cout << "  -m  Use MC information or not (default:" << def_doMC << ")" << endl;
+  cout << "  -s  Do MC slimming or not (default:" << def_doMCSlim << ")" << endl;
+  cout << "  -b  Do BH truth reconstruction or not (default:" << def_doBH << ")" << endl;
+  cout << "  -e  Set max events (default: all (-1))" << endl;
+  cout << "  -S  Set skip events (default: (0))" << endl;
+  cout << "  -f  Force skimming even for MC (default:" << def_doMCSkim << ")" << endl;
+  cout << "  -h  Print Help (this message) and exit" << endl;
+  cout << "  Additional arguments w/o option will be used as input file name" << endl;
+}
+
+int main (int argc, char *argv[]){
+
+  // Include for ROOT
+  gROOT->ProcessLine("#include <vector>");
+
+
+  // Input information
+  TString treeName=def_treeName;
+  TString outputFile=def_outputFile;
+  TString inputFiles="";
+  TString triggerNames="";
+  bool doElectron=def_doElectron;
+  bool doMuon=def_doMuon;
+  bool doPhoton=def_doPhoton;
+  bool doJet=def_doJet;
+  bool doMET=def_doMET;
+  bool doTrack=def_doTrack;
+  bool doMC=def_doMC;
+  bool doMCSlim=def_doMCSlim;
+  bool doBH=def_doBH;
+  bool doMCSkim=def_doMCSkim;
+  int maxEvents=-1;
+  int skipEvents=0;
+
+  // Argument check
+  int c;
+  while((c=getopt(argc,argv,"n:o:i:E:M:P:J:I:T:t:m:s:b:f:e:S:h"))!=-1){
+    //cout << "option=" << (char)c << ", optarg=" << optarg << endl;
+    switch(c){
+      case 'n':
+        treeName=optarg;
+        break;
+      case 'o':
+        outputFile=optarg;
+        break;
+      case 'i':
+        if (inputFiles!="")inputFiles+=TString(",")+optarg;
+        else inputFiles=optarg;
+        break;
+      case 'E':
+        if (atoi(optarg)==0)doElectron=false;
+        else doElectron=true;
+        break;
+      case 'M':
+        if (atoi(optarg)==0)doMuon=false;
+        else doMuon=true;
+        break;
+      case 'P':
+        if (atoi(optarg)==0)doPhoton=false;
+        else doPhoton=true;
+        break;
+      case 'J':
+        if (atoi(optarg)==0)doJet=false;
+        else doJet=true;
+        break;
+      case 'I':
+        if (atoi(optarg)==0)doMET=false;
+        else doMET=true;
+        break;
+      case 'T':
+        if (atoi(optarg)==0)doTrack=false;
+        else doTrack=true;
+        break;
+      case 't':
+        if (triggerNames!="")triggerNames+=TString(",")+optarg;
+        else triggerNames=optarg;
+        break;
+      case 'm':
+        if (atoi(optarg)==0)doMC=false;
+        else doMC=true;
+        break;
+      case 's':
+        if (atoi(optarg)==0)doMCSlim=false;
+        else doMCSlim=true;
+        break;
+      case 'b':
+        if (atoi(optarg)==0)doBH=false;
+        else doBH=true;
+        break;
+      case 'f':
+        if (atoi(optarg)==0)doMCSkim=false;
+        else doMCSkim=true;
+        break;
+      case 'e':
+        maxEvents = atoi(optarg);
+        break;
+      case 'S':
+        skipEvents = atoi(optarg);
+        break;
+      default:
+        cout << "Unknown option: " << (char)c << endl;
+        help(argv[0]);
+        exit(1);
+    }
+  }
+  while(optind<argc){
+    if (inputFiles!="")inputFiles+=TString(",")+argv[optind++];
+    else inputFiles=argv[optind++];
+  }
+  if(inputFiles==""){
+    help(argv[0]);
+    exit(1);
+  }
+
+  char*str;
+  std::vector<TString>inputs;
+  str=strtok (const_cast<char*>(inputFiles.Data()),",");
+  while (str!=NULL){
+    inputs.push_back(str);
+    str=strtok(NULL,",");
+  }
+  std::vector<TString>triggers;
+  std::vector<TString>triggersInD3PD;
+  str=strtok (const_cast<char*>(triggerNames.Data()),",");
+  while (str!=NULL){
+    triggers.push_back(str);
+    str=strtok(NULL,",");
+  }
+
+  // Parameter dump
+  cout << "ExoticsMultiJetSkim: treeName   = " << treeName << endl;
+  cout << "ExoticsMultiJetSkim: outputFile = " << outputFile << endl;
+  cout << "ExoticsMultiJetSkim: inputFiles =";
+  for(unsigned int i=0;i<inputs.size();i++)cout << " " << inputs[i];
+  cout << endl;
+  cout << "ExoticsMultiJetSkim: triggers   =";
+  for(unsigned int i=0;i<triggers.size();i++)cout << " " << triggers[i];
+  cout << endl;
+  cout << "ExoticsMultiJetSkim: doElectron = " << doElectron << endl;
+  cout << "ExoticsMultiJetSkim: doMuon     = " << doMuon << endl;
+  cout << "ExoticsMultiJetSkim: doPhoton   = " << doPhoton << endl;
+  cout << "ExoticsMultiJetSkim: doJet      = " << doJet << endl;
+  cout << "ExoticsMultiJetSkim: doMET      = " << doMET << endl;
+  cout << "ExoticsMultiJetSkim: doMC       = " << doMC << endl;
+  cout << "ExoticsMultiJetSkim: doMCSlim   = " << doMCSlim << endl;
+  cout << "ExoticsMultiJetSkim: doBH       = " << doBH << endl;
+  cout << "ExoticsMultiJetSkim: doMCSkim   = " << doMCSkim << endl;
+  cout << "ExoticsMultiJetSkim: maxEvents  = " << maxEvents << endl;
+  cout << "ExoticsMultiJetSkim: skipEvents = " << skipEvents << endl;
+
+  // Get main tree
+  TChain* ch= new TChain(treeName);
+  for(unsigned int i=0;i<inputs.size();i++){
+    ch->Add(inputs[i]);
+  }
+
+  // Exclude/include list of branches
+  // All branches match to words include list are enabled
+  // Exclude list are checked after include list
+  vector<TRegexp> includes;
+  vector<TRegexp> excludes;
+
+  // Run info
+  includes.push_back(TRegexp("RunNumber",kTRUE));
+  includes.push_back(TRegexp("EventNumber",kTRUE));
+  includes.push_back(TRegexp("lbn",kTRUE));
+  includes.push_back(TRegexp("bcid",kTRUE));
+  includes.push_back(TRegexp("actualIntPerXing",kTRUE));
+  includes.push_back(TRegexp("averageIntPerXing",kTRUE));
+  includes.push_back(TRegexp("pixelFlags",kTRUE));
+  includes.push_back(TRegexp("sctFlags",kTRUE));
+  includes.push_back(TRegexp("trtFlags",kTRUE));
+  includes.push_back(TRegexp("larFlags",kTRUE));
+  includes.push_back(TRegexp("tileFlags",kTRUE));
+  includes.push_back(TRegexp("muonFlags",kTRUE));
+  includes.push_back(TRegexp("fwdFlags",kTRUE));
+  includes.push_back(TRegexp("coreFlags",kTRUE));
+  includes.push_back(TRegexp("pixelError",kTRUE));
+  includes.push_back(TRegexp("sctError",kTRUE));
+  includes.push_back(TRegexp("trtError",kTRUE));
+  includes.push_back(TRegexp("larError",kTRUE));
+  includes.push_back(TRegexp("tileError",kTRUE));
+  includes.push_back(TRegexp("muonError",kTRUE));
+  includes.push_back(TRegexp("fwdError",kTRUE));
+  includes.push_back(TRegexp("coreError",kTRUE));
+  includes.push_back(TRegexp("bunch_configID",kTRUE));
+  includes.push_back(TRegexp("detmask0",kTRUE));
+  includes.push_back(TRegexp("detmask1",kTRUE));
+  includes.push_back(TRegexp("isSimulation",kTRUE));
+  includes.push_back(TRegexp("isCalibration",kTRUE));
+  includes.push_back(TRegexp("isTestBeam",kTRUE));
+  //includes.push_back(TRegexp("Eventshape_rhoKt4EM",kTRUE));
+  includes.push_back(TRegexp("Eventshape_rhoKt4LC",kTRUE));
+
+  // Vertex
+  includes.push_back(TRegexp("vx_n",kTRUE));
+  includes.push_back(TRegexp("vx_nTracks",kTRUE));
+  includes.push_back(TRegexp("vx_sumPt",kTRUE));
+  includes.push_back(TRegexp("vxp_n",kTRUE));
+  includes.push_back(TRegexp("vxp_nTracks",kTRUE));
+  includes.push_back(TRegexp("vxp_sumPt",kTRUE));
+
+  // Electron
+  if(doElectron){
+    includes.push_back(TRegexp("el_n",kTRUE));
+    includes.push_back(TRegexp("el_pt",kTRUE));
+    includes.push_back(TRegexp("el_eta",kTRUE));
+    includes.push_back(TRegexp("el_phi",kTRUE));
+    includes.push_back(TRegexp("el_E",kTRUE));
+    includes.push_back(TRegexp("el_m",kTRUE));
+    includes.push_back(TRegexp("el_cl_pt",kTRUE));
+    includes.push_back(TRegexp("el_cl_eta",kTRUE));
+    includes.push_back(TRegexp("el_cl_phi",kTRUE));
+    includes.push_back(TRegexp("el_cl_E",kTRUE));
+    includes.push_back(TRegexp("el_etas2",kTRUE));
+    includes.push_back(TRegexp("el_tracketa",kTRUE));
+    includes.push_back(TRegexp("el_trackphi",kTRUE));
+    includes.push_back(TRegexp("el_nPixHits",kTRUE));
+    includes.push_back(TRegexp("el_nSCTHits",kTRUE));
+    includes.push_back(TRegexp("el_author",kTRUE));
+    includes.push_back(TRegexp("el_charge",kTRUE));
+    includes.push_back(TRegexp("el_ptcone20",kTRUE));
+    includes.push_back(TRegexp("el_ptcone30",kTRUE));
+    includes.push_back(TRegexp("el_OQ",kTRUE));
+    includes.push_back(TRegexp("el_goodOQ",kTRUE));
+    includes.push_back(TRegexp("el_is*",kTRUE));
+    includes.push_back(TRegexp("el_medium*",kTRUE));
+    includes.push_back(TRegexp("el_loose*",kTRUE));
+    includes.push_back(TRegexp("el_tight*",kTRUE));
+    includes.push_back(TRegexp("el_trackIPEstimate_z0_unbiasedpvunbiased",kTRUE));
+    includes.push_back(TRegexp("el_trackIPEstimate_d0_unbiasedpvunbiased",kTRUE));
+    includes.push_back(TRegexp("el_trackIPEstimate_sigd0_unbiasedpvunbiased",kTRUE));
+    includes.push_back(TRegexp("el_Etcone30",kTRUE));
+    includes.push_back(TRegexp("el_topoEtcone30_corrected",kTRUE));
+
+  }
+
+
+
+  // Muon
+  if(doMuon){
+    includes.push_back(TRegexp("mu_staco_n",kTRUE));
+    includes.push_back(TRegexp("mu_staco_pt",kTRUE));
+    includes.push_back(TRegexp("mu_staco_eta",kTRUE));
+    includes.push_back(TRegexp("mu_staco_phi",kTRUE));
+    includes.push_back(TRegexp("mu_staco_E",kTRUE));
+    includes.push_back(TRegexp("mu_staco_m",kTRUE));
+    includes.push_back(TRegexp("mu_staco_ptcone20",kTRUE));
+    includes.push_back(TRegexp("mu_staco_ptcone30",kTRUE));
+    includes.push_back(TRegexp("mu_staco_isCombinedMuon",kTRUE));
+    includes.push_back(TRegexp("mu_staco_isSegmentTaggedMuon",kTRUE));
+    includes.push_back(TRegexp("mu_staco_isLowPtReconstructedMuon",kTRUE));
+    includes.push_back(TRegexp("mu_staco_loose",kTRUE));
+    includes.push_back(TRegexp("mu_staco_medium",kTRUE));
+    includes.push_back(TRegexp("mu_staco_tight",kTRUE));
+    includes.push_back(TRegexp("mu_staco_expectBLayerHit",kTRUE));
+    includes.push_back(TRegexp("mu_staco_nBLHits",kTRUE));
+    includes.push_back(TRegexp("mu_staco_nPixHits",kTRUE));
+    includes.push_back(TRegexp("mu_staco_nPixelDeadSensors",kTRUE));
+    includes.push_back(TRegexp("mu_staco_nPixHoles",kTRUE));
+    includes.push_back(TRegexp("mu_staco_nSCTHits",kTRUE));
+    includes.push_back(TRegexp("mu_staco_nSCTDeadSensors",kTRUE));
+    includes.push_back(TRegexp("mu_staco_nSCTHoles",kTRUE));
+    includes.push_back(TRegexp("mu_staco_nTRTHits",kTRUE));
+    includes.push_back(TRegexp("mu_staco_nTRTOutliers",kTRUE));
+    includes.push_back(TRegexp("mu_staco_charge",kTRUE));
+    includes.push_back(TRegexp("mu_staco_me_qoverp_exPV",kTRUE));
+    includes.push_back(TRegexp("mu_staco_id_qoverp_exPV",kTRUE));
+    includes.push_back(TRegexp("mu_staco_me_theta_exPV",kTRUE));
+    includes.push_back(TRegexp("mu_staco_id_theta_exPV",kTRUE));
+    includes.push_back(TRegexp("mu_staco_id_theta",kTRUE));
+    includes.push_back(TRegexp("mu_staco_z0_exPV",kTRUE));
+    includes.push_back(TRegexp("mu_staco_d0_exPV",kTRUE));
+    includes.push_back(TRegexp("mu_staco_me_cov_qoverp_exPV",kTRUE));
+    includes.push_back(TRegexp("mu_staco_id_cov_qoverp_exPV",kTRUE));
+
+    includes.push_back(TRegexp("mu_staco_nRPCLayer*PhiHits",kTRUE));
+    includes.push_back(TRegexp("mu_staco_nTGCLayer*PhiHits",kTRUE));
+    includes.push_back(TRegexp("mu_staco_nMDT*",kTRUE));
+    includes.push_back(TRegexp("mu_staco_nCSCEtaHits",kTRUE));
+
+
+    includes.push_back(TRegexp("mu_staco_ms_qoverp",kTRUE));
+    includes.push_back(TRegexp("mu_staco_ms_theta",kTRUE));
+    includes.push_back(TRegexp("mu_staco_ms_phi",kTRUE));
+  }
+
+  // Photon
+  if(doPhoton){
+    includes.push_back(TRegexp("ph_n",kTRUE));
+    includes.push_back(TRegexp("ph_pt",kTRUE));
+    includes.push_back(TRegexp("ph_eta",kTRUE));
+    includes.push_back(TRegexp("ph_phi",kTRUE));
+    includes.push_back(TRegexp("ph_E",kTRUE));
+    includes.push_back(TRegexp("ph_m",kTRUE));
+    includes.push_back(TRegexp("ph_cl_pt",kTRUE));
+    includes.push_back(TRegexp("ph_cl_eta",kTRUE));
+    includes.push_back(TRegexp("ph_cl_phi",kTRUE));
+    includes.push_back(TRegexp("ph_cl_E",kTRUE));
+
+    includes.push_back(TRegexp("ph_loose",kTRUE));
+    includes.push_back(TRegexp("ph_tight",kTRUE));
+    includes.push_back(TRegexp("ph_isEM",kTRUE));
+    includes.push_back(TRegexp("ph_isConv",kTRUE));
+
+    includes.push_back(TRegexp("ph_etas1",kTRUE));
+    includes.push_back(TRegexp("ph_etas2",kTRUE));
+    includes.push_back(TRegexp("ph_OQ",kTRUE));
+    includes.push_back(TRegexp("ph_deltaEs",kTRUE));
+
+    includes.push_back(TRegexp("ph_reta",kTRUE));
+    includes.push_back(TRegexp("ph_rphi",kTRUE));
+    includes.push_back(TRegexp("ph_Ethad1",kTRUE));
+    includes.push_back(TRegexp("ph_Ethad",kTRUE));
+    includes.push_back(TRegexp("ph_E277",kTRUE));
+    includes.push_back(TRegexp("ph_E237",kTRUE));
+    includes.push_back(TRegexp("ph_E233",kTRUE));
+    includes.push_back(TRegexp("ph_weta2",kTRUE));
+    includes.push_back(TRegexp("ph_f1",kTRUE));
+    includes.push_back(TRegexp("ph_emaxs1",kTRUE));
+    includes.push_back(TRegexp("ph_Emax2",kTRUE));
+    includes.push_back(TRegexp("ph_Emins1",kTRUE));
+    includes.push_back(TRegexp("ph_fside",kTRUE));
+    includes.push_back(TRegexp("ph_wstot",kTRUE));
+    includes.push_back(TRegexp("ph_ws3",kTRUE));
+    includes.push_back(TRegexp("ph_convFlag",kTRUE));
+
+    includes.push_back(TRegexp("ph_Etcone40",kTRUE));
+    includes.push_back(TRegexp("ph_Etcone40_corrected",kTRUE));
+    includes.push_back(TRegexp("ph_topoEtcone40_corrected",kTRUE));
+    includes.push_back(TRegexp("ph_etap",kTRUE));
+    includes.push_back(TRegexp("ph_ED_median",kTRUE));
+  }
+
+  // Jet
+  vector<TString> jets;
+  //jets.push_back("jet_AntiKt4TopoNewEM_");
+  jets.push_back("jet_AntiKt4LCTopo_");
+  jets.push_back("jet_AntiKt4Truth_");
+  jets.push_back("jet_AntiKt4TruthJets_");
+  jets.push_back("jet_AntiKt4TruthWithMuNoInt_");
+  if(doJet){
+    for(unsigned int i=0;i<jets.size();i++){
+      includes.push_back(TRegexp(jets[i]+"n",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"E",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"pt",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"m",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"eta",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"phi",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"emscale*",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"constscale*",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"hecf",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"tgap3f",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"LArQuality",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"HECQuality",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"NegativeE",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"emfrac",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"Timing",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"sumPtTrk*",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"AverageLArQF",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"SamplingMax",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"fracSamplingMax",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"nTrk",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"WIDTH",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"BCH_CORR_JET*",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"BCH_CORR_CELL",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"BCH_CORR_DOTX",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"is*",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"Active*",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"OriginIndex",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"EtaOrigin",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"PhiOrigin",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"MOrigin",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"jvtxf",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"jvtx_x",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"jvtx_y",kTRUE));
+      includes.push_back(TRegexp(jets[i]+"jvtx_z",kTRUE));
+    }
+  }
+
+  // MET
+  if(doMET){
+    includes.push_back(TRegexp("MET_*",kTRUE));
+
+    excludes.push_back(TRegexp("MET_Egamma10Loose*",kTRUE));
+    excludes.push_back(TRegexp("MET_Egamma10NoTauLoose*",kTRUE));
+    excludes.push_back(TRegexp("MET_Final*",kTRUE));
+    excludes.push_back(TRegexp("MET_LooseEgamma*",kTRUE));
+    excludes.push_back(TRegexp("*_CentralReg",kTRUE));
+    excludes.push_back(TRegexp("*_EndcapRegion",kTRUE));
+    excludes.push_back(TRegexp("*_ForwardReg",kTRUE));
+
+    vector<TString> objForMet;
+    objForMet.push_back("el_");
+    objForMet.push_back("mu_staco_");
+    objForMet.push_back("ph_");
+    objForMet.push_back("jet_AntiKt4LCTopo_");
+    objForMet.push_back("tau_");
+
+    vector<TString> metTypeForObj;
+    metTypeForObj.push_back("MET_");
+    metTypeForObj.push_back("MET_Egamma10NoTau_");
+
+    vector<TString> objMetBranch;
+    objMetBranch.push_back("n");
+    objMetBranch.push_back("statusWord");
+    objMetBranch.push_back("wet");
+    objMetBranch.push_back("wpx");
+    objMetBranch.push_back("wpy");
+
+    for (unsigned int i=0;i<objForMet.size();i++){
+      for (unsigned int j=0;j<metTypeForObj.size();j++){
+        for (unsigned int k=0;k<objMetBranch.size();k++){
+          includes.push_back(TRegexp(objForMet[i]+metTypeForObj[j]+objMetBranch[k],kTRUE));
+        }
+      }
+    }
+  }
+
+  // Track
+  if(doTrack){
+    includes.push_back(TRegexp("trk_eta",kTRUE));
+  }
+
+  // Trigger
+  includes.push_back(TRegexp("trig_L1_TAV",kTRUE));
+  includes.push_back(TRegexp("trig_L2_passedPhysics",kTRUE));
+  includes.push_back(TRegexp("trig_EF_passedPhysics",kTRUE));
+  includes.push_back(TRegexp("trig_L1_TBP",kTRUE));
+  includes.push_back(TRegexp("trig_L1_TAP",kTRUE));
+  includes.push_back(TRegexp("trig_L2_passedRaw",kTRUE));
+  includes.push_back(TRegexp("trig_EF_passedRaw",kTRUE));
+  includes.push_back(TRegexp("trig_DB_SMK",kTRUE));
+  includes.push_back(TRegexp("trig_DB_L1PSK",kTRUE));
+  includes.push_back(TRegexp("trig_DB_HLTPSK",kTRUE));
+
+  if(doElectron){
+    includes.push_back(TRegexp("trig_EF_el_n",kTRUE));
+    includes.push_back(TRegexp("trig_EF_el_eta",kTRUE));
+    includes.push_back(TRegexp("trig_EF_el_phi",kTRUE));
+    includes.push_back(TRegexp("trig_EF_el_EF_e24vhi_medium1",kTRUE));
+    includes.push_back(TRegexp("trig_EF_el_EF_e60_medium1",kTRUE));
+  }
+
+  if(doMuon){
+    includes.push_back(TRegexp("mu_staco_EFCB_index",kTRUE));
+    includes.push_back(TRegexp("mu_staco_EFMG_index",kTRUE));
+
+    includes.push_back(TRegexp("trig_EF_trigmuonef_EF_mu24i_tight",kTRUE));
+    includes.push_back(TRegexp("trig_EF_trigmuonef_EF_mu36_tight",kTRUE));
+    includes.push_back(TRegexp("trig_EF_trigmuonef_EF_mu40_MSonly_barrel_tight",kTRUE));
+  }
+
+  includes.push_back(TRegexp("trig_bgCode",kTRUE));
+
+  for(unsigned int i=0;i<triggers.size();i++){
+    includes.push_back(TRegexp(triggers[i],kTRUE));
+  }
+
+  // MC
+  includes.push_back(TRegexp("mc_channel_number",kTRUE));
+  includes.push_back(TRegexp("mc_event_number",kTRUE));
+  includes.push_back(TRegexp("mc_event_weight",kTRUE));
+  includes.push_back(TRegexp("mcevt*",kTRUE));
+  if(doMC){
+    includes.push_back(TRegexp("mc_n",kTRUE));
+    includes.push_back(TRegexp("mc_barcode",kTRUE));
+    includes.push_back(TRegexp("mc_pt",kTRUE));
+    includes.push_back(TRegexp("mc_eta",kTRUE));
+    includes.push_back(TRegexp("mc_phi",kTRUE));
+    includes.push_back(TRegexp("mc_m",kTRUE));
+    includes.push_back(TRegexp("mc_pdgId",kTRUE));
+    includes.push_back(TRegexp("mc_status",kTRUE));
+    includes.push_back(TRegexp("mc_parents",kTRUE));
+  }
+
+  // Flag for truth check
+  bool hasMC=false;
+
+  // Set Branch Status to 0 first.
+  // Then enable branches in include list
+  // branches in exclude list will be excluded 
+  // even it is in included list
+  ch->SetBranchStatus("*",0);
+
+  // Loop over all branches in tree
+  for (int i = 0; i < ch->GetListOfBranches()->GetEntries(); i++) {
+    TString branchName( ((TBranch*)ch->GetListOfBranches()->At(i))->GetName() );
+
+    // Check include list
+    for(unsigned int j=0;j<includes.size();j++){
+      if(branchName.Index(includes[j])!=kNPOS){
+        ch->SetBranchStatus(branchName,1);
+        break;
+      }
+    }
+    // Check exclude list
+    for(unsigned int j=0;j<excludes.size();j++){
+      if(branchName.Index(excludes[j])!=kNPOS){
+        ch->SetBranchStatus(branchName,0);
+        break;
+      }
+    }
+
+    // Check triggers
+    for(unsigned int j=0;j<triggers.size();j++){
+      if(branchName==triggers[j]){
+        triggersInD3PD.push_back(triggers[j]);
+      }
+    }
+
+    // Check mc branches
+    if ( branchName.BeginsWith( "mc_") ){
+      hasMC=true;
+    }
+
+  }
+
+  // Get trigger tree
+  TChain* chTri = new TChain(treeName+"Meta/TrigConfTree");
+  for(unsigned int i=0;i<inputs.size();i++){
+    chTri->Add(inputs[i]);
+  }
+  if(chTri->LoadTree(0)<0){
+    delete chTri;chTri=0;
+  }
+  if(chTri==0)cout << "ExoticsMultiJetSkim: trigger tree (" << treeName+"Meta/TrigConfTree" << " is not available!" << endl;
+
+  // Get cut flow tree
+  TChain* chCutFlow = new TChain(treeName+"Meta/CutFlowTree");
+  for(unsigned int i=0;i<inputs.size();i++){
+    chCutFlow->Add(inputs[i]);
+  }
+  if(chCutFlow->LoadTree(0)<0){
+    delete chCutFlow;chCutFlow=0;
+  }
+  if(chCutFlow==0)cout << "ExoticsMultiJetSkim: cutflow tree (" << treeName+"Meta/CutFlowTree" << " is not available!" << endl;
+
+  // Event counter
+  vector<TString> cutName;
+  cutName.push_back("preD3PD");
+  cutName.push_back("postD3PD");
+  cutName.push_back("postSkim");
+  int evnum[]={0,0,0};
+  double weight[]={0,0,0};
+
+  // Branches for event count/event selection, etc...
+  float mc_event_weight;
+  if(hasMC)ch->SetBranchAddress("mc_event_weight", &mc_event_weight);
+
+  Bool_t * triggerBranches = new Bool_t[triggersInD3PD.size()];
+  for(unsigned int i=0;i<triggersInD3PD.size();i++){
+    ch->SetBranchAddress(triggersInD3PD[i], &(triggerBranches[i]));
+  }
+
+  int mc_n;
+  vector<int>* mc_barcode=0;
+  vector<float>* mc_pt=0;
+  vector<float>* mc_eta=0;
+  vector<float>* mc_phi=0;
+  vector<float>* mc_m=0;
+  vector<int>* mc_pdgId=0;
+  vector<int>* mc_status=0;
+  vector<vector<int> > *mc_parents=0;
+
+  Int_t           mcevt_n;
+  vector<int>     *mcevt_signal_process_id=0;
+  vector<int>     *mcevt_event_number=0;
+  vector<double>  *mcevt_event_scale=0;
+  vector<double>  *mcevt_alphaQCD=0;
+  vector<double>  *mcevt_alphaQED=0;
+  vector<int>     *mcevt_pdf_id1=0;
+  vector<int>     *mcevt_pdf_id2=0;
+  vector<double>  *mcevt_pdf_x1=0;
+  vector<double>  *mcevt_pdf_x2=0;
+  vector<double>  *mcevt_pdf_scale=0;
+  vector<double>  *mcevt_pdf1=0;
+  vector<double>  *mcevt_pdf2=0;
+  vector<vector<double> > *mcevt_weight=0;
+  vector<int>     *mcevt_nparticle=0;
+  vector<short>   *mcevt_pileUpType=0;
+ if(hasMC && doMC && (doMCSlim||doBH)){
+    ch->SetBranchAddress("mc_n",&mc_n);
+    ch->SetBranchAddress("mc_barcode",&mc_barcode);
+    ch->SetBranchAddress("mc_pt",&mc_pt);
+    ch->SetBranchAddress("mc_eta",&mc_eta);
+    ch->SetBranchAddress("mc_phi",&mc_phi);
+    ch->SetBranchAddress("mc_m",&mc_m);
+    ch->SetBranchAddress("mc_pdgId",&mc_pdgId);
+    ch->SetBranchAddress("mc_status",&mc_status);
+    ch->SetBranchAddress("mc_parents",&mc_parents);
+
+    ch->SetBranchAddress("mcevt_n",&mcevt_n);
+    ch->SetBranchAddress("mcevt_signal_process_id",&mcevt_signal_process_id);
+    ch->SetBranchAddress("mcevt_event_number",&mcevt_event_number);
+    ch->SetBranchAddress("mcevt_event_scale",&mcevt_event_scale);
+    ch->SetBranchAddress("mcevt_alphaQCD",&mcevt_alphaQCD);
+    ch->SetBranchAddress("mcevt_alphaQED",&mcevt_alphaQED);
+    ch->SetBranchAddress("mcevt_pdf_id1",&mcevt_pdf_id1);
+    ch->SetBranchAddress("mcevt_pdf_id2",&mcevt_pdf_id2);
+    ch->SetBranchAddress("mcevt_pdf_x1",&mcevt_pdf_x1);
+    ch->SetBranchAddress("mcevt_pdf_x2",&mcevt_pdf_x2);
+    ch->SetBranchAddress("mcevt_pdf_scale",&mcevt_pdf_scale);
+    ch->SetBranchAddress("mcevt_pdf1",&mcevt_pdf1);
+    ch->SetBranchAddress("mcevt_pdf2",&mcevt_pdf2);
+    ch->SetBranchAddress("mcevt_weight",&mcevt_weight);
+    ch->SetBranchAddress("mcevt_nparticle",&mcevt_nparticle);
+    ch->SetBranchAddress("mcevt_pileUpType",&mcevt_pileUpType);
+  }
+
+  // Tmp branches for output
+  int mc_n_new=0;
+  vector<int>* mc_barcode_new=0;
+  vector<float>* mc_pt_new=0;
+  vector<float>* mc_eta_new=0;
+  vector<float>* mc_phi_new=0;
+  vector<float>* mc_m_new=0;
+  vector<int>* mc_pdgId_new=0;
+  vector<int>* mc_status_new=0;
+  vector<vector<int> > *mc_parents_new=0;
+
+  if(doMCSlim){
+    mc_barcode_new=new vector<int>;
+    mc_pt_new=new vector<float>;
+    mc_eta_new=new vector<float>;
+    mc_phi_new=new vector<float>;
+    mc_m_new=new vector<float>;
+    mc_pdgId_new=new vector<int>;
+    mc_status_new=new vector<int>;
+    mc_parents_new=new vector<vector<int> >;
+  }
+
+  // Write to new file
+  TFile* outFile = new TFile(outputFile, "RECREATE");
+
+  // New tree
+  TTree* ch_new = ch->CloneTree(0);
+
+  // New branches for output
+  double bh_pt;
+  double bh_eta;
+  double bh_phi;
+  double bh_m;
+  if(hasMC&&doMC&&doBH){
+    ch_new->Branch("bh_pt",&bh_pt,"bh_pt/D");
+    ch_new->Branch("bh_eta",&bh_eta,"bh_eta/D");
+    ch_new->Branch("bh_phi",&bh_phi,"bh_phi/D");
+    ch_new->Branch("bh_m",&bh_m,"bh_m/D");
+  }
+
+
+  // Event selection
+  int nEntries = ch->GetEntries();
+
+  for( int i=0;i< nEntries;i++){
+    // Skip events
+    if(i<skipEvents)continue;
+
+    // Get new entry
+    ch->GetEntry(i);
+    evnum[1]+=1;
+
+    // Get weight
+    double w;
+    if(hasMC){
+      w=mc_event_weight;
+    }else{
+      w=1;
+    }
+    weight[1]+=w;
+
+    // Trigger skimming
+    if((doMCSkim||(!hasMC)) && triggersInD3PD.size()>0){
+      bool isPassed=false;
+      for(unsigned int itrig=0;itrig<triggersInD3PD.size();itrig++){
+        if(triggerBranches[itrig]){
+          isPassed=true;
+          break;
+        }
+      }
+      if(!isPassed)continue;
+    }
+
+    // MC
+    if(hasMC && doMC && (doMCSlim||doBH)){
+      map<int,int> barcodeIndex;
+      for (int j=0;j<mc_n;j++){
+        barcodeIndex.insert(pair<int, int>((*mc_barcode)[i],i));
+      }
+      if(doBH){
+        bh_pt=0;
+        bh_eta=0;
+        bh_phi=0;
+        bh_m=0;
+      }
+      if(doMCSlim){
+        mc_n_new=0;
+        mc_barcode_new->clear();
+        mc_pt_new->clear();
+        mc_eta_new->clear();
+        mc_phi_new->clear();
+        mc_m_new->clear();
+        mc_pdgId_new->clear();
+        mc_status_new->clear();
+        mc_parents_new->clear();
+      }
+      TLorentzVector p(0,0,0,0);
+      TLorentzVector pBH(0,0,0,0);
+      for (int imc=0;imc<mc_n;imc++){
+        if(
+           // choose stable particle
+           ((*mc_status)[imc]==1&&(*mc_barcode)[imc]<200000)
+           ||
+           // choose hard process decay, only valid for pythia8
+           ((*mc_parents)[imc].size()==2 && 
+           (((*mc_parents)[imc][0]==3&&(*mc_parents)[imc][1]==4)||
+            ((*mc_parents)[imc][1]==3&&(*mc_parents)[imc][0]==4)))
+        ){
+          p.SetPtEtaPhiM((*mc_pt)[imc],(*mc_eta)[imc],(*mc_phi)[imc],(*mc_m)[imc]);
+          if(doBH&&(*mc_status)[imc]!=1){
+            pBH+=p;
+          }
+          if(doMCSlim){
+            mc_n_new++;
+            mc_barcode_new->push_back((*mc_barcode)[imc]);
+            mc_pt_new->push_back((*mc_pt)[imc]);
+            mc_eta_new->push_back((*mc_eta)[imc]);
+            mc_phi_new->push_back((*mc_phi)[imc]);
+            mc_m_new->push_back((*mc_m)[imc]);
+            mc_pdgId_new->push_back((*mc_pdgId)[imc]);
+            mc_status_new->push_back((*mc_status)[imc]);
+            mc_parents_new->push_back((*mc_parents)[imc]);
+          }
+        }
+      }
+      if(doBH){
+        bh_pt=pBH.Pt();
+        bh_m=pBH.M();
+        if(pBH.Pt()!=0){
+          bh_eta=pBH.Eta();
+          bh_phi=pBH.Phi();
+        }else{
+          bh_eta=0.;
+          bh_phi=0.;
+        }
+      }
+      if(doMCSlim){
+        mc_n=mc_n_new;
+
+        mc_barcode->clear();
+        mc_pt->clear();
+        mc_eta->clear();
+        mc_phi->clear();
+        mc_m->clear();
+        mc_pdgId->clear();
+        mc_status->clear();
+        mc_parents->clear();
+
+        for(unsigned int imcnew=0;imcnew<mc_barcode_new->size();imcnew++)mc_barcode->push_back((*mc_barcode_new)[imcnew]);
+        for(unsigned int imcnew=0;imcnew<mc_pt_new->size();imcnew++)mc_pt->push_back((*mc_pt_new)[imcnew]);
+        for(unsigned int imcnew=0;imcnew<mc_eta_new->size();imcnew++)mc_eta->push_back((*mc_eta_new)[imcnew]);
+        for(unsigned int imcnew=0;imcnew<mc_phi_new->size();imcnew++)mc_phi->push_back((*mc_phi_new)[imcnew]);
+        for(unsigned int imcnew=0;imcnew<mc_m_new->size();imcnew++)mc_m->push_back((*mc_m_new)[imcnew]);
+        for(unsigned int imcnew=0;imcnew<mc_pdgId_new->size();imcnew++)mc_pdgId->push_back((*mc_pdgId_new)[imcnew]);
+        for(unsigned int imcnew=0;imcnew<mc_status_new->size();imcnew++)mc_status->push_back((*mc_status_new)[imcnew]);
+        for(unsigned int imcnew=0;imcnew<mc_parents_new->size();imcnew++)mc_parents->push_back((*mc_parents_new)[imcnew]);
+
+        if(mcevt_n>0){
+          mcevt_n=1;
+          vector<int>::iterator it_mcevt_signal_process_id = mcevt_signal_process_id->begin();it_mcevt_signal_process_id++;mcevt_signal_process_id->erase(it_mcevt_signal_process_id,mcevt_signal_process_id->end());
+          vector<int>::iterator it_mcevt_event_number=mcevt_event_number->begin();it_mcevt_event_number++;mcevt_event_number->erase(it_mcevt_event_number,mcevt_event_number->end());
+          vector<double>::iterator it_mcevt_event_scale=mcevt_event_scale->begin();it_mcevt_event_scale++;mcevt_event_scale->erase(it_mcevt_event_scale,mcevt_event_scale->end());
+          vector<double>::iterator it_mcevt_alphaQCD=mcevt_alphaQCD->begin();it_mcevt_alphaQCD++;mcevt_alphaQCD->erase(it_mcevt_alphaQCD,mcevt_alphaQCD->end());
+          vector<double>::iterator it_mcevt_alphaQED=mcevt_alphaQED->begin();it_mcevt_alphaQED++;mcevt_alphaQED->erase(it_mcevt_alphaQED,mcevt_alphaQED->end());
+          vector<int>::iterator it_mcevt_pdf_id1=mcevt_pdf_id1->begin();it_mcevt_pdf_id1++;mcevt_pdf_id1->erase(it_mcevt_pdf_id1,mcevt_pdf_id1->end());
+          vector<int>::iterator it_mcevt_pdf_id2=mcevt_pdf_id2->begin();it_mcevt_pdf_id2++;mcevt_pdf_id2->erase(it_mcevt_pdf_id2,mcevt_pdf_id2->end());
+          vector<double>::iterator it_mcevt_pdf_x1=mcevt_pdf_x1->begin();it_mcevt_pdf_x1++;mcevt_pdf_x1->erase(it_mcevt_pdf_x1,mcevt_pdf_x1->end());
+          vector<double>::iterator it_mcevt_pdf_x2=mcevt_pdf_x2->begin();it_mcevt_pdf_x2++;mcevt_pdf_x2->erase(it_mcevt_pdf_x2,mcevt_pdf_x2->end());
+          vector<double>::iterator it_mcevt_pdf_scale=mcevt_pdf_scale->begin();it_mcevt_pdf_scale++;mcevt_pdf_scale->erase(it_mcevt_pdf_scale,mcevt_pdf_scale->end());
+          vector<double>::iterator it_mcevt_pdf1=mcevt_pdf1->begin();it_mcevt_pdf1++;mcevt_pdf1->erase(it_mcevt_pdf1,mcevt_pdf1->end());
+          vector<double>::iterator it_mcevt_pdf2=mcevt_pdf2->begin();it_mcevt_pdf2++;mcevt_pdf2->erase(it_mcevt_pdf2,mcevt_pdf2->end());
+          vector<vector<double> >::iterator it_mcevt_weight=mcevt_weight->begin();it_mcevt_weight++;mcevt_weight->erase(it_mcevt_weight,mcevt_weight->end());
+          vector<int>::iterator it_mcevt_nparticle=mcevt_nparticle->begin();it_mcevt_nparticle++;mcevt_nparticle->erase(it_mcevt_nparticle,mcevt_nparticle->end());
+          vector<short>::iterator it_mcevt_pileUpType=mcevt_pileUpType->begin();it_mcevt_pileUpType++;mcevt_pileUpType->erase(it_mcevt_pileUpType,mcevt_pileUpType->end());
+        }
+      }
+    }
+
+
+    // Finalize
+    evnum[2]+=1;
+    weight[2]+=w;
+    ch_new->Fill();
+
+    // Max event check
+    if(evnum[2]==maxEvents)break;
+
+  }
+
+  outFile->cd();
+  ch_new->Write();
+  //cout << "nEntriesForNewFile = "<< nEntriesNew << endl;
+
+  // Check cut flow at D3PD level
+  if(chCutFlow!=0 && chCutFlow->GetEntries() != 0){
+    std::vector<unsigned long> *nAcceptedEvents = new std::vector<unsigned long>;
+    std::vector<double> *nWeightedAcceptedEvents = new std::vector<double>;
+    std::vector<std::string> *name = new std::vector<std::string>;
+    chCutFlow->SetBranchAddress("nAcceptedEvents", &nAcceptedEvents);
+    chCutFlow->SetBranchAddress("nWeightedAcceptedEvents", &nWeightedAcceptedEvents);
+    chCutFlow->SetBranchAddress("name", &name);
+    for(int i=0;i<chCutFlow->GetEntries();i++){
+      chCutFlow->GetEntry(i);
+      for(unsigned int j=0;j<name->size();j++){
+        if((*name)[j] == "AllExecutedEvents"){
+          evnum[0]+=(*nAcceptedEvents)[j];
+          weight[0]+=(*nWeightedAcceptedEvents)[j];
+          break;
+        }
+      }
+    }
+
+  }else{
+    evnum[0]=evnum[1];
+    weight[0]=weight[1];
+  }
+
+  // Copy meta data
+  outFile->cd();
+  TDirectory* newdir = outFile->mkdir( treeName+"Meta", treeName+"Meta" );
+  newdir->cd();
+  TChain* chTri_new=0;
+  if(chTri != 0){
+    chTri_new = (TChain*)chTri->CloneTree();
+    chTri_new->Write();
+  }
+  TChain* chCutFlow_new=0;
+  if(chCutFlow != 0){
+    chCutFlow_new = (TChain*)chCutFlow->CloneTree();
+    chCutFlow_new->Write();
+  }
+
+  // Cut flow histgrams
+  outFile->cd();
+  TH1F* h_evnum = new TH1F("evnum","evnum",cutName.size(),0,cutName.size());
+  TH1F* h_weight = new TH1F("weight","weight",cutName.size(),0,cutName.size());
+  cout << "" << endl;
+  cout << "******Cut Flow for " << outputFile << "******" << endl;
+  cout << setw(10) << "CutName" << setw(10) << "Events" << setw(12) << "Weights" << endl;
+  for(unsigned int i=0;i<cutName.size();i++){
+    cout << setw(10) << cutName[i] << setw(10) << evnum[i] << setw(12) << weight[i] << endl;
+    h_evnum->GetXaxis()->SetBinLabel(i+1,cutName[i]);
+    h_evnum->SetBinContent(i+1,evnum[i]);
+    h_weight->GetXaxis()->SetBinLabel(i+1,cutName[i]);
+    h_weight->SetBinContent(i+1,weight[i]);
+    cout << "*************************" << endl;
+    cout << "" << endl;
+  }
+  h_evnum->Write();
+  h_weight->Write();
+
+
+  // Close file
+  delete outFile;
+
+  // Delete original chains
+  if(ch!=0)delete ch;
+  if(chTri!=0)delete chTri;
+  if(chCutFlow!=0)delete chCutFlow;
+
+  return 0;
+}