1 |
#ifndef JETSUBSTRUCTURETOOLS_H
|
2 |
#define JETSUBSTRUCTURETOOLS_H
|
3 |
|
4 |
|
5 |
#include "FWCore/ParameterSet/interface/ParameterSet.h"
|
6 |
#include "FWCore/Framework/interface/Frameworkfwd.h"
|
7 |
#include "FWCore/Framework/interface/EDAnalyzer.h"
|
8 |
#include "FWCore/Framework/interface/Event.h"
|
9 |
|
10 |
#include "VHbbAnalysis/VHbbDataFormats/interface/VHbbEventAuxInfo.h"
|
11 |
#include "VHbbAnalysis/VHbbDataFormats/interface/VHbbEvent.h"
|
12 |
|
13 |
#include <fastjet/ClusterSequence.hh>
|
14 |
#include <fastjet/GhostedAreaSpec.hh>
|
15 |
#include <fastjet/ClusterSequenceArea.hh>
|
16 |
#include "fastjet/tools/Filter.hh"
|
17 |
#include "fastjet/tools/Pruner.hh"
|
18 |
#include "fastjet/tools/MassDropTagger.hh"
|
19 |
#include "fastjet/GhostedAreaSpec.hh"
|
20 |
|
21 |
#include "VHbbAnalysis/VHbbDataFormats/interface/Nsubjettiness.h"
|
22 |
|
23 |
#include <iostream>
|
24 |
|
25 |
class JetSubstructureTools {
|
26 |
|
27 |
// member functions
|
28 |
public:
|
29 |
|
30 |
// constructor
|
31 |
JetSubstructureTools( std::vector<float> c_px, std::vector<float> c_py, std::vector<float> c_pz, std::vector<float> c_e, std::vector<float> c_pdgId );
|
32 |
~JetSubstructureTools(){}
|
33 |
|
34 |
fastjet::PseudoJet getPrunedJet(){ return prunedJet_; }
|
35 |
fastjet::PseudoJet getTrimmedJet(){ return trimmedJet_; }
|
36 |
fastjet::PseudoJet getFilteredJet(){ return filteredJet_; }
|
37 |
float getPrunedJetArea(){ return prunedJetArea_; }
|
38 |
float getTrimmedJetArea(){ return trimmedJetArea_; }
|
39 |
float getFilteredJetArea(){ return filteredJetArea_; }
|
40 |
|
41 |
float getTau1(){ return tau1_; }
|
42 |
float getTau2(){ return tau2_; }
|
43 |
float getTau3(){ return tau3_; }
|
44 |
float getTau4(){ return tau4_; }
|
45 |
|
46 |
fastjet::PseudoJet getPrunedSubJet(int i){
|
47 |
if (i == 0) return prunedSubJet1_;
|
48 |
else if (i == 1) return prunedSubJet2_;
|
49 |
else throw cms::Exception("JetSubstructureTools") << "Too many subjets..." << std::endl;
|
50 |
}
|
51 |
|
52 |
// data members
|
53 |
public:
|
54 |
|
55 |
std::vector<fastjet::PseudoJet> FJconstituents_;
|
56 |
std::vector<float> c_pdgIds_;
|
57 |
|
58 |
fastjet::PseudoJet prunedJet_;
|
59 |
fastjet::PseudoJet trimmedJet_;
|
60 |
fastjet::PseudoJet filteredJet_;
|
61 |
|
62 |
float prunedJetMass_;
|
63 |
float trimmedJetMass_;
|
64 |
float filteredJetMass_;
|
65 |
float ungroomedJetMass_;
|
66 |
|
67 |
float prunedJetArea_;
|
68 |
float trimmedJetArea_;
|
69 |
float filteredJetArea_;
|
70 |
|
71 |
float tau1_;
|
72 |
float tau2_;
|
73 |
float tau3_;
|
74 |
float tau4_;
|
75 |
|
76 |
float rcore01_;
|
77 |
float rcore02_;
|
78 |
float rcore03_;
|
79 |
float rcore04_;
|
80 |
float rcore05_;
|
81 |
float rcore06_;
|
82 |
float rcore07_;
|
83 |
float rcore08_;
|
84 |
float rcore09_;
|
85 |
float rcore10_;
|
86 |
float rcore11_;
|
87 |
float rcore12_;
|
88 |
|
89 |
fastjet::PseudoJet prunedSubJet1_;
|
90 |
fastjet::PseudoJet prunedSubJet2_;
|
91 |
|
92 |
float QJetVolatility_;
|
93 |
};
|
94 |
|
95 |
// -------------------------------------------
|
96 |
// -------------------------------------------
|
97 |
// -------------------------------------------
|
98 |
// -------------------------------------------
|
99 |
|
100 |
// constructor
|
101 |
JetSubstructureTools::JetSubstructureTools( std::vector<float> c_px, std::vector<float> c_py, std::vector<float> c_pz, std::vector<float> c_e, std::vector<float> c_pdgId )
|
102 |
{
|
103 |
|
104 |
std::cout << "hey y'all!" << std::endl;
|
105 |
|
106 |
// check that they are all the same size
|
107 |
if ((c_px.size() == c_py.size())&&(c_py.size() == c_pz.size())&&(c_pz.size() == c_e.size())&&(c_e.size() == c_pdgId.size())){
|
108 |
for (unsigned int i = 0; i < c_px.size(); i++){
|
109 |
|
110 |
FJconstituents_.push_back( fastjet::PseudoJet( c_px[i], c_py[i], c_pz[i], c_e[i] ) );
|
111 |
c_pdgIds_.push_back( c_pdgId[i] );
|
112 |
|
113 |
}
|
114 |
}
|
115 |
else throw cms::Exception("JetSubstructureTools") << "Constituent size mismatch..." << std::endl;
|
116 |
|
117 |
// -------------------------------------------
|
118 |
// recluster on the fly....
|
119 |
double mJetRadius = 1.2;
|
120 |
fastjet::JetDefinition jetDef(fastjet::cambridge_algorithm, mJetRadius);
|
121 |
|
122 |
int activeAreaRepeats = 1;
|
123 |
double ghostArea = 0.01;
|
124 |
double ghostEtaMax = 5.0;
|
125 |
|
126 |
fastjet::GhostedAreaSpec fjActiveArea(ghostEtaMax,activeAreaRepeats,ghostArea);
|
127 |
fjActiveArea.set_fj2_placement(true);
|
128 |
fastjet::AreaDefinition fjAreaDefinition( fastjet::active_area_explicit_ghosts, fjActiveArea );
|
129 |
|
130 |
fastjet::ClusterSequenceArea thisClustering(FJconstituents_, jetDef, fjAreaDefinition);
|
131 |
std::vector<fastjet::PseudoJet> out_jets = sorted_by_pt(thisClustering.inclusive_jets(50.0));
|
132 |
|
133 |
fastjet::ClusterSequence thisClustering_basic(FJconstituents_, jetDef);
|
134 |
std::vector<fastjet::PseudoJet> out_jets_basic = sorted_by_pt(thisClustering_basic.inclusive_jets(50.0));
|
135 |
|
136 |
// -------------------------------------------
|
137 |
// define groomers
|
138 |
fastjet::Filter trimmer( fastjet::Filter(fastjet::JetDefinition(fastjet::kt_algorithm, 0.2), fastjet::SelectorPtFractionMin(0.03)));
|
139 |
fastjet::Filter filter( fastjet::Filter(fastjet::JetDefinition(fastjet::cambridge_algorithm, 0.3), fastjet::SelectorNHardest(3)));
|
140 |
fastjet::Pruner pruner(fastjet::cambridge_algorithm, 0.1, 0.5);
|
141 |
|
142 |
std::vector<fastjet::Transformer const *> transformers;
|
143 |
transformers.push_back(&trimmer);
|
144 |
transformers.push_back(&filter);
|
145 |
transformers.push_back(&pruner);
|
146 |
|
147 |
// define n-subjettiness
|
148 |
float mNsubjettinessKappa = 1.;
|
149 |
NsubParameters paraNsub = NsubParameters(mNsubjettinessKappa, mJetRadius);
|
150 |
Nsubjettiness routine(nsub_kt_axes, paraNsub);
|
151 |
|
152 |
|
153 |
ungroomedJetMass_ = out_jets.at(0).m();
|
154 |
// -------------------------------------------
|
155 |
// compute pruning, trimming, filtering -------------
|
156 |
int transctr = 0;
|
157 |
for ( std::vector<fastjet::Transformer const *>::const_iterator
|
158 |
itransf = transformers.begin(), itransfEnd = transformers.end();
|
159 |
itransf != itransfEnd; ++itransf ) {
|
160 |
|
161 |
fastjet::PseudoJet transformedJet = out_jets.at(0);
|
162 |
transformedJet = (**itransf)(transformedJet);
|
163 |
|
164 |
if (transctr == 0){ // trimmed
|
165 |
trimmedJet_ = transformedJet;
|
166 |
trimmedJetMass_ = transformedJet.m();
|
167 |
trimmedJetArea_ = transformedJet.area();
|
168 |
}
|
169 |
else if (transctr == 1){ // filtered
|
170 |
filteredJet_ = transformedJet;
|
171 |
filteredJetMass_ = transformedJet.m();
|
172 |
filteredJetArea_ = transformedJet.area();
|
173 |
}
|
174 |
else if (transctr == 2){ // pruned
|
175 |
prunedJet_ = transformedJet;
|
176 |
prunedJetMass_ = transformedJet.m();
|
177 |
prunedJetArea_ = transformedJet.area();
|
178 |
|
179 |
//decompose into requested number of subjets:
|
180 |
if (transformedJet.constituents().size() > 1){
|
181 |
|
182 |
int nsubjetstokeep = 2;
|
183 |
std::vector<fastjet::PseudoJet> prunedSubjets = transformedJet.associated_cluster_sequence()->exclusive_subjets(transformedJet,nsubjetstokeep);
|
184 |
|
185 |
prunedSubJet1_ = prunedSubjets.at(0);
|
186 |
prunedSubJet2_ = prunedSubjets.at(1);
|
187 |
|
188 |
}
|
189 |
}
|
190 |
else{ std::cout << "error in number of transformers" << std::endl;}
|
191 |
transctr++;
|
192 |
}
|
193 |
|
194 |
// -------------------------------------------
|
195 |
// compute n-subjettiness -------------
|
196 |
tau1_ = routine.getTau(1, out_jets.at(0).constituents());
|
197 |
tau2_ = routine.getTau(2, out_jets.at(0).constituents());
|
198 |
tau3_ = routine.getTau(3, out_jets.at(0).constituents());
|
199 |
tau4_ = routine.getTau(4, out_jets.at(0).constituents());
|
200 |
|
201 |
}
|
202 |
// -------------------------------------------
|
203 |
// -------------------------------------------
|
204 |
// -------------------------------------------
|
205 |
// -------------------------------------------
|
206 |
|
207 |
|
208 |
#endif
|
209 |
|
210 |
|
211 |
|
212 |
|
213 |
|
214 |
|