File indexing completed on 2024-04-06 12:04:57
0001
0002
0003
0004 #include "DataFormats/PatCandidates/interface/GenericParticle.h"
0005
0006 using pat::GenericParticle;
0007
0008
0009 GenericParticle::GenericParticle() : PATObject<reco::RecoCandidate>() {}
0010
0011
0012 GenericParticle::GenericParticle(const Candidate &cand) : PATObject<reco::RecoCandidate>() { fillInFrom(cand); }
0013
0014
0015 GenericParticle::GenericParticle(const edm::RefToBase<Candidate> &cand) : PATObject<reco::RecoCandidate>() {
0016 fillInFrom(*cand);
0017 refToOrig_ = edm::Ptr<reco::Candidate>(cand.id(), cand.get(), cand.key());
0018 }
0019
0020
0021 GenericParticle::GenericParticle(const edm::Ptr<Candidate> &cand) : PATObject<reco::RecoCandidate>() {
0022 fillInFrom(*cand);
0023 refToOrig_ = cand;
0024 }
0025
0026
0027 GenericParticle::~GenericParticle() {}
0028
0029
0030
0031 void GenericParticle::setTrack(const reco::TrackRef &ref, bool embed) {
0032 trackRef_ = ref;
0033 if (embed)
0034 embedTrack();
0035 else
0036 track_.clear();
0037 }
0038
0039
0040 void GenericParticle::setTracks(const reco::TrackRefVector &refs, bool embed) {
0041 trackRefs_ = refs;
0042 if (embed)
0043 embedTracks();
0044 else
0045 tracks_.clear();
0046 }
0047
0048
0049 void GenericParticle::setStandAloneMuon(const reco::TrackRef &ref, bool embed) {
0050 standaloneTrackRef_ = ref;
0051 if (embed)
0052 embedStandalone();
0053 else
0054 standaloneTrack_.clear();
0055 }
0056
0057
0058 void GenericParticle::setCombinedMuon(const reco::TrackRef &ref, bool embed) {
0059 combinedTrackRef_ = ref;
0060 if (embed)
0061 embedCombined();
0062 else
0063 combinedTrack_.clear();
0064 }
0065
0066
0067 void GenericParticle::setGsfTrack(const reco::GsfTrackRef &ref, bool embed) {
0068 gsfTrackRef_ = ref;
0069 if (embed)
0070 embedGsfTrack();
0071 else
0072 gsfTrack_.clear();
0073 }
0074
0075
0076 void GenericParticle::setSuperCluster(const reco::SuperClusterRef &ref, bool embed) {
0077 superClusterRef_ = ref;
0078 if (embed)
0079 embedSuperCluster();
0080 else
0081 superCluster_.clear();
0082 }
0083
0084
0085 void GenericParticle::setCaloTower(const CaloTowerRef &ref, bool embed) {
0086 caloTowerRef_ = ref;
0087 if (embed) {
0088 embedCaloTower();
0089 } else if (!caloTower_.empty()) {
0090 CaloTowerCollection().swap(caloTower_);
0091 }
0092 }
0093
0094
0095
0096 void GenericParticle::embedTrack() {
0097 track_.clear();
0098 if (trackRef_.isNonnull())
0099 track_.push_back(*trackRef_);
0100 trackRef_ = reco::TrackRef();
0101 }
0102
0103 void GenericParticle::embedTracks() {
0104 tracks_.clear();
0105 tracks_.reserve(trackRefs_.size());
0106 for (reco::TrackRefVector::const_iterator it = trackRefs_.begin(); it != trackRefs_.end(); ++it) {
0107 if (it->isNonnull())
0108 tracks_.push_back(**it);
0109 }
0110 trackRefs_ = reco::TrackRefVector();
0111 }
0112
0113 void GenericParticle::embedStandalone() {
0114 standaloneTrack_.clear();
0115 if (standaloneTrackRef_.isNonnull())
0116 standaloneTrack_.push_back(*standaloneTrackRef_);
0117 standaloneTrackRef_ = reco::TrackRef();
0118 }
0119
0120 void GenericParticle::embedCombined() {
0121 combinedTrack_.clear();
0122 if (combinedTrackRef_.isNonnull())
0123 combinedTrack_.push_back(*combinedTrackRef_);
0124 combinedTrackRef_ = reco::TrackRef();
0125 }
0126
0127 void GenericParticle::embedGsfTrack() {
0128 gsfTrack_.clear();
0129 if (gsfTrackRef_.isNonnull())
0130 gsfTrack_.push_back(*gsfTrackRef_);
0131 gsfTrackRef_ = reco::GsfTrackRef();
0132 }
0133
0134
0135 void GenericParticle::embedSuperCluster() {
0136 superCluster_.clear();
0137 if (superClusterRef_.isNonnull())
0138 superCluster_.push_back(*superClusterRef_);
0139 superClusterRef_ = reco::SuperClusterRef();
0140 }
0141
0142 void GenericParticle::embedCaloTower() {
0143 if (!caloTower_.empty())
0144 CaloTowerCollection().swap(caloTower_);
0145 if (caloTowerRef_.isNonnull())
0146 caloTower_.push_back(*caloTowerRef_);
0147 caloTowerRef_ = CaloTowerRef();
0148 }
0149
0150 void GenericParticle::fillInFrom(const reco::Candidate &cand) {
0151
0152 setCharge(cand.charge());
0153 setP4(cand.polarP4());
0154 setVertex(cand.vertex());
0155 setPdgId(cand.pdgId());
0156 setStatus(cand.status());
0157
0158 const reco::RecoCandidate *rc = dynamic_cast<const reco::RecoCandidate *>(&cand);
0159 if (rc != nullptr) {
0160 setTrack(rc->track());
0161 setGsfTrack(rc->gsfTrack());
0162 setStandAloneMuon(rc->standAloneMuon());
0163 setCombinedMuon(rc->combinedMuon());
0164 setSuperCluster(rc->superCluster());
0165 setCaloTower(rc->caloTower());
0166 size_t ntracks = rc->numberOfTracks();
0167 if (ntracks > 0) {
0168 reco::TrackRefVector tracks;
0169 for (size_t i = 0; i < ntracks; ++i) {
0170 tracks.push_back(rc->track(i));
0171 }
0172 setTracks(tracks);
0173 }
0174 }
0175 }
0176
0177 bool GenericParticle::overlap(const reco::Candidate &cand) const {
0178 const reco::RecoCandidate *rc = dynamic_cast<const reco::RecoCandidate *>(&cand);
0179 if (rc != nullptr) {
0180 if (rc->track().isNonnull() && (track() == rc->track()))
0181 return true;
0182 if (rc->gsfTrack().isNonnull() && (gsfTrack() == rc->gsfTrack()))
0183 return true;
0184 if (rc->standAloneMuon().isNonnull() && (standAloneMuon() == rc->standAloneMuon()))
0185 return true;
0186 if (rc->combinedMuon().isNonnull() && (combinedMuon() == rc->combinedMuon()))
0187 return true;
0188 if (rc->superCluster().isNonnull() && (superCluster() == rc->superCluster()))
0189 return true;
0190 if (rc->caloTower().isNonnull() && (caloTower() == rc->caloTower()))
0191 return true;
0192 }
0193 const GenericParticle *rc2 = dynamic_cast<const GenericParticle *>(&cand);
0194 if (rc2 != nullptr) {
0195 if (rc2->track().isNonnull() && (track() == rc2->track()))
0196 return true;
0197 if (rc2->gsfTrack().isNonnull() && (gsfTrack() == rc2->gsfTrack()))
0198 return true;
0199 if (rc2->standAloneMuon().isNonnull() && (standAloneMuon() == rc2->standAloneMuon()))
0200 return true;
0201 if (rc2->combinedMuon().isNonnull() && (combinedMuon() == rc2->combinedMuon()))
0202 return true;
0203 if (rc2->superCluster().isNonnull() && (superCluster() == rc2->superCluster()))
0204 return true;
0205 if (rc2->caloTower().isNonnull() && (caloTower() == rc2->caloTower()))
0206 return true;
0207 }
0208 return false;
0209 }