3 #include "Math/ProbFunc.h" 13 fPuppiDiagnostics = iConfig.
getParameter<
bool>(
"puppiDiagnostics");
17 fPuppiWeightCut = iConfig.
getParameter<
double>(
"MinPuppiWeight");
18 fPtMaxPhotons = iConfig.
getParameter<
double>(
"PtMaxPhotons");
19 fEtaMaxPhotons = iConfig.
getParameter<
double>(
"EtaMaxPhotons");
20 fPtMaxNeutrals = iConfig.
getParameter<
double>(
"PtMaxNeutrals");
21 std::vector<edm::ParameterSet> lAlgos = iConfig.
getParameter<std::vector<edm::ParameterSet> >(
"algos");
22 fNAlgos = lAlgos.size();
23 for (
unsigned int i0 = 0; i0 < lAlgos.size(); i0++) {
25 fPuppiAlgo.push_back(pPuppiConfig);
31 fPFParticles.resize(0);
42 fRecoParticles = &iRecoObjects;
43 for (
auto const &rParticle : *fRecoParticles) {
49 curPseudoJet.reset_PtYPhiM(rParticle.pt, rParticle.rapidity, rParticle.phi, rParticle.m);
51 curPseudoJet.reset_PtYPhiM(0, 99., 0, 0);
57 fPFParticles.push_back(curPseudoJet);
60 fChargedPV.push_back(curPseudoJet);
68 std::vector<PuppiCandidate>
const &iParts,
70 const double iRCone) {
71 return var_within_R(iOpt, iParts, iPart, iRCone);
88 vector<double> near_dR2s;
89 near_dR2s.reserve(
std::min(50UL, particles.size()));
90 vector<double> near_pts;
91 near_pts.reserve(
std::min(50UL, particles.size()));
92 const double r2 = R *
R;
93 for (
auto const &
part : particles) {
97 near_pts.push_back(
part.pt());
103 auto nParts = near_dR2s.size();
104 for (
auto i = 0UL;
i < nParts; ++
i) {
105 auto dr2 = near_dR2s[
i];
106 auto pt = near_pts[
i];
120 var += (
pt *
pt / dr2);
124 else if (iId == 0 && var != 0)
126 else if (iId == 3 && var != 0)
128 else if (iId == 5 && var != 0)
134 std::vector<PuppiCandidate>
const &iConstits,
135 std::vector<PuppiCandidate>
const &iParticles,
136 std::vector<PuppiCandidate>
const &iChargedParticles) {
137 for (
unsigned int i0 = 0; i0 < iConstits.size(); i0++) {
140 int pPupId = getPuppiId(iConstits[i0].
pt(), iConstits[i0].
eta());
141 if (pPupId == -1 || fPuppiAlgo[pPupId].numAlgos() <= iOpt) {
146 int pAlgo = fPuppiAlgo[pPupId].algoId(iOpt);
147 bool pCharged = fPuppiAlgo[pPupId].isCharged(iOpt);
148 double pCone = fPuppiAlgo[pPupId].coneSize(iOpt);
151 pVal = goodVar(iConstits[i0], iParticles, pAlgo, pCone);
153 pVal = goodVar(iConstits[i0], iChargedParticles, pAlgo, pCone);
154 fVals.push_back(pVal);
157 LogDebug(
"NotFound") <<
"====> Value is Nan " << pVal <<
" == " << iConstits[i0].pt() <<
" -- " 158 << iConstits[i0].eta() << endl;
164 for (
int i1 = 0;
i1 < fNAlgos;
i1++) {
165 pAlgo = fPuppiAlgo[
i1].algoId(iOpt);
166 pCharged = fPuppiAlgo[
i1].isCharged(iOpt);
167 pCone = fPuppiAlgo[
i1].coneSize(iOpt);
171 curVal = goodVar(iConstits[i0], iParticles, pAlgo, pCone);
173 curVal = goodVar(iConstits[i0], iChargedParticles, pAlgo, pCone);
178 fPuppiAlgo[
i1].add(iConstits[i0], curVal, iOpt);
181 for (
int i0 = 0; i0 < fNAlgos; i0++)
182 fPuppiAlgo[i0].computeMedRMS(iOpt);
186 std::vector<PuppiCandidate>
const &iConstits,
187 std::vector<PuppiCandidate>
const &iParticles,
188 std::vector<PuppiCandidate>
const &iChargedParticles) {
189 for (
int j0 = 0; j0 < fNAlgos; j0++) {
190 for (
unsigned int i0 = 0; i0 < iConstits.size(); i0++) {
193 int pAlgo = fPuppiAlgo[j0].algoId(iOpt);
194 bool pCharged = fPuppiAlgo[j0].isCharged(iOpt);
195 double pCone = fPuppiAlgo[j0].coneSize(iOpt);
198 pVal = goodVar(iConstits[i0], iParticles, pAlgo, pCone);
200 pVal = goodVar(iConstits[i0], iChargedParticles, pAlgo, pCone);
201 fRawAlphas.push_back(pVal);
203 LogDebug(
"NotFound") <<
"====> Value is Nan " << pVal <<
" == " << iConstits[i0].pt() <<
" -- " 204 << iConstits[i0].eta() << endl;
212 for (
int i0 = 0; i0 < fNAlgos; i0++) {
213 int nEtaBinsPerAlgo = fPuppiAlgo[i0].etaBins();
214 for (
int i1 = 0;
i1 < nEtaBinsPerAlgo;
i1++) {
216 fPuppiAlgo[i0].fixAlgoEtaBin(
i1);
217 if (iPt > fPuppiAlgo[i0].
ptMin()) {
232 double lProbLV = ROOT::Math::normal_cdf_c(
std::abs(iDZ), 1.) * 2.;
233 double lProbPU = 1 - lProbLV;
238 double lChi2PU = TMath::ChisquareQuantile(lProbPU, 1);
243 int lNParticles = fRecoParticles->size();
246 fWeights.reserve(lNParticles);
248 fVals.reserve(lNParticles);
249 for (
int i0 = 0; i0 < fNAlgos; i0++)
250 fPuppiAlgo[i0].
reset();
253 for (
int i0 = 0; i0 < fNAlgos; i0++)
254 lNMaxAlgo =
std::max(fPuppiAlgo[i0].numAlgos(), lNMaxAlgo);
256 for (
int i0 = 0; i0 < lNMaxAlgo; i0++) {
257 getRMSAvg(i0, fPFParticles, fPFParticles, fChargedPV);
259 if (fPuppiDiagnostics)
260 getRawAlphas(0, fPFParticles, fPFParticles, fChargedPV);
262 std::vector<double> pVals;
263 pVals.reserve(lNParticles);
264 for (
int i0 = 0; i0 < lNParticles; i0++) {
269 const auto &rParticle = (*fRecoParticles)[i0];
270 int pPupId = getPuppiId(rParticle.pt, rParticle.eta);
272 fWeights.push_back(0);
273 fAlphaMed.push_back(-10);
274 fAlphaRMS.push_back(-10);
282 pChi2 = getChi2FromdZ(rParticle.dZ);
284 if ((
std::abs(rParticle.pdgId) == 22) || (
std::abs(rParticle.pdgId) == 130))
288 int lNAlgos = fPuppiAlgo[pPupId].numAlgos();
289 for (
int i1 = 0;
i1 < lNAlgos;
i1++)
290 pVals.push_back(fVals[lNParticles *
i1 + i0]);
292 pWeight = fPuppiAlgo[pPupId].compute(pVals, pChi2);
294 if (rParticle.id == 1 && fApplyCHS)
296 if (rParticle.id == 2 && fApplyCHS)
301 LogDebug(
"PuppiWeightError") <<
"====> Weight is nan : " << pWeight <<
" : pt " << rParticle.pt
302 <<
" -- eta : " << rParticle.eta <<
" -- Value" << fVals[i0]
303 <<
" -- id : " << rParticle.id <<
" -- NAlgos: " << lNAlgos << std::endl;
306 if (pWeight * fPFParticles[i0].
pt() < fPuppiAlgo[pPupId].neutralPt(fNPV) && rParticle.id == 0)
309 if ((fPtMaxPhotons > 0) && (rParticle.pdgId == 22) && (
std::abs(fPFParticles[i0].eta()) < fEtaMaxPhotons) &&
310 (fPFParticles[i0].pt() > fPtMaxPhotons))
313 else if ((fPtMaxNeutrals > 0) && (rParticle.id == 0))
314 pWeight = std::clamp(fPFParticles[i0].
pt() / fPtMaxNeutrals, pWeight, 1.);
315 if (pWeight < fPuppiWeightCut)
318 pWeight = 1. - pWeight;
321 fWeights.push_back(pWeight);
322 fAlphaMed.push_back(fPuppiAlgo[pPupId].
median());
323 fAlphaRMS.push_back(fPuppiAlgo[pPupId].
rms());
T getParameter(std::string const &) const
std::vector< double > const & puppiWeights()
double var_within_R(int iId, const std::vector< PuppiCandidate > &particles, const PuppiCandidate ¢re, const double R)
double getChi2FromdZ(double iDZ)
constexpr bool isFinite(T x)
void set_info(int puppi_register)
void getRMSAvg(int iOpt, std::vector< PuppiCandidate > const &iConstits, std::vector< PuppiCandidate > const &iParticles, std::vector< PuppiCandidate > const &iChargeParticles)
void getRawAlphas(int iOpt, std::vector< PuppiCandidate > const &iConstits, std::vector< PuppiCandidate > const &iParticles, std::vector< PuppiCandidate > const &iChargeParticles)
PuppiContainer(const edm::ParameterSet &iConfig)
Abs< T >::type abs(const T &t)
int getPuppiId(float iPt, float iEta)
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
double goodVar(PuppiCandidate const &iPart, std::vector< PuppiCandidate > const &iParts, int iOpt, const double iRCone)
void initialize(const std::vector< RecoObj > &iRecoObjects)
void reset(double vett[256])