75 struct DecayChainTrack
78 struct DecayChainVertex* pParentVertex;
80 std::vector<struct DecayChainVertex*> daughterVertices;
81 DecayChainTrack* pMergedBremSource;
82 DecayChainTrack() : simTrackIndex(-1), pParentVertex(
NULL), pMergedBremSource(
NULL) {}
83 DecayChainTrack(
int newSimTrackIndex ) : simTrackIndex(newSimTrackIndex), pParentVertex(
NULL), pMergedBremSource() {}
90 struct DecayChainVertex
93 DecayChainTrack* pParentTrack;
94 std::vector<DecayChainTrack*> daughterTracks;
95 DecayChainVertex* pMergedBremSource;
96 DecayChainVertex() : simVertexIndex(-1), pParentTrack(
NULL), pMergedBremSource(
NULL) {}
97 DecayChainVertex(
int newIndex ) : simVertexIndex(newIndex), pParentTrack(
NULL), pMergedBremSource(
NULL) {}
114 const size_t decayTracksSize;
115 const size_t decayVerticesSize;
121 void integrityCheck();
122 const SimTrack& getSimTrack( const ::DecayChainTrack* pDecayTrack )
const {
return simTrackCollection_.at( pDecayTrack->simTrackIndex ); }
123 const SimVertex& getSimVertex( const ::DecayChainVertex* pDecayVertex )
const {
return simVertexCollection_.at( pDecayVertex->simVertexIndex ); }
126 std::unique_ptr< ::DecayChainTrack[]> decayTracks_;
127 std::unique_ptr< ::DecayChainVertex[]> decayVertices_;
130 std::vector< ::DecayChainVertex*> rootVertices_;
133 const std::vector<SimTrack>& simTrackCollection_;
134 const std::vector<SimVertex>& simVertexCollection_;
136 const std::unique_ptr< ::DecayChainTrack[]>& decayTracks;
137 const std::unique_ptr< ::DecayChainVertex[]>& decayVertices;
138 const std::vector< ::DecayChainVertex*>& rootVertices;
145 class TrackingParticleFactory
148 TrackingParticleFactory( const ::DecayChain& decayChain,
const edm::Handle< std::vector<reco::GenParticle> >& hGenParticles,
150 const std::vector<const PSimHit*>&
simHits,
double volumeRadius,
double volumeZ,
double vertexDistanceCut,
bool allowDifferentProcessTypes );
152 TrackingVertex createTrackingVertex(
const DecayChainVertex* pVertex)
const;
155 const ::DecayChain& decayChain_;
158 std::vector<int> genParticleIndices_;
159 const std::vector<const PSimHit*>& simHits_;
160 const double volumeRadius_;
161 const double volumeZ_;
162 const double vertexDistanceCut2_;
163 std::multimap<unsigned int, size_t> trackIdToHitIndex_;
164 bool allowDifferentProcessTypeForDifferentDetectors_;
171 class OutputCollectionWrapper
177 TrackingParticle* getTrackingParticle( const ::DecayChainTrack* pDecayTrack );
179 void setProxy( const ::DecayChainTrack* pOriginalTrack, const ::DecayChainTrack* pProxyTrack );
180 void setProxy( const ::DecayChainVertex* pOriginalVertex, const ::DecayChainVertex* pProxyVertex );
181 TrackingVertex* getTrackingVertex( const ::DecayChainVertex* pDecayVertex );
185 void associateToExistingObjects( const ::DecayChainVertex* pChainVertex );
186 void associateToExistingObjects( const ::DecayChainTrack* pChainTrack );
188 std::vector<int> trackingParticleIndices_;
189 std::vector<int> trackingVertexIndices_;
202 void addTrack( ::DecayChainTrack* pDecayChainTrack,
const TrackingParticleSelector* pSelector, ::OutputCollectionWrapper* pUnmergedOutput, ::OutputCollectionWrapper* pMergedOutput, const ::TrackingParticleFactory& objectFactory,
bool addAncestors,
const TrackerTopology *tTopo);
221 messageCategory_(
"TrackingTruthAccumulator"),
222 volumeRadius_( config.getParameter<double>(
"volumeRadius") ),
223 volumeZ_( config.getParameter<double>(
"volumeZ") ),
224 vertexDistanceCut_( config.getParameter<double>(
"vertexDistanceCut") ),
225 ignoreTracksOutsideVolume_( config.getParameter<bool>(
"ignoreTracksOutsideVolume") ),
226 maximumPreviousBunchCrossing_( config.getParameter<unsigned int>(
"maximumPreviousBunchCrossing") ),
227 maximumSubsequentBunchCrossing_( config.getParameter<unsigned int>(
"maximumSubsequentBunchCrossing") ),
228 createUnmergedCollection_( config.getParameter<bool>(
"createUnmergedCollection") ),
229 createMergedCollection_(config.getParameter<bool>(
"createMergedBremsstrahlung") ),
230 createInitialVertexCollection_(config.getParameter<bool>(
"createInitialVertexCollection") ),
231 addAncestors_( config.getParameter<bool>(
"alwaysAddAncestors") ),
232 removeDeadModules_( config.getParameter<bool>(
"removeDeadModules") ),
233 simTrackLabel_( config.getParameter<edm::
InputTag>(
"simTrackCollection") ),
234 simVertexLabel_( config.getParameter<edm::
InputTag>(
"simVertexCollection") ),
236 genParticleLabel_( config.getParameter<edm::
InputTag>(
"genParticleCollection") ),
237 hepMCproductLabel_( config.getParameter<edm::
InputTag>(
"HepMCProductLabel") ),
238 allowDifferentProcessTypeForDifferentDetectors_( config.getParameter<bool>(
"allowDifferentSimHitProcesses") )
246 <<
"set to false, which means no collections will be created";
250 if( config.
exists(
"select" ) )
307 std::vector<std::string> parameterNames=simHitCollectionConfig.
getParameterNames();
309 for(
const auto& parameterName : parameterNames )
311 std::vector<edm::InputTag>
tags=simHitCollectionConfig.getParameter<std::vector<edm::InputTag> >(parameterName);
316 iC.
consumes<std::vector<PSimHit> >(collectionTag);
380 <<
" TrackingVertexs to the event.";
389 <<
" merged TrackingVertexs to the event.";
443 DecayChain decayChain( *hSimTracks, *hSimVertices );
446 std::auto_ptr< ::OutputCollectionWrapper> pUnmergedCollectionWrapper;
447 std::auto_ptr< ::OutputCollectionWrapper> pMergedCollectionWrapper;
451 std::vector<const PSimHit*> simHitPointers;
469 ::DecayChainTrack* pDecayTrack=&decayChain.decayTracks[
index];
470 const SimTrack& simTrack=hSimTracks->at(pDecayTrack->simTrackIndex);
483 const SimVertex& simVertex=hSimVertices->at( pDecayTrack->pParentVertex->simVertexIndex );
484 if( !objectFactory.vectorIsInsideVolume( simVertex.
position() ) )
continue;
491 ::addTrack( pDecayTrack, pSelector, pUnmergedCollectionWrapper.get(), pMergedCollectionWrapper.get(), objectFactory,
addAncestors_, tTopo );
503 for(
const auto& pRootVertex : decayChain.rootVertices )
505 const SimVertex& vertex=hSimVertices->at(decayChain.rootVertices[0]->simVertexIndex);
506 if( vertex.
vertexId()!=0 )
continue;
520 event.getByLabel( collectionTag, hSimHits );
523 for(
const auto& simHit : *hSimHits )
525 returnValue.push_back( &simHit );
554 ::TrackingParticleFactory::TrackingParticleFactory( const ::DecayChain& decayChain,
const edm::Handle< std::vector<reco::GenParticle> >& hGenParticles,
556 double volumeRadius,
double volumeZ,
double vertexDistanceCut,
bool allowDifferentProcessTypes )
557 : decayChain_(decayChain), hGenParticles_(hGenParticles), hepMCproduct_(hepMCproduct), simHits_(simHits), volumeRadius_(volumeRadius),
558 volumeZ_(volumeZ), vertexDistanceCut2_(vertexDistanceCut*vertexDistanceCut), allowDifferentProcessTypeForDifferentDetectors_(allowDifferentProcessTypes)
564 trackIdToHitIndex_.insert( std::make_pair( simHits_[
index]->trackId(),
index ) );
567 if( hHepMCGenParticleIndices.isValid() )
569 genParticleIndices_.resize( hHepMCGenParticleIndices->size()+1 );
573 for(
size_t recoGenParticleIndex=0; recoGenParticleIndex<hHepMCGenParticleIndices->size(); ++recoGenParticleIndex )
575 size_t hepMCGenParticleIndex=(*hHepMCGenParticleIndices)[recoGenParticleIndex];
578 if( genParticleIndices_.size()<=hepMCGenParticleIndex ) genParticleIndices_.resize(hepMCGenParticleIndex+1);
580 genParticleIndices_[ hepMCGenParticleIndex ]=recoGenParticleIndex;
590 const SimTrack& simTrack=decayChain_.getSimTrack( pChainTrack );
591 const SimVertex& parentSimVertex=decayChain_.getSimVertex( pChainTrack->pParentVertex );
593 LorentzVector
position( 0, 0, 0, 0 );
610 if( hepMCGenParticleIndex>=0 && hepMCGenParticleIndex<static_cast<int>(genParticleIndices_.size()) && hGenParticles_.isValid() )
612 int recoGenParticleIndex=genParticleIndices_[hepMCGenParticleIndex];
614 pdgId=generatorParticleRef->pdgId();
624 size_t matchedHits=0;
625 size_t numberOfHits=0;
626 size_t numberOfTrackerHits=0;
636 for( std::multimap<unsigned int,size_t>::const_iterator iHitIndex=trackIdToHitIndex_.lower_bound( simTrack.
trackId() );
637 iHitIndex!=trackIdToHitIndex_.upper_bound( simTrack.
trackId() );
640 const auto& pSimHit=simHits_[ iHitIndex->second ];
645 processType=pSimHit->processType();
646 particleType=pSimHit->particleType();
647 newDetector=
DetId( pSimHit->detUnitId() );
651 oldDetector=newDetector;
652 newDetector=
DetId( pSimHit->detUnitId() );
656 if( allowDifferentProcessTypeForDifferentDetectors_ && newDetector.
det()!=oldDetector.
det() ) processType=pSimHit->processType();
659 if( processType==pSimHit->processType() && particleType==pSimHit->particleType() && pdgId==pSimHit->particleType() )
665 ++numberOfTrackerHits;
667 newLayer=tTopo->
layer( newDetector );
670 if( (oldLayer!=newLayer || (oldLayer==newLayer && oldDetector.
subdetId()!=newDetector.
subdetId())) ) ++matchedHits;
682 TrackingVertex TrackingParticleFactory::createTrackingVertex( const ::DecayChainVertex* pChainVertex)
const
689 const SimVertex& simVertex=decayChain_.getSimVertex( pChainVertex );
691 bool isInVolume=this->vectorIsInsideVolume( simVertex.
position() );
696 returnValue.addG4Vertex(simVertex);
701 const HepMC::GenEvent*
genEvent = hepMCproduct_->GetEvent();
703 if (genEvent !=
NULL)
705 Vector tvPosition(returnValue.position().x(), returnValue.position().
y(), returnValue.position().z());
707 for (HepMC::GenEvent::vertex_const_iterator iGenVertex = genEvent->vertices_begin(); iGenVertex != genEvent->vertices_end(); ++iGenVertex)
709 HepMC::ThreeVector rawPosition = (*iGenVertex)->position();
711 Vector genPosition(rawPosition.x()*0.1, rawPosition.y()*0.1, rawPosition.z()*0.1);
713 auto distance2 = (tvPosition - genPosition).
mag2();
715 if (distance2 < vertexDistanceCut2_)
716 returnValue.addGenVertex(
GenVertexRef(hepMCproduct_, (*iGenVertex)->barcode()) );
726 return ( vector.Pt()<volumeRadius_ &&
std::abs( vector.z() )<volumeZ_ );
736 : decayTracksSize( trackCollection.
size() ),
737 decayVerticesSize( vertexCollection.
size() ),
738 decayTracks_( new DecayChainTrack[decayTracksSize] ),
739 decayVertices_( new DecayChainVertex[decayVerticesSize] ),
740 simTrackCollection_( trackCollection ),
741 simVertexCollection_( vertexCollection ),
742 decayTracks( decayTracks_ ),
743 decayVertices( decayVertices_ ),
744 rootVertices( rootVertices_ )
747 std::map<int,::DecayChainTrack*> trackIdToDecayTrack;
748 std::map<int,::DecayChainVertex*> vertexIdToDecayVertex;
754 size_t decayVertexIndex=0;
757 ::DecayChainTrack* pDecayTrack=&decayTracks_[
index];
762 pDecayTrack->simTrackIndex=
index;
764 trackIdToDecayTrack[ trackCollection[
index].trackId() ]=pDecayTrack;
766 int parentVertexIndex=trackCollection[
index].vertIndex();
767 if( parentVertexIndex>=0 )
770 ::DecayChainVertex*& pParentVertex=vertexIdToDecayVertex[parentVertexIndex];
771 if( pParentVertex==
NULL )
774 pParentVertex=&decayVertices_[decayVertexIndex];
776 pParentVertex->simVertexIndex=parentVertexIndex;
778 pParentVertex->daughterTracks.push_back(pDecayTrack);
779 pDecayTrack->pParentVertex=pParentVertex;
781 else throw std::runtime_error(
"TrackingTruthAccumulator: Found a track with an invalid parent vertex index." );
793 for(
auto& decayVertexMapPair : vertexIdToDecayVertex )
795 ::DecayChainVertex* pDecayVertex=decayVertexMapPair.second;
796 int parentTrackIndex=vertexCollection[pDecayVertex->simVertexIndex].parentIndex();
797 if( parentTrackIndex!=-1 )
799 std::map<int,::DecayChainTrack*>::iterator iParentTrackMapPair=trackIdToDecayTrack.find(parentTrackIndex);
800 if( iParentTrackMapPair==trackIdToDecayTrack.end() )
802 std::stringstream errorStream;
803 errorStream <<
"TrackingTruthAccumulator: Something has gone wrong with the indexing. Parent track index is " << parentTrackIndex <<
".";
804 throw std::runtime_error( errorStream.str() );
807 ::DecayChainTrack* pParentTrackHierarchy=iParentTrackMapPair->second;
809 pParentTrackHierarchy->daughterVertices.push_back( pDecayVertex );
810 pDecayVertex->pParentTrack=pParentTrackHierarchy;
812 else rootVertices_.push_back(pDecayVertex);
815 findBrem( trackCollection, vertexCollection );
820 void ::DecayChain::integrityCheck()
827 const auto& decayTrack=decayTracks[
index];
831 if( decayTrack.pParentVertex==
NULL )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack with no parent vertex." );
836 size_t numberOfTimesListed=0;
837 for(
const auto pSiblingTrack : decayTrack.pParentVertex->daughterTracks )
839 if( pSiblingTrack==&decayTrack ) ++numberOfTimesListed;
841 if( numberOfTimesListed!=1 )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack whose parent does not have it listed once and only once as a child." );
846 for(
const auto pDaughterVertex : decayTrack.daughterVertices )
848 if( pDaughterVertex->pParentTrack!=&decayTrack )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack whose child does not have it listed as the parent." );
854 const DecayChainVertex* pAncestorVertex=decayTrack.pParentVertex;
855 while( pAncestorVertex->pParentTrack!=
NULL )
857 if( pAncestorVertex->pParentTrack->pParentVertex==
NULL )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack with no parent vertex higher in the decay chain." );
858 pAncestorVertex=pAncestorVertex->pParentTrack->pParentVertex;
860 if(
std::find( rootVertices.begin(), rootVertices.end(), pAncestorVertex )==rootVertices.end() )
862 throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack whose root vertex is not recorded anywhere." );
871 const auto& decayVertex=decayVertices[
index];
876 const DecayChainVertex* pAncestorVertex=&decayVertex;
877 while( pAncestorVertex->pParentTrack!=
NULL )
879 if( pAncestorVertex->pParentTrack->pParentVertex==
NULL )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack with no parent vertex higher in the vertex decay chain." );
880 pAncestorVertex=pAncestorVertex->pParentTrack->pParentVertex;
882 if(
std::find( rootVertices.begin(), rootVertices.end(), pAncestorVertex )==rootVertices.end() )
884 throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack whose root vertex is not recorded anywhere." );
890 if( decayVertex.pParentTrack!=
NULL )
892 size_t numberOfTimesListed=0;
893 for(
const auto pSibling : decayVertex.pParentTrack->daughterVertices )
895 if( pSibling==&decayVertex ) ++numberOfTimesListed;
897 if( numberOfTimesListed!=1 )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainVertex whose parent does not have it listed once and only once as a child." );
903 for(
const auto pDaughter : decayVertex.daughterTracks )
905 if( pDaughter->pParentVertex!=&decayVertex )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainVertex whose child does not have it listed as the parent." );
909 std::cout <<
"TrackingTruthAccumulator.cc integrityCheck() completed successfully" << std::endl;
912 void ::DecayChain::findBrem(
const std::vector<SimTrack>& trackCollection,
const std::vector<SimVertex>& vertexCollection )
916 auto& vertex=decayVertices_[
index];
919 if( vertex.pParentTrack==
NULL )
continue;
920 int parentTrackPDG=trackCollection[vertex.pParentTrack->simTrackIndex].type();
921 if(
std::abs( parentTrackPDG )!=11 )
continue;
923 size_t numberOfElectrons=0;
924 size_t numberOfNonElectronsOrPhotons=0;
925 for(
auto& pDaughterTrack : vertex.daughterTracks )
927 const auto& simTrack=trackCollection[pDaughterTrack->simTrackIndex];
928 if( simTrack.
type()==11 || simTrack.
type()==-11 ) ++numberOfElectrons;
929 else if( simTrack.
type()!=22 ) ++numberOfNonElectronsOrPhotons;
931 if( numberOfElectrons==1 && numberOfNonElectronsOrPhotons==0 )
935 for(
auto& pDaughterTrack : vertex.daughterTracks ) pDaughterTrack->pMergedBremSource=vertex.pParentTrack;
936 vertex.pMergedBremSource=vertex.pParentTrack->pParentVertex;
949 : output_(outputCollections),
950 trackingParticleIndices_(decayChain.decayTracksSize,-1),
951 trackingVertexIndices_(decayChain.decayVerticesSize,-1)
958 if( trackingParticleIndices_[pDecayTrack->simTrackIndex]!=-1 )
throw std::runtime_error(
"OutputCollectionWrapper::addTrackingParticle - trying to add a particle twice" );
960 trackingParticleIndices_[pDecayTrack->simTrackIndex]=output_.pTrackingParticles->size();
961 output_.pTrackingParticles->push_back( trackingParticle );
964 output_.pTrackingParticles->back().clearDecayVertices();
965 output_.pTrackingParticles->back().clearParentVertex();
968 associateToExistingObjects( pDecayTrack );
970 return &output_.pTrackingParticles->back();
973 TrackingVertex* ::OutputCollectionWrapper::addTrackingVertex( const ::DecayChainVertex* pDecayVertex,
const TrackingVertex& trackingVertex )
975 if( trackingVertexIndices_[pDecayVertex->simVertexIndex]!=-1 )
throw std::runtime_error(
"OutputCollectionWrapper::addTrackingVertex - trying to add a vertex twice" );
977 trackingVertexIndices_[pDecayVertex->simVertexIndex]=output_.pTrackingVertices->size();
978 output_.pTrackingVertices->push_back( trackingVertex );
981 associateToExistingObjects( pDecayVertex );
983 return &output_.pTrackingVertices->back();
986 TrackingParticle* ::OutputCollectionWrapper::getTrackingParticle( const ::DecayChainTrack* pDecayTrack )
988 const int index=trackingParticleIndices_[pDecayTrack->simTrackIndex];
989 if( index==-1 )
return NULL;
990 else return &(*output_.pTrackingParticles)[index];
993 TrackingVertex* ::OutputCollectionWrapper::getTrackingVertex( const ::DecayChainVertex* pDecayVertex )
995 const int index=trackingVertexIndices_[pDecayVertex->simVertexIndex];
996 if( index==-1 )
return NULL;
997 else return &(*output_.pTrackingVertices)[index];
1002 const int index=trackingParticleIndices_[pDecayTrack->simTrackIndex];
1003 if( index==-1 )
throw std::runtime_error(
"OutputCollectionWrapper::getRefTrackingParticle - ref requested for a non existent TrackingParticle" );
1009 const int index=trackingVertexIndices_[pDecayVertex->simVertexIndex];
1010 if( index==-1 )
throw std::runtime_error(
"OutputCollectionWrapper::getRefTrackingParticle - ref requested for a non existent TrackingVertex" );
1014 void ::OutputCollectionWrapper::setProxy( const ::DecayChainTrack* pOriginalTrack, const ::DecayChainTrack* pProxyTrack )
1016 int& index=trackingParticleIndices_[pOriginalTrack->simTrackIndex];
1017 if( index!=-1 )
throw std::runtime_error(
"OutputCollectionWrapper::setProxy() was called for a TrackingParticle that has already been created" );
1019 index=trackingParticleIndices_[pProxyTrack->simTrackIndex];
1022 void ::OutputCollectionWrapper::setProxy( const ::DecayChainVertex* pOriginalVertex, const ::DecayChainVertex* pProxyVertex )
1024 int& index=trackingVertexIndices_[pOriginalVertex->simVertexIndex];
1025 const int newIndex=trackingVertexIndices_[pProxyVertex->simVertexIndex];
1027 if( index!=-1 && index!=newIndex )
throw std::runtime_error(
"OutputCollectionWrapper::setProxy() was called for a TrackingVertex that has already been created" );
1033 void ::OutputCollectionWrapper::associateToExistingObjects( const ::DecayChainVertex* pChainVertex )
1036 TrackingVertex* pTrackingVertex=getTrackingVertex( pChainVertex );
1037 if( pTrackingVertex==
NULL )
throw std::runtime_error(
"associateToExistingObjects was passed a non existent TrackingVertex" );
1042 ::DecayChainTrack* pParentChainTrack=pChainVertex->pParentTrack;
1043 if( pParentChainTrack!=
NULL )
1046 TrackingParticle* pParentTrackingParticle=getTrackingParticle(pParentChainTrack);
1047 if( pParentTrackingParticle!=
NULL )
1064 void ::OutputCollectionWrapper::associateToExistingObjects( const ::DecayChainTrack* pChainTrack )
1070 if( pTrackingParticle==
NULL )
throw std::runtime_error(
"associateToExistingObjects was passed a non existent TrackingParticle" );
1074 ::DecayChainVertex* pParentChainVertex=pChainTrack->pParentVertex;
1075 TrackingVertex* pParentTrackingVertex=getTrackingVertex( pParentChainVertex );
1087 for(
auto pDaughterChainVertex : pChainTrack->daughterVertices )
1089 TrackingVertex* pDaughterTrackingVertex=getTrackingVertex( pDaughterChainVertex );
1090 if( pDaughterTrackingVertex!=
NULL )
1103 TrackingParticle* pTrackingParticle=pOutput->getTrackingParticle( pDecayTrack );
1104 if( pTrackingParticle==
NULL )
1107 TrackingVertex* pProductionVertex=pOutput->getTrackingVertex( pDecayTrack->pParentVertex );
1108 if( pProductionVertex==
NULL )
1115 pProductionVertex=pOutput->addTrackingVertex( pDecayTrack->pParentVertex, *trackingParticle.
parentVertex() );
1119 pTrackingParticle=pOutput->addTrackingParticle( pDecayTrack, trackingParticle );
1122 return pTrackingParticle;
1125 void addTrack( ::DecayChainTrack* pDecayChainTrack,
const TrackingParticleSelector* pSelector, ::OutputCollectionWrapper* pUnmergedOutput, ::OutputCollectionWrapper* pMergedOutput, const ::TrackingParticleFactory& objectFactory,
bool addAncestors,
const TrackerTopology *tTopo )
1127 if( pDecayChainTrack==
NULL )
return;
1133 bool alreadyProcessed=
true;
1134 if( pUnmergedOutput!=
NULL )
1136 if( pUnmergedOutput->getTrackingParticle( pDecayChainTrack )==
NULL ) alreadyProcessed=
false;
1138 if( pMergedOutput!=
NULL )
1140 if( pMergedOutput->getTrackingParticle( pDecayChainTrack )==
NULL ) alreadyProcessed=
false;
1142 if( alreadyProcessed )
return;
1146 TrackingParticle newTrackingParticle=objectFactory.createTrackingParticle( pDecayChainTrack, tTopo );
1156 dummyCollection.push_back( objectFactory.createTrackingVertex( pDecayChainTrack->pParentVertex) );
1163 if( !(*pSelector)( newTrackingParticle ) )
return;
1170 if( addAncestors ) addTrack( pDecayChainTrack->pParentVertex->pParentTrack,
NULL, pUnmergedOutput, pMergedOutput, objectFactory, addAncestors, tTopo );
1174 if( pUnmergedOutput!=
NULL ) addTrackAndParentVertex( pDecayChainTrack, newTrackingParticle, pUnmergedOutput );
1178 if( pMergedOutput!=
NULL )
1180 ::DecayChainTrack* pBremParentChainTrack=pDecayChainTrack;
1181 while( pBremParentChainTrack->pMergedBremSource!=
NULL ) pBremParentChainTrack=pBremParentChainTrack->pMergedBremSource;
1183 if( pBremParentChainTrack!=pDecayChainTrack )
1185 TrackingParticle* pBremParentTrackingParticle=addTrackAndParentVertex( pBremParentChainTrack, newTrackingParticle, pMergedOutput );
1198 pMergedOutput->setProxy( pDecayChainTrack->pParentVertex, pBremParentChainTrack->pParentVertex );
1203 addTrackAndParentVertex( pDecayChainTrack, newTrackingParticle, pMergedOutput );
1208 for(
const auto& trackSegment : newTrackingParticle.
g4Tracks() )
1210 pBremParentTrackingParticle->
addG4Track( trackSegment );
1214 for(
const auto& genParticleRef : newTrackingParticle.
genParticles() )
1225 pMergedOutput->setProxy( pDecayChainTrack, pBremParentChainTrack );
1231 addTrackAndParentVertex( pDecayChainTrack, newTrackingParticle, pMergedOutput );
helper::MatcherGetRef< C >::ref_type getRef(const Handle< C > &c, size_t k)
int bunchCrossing() const
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
T getParameter(std::string const &) const
EncodedEventId eventId() const
const bool ignoreTracksOutsideVolume_
int event() const
get the contents of the subdetector field (should be protected?)
const std::vector< SimTrack > & g4Tracks() const
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
virtual void initializeEvent(const edm::Event &event, const edm::EventSetup &setup)
std::vector< TrackingParticle > TrackingParticleCollection
const reco::GenParticleRefVector & genParticles() const
ROOT::Math::Plane3D::Vector Vector
TrackingParticleRefProd refTrackingParticles
int pdgId() const
PDG ID.
const bool addAncestors_
Whether or not to add the full parentage of any TrackingParticle that is inserted in the collection...
bool exists(std::string const ¶meterName) const
checks if a parameter exists
void addDaughterTrack(const TrackingParticleRef &)
const double vertexDistanceCut_
maximum distance for HepMC::GenVertex to be added to SimVertex
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
void addParentTrack(const TrackingParticleRef &)
float charge() const
charge
bool signalOnly_
Uses the same config as selector_, but can be used to drop out early since selector_ requires the Tra...
void fillSimHits(std::vector< const PSimHit * > &returnValue, const T &event, const edm::EventSetup &setup)
Fills the supplied vector with pointers to the SimHits, checking for bad modules if required...
const unsigned int maximumSubsequentBunchCrossing_
void setParentVertex(const TrackingVertexRef &ref)
void addGenParticle(const reco::GenParticleRef &ref)
SingleObjectSelector< TrackingParticleCollection,::TrackingParticleSelector > TrackingParticleSelector
void accumulateEvent(const T &event, const edm::EventSetup &setup, const edm::Handle< edm::HepMCProduct > &hepMCproduct)
Both forms of accumulate() delegate to this templated method.
double y() const
Same as rapidity().
int bunchCrossing() const
get the detector field from this detid
void addG4Track(const SimTrack &t)
int genpartIndex() const
index of the corresponding Generator particle in the Event container (-1 if no Genpart) ...
int numberOfTrackerLayers() const
The number of tracker layers with a hit.
virtual void finalizeEvent(edm::Event &event, const edm::EventSetup &setup)
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
const std::string messageCategory_
The message category used to send messages to MessageLogger.
Abs< T >::type abs(const T &t)
const math::XYZTLorentzVectorD & position() const
unsigned int vertexId() const
std::vector< std::string > getParameterNames() const
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
const TrackingVertexRef & parentVertex() const
edm::InputTag genParticleLabel_
TrackingVertexRefProd refTrackingVertexes
OutputCollections mergedOutput_
const edm::InputTag simTrackLabel_
bool allowDifferentProcessTypeForDifferentDetectors_
When counting hits, allows hits in different detectors to have a different process type...
std::auto_ptr< TrackingParticleCollection > pTrackingParticles
virtual void accumulate(const edm::Event &event, const edm::EventSetup &setup)
edm::Ref< TrackingVertexCollection > TrackingVertexRef
edm::Ref< edm::HepMCProduct, HepMC::GenVertex > GenVertexRef
std::auto_ptr< TrackingVertexCollection > pInitialVertices_
unsigned int trackId() const
const bool createInitialVertexCollection_
Whether or not to create a separate collection for just the initial interaction vertices.
ParameterSet const & getParameterSet(std::string const &) const
std::auto_ptr< TrackingVertexCollection > pTrackingVertices
XYZPointD XYZPoint
point in space with cartesian internal representation
void addDecayVertex(const TrackingVertexRef &ref)
std::vector< TrackingVertex > TrackingVertexCollection
T const * product() const
int numberOfHits() const
Gives the total number of hits, including muon hits. Hits on overlaps in the same layer count separat...
const unsigned int maximumPreviousBunchCrossing_
const edm::InputTag simVertexLabel_
unsigned int layer(const DetId &id) const
void setNumberOfTrackerHits(int numberOfTrackerHits)
int type() const
particle type (HEP PDT convension)
EncodedEventId eventId() const
#define DEFINE_DIGI_ACCUMULATOR(type)
static int position[264][3]
bool chargedOnly_
Uses the same config as selector_, but can be used to drop out early since selector_ requires the Tra...
const bool createUnmergedCollection_
If bremsstrahlung merging, whether to also add the unmerged collection to the event or not...
TrackingParticleSelector selector_
Monte Carlo truth information used for tracking validation.
OutputCollections unmergedOutput_
int numberOfTrackerHits() const
The number of hits in the tracker. Hits on overlaps in the same layer count separately.
void setNumberOfTrackerLayers(const int numberOfTrackerLayers)
TrackingTruthAccumulator(const edm::ParameterSet &config, edm::one::EDProducerBase &mixMod, edm::ConsumesCollector &iC)
Replacement for TrackingTruthProducer in the new pileup mixing setup.
Detector det() const
get the detector field from this detid
const bool createMergedCollection_
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
tuple size
Write out results.
edm::Ref< TrackingParticleCollection > TrackingParticleRef
edm::InputTag hepMCproductLabel_
Needed to add HepMC::GenVertex to SimVertex.
math::PtEtaPhiELorentzVectorF LorentzVector
void setNumberOfHits(int numberOfHits)
std::vector< edm::InputTag > collectionTags_
const double volumeRadius_