ATLAS Offline Software
Qjets.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "Qjets.h"
6 
7 using namespace std;
8 using namespace JetSubStructureUtils;
9 
10 Qjets::Qjets(double zcut, double dcut_fctr, double exp_min, double exp_max, double rigidity, double truncation_fctr)
11 : m_rand(),
12  m_zcut(zcut),
13  m_dcut(-1.),
14  m_dcut_fctr(dcut_fctr),
15  m_exp_min(exp_min),
16  m_exp_max(exp_max),
17  m_rigidity(rigidity),
18  m_truncation_fctr(truncation_fctr)
19 {
20 }
21 
22 void Qjets::SetRandSeed(unsigned int seed){
23  m_rand.SetSeed(seed);
24 }
25 
26 bool Qjets::JetUnmerged(int num) const{
27  return m_merged_jets.find(num) == m_merged_jets.end();
28 }
29 
30 bool Qjets::JetsUnmerged(const jet_distance& jd) const{
31  return JetUnmerged(jd.j1) && JetUnmerged(jd.j2);
32 }
33 
35  vector< pair<jet_distance, double> > popped_distances;
36  double norm(0.);
37  jet_distance ret{};
38  ret.j1 = -1;
39  ret.j2 = -1;
40  ret.dij = -1.;
41  bool dmin_set(false);
42  double dmin(0.);
43 
44  while(!m_distances.empty()){
45  jet_distance dist = m_distances.top();
46  m_distances.pop();
47  if(JetsUnmerged(dist)){
48  if(!dmin_set){
49  dmin = dist.dij;
50  dmin_set = true;
51  }
52  double weight = exp(-m_rigidity * (dist.dij-dmin) /dmin);
53  popped_distances.emplace_back(dist,weight);
54  norm += weight;
56  break;
57  }
58  }
59 
60  double rand(Rand()), tot_weight(0.);
61  if (!popped_distances.empty()) {
62  const double inv_norm = norm == 0 ? 1 : 1. / norm;
63  for(vector<pair<jet_distance, double> >::iterator it = popped_distances.begin(); it != popped_distances.end(); ++it){
64  tot_weight += (*it).second * inv_norm;
65  if(tot_weight >= rand){
66  ret = (*it).first;
67  break;
68  }
69  }
70  }
71 
72  // repopulate in reverse (maybe quicker?)
73  for(vector<pair<jet_distance, double> >::reverse_iterator it = popped_distances.rbegin(); it != popped_distances.rend(); ++it)
74  if(JetsUnmerged((*it).first))
75  m_distances.push((*it).first);
76 
77  return ret;
78 }
79 
81  ComputeDCut(cs);
82 
83  // Populate all the distances
84  ComputeAllDistances(cs.jets());
86 
87  while(!m_distances.empty() && jd.dij != -1.){
88  if(!Prune(jd,cs)){
89  // m_merged_jets.push_back(jd.j1);
90  // m_merged_jets.push_back(jd.j2);
91  m_merged_jets[jd.j1] = true;
92  m_merged_jets[jd.j2] = true;
93 
94  int new_jet;
95  cs.plugin_record_ij_recombination(jd.j1, jd.j2, 1., new_jet);
96  assert(JetUnmerged(new_jet));
97  ComputeNewDistanceMeasures(cs,new_jet);
98  } else {
99  double j1pt = cs.jets()[jd.j1].perp();
100  double j2pt = cs.jets()[jd.j2].perp();
101  if(j1pt>j2pt){
102  // m_merged_jets.push_back(jd.j2);
103  m_merged_jets[jd.j2] = true;
104  cs.plugin_record_iB_recombination(jd.j2, 1.);
105  } else {
106  // m_merged_jets.push_back(jd.j1);
107  m_merged_jets[jd.j1] = true;
108  cs.plugin_record_iB_recombination(jd.j1, 1.);
109  }
110  }
111  jd = GetNextDistance();
112  }
113 
114  // merge remaining jets with beam
115  [[maybe_unused]] int num_merged_final(0);
116 
117  for(unsigned int i = 0 ; i < cs.jets().size(); i++)
118  if(JetUnmerged(i)){
119  num_merged_final++;
120  cs.plugin_record_iB_recombination(i,1.);
121  }
122 
123  assert(num_merged_final < 2);
124 }
125 
127  // assume all jets in cs form a single jet. compute mass and pt
128  fastjet::PseudoJet sum(0.,0.,0.,0.);
129  for(vector<fastjet::PseudoJet>::const_iterator it = cs.jets().begin(); it != cs.jets().end(); ++it)
130  sum += (*it);
131  m_dcut = 2. * m_dcut_fctr * sum.m()/sum.perp();
132 }
133 
135  double pt1 = cs.jets()[jd.j1].perp();
136  double pt2 = cs.jets()[jd.j2].perp();
137  fastjet::PseudoJet sum_jet = cs.jets()[jd.j1]+cs.jets()[jd.j2];
138  double sum_pt = sum_jet.perp();
139  double z = min(pt1,pt2)/sum_pt;
140  double d = sqrt(cs.jets()[jd.j1].plain_distance(cs.jets()[jd.j2]));
141  return (d > m_dcut) && (z < m_zcut);
142 }
143 
144 void Qjets::ComputeAllDistances(const vector<fastjet::PseudoJet>& inp){
145  for(unsigned int i = 0 ; i < inp.size()-1; i++){
146  // jet-jet distances
147  for(unsigned int j = i+1 ; j < inp.size(); j++){
148  jet_distance jd{};
149  jd.j1 = i;
150  jd.j2 = j;
151  if(jd.j1 != jd.j2){
152  jd.dij = d_ij(inp[i],inp[j]);
153  m_distances.push(jd);
154  }
155  }
156  }
157 }
158 
160  // jet-jet distances
161  for(unsigned int i = 0; i < cs.jets().size(); i++)
162  if(JetUnmerged(i) && ((int)i) != new_jet){
163  jet_distance jd{};
164  jd.j1 = new_jet;
165  jd.j2 = i;
166  jd.dij = d_ij(cs.jets()[jd.j1], cs.jets()[jd.j2]);
167  m_distances.push(jd);
168  }
169 }
170 
171 double Qjets::d_ij(const fastjet::PseudoJet& v1,const fastjet::PseudoJet& v2) const{
172  double p1 = v1.perp();
173  double p2 = v2.perp();
174  double ret = pow(min(p1,p2),m_exp_min) * pow(max(p1,p2),m_exp_max) * v1.squared_distance(v2);
175  assert(!std::isnan(ret));
176  return ret;
177 }
178 
179 double Qjets::Rand(){
180  return m_rand.Rndm();
181 }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
Qjets.h
JetSubStructureUtils::Qjets::m_rigidity
double m_rigidity
Definition: Qjets.h:34
PlotCalibFromCool.norm
norm
Definition: PlotCalibFromCool.py:100
JetSubStructureUtils::jet_distance::j2
int j2
Definition: Qjets.h:22
JetSubStructureUtils::Qjets::ComputeDCut
void ComputeDCut(fastjet::ClusterSequence &cs)
Definition: Qjets.cxx:126
hist_file_dump.d
d
Definition: hist_file_dump.py:142
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
JetSubStructureUtils::Qjets::m_merged_jets
std::map< int, bool > m_merged_jets
Definition: Qjets.h:35
TRTCalib_cfilter.p1
p1
Definition: TRTCalib_cfilter.py:130
skel.it
it
Definition: skel.GENtoEVGEN.py:407
JetSubStructureUtils::Qjets::m_rand
TRandom3 m_rand
Definition: Qjets.h:33
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
JetSubStructureUtils::Qjets::Cluster
void Cluster(fastjet::ClusterSequence &cs)
Definition: Qjets.cxx:80
JetSubStructureUtils::Qjets::d_ij
double d_ij(const fastjet::PseudoJet &v1, const fastjet::PseudoJet &v2) const
Definition: Qjets.cxx:171
JetSubStructureUtils::Qjets::Rand
double Rand()
Definition: Qjets.cxx:179
JetSubStructureUtils::Qjets::GetNextDistance
jet_distance GetNextDistance()
Definition: Qjets.cxx:34
JetSubStructureUtils
Definition: Angularity.h:10
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:190
JetSubStructureUtils::Qjets::Prune
bool Prune(jet_distance &jd, fastjet::ClusterSequence &cs)
Definition: Qjets.cxx:134
JetSubStructureUtils::Qjets::m_dcut
double m_dcut
Definition: Qjets.h:34
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
JetSubStructureUtils::Qjets::SetRandSeed
void SetRandSeed(unsigned int seed)
Definition: Qjets.cxx:22
TRTCalib_cfilter.p2
p2
Definition: TRTCalib_cfilter.py:131
convertTimingResiduals.sum
sum
Definition: convertTimingResiduals.py:55
LArG4FSStartPointFilter.rand
rand
Definition: LArG4FSStartPointFilter.py:80
jet::ClusterSequence
fastjet::ClusterSequence ClusterSequence
Definition: ClusterSequence.h:21
lumiFormat.i
int i
Definition: lumiFormat.py:85
JetSubStructureUtils::Qjets::m_exp_max
double m_exp_max
Definition: Qjets.h:34
z
#define z
JetSubStructureUtils::jet_distance
Definition: Qjets.h:19
JetSubStructureUtils::Qjets::m_zcut
double m_zcut
Definition: Qjets.h:34
JetSubStructureUtils::jet_distance::j1
int j1
Definition: Qjets.h:21
JetSubStructureUtils::Qjets::m_dcut_fctr
double m_dcut_fctr
Definition: Qjets.h:34
JetSubStructureUtils::Qjets::ComputeNewDistanceMeasures
void ComputeNewDistanceMeasures(fastjet::ClusterSequence &cs, int new_jet)
Definition: Qjets.cxx:159
trigbs_pickEvents.num
num
Definition: trigbs_pickEvents.py:76
JetSubStructureUtils::Qjets::m_truncation_fctr
double m_truncation_fctr
Definition: Qjets.h:34
JetSubStructureUtils::Qjets::m_distances
std::priority_queue< jet_distance, std::vector< jet_distance >, JetDistanceCompare > m_distances
Definition: Qjets.h:36
ReadCellNoiseFromCoolCompare.v2
v2
Definition: ReadCellNoiseFromCoolCompare.py:364
JetSubStructureUtils::Qjets::ComputeAllDistances
void ComputeAllDistances(const std::vector< fastjet::PseudoJet > &inp)
Definition: Qjets.cxx:144
JetSubStructureUtils::jet_distance::dij
double dij
Definition: Qjets.h:20
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15
JetSubStructureUtils::Qjets::JetsUnmerged
bool JetsUnmerged(const jet_distance &jd) const
Definition: Qjets.cxx:30
JetSubStructureUtils::Qjets::JetUnmerged
bool JetUnmerged(int num) const
Definition: Qjets.cxx:26
JetSubStructureUtils::Qjets::m_exp_min
double m_exp_min
Definition: Qjets.h:34