19 #include "CLHEP/Vector/LorentzVector.h" 33 ECALBARRELMAXETA_=1.479;
34 ECALBARRELRADIUS_=129.0;
48 requireTrackMatch_=iConfig.
getParameter<
bool>(
"requireTrackMatch");
63 iEvent.
getByLabel(genParSource_,genParsHandle);
74 selBCtoEseeds.clear();
77 std::vector<reco::GenParticle> genParsCurved=applyBFieldCurv(genPars,iSetup);
79 PhotElecgood=filterPhotonElectronSeed(clusterThreshold_,
89 IsoGenPargood=filterIsoGenPar(isoGenParETMin_,isoGenParConeSize_,genPars,genParsCurved);
93 for (uint32_t ig=0;ig<genParsCurved.size();ig++) {
95 if (gp.
status()==1 &&
abs(gp.
pdgId())==11 && gp.
et()>eTThreshold_ && fabs(gp.
eta())<FILTER_ETA_MAX_) {
96 if (hasBCAncestors(gp)) {
98 selBCtoEseeds.push_back(gp);
104 if ( PhotElecgood> 1) {
107 else if ( IsoGenPargood> 1) {
110 else if ( BCtoEgood > 1) {
113 else if ( PhotElecgood==1 && IsoGenPargood==1) {
114 if ( (sel1seeds.at(0).eta()!=sel2seeds.at(0).eta()) && (sel1seeds.at(0).phi()!=sel2seeds.at(0).phi()) && (sel1seeds.at(0).et()!=sel2seeds.at(0).et()) ) result =
true;
116 else if ( PhotElecgood==1 && BCtoEgood==1) {
117 if ( (sel1seeds.at(0).eta()!=selBCtoEseeds.at(0).eta()) && (sel1seeds.at(0).phi()!=selBCtoEseeds.at(0).phi()) && (sel1seeds.at(0).et()!=selBCtoEseeds.at(0).et()) ) result =
true;
119 else if ( BCtoEgood==1 && IsoGenPargood==1) {
120 if ( (selBCtoEseeds.at(0).eta()!=sel2seeds.at(0).eta()) && (selBCtoEseeds.at(0).phi()!=sel2seeds.at(0).phi()) && (selBCtoEseeds.at(0).et()!=sel2seeds.at(0).et()) ) result =
true;
141 bool requiretrackmatch,
142 const std::vector<reco::GenParticle> &genPars,
143 const std::vector<reco::GenParticle> &genParsCurved) {
145 float conesizeendcap=15;
149 vector<reco::GenParticle> seeds;
151 for (uint32_t is=0;is<genParsCurved.size();is++) {
153 if (gp.
status()!=1 || fabs(gp.
eta()) > FILTER_ETA_MAX_ || fabs(gp.
eta()) < FILTER_ETA_MIN_)
continue;
155 if (absid!=11 && absid!=22)
continue;
156 if (gp.
et()>seedthreshold) seeds.push_back(gp);
159 bool matchtrack=
false;
162 for (uint32_t is=0;is<seeds.size();is++) {
167 bool isBarrel=fabs(seeds.at(is).eta())<ECALBARRELMAXETA_;
168 for (uint32_t ig=0;ig<genParsCurved.size();ig++) {
171 if (gp.
status()!=1)
continue;
173 if (gp.
et()<1)
continue;
178 float deta=fabs(seeds.at(is).eta()-gp.
eta());
179 if (deta<0.03 && dphi<0.2) {
180 if (gpabsid==22 || gpabsid==11 || gpabsid==211 || gpabsid==321) {
184 if ((gpabsid==11 || gpabsid==211 || gpabsid==321) && gp.
et()>5) matchtrack=
true;
190 float drUnCurv=
deltaR(seeds.at(is),gpUnCurv);
191 if ((gp.
charge()==0 && dr<isoConeSize && gpabsid!=22) ||
192 (gp.
charge()!=0 && drUnCurv<isoConeSize)) {
196 if (gp.
charge()!=0 && drUnCurv<isoConeSize) {
203 float drxy=deltaRxyAtEE(seeds.at(is),
gp);
205 if (drxy<conesizeendcap) {
206 if (gpabsid==22 || gpabsid==11 || gpabsid==211 || gpabsid==321) {
210 if ((gpabsid==11 || gpabsid==211 || gpabsid==321) && gp.
et()>5) matchtrack=
true;
216 float drUnCurv=
deltaR(seeds.at(is),gpUnCurv);
217 if ((gp.
charge()==0 && dr<isoConeSize && gpabsid!=22) ||
218 (gp.
charge()!=0 && drUnCurv<isoConeSize)) {
222 if (gp.
charge()!=0 && drUnCurv<isoConeSize) {
230 if (eTInCone>clusterthreshold && (!requiretrackmatch || matchtrack)) {
232 if (hadET/eTInCone<hOverEMax && tkIsoET<tkIsoMax && caloIsoET<caloIsoMax) {
234 sel1seeds.push_back(seeds[is]);
251 vector<reco::GenParticle> curvedPars;
262 for (uint32_t ig=0;ig<genPars.size();ig++) {
268 curvedPars.push_back(gp);
276 if (fabs(gp.
eta())<ECALBARRELMAXETA_) {
277 impact=propagator.propagate(fts,*theBarrel);
278 }
else if (gp.
eta()>0) {
279 impact=propagator.propagate(fts,*endCapPlus);
281 impact=propagator.propagate(fts,*endCapMinus);
285 if (!impact.isValid()) {
286 curvedPars.push_back(gp);
295 float phinew=impact.globalPosition().phi();
296 float pxnew=et*
cos(phinew);
297 float pynew=et*
sin(phinew);
300 newp4.SetPz(gp.
pz());
304 curvedPars.push_back(gpnew);
315 if (gp1.
pz()*gp2.
pz() < 0)
return 9999.;
317 float rxy1=ECALENDCAPZ_*
tan(gp1.
theta());
319 float y1=
sin(gp1.
phi())*rxy1;
321 float rxy2=ECALENDCAPZ_*
tan(gp2.
theta());
323 float y2=
sin(gp2.
phi())*rxy2;
325 float dxy=
sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
343 for (uint32_t ip=0;ip<gph.size();ip++) {
349 if (gp.
et()<=etmin || gp.
status()!=1)
continue;
350 if (gpabsid!=11 && gpabsid != 211 && gpabsid!= 321)
continue;
351 if (fabs(gp.
eta()) < FILTER_ETA_MIN_)
continue;
352 if (fabs(gp.
eta()) > FILTER_ETA_MAX_)
continue;
357 for (uint32_t jp=0;jp<gph.size();jp++) {
358 if (jp==ip)
continue;
361 if (pp.
status() != 1)
continue;
363 float drCurved=
deltaR(gpCurved,ppCurved);
364 if (
abs(pp.
charge())==1 && pp.
et()>2 && dr<conesize) {
367 if (pp.
et()>2 &&
abs(pp.
pdgId())!=22 && drCurved<conesize) {
371 if (tkiso<FILTER_TKISOCUT_ && caloiso<FILTER_CALOISOCUT_) {
372 sel2seeds.push_back(gpCurved);
385 if (isBCHadron(gp))
return true;
391 retval=retval || hasBCAncestors(*gp.
motherRef(im));
398 return isBCMeson(gp) || isBCBaryon(gp);
404 uint32_t hundreds=pdgid%1000;
405 if (hundreds>=400 && hundreds<600) {
416 uint32_t thousands=pdgid%10000;
417 if (thousands>=4000 && thousands <6000) {
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
int filterIsoGenPar(float etmin, float conesize, const reco::GenParticleCollection &gph, const reco::GenParticleCollection &gphCurved)
double theta() const final
momentum polar angle
double vy() const override
y coordinate of vertex position
bool isBarrel(GeomDetEnumerators::SubDetector m)
double px() const final
x coordinate of momentum vector
Sin< T >::type sin(const T &t)
size_t numberOfMothers() const override
number of mothers
int charge() const final
electric charge
bool isBCBaryon(const reco::GenParticle &gp)
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
double pz() const final
z coordinate of momentum vector
static PlanePointer build(Args &&...args)
bool isBCMeson(const reco::GenParticle &gp)
Cos< T >::type cos(const T &t)
bool isBCHadron(const reco::GenParticle &gp)
double energy() const final
energy
bool hasBCAncestors(const reco::GenParticle &gp)
Tan< T >::type tan(const T &t)
Abs< T >::type abs(const T &t)
std::vector< reco::GenParticle > applyBFieldCurv(const std::vector< reco::GenParticle > &genPars, const edm::EventSetup &iSetup)
daughters::value_type motherRef(size_type i=0) const
reference to mother at given position
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
~doubleEMEnrichingFilterAlgo()
double vz() const override
z coordinate of vertex position
int filterPhotonElectronSeed(float clusterthreshold, float seedthreshold, float isoConeSize, float hOverEMax, float tkIsoMax, float caloIsoMax, bool requiretrackmatch, const std::vector< reco::GenParticle > &genPars, const std::vector< reco::GenParticle > &genParsCurved)
double py() const final
y coordinate of momentum vector
et
define resolution functions of each parameter
float deltaRxyAtEE(const reco::GenParticle &gp1, const reco::GenParticle &gp2)
int status() const final
status word
bool filter(const edm::Event &iEvent, const edm::EventSetup &iSetup)
double phi() const final
momentum azimuthal angle
doubleEMEnrichingFilterAlgo(const edm::ParameterSet &)
void setP4(const LorentzVector &p4) final
set 4-momentum
double vx() const override
x coordinate of vertex position