75 tokenSim_ = consumes<std::vector<SimTrack> >(inputTagSim_);
76 tokenSimVertices_ = consumes<std::vector<SimVertex> >(inputTagSim_);
82 tokenFamosSimHits_ = consumes<edm::PCaloHitContainer>(inputTagFamosSimHits_);
83 mctruthMatchingInfo_ =
88 tokenRecTracks_ = consumes<reco::PFRecTrackCollection>(inputTagRecTracks_);
91 tokenEcalRecHitsEB_ = consumes<EcalRecHitCollection>(inputTagEcalRecHitsEB_);
94 = consumes<EcalRecHitCollection>(inputTagEcalRecHitsEE_);
101 produces<reco::PFSimParticleCollection>();
104 (
"ParticleFilter" );
106 mySimEvent =
new FSimEvent( particleFilter_ );
123 mySimEvent->initializePdt(&(*pdt));
126 LogDebug(
"PFSimParticleProducer")<<
"START event: "<<iEvent.
id().
event()
127 <<
" in run "<<iEvent.
id().
run()<<endl;
133 std::vector<unsigned> recTrackSimID;
139 typedef std::pair<double, unsigned> hitSimID;
140 typedef std::list< std::pair<double, unsigned> >::iterator ITM;
141 std::vector< std::list <hitSimID> > caloHitsEBID(62000);
142 std::vector<double> caloHitsEBTotE(62000,0.0);
144 if(mctruthMatchingInfo_){
153 = iEvent.
getByToken(tokenFamosSimHits_,pcalohits);
158 err<<
"could not find pcaloHit "<<
"famosSimHits:EcalHitsEB";
159 LogError(
"PFSimParticleProducer")<<err.str()<<endl;
169 edm::PCaloHitContainer::const_iterator it
170 = pcalohits.
product()->begin();
171 edm::PCaloHitContainer::const_iterator itend
187 if(it->energy() > 0.0) {
188 std::pair<double, unsigned> phitsimid
189 = make_pair(it->energy(),it->geantTrackId());
190 caloHitsEBID[detid.hashedIndex()].push_back(phitsimid);
191 caloHitsEBTotE[detid.hashedIndex()]
202 LogDebug(
"PFSimParticleProducer")<<
"getting PFRecTracks"<<endl;
203 iEvent.
getByToken(tokenRecTracks_, recTracks);
206 LogError(
"PFSimParticleProducer")<<err
207 <<
" cannot get collection " 208 <<
"particleFlowBlock"<<
":" 215 getSimIDs( recTracks, recTrackSimID );
220 if( processParticles_) {
222 auto pOutputPFSimParticleCollection = std::make_unique<reco::PFSimParticleCollection>();
229 err<<
"cannot find sim tracks: "<<inputTagSim_;
230 LogError(
"PFSimParticleProducer")<<err.str()<<endl;
238 found = iEvent.
getByToken(tokenSimVertices_,simVertices);
241 <<
"cannot find sim vertices: "<<inputTagSim_<<endl;
253 mySimEvent->fill( *simTracks, *simVertices );
259 for(
unsigned i=0;
i<mySimEvent->nTracks();
i++) {
274 unsigned recTrackID = 99999;
275 vector<unsigned> recHitContrib;
276 vector<double> recHitContribFrac;
278 if(mctruthMatchingInfo_){
280 for(
unsigned lo=0; lo<recTrackSimID.size();
282 if(
i == recTrackSimID[lo] ) {
294 bool found = iEvent.
getByToken(tokenEcalRecHitsEB_,
298 err<<
"could not find rechits "<< inputTagEcalRecHitsEB_;
299 LogError(
"PFSimParticleProducer")<<err.str()<<endl;
313 for(;it_rh!=itend_rh;++it_rh)
322 ITM it_phit = caloHitsEBID[rhit_hi].begin();
323 ITM itend_phit = caloHitsEBID[rhit_hi].end();
324 for(;it_phit!=itend_phit;++it_phit)
326 if(
i == it_phit->second)
330 bool alreadyin =
false;
331 for(
unsigned ihit = 0; ihit < recHitContrib.size();
333 if(detid.rawId() == recHitContrib[ihit])
337 double pcalofraction = 0.0;
338 if(caloHitsEBTotE[rhit_hi] != 0.0)
340 = (it_phit->first/caloHitsEBTotE[rhit_hi])*100.0;
343 recHitContrib.push_back(it_rh->id());
344 recHitContribFrac.push_back(pcalofraction);
375 originVtx.position().y(),
376 originVtx.position().z() );
388 particle.addPoint(pointOrig);
408 particle.addPoint(pointEnd);
412 particle.addPoint(dummy);
422 posLayer1, momLayer1);
424 particle.addPoint( layer1Pt );
430 particle.addPoint(dummy);
439 posLayer2, momLayer2);
441 particle.addPoint( layer2Pt );
447 particle.addPoint(dummy);
459 particle.addPoint( ecalPt );
465 particle.addPoint(dummy);
470 particle.addPoint(dummy);
481 posHCALin, momHCALin);
483 particle.addPoint( hcalPtin );
492 posHCALout, momHCALout);
494 particle.addPoint( hcalPtout );
503 posHOEntrance, momHOEntrance);
505 particle.addPoint( hoPtin );
513 particle.addPoint(dummy);
516 pOutputPFSimParticleCollection->push_back( particle );
524 <<
" in run "<<iEvent.
id().
run()<<endl;
528 std::vector<unsigned>& recTrackSimID )
534 for(
unsigned i=0;
i<trackh->size();
i++) {
546 = trackref->recHitsBegin();
548 = trackref->recHitsEnd();
550 it != rhitend; it++){
552 if( (*it)->isValid() ){
562 for(
unsigned int st_index=0;st_index<rechit->
nSimTrackIds();++st_index){
563 recTrackSimID.push_back(rechit->
simTrackId(st_index));
PFSimParticleProducer(const edm::ParameterSet &)
T getParameter(std::string const &) const
EventNumber_t event() const
T getUntrackedParameter(std::string const &, T const &) const
reconstructed track used as an input to particle flow
bool noEndVertex() const
no end vertex
float charge() const
charge
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
const RawParticle & hoEntrance() const
The particle at HCAL exir.
const FSimVertex & endVertex() const
end vertex
const RawParticle & hcalExit() const
The particle at HCAL exir.
double y() const
y of vertex
bool getByToken(EDGetToken token, Handle< PROD > &result) const
double z() const
z of vertex
const XYZTLorentzVector & momentum() const
Temporary (until move of SimTrack to Mathcore) - No! Actually very useful.
const RawParticle & layer1Entrance() const
The particle at Preshower Layer 1.
std::vector< EcalRecHit >::const_iterator const_iterator
const std::vector< int > & daughters() const
Vector of daughter indices.
~PFSimParticleProducer() override
double x() const
x of vertex
const reco::TrackRef & trackRef() const
void getData(T &iHolder) const
void produce(edm::Event &, const edm::EventSetup &) override
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
int hashedIndex(int ieta, int iphi)
Point of closest approach from beam axis (initial point in the case of PFSimParticle) ...
const math::XYZTLorentzVector & position() const
Temporary (until CMSSW moves to Mathcore) - No ! Actually very useful.
virtual int32_t simTrackId(size_t i) const
const RawParticle & ecalEntrance() const
The particle at ECAL entrance.
const FSimVertex & vertex() const
Origin vertex.
true particle for particle flow
const_iterator end() const
T const * product() const
XYZPointD XYZPoint
point in space with cartesian internal representation
virtual size_t nSimTrackIds() const
int type() const
particle type (HEP PDT convension)
int id() const
the index in FBaseSimEvent and other vectors
const RawParticle & layer2Entrance() const
The particle at Preshower Layer 2.
bool noMother() const
no mother particle
const RawParticle & hcalEntrance() const
The particle at HCAL entrance.
A PFTrack holds several trajectory points, which basically contain the position and momentum of a tra...
void getSimIDs(const TrackHandle &trackh, std::vector< unsigned > &recTrackSimID)
const FSimTrack & mother() const
mother
const_iterator begin() const