3 #include "Math/ProbFunc.h" 13 fPuppiDiagnostics = iConfig.
getParameter<
bool>(
"puppiDiagnostics");
17 fPuppiWeightCut = iConfig.
getParameter<
double>(
"MinPuppiWeight");
19 fPtMaxNeutralsStartSlope = iConfig.
getParameter<
double>(
"PtMaxNeutralsStartSlope");
20 std::vector<edm::ParameterSet> lAlgos = iConfig.
getParameter<std::vector<edm::ParameterSet> >(
"algos");
21 fNAlgos = lAlgos.size();
22 for(
unsigned int i0 = 0; i0 < lAlgos.size(); i0++) {
24 fPuppiAlgo.push_back(pPuppiConfig);
30 fPFParticles .resize(0);
31 fChargedPV .resize(0);
32 fPupParticles .resize(0);
42 fRecoParticles = &iRecoObjects;
44 fRecoToPup.reserve(fRecoParticles->size());
45 for (
auto const& rParticle : *fRecoParticles){
51 curPseudoJet.reset_PtYPhiM(rParticle.pt,rParticle.rapidity,rParticle.phi,rParticle.m);
53 curPseudoJet.reset_PtYPhiM(0, 99., 0, 0);
56 int puppi_register = 0;
57 if(rParticle.id == 0
or rParticle.charge == 0) puppi_register = 0;
58 if(rParticle.id == 1 and rParticle.charge != 0) puppi_register = rParticle.charge;
59 if(rParticle.id == 2 and rParticle.charge != 0) puppi_register = rParticle.charge+5;
60 curPseudoJet.
set_info( puppi_register );
62 fPFParticles.push_back(curPseudoJet);
64 if(
std::abs(rParticle.id) == 1) fChargedPV.push_back(curPseudoJet);
65 if(
std::abs(rParticle.id) >= 1 ) fPVFrac+=1.;
69 if (fPVFrac != 0) fPVFrac = double(fChargedPV.size())/fPVFrac;
75 return var_within_R(iOpt,iParts,iPart,iRCone);
79 if(iId == -1)
return 1;
88 vector<double > near_dR2s; near_dR2s.reserve(
std::min(50UL, particles.size()));
89 vector<double > near_pts; near_pts.reserve(
std::min(50UL, particles.size()));
90 const double r2 = R*
R;
91 for (
auto const&
part : particles){
95 near_pts.push_back(
part.pt());
101 auto nParts = near_dR2s.size();
102 for(
auto i = 0UL;
i < nParts; ++
i){
103 auto dr2 = near_dR2s[
i];
104 auto pt = near_pts[
i];
105 if(dr2 < 0.0001)
continue;
106 if(iId == 0) var += (
pt/dr2);
107 else if(iId == 1) var +=
pt;
108 else if(iId == 2) var += (1./dr2);
109 else if(iId == 3) var += (1./dr2);
110 else if(iId == 4) var +=
pt;
111 else if(iId == 5) var += (
pt *
pt/dr2);
113 if(iId == 1) var += centre.pt();
114 else if(iId == 0 && var != 0) var =
log(var);
115 else if(iId == 3 && var != 0) var =
log(var);
116 else if(iId == 5 && var != 0) var =
log(var);
120 void PuppiContainer::getRMSAvg(
int iOpt,std::vector<PuppiCandidate>
const &iConstits,std::vector<PuppiCandidate>
const &iParticles,std::vector<PuppiCandidate>
const &iChargedParticles) {
121 for(
unsigned int i0 = 0; i0 < iConstits.size(); i0++ ) {
124 int pPupId = getPuppiId(iConstits[i0].
pt(),iConstits[i0].
eta());
125 if(pPupId == -1 || fPuppiAlgo[pPupId].numAlgos() <= iOpt){
130 int pAlgo = fPuppiAlgo[pPupId].algoId (iOpt);
131 bool pCharged = fPuppiAlgo[pPupId].isCharged(iOpt);
132 double pCone = fPuppiAlgo[pPupId].coneSize (iOpt);
134 if(!pCharged) pVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
135 if( pCharged) pVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
136 fVals.push_back(pVal);
139 LogDebug(
"NotFound" ) <<
"====> Value is Nan " << pVal <<
" == " << iConstits[i0].pt() <<
" -- " << iConstits[i0].eta() << endl;
145 for(
int i1 = 0; i1 < fNAlgos; i1++){
146 pAlgo = fPuppiAlgo[i1].algoId (iOpt);
147 pCharged = fPuppiAlgo[i1].isCharged(iOpt);
148 pCone = fPuppiAlgo[i1].coneSize (iOpt);
151 if(!pCharged) curVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
152 if( pCharged) curVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
157 fPuppiAlgo[i1].add(iConstits[i0],curVal,iOpt);
161 for(
int i0 = 0; i0 < fNAlgos; i0++) fPuppiAlgo[i0].computeMedRMS(iOpt,fPVFrac);
164 void PuppiContainer::getRawAlphas(
int iOpt,std::vector<PuppiCandidate>
const &iConstits,std::vector<PuppiCandidate>
const &iParticles,std::vector<PuppiCandidate>
const &iChargedParticles) {
165 for(
int j0 = 0; j0 < fNAlgos; j0++){
166 for(
unsigned int i0 = 0; i0 < iConstits.size(); i0++ ) {
169 int pAlgo = fPuppiAlgo[j0].algoId (iOpt);
170 bool pCharged = fPuppiAlgo[j0].isCharged(iOpt);
171 double pCone = fPuppiAlgo[j0].coneSize (iOpt);
173 if(!pCharged) pVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
174 if( pCharged) pVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
175 fRawAlphas.push_back(pVal);
177 LogDebug(
"NotFound" ) <<
"====> Value is Nan " << pVal <<
" == " << iConstits[i0].pt() <<
" -- " << iConstits[i0].eta() << endl;
185 for(
int i0 = 0; i0 < fNAlgos; i0++) {
186 int nEtaBinsPerAlgo = fPuppiAlgo[i0].etaBins();
187 for (
int i1 = 0; i1 < nEtaBinsPerAlgo; i1++){
189 fPuppiAlgo[i0].fixAlgoEtaBin( i1 );
190 if(iPt > fPuppiAlgo[i0].
ptMin()){
205 double lProbLV = ROOT::Math::normal_cdf_c(
std::abs(iDZ),1.)*2.;
206 double lProbPU = 1-lProbLV;
207 if(lProbPU <= 0) lProbPU = 1
e-16;
208 if(lProbPU >= 0) lProbPU = 1-1
e-16;
209 double lChi2PU = TMath::ChisquareQuantile(lProbPU,1);
214 int lNParticles = fRecoParticles->size();
216 fPupParticles .clear();
217 fPupParticles.reserve(lNParticles);
219 fWeights.reserve(lNParticles);
221 fVals.reserve(lNParticles);
222 for(
int i0 = 0; i0 < fNAlgos; i0++) fPuppiAlgo[i0].
reset();
225 for(
int i0 = 0; i0 < fNAlgos; i0++) lNMaxAlgo =
std::max(fPuppiAlgo[i0].numAlgos(),lNMaxAlgo);
227 for(
int i0 = 0; i0 < lNMaxAlgo; i0++) {
228 getRMSAvg(i0,fPFParticles,fPFParticles,fChargedPV);
230 if (fPuppiDiagnostics) getRawAlphas(0,fPFParticles,fPFParticles,fChargedPV);
232 std::vector<double> pVals;
233 pVals.reserve(lNParticles);
234 for(
int i0 = 0; i0 < lNParticles; i0++) {
239 const auto& rParticle = (*fRecoParticles)[i0];
240 int pPupId = getPuppiId(rParticle.pt,rParticle.eta);
242 fWeights .push_back(pWeight);
243 fAlphaMed.push_back(-10);
244 fAlphaRMS.push_back(-10);
245 fRecoToPup.push_back(-1);
248 fRecoToPup.push_back(fPupParticles.size());
254 pChi2 = getChi2FromdZ(rParticle.dZ);
256 if(rParticle.pfType > 3) pChi2 = 0;
259 int lNAlgos = fPuppiAlgo[pPupId].numAlgos();
260 for(
int i1 = 0; i1 < lNAlgos; i1++) pVals.push_back(fVals[lNParticles*i1+i0]);
262 pWeight = fPuppiAlgo[pPupId].compute(pVals,pChi2);
264 if(rParticle.id == 1 && fApplyCHS ) pWeight = 1;
265 if(rParticle.id == 2 && fApplyCHS ) pWeight = 0;
269 LogDebug(
"PuppiWeightError") <<
"====> Weight is nan : " << pWeight <<
" : pt " << rParticle.pt <<
" -- eta : " << rParticle.eta <<
" -- Value" << fVals[i0] <<
" -- id : " << rParticle.id <<
" -- NAlgos: " << lNAlgos << std::endl;
272 if(pWeight*fPFParticles[i0].
pt() < fPuppiAlgo[pPupId].neutralPt(fNPV) && rParticle.id == 0 ) pWeight = 0;
273 if((fPtMax>0) && (rParticle.id == 0))
274 pWeight = std::clamp((fPFParticles[i0].
pt() - fPtMaxNeutralsStartSlope) / (fPtMax - fPtMaxNeutralsStartSlope),
277 if(pWeight < fPuppiWeightCut) pWeight = 0;
278 if(fInvert) pWeight = 1.-pWeight;
281 fWeights .push_back(pWeight);
282 fAlphaMed.push_back(fPuppiAlgo[pPupId].
median());
283 fAlphaRMS.push_back(fPuppiAlgo[pPupId].
rms());
291 PuppiCandidate curjet( pWeight*fPFParticles[i0].px(), pWeight*fPFParticles[i0].py(), pWeight*fPFParticles[i0].pz(), pWeight*fPFParticles[i0].
e() );
292 curjet.set_user_index(i0);
293 fPupParticles.push_back(curjet);
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)
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
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])