19 #include "CLHEP/Vector/LorentzVector.h" 33 ECALBARRELMAXETA_=1.479;
34 ECALBARRELRADIUS_=129.0;
46 requireTrackMatch_=iConfig.
getParameter<
bool>(
"requireTrackMatch");
61 iEvent.
getByToken(genParSourceToken_,genParsHandle);
65 std::vector<reco::GenParticle> genParsCurved=applyBFieldCurv(genPars,iSetup);
67 bool result1=filterPhotonElectronSeed(clusterThreshold_,
76 bool result2=filterIsoGenPar(isoGenParETMin_,isoGenParConeSize_,genPars,genParsCurved);
79 bool result=result1 || result2;
98 bool requiretrackmatch,
99 const std::vector<reco::GenParticle> &genPars,
100 const std::vector<reco::GenParticle> &genParsCurved) {
102 float seedthreshold=5;
103 float conesizeendcap=15;
107 vector<reco::GenParticle> seeds;
109 for (uint32_t is=0;is<genParsCurved.size();is++) {
111 if (gp.
status()!=1 || fabs(gp.
eta()) > FILTER_ETA_MAX_ || fabs(gp.
eta()) < FILTER_ETA_MIN_)
continue;
113 if (absid!=11 && absid!=22)
continue;
114 if (gp.
et()>seedthreshold) seeds.push_back(gp);
117 bool matchtrack=
false;
120 for (uint32_t is=0;is<seeds.size();is++) {
125 bool isBarrel=fabs(seeds.at(is).eta())<ECALBARRELMAXETA_;
126 for (uint32_t ig=0;ig<genParsCurved.size();ig++) {
129 if (gp.
status()!=1)
continue;
131 if (gp.
et()<1)
continue;
136 float deta=fabs(seeds.at(is).eta()-gp.
eta());
137 if (deta<0.03 && dphi<0.2) {
138 if (gpabsid==22 || gpabsid==11 || gpabsid==211 || gpabsid==321) {
142 if ((gpabsid==11 || gpabsid==211 || gpabsid==321) && gp.
et()>5) matchtrack=
true;
148 float drUnCurv=
deltaR(seeds.at(is),gpUnCurv);
149 if ((gp.
charge()==0 && dr<isoConeSize && gpabsid!=22) ||
150 (gp.
charge()!=0 && drUnCurv<isoConeSize)) {
154 if (gp.
charge()!=0 && drUnCurv<isoConeSize) {
161 float drxy=deltaRxyAtEE(seeds.at(is),
gp);
163 if (drxy<conesizeendcap) {
164 if (gpabsid==22 || gpabsid==11 || gpabsid==211 || gpabsid==321) {
168 if ((gpabsid==11 || gpabsid==211 || gpabsid==321) && gp.
et()>5) matchtrack=
true;
174 float drUnCurv=
deltaR(seeds.at(is),gpUnCurv);
175 if ((gp.
charge()==0 && dr<isoConeSize && gpabsid!=22) ||
176 (gp.
charge()!=0 && drUnCurv<isoConeSize)) {
180 if (gp.
charge()!=0 && drUnCurv<isoConeSize) {
188 if (eTInCone>clusterthreshold && (!requiretrackmatch || matchtrack)) {
190 if (hadET/eTInCone<hOverEMax && tkIsoET<tkIsoMax && caloIsoET<caloIsoMax) retval=
true;
206 vector<reco::GenParticle> curvedPars;
217 for (uint32_t ig=0;ig<genPars.size();ig++) {
223 curvedPars.push_back(gp);
231 if (fabs(gp.
eta())<ECALBARRELMAXETA_) {
232 impact=propagator.propagate(fts,*theBarrel);
233 }
else if (gp.
eta()>0) {
234 impact=propagator.propagate(fts,*endCapPlus);
236 impact=propagator.propagate(fts,*endCapMinus);
240 if (!impact.isValid()) {
241 curvedPars.push_back(gp);
250 float phinew=impact.globalPosition().phi();
251 float pxnew=et*
cos(phinew);
252 float pynew=et*
sin(phinew);
255 newp4.SetPz(gp.
pz());
259 curvedPars.push_back(gpnew);
270 if (gp1.
pz()*gp2.
pz() < 0)
return 9999.;
272 float rxy1=ECALENDCAPZ_*
tan(gp1.
theta());
274 float y1=
sin(gp1.
phi())*rxy1;
276 float rxy2=ECALENDCAPZ_*
tan(gp2.
theta());
278 float y2=
sin(gp2.
phi())*rxy2;
280 float dxy=
sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
297 for (uint32_t ip=0;ip<gph.size();ip++) {
303 if (gp.
et()<=etmin || gp.
status()!=1)
continue;
304 if (gpabsid!=11 && gpabsid != 211 && gpabsid!= 321)
continue;
305 if (fabs(gp.
eta()) < FILTER_ETA_MIN_)
continue;
306 if (fabs(gp.
eta()) > FILTER_ETA_MAX_)
continue;
311 for (uint32_t jp=0;jp<gph.size();jp++) {
312 if (jp==ip)
continue;
315 if (pp.
status() != 1)
continue;
317 float drCurved=
deltaR(gpCurved,ppCurved);
318 if (
abs(pp.
charge())==1 && pp.
et()>2 && dr<conesize) {
321 if (pp.
et()>2 &&
abs(pp.
pdgId())!=22 && drCurved<conesize) {
325 if (tkiso<FILTER_TKISOCUT_ && caloiso<FILTER_CALOISOCUT_)
return true;
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
T getParameter(std::string const &) const
int pdgId() const final
PDG identifier.
double eta() const final
momentum pseudorapidity
double theta() const final
momentum polar angle
double vy() const override
y coordinate of vertex position
bool getByToken(EDGetToken token, Handle< PROD > &result) const
bool isBarrel(GeomDetEnumerators::SubDetector m)
double px() const final
x coordinate of momentum vector
Sin< T >::type sin(const T &t)
float deltaRxyAtEE(const reco::GenParticle &gp1, const reco::GenParticle &gp2)
int charge() const final
electric charge
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
static CylinderPointer build(const PositionType &pos, const RotationType &rot, Scalar radius, Bounds *bounds=0)
double et() const final
transverse energy
EMEnrichingFilterAlgo(const edm::ParameterSet &, edm::ConsumesCollector &&)
double pz() const final
z coordinate of momentum vector
bool filterIsoGenPar(float etmin, float conesize, const reco::GenParticleCollection &gph, const reco::GenParticleCollection &gphCurved)
static PlanePointer build(Args &&...args)
Cos< T >::type cos(const T &t)
double energy() const final
energy
Tan< T >::type tan(const T &t)
Abs< T >::type abs(const T &t)
bool filter(const edm::Event &iEvent, const edm::EventSetup &iSetup)
double vz() const override
z coordinate of vertex position
double py() const final
y coordinate of momentum vector
et
define resolution functions of each parameter
int status() const final
status word
std::vector< reco::GenParticle > applyBFieldCurv(const std::vector< reco::GenParticle > &genPars, const edm::EventSetup &iSetup)
double phi() const final
momentum azimuthal angle
bool filterPhotonElectronSeed(float clusterthreshold, float isoConeSize, float hOverEMax, float tkIsoMax, float caloIsoMax, bool requiretrackmatch, const std::vector< reco::GenParticle > &genPars, const std::vector< reco::GenParticle > &genParsCurved)
void setP4(const LorentzVector &p4) final
set 4-momentum
double vx() const override
x coordinate of vertex position