1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
// -*- C++ -*-
//
// Package: ConeIsolation
// Class: ConeIsolation
//
/**\class ConeIsolation ConeIsolation.cc RecoBTag/ConeIsolation/src/ConeIsolation.cc
Description: <one line class summary>
Implementation:
<Notes on implementation>
*/
//
// Original Author: Simone Gennai
// Created: Thu Apr 6 09:56:23 CEST 2006
//
//
// system include files
#include <memory>
// user include files
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "ConeIsolation.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/Framework/interface/makeRefToBaseProdFrom.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "DataFormats/BTauReco/interface/JetTag.h"
#include "DataFormats/TrackReco/interface/Track.h"
#include "DataFormats/BTauReco/interface/IsolatedTauTagInfo.h"
#include "DataFormats/VertexReco/interface/Vertex.h"
#include "DataFormats/VertexReco/interface/VertexFwd.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/ESHandle.h"
#include "DataFormats/BeamSpot/interface/BeamSpot.h"
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
using namespace reco;
using namespace edm;
using namespace std;
//
// constructors and destructor
//
ConeIsolation::ConeIsolation(const edm::ParameterSet& iConfig) : m_algo{iConfig} {
jetTrackTag = iConfig.getParameter<InputTag>("JetTrackSrc");
jetTrackToken = consumes<reco::JetTracksAssociationCollection>(jetTrackTag);
vertexTag = iConfig.getParameter<InputTag>("vertexSrc");
vertexToken = consumes<reco::VertexCollection>(vertexTag);
beamSpotTag = iConfig.getParameter<edm::InputTag>("BeamSpotProducer");
beamSpotToken = consumes<reco::BeamSpot>(beamSpotTag);
usingBeamSpot = iConfig.getParameter<bool>("useBeamSpot"); //If false the OfflinePrimaryVertex will be used.
produces<reco::JetTagCollection>();
produces<reco::IsolatedTauTagInfoCollection>();
}
//
// member functions
//
void ConeIsolation::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
edm::ParameterSetDescription desc;
desc.add<edm::InputTag>("JetTrackSrc", edm::InputTag("ic5JetTracksAssociatorAtVertex"));
desc.add<edm::InputTag>("vertexSrc", edm::InputTag("offlinePrimaryVertices"));
desc.add<edm::InputTag>("BeamSpotProducer", edm::InputTag("offlineBeamSpot"));
desc.add<bool>("useBeamSpot", false);
ConeIsolationAlgorithm::fillDescription(desc);
descriptions.add("coneIsolationTauJetTags", desc);
}
// ------------ method called to produce the data ------------
void ConeIsolation::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
using namespace edm;
//Get jets with tracks
Handle<reco::JetTracksAssociationCollection> jetTracksAssociation;
iEvent.getByToken(jetTrackToken, jetTracksAssociation);
std::unique_ptr<reco::JetTagCollection> tagCollection;
std::unique_ptr<reco::IsolatedTauTagInfoCollection> extCollection(new reco::IsolatedTauTagInfoCollection());
if (not jetTracksAssociation->empty()) {
RefToBaseProd<reco::Jet> prod(edm::makeRefToBaseProdFrom(jetTracksAssociation->begin()->first, iEvent));
tagCollection = std::make_unique<reco::JetTagCollection>(prod);
} else {
tagCollection = std::make_unique<reco::JetTagCollection>();
}
Vertex::Error e;
e(0, 0) = 1;
e(1, 1) = 1;
e(2, 2) = 1;
Vertex::Point p(0, 0, -1000);
Vertex myPVtmp(p, e); //Fake vertex to be used in case no vertex is found
Vertex myPV;
//Get pixel vertices
Handle<reco::VertexCollection> vertices;
iEvent.getByToken(vertexToken, vertices);
const reco::VertexCollection vertCollection = *(vertices.product());
//Check if there is the PV!!!!
if (vertCollection.begin() != vertCollection.end())
myPVtmp = *(vertCollection.begin());
//In case the beam spot is used, the Z of the vertex still comes from the PV, while the (x,y) is taken from the beamspot
reco::BeamSpot vertexBeamSpot;
edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
if (usingBeamSpot) {
//Create a new vertex with the information on x0 and Y0 from the beamspot, to be used in HLT.
iEvent.getByToken(beamSpotToken, recoBeamSpotHandle);
vertexBeamSpot = *recoBeamSpotHandle;
Vertex::Point bspoint(vertexBeamSpot.x0(), vertexBeamSpot.y0(), myPVtmp.z());
Vertex combinedVertex = Vertex(bspoint, myPVtmp.error(), myPVtmp.chi2(), myPVtmp.ndof(), myPVtmp.tracksSize());
myPV = combinedVertex;
} else {
myPV = myPVtmp;
}
for (unsigned int i = 0; i < jetTracksAssociation->size(); ++i) {
pair<float, IsolatedTauTagInfo> myPair =
m_algo.tag(edm::Ref<JetTracksAssociationCollection>(jetTracksAssociation, i), myPV);
tagCollection->setValue(i, myPair.first);
extCollection->push_back(myPair.second);
}
iEvent.put(std::move(extCollection));
iEvent.put(std::move(tagCollection));
}
// declare this class as a framework plugin
//DEFINE_FWK_MODULE(ConeIsolation);
|