Skip to content

Commit 0f0e207

Browse files
committed
HT module from Sal Rappoccio
1 parent 5205fb0 commit 0f0e207

File tree

3 files changed

+92
-0
lines changed

3 files changed

+92
-0
lines changed

interface/htProducerCppWorker.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#ifndef PhysicsTools_NanoAODTools_htProducerCppWorker_h
2+
#define PhysicsTools_NanoAODTools_htProducerCppWorker_h
3+
4+
#include <utility>
5+
#include <TTreeReaderValue.h>
6+
#include <TTreeReaderArray.h>
7+
#include "DataFormats/Math/interface/LorentzVector.h"
8+
9+
class htProducerCppWorker {
10+
11+
public:
12+
13+
htProducerCppWorker(){}
14+
15+
void setJets(TTreeReaderValue<unsigned> *nJet_, TTreeReaderArray<float> *Jet_pt_){
16+
nJet = nJet_; Jet_pt = Jet_pt_;
17+
}
18+
19+
float getHT();
20+
21+
private:
22+
TTreeReaderValue<unsigned> *nJet = nullptr;
23+
TTreeReaderArray<float> *Jet_pt = nullptr;
24+
25+
};
26+
27+
#endif
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import ROOT
2+
import os
3+
ROOT.PyConfig.IgnoreCommandLineOptions = True
4+
5+
from PhysicsTools.NanoAODTools.postprocessing.framework.eventloop import Module
6+
7+
class htProducerCpp(Module): # HT producer, unclean jets only (no lepton overlap cleaning, no jet selection)
8+
def __init__(self):
9+
if "/htProducerCppWorker_cc.so" not in ROOT.gSystem.GetLibraries():
10+
print "Load C++ htProducerCppWorker worker module"
11+
base = os.getenv("NANOAODTOOLS_BASE")
12+
if base:
13+
ROOT.gROOT.ProcessLine(".L %s/src/htProducerCppWorker.cc+O"%base)
14+
else:
15+
base = "%s/src/PhysicsTools/NanoAODTools"%os.getenv("CMSSW_BASE")
16+
ROOT.gSystem.Load("libPhysicsToolsNanoAODTools.so")
17+
ROOT.gROOT.ProcessLine(".L %s/interface/htProducerCppWorker.h"%base)
18+
self.worker = ROOT.htProducerCppWorker()
19+
pass
20+
def beginJob(self):
21+
pass
22+
def endJob(self):
23+
pass
24+
def beginFile(self, inputFile, outputFile, inputTree, wrappedOutputTree):
25+
self.initReaders(inputTree) # initReaders must be called in beginFile
26+
self.out = wrappedOutputTree
27+
self.out.branch("HT_pt", "F");
28+
def endFile(self, inputFile, outputFile, inputTree, wrappedOutputTree):
29+
pass
30+
31+
def initReaders(self,tree): # this function gets the pointers to Value and ArrayReaders and sets them in the C++ worker class
32+
self.nJet = tree.valueReader("nJet")
33+
self.Jet_pt = tree.arrayReader("Jet_pt")
34+
self.worker.setJets(self.nJet,self.Jet_pt)
35+
self._ttreereaderversion = tree._ttreereaderversion # self._ttreereaderversion must be set AFTER all calls to tree.valueReader or tree.arrayReader
36+
37+
def analyze(self, event):
38+
"""process event, return True (go to next module) or False (fail, go to next event)"""
39+
40+
if event._tree._ttreereaderversion > self._ttreereaderversion: # do this check at every event, as other modules might have read further branches
41+
self.initReaders(event._tree)
42+
# do NOT access other branches in python between the check/call to initReaders and the call to C++ worker code
43+
output = self.worker.getHT()
44+
45+
self.out.fillBranch("HT_pt", output)
46+
return True
47+
48+
49+
# define modules using the syntax 'name = lambda : constructor' to avoid having them loaded when not needed
50+
51+
ht = lambda : htProducerCpp()

src/htProducerCppWorker.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include "../interface/htProducerCppWorker.h"
2+
3+
float htProducerCppWorker::getHT(){
4+
5+
float ht(0.0);
6+
7+
unsigned n = (*nJet).Get()[0];
8+
for (unsigned i=0; i<n; i++){
9+
ht += (*Jet_pt)[i];
10+
}
11+
12+
return ht;
13+
14+
};

0 commit comments

Comments
 (0)