75 tokenSim_ = consumes<std::vector<SimTrack> >(inputTagSim_);
76 tokenSimVertices_ = consumes<std::vector<SimVertex> >(inputTagSim_);
82 tokenFastSimProducer_ = consumes<edm::PCaloHitContainer>(inputTagFastSimProducer_);
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(tokenFastSimProducer_,pcalohits);
158 err<<
"could not find pcaloHit "<<
"fastSimProducer:EcalHitsEB";
159 LogError(
"PFSimParticleProducer")<<err.str()<<endl;
166 edm::PCaloHitContainer::const_iterator it
167 = pcalohits.
product()->begin();
168 edm::PCaloHitContainer::const_iterator itend
176 if(it->energy() > 0.0) {
177 std::pair<double, unsigned> phitsimid
178 = make_pair(it->energy(),it->geantTrackId());
179 caloHitsEBID[detid.hashedIndex()].push_back(phitsimid);
180 caloHitsEBTotE[detid.hashedIndex()]
191 LogDebug(
"PFSimParticleProducer")<<
"getting PFRecTracks"<<endl;
192 iEvent.
getByToken(tokenRecTracks_, recTracks);
195 LogError(
"PFSimParticleProducer")<<err
196 <<
" cannot get collection " 197 <<
"particleFlowBlock"<<
":" 204 getSimIDs( recTracks, recTrackSimID );
209 if( processParticles_) {
211 auto pOutputPFSimParticleCollection = std::make_unique<reco::PFSimParticleCollection>();
218 err<<
"cannot find sim tracks: "<<inputTagSim_;
219 LogError(
"PFSimParticleProducer")<<err.str()<<endl;
227 found = iEvent.
getByToken(tokenSimVertices_,simVertices);
230 <<
"cannot find sim vertices: "<<inputTagSim_<<endl;
234 mySimEvent->fill( *simTracks, *simVertices );
239 for(
unsigned i=0;
i<mySimEvent->nTracks();
i++) {
251 unsigned recTrackID = 99999;
252 vector<unsigned> recHitContrib;
253 vector<double> recHitContribFrac;
255 if(mctruthMatchingInfo_){
257 for(
unsigned lo=0; lo<recTrackSimID.size();
259 if(
i == recTrackSimID[lo] ) {
267 bool found = iEvent.
getByToken(tokenEcalRecHitsEB_,
271 err<<
"could not find rechits "<< inputTagEcalRecHitsEB_;
272 LogError(
"PFSimParticleProducer")<<err.str()<<endl;
284 for(;it_rh!=itend_rh;++it_rh)
290 ITM it_phit = caloHitsEBID[rhit_hi].begin();
291 ITM itend_phit = caloHitsEBID[rhit_hi].end();
292 for(;it_phit!=itend_phit;++it_phit)
294 if(
i == it_phit->second)
298 bool alreadyin =
false;
299 for(
unsigned ihit = 0; ihit < recHitContrib.size();
301 if(detid.rawId() == recHitContrib[ihit])
305 double pcalofraction = 0.0;
306 if(caloHitsEBTotE[rhit_hi] != 0.0)
308 = (it_phit->first/caloHitsEBTotE[rhit_hi])*100.0;
311 recHitContrib.push_back(it_rh->id());
312 recHitContribFrac.push_back(pcalofraction);
336 originVtx.position().y(),
337 originVtx.position().z() );
349 particle.addPoint(pointOrig);
366 particle.addPoint(pointEnd);
370 particle.addPoint(dummy);
380 posLayer1, momLayer1);
382 particle.addPoint( layer1Pt );
388 particle.addPoint(dummy);
397 posLayer2, momLayer2);
399 particle.addPoint( layer2Pt );
405 particle.addPoint(dummy);
417 particle.addPoint( ecalPt );
423 particle.addPoint(dummy);
428 particle.addPoint(dummy);
439 posHCALin, momHCALin);
441 particle.addPoint( hcalPtin );
450 posHCALout, momHCALout);
452 particle.addPoint( hcalPtout );
461 posHOEntrance, momHOEntrance);
463 particle.addPoint( hoPtin );
471 particle.addPoint(dummy);
474 pOutputPFSimParticleCollection->push_back( particle );
482 <<
" in run "<<iEvent.
id().
run()<<endl;
486 std::vector<unsigned>& recTrackSimID )
491 for(
unsigned i=0;
i<trackh->size();
i++) {
498 = trackref->recHitsBegin();
500 = trackref->recHitsEnd();
502 it != rhitend; it++){
504 if( (*it)->isValid() ){
509 for(
unsigned int st_index=0;st_index<rechit->
nSimTrackIds();++st_index){
510 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.
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...
const FSimVertex vertex() const
Origin vertex.
void getSimIDs(const TrackHandle &trackh, std::vector< unsigned > &recTrackSimID)
const FSimTrack & mother() const
mother
const_iterator begin() const