CMS 3D CMS Logo

ElectronSeed.cc
Go to the documentation of this file.
1 
3 
4 #include <climits>
5 
6 using namespace reco;
7 
9  : TrajectorySeed(),
10  ctfTrack_(),
11  caloCluster_(),
12  hitInfo_(),
13  nrLayersAlongTraj_(0),
14  isEcalDriven_(false),
15  isTrackerDriven_(false)
16 
17 {}
18 
20  : TrajectorySeed(seed),
21  ctfTrack_(),
22  caloCluster_(),
23  hitInfo_(),
27 
29  : TrajectorySeed(pts, rh, dir),
30  ctfTrack_(),
31  caloCluster_(),
32  hitInfo_(),
36 
37 ElectronSeed::~ElectronSeed() = default;
38 
41  isTrackerDriven_ = true;
42 }
43 
44 //the hit mask tells us which hits were used in the seed
45 //typically all are used at the HLT but this could change in the future
46 //RECO only uses some of them
47 unsigned int ElectronSeed::hitsMask() const {
48  int mask = 0;
49  for (size_t hitNr = 0; hitNr < nHits(); hitNr++) {
50  int bitNr = 0x1 << hitNr;
51  int hitDetId = (recHits().first + hitNr)->geographicalId().rawId();
52  auto detIdMatcher = [hitDetId](const ElectronSeed::PMVars& var) { return hitDetId == var.detId; };
53  if (std::find_if(hitInfo_.begin(), hitInfo_.end(), detIdMatcher) != hitInfo_.end()) {
54  mask |= bitNr;
55  }
56  }
57  return mask;
58 }
59 
60 void ElectronSeed::initTwoHitSeed(const unsigned char hitMask) {
61  hitInfo_.resize(2);
62 
63  std::vector<unsigned int> hitNrs = hitNrsFromMask(hitMask);
64  if (hitNrs.size() != 2) {
65  throw cms::Exception("LogicError")
66  << "in ElectronSeed::" << __FUNCTION__ << "," << __LINE__ << ": number of hits in hit mask is " << hitNrs.size()
67  << "\n"
68  << "pre-2017 pixel upgrade ecalDriven ElectronSeeds should have exactly 2 hits\n "
69  << "mask " << static_cast<unsigned int>(hitMask) << std::endl;
70  }
71  if (hitNrs[0] >= nHits() || hitNrs[1] >= nHits()) {
72  throw cms::Exception("LogicError") << "in ElectronSeed::" << __FUNCTION__ << "," << __LINE__ << ": hits are "
73  << hitNrs[0] << " and " << hitNrs[1] << " while number of hits are " << nHits()
74  << "\n"
75  << "this means there was a bug in storing or creating the electron seeds "
76  << "mask " << static_cast<unsigned int>(hitMask) << std::endl;
77  }
78  for (size_t hitNr = 0; hitNr < hitInfo_.size(); hitNr++) {
79  auto& info = hitInfo_[hitNr];
82  info.setDet((recHits().first + hitNrs[hitNr])->geographicalId(), -1);
83  }
84 }
85 
86 void ElectronSeed::setNegAttributes(float dRZ2, float dPhi2, float dRZ1, float dPhi1) {
87  if (hitInfo_.size() != 2) {
88  throw cms::Exception("LogicError")
89  << "ElectronSeed::setNegAttributes should only operate on seeds with exactly two hits. This is because it is a "
90  "legacy function to preverse backwards compatiblity and should not be used on new code which matches "
91  "variable number of hits";
92  }
93  hitInfo_[0].dRZNeg = dRZ1;
94  hitInfo_[1].dRZNeg = dRZ2;
95  hitInfo_[0].dPhiNeg = dPhi1;
96  hitInfo_[1].dPhiNeg = dPhi2;
97 }
98 
99 void ElectronSeed::setPosAttributes(float dRZ2, float dPhi2, float dRZ1, float dPhi1) {
100  if (hitInfo_.size() != 2) {
101  throw cms::Exception("LogicError")
102  << "ElectronSeed::setPosAttributes should only operate on seeds with exactly two hits. This is because it is a "
103  "legacy function to preverse backwards compatiblity and should not be used on new code which matches "
104  "variable number of hits";
105  }
106  hitInfo_[0].dRZPos = dRZ1;
107  hitInfo_[1].dRZPos = dRZ2;
108  hitInfo_[0].dPhiPos = dPhi1;
109  hitInfo_[1].dPhiPos = dPhi2;
110 }
111 
112 std::vector<unsigned int> ElectronSeed::hitNrsFromMask(unsigned int hitMask) {
113  std::vector<unsigned int> hitNrs;
114  for (size_t bitNr = 0; bitNr < sizeof(hitMask) * CHAR_BIT; bitNr++) {
115  char bit = 0x1 << bitNr;
116  if ((hitMask & bit) != 0)
117  hitNrs.push_back(bitNr);
118  }
119  return hitNrs;
120 }
121 
122 std::vector<ElectronSeed::PMVars> ElectronSeed::createHitInfo(const float dPhi1Pos,
123  const float dPhi1Neg,
124  const float dRZ1Pos,
125  const float dRZ1Neg,
126  const float dPhi2Pos,
127  const float dPhi2Neg,
128  const float dRZ2Pos,
129  const float dRZ2Neg,
130  const char hitMask,
132  if (hitMask == 0)
133  return std::vector<ElectronSeed::PMVars>(); //was trackerDriven so no matched hits
134 
135  size_t nrRecHits = std::distance(recHits.first, recHits.second);
136  std::vector<unsigned int> hitNrs = hitNrsFromMask(hitMask);
137 
138  if (hitNrs.size() != 2) {
139  throw cms::Exception("LogicError") << "in ElectronSeed::" << __FUNCTION__ << "," << __LINE__
140  << ": number of hits in hit mask is " << nrRecHits << "\n"
141  << "pre-2017 pixel upgrade ecalDriven ElectronSeeds should have exactly 2 hits\n"
142  << "mask " << static_cast<unsigned int>(hitMask) << std::endl;
143  }
144  if (hitNrs[0] >= nrRecHits || hitNrs[1] >= nrRecHits) {
145  throw cms::Exception("LogicError") << "in ElectronSeed::" << __FUNCTION__ << "," << __LINE__ << ": hits are "
146  << hitNrs[0] << " and " << hitNrs[1] << " while number of hits are " << nrRecHits
147  << "\n"
148  << "this means there was a bug in storing or creating the electron seeds "
149  << "mask " << static_cast<unsigned int>(hitMask) << std::endl;
150  }
151 
152  std::vector<PMVars> hitInfo(2);
153  hitInfo[0].setDPhi(dPhi1Pos, dPhi1Neg);
154  hitInfo[0].setDRZ(dRZ1Pos, dRZ1Neg);
155  hitInfo[0].setDet(
156  (recHits.first + hitNrs[0])->geographicalId(),
157  -1); //getting the layer information needs tracker topo, hence why its stored in the first as its a pain to access
158  hitInfo[1].setDPhi(dPhi2Pos, dPhi2Neg);
159  hitInfo[1].setDRZ(dRZ2Pos, dRZ2Neg);
160  hitInfo[1].setDet(
161  (recHits.first + hitNrs[1])->geographicalId(),
162  -1); //getting the layer information needs tracker topo, hence why its stored in the first as its a pain to access
163  return hitInfo;
164 }
165 
167  : dRZPos(std::numeric_limits<float>::infinity()),
168  dRZNeg(std::numeric_limits<float>::infinity()),
169  dPhiPos(std::numeric_limits<float>::infinity()),
170  dPhiNeg(std::numeric_limits<float>::infinity()),
171  detId(0),
172  layerOrDiskNr(-1) {}
173 
174 void ElectronSeed::PMVars::setDPhi(float pos, float neg) {
175  dPhiPos = pos;
176  dPhiNeg = neg;
177 }
178 
179 void ElectronSeed::PMVars::setDRZ(float pos, float neg) {
180  dRZPos = pos;
181  dRZNeg = neg;
182 }
183 
184 void ElectronSeed::PMVars::setDet(int iDetId, int iLayerOrDiskNr) {
185  detId = iDetId;
186  layerOrDiskNr = iLayerOrDiskNr;
187 }
std::pair< const_iterator, const_iterator > range
static const TGPicture * info(bool iBackgroundIsBlack)
std::vector< PMVars > hitInfo_
Definition: ElectronSeed.h:151
void setPosAttributes(const float dRZ2=std::numeric_limits< float >::infinity(), const float dPhi2=std::numeric_limits< float >::infinity(), const float dRZ1=std::numeric_limits< float >::infinity(), const float dPhi1=std::numeric_limits< float >::infinity())
Definition: ElectronSeed.cc:99
void setDPhi(float pos, float neg)
PropagationDirection
float dRZPos(size_t hitNr) const
Definition: ElectronSeed.h:106
void setCtfTrack(const CtfTrackRef &)
Set additional info.
Definition: ElectronSeed.cc:39
static const double pts[33]
Definition: Constants.h:30
ElectronSeed()
Construction of base attributes.
Definition: ElectronSeed.cc:8
void setDet(int iDetId, int iLayerOrDiskNr)
const double infinity
CaloClusterRef caloCluster_
Definition: ElectronSeed.h:150
int layerOrDiskNr(size_t hitNr) const
Definition: ElectronSeed.h:111
int detId(size_t hitNr) const
Definition: ElectronSeed.h:109
void setNegAttributes(const float dRZ2=std::numeric_limits< float >::infinity(), const float dPhi2=std::numeric_limits< float >::infinity(), const float dRZ1=std::numeric_limits< float >::infinity(), const float dPhi1=std::numeric_limits< float >::infinity())
Definition: ElectronSeed.cc:86
const std::vector< PMVars > & hitInfo() const
Definition: ElectronSeed.h:102
range recHits() const
~ElectronSeed() override
unsigned int nHits() const
fixed size matrix
unsigned int hitsMask() const
Definition: ElectronSeed.cc:47
float dRZNeg(size_t hitNr) const
Definition: ElectronSeed.h:107
static std::vector< PMVars > createHitInfo(const float dPhi1Pos, const float dPhi1Neg, const float dRZ1Pos, const float dRZ1Neg, const float dPhi2Pos, const float dPhi2Neg, const float dRZ2Pos, const float dRZ2Neg, const char hitMask, const TrajectorySeed::range recHits)
float dPhiNeg(size_t hitNr) const
Definition: ElectronSeed.h:103
CtfTrackRef ctfTrack_
Definition: ElectronSeed.h:149
void setDRZ(float pos, float neg)
float dPhiPos(size_t hitNr) const
Definition: ElectronSeed.h:104
static std::vector< unsigned int > hitNrsFromMask(unsigned int hitMask)
const CtfTrackRef & ctfTrack() const
Accessors.
Definition: ElectronSeed.h:93
void initTwoHitSeed(const unsigned char hitMask)
Definition: ElectronSeed.cc:60