74 struct DecayChainTrack {
76 struct DecayChainVertex *pParentVertex;
79 std::vector<struct DecayChainVertex *> daughterVertices;
80 DecayChainTrack *pMergedBremSource;
81 DecayChainTrack() : simTrackIndex(-1), pParentVertex(nullptr), pMergedBremSource(nullptr) {}
82 DecayChainTrack(
int newSimTrackIndex)
83 : simTrackIndex(newSimTrackIndex), pParentVertex(nullptr), pMergedBremSource() {}
91 struct DecayChainVertex {
93 DecayChainTrack *pParentTrack;
94 std::vector<DecayChainTrack *> daughterTracks;
95 DecayChainVertex *pMergedBremSource;
96 DecayChainVertex() : simVertexIndex(-1), pParentTrack(nullptr), pMergedBremSource(nullptr) {}
97 DecayChainVertex(
int newIndex) : simVertexIndex(newIndex), pParentTrack(nullptr), pMergedBremSource(nullptr) {}
115 const size_t decayTracksSize;
116 const size_t decayVerticesSize;
118 #if defined(DO_DEBUG_TESTING)
125 void integrityCheck();
127 const SimTrack &getSimTrack(const ::DecayChainTrack *pDecayTrack)
const {
128 return simTrackCollection_.at(pDecayTrack->simTrackIndex);
130 const SimVertex &getSimVertex(const ::DecayChainVertex *pDecayVertex)
const {
131 return simVertexCollection_.at(pDecayVertex->simVertexIndex);
136 std::unique_ptr<::DecayChainTrack[]> decayTracks_;
137 std::unique_ptr<::DecayChainVertex[]> decayVertices_;
141 std::vector<::DecayChainVertex *> rootVertices_;
144 const std::vector<SimTrack> &simTrackCollection_;
145 const std::vector<SimVertex> &simVertexCollection_;
148 const std::unique_ptr<::DecayChainTrack[]> &decayTracks;
149 const std::unique_ptr<::DecayChainVertex[]> &decayVertices;
151 const std::vector<::DecayChainVertex *> &rootVertices;
160 class TrackingParticleFactory {
163 const edm::Handle<std::vector<reco::GenParticle>> &hGenParticles,
165 const edm::Handle<std::vector<int>> &hHepMCGenParticleIndices,
166 const std::vector<const PSimHit *> &
simHits,
169 double vertexDistanceCut,
170 bool allowDifferentProcessTypes);
172 TrackingVertex createTrackingVertex(
const DecayChainVertex *pVertex)
const;
179 std::vector<int> genParticleIndices_;
180 const std::vector<const PSimHit *> &simHits_;
181 const double volumeRadius_;
182 const double volumeZ_;
183 const double vertexDistanceCut2_;
185 std::multimap<unsigned int, size_t> trackIdToHitIndex_;
186 bool allowDifferentProcessTypeForDifferentDetectors_;
197 class OutputCollectionWrapper {
199 OutputCollectionWrapper(
const DecayChain &decayChain,
204 TrackingParticle *getTrackingParticle(const ::DecayChainTrack *pDecayTrack);
207 void setProxy(const ::DecayChainTrack *pOriginalTrack, const ::DecayChainTrack *pProxyTrack);
208 void setProxy(const ::DecayChainVertex *pOriginalVertex, const ::DecayChainVertex *pProxyVertex);
209 TrackingVertex *getTrackingVertex(const ::DecayChainVertex *pDecayVertex);
214 void associateToExistingObjects(const ::DecayChainVertex *pChainVertex);
215 void associateToExistingObjects(const ::DecayChainTrack *pChainTrack);
217 std::vector<int> trackingParticleIndices_;
218 std::vector<int> trackingVertexIndices_;
228 ::OutputCollectionWrapper *pOutput);
236 void addTrack(::DecayChainTrack *pDecayChainTrack,
238 ::OutputCollectionWrapper *pUnmergedOutput,
239 ::OutputCollectionWrapper *pMergedOutput,
240 const ::TrackingParticleFactory &objectFactory,
260 : messageCategory_(
"TrackingTruthAccumulator"),
261 volumeRadius_(config.getParameter<double>(
"volumeRadius")),
262 volumeZ_(config.getParameter<double>(
"volumeZ")),
263 vertexDistanceCut_(config.getParameter<double>(
"vertexDistanceCut")),
264 ignoreTracksOutsideVolume_(config.getParameter<bool>(
"ignoreTracksOutsideVolume")),
265 maximumPreviousBunchCrossing_(config.getParameter<unsigned int>(
"maximumPreviousBunchCrossing")),
266 maximumSubsequentBunchCrossing_(config.getParameter<unsigned int>(
"maximumSubsequentBunchCrossing")),
267 createUnmergedCollection_(config.getParameter<bool>(
"createUnmergedCollection")),
268 createMergedCollection_(config.getParameter<bool>(
"createMergedBremsstrahlung")),
269 createInitialVertexCollection_(config.getParameter<bool>(
"createInitialVertexCollection")),
270 addAncestors_(config.getParameter<bool>(
"alwaysAddAncestors")),
271 removeDeadModules_(config.getParameter<bool>(
"removeDeadModules")),
272 simTrackLabel_(config.getParameter<edm::
InputTag>(
"simTrackCollection")),
273 simVertexLabel_(config.getParameter<edm::
InputTag>(
"simVertexCollection")),
275 genParticleLabel_(config.getParameter<edm::
InputTag>(
"genParticleCollection")),
276 hepMCproductLabel_(config.getParameter<edm::
InputTag>(
"HepMCProductLabel")),
278 allowDifferentProcessTypeForDifferentDetectors_(config.getParameter<bool>(
"allowDifferentSimHitProcesses")) {
285 "\"createMergedBremsstrahlung\" have been"
286 <<
"set to false, which means no collections will be created";
290 if (config.
exists(
"select")) {
344 std::vector<std::string> parameterNames = simHitCollectionConfig.
getParameterNames();
346 for (
const auto ¶meterName : parameterNames) {
347 std::vector<edm::InputTag>
tags = simHitCollectionConfig.getParameter<std::vector<edm::InputTag>>(parameterName);
352 iC.
consumes<std::vector<PSimHit>>(collectionTag);
361 const_cast<edm::Event &
>(
event).getRefBeforePut<TrackingParticleCollection>();
369 const_cast<edm::Event &
>(
event).getRefBeforePut<TrackingParticleCollection>(
"MergedTrackTruth");
371 const_cast<edm::Event &
>(
event).getRefBeforePut<TrackingVertexCollection>(
"MergedTrackTruth");
434 <<
"Adding " <<
pInitialVertices_->size() <<
" initial TrackingVertexs to the event.";
476 DecayChain decayChain(*hSimTracks, *hSimVertices);
479 std::unique_ptr<::OutputCollectionWrapper> pUnmergedCollectionWrapper;
480 std::unique_ptr<::OutputCollectionWrapper> pMergedCollectionWrapper;
482 pUnmergedCollectionWrapper = std::make_unique<::OutputCollectionWrapper>(decayChain,
unmergedOutput_);
484 pMergedCollectionWrapper = std::make_unique<::OutputCollectionWrapper>(decayChain,
mergedOutput_);
486 std::vector<const PSimHit *> simHitPointers;
488 TrackingParticleFactory objectFactory(decayChain,
498 #if defined(DO_DEBUG_TESTING)
501 decayChain.integrityCheck();
514 ::DecayChainTrack *pDecayTrack = &decayChain.decayTracks[
index];
530 const SimVertex &
simVertex = hSimVertices->at(pDecayTrack->pParentVertex->simVertexIndex);
531 if (!objectFactory.vectorIsInsideVolume(simVertex.
position()))
539 ::addTrack(pDecayTrack,
541 pUnmergedCollectionWrapper.get(),
542 pMergedCollectionWrapper.get(),
557 for (
const auto &pRootVertex : decayChain.rootVertices) {
558 const SimVertex &vertex = hSimVertices->at(decayChain.rootVertices[0]->simVertexIndex);
575 event.getByLabel(collectionTag, hSimHits);
578 for (
const auto &simHit : *hSimHits) {
579 returnValue.push_back(&simHit);
587 std::sort(returnValue.begin(), returnValue.end(), [](
const PSimHit *
a,
const PSimHit *
b) {
591 edm::isFinite(
b->timeOfFlight()) ?
b->timeOfFlight() : std::numeric_limits<decltype(
b->timeOfFlight())>::
max();
621 const edm::Handle<std::vector<reco::GenParticle>> &hGenParticles,
623 const edm::Handle<std::vector<int>> &hHepMCGenParticleIndices,
624 const std::vector<const PSimHit *> &
simHits,
627 double vertexDistanceCut,
628 bool allowDifferentProcessTypes)
629 : decayChain_(decayChain),
630 hGenParticles_(hGenParticles),
631 hepMCproduct_(hepMCproduct),
633 volumeRadius_(volumeRadius),
635 vertexDistanceCut2_(vertexDistanceCut * vertexDistanceCut),
636 allowDifferentProcessTypeForDifferentDetectors_(allowDifferentProcessTypes) {
640 trackIdToHitIndex_.insert(std::make_pair(simHits_[
index]->trackId(),
index));
643 if (hHepMCGenParticleIndices.isValid())
646 genParticleIndices_.resize(hHepMCGenParticleIndices->size() + 1);
650 for (
size_t recoGenParticleIndex = 0; recoGenParticleIndex < hHepMCGenParticleIndices->size();
651 ++recoGenParticleIndex) {
652 size_t hepMCGenParticleIndex = (*hHepMCGenParticleIndices)[recoGenParticleIndex];
656 if (genParticleIndices_.size() <= hepMCGenParticleIndex)
657 genParticleIndices_.resize(hepMCGenParticleIndex + 1);
659 genParticleIndices_[hepMCGenParticleIndex] = recoGenParticleIndex;
664 TrackingParticle TrackingParticleFactory::createTrackingParticle(const ::DecayChainTrack *pChainTrack,
670 const SimVertex &parentSimVertex = decayChain_.getSimVertex(pChainTrack->pParentVertex);
676 int pdgId = simTrack.
type();
691 if (hepMCGenParticleIndex >= 0 && hepMCGenParticleIndex < static_cast<int>(genParticleIndices_.size()) &&
692 hGenParticles_.isValid()) {
693 int recoGenParticleIndex = genParticleIndices_[hepMCGenParticleIndex];
695 pdgId = generatorParticleRef->pdgId();
706 size_t matchedHits = 0;
708 size_t numberOfHits = 0;
709 size_t numberOfTrackerHits = 0;
725 for (
auto iHitIndex = trackIdToHitIndex_.lower_bound(simTrack.
trackId()),
726 end = trackIdToHitIndex_.upper_bound(simTrack.
trackId());
729 const auto &pSimHit = simHits_[iHitIndex->second];
732 if (pSimHit->particleType() != pdgId)
737 processType = pSimHit->processType();
738 particleType = pSimHit->particleType();
739 newDetector =
DetId(pSimHit->detUnitId());
743 oldDetector = newDetector;
744 newDetector =
DetId(pSimHit->detUnitId());
749 if (allowDifferentProcessTypeForDifferentDetectors_ && newDetector.
det() != oldDetector.
det())
750 processType = pSimHit->processType();
753 if (processType == pSimHit->processType() && particleType == pSimHit->particleType()) {
758 ++numberOfTrackerHits;
760 newLayer = tTopo->
layer(newDetector);
763 if ((oldLayer != newLayer || (oldLayer == newLayer && oldDetector.
subdetId() != newDetector.
subdetId())))
776 TrackingVertex TrackingParticleFactory::createTrackingVertex(const ::DecayChainVertex *pChainVertex)
const {
783 bool isInVolume = this->vectorIsInsideVolume(simVertex.
position());
788 returnValue.addG4Vertex(simVertex);
793 hepMCproduct_.isValid())
797 if (genEvent !=
nullptr) {
798 Vector tvPosition(returnValue.position().x(), returnValue.position().
y(), returnValue.position().z());
800 for (HepMC::GenEvent::vertex_const_iterator iGenVertex = genEvent->vertices_begin();
801 iGenVertex != genEvent->vertices_end();
803 HepMC::ThreeVector rawPosition = (*iGenVertex)->position();
805 Vector genPosition(rawPosition.x() * 0.1, rawPosition.y() * 0.1, rawPosition.z() * 0.1);
807 auto distance2 = (tvPosition - genPosition).
mag2();
809 if (distance2 < vertexDistanceCut2_)
810 returnValue.addGenVertex(
GenVertexRef(hepMCproduct_, (*iGenVertex)->barcode()));
819 return (vector.Pt() < volumeRadius_ &&
std::abs(vector.z()) < volumeZ_);
830 : decayTracksSize(trackCollection.
size()),
831 decayVerticesSize(vertexCollection.
size()),
832 decayTracks_(new DecayChainTrack[decayTracksSize]),
833 decayVertices_(new DecayChainVertex[decayVerticesSize]),
834 simTrackCollection_(trackCollection),
835 simVertexCollection_(vertexCollection),
836 decayTracks(decayTracks_),
838 decayVertices(decayVertices_),
839 rootVertices(rootVertices_) {
841 std::map<int, ::DecayChainTrack *> trackIdToDecayTrack;
842 std::map<int, ::DecayChainVertex *> vertexIdToDecayVertex;
848 size_t decayVertexIndex = 0;
850 ::DecayChainTrack *pDecayTrack = &decayTracks_[
index];
856 pDecayTrack->simTrackIndex =
index;
858 trackIdToDecayTrack[trackCollection[
index].trackId()] = pDecayTrack;
860 int parentVertexIndex = trackCollection[
index].vertIndex();
861 if (parentVertexIndex >= 0) {
864 ::DecayChainVertex *&pParentVertex = vertexIdToDecayVertex[parentVertexIndex];
865 if (pParentVertex ==
nullptr) {
868 pParentVertex = &decayVertices_[decayVertexIndex];
870 pParentVertex->simVertexIndex = parentVertexIndex;
872 pParentVertex->daughterTracks.push_back(pDecayTrack);
873 pDecayTrack->pParentVertex = pParentVertex;
875 throw std::runtime_error(
876 "TrackingTruthAccumulator: Found a track with "
877 "an invalid parent vertex index.");
892 for (
auto &decayVertexMapPair : vertexIdToDecayVertex) {
893 ::DecayChainVertex *pDecayVertex = decayVertexMapPair.second;
894 int parentTrackIndex = vertexCollection[pDecayVertex->simVertexIndex].parentIndex();
895 if (parentTrackIndex != -1) {
896 std::map<int, ::DecayChainTrack *>::iterator iParentTrackMapPair = trackIdToDecayTrack.find(parentTrackIndex);
897 if (iParentTrackMapPair == trackIdToDecayTrack.end()) {
898 std::stringstream errorStream;
899 errorStream <<
"TrackingTruthAccumulator: Something has gone wrong "
900 "with the indexing. Parent track index is "
901 << parentTrackIndex <<
".";
902 throw std::runtime_error(errorStream.str());
905 ::DecayChainTrack *pParentTrackHierarchy = iParentTrackMapPair->second;
907 pParentTrackHierarchy->daughterVertices.push_back(pDecayVertex);
908 pDecayVertex->pParentTrack = pParentTrackHierarchy;
910 rootVertices_.push_back(pDecayVertex);
913 findBrem(trackCollection, vertexCollection);
917 #if defined(DO_DEBUG_TESTING)
920 void ::DecayChain::integrityCheck() {
925 const auto &decayTrack = decayTracks[
index];
929 if (decayTrack.pParentVertex ==
NULL)
930 throw std::runtime_error(
931 "TrackingTruthAccumulator.cc integrityCheck(): "
932 "Found DecayChainTrack with no parent vertex.");
938 size_t numberOfTimesListed = 0;
939 for (
const auto pSiblingTrack : decayTrack.pParentVertex->daughterTracks) {
940 if (pSiblingTrack == &decayTrack)
941 ++numberOfTimesListed;
943 if (numberOfTimesListed != 1)
944 throw std::runtime_error(
945 "TrackingTruthAccumulator.cc integrityCheck(): "
946 "Found DecayChainTrack whose parent does not "
947 "have it listed once and only once as a child.");
952 for (
const auto pDaughterVertex : decayTrack.daughterVertices) {
953 if (pDaughterVertex->pParentTrack != &decayTrack)
954 throw std::runtime_error(
955 "TrackingTruthAccumulator.cc integrityCheck(): Found "
956 "DecayChainTrack whose child does not have it listed as the "
964 const DecayChainVertex *pAncestorVertex = decayTrack.pParentVertex;
965 while (pAncestorVertex->pParentTrack !=
NULL) {
966 if (pAncestorVertex->pParentTrack->pParentVertex ==
NULL)
967 throw std::runtime_error(
968 "TrackingTruthAccumulator.cc integrityCheck(): Found "
969 "DecayChainTrack with no parent vertex higher in the decay chain.");
970 pAncestorVertex = pAncestorVertex->pParentTrack->pParentVertex;
972 if (
std::find(rootVertices.begin(), rootVertices.end(), pAncestorVertex) == rootVertices.end()) {
973 throw std::runtime_error(
974 "TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack "
975 "whose root vertex is not recorded anywhere.");
983 const auto &decayVertex = decayVertices[
index];
989 const DecayChainVertex *pAncestorVertex = &decayVertex;
990 while (pAncestorVertex->pParentTrack !=
NULL) {
991 if (pAncestorVertex->pParentTrack->pParentVertex ==
NULL)
992 throw std::runtime_error(
993 "TrackingTruthAccumulator.cc integrityCheck(): Found "
994 "DecayChainTrack with no parent vertex higher in the vertex decay "
996 pAncestorVertex = pAncestorVertex->pParentTrack->pParentVertex;
998 if (
std::find(rootVertices.begin(), rootVertices.end(), pAncestorVertex) == rootVertices.end()) {
999 throw std::runtime_error(
1000 "TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack "
1001 "whose root vertex is not recorded anywhere.");
1007 if (decayVertex.pParentTrack !=
NULL) {
1008 size_t numberOfTimesListed = 0;
1009 for (
const auto pSibling : decayVertex.pParentTrack->daughterVertices) {
1010 if (pSibling == &decayVertex)
1011 ++numberOfTimesListed;
1013 if (numberOfTimesListed != 1)
1014 throw std::runtime_error(
1015 "TrackingTruthAccumulator.cc integrityCheck(): Found "
1016 "DecayChainVertex whose parent does not have it listed once and "
1017 "only once as a child.");
1023 for (
const auto pDaughter : decayVertex.daughterTracks) {
1024 if (pDaughter->pParentVertex != &decayVertex)
1025 throw std::runtime_error(
1026 "TrackingTruthAccumulator.cc integrityCheck(): Found "
1027 "DecayChainVertex whose child does not have it listed as the "
1032 std::cout <<
"TrackingTruthAccumulator.cc integrityCheck() completed successfully" << std::endl;
1036 void ::DecayChain::findBrem(
const std::vector<SimTrack> &trackCollection,
1037 const std::vector<SimVertex> &vertexCollection) {
1039 auto &vertex = decayVertices_[
index];
1042 if (vertex.pParentTrack ==
nullptr)
1044 int parentTrackPDG = trackCollection[vertex.pParentTrack->simTrackIndex].type();
1045 if (
std::abs(parentTrackPDG) != 11)
1048 size_t numberOfElectrons = 0;
1049 size_t numberOfNonElectronsOrPhotons = 0;
1050 for (
auto &pDaughterTrack : vertex.daughterTracks) {
1051 const auto &simTrack = trackCollection[pDaughterTrack->simTrackIndex];
1052 if (simTrack.
type() == 11 || simTrack.
type() == -11)
1053 ++numberOfElectrons;
1054 else if (simTrack.
type() != 22)
1055 ++numberOfNonElectronsOrPhotons;
1057 if (numberOfElectrons == 1 && numberOfNonElectronsOrPhotons == 0) {
1060 for (
auto &pDaughterTrack : vertex.daughterTracks)
1061 pDaughterTrack->pMergedBremSource = vertex.pParentTrack;
1062 vertex.pMergedBremSource = vertex.pParentTrack->pParentVertex;
1076 : output_(outputCollections),
1077 trackingParticleIndices_(decayChain.decayTracksSize, -1),
1078 trackingVertexIndices_(decayChain.decayVerticesSize, -1) {
1082 TrackingParticle * ::OutputCollectionWrapper::addTrackingParticle(const ::DecayChainTrack *pDecayTrack,
1084 if (trackingParticleIndices_[pDecayTrack->simTrackIndex] != -1)
1085 throw std::runtime_error(
1086 "OutputCollectionWrapper::addTrackingParticle - "
1087 "trying to add a particle twice");
1089 trackingParticleIndices_[pDecayTrack->simTrackIndex] = output_.pTrackingParticles->size();
1090 output_.pTrackingParticles->push_back(trackingParticle);
1093 output_.pTrackingParticles->back().clearDecayVertices();
1094 output_.pTrackingParticles->back().clearParentVertex();
1097 associateToExistingObjects(pDecayTrack);
1099 return &output_.pTrackingParticles->back();
1102 TrackingVertex * ::OutputCollectionWrapper::addTrackingVertex(const ::DecayChainVertex *pDecayVertex,
1104 if (trackingVertexIndices_[pDecayVertex->simVertexIndex] != -1)
1105 throw std::runtime_error(
1106 "OutputCollectionWrapper::addTrackingVertex - "
1107 "trying to add a vertex twice");
1109 trackingVertexIndices_[pDecayVertex->simVertexIndex] = output_.pTrackingVertices->size();
1110 output_.pTrackingVertices->push_back(trackingVertex);
1114 associateToExistingObjects(pDecayVertex);
1116 return &output_.pTrackingVertices->back();
1119 TrackingParticle * ::OutputCollectionWrapper::getTrackingParticle(const ::DecayChainTrack *pDecayTrack) {
1120 const int index = trackingParticleIndices_[pDecayTrack->simTrackIndex];
1124 return &(*output_.pTrackingParticles)[index];
1127 TrackingVertex * ::OutputCollectionWrapper::getTrackingVertex(const ::DecayChainVertex *pDecayVertex) {
1128 const int index = trackingVertexIndices_[pDecayVertex->simVertexIndex];
1132 return &(*output_.pTrackingVertices)[index];
1136 const int index = trackingParticleIndices_[pDecayTrack->simTrackIndex];
1138 throw std::runtime_error(
1139 "OutputCollectionWrapper::getRefTrackingParticle - ref requested for a "
1140 "non existent TrackingParticle");
1146 const int index = trackingVertexIndices_[pDecayVertex->simVertexIndex];
1148 throw std::runtime_error(
1149 "OutputCollectionWrapper::getRefTrackingParticle - ref requested for a "
1150 "non existent TrackingVertex");
1155 void ::OutputCollectionWrapper::setProxy(const ::DecayChainTrack *pOriginalTrack,
1156 const ::DecayChainTrack *pProxyTrack) {
1157 int &index = trackingParticleIndices_[pOriginalTrack->simTrackIndex];
1159 throw std::runtime_error(
1160 "OutputCollectionWrapper::setProxy() was called for a TrackingParticle "
1161 "that has already been created");
1164 index = trackingParticleIndices_[pProxyTrack->simTrackIndex];
1167 void ::OutputCollectionWrapper::setProxy(const ::DecayChainVertex *pOriginalVertex,
1168 const ::DecayChainVertex *pProxyVertex) {
1169 int &index = trackingVertexIndices_[pOriginalVertex->simVertexIndex];
1170 const int newIndex = trackingVertexIndices_[pProxyVertex->simVertexIndex];
1172 if (index != -1 && index != newIndex)
1173 throw std::runtime_error(
1174 "OutputCollectionWrapper::setProxy() was called for a TrackingVertex "
1175 "that has already been created");
1182 void ::OutputCollectionWrapper::associateToExistingObjects(const ::DecayChainVertex *pChainVertex) {
1185 TrackingVertex *pTrackingVertex = getTrackingVertex(pChainVertex);
1186 if (pTrackingVertex ==
nullptr)
1187 throw std::runtime_error(
"associateToExistingObjects was passed a non existent TrackingVertex");
1192 ::DecayChainTrack *pParentChainTrack = pChainVertex->pParentTrack;
1193 if (pParentChainTrack !=
nullptr)
1197 TrackingParticle *pParentTrackingParticle = getTrackingParticle(pParentChainTrack);
1198 if (pParentTrackingParticle !=
nullptr) {
1215 void ::OutputCollectionWrapper::associateToExistingObjects(const ::DecayChainTrack *pChainTrack) {
1221 if (pTrackingParticle ==
nullptr)
1222 throw std::runtime_error(
1223 "associateToExistingObjects was passed a non "
1224 "existent TrackingParticle");
1228 ::DecayChainVertex *pParentChainVertex = pChainTrack->pParentVertex;
1229 TrackingVertex *pParentTrackingVertex = getTrackingVertex(pParentChainVertex);
1241 for (
auto pDaughterChainVertex : pChainTrack->daughterVertices) {
1242 TrackingVertex *pDaughterTrackingVertex = getTrackingVertex(pDaughterChainVertex);
1243 if (pDaughterTrackingVertex !=
nullptr) {
1252 ::OutputCollectionWrapper *pOutput) {
1256 TrackingParticle *pTrackingParticle = pOutput->getTrackingParticle(pDecayTrack);
1257 if (pTrackingParticle ==
nullptr) {
1259 if (pOutput->getTrackingVertex(pDecayTrack->pParentVertex) ==
nullptr) {
1267 pOutput->addTrackingVertex(pDecayTrack->pParentVertex, *trackingParticle.
parentVertex());
1270 pTrackingParticle = pOutput->addTrackingParticle(pDecayTrack, trackingParticle);
1273 return pTrackingParticle;
1276 void addTrack(::DecayChainTrack *pDecayChainTrack,
1278 ::OutputCollectionWrapper *pUnmergedOutput,
1279 ::OutputCollectionWrapper *pMergedOutput,
1280 const ::TrackingParticleFactory &objectFactory,
1283 if (pDecayChainTrack ==
nullptr)
1292 bool alreadyProcessed =
true;
1293 if (pUnmergedOutput !=
nullptr) {
1294 if (pUnmergedOutput->getTrackingParticle(pDecayChainTrack) ==
nullptr)
1295 alreadyProcessed =
false;
1297 if (pMergedOutput !=
nullptr) {
1298 if (pMergedOutput->getTrackingParticle(pDecayChainTrack) ==
nullptr)
1299 alreadyProcessed =
false;
1301 if (alreadyProcessed)
1306 TrackingParticle newTrackingParticle = objectFactory.createTrackingParticle(pDecayChainTrack, tTopo);
1318 dummyCollection.push_back(objectFactory.createTrackingVertex(pDecayChainTrack->pParentVertex));
1325 if (!(*pSelector)(newTrackingParticle))
1335 addTrack(pDecayChainTrack->pParentVertex->pParentTrack,
1345 if (pUnmergedOutput !=
nullptr)
1346 addTrackAndParentVertex(pDecayChainTrack, newTrackingParticle, pUnmergedOutput);
1350 if (pMergedOutput !=
nullptr) {
1351 ::DecayChainTrack *pBremParentChainTrack = pDecayChainTrack;
1352 while (pBremParentChainTrack->pMergedBremSource !=
nullptr)
1353 pBremParentChainTrack = pBremParentChainTrack->pMergedBremSource;
1355 if (pBremParentChainTrack != pDecayChainTrack) {
1357 addTrackAndParentVertex(pBremParentChainTrack, newTrackingParticle, pMergedOutput);
1370 pMergedOutput->setProxy(pDecayChainTrack->pParentVertex, pBremParentChainTrack->pParentVertex);
1375 addTrackAndParentVertex(pDecayChainTrack, newTrackingParticle, pMergedOutput);
1379 for (
const auto &trackSegment : newTrackingParticle.
g4Tracks()) {
1380 pBremParentTrackingParticle->
addG4Track(trackSegment);
1384 for (
const auto &genParticleRef : newTrackingParticle.
genParticles()) {
1398 pMergedOutput->setProxy(pDecayChainTrack, pBremParentChainTrack);
1403 addTrackAndParentVertex(pDecayChainTrack, newTrackingParticle, pMergedOutput);
helper::MatcherGetRef< C >::ref_type getRef(const Handle< C > &c, size_t k)
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > tTopoToken_
edm::Ref< edm::HepMCProduct, HepMC::GenVertex > GenVertexRef
int bunchCrossing() const
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
std::unique_ptr< TrackingParticleCollection > pTrackingParticles
std::unique_ptr< TrackingVertexCollection > pInitialVertices_
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.
std::unique_ptr< TrackingVertexCollection > pTrackingVertices
ProductRegistryHelper::BranchAliasSetterT< ProductType > produces()
const reco::GenParticleRefVector & genParticles() const
ROOT::Math::Plane3D::Vector Vector
TrackingParticleRefProd refTrackingParticles
int pdgId() const
PDG ID.
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
Log< level::Error, false > LogError
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
constexpr bool isFinite(T x)
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)
bool getData(T &iHolder) const
void addGenParticle(const reco::GenParticleRef &ref)
void accumulateEvent(const T &event, const edm::EventSetup &setup, const edm::Handle< edm::HepMCProduct > &hepMCproduct)
Both forms of accumulate() delegate to this templated method.
float timeOfFlight() const
void finalizeEvent(edm::Event &event, const edm::EventSetup &setup) override
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.
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
const std::string messageCategory_
Abs< T >::type abs(const T &t)
const math::XYZTLorentzVectorD & position() const
unsigned int vertexId() const
std::vector< std::string > getParameterNames() const
const TrackingVertexRef & parentVertex() const
void initializeEvent(const edm::Event &event, const edm::EventSetup &setup) override
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...
edm::Ref< TrackingVertexCollection > TrackingVertexRef
Log< level::Info, false > LogInfo
unsigned int trackId() const
const bool createInitialVertexCollection_
ParameterSet const & getParameterSet(std::string const &) const
XYZPointD XYZPoint
point in space with cartesian internal representation
void addDecayVertex(const TrackingVertexRef &ref)
std::vector< TrackingVertex > TrackingVertexCollection
T getParameter(std::string const &) 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
tuple config
parse the configuration file
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]
const bool createUnmergedCollection_
TrackingParticleSelector selector_
void accumulate(const edm::Event &event, const edm::EventSetup &setup) override
Monte Carlo truth information used for tracking validation.
OutputCollections unmergedOutput_
std::vector< TrackingParticle > TrackingParticleCollection
int numberOfTrackerHits() const
The number of hits in the tracker. Hits on overlaps in the same layer count separately.
void setNumberOfTrackerLayers(const int numberOfTrackerLayers)
Replacement for TrackingTruthProducer in the new pileup mixing setup.
const bool createMergedCollection_
adjacency_list< listS, vecS, directedS, VertexMotherParticleProperty, EdgeParticleClustersProperty > DecayChain
SingleObjectSelector< TrackingParticleCollection,::TrackingParticleSelector > TrackingParticleSelector
TrackingTruthAccumulator(const edm::ParameterSet &config, edm::ProducesCollector, edm::ConsumesCollector &iC)
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_
constexpr Detector det() const
get the detector field from this detid
const double volumeRadius_