66 std::vector<bool>::const_iterator actIter = active.begin();
70 if(elements.
size() != active.size()) {
78 std::vector<unsigned int> elemsToLock;
79 elemsToLock.resize(0);
81 for( ; ele != elements.
end(); ++ele, ++actIter ) {
87 float photonEnergy_ = 0.;
91 float RawEcalEne = 0.;
97 bool hasConvTrack=
false;
98 bool hasSingleleg=
false;
99 std::vector<unsigned int> AddClusters(0);
100 std::vector<unsigned int> IsoTracks(0);
101 std::multimap<unsigned int, unsigned int>ClusterAddPS1;
102 std::multimap<unsigned int, unsigned int>ClusterAddPS2;
104 isActive = *(actIter);
117 elemsToLock.push_back(ele-elements.
begin());
119 std::multimap<double, unsigned int> ecalAssoPFClusters;
120 blockRef->associatedElements( ele-elements.
begin(),
127 if( ! ecalAssoPFClusters.size() ) {
135 for(std::multimap<double, unsigned int>::iterator itecal = ecalAssoPFClusters.begin();
136 itecal != ecalAssoPFClusters.end(); ++itecal) {
147 vector<double> ps1Ene(0);
148 vector<double> ps2Ene(0);
163 if( !( active[itecal->second] ) ) {
175 bool isClosest=
false;
176 std::multimap<double, unsigned int> Trackscheck;
177 blockRef->associatedElements( itecal->second,
182 for(std::multimap<double, unsigned int>::iterator track = Trackscheck.begin();
183 track != Trackscheck.end(); ++track) {
186 if( ! (active[track->second]) )
continue;
189 std::multimap<double, unsigned int> closecheck;
190 blockRef->associatedElements(track->second,
193 reco::PFBlockElement::ECAL,
195 if(closecheck.begin()->second ==itecal->second)isClosest=
true;
196 if(!hasSingleleg)mva_reject++;
199 if(mva_reject>0 && isClosest)useIt=
false;
201 if( !useIt )
continue;
206 elemsToLock.push_back(itecal->second);
209 std::multimap<double, unsigned int> PS1Elems;
210 std::multimap<double, unsigned int> PS2Elems;
212 blockRef->associatedElements( itecal->second,
218 blockRef->associatedElements( itecal->second,
225 for(std::multimap<double, unsigned int>::iterator iteps = PS1Elems.begin();
226 iteps != PS1Elems.end(); ++iteps) {
229 if( !(active[iteps->second]) )
continue;
232 std::multimap<double, unsigned int> ECALPS1check;
233 blockRef->associatedElements( iteps->second,
236 reco::PFBlockElement::ECAL,
238 if(itecal->second==ECALPS1check.begin()->second)
241 ps1Ene.
push_back( ps1ClusterRef->energy() );
242 ps1=ps1+ps1ClusterRef->energy();
244 elemsToLock.push_back(iteps->second);
247 for(std::multimap<double, unsigned int>::iterator iteps = PS2Elems.begin();
248 iteps != PS2Elems.end(); ++iteps) {
251 if( !(active[iteps->second]) )
continue;
254 std::multimap<double, unsigned int> ECALPS2check;
255 blockRef->associatedElements( iteps->second,
258 reco::PFBlockElement::ECAL,
260 if(itecal->second==ECALPS2check.begin()->second)
263 ps2Ene.
push_back( ps2ClusterRef->energy() );
264 ps2=ps2ClusterRef->energy()+ps2;
266 elemsToLock.push_back(iteps->second);
271 std::multimap<double, unsigned int> hcalElems;
272 blockRef->associatedElements( itecal->second,linkData,
277 for(std::multimap<double, unsigned int>::iterator ithcal = hcalElems.begin();
278 ithcal != hcalElems.end(); ++ithcal) {
280 if ( ! (active[ithcal->second] ) )
continue;
286 bool useHcal =
false;
287 if ( !useHcal )
continue;
295 std::multimap<double, unsigned int>
convTracks;
296 blockRef->associatedElements( itecal->second,
301 for(std::multimap<double, unsigned int>::iterator track = convTracks.begin();
302 track != convTracks.end(); ++track) {
305 if( ! (active[track->second]) )
continue;
318 for(
unsigned int i=0;
i<IsoTracks.size();
i++)
319 {
if(IsoTracks[
i]==track->second)included=
true;}
320 if(!included)IsoTracks.push_back(track->second);
325 elemsToLock.push_back(track->second);
327 std::multimap<double, unsigned int> moreClusters;
328 blockRef->associatedElements( track->second,
331 reco::PFBlockElement::ECAL,
334 float p_in=
sqrt(elements[track->second].trackRef()->innerMomentum().x() * elements[track->second].trackRef()->innerMomentum().x() +
335 elements[track->second].trackRef()->innerMomentum().y()*elements[track->second].trackRef()->innerMomentum().y()+
336 elements[track->second].trackRef()->innerMomentum().z()*elements[track->second].trackRef()->innerMomentum().z());
338 for(std::multimap<double, unsigned int>::iterator clust = moreClusters.begin();
339 clust != moreClusters.end(); ++clust)
341 if(!active[clust->second])
continue;
343 linked_E=linked_E+elements[clust->second].clusterRef()->energy();
345 if(linked_E/p_in>1.5)
break;
348 for(std::multimap<double, unsigned int>::iterator cluscheck = ecalAssoPFClusters.begin();
349 cluscheck != ecalAssoPFClusters.end(); ++cluscheck)
351 if(cluscheck->second==clust->second)included=
true;
353 if(!included)AddClusters.
push_back(clust->second);
361 elemsToLock.push_back(track->second);
363 std::multimap<double, unsigned int> moreClusters;
364 blockRef->associatedElements( track->second,
367 reco::PFBlockElement::ECAL,
370 float p_in=
sqrt(elements[track->second].trackRef()->innerMomentum().x() * elements[track->second].trackRef()->innerMomentum().x() +
371 elements[track->second].trackRef()->innerMomentum().y()*elements[track->second].trackRef()->innerMomentum().y()+
372 elements[track->second].trackRef()->innerMomentum().z()*elements[track->second].trackRef()->innerMomentum().z());
374 for(std::multimap<double, unsigned int>::iterator clust = moreClusters.begin();
375 clust != moreClusters.end(); ++clust)
377 if(!active[clust->second])
continue;
378 linked_E=linked_E+elements[clust->second].clusterRef()->energy();
379 if(linked_E/p_in>1.5)
break;
381 for(std::multimap<double, unsigned int>::iterator cluscheck = ecalAssoPFClusters.begin();
382 cluscheck != ecalAssoPFClusters.end(); ++cluscheck)
384 if(cluscheck->second==clust->second)included=
true;
386 if(!included)AddClusters.
push_back(clust->second);
392 std::multimap<double, unsigned int> moreTracks;
393 blockRef->associatedElements( track->second,
399 for(std::multimap<double, unsigned int>::iterator track2 = moreTracks.begin();
400 track2 != moreTracks.end(); ++track2) {
403 if( ! (active[track2->second]) )
continue;
405 if(track->second==track2->second)
continue;
409 elemsToLock.push_back(track2->second);
412 std::multimap<double, unsigned int> convEcal;
413 blockRef->associatedElements( track2->second,
416 reco::PFBlockElement::ECAL,
418 float p_in=
sqrt(elements[track->second].trackRef()->innerMomentum().x()*elements[track->second].trackRef()->innerMomentum().x()+
419 elements[track->second].trackRef()->innerMomentum().y()*elements[track->second].trackRef()->innerMomentum().y()+
420 elements[track->second].trackRef()->innerMomentum().z()*elements[track->second].trackRef()->innerMomentum().z());
424 for(std::multimap<double, unsigned int>::iterator itConvEcal = convEcal.begin();
425 itConvEcal != convEcal.end(); ++itConvEcal) {
427 if( ! (active[itConvEcal->second]) )
continue;
429 for(std::multimap<double, unsigned int>::iterator cluscheck = ecalAssoPFClusters.begin();
430 cluscheck != ecalAssoPFClusters.end(); ++cluscheck)
432 if(cluscheck->second==itConvEcal->second)included=
true;
434 linked_E=linked_E+elements[itConvEcal->second].clusterRef()->energy();
435 if(linked_E/p_in>1.5)
break;
436 if(!included){AddClusters.
push_back(itConvEcal->second);
443 std::multimap<double, unsigned int> hcalElems_conv;
444 blockRef->associatedElements( itecal->second,linkData,
449 for(std::multimap<double, unsigned int>::iterator ithcal2 = hcalElems_conv.begin();
450 ithcal2 != hcalElems_conv.end(); ++ithcal2) {
452 if ( ! (active[ithcal2->second] ) )
continue;
459 if ( !useHcal )
continue;
475 float addedCalibEne=0;
477 std::vector<double>AddedPS1(0);
478 std::vector<double>AddedPS2(0);
481 for(
unsigned int i=0;
i<AddClusters.size();
i++)
483 std::multimap<double, unsigned int> PS1Elems_conv;
484 std::multimap<double, unsigned int> PS2Elems_conv;
485 blockRef->associatedElements(AddClusters[
i],
490 blockRef->associatedElements( AddClusters[i],
496 for(std::multimap<double, unsigned int>::iterator iteps = PS1Elems_conv.begin();
497 iteps != PS1Elems_conv.end(); ++iteps)
499 if(!active[iteps->second])
continue;
500 std::multimap<double, unsigned int> PS1Elems_check;
501 blockRef->associatedElements(iteps->second,
504 reco::PFBlockElement::ECAL,
506 if(PS1Elems_check.begin()->second==AddClusters[
i])
510 AddedPS1.
push_back(ps1ClusterRef->energy());
511 addedps1=addedps1+ps1ClusterRef->energy();
512 elemsToLock.push_back(iteps->second);
516 for(std::multimap<double, unsigned int>::iterator iteps = PS2Elems_conv.begin();
517 iteps != PS2Elems_conv.end(); ++iteps) {
518 if(!active[iteps->second])
continue;
519 std::multimap<double, unsigned int> PS2Elems_check;
520 blockRef->associatedElements(iteps->second,
523 reco::PFBlockElement::ECAL,
526 if(PS2Elems_check.begin()->second==AddClusters[
i])
529 AddedPS2.
push_back(ps2ClusterRef->energy());
530 addedps2=addedps2+ps2ClusterRef->energy();
531 elemsToLock.push_back(iteps->second);
535 addedRawEne = AddclusterRef->energy()+addedRawEne;
539 elemsToLock.push_back(AddClusters[i]);
546 RawEcalEne += clusterRef->energy()+addedRawEne;
547 photonX_ += EE * clusterRef->position().X();
548 photonY_ += EE * clusterRef->position().Y();
549 photonZ_ += EE * clusterRef->position().Z();
550 ps1TotEne += ps1+addedps1;
551 ps2TotEne += ps2+addedps2;
555 if( ! (photonEnergy_ > 0.) )
continue;
556 float sum_track_pt=0;
558 for(
unsigned int i=0; i<IsoTracks.size(); i++)sum_track_pt=sum_track_pt+elements[IsoTracks[i]].trackRef()->pt();
569 photonEnergy_* photonDirection.Y(),
570 photonEnergy_* photonDirection.Z(),
573 if(sum_track_pt>(2+ 0.001* photonMomentum.pt()))
587 photonCand.setPs1Energy(ps1TotEne);
588 photonCand.setPs2Energy(ps2TotEne);
589 photonCand.setEcalEnergy(RawEcalEne,photonEnergy_);
590 photonCand.setHcalEnergy(0.,0.);
591 photonCand.set_mva_nothing_gamma(1.);
603 for(std::vector<unsigned int>::const_iterator it = elemsToLock.begin();
604 it != elemsToLock.end(); ++it)
606 if(active[*it])photonCand.addElementInBlock(blockRef,*it);
611 elemsToLock.resize(0);
std::map< unsigned int, Link > LinkData
verbosityLevel verbosityLevel_
reco::Vertex primaryVertex_
std::vector< PFCandidatePtr > pfCandidates(const PFJet &jet, int particleId, bool sort=true)
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
SuperClusterRef superClusterRef() const
boost::shared_ptr< PFEnergyCalibration > thePFEnergyCalibration_
virtual bool trackType(TrackType trType) const
XYZVectorD XYZVector
spatial vector with cartesian internal representation
bool EvaluateSingleLegMVA(const reco::PFBlockRef &blockref, const reco::Vertex &primaryvtx, unsigned int track_index)
Particle reconstructed by the particle flow algorithm.