Belle II Software development
CDCWireSuperLayer.h
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8#pragma once
9
10#include <cdc/topology/CDCWireLayer.h>
11#include <cdc/topology/WireNeighborPair.h>
12#include <cdc/topology/ISuperLayer.h>
13#include <cdc/topology/ILayer.h>
14#include <cdc/topology/IWire.h>
15#include <cdc/topology/WireNeighborKind.h>
16#include <cdc/topology/EStereoKind.h>
17#include <tracking/trackingUtilities/utilities/VectorRange.h>
18#include <tracking/trackingUtilities/utilities/MayBePtr.h>
19
20namespace Belle2 {
25 namespace CDC {
26
44 : public TrackingUtilities::ConstVectorRange<CDCWireLayer> {
45
46 public:
48 using Super = TrackingUtilities::ConstVectorRange<CDCWireLayer>;
49
53
55 explicit CDCWireSuperLayer(const TrackingUtilities::ConstVectorRange<CDCWireLayer>& wireLayers);
56
58 CDCWireSuperLayer(const CDCWireSuperLayer& wireSuperLayer) = delete;
59
61 CDCWireSuperLayer(CDCWireSuperLayer&& wireSuperLayer) = default;
62
64 void operator=(const CDCWireSuperLayer& wireSuperLayer) = delete;
65
66 public:
68 void initialize();
69
74
77 { return front().getISuperLayer(); }
78
79
84
86 bool isValidILayer(ILayer iLayer) const
87 { return 0 <= iLayer and iLayer < int(size()); }
88
90 const CDCWireLayer& getWireLayer(ILayer iLayer) const
91 {
92 // cppcheck-suppress returnTempReference
93 return at(iLayer);
94 }
95
96
101
103 bool isValidIWire(ILayer iLayer, IWire iWire) const
104 { return isValidILayer(iLayer) and getWireLayer(iLayer).isValidIWire(iWire); }
105
107 const CDCWire& getWire(ILayer iLayer, IWire iWire) const
108 { return getWireLayer(iLayer).getWire(iWire); }
109
110
111
116
118 bool isAxial() const
119 { return getStereoKind() == EStereoKind::c_Axial; }
120
129 { return front().getStereoKind(); }
130
132 double getInnerCylindricalR() const
133 { return front().getInnerCylindricalR(); }
134
136 double getOuterCylindricalR() const
137 { return back().getOuterCylindricalR(); }
138
141 { return (getOuterCylindricalR() + getInnerCylindricalR()) / 2.0; }
142
143
145 double getInnerRefZ() const
146 { return m_innerRefZ; }
147
149 double getOuterRefZ() const
150 { return m_outerRefZ; }
151
153 double getRefTanLambda() const
154 { return m_refTanLambda; }
155
156
164
171 IWire iWire,
172 ILayer iOtherLayer,
173 IWire iOtherWire) const;
174
179 TrackingUtilities::MayBePtr<const CDCWire> getPrimaryNeighbor(short oClockDirection,
180 ILayer iLayer,
181 IWire iWire) const
182 {
183 oClockDirection = TrackingUtilities::modulo(oClockDirection, 12);
184 switch (oClockDirection) {
185 case 1:
186 return getNeighborCWOutwards(iLayer, iWire);
187 case 3:
188 return getNeighborCW(iLayer, iWire);
189 case 5:
190 return getNeighborCWInwards(iLayer, iWire);
191 case 7:
192 return getNeighborCCWInwards(iLayer, iWire);
193 case 9:
194 return getNeighborCCW(iLayer, iWire);
195 case 11:
196 return getNeighborCCWOutwards(iLayer, iWire);
197 default:
198 return nullptr;
199 }
200 }
201
204
207
209 TrackingUtilities::MayBePtr<const CDCWire> getNeighborCCWOutwards(ILayer iLayer, IWire iWire) const
210 { return getNeighborsOutwards(iLayer, iWire).first; } // not optimal since a second wire gets fetched additionally
211
213 TrackingUtilities::MayBePtr<const CDCWire> getNeighborCWOutwards(ILayer iLayer, IWire iWire) const
214 { return getNeighborsOutwards(iLayer, iWire).second; } // not optimal since a second wire gets fetched additionally
215
217 TrackingUtilities::MayBePtr<const CDCWire> getNeighborCW(ILayer iLayer, IWire iWire) const
218 { return &(getWireLayer(iLayer).getNeighborCW(iWire)); }
219
221 TrackingUtilities::MayBePtr<const CDCWire> getNeighborCCW(ILayer iLayer, IWire iWire) const
222 { return &(getWireLayer(iLayer).getNeighborCCW(iWire)); }
223
225 TrackingUtilities::MayBePtr<const CDCWire> getNeighborCCWInwards(ILayer iLayer, IWire iWire) const
226 { return getNeighborsInwards(iLayer, iWire).first; } // not optimal since a second wire gets fetched additionally
227
229 TrackingUtilities::MayBePtr<const CDCWire> getNeighborCWInwards(ILayer iLayer, IWire iWire) const
230 { return getNeighborsInwards(iLayer, iWire).second; } // not optimal since a second wire gets fetched additionally
231
232
245 TrackingUtilities::MayBePtr<const CDCWire> getSecondaryNeighbor(short oClockDirection,
246 ILayer iLayer,
247 IWire iWire) const
248 {
249 oClockDirection = TrackingUtilities::modulo(oClockDirection, 12);
250 switch (oClockDirection) {
251 case 0:
252 return getSecondNeighborTwelveOClock(iLayer, iWire);
253 case 1:
254 return getSecondNeighborOneOClock(iLayer, iWire);
255 case 2:
256 return getSecondNeighborTwoOClock(iLayer, iWire);
257 case 3:
258 return getSecondNeighborThreeOClock(iLayer, iWire);
259 case 4:
260 return getSecondNeighborFourOClock(iLayer, iWire);
261 case 5:
262 return getSecondNeighborFiveOClock(iLayer, iWire);
263 case 6:
264 return getSecondNeighborSixOClock(iLayer, iWire);
265 case 7:
266 return getSecondNeighborSevenOClock(iLayer, iWire);
267 case 8:
268 return getSecondNeighborEightOClock(iLayer, iWire);
269 case 9:
270 return getSecondNeighborNineOClock(iLayer, iWire);
271 case 10:
272 return getSecondNeighborTenOClock(iLayer, iWire);
273 case 11:
274 return getSecondNeighborElevenOClock(iLayer, iWire);
275 default:
276 return nullptr;
277 }
278 }
279
281 TrackingUtilities::MayBePtr<const CDCWire> getSecondNeighborOneOClock(ILayer iLayer, IWire iWire) const
282 { return isValidILayer(iLayer + 2) ? &(getWireLayer(iLayer + 2).getWireWrappedAround(iWire - 1)) : nullptr; }
283
284
286 TrackingUtilities::MayBePtr<const CDCWire> getSecondNeighborTwoOClock(ILayer iLayer, IWire iWire) const
287 { return getNeighborCWOutwards(iLayer, iWire - 1); }
288
290 TrackingUtilities::MayBePtr<const CDCWire> getSecondNeighborThreeOClock(ILayer iLayer, IWire iWire) const
291 { return getNeighborCW(iLayer, iWire - 1); }
292
294 TrackingUtilities::MayBePtr<const CDCWire> getSecondNeighborFourOClock(ILayer iLayer, IWire iWire) const
295 { return getNeighborCWInwards(iLayer, iWire - 1); }
296
297
299 TrackingUtilities::MayBePtr<const CDCWire> getSecondNeighborFiveOClock(ILayer iLayer, IWire iWire) const
300 { return isValidILayer(iLayer - 2) ? &(getWireLayer(iLayer - 2).getWireWrappedAround(iWire - 1)) : nullptr; }
301
303 TrackingUtilities::MayBePtr<const CDCWire> getSecondNeighborSixOClock(ILayer iLayer, IWire iWire) const
304 { return isValidILayer(iLayer - 2) ? &(getWireLayer(iLayer - 2).getWireWrappedAround(iWire)) : nullptr; }
305
307 TrackingUtilities::MayBePtr<const CDCWire> getSecondNeighborSevenOClock(ILayer iLayer, IWire iWire) const
308 { return isValidILayer(iLayer - 2) ? &(getWireLayer(iLayer - 2).getWireWrappedAround(iWire + 1)) : nullptr; }
309
310
312 TrackingUtilities::MayBePtr<const CDCWire> getSecondNeighborEightOClock(ILayer iLayer, IWire iWire) const
313 { return getNeighborCCWInwards(iLayer, iWire + 1); }
314
316 TrackingUtilities::MayBePtr<const CDCWire> getSecondNeighborNineOClock(ILayer iLayer, IWire iWire) const
317 { return getNeighborCCW(iLayer, iWire + 1); }
318
320 TrackingUtilities::MayBePtr<const CDCWire> getSecondNeighborTenOClock(ILayer iLayer, IWire iWire) const
321 { return getNeighborCCWOutwards(iLayer, iWire + 1); }
322
323
325 TrackingUtilities::MayBePtr<const CDCWire> getSecondNeighborElevenOClock(ILayer iLayer, IWire iWire) const
326 { return isValidILayer(iLayer + 2) ? &(getWireLayer(iLayer + 2).getWireWrappedAround(iWire + 1)) : nullptr; }
327
329 TrackingUtilities::MayBePtr<const CDCWire> getSecondNeighborTwelveOClock(ILayer iLayer, IWire iWire) const
330 { return isValidILayer(iLayer + 2) ? &(getWireLayer(iLayer + 2).getWireWrappedAround(iWire)) : nullptr; }
331
332
333 private:
336
339
342
343 };
344
345 }
347}
Class representing a sense wire layer in the central drift chamber.
const CDCWire & getWire(IWire iWire) const
Gives the wire by its id in the layer.
bool isValidIWire(IWire iWire) const
Checks if the given wire id belongs to a valid wire in this layer.
const CDCWire & getNeighborCCW(IWire iWire) const
Getter for the first counterclockwise neighbor by wire id in the layer.
const CDCWire & getWireWrappedAround(IWire iWire) const
Returns the wire by its id in the layer.
const CDCWire & getNeighborCW(IWire iWire) const
Getter for the first clockwise neighbor by wire id in the layer.
TrackingUtilities::MayBePtr< const CDCWire > getNeighborCCW(ILayer iLayer, IWire iWire) const
Getter for the nearest counterclockwise neighbor by wire id and layer id with in this superlayer.
TrackingUtilities::MayBePtr< const CDCWire > getNeighborCCWInwards(ILayer iLayer, IWire iWire) const
Getter for the nearest clockwise neighbor in the next layer outwards by wire id and layer id with in ...
double m_refTanLambda
Memory for (fitted) proportionality factor between the increasing cylindrical radius and the referenc...
TrackingUtilities::MayBePtr< const CDCWire > getSecondNeighborSixOClock(ILayer iLayer, IWire iWire) const
Getter for secondary neighbor at the six o'clock position.
TrackingUtilities::MayBePtr< const CDCWire > getPrimaryNeighbor(short oClockDirection, ILayer iLayer, IWire iWire) const
Getter for the two closest neighbors in the given o'clock direction.
double getMiddleCylindricalR() const
Getter for the radius in the middle of the layer.
TrackingUtilities::MayBePtr< const CDCWire > getNeighborCCWOutwards(ILayer iLayer, IWire iWire) const
Getter for the nearest clockwise neighbor in the next layer outwards by wire id and layer id with in ...
void initialize()
Initializes the superlayer variables of according the layer range. Set the numbering shift of contain...
ISuperLayer getISuperLayer() const
Getter for the super layer id.
double m_outerRefZ
Memory for the (fitted) z of the reference wire reference points at the outer cylindricalR of this su...
TrackingUtilities::MayBePtr< const CDCWire > getSecondNeighborElevenOClock(ILayer iLayer, IWire iWire) const
Getter for secondary neighbor at the elven o'clock position.
bool isAxial() const
Indicates if the wire is axial or stereo.
TrackingUtilities::MayBePtr< const CDCWire > getSecondNeighborThreeOClock(ILayer iLayer, IWire iWire) const
Getter for secondary neighbor at the three o'clock position.
TrackingUtilities::MayBePtr< const CDCWire > getSecondNeighborFourOClock(ILayer iLayer, IWire iWire) const
Getter for secondary neighbor at the four o'clock position.
TrackingUtilities::MayBePtr< const CDCWire > getSecondNeighborTwelveOClock(ILayer iLayer, IWire iWire) const
Getter for secondary neighbor at the twelve o'clock position.
double m_innerRefZ
Memory for the (fitted) z of the reference wire reference points at the inner cylindricalR of this su...
TrackingUtilities::MayBePtr< const CDCWire > getNeighborCW(ILayer iLayer, IWire iWire) const
Getter for the nearest clockwise neighbor by wire id and layer id with in this superlayer.
CDCWireSuperLayer(CDCWireSuperLayer &&wireSuperLayer)=default
Allow move construction of wire super layers for use in std::vector.
double getInnerCylindricalR() const
Getter for the inner radius of the layer as retrieved from the CDCGeometryPar by the inner most layer...
WireNeighborPair getNeighborsOutwards(ILayer iLayer, IWire iWire) const
Getter for the two closest neighbors in the layer outwards of the given on.
TrackingUtilities::MayBePtr< const CDCWire > getNeighborCWInwards(ILayer iLayer, IWire iWire) const
Getter for the nearest clockwise neighbor in the next layer outwards by wire id and layer id with in ...
void operator=(const CDCWireSuperLayer &wireSuperLayer)=delete
Disallow copy assignment of wire super layers.
double getOuterRefZ() const
Getter for the (fitted) z of the reference wire reference points at the outer cylindricalR of this su...
bool isValidIWire(ILayer iLayer, IWire iWire) const
Checks if the given wire id belongs to a valid wire in this superlayer.
TrackingUtilities::MayBePtr< const CDCWire > getSecondaryNeighbor(short oClockDirection, ILayer iLayer, IWire iWire) const
getSecondaryNeighbor Secondary neighborhood The secondary neighbors are numbered like positions on th...
TrackingUtilities::MayBePtr< const CDCWire > getSecondNeighborOneOClock(ILayer iLayer, IWire iWire) const
Getter for secondary neighbor at the one o'clock position.
TrackingUtilities::MayBePtr< const CDCWire > getNeighborCWOutwards(ILayer iLayer, IWire iWire) const
Getter for the nearest clockwise neighbor in the next layer outwards by wire id and layer id with in ...
CDCWireSuperLayer(const CDCWireSuperLayer &wireSuperLayer)=delete
Disallow copy construction of wire super layers.
CDCWireSuperLayer()
Empty constructor for creating an empty dummy CDCWireSuperLayer for studies with a CDC with missing s...
TrackingUtilities::MayBePtr< const CDCWire > getSecondNeighborTenOClock(ILayer iLayer, IWire iWire) const
Getter for secondary neighbor at the ten o'clock position.
bool isValidILayer(ILayer iLayer) const
Checks if the given layer id belongs to a valid layer in this superlayer.
const CDCWireLayer & getWireLayer(ILayer iLayer) const
Gives the layer by its layer id within the superlayer.
TrackingUtilities::MayBePtr< const CDCWire > getSecondNeighborSevenOClock(ILayer iLayer, IWire iWire) const
Getter for secondary neighbor at the seven o'clock position.
double getRefTanLambda() const
Getter for (fitted) proportionality factor between the increasing cylindrical radius and the referenc...
WireNeighborKind getNeighborKind(ILayer iLayer, IWire iWire, ILayer iOtherLayer, IWire iOtherWire) const
Checks if two wires are closest neighbors.
EStereoKind getStereoKind() const
Getter for the stereo type of the wire layer Gives the stereo type of the wire.
double getOuterCylindricalR() const
Getter for the outer radius of the layer as retrieved from the CDCGeometryPar by the outer most layer...
TrackingUtilities::ConstVectorRange< CDCWireLayer > Super
Type of the base class.
TrackingUtilities::MayBePtr< const CDCWire > getSecondNeighborEightOClock(ILayer iLayer, IWire iWire) const
Getter for secondary neighbor at the eight o'clock position.
double getInnerRefZ() const
Getter for the (fitted) z of the reference wire reference points at the inner cylindricalR of this su...
TrackingUtilities::MayBePtr< const CDCWire > getSecondNeighborNineOClock(ILayer iLayer, IWire iWire) const
Getter for secondary neighbor at the nine o'clock position.
TrackingUtilities::MayBePtr< const CDCWire > getSecondNeighborFiveOClock(ILayer iLayer, IWire iWire) const
Getter for secondary neighbor at the five o'clock position.
const CDCWire & getWire(ILayer iLayer, IWire iWire) const
Gives the wire by its layer id within the superlayer and the wire id in the layer.
TrackingUtilities::MayBePtr< const CDCWire > getSecondNeighborTwoOClock(ILayer iLayer, IWire iWire) const
Getter for secondary neighbor at the two o'clock position.
WireNeighborPair getNeighborsInwards(ILayer iLayer, IWire iWire) const
Getter for the two closest neighbors in the layer inwards of the given on.
Class representing a sense wire in the central drift chamber.
Definition CDCWire.h:50
Type for the neighbor relationship from one wire to another.
Class representing a pair of neighbors in the CDC in a single layer For certain circumstances it is a...
Reference back() const
Returns the dereferenced iterator before end()
Definition Range.h:84
Reference front() const
Returns the dereferenced iterator at begin()
Definition Range.h:80
std::size_t size() const
Returns the total number of objects in this range.
Definition Range.h:76
Reference at(std::size_t i) const
Returns the object at index i.
Definition Range.h:92
signed short IWire
The type of the wire ids enumerating wires within a given layer.
Definition IWire.h:20
signed short ILayer
The type of the layer ids enumerating layers within a superlayer.
Definition ILayer.h:18
EStereoKind
Type for the stereo property of the wire.
Definition EStereoKind.h:20
@ c_Axial
Constant for an axial wire.
Definition EStereoKind.h:22
signed short ISuperLayer
The type of the layer and superlayer ids.
Definition ISuperLayer.h:24
Abstract base class for different kinds of events.