3 #include "fastjet/internal/base.hh" 4 #include "fastjet/FunctionOfPseudoJet.hh" 5 #include "Math/ProbFunc.h" 16 fPuppiDiagnostics = iConfig.
getParameter<
bool>(
"puppiDiagnostics");
20 fPuppiWeightCut = iConfig.
getParameter<
double>(
"MinPuppiWeight");
22 std::vector<edm::ParameterSet> lAlgos = iConfig.
getParameter<std::vector<edm::ParameterSet> >(
"algos");
23 fNAlgos = lAlgos.size();
24 for(
unsigned int i0 = 0; i0 < lAlgos.size(); i0++) {
26 fPuppiAlgo.push_back(pPuppiConfig);
32 fRecoParticles.resize(0);
33 fPFParticles .resize(0);
34 fChargedPV .resize(0);
35 fPupParticles .resize(0);
45 fRecoParticles = iRecoObjects;
46 for (
unsigned int i = 0;
i < fRecoParticles.size();
i++){
47 fastjet::PseudoJet curPseudoJet;
48 auto fRecoParticle = fRecoParticles[
i];
53 curPseudoJet.reset_PtYPhiM(fRecoParticle.pt,fRecoParticle.rapidity,fRecoParticle.phi,fRecoParticle.m);
55 curPseudoJet.reset_PtYPhiM(0, 99., 0, 0);
58 int puppi_register = 0;
59 if(fRecoParticle.id == 0
or fRecoParticle.charge == 0) puppi_register = 0;
60 if(fRecoParticle.id == 1 and fRecoParticle.charge != 0) puppi_register = fRecoParticle.charge;
61 if(fRecoParticle.id == 2 and fRecoParticle.charge != 0) puppi_register = fRecoParticle.charge+5;
62 curPseudoJet.set_user_info(
new PuppiUserInfo( puppi_register ) );
64 fPFParticles.push_back(curPseudoJet);
66 if(
std::abs(fRecoParticle.id) == 1) fChargedPV.push_back(curPseudoJet);
67 if(
std::abs(fRecoParticle.id) >= 1 ) fPVFrac+=1.;
73 if (fPVFrac != 0) fPVFrac = double(fChargedPV.size())/fPVFrac;
78 double PuppiContainer::goodVar(PseudoJet
const &iPart,std::vector<PseudoJet>
const &iParts,
int iOpt,
const double iRCone) {
80 lPup = var_within_R(iOpt,iParts,iPart,iRCone);
84 if(iId == -1)
return 1;
93 vector<double > near_dR2s; near_dR2s.reserve(
std::min(50UL, particles.size()));
94 vector<double > near_pts; near_pts.reserve(
std::min(50UL, particles.size()));
95 for (
auto const&
part : particles){
96 if (
part.squared_distance(centre) < R*
R ){
98 near_pts.push_back(
part.pt());
104 auto nParts = near_dR2s.size();
105 for(
auto i = 0UL;
i < nParts; ++
i){
106 auto dr2 = near_dR2s[
i];
107 auto pt = near_pts[
i];
108 if(dr2 < 0.0001)
continue;
109 if(iId == 0) var += (
pt/dr2);
110 else if(iId == 1) var +=
pt;
111 else if(iId == 2) var += (1./dr2);
112 else if(iId == 3) var += (1./dr2);
113 else if(iId == 4) var +=
pt;
114 else if(iId == 5) var += (
pt *
pt/dr2);
116 if(iId == 1) var += centre.pt();
117 else if(iId == 0 && var != 0) var =
log(var);
118 else if(iId == 3 && var != 0) var =
log(var);
119 else if(iId == 5 && var != 0) var =
log(var);
123 void PuppiContainer::getRMSAvg(
int iOpt,std::vector<fastjet::PseudoJet>
const &iConstits,std::vector<fastjet::PseudoJet>
const &iParticles,std::vector<fastjet::PseudoJet>
const &iChargedParticles) {
124 for(
unsigned int i0 = 0; i0 < iConstits.size(); i0++ ) {
127 int pPupId = getPuppiId(iConstits[i0].
pt(),iConstits[i0].
eta());
128 if(pPupId == -1 || fPuppiAlgo[pPupId].numAlgos() <= iOpt){
133 int pAlgo = fPuppiAlgo[pPupId].algoId (iOpt);
134 bool pCharged = fPuppiAlgo[pPupId].isCharged(iOpt);
135 double pCone = fPuppiAlgo[pPupId].coneSize (iOpt);
137 if(!pCharged) pVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
138 if( pCharged) pVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
139 fVals.push_back(pVal);
142 LogDebug(
"NotFound" ) <<
"====> Value is Nan " << pVal <<
" == " << iConstits[i0].pt() <<
" -- " << iConstits[i0].eta() << endl;
148 for(
int i1 = 0; i1 < fNAlgos; i1++){
149 pAlgo = fPuppiAlgo[i1].algoId (iOpt);
150 pCharged = fPuppiAlgo[i1].isCharged(iOpt);
151 pCone = fPuppiAlgo[i1].coneSize (iOpt);
153 if(!pCharged) curVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
154 if( pCharged) curVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
156 fPuppiAlgo[i1].add(iConstits[i0],curVal,iOpt);
160 for(
int i0 = 0; i0 < fNAlgos; i0++) fPuppiAlgo[i0].computeMedRMS(iOpt,fPVFrac);
163 void PuppiContainer::getRawAlphas(
int iOpt,std::vector<fastjet::PseudoJet>
const &iConstits,std::vector<fastjet::PseudoJet>
const &iParticles,std::vector<fastjet::PseudoJet>
const &iChargedParticles) {
164 for(
int j0 = 0; j0 < fNAlgos; j0++){
165 for(
unsigned int i0 = 0; i0 < iConstits.size(); i0++ ) {
168 int pAlgo = fPuppiAlgo[j0].algoId (iOpt);
169 bool pCharged = fPuppiAlgo[j0].isCharged(iOpt);
170 double pCone = fPuppiAlgo[j0].coneSize (iOpt);
172 if(!pCharged) pVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
173 if( pCharged) pVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
174 fRawAlphas.push_back(pVal);
176 LogDebug(
"NotFound" ) <<
"====> Value is Nan " << pVal <<
" == " << iConstits[i0].pt() <<
" -- " << iConstits[i0].eta() << endl;
184 for(
int i0 = 0; i0 < fNAlgos; i0++) {
185 int nEtaBinsPerAlgo = fPuppiAlgo[i0].etaBins();
186 for (
int i1 = 0; i1 < nEtaBinsPerAlgo; i1++){
188 fPuppiAlgo[i0].fixAlgoEtaBin( i1 );
189 if(iPt > fPuppiAlgo[i0].
ptMin()){
204 double lProbLV = ROOT::Math::normal_cdf_c(
std::abs(iDZ),1.)*2.;
205 double lProbPU = 1-lProbLV;
206 if(lProbPU <= 0) lProbPU = 1
e-16;
207 if(lProbPU >= 0) lProbPU = 1-1
e-16;
208 double lChi2PU = TMath::ChisquareQuantile(lProbPU,1);
213 fPupParticles .resize(0);
216 for(
int i0 = 0; i0 < fNAlgos; i0++) fPuppiAlgo[i0].
reset();
219 for(
int i0 = 0; i0 < fNAlgos; i0++) lNMaxAlgo =
std::max(fPuppiAlgo[i0].numAlgos(),lNMaxAlgo);
221 int lNParticles = fRecoParticles.size();
222 for(
int i0 = 0; i0 < lNMaxAlgo; i0++) {
223 getRMSAvg(i0,fPFParticles,fPFParticles,fChargedPV);
225 if (fPuppiDiagnostics) getRawAlphas(0,fPFParticles,fPFParticles,fChargedPV);
227 std::vector<double> pVals;
228 for(
int i0 = 0; i0 < lNParticles; i0++) {
233 int pPupId = getPuppiId(fRecoParticles[i0].
pt,fRecoParticles[i0].
eta);
235 fWeights .push_back(pWeight);
236 fAlphaMed.push_back(-10);
237 fAlphaRMS.push_back(-10);
244 pChi2 = getChi2FromdZ(fRecoParticles[i0].dZ);
246 if(fRecoParticles[i0].pfType > 3) pChi2 = 0;
249 int lNAlgos = fPuppiAlgo[pPupId].numAlgos();
250 for(
int i1 = 0; i1 < lNAlgos; i1++) pVals.push_back(fVals[lNParticles*i1+i0]);
252 pWeight = fPuppiAlgo[pPupId].compute(pVals,pChi2);
254 if(fRecoParticles[i0].
id == 1 && fApplyCHS ) pWeight = 1;
255 if(fRecoParticles[i0].
id == 2 && fApplyCHS ) pWeight = 0;
259 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;
262 if(pWeight < fPuppiWeightCut) pWeight = 0;
263 if(pWeight*fPFParticles[i0].
pt() < fPuppiAlgo[pPupId].neutralPt(fNPV) && fRecoParticles[i0].
id == 0 ) pWeight = 0;
264 if(fInvert) pWeight = 1.-pWeight;
266 if((fPtMax>0) && (fRecoParticles[i0].
id == 0)) pWeight=
min(
max(pWeight,fPFParticles[i0].
pt()/fPtMax),1.);
268 fWeights .push_back(pWeight);
269 fAlphaMed.push_back(fPuppiAlgo[pPupId].median());
270 fAlphaRMS.push_back(fPuppiAlgo[pPupId].
rms());
278 PseudoJet curjet( pWeight*fPFParticles[i0].px(), pWeight*fPFParticles[i0].py(), pWeight*fPFParticles[i0].pz(), pWeight*fPFParticles[i0].
e() );
279 curjet.set_user_index(i0);
280 fPupParticles.push_back(curjet);
T getParameter(std::string const &) const
std::vector< double > const & puppiWeights()
double getChi2FromdZ(double iDZ)
void getRMSAvg(int iOpt, std::vector< fastjet::PseudoJet > const &iConstits, std::vector< fastjet::PseudoJet > const &iParticles, std::vector< fastjet::PseudoJet > 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)
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 var_within_R(int iId, const std::vector< fastjet::PseudoJet > &particles, const fastjet::PseudoJet ¢re, const double R)
int getPuppiId(float iPt, float iEta)
T1 deltaR2(T1 eta1, T2 phi1, T3 eta2, T4 phi2)
double goodVar(fastjet::PseudoJet const &iPart, std::vector< fastjet::PseudoJet > const &iParts, int iOpt, const double iRCone)
void initialize(const std::vector< RecoObj > &iRecoObjects)
void reset(double vett[256])