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++) {
171 int nEtaBinsPerAlgo = fPuppiAlgo[i0].etaBins();
172 for (
int i1 = 0; i1 < nEtaBinsPerAlgo; i1++){
174 fPuppiAlgo[i0].fixAlgoEtaBin( i1 );
175 if(iPt > fPuppiAlgo[i0].
ptMin()){
190 double lProbLV = ROOT::Math::normal_cdf_c(
std::abs(iDZ),1.)*2.;
191 double lProbPU = 1-lProbLV;
192 if(lProbPU <= 0) lProbPU = 1
e-16;
193 if(lProbPU >= 0) lProbPU = 1-1
e-16;
194 double lChi2PU = TMath::ChisquareQuantile(lProbPU,1);
199 fPupParticles .resize(0);
202 for(
int i0 = 0; i0 < fNAlgos; i0++) fPuppiAlgo[i0].
reset();
205 for(
int i0 = 0; i0 < fNAlgos; i0++) lNMaxAlgo =
std::max(fPuppiAlgo[i0].numAlgos(),lNMaxAlgo);
207 int lNParticles = fRecoParticles.size();
208 for(
int i0 = 0; i0 < lNMaxAlgo; i0++) {
209 getRMSAvg(i0,fPFParticles,fPFParticles,fChargedPV);
211 if (fPuppiDiagnostics) getRawAlphas(0,fPFParticles,fPFParticles,fChargedPV);
213 std::vector<double> pVals;
214 for(
int i0 = 0; i0 < lNParticles; i0++) {
219 int pPupId = getPuppiId(fRecoParticles[i0].
pt,fRecoParticles[i0].
eta);
221 fWeights .push_back(pWeight);
222 fAlphaMed.push_back(-10);
223 fAlphaRMS.push_back(-10);
230 pChi2 = getChi2FromdZ(fRecoParticles[i0].dZ);
232 if(fRecoParticles[i0].pfType > 3) pChi2 = 0;
235 int lNAlgos = fPuppiAlgo[pPupId].numAlgos();
236 for(
int i1 = 0; i1 < lNAlgos; i1++) pVals.push_back(fVals[lNParticles*i1+i0]);
238 pWeight = fPuppiAlgo[pPupId].compute(pVals,pChi2);
240 if(fRecoParticles[i0].
id == 1 && fApplyCHS ) pWeight = 1;
241 if(fRecoParticles[i0].
id == 2 && fApplyCHS ) pWeight = 0;
245 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;
248 if(pWeight < fPuppiWeightCut) pWeight = 0;
249 if(pWeight*fPFParticles[i0].
pt() < fPuppiAlgo[pPupId].neutralPt(fNPV) && fRecoParticles[i0].
id == 0 ) pWeight = 0;
250 if(fInvert) pWeight = 1.-pWeight;
253 fWeights .push_back(pWeight);
254 fAlphaMed.push_back(fPuppiAlgo[pPupId].median());
255 fAlphaRMS.push_back(fPuppiAlgo[pPupId].
rms());
263 PseudoJet curjet( pWeight*fPFParticles[i0].px(), pWeight*fPFParticles[i0].py(), pWeight*fPFParticles[i0].pz(), pWeight*fPFParticles[i0].
e() );
264 curjet.set_user_index(i0);
265 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])