31 #include "fastjet/ClusterSequenceActiveAreaExplicitGhosts.hh"
36 FASTJET_BEGIN_NAMESPACE
39 typedef ClusterSequenceActiveAreaExplicitGhosts ClustSeqActAreaEG;
42 LimitedWarning ClustSeqActAreaEG::_warnings;
46 void ClustSeqActAreaEG::_add_ghosts (
47 const GhostedAreaSpec & ghost_spec) {
50 ghost_spec.add_ghosts(_jets);
53 for (
unsigned i = _initial_hard_n; i < _jets.size(); i++) {
55 _is_pure_ghost.push_back(
true);
59 _ghost_area = ghost_spec.actual_ghost_area();
60 _n_ghosts = ghost_spec.n_ghosts();
66 double ClustSeqActAreaEG::area (
const PseudoJet & jet)
const {
73 double ClustSeqActAreaEG::total_area ()
const {
74 return _n_ghosts * _ghost_area;
85 bool ClustSeqActAreaEG::is_pure_ghost(
const PseudoJet & jet)
const
91 bool ClustSeqActAreaEG::is_pure_ghost(
int hist_ix)
const
93 return hist_ix >= 0 ? _is_pure_ghost[hist_ix] :
false;
97 double ClustSeqActAreaEG::empty_area(
const Selector & selector)
const {
100 throw Error(
"ClusterSequenceActiveAreaExplicitGhosts: empty area can only be computed from selectors applying jet by jet");
103 vector<PseudoJet> unclust = unclustered_particles();
104 double area_local = 0.0;
105 for (
unsigned iu = 0; iu < unclust.size(); iu++) {
106 if (is_pure_ghost(unclust[iu]) && selector.
pass(unclust[iu])) {
107 area_local += _ghost_area;
115 void ClustSeqActAreaEG::_post_process() {
119 _max_ghost_perp2 = 0.0;
120 for (
int i = 0; i < _initial_n; i++) {
121 if (_is_pure_ghost[i] && _jets[i].perp2() > _max_ghost_perp2)
122 _max_ghost_perp2 = _jets[i].perp2();
126 double danger_ratio = numeric_limits<double>::epsilon();
127 danger_ratio = danger_ratio * danger_ratio;
128 _has_dangerous_particles =
false;
129 for (
int i = 0; i < _initial_n; i++) {
130 if (!_is_pure_ghost[i] &&
131 danger_ratio * _jets[i].perp2() <= _max_ghost_perp2) {
132 _has_dangerous_particles =
true;
137 if (_has_dangerous_particles) _warnings.warn(
"ClusterSequenceActiveAreaExplicitGhosts: \n ghosts not sufficiently soft wrt some of the input particles\n a common cause is (unphysical?) input particles with pt=0 but finite rapidity");
140 _areas.resize(_history.size());
141 _area_4vectors.resize(_history.size());
142 _is_pure_ghost.resize(_history.size());
160 for (
int i = 0; i < _initial_n; i++) {
161 if (_is_pure_ghost[i]) {
162 _areas[i] = _ghost_area;
171 _area_4vectors[i].reset_momentum(_jets[i]);
172 _area_4vectors[i] *= (_ghost_area/_jets[i].perp());
175 _area_4vectors[i] = PseudoJet(0.0,0.0,0.0,0.0);
182 for (
unsigned i = _initial_n; i < _history.size(); i++) {
183 if (_history[i].parent2 == BeamJet) {
184 _is_pure_ghost[i] = _is_pure_ghost[_history[i].parent1];
185 _areas[i] = _areas[_history[i].parent1];
186 _area_4vectors[i] = _area_4vectors[_history[i].parent1];
188 _is_pure_ghost[i] = _is_pure_ghost[_history[i].parent1] &&
189 _is_pure_ghost[_history[i].parent2] ;
190 _areas[i] = _areas[_history[i].parent1] +
191 _areas[_history[i].parent2] ;
192 _jet_def.recombiner()->recombine(_area_4vectors[_history[i].parent1],
193 _area_4vectors[_history[i].parent2],
203 FASTJET_END_NAMESPACE
base class corresponding to errors that can be thrown by FastJet
Class to contain pseudojets, including minimal information of use to jet-clustering routines.
int cluster_hist_index() const
return the cluster_hist_index, intended to be used by clustering routines.
Class that encodes information about cuts and other selection criteria that can be applied to PseudoJ...
bool pass(const PseudoJet &jet) const
return true if the jet passes the selection
bool applies_jet_by_jet() const
returns true if this can be applied jet by jet