3 #include "Math/ProbFunc.h" 13 fPuppiDiagnostics = iConfig.
getParameter<
bool>(
"puppiDiagnostics");
17 fPuppiWeightCut = iConfig.
getParameter<
double>(
"MinPuppiWeight");
19 std::vector<edm::ParameterSet> lAlgos = iConfig.
getParameter<std::vector<edm::ParameterSet> >(
"algos");
20 fNAlgos = lAlgos.size();
21 for(
unsigned int i0 = 0; i0 < lAlgos.size(); i0++) {
23 fPuppiAlgo.push_back(pPuppiConfig);
29 fRecoParticles.resize(0);
30 fPFParticles .resize(0);
31 fChargedPV .resize(0);
32 fPupParticles .resize(0);
42 fRecoParticles = iRecoObjects;
43 for (
unsigned int i = 0;
i < fRecoParticles.size();
i++){
45 auto fRecoParticle = fRecoParticles[
i];
50 curPseudoJet.reset_PtYPhiM(fRecoParticle.pt,fRecoParticle.rapidity,fRecoParticle.phi,fRecoParticle.m);
52 curPseudoJet.reset_PtYPhiM(0, 99., 0, 0);
55 int puppi_register = 0;
56 if(fRecoParticle.id == 0
or fRecoParticle.charge == 0) puppi_register = 0;
57 if(fRecoParticle.id == 1 and fRecoParticle.charge != 0) puppi_register = fRecoParticle.charge;
58 if(fRecoParticle.id == 2 and fRecoParticle.charge != 0) puppi_register = fRecoParticle.charge+5;
59 curPseudoJet.
set_info( puppi_register );
61 fPFParticles.push_back(curPseudoJet);
63 if(
std::abs(fRecoParticle.id) == 1) fChargedPV.push_back(curPseudoJet);
64 if(
std::abs(fRecoParticle.id) >= 1 ) fPVFrac+=1.;
70 if (fPVFrac != 0) fPVFrac = double(fChargedPV.size())/fPVFrac;
76 return var_within_R(iOpt,iParts,iPart,iRCone);
80 if(iId == -1)
return 1;
89 vector<double > near_dR2s; near_dR2s.reserve(
std::min(50UL, particles.size()));
90 vector<double > near_pts; near_pts.reserve(
std::min(50UL, particles.size()));
91 const double r2 = R*
R;
92 for (
auto const&
part : particles){
93 if (
part.squared_distance(centre) <
r2 ){
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);
150 if(!pCharged) curVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
151 if( pCharged) curVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
153 fPuppiAlgo[i1].add(iConstits[i0],curVal,iOpt);
157 for(
int i0 = 0; i0 < fNAlgos; i0++) fPuppiAlgo[i0].computeMedRMS(iOpt,fPVFrac);
160 void PuppiContainer::getRawAlphas(
int iOpt,std::vector<PuppiCandidate>
const &iConstits,std::vector<PuppiCandidate>
const &iParticles,std::vector<PuppiCandidate>
const &iChargedParticles) {
161 for(
int j0 = 0; j0 < fNAlgos; j0++){
162 for(
unsigned int i0 = 0; i0 < iConstits.size(); i0++ ) {
165 int pAlgo = fPuppiAlgo[j0].algoId (iOpt);
166 bool pCharged = fPuppiAlgo[j0].isCharged(iOpt);
167 double pCone = fPuppiAlgo[j0].coneSize (iOpt);
169 if(!pCharged) pVal = goodVar(iConstits[i0],iParticles ,pAlgo,pCone);
170 if( pCharged) pVal = goodVar(iConstits[i0],iChargedParticles,pAlgo,pCone);
171 fRawAlphas.push_back(pVal);
173 LogDebug(
"NotFound" ) <<
"====> Value is Nan " << pVal <<
" == " << iConstits[i0].pt() <<
" -- " << iConstits[i0].eta() << endl;
181 for(
int i0 = 0; i0 < fNAlgos; i0++) {
182 int nEtaBinsPerAlgo = fPuppiAlgo[i0].etaBins();
183 for (
int i1 = 0; i1 < nEtaBinsPerAlgo; i1++){
185 fPuppiAlgo[i0].fixAlgoEtaBin( i1 );
186 if(iPt > fPuppiAlgo[i0].
ptMin()){
201 double lProbLV = ROOT::Math::normal_cdf_c(
std::abs(iDZ),1.)*2.;
202 double lProbPU = 1-lProbLV;
203 if(lProbPU <= 0) lProbPU = 1
e-16;
204 if(lProbPU >= 0) lProbPU = 1-1
e-16;
205 double lChi2PU = TMath::ChisquareQuantile(lProbPU,1);
210 fPupParticles .resize(0);
213 for(
int i0 = 0; i0 < fNAlgos; i0++) fPuppiAlgo[i0].
reset();
216 for(
int i0 = 0; i0 < fNAlgos; i0++) lNMaxAlgo =
std::max(fPuppiAlgo[i0].numAlgos(),lNMaxAlgo);
218 int lNParticles = fRecoParticles.size();
219 for(
int i0 = 0; i0 < lNMaxAlgo; i0++) {
220 getRMSAvg(i0,fPFParticles,fPFParticles,fChargedPV);
222 if (fPuppiDiagnostics) getRawAlphas(0,fPFParticles,fPFParticles,fChargedPV);
224 std::vector<double> pVals;
225 for(
int i0 = 0; i0 < lNParticles; i0++) {
230 int pPupId = getPuppiId(fRecoParticles[i0].
pt,fRecoParticles[i0].
eta);
232 fWeights .push_back(pWeight);
233 fAlphaMed.push_back(-10);
234 fAlphaRMS.push_back(-10);
241 pChi2 = getChi2FromdZ(fRecoParticles[i0].dZ);
243 if(fRecoParticles[i0].pfType > 3) pChi2 = 0;
246 int lNAlgos = fPuppiAlgo[pPupId].numAlgos();
247 for(
int i1 = 0; i1 < lNAlgos; i1++) pVals.push_back(fVals[lNParticles*i1+i0]);
249 pWeight = fPuppiAlgo[pPupId].compute(pVals,pChi2);
251 if(fRecoParticles[i0].
id == 1 && fApplyCHS ) pWeight = 1;
252 if(fRecoParticles[i0].
id == 2 && fApplyCHS ) pWeight = 0;
256 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;
259 if(pWeight*fPFParticles[i0].
pt() < fPuppiAlgo[pPupId].neutralPt(fNPV) && fRecoParticles[i0].
id == 0 ) pWeight = 0;
260 if((fPtMax>0) && (fRecoParticles[i0].
id == 0)) pWeight=
min(
max(pWeight,fPFParticles[i0].
pt()/fPtMax),1.);
261 if(pWeight < fPuppiWeightCut) pWeight = 0;
262 if(fInvert) pWeight = 1.-pWeight;
265 fWeights .push_back(pWeight);
266 fAlphaMed.push_back(fPuppiAlgo[pPupId].
median());
267 fAlphaRMS.push_back(fPuppiAlgo[pPupId].
rms());
275 PuppiCandidate curjet( pWeight*fPFParticles[i0].px(), pWeight*fPFParticles[i0].py(), pWeight*fPFParticles[i0].pz(), pWeight*fPFParticles[i0].
e() );
276 curjet.set_user_index(i0);
277 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)
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])