2 #include "fastjet/internal/base.hh"
3 #include "fastjet/FunctionOfPseudoJet.hh"
4 #include "Math/ProbFunc.h"
12 using namespace fastjet;
17 fPuppiWeightCut = iConfig.
getParameter<
double>(
"MinPuppiWeight");
18 std::vector<edm::ParameterSet> lAlgos = iConfig.
getParameter<std::vector<edm::ParameterSet> >(
"algos");
19 fNAlgos = lAlgos.size();
20 for(
unsigned int i0 = 0; i0 < lAlgos.size(); i0++) {
22 fPuppiAlgo.push_back(pPuppiConfig);
28 fRecoParticles.resize(0);
29 fPFParticles .resize(0);
30 fChargedPV .resize(0);
31 fPupParticles .resize(0);
41 fRecoParticles = iRecoObjects;
42 for (
unsigned int i = 0;
i < fRecoParticles.size();
i++){
43 fastjet::PseudoJet curPseudoJet;
44 auto fRecoParticle = fRecoParticles[
i];
48 curPseudoJet.reset_PtYPhiM(fRecoParticle.pt,fRecoParticle.rapidity,fRecoParticle.phi,fRecoParticle.m);
50 int puppi_register = 0;
51 if(fRecoParticle.id == 0
or fRecoParticle.charge == 0) puppi_register = 0;
52 if(fRecoParticle.id == 1 and fRecoParticle.charge != 0) puppi_register = fRecoParticle.charge;
53 if(fRecoParticle.id == 2 and fRecoParticle.charge != 0) puppi_register = fRecoParticle.charge+5;
54 curPseudoJet.set_user_info(
new PuppiUserInfo( puppi_register ) );
56 fPFParticles.push_back(curPseudoJet);
58 if(
std::abs(fRecoParticle.id) == 1) fChargedPV.push_back(curPseudoJet);
59 if(
std::abs(fRecoParticle.id) >= 1 ) fPVFrac+=1.;
63 if(fNPV < fRecoParticle.vtxId) fNPV = fRecoParticle.vtxId;
65 if (fPVFrac != 0) fPVFrac = double(fChargedPV.size())/fPVFrac;
72 lPup = var_within_R(iOpt,iParts,iPart,iRCone);
76 if(iId == -1)
return 1;
77 fastjet::Selector
sel = fastjet::SelectorCircle(R);
78 sel.set_reference(centre);
79 vector<PseudoJet> near_particles =
sel(particles);
83 for(
unsigned int i=0;
i<near_particles.size();
i++){
84 double pDEta = near_particles[
i].eta()-centre.eta();
85 double pDPhi =
std::abs(near_particles[
i].
phi()-centre.phi());
86 if(pDPhi > 2.*
M_PI-pDPhi) pDPhi = 2.*
M_PI-pDPhi;
87 double pDR2 = pDEta*pDEta+pDPhi*pDPhi;
88 if(
std::abs(pDR2) < 0.0001)
continue;
89 if(iId == 0) var += (near_particles[
i].pt()/pDR2);
90 if(iId == 1) var += near_particles[
i].pt();
91 if(iId == 2) var += (1./pDR2);
92 if(iId == 3) var += (1./pDR2);
93 if(iId == 4) var += near_particles[
i].pt();
94 if(iId == 5) var += (near_particles[
i].pt() * near_particles[
i].pt()/pDR2);
96 if(iId == 1) var += centre.pt();
97 if(iId == 0 && var != 0) var =
log(var);
98 if(iId == 3 && var != 0) var =
log(var);
99 if(iId == 5 && var != 0) var =
log(var);
103 void PuppiContainer::getRMSAvg(
int iOpt,std::vector<fastjet::PseudoJet>
const &iConstits,std::vector<fastjet::PseudoJet>
const &iParticles,std::vector<fastjet::PseudoJet>
const &iChargedParticles) {
104 for(
unsigned int i0 = 0; i0 < iConstits.size(); i0++ ) {
107 int pPupId = getPuppiId(iConstits[i0].
pt(),iConstits[i0].
eta());
108 if(pPupId == -1 || fPuppiAlgo[pPupId].numAlgos() <= iOpt){
113 int pAlgo = fPuppiAlgo[pPupId].algoId (iOpt);
114 bool pCharged = fPuppiAlgo[pPupId].isCharged(iOpt);
115 double pCone = fPuppiAlgo[pPupId].coneSize (iOpt);
117 if(!pCharged) pVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
118 if( pCharged) pVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
119 fVals.push_back(pVal);
122 LogDebug(
"NotFound" ) <<
"====> Value is Nan " << pVal <<
" == " << iConstits[i0].pt() <<
" -- " << iConstits[i0].eta() << endl;
128 for(
int i1 = 0; i1 < fNAlgos; i1++){
129 pAlgo = fPuppiAlgo[i1].algoId (iOpt);
130 pCharged = fPuppiAlgo[i1].isCharged(iOpt);
131 pCone = fPuppiAlgo[i1].coneSize (iOpt);
133 if(!pCharged) curVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
134 if( pCharged) curVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
136 fPuppiAlgo[i1].add(iConstits[i0],curVal,iOpt);
140 for(
int i0 = 0; i0 < fNAlgos; i0++) fPuppiAlgo[i0].computeMedRMS(iOpt,fPVFrac);
143 void PuppiContainer::getRawAlphas(
int iOpt,std::vector<fastjet::PseudoJet>
const &iConstits,std::vector<fastjet::PseudoJet>
const &iParticles,std::vector<fastjet::PseudoJet>
const &iChargedParticles) {
144 for(
int j0 = 0; j0 < fNAlgos; j0++){
145 for(
unsigned int i0 = 0; i0 < iConstits.size(); i0++ ) {
148 int pAlgo = fPuppiAlgo[j0].algoId (iOpt);
149 bool pCharged = fPuppiAlgo[j0].isCharged(iOpt);
150 double pCone = fPuppiAlgo[j0].coneSize (iOpt);
152 if(!pCharged) pVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
153 if( pCharged) pVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
154 fRawAlphas.push_back(pVal);
156 LogDebug(
"NotFound" ) <<
"====> Value is Nan " << pVal <<
" == " << iConstits[i0].pt() <<
" -- " << iConstits[i0].eta() << endl;
164 for(
int i0 = 0; i0 < fNAlgos; i0++) {
167 if(iPt < fPuppiAlgo[i0].
ptMin())
continue;
179 double lProbLV = ROOT::Math::normal_cdf_c(
std::abs(iDZ),1.)*2.;
180 double lProbPU = 1-lProbLV;
181 if(lProbPU <= 0) lProbPU = 1
e-16;
182 if(lProbPU >= 0) lProbPU = 1-1
e-16;
183 double lChi2PU = TMath::ChisquareQuantile(lProbPU,1);
188 fPupParticles .resize(0);
191 for(
int i0 = 0; i0 < fNAlgos; i0++) fPuppiAlgo[i0].
reset();
194 for(
int i0 = 0; i0 < fNAlgos; i0++) lNMaxAlgo =
std::max(fPuppiAlgo[i0].numAlgos(),lNMaxAlgo);
196 int lNParticles = fRecoParticles.size();
197 for(
int i0 = 0; i0 < lNMaxAlgo; i0++) {
198 getRMSAvg(i0,fPFParticles,fPFParticles,fChargedPV);
200 getRawAlphas(0,fPFParticles,fPFParticles,fChargedPV);
202 std::vector<double> pVals;
203 for(
int i0 = 0; i0 < lNParticles; i0++) {
208 int pPupId = getPuppiId(fRecoParticles[i0].
pt,fRecoParticles[i0].
eta);
210 fWeights .push_back(pWeight);
211 fAlphaMed.push_back(-10);
212 fAlphaRMS.push_back(-10);
219 pChi2 = getChi2FromdZ(fRecoParticles[i0].dZ);
221 if(fRecoParticles[i0].pfType > 3) pChi2 = 0;
224 int lNAlgos = fPuppiAlgo[pPupId].numAlgos();
225 for(
int i1 = 0; i1 < lNAlgos; i1++) pVals.push_back(fVals[lNParticles*i1+i0]);
226 pWeight = fPuppiAlgo[pPupId].compute(pVals,pChi2);
228 if(fRecoParticles[i0].
id == 1 && fApplyCHS ) pWeight = 1;
229 if(fRecoParticles[i0].
id == 2 && fApplyCHS ) pWeight = 0;
233 LogDebug(
"PuppiWeightError") <<
"====> Weight is nan : " << pWeight <<
" : pt " << fRecoParticles[i0].pt <<
" -- eta : " << fRecoParticles[i0].eta <<
" -- Value" << fVals[i0] <<
" -- id : " << fRecoParticles[i0].id <<
" -- NAlgos: " << lNAlgos << std::endl;
236 if(pWeight < fPuppiWeightCut) pWeight = 0;
237 if(pWeight*fPFParticles[i0].
pt() < fPuppiAlgo[pPupId].neutralPt(fNPV) && fRecoParticles[i0].
id == 0 ) pWeight = 0;
241 fWeights .push_back(pWeight);
242 fAlphaMed.push_back(fPuppiAlgo[pPupId].median(0));
243 fAlphaRMS.push_back(fPuppiAlgo[pPupId].
rms(0));
245 if(
std::abs(pWeight) < std::numeric_limits<double>::denorm_min() )
continue;
247 PseudoJet curjet( pWeight*fPFParticles[i0].px(), pWeight*fPFParticles[i0].py(), pWeight*fPFParticles[i0].pz(), pWeight*fPFParticles[i0].
e());
248 curjet.set_user_index(i0);
249 fPupParticles.push_back(curjet);
T getParameter(std::string const &) const
std::vector< double > const & puppiWeights()
double getChi2FromdZ(double iDZ)
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::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
double var_within_R(int iId, const std::vector< fastjet::PseudoJet > &particles, const fastjet::PseudoJet ¢re, double R)
void getRMSAvg(int iOpt, std::vector< fastjet::PseudoJet > const &iConstits, std::vector< fastjet::PseudoJet > const &iParticles, std::vector< fastjet::PseudoJet > const &iChargeParticles)
PuppiContainer(const edm::ParameterSet &iConfig)
void getRawAlphas(int iOpt, std::vector< fastjet::PseudoJet > const &iConstits, std::vector< fastjet::PseudoJet > const &iParticles, std::vector< fastjet::PseudoJet > const &iChargeParticles)
Abs< T >::type abs(const T &t)
double goodVar(fastjet::PseudoJet const &iPart, std::vector< fastjet::PseudoJet > const &iParts, int iOpt, double iRCone)
int getPuppiId(float iPt, float iEta)
Geom::Phi< T > phi() const
void initialize(const std::vector< RecoObj > &iRecoObjects)
void reset(double vett[256])