2 #include "fastjet/internal/base.hh"
3 #include "fastjet/FunctionOfPseudoJet.hh"
4 #include "Math/ProbFunc.h"
12 using namespace fastjet;
15 fPuppiDiagnostics = iConfig.
getParameter<
bool>(
"puppiDiagnostics");
19 fPuppiWeightCut = iConfig.
getParameter<
double>(
"MinPuppiWeight");
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 fRecoParticles.resize(0);
31 fPFParticles .resize(0);
32 fChargedPV .resize(0);
33 fPupParticles .resize(0);
43 fRecoParticles = iRecoObjects;
44 for (
unsigned int i = 0;
i < fRecoParticles.size();
i++){
45 fastjet::PseudoJet curPseudoJet;
46 auto fRecoParticle = fRecoParticles[
i];
51 curPseudoJet.reset_PtYPhiM(fRecoParticle.pt,fRecoParticle.rapidity,fRecoParticle.phi,fRecoParticle.m);
53 curPseudoJet.reset_PtYPhiM(0, 99., 0, 0);
56 int puppi_register = 0;
57 if(fRecoParticle.id == 0
or fRecoParticle.charge == 0) puppi_register = 0;
58 if(fRecoParticle.id == 1 and fRecoParticle.charge != 0) puppi_register = fRecoParticle.charge;
59 if(fRecoParticle.id == 2 and fRecoParticle.charge != 0) puppi_register = fRecoParticle.charge+5;
60 curPseudoJet.set_user_info(
new PuppiUserInfo( puppi_register ) );
62 fPFParticles.push_back(curPseudoJet);
64 if(
std::abs(fRecoParticle.id) == 1) fChargedPV.push_back(curPseudoJet);
65 if(
std::abs(fRecoParticle.id) >= 1 ) fPVFrac+=1.;
71 if (fPVFrac != 0) fPVFrac = double(fChargedPV.size())/fPVFrac;
78 lPup = var_within_R(iOpt,iParts,iPart,iRCone);
82 if(iId == -1)
return 1;
83 fastjet::Selector
sel = fastjet::SelectorCircle(R);
84 sel.set_reference(centre);
85 vector<PseudoJet> near_particles =
sel(particles);
89 for(
unsigned int i=0;
i<near_particles.size();
i++){
90 double pDEta = near_particles[
i].eta()-centre.eta();
91 double pDPhi =
std::abs(near_particles[
i].
phi()-centre.phi());
92 if(pDPhi > 2.*
M_PI-pDPhi) pDPhi = 2.*
M_PI-pDPhi;
93 double pDR2 = pDEta*pDEta+pDPhi*pDPhi;
94 if(
std::abs(pDR2) < 0.0001)
continue;
95 if(iId == 0) var += (near_particles[
i].pt()/pDR2);
96 if(iId == 1) var += near_particles[
i].pt();
97 if(iId == 2) var += (1./pDR2);
98 if(iId == 3) var += (1./pDR2);
99 if(iId == 4) var += near_particles[
i].pt();
100 if(iId == 5) var += (near_particles[
i].pt() * near_particles[
i].pt()/pDR2);
102 if(iId == 1) var += centre.pt();
103 if(iId == 0 && var != 0) var =
log(var);
104 if(iId == 3 && var != 0) var =
log(var);
105 if(iId == 5 && var != 0) var =
log(var);
109 void PuppiContainer::getRMSAvg(
int iOpt,std::vector<fastjet::PseudoJet>
const &iConstits,std::vector<fastjet::PseudoJet>
const &iParticles,std::vector<fastjet::PseudoJet>
const &iChargedParticles) {
110 for(
unsigned int i0 = 0; i0 < iConstits.size(); i0++ ) {
113 int pPupId = getPuppiId(iConstits[i0].
pt(),iConstits[i0].
eta());
114 if(pPupId == -1 || fPuppiAlgo[pPupId].numAlgos() <= iOpt){
119 int pAlgo = fPuppiAlgo[pPupId].algoId (iOpt);
120 bool pCharged = fPuppiAlgo[pPupId].isCharged(iOpt);
121 double pCone = fPuppiAlgo[pPupId].coneSize (iOpt);
123 if(!pCharged) pVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
124 if( pCharged) pVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
125 fVals.push_back(pVal);
128 LogDebug(
"NotFound" ) <<
"====> Value is Nan " << pVal <<
" == " << iConstits[i0].pt() <<
" -- " << iConstits[i0].eta() << endl;
134 for(
int i1 = 0; i1 < fNAlgos; i1++){
135 pAlgo = fPuppiAlgo[i1].algoId (iOpt);
136 pCharged = fPuppiAlgo[i1].isCharged(iOpt);
137 pCone = fPuppiAlgo[i1].coneSize (iOpt);
139 if(!pCharged) curVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
140 if( pCharged) curVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
142 fPuppiAlgo[i1].add(iConstits[i0],curVal,iOpt);
146 for(
int i0 = 0; i0 < fNAlgos; i0++) fPuppiAlgo[i0].computeMedRMS(iOpt,fPVFrac);
149 void PuppiContainer::getRawAlphas(
int iOpt,std::vector<fastjet::PseudoJet>
const &iConstits,std::vector<fastjet::PseudoJet>
const &iParticles,std::vector<fastjet::PseudoJet>
const &iChargedParticles) {
150 for(
int j0 = 0; j0 < fNAlgos; j0++){
151 for(
unsigned int i0 = 0; i0 < iConstits.size(); i0++ ) {
154 int pAlgo = fPuppiAlgo[j0].algoId (iOpt);
155 bool pCharged = fPuppiAlgo[j0].isCharged(iOpt);
156 double pCone = fPuppiAlgo[j0].coneSize (iOpt);
158 if(!pCharged) pVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
159 if( pCharged) pVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
160 fRawAlphas.push_back(pVal);
162 LogDebug(
"NotFound" ) <<
"====> Value is Nan " << pVal <<
" == " << iConstits[i0].pt() <<
" -- " << iConstits[i0].eta() << endl;
170 for(
int i0 = 0; i0 < fNAlgos; i0++) {
173 if(iPt < fPuppiAlgo[i0].
ptMin())
continue;
185 double lProbLV = ROOT::Math::normal_cdf_c(
std::abs(iDZ),1.)*2.;
186 double lProbPU = 1-lProbLV;
187 if(lProbPU <= 0) lProbPU = 1
e-16;
188 if(lProbPU >= 0) lProbPU = 1-1
e-16;
189 double lChi2PU = TMath::ChisquareQuantile(lProbPU,1);
194 fPupParticles .resize(0);
197 for(
int i0 = 0; i0 < fNAlgos; i0++) fPuppiAlgo[i0].
reset();
200 for(
int i0 = 0; i0 < fNAlgos; i0++) lNMaxAlgo =
std::max(fPuppiAlgo[i0].numAlgos(),lNMaxAlgo);
202 int lNParticles = fRecoParticles.size();
203 for(
int i0 = 0; i0 < lNMaxAlgo; i0++) {
204 getRMSAvg(i0,fPFParticles,fPFParticles,fChargedPV);
206 if (fPuppiDiagnostics) getRawAlphas(0,fPFParticles,fPFParticles,fChargedPV);
208 std::vector<double> pVals;
209 for(
int i0 = 0; i0 < lNParticles; i0++) {
214 int pPupId = getPuppiId(fRecoParticles[i0].
pt,fRecoParticles[i0].
eta);
216 fWeights .push_back(pWeight);
217 fAlphaMed.push_back(-10);
218 fAlphaRMS.push_back(-10);
225 pChi2 = getChi2FromdZ(fRecoParticles[i0].dZ);
227 if(fRecoParticles[i0].pfType > 3) pChi2 = 0;
230 int lNAlgos = fPuppiAlgo[pPupId].numAlgos();
231 for(
int i1 = 0; i1 < lNAlgos; i1++) pVals.push_back(fVals[lNParticles*i1+i0]);
233 pWeight = fPuppiAlgo[pPupId].compute(pVals,pChi2);
235 if(fRecoParticles[i0].
id == 1 && fApplyCHS ) pWeight = 1;
236 if(fRecoParticles[i0].
id == 2 && fApplyCHS ) pWeight = 0;
240 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;
243 if(pWeight < fPuppiWeightCut) pWeight = 0;
244 if(pWeight*fPFParticles[i0].
pt() < fPuppiAlgo[pPupId].neutralPt(fNPV) && fRecoParticles[i0].
id == 0 ) pWeight = 0;
245 if(fInvert) pWeight = 1.-pWeight;
248 fWeights .push_back(pWeight);
249 fAlphaMed.push_back(fPuppiAlgo[pPupId].median(0));
250 fAlphaRMS.push_back(fPuppiAlgo[pPupId].
rms(0));
258 PseudoJet curjet( pWeight*fPFParticles[i0].px(), pWeight*fPFParticles[i0].py(), pWeight*fPFParticles[i0].pz(), pWeight*fPFParticles[i0].
e());
259 curjet.set_user_index(i0);
260 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])