File indexing completed on 2023-03-17 11:18:34
0001 #include "RecoJets/JetProducers/interface/BackgroundEstimator.h"
0002 #include <fastjet/ClusterSequenceAreaBase.hh>
0003 #include <iostream>
0004
0005 using namespace fastjet;
0006 using namespace std;
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 BackgroundEstimator::BackgroundEstimator(const ClusterSequenceAreaBase &csa, const RangeDefinition &range)
0025 : _csa(csa), _range(range) {
0026 reset();
0027 }
0028
0029
0030 BackgroundEstimator::~BackgroundEstimator() {}
0031
0032
0033
0034 void BackgroundEstimator::reset() {
0035
0036 _included_jets = _csa.inclusive_jets();
0037 _all_from_inclusive = true;
0038
0039
0040
0041 _excluded_jets.clear();
0042
0043
0044
0045 set_use_area_4vector();
0046
0047
0048 _median_rho = _sigma = _mean_area = 0.0;
0049 _n_jets_used = _n_jets_excluded = _n_empty_jets = 0;
0050 _empty_area = 0.0;
0051 _uptodate = false;
0052 }
0053
0054
0055 void BackgroundEstimator::_compute() {
0056
0057
0058
0059
0060
0061
0062
0063 vector<double> pt_over_areas;
0064 double total_area = 0.0;
0065
0066 _n_jets_used = 0;
0067 _n_jets_excluded = 0;
0068
0069 for (unsigned i = 0; i < _included_jets.size(); i++) {
0070 const PseudoJet ¤t_jet = _included_jets[i];
0071
0072
0073
0074 bool excluded = false;
0075 int ref_idx = current_jet.cluster_hist_index();
0076 for (unsigned int j = 0; j < _excluded_jets.size(); j++)
0077 excluded |= (_excluded_jets[j].cluster_hist_index() == ref_idx);
0078
0079
0080 if (_range.is_in_range(current_jet)) {
0081 if (excluded) {
0082
0083 _n_jets_excluded++;
0084 } else {
0085 double this_area = (_use_area_4vector) ? _csa.area_4vector(current_jet).perp() : _csa.area(current_jet);
0086
0087 pt_over_areas.push_back(current_jet.perp() / this_area);
0088 total_area += this_area;
0089 _n_jets_used++;
0090 }
0091 }
0092 }
0093
0094
0095 if (pt_over_areas.empty()) {
0096 _median_rho = 0.0;
0097 _sigma = 0.0;
0098 _mean_area = 0.0;
0099 return;
0100 }
0101
0102
0103
0104
0105 sort(pt_over_areas.begin(), pt_over_areas.end());
0106
0107
0108 _empty_area = 0.0;
0109 _n_empty_jets = 0.0;
0110 if (_csa.has_explicit_ghosts()) {
0111 _empty_area = 0.0;
0112 _n_empty_jets = 0;
0113 } else if (_all_from_inclusive) {
0114 _empty_area = _csa.empty_area(_range);
0115 _n_empty_jets = _csa.n_empty_jets(_range);
0116 } else {
0117 _empty_area = _csa.empty_area_from_jets(_included_jets, _range);
0118 _mean_area = total_area / _n_jets_used;
0119 _n_empty_jets = _empty_area / _mean_area;
0120 }
0121
0122 double total_njets = _n_jets_used + _n_empty_jets;
0123 total_area += _empty_area;
0124
0125
0126
0127 double posn[2] = {0.5, (1.0 - 0.6827) / 2.0};
0128 double res[2];
0129
0130 for (int i = 0; i < 2; i++) {
0131 double nj_median_pos = (total_njets - 1) * posn[i] - _n_empty_jets;
0132 double nj_median_ratio;
0133 if (nj_median_pos >= 0 && pt_over_areas.size() > 1) {
0134 int int_nj_median = int(nj_median_pos);
0135 nj_median_ratio = pt_over_areas[int_nj_median] * (int_nj_median + 1 - nj_median_pos) +
0136 pt_over_areas[int_nj_median + 1] * (nj_median_pos - int_nj_median);
0137 } else {
0138 nj_median_ratio = 0.0;
0139 }
0140 res[i] = nj_median_ratio;
0141 }
0142
0143
0144 double error = res[0] - res[1];
0145 _median_rho = res[0];
0146 _mean_area = total_area / total_njets;
0147 _sigma = error * sqrt(_mean_area);
0148
0149
0150 _uptodate = true;
0151 }