23 const Eigen::Vector2d &
sum,
31 sum += Eigen::Vector2d(kin.
px(), kin.
py());
32 covariance += sigma * cosSin * cosSin.transpose();
37 const std::vector<double> &sorted,
43 std::size_t nTrim = sorted.size() * (1 - trimFraction) / 2;
45 mean = std::accumulate(sorted.begin() + nTrim, sorted.end() - nTrim, 0.);
46 mean /= (sorted.size() - 2 * nTrim);
50 for (std::size_t ii = 0; ii < sorted.size() - nTrim; ++ii)
52 double val = sorted.at(ii) -
mean;
53 variance += val * val * (ii < nTrim ? 2 : 1);
55 variance /= sorted.size();
64 std::vector<double> sorted;
68 std::lower_bound(sorted.begin(), sorted.end(), tower.sumEt()),
79 double squaredSum = 0;
87 squaredSum += tower.sumEt() * tower.sumEt();
91 throw std::runtime_error(
"unmaskedMeanAndVariance: n is zero in denominator.");
97 variance = squaredSum / n -
mean *
mean;
104 for (std::size_t d = 0; d < 4; ++d)
109 sum += tower.sumEt();
120 const Eigen::Vector2d &pileupSum,
121 const Eigen::Matrix2d &pileupCovariance,
122 const Eigen::VectorXd &towerExpectations,
123 const Eigen::VectorXd &towerVariances,
124 const Eigen::VectorXd &correctionDirections,
125 double constraintImportance)
128 std::size_t nCorr = correctionDirections.size();
133 Eigen::Matrix<double, 2, Eigen::Dynamic> cosSin(2, nCorr);
134 cosSin.row(0) = correctionDirections.array().cos();
135 cosSin.row(1) = correctionDirections.array().sin();
142 constraintImportance);
146 const Eigen::Vector2d &pileupSum,
147 const Eigen::Matrix2d &pileupCovariance,
149 double towerVariance,
150 const Eigen::VectorXd &correctionDirections,
151 double constraintImportance)
153 std::size_t nCorr = correctionDirections.size();
157 Eigen::VectorXd::Constant(nCorr, towerMean),
158 Eigen::VectorXd::Constant(nCorr, towerVariance),
159 correctionDirections,
160 constraintImportance);
164 const Eigen::Vector2d &pileupSum,
165 const Eigen::Matrix2d &pileupCovariance,
166 const Eigen::VectorXd &towerExpectations,
167 const Eigen::VectorXd &towerVariances,
168 const Eigen::Matrix<double, 2, Eigen::Dynamic> &cosSin,
169 double constraintImportance)
172 std::size_t nCorr = cosSin.cols();
182 if (pileupCovariance.determinant() == 0)
187 return towerExpectations;
191 towerExpectations.cwiseQuotient(towerVariances) -
193 constraintImportance * cosSin.transpose() * pileupCovariance.inverse() * pileupSum;
194 Eigen::MatrixXd diagonal = towerVariances.cwiseInverse().asDiagonal();
199 constraintImportance * (cosSin.transpose() * pileupCovariance.inverse() * cosSin);
201 return coeffMatrix.inverse() *
constants;
205 const Eigen::Vector2d &pileupSum,
206 const Eigen::Matrix2d &pileupCovariance,
208 double towerVariance,
209 const Eigen::Matrix<double, 2, Eigen::Dynamic> &cosSin,
210 double constraintImportance)
212 std::size_t nCorr = cosSin.cols();
216 Eigen::VectorXd::Constant(nCorr, towerMean),
217 Eigen::VectorXd::Constant(nCorr, towerVariance),
219 constraintImportance);
222 std::vector<SignedKinematics>
pufit(
223 const Eigen::Vector2d &pileupSum,
224 const Eigen::Matrix2d &pileupCovariance,
225 const std::vector<double> &towerExpectations,
226 const std::vector<double> &towerVariances,
227 const std::vector<SignedKinematics> &toCorrect,
228 double constraintImportance)
231 std::size_t nCorr = toCorrect.size();
237 Eigen::Matrix<double, 2, Eigen::Dynamic> cosSin(2, nCorr);
238 Eigen::VectorXd vecTowerExpectations(nCorr);
239 Eigen::VectorXd vecTowerVariances(nCorr);
240 for (std::size_t ii = 0; ii < nCorr; ++ii)
242 cosSin(0, ii) = toCorrect.at(ii).cosPhi();
243 cosSin(1, ii) = toCorrect.at(ii).sinPhi();
244 vecTowerExpectations(ii) = towerExpectations.at(ii);
245 vecTowerVariances(ii) = towerVariances.at(ii);
247 Eigen::VectorXd corrections =
pufit(
250 vecTowerExpectations,
253 constraintImportance);
255 std::vector<SignedKinematics> kinCorrections;
256 kinCorrections.reserve(nCorr);
257 for (std::size_t ii = 0; ii < nCorr; ++ii)
259 -corrections.coeff(ii),
260 toCorrect.at(ii).eta(),
261 toCorrect.at(ii).phi()));
262 return kinCorrections;
264 std::vector<SignedKinematics>
pufit(
265 const Eigen::Vector2d &pileupSum,
266 const Eigen::Matrix2d &pileupCovariance,
268 double towerVariance,
269 const std::vector<SignedKinematics> &toCorrect,
270 double constraintImportance)
273 std::size_t nCorr = toCorrect.size();
281 std::vector<double>(nCorr, towerMean),
282 std::vector<double>(nCorr, towerVariance),
284 constraintImportance);
std::size_t nTowers() const
The number of bins.
Describes a single element of the grid.
Bins energy deposits into a grid.
Class to describe the kinematics of an object that can have negative energies.
static SignedKinematics fromEtEtaPhi(double et, double eta, double phi)
Factory function to construct from et, eta, phi (massless)
double sinPhi() const
Provide accessors for sin and cos phi.
void mean(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
void trimmedMeanAndVariance(const std::vector< double > &sorted, double trimFraction, double &mean, double &variance)
Calculate the trimmed mean and variance for a vector of tower sumEts.
Eigen::VectorXd pufit(const Eigen::Vector2d &pileupSum, const Eigen::Matrix2d &pileupCovariance, const Eigen::VectorXd &towerExpectations, const Eigen::VectorXd &towerVariances, const Eigen::VectorXd &correctionDirections, double constraintImportance)
Perform the pile-up fit.
void unmaskedMeanAndVariance(const PufitGrid &grid, double &mean, double &variance)
Calculate the mean and variance of unmasked towers.
GridDisplacement selectGrid(const PufitGridSet &grids)
Select the grid with the highest masked sumEt.
GridDisplacement
Enum to describe the positioning of the grid.
@ NoDisplacement
The grid is not shifted.
It used to be useful piece of code for replacing actual SG with other store of similar functionality ...
Helper struct to contain a full set of grids.
Eigen::Matrix2d covariance
The covariance matrix.
CovarianceSum & add(const SignedKinematics &kin, double sigma)
Add a new contribution to the sum.
Eigen::Vector2d sum
The sum.
CovarianceSum()
Default constructor - zero initialize everything.