23 #ifndef __CMSTOPTAGGER_HH__ 24 #define __CMSTOPTAGGER_HH__ 26 #include <fastjet/tools/JHTopTagger.hh> 27 #include <fastjet/CompositeJetStructure.hh> 28 #include <fastjet/LimitedWarning.hh> 29 #include <fastjet/Error.hh> 30 #include <fastjet/JetDefinition.hh> 31 #include <fastjet/ClusterSequence.hh> 36 FASTJET_BEGIN_NAMESPACE
75 PseudoJet
result(
const PseudoJet &
jet)
const override;
82 std::vector<PseudoJet>
_split_once(
const PseudoJet & jet_to_split,
83 const PseudoJet & reference_jet)
const;
87 void _find_min_mass(
const std::vector<PseudoJet>& subjets,
int&
i,
int& j)
const;
98 const JetDefinition::Recombiner *recombiner =
nullptr)
99 : JHTopTaggerStructure(pieces, recombiner) {}
115 std::ostringstream oss;
118 oss << description_of_selectors();
130 if (!jet.has_valid_cluster_sequence()){
131 throw Error(
"CMSTopTagger can only be applied on jets having an associated (and valid) ClusterSequence");
136 if (jet.validated_cs()->jet_def().jet_algorithm() != cambridge_algorithm)
137 _warnings_nonca.warn(
"CMSTopTagger should only be applied on jets from a Cambridge/Aachen clustering; use it with other algorithms at your own risk.");
141 std::vector<PseudoJet> split0 =
_split_once(jet, jet);
142 if (split0.empty())
return PseudoJet();
145 std::vector<PseudoJet> subjets;
146 for (
unsigned i = 0;
i < 2;
i++) {
147 std::vector<PseudoJet> split1 =
_split_once(split0[
i], jet);
148 if (!split1.empty()) {
149 subjets.push_back(split1[0]);
150 subjets.push_back(split1[1]);
152 subjets.push_back(split0[i]);
157 if (subjets.size() < 3)
return PseudoJet();
168 if (ii>0)
std::swap(subjets[ii], subjets[0]);
171 if ((subjets.size()>3) && (subjets[2].
perp2() < subjets[3].perp2()))
175 const JetDefinition::Recombiner *rec
176 = jet.associated_cluster_sequence()->jet_def().recombiner();
178 PseudoJet W =
join(subjets[0], subjets[1], *rec);
180 if (subjets.size()>3) {
181 non_W =
join(subjets[2], subjets[3], *rec);
183 non_W =
join(subjets[2], *rec);
185 PseudoJet
result = join<CMSTopTaggerStructure>(W, non_W, *rec);
187 s->_cos_theta_w = _cos_theta_W(result);
192 if (!_top_selector.pass(result) || ! _W_selector.pass(W)) {
196 result =
join(subjets);
204 const PseudoJet & reference_jet)
const{
205 PseudoJet this_jet = jet_to_split;
207 std::vector<PseudoJet>
result;
208 while (this_jet.has_parents(p1, p2)) {
209 if (p2.perp2() > p1.perp2())
std::swap(p1,p2);
210 if (p1.perp() <
_delta_p * reference_jet.perp())
break;
211 double DR = p1.delta_R(p2);
212 if (DR <
_delta_r -
_A * this_jet.perp())
break;
213 if (p2.perp() <
_delta_p * reference_jet.perp()) {
218 result.push_back(p1);
219 result.push_back(p2);
228 assert(subjets.size() > 1 && subjets.size() < 5);
231 unsigned softest = 5;
232 if (subjets.size() == 4) {
234 for (
unsigned ii = 0;
ii < subjets.size(); ++
ii) {
236 min_pt = subjets[
ii].perp();
243 for (
unsigned ii = 0;
ii+1 < subjets.size(); ++
ii) {
244 if (
ii == softest)
continue;
245 for (
unsigned jj =
ii + 1;
jj < subjets.size(); ++
jj) {
246 if (
jj == softest)
continue;
247 if ((subjets[
ii]+subjets[
jj]).m() < min_mass) {
248 min_mass = (subjets[
ii]+subjets[
jj]).
m();
257 FASTJET_END_NAMESPACE
259 #endif // __CMSTOPTAGGER_HH__
edm::ErrorSummaryEntry Error
LimitedWarning _warnings_nonca
std::string description() const override
returns a textual description of the tagger
void _find_min_mass(const std::vector< PseudoJet > &subjets, int &i, int &j) const
CMSTopTaggerStructure StructureType
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
CMSTopTagger(double delta_p=0.05, double delta_r=0.4, double A=0.0004)
double delta_r(const Fourvec &a, const Fourvec &b)
Find the distance between two four-vectors in the two-dimensional space .
CMSTopTaggerStructure(const std::vector< PseudoJet > &pieces, const JetDefinition::Recombiner *recombiner=nullptr)
static std::string join(char **cmd)
T perp2() const
Squared magnitude of transverse component.
PseudoJet result(const PseudoJet &jet) const override
T perp() const
Magnitude of transverse component.
std::vector< PseudoJet > _split_once(const PseudoJet &jet_to_split, const PseudoJet &reference_jet) const
runs the Johns Hopkins decomposition procedure