Belle II Software development
CDCSimpleSimulation Class Reference

Class providing a simple simulation of the CDC mainly for quick unit test checks. More...

#include <CDCSimpleSimulation.h>

Classes

struct  SimpleSimHit
 Structure to accommodate information about the individual hits during the simulation. More...
 

Public Member Functions

TrackingUtilities::ConstVectorRange< TrackingUtilities::CDCWireHitgetWireHits () const
 Getter for the wire hits created in the simulation.
 
std::vector< TrackingUtilities::CDCTracksimulate (const std::vector< TrackingUtilities::CDCTrajectory3D > &trajectories3D)
 Propagates the trajectories through the CDC as without energy loss until they first leave the CDC.
 
TrackingUtilities::CDCTrack simulate (const TrackingUtilities::CDCTrajectory3D &trajectory3D)
 Same as above for one trajectory.
 
std::vector< TrackingUtilities::CDCTrackloadPreparedEvent ()
 Fills the wire hits with a hard coded event from the real simulation.
 
double getEventTime () const
 Getter for a global event time offset.
 
void setEventTime (double eventTime)
 Setter for a global event time offset.
 
void activateTOFDelay (bool activate=true)
 Activate the TOF time delay.
 
void activateInWireSignalDelay (bool activate=true)
 Activate the in wire signal delay.
 
int getMaxNHitOnWire () const
 Getter for the maximal number of hits that are allowed on each layer.
 
void setMaxNHitOnWire (int maxNHitOnWire)
 Setter for the maximal number of hits that are allowed on each layer.
 

Private Member Functions

std::vector< TrackingUtilities::CDCTrackconstructMCTracks (int nMCTracks, std::vector< SimpleSimHit > simpleSimHits)
 Creates TrackingUtilities::CDCWireHits and uses them to construct the true TrackingUtilities::CDCTracks.
 
std::vector< SimpleSimHitcreateHits (const TrackingUtilities::Helix &globalHelix, double arcLength2DOffset) const
 Generate hits for the given helix in starting from the two dimensional arc length.
 
std::vector< SimpleSimHitcreateHitsForLayer (const CDC::CDCWire &nearWire, const TrackingUtilities::Helix &globalHelix, double arcLength2DOffset) const
 Generate connected hits for wires in the same layer close to the given wire.
 
SimpleSimHit createHitForCell (const CDC::CDCWire &wire, const TrackingUtilities::Helix &globalHelix, double arcLength2DOffset) const
 Generate a hit for the given wire.
 

Private Attributes

std::shared_ptr< const std::vector< TrackingUtilities::CDCWireHit > > m_sharedWireHits
 Space for the memory of the generated wire hits.
 
const double s_nominalDriftLengthVariance = 0.000169
 Default drift length variance.
 
const double s_nominalPropSpeed = 27.25
 Default in wire signal propagation speed - 27.25 cm / ns.
 
const double s_nominalDriftSpeed = 4e-3
 Default electron drift speed in cdc gas - 4 * 10^-3 cm / ns.
 
int m_maxNHitOnWire = 0
 Maximal number of hits allowed on each wire (0 means all).
 
double m_eventTime = 0
 A global event time.
 
bool m_addTOFDelay = false
 Switch to activate the addition of the time of flight.
 
bool m_addInWireSignalDelay = false
 Switch to activate the in wire signal delay.
 
double m_driftLengthVariance = s_nominalDriftLengthVariance
 Variance by which the drift length should be smeared.
 
double m_driftLengthSigma = std::sqrt(m_driftLengthVariance)
 Standard deviation by which the drift length should be smeared.
 
double m_propSpeed = s_nominalPropSpeed
 Electrical current propagation speed in the wires.
 
double m_driftSpeed = s_nominalDriftSpeed
 Electron drift speed in the cdc gas.
 

Detailed Description

Class providing a simple simulation of the CDC mainly for quick unit test checks.

Most aspects of the detection are idealized

  • Trajectories are ideal helices
  • Wires are straight lines
  • Drift relation linear
  • No detection inefficiencies are enabled
  • T0, TOF and signal delay in the wire are not taken into account (but can eventually implemented to study them)

Nevertheless drift length a smeared by one Gaussian distribution of fixed width to have a realistic check for the accuracy of fast fitting procedures in terms of their chi2 distributions.

Definition at line 47 of file CDCSimpleSimulation.h.

Member Function Documentation

◆ activateInWireSignalDelay()

void activateInWireSignalDelay ( bool activate = true)
inline

Activate the in wire signal delay.

Definition at line 153 of file CDCSimpleSimulation.h.

154 { m_addInWireSignalDelay = activate; }

◆ activateTOFDelay()

void activateTOFDelay ( bool activate = true)
inline

Activate the TOF time delay.

Definition at line 149 of file CDCSimpleSimulation.h.

150 { m_addTOFDelay = activate; }

◆ constructMCTracks()

std::vector< CDCTrack > constructMCTracks ( int nMCTracks,
std::vector< SimpleSimHit > simpleSimHits )
private

Creates TrackingUtilities::CDCWireHits and uses them to construct the true TrackingUtilities::CDCTracks.

Sort the hits by the order of their occurrence

Definition at line 91 of file CDCSimpleSimulation.cc.

92{
93
94 // Sort the hits along side their wire hits
95 std::stable_sort(simpleSimHits.begin(), simpleSimHits.end(),
96 [](const SimpleSimHit & lhs, const SimpleSimHit & rhs) -> bool {
97 return lhs.m_wireHit < rhs.m_wireHit;
98 });
99
100 // Discard multiple hits on the same wire up to the maximal exceeding the maximal desired number
101 if (m_maxNHitOnWire > 0) {
102 const CDCWire* lastWire = nullptr;
103 size_t nSameWire = 0;
104 const size_t maxNHitOnWire = m_maxNHitOnWire;
105
106 auto exceedsMaxNHitOnWire =
107 [&lastWire, &nSameWire, maxNHitOnWire](const SimpleSimHit & simpleSimHit) -> bool {
108
109 if (&(simpleSimHit.m_wireHit.getWire()) == lastWire)
110 {
111 ++nSameWire;
112 } else
113 {
114 nSameWire = 1;
115 lastWire = &(simpleSimHit.m_wireHit.getWire());
116 }
117 return nSameWire > maxNHitOnWire ? true : false;
118 };
119
120 auto itLast = std::remove_if(simpleSimHits.begin(), simpleSimHits.end(), exceedsMaxNHitOnWire);
121 simpleSimHits.erase(itLast, simpleSimHits.end());
122 }
123
124 // Write the created hits and move them to the their storage place.
125 {
126 std::vector<CDCWireHit> wireHits;
127 wireHits.reserve(simpleSimHits.size());
128 for (SimpleSimHit& simpleSimHit : simpleSimHits) {
129 wireHits.push_back(simpleSimHit.m_wireHit);
130 }
131
132 B2ASSERT("WireHits should be sorted as a result from sorting the SimpleSimHits. "
133 "Algorithms may relay on the sorting o the WireHits",
134 std::is_sorted(wireHits.begin(), wireHits.end()));
135
136 m_sharedWireHits.reset(new const std::vector<CDCWireHit>(std::move(wireHits)));
137 }
138
139 // TODO: Decide if the EventMeta should be incremented after write.
140
141 // Now construct the tracks.
142 std::vector<CDCTrack> mcTracks;
143 mcTracks.resize(nMCTracks);
144 ConstVectorRange<CDCWireHit> wireHits = getWireHits();
145 const size_t nWireHits = wireHits.size();
146
147 for (size_t iWireHit = 0; iWireHit < nWireHits; ++iWireHit) {
148 const CDCWireHit& wireHit = wireHits[iWireHit];
149 const SimpleSimHit& simpleSimHit = simpleSimHits[iWireHit];
150
151 CDCTrack& mcTrack = mcTracks[simpleSimHit.m_iMCTrack];
152
153 CDCRLWireHit rlWireHit(&wireHit, simpleSimHit.m_rlInfo);
154 CDCRecoHit3D recoHit3D(rlWireHit, simpleSimHit.m_pos3D, simpleSimHit.m_arcLength2D);
155 mcTrack.push_back(recoHit3D);
156 }
157
159 for (CDCTrack& mcTrack : mcTracks) {
160 mcTrack.sortByArcLength2D();
161 }
162
163 return mcTracks;
164}
TrackingUtilities::ConstVectorRange< TrackingUtilities::CDCWireHit > getWireHits() const
Getter for the wire hits created in the simulation.
std::shared_ptr< const std::vector< TrackingUtilities::CDCWireHit > > m_sharedWireHits
Space for the memory of the generated wire hits.
int m_maxNHitOnWire
Maximal number of hits allowed on each wire (0 means all).
void sortByArcLength2D()
Sort the recoHits according to their perpS information.
Definition CDCTrack.cc:412
std::size_t size() const
Returns the total number of objects in this range.
Definition Range.h:76
Structure to accommodate information about the individual hits during the simulation.

◆ createHitForCell()

CDCSimpleSimulation::SimpleSimHit createHitForCell ( const CDC::CDCWire & wire,
const TrackingUtilities::Helix & globalHelix,
double arcLength2DOffset ) const
private

Generate a hit for the given wire.

Definition at line 317 of file CDCSimpleSimulation.cc.

320{
321 double arcLength2D = globalHelix.arcLength2DToXY(wire.getRefPos2D());
322 if ((arcLength2D + arcLength2DOffset) < 0) {
323 arcLength2D += globalHelix.perimeterXY();
324 }
325
326 Vector3D pos3D = globalHelix.atArcLength2D(arcLength2D);
327
328 Vector3D correctedPos3D = pos3D;
329 Vector2D correctedWirePos(wire.getWirePos2DAtZ(correctedPos3D.z()));
330 double correctedArcLength2D = arcLength2D;
331
332 for (int c_Iter = 0; c_Iter < 2; c_Iter++) {
333 // Iterate the extrapolation to the stereo shifted position.
334 correctedWirePos = wire.getWirePos2DAtZ(correctedPos3D.z());
335 correctedArcLength2D = globalHelix.arcLength2DToXY(correctedWirePos);
336
337 if ((correctedArcLength2D + arcLength2DOffset) < 0) {
338 correctedArcLength2D += globalHelix.perimeterXY();
339 }
340 correctedPos3D = globalHelix.atArcLength2D(correctedArcLength2D);
341 }
342
343 const double trueDriftLength = wire.getDriftLength(correctedPos3D);
344 const double smearedDriftLength = trueDriftLength + gRandom->Gaus(0, m_driftLengthSigma);
345
346 double delayTime = getEventTime();
347 if (m_addTOFDelay) {
348 double arcLength3D = hypot2(1, globalHelix.tanLambda()) * (correctedArcLength2D + arcLength2DOffset);
349 delayTime += arcLength3D / Const::speedOfLight;
350 }
351
353 double backwardZ = wire.getBackwardZ();
354 // Position where wire has been hit
355 Vector3D wirePos = wire.getClosest(correctedPos3D);
356 double distanceToBack = (wirePos.z() - backwardZ) * hypot2(1, wire.getTanStereoAngle());
357
358 delayTime += distanceToBack / m_propSpeed;
359 }
360
361 double measuredDriftLength = smearedDriftLength + delayTime * m_driftSpeed;
362
363 ERightLeft rlInfo = globalHelix.circleXY().isRightOrLeft(correctedWirePos);
364
365 // if (not std::isnan(trueDriftLength)){
366 // B2INFO("Delay time " << delayTime);
367 // B2INFO("True dirft length " << trueDriftLength);
368 // B2INFO("Measured drift length " << measuredDriftLength);
369 // B2INFO("Absolute deviation " << measuredDriftLength - trueDriftLength);
370 // B2INFO("Relative deviation " << (measuredDriftLength / trueDriftLength - 1) * 100 << "%");
371 // }
372
373 return SimpleSimHit{
374 CDCWireHit(wire.getWireID(), measuredDriftLength, m_driftLengthVariance),
375 0,
376 rlInfo,
377 correctedPos3D,
378 correctedArcLength2D,
379 trueDriftLength
380 };
381}
const ROOT::Math::XYVector & getRefPos2D() const
Getter for the wire reference position for 2D tracking Gives the wire's reference position projected ...
Definition CDCWire.h:221
const WireID & getWireID() const
Getter for the wire id.
Definition CDCWire.h:114
ROOT::Math::XYVector getWirePos2DAtZ(const double z) const
Gives the xy projected position of the wire at the given z coordinate.
Definition CDCWire.h:184
double getDriftLength(const ROOT::Math::XYZVector &pos3D) const
Calculates the straight drift length from the position to the wire This is essentially the same as th...
Definition CDCWire.h:206
double getTanStereoAngle() const
Getter for the tangents of the stereo angle of the wire.
Definition CDCWire.h:232
double getBackwardZ() const
Getter for the z coordinate at the backward joint points of the wires.
Definition CDCWire.h:272
ROOT::Math::XYZVector getClosest(const ROOT::Math::XYZVector &pos3D) const
Calculates the closest approach in the wire to the position.
Definition CDCWire.h:196
static const double speedOfLight
[cm/ns]
Definition Const.h:695
bool m_addInWireSignalDelay
Switch to activate the in wire signal delay.
double m_propSpeed
Electrical current propagation speed in the wires.
double getEventTime() const
Getter for a global event time offset.
double m_driftLengthVariance
Variance by which the drift length should be smeared.
bool m_addTOFDelay
Switch to activate the addition of the time of flight.
double m_driftLengthSigma
Standard deviation by which the drift length should be smeared.
double m_driftSpeed
Electron drift speed in the cdc gas.
double z() const
Getter for the z coordinate.
Definition Vector3D.h:501
HepGeom::Vector3D< double > Vector3D
3D Vector
Definition Cell.h:34
ERightLeft
Enumeration to represent the distinct possibilities of the right left passage.
Definition ERightLeft.h:25

◆ createHits()

std::vector< CDCSimpleSimulation::SimpleSimHit > createHits ( const TrackingUtilities::Helix & globalHelix,
double arcLength2DOffset ) const
private

Generate hits for the given helix in starting from the two dimensional arc length.

Definition at line 169 of file CDCSimpleSimulation.cc.

171{
172
173 std::vector<SimpleSimHit> simpleSimHits;
174
175 CDCWireTopology& wireTopology = CDCWireTopology::getInstance();
176 const double outerWallCylinderR = wireTopology.getOuterCylindricalR();
177
178 const double minR = globalHelix.minimalCylindricalR();
179 const double maxR = globalHelix.maximalCylindricalR();
180
181 const double globalArcLength2DToOuterWall = globalHelix.arcLength2DToCylindricalR(outerWallCylinderR);
182 const double localArcLength2DToOuterWall = arcLength2DOffset + globalArcLength2DToOuterWall;
183
184 if (localArcLength2DToOuterWall < 0) {
185 // Trajectory starts outside the CDC and initially flys away from it
186 // Do not try to createHit hits for it
187 B2WARNING("Simple simulation got trajectory outside CDC that moves away from the detector.");
188 return simpleSimHits;
189 }
190
191 // Two dimensional arc length where the trajectory
192 // * leaves the outer wall of the CDC or
193 // * made a full circle (cut off for curlers)
194 const bool isCurler = std::isnan(localArcLength2DToOuterWall);
195 const double perimeterXY = globalHelix.perimeterXY();
196 const double maxArcLength2D = isCurler ? fabs(perimeterXY) : localArcLength2DToOuterWall;
197
198 if (isCurler) {
199 B2INFO("Simulating curler");
200 }
201
202 for (const CDCWireLayer& wireLayer : wireTopology.getWireLayers()) {
203 double outerR = wireLayer.getOuterCylindricalR();
204 double innerR = wireLayer.getInnerCylindricalR();
205
206 if ((maxR < innerR) or (outerR < minR)) {
207 // Trajectory does not reaching the layer
208 continue;
209 }
210
211 double centerR = (std::min(outerR, maxR) + std::max(innerR, minR)) / 2;
212
213 double globalArcLength2D = globalHelix.arcLength2DToCylindricalR(centerR);
214 double localArcLength2D = arcLength2DOffset + globalArcLength2D;
215
216
217 std::vector<SimpleSimHit> simpleSimHitsInLayer;
218 if (localArcLength2D > 0 and localArcLength2D < maxArcLength2D) {
219
220 Vector3D pos3DAtLayer = globalHelix.atArcLength2D(globalArcLength2D);
221 const CDCWire& closestWire = wireLayer.getClosestWire(pos3DAtLayer);
222
223 simpleSimHitsInLayer = createHitsForLayer(closestWire, globalHelix, arcLength2DOffset);
224
225 for (SimpleSimHit& simpleSimHit : simpleSimHitsInLayer) {
226 if (simpleSimHit.m_arcLength2D < maxArcLength2D) {
227 simpleSimHits.push_back(simpleSimHit);
228 }
229 }
230 } else {
231 B2INFO("Arc length to long");
232 }
233
234 bool oneSegment = outerR > maxR or innerR < minR;
235 if (not oneSegment) {
236
237 // Check the second branch for more hits
238 double secondGlobalArcLength2D = -globalArcLength2D;
239 double secondArcLength2DOffset = arcLength2DOffset;
240 double secondLocalArcLength2D = secondArcLength2DOffset + secondGlobalArcLength2D;
241
242 if (isCurler and secondLocalArcLength2D < 0) {
243 secondLocalArcLength2D += perimeterXY;
244 secondArcLength2DOffset += perimeterXY;
245 secondGlobalArcLength2D += perimeterXY;
246 }
247
248 if (secondLocalArcLength2D > 0 and secondLocalArcLength2D < maxArcLength2D) {
249 Vector3D pos3DAtLayer = globalHelix.atArcLength2D(secondGlobalArcLength2D);
250 const CDCWire& closestWire = wireLayer.getClosestWire(pos3DAtLayer);
251
252 // Check again if the wire has been hit before
253 bool wireAlreadyHit = false;
254 for (const SimpleSimHit& simpleSimHit : simpleSimHits) {
255 if (simpleSimHit.m_wireHit.isOnWire(closestWire)) {
256 wireAlreadyHit = true;
257 }
258 }
259 if (not wireAlreadyHit) {
260 std::vector<SimpleSimHit> secondSimpleSimHitsInLayer =
261 createHitsForLayer(closestWire, globalHelix, secondArcLength2DOffset);
262
263 for (SimpleSimHit& simpleSimHit : secondSimpleSimHitsInLayer) {
264 if (simpleSimHit.m_arcLength2D < maxArcLength2D) {
265 simpleSimHits.push_back(simpleSimHit);
266 }
267 }
268 }
269 }
270 }
271 }
272
273 return simpleSimHits;
274}
const std::vector< CDCWireLayer > & getWireLayers() const
Getter for the underlying storing layer vector.
static CDCWireTopology & getInstance()
Getter for the singleton instance of the wire topology.
double getOuterCylindricalR() const
Getter for the outer radius of the outer most wire layer.
std::vector< SimpleSimHit > createHitsForLayer(const CDC::CDCWire &nearWire, const TrackingUtilities::Helix &globalHelix, double arcLength2DOffset) const
Generate connected hits for wires in the same layer close to the given wire.

◆ createHitsForLayer()

std::vector< CDCSimpleSimulation::SimpleSimHit > createHitsForLayer ( const CDC::CDCWire & nearWire,
const TrackingUtilities::Helix & globalHelix,
double arcLength2DOffset ) const
private

Generate connected hits for wires in the same layer close to the given wire.

Iter counter clockwise for more hits

Iter clockwise for more hits

Definition at line 277 of file CDCSimpleSimulation.cc.

280{
281 std::vector<SimpleSimHit> result;
282
283 SimpleSimHit simpleSimHit = createHitForCell(nearWire, globalHelix, arcLength2DOffset);
284 if (not std::isnan(simpleSimHit.m_wireHit.getRefDriftLength())) {
285 result.push_back(simpleSimHit);
286 }
287
289 const CDCWire* ccwWire = nearWire.getNeighborCCW();
290 while (true) {
291 SimpleSimHit simpleSimHitForWire = createHitForCell(*ccwWire, globalHelix, arcLength2DOffset);
292 if (std::isnan(simpleSimHitForWire.m_arcLength2D) or
293 std::isnan(simpleSimHitForWire.m_trueDriftLength)) {
294 break;
295 }
296 result.push_back(simpleSimHitForWire);
297 ccwWire = ccwWire->getNeighborCCW();
298 }
299
301 const CDCWire* cwWire = nearWire.getNeighborCW();
302 while (true) {
303 SimpleSimHit simpleSimHitForWire = createHitForCell(*cwWire, globalHelix, arcLength2DOffset);
304 if (std::isnan(simpleSimHitForWire.m_arcLength2D) or
305 std::isnan(simpleSimHitForWire.m_trueDriftLength)) {
306 break;
307 }
308 result.push_back(simpleSimHitForWire);
309 cwWire = cwWire->getNeighborCW();
310 }
311
312 return result;
313}
TrackingUtilities::MayBePtr< const CDCWire > getNeighborCCW() const
Gives the closest neighbor in the counterclockwise direction - always exists.
Definition CDCWire.cc:159
TrackingUtilities::MayBePtr< const CDCWire > getNeighborCW() const
Gives the closest neighbor in the clockwise direction - always exists.
Definition CDCWire.cc:164
SimpleSimHit createHitForCell(const CDC::CDCWire &wire, const TrackingUtilities::Helix &globalHelix, double arcLength2DOffset) const
Generate a hit for the given wire.

◆ getEventTime()

double getEventTime ( ) const
inline

Getter for a global event time offset.

Definition at line 141 of file CDCSimpleSimulation.h.

142 { return m_eventTime; }

◆ getMaxNHitOnWire()

int getMaxNHitOnWire ( ) const
inline

Getter for the maximal number of hits that are allowed on each layer.

Definition at line 157 of file CDCSimpleSimulation.h.

158 { return m_maxNHitOnWire; }

◆ getWireHits()

ConstVectorRange< CDCWireHit > getWireHits ( ) const

Getter for the wire hits created in the simulation.

Definition at line 35 of file CDCSimpleSimulation.cc.

36{
37 if (m_sharedWireHits) {
38 return {m_sharedWireHits->begin(), m_sharedWireHits->end()};
39 } else {
40 return ConstVectorRange<CDCWireHit>();
41 }
42}

◆ loadPreparedEvent()

std::vector< CDCTrack > loadPreparedEvent ( )

Fills the wire hits with a hard coded event from the real simulation.

Definition at line 385 of file CDCSimpleSimulation.cc.

386{
387 const size_t nMCTracks = 2;
388 std::vector<SimpleSimHit> simpleSimHits;
389 simpleSimHits.reserve(128 + 64); // First plus second mc track
390
391 // First MC track
393 size_t iMCTrack = 0;
394
395 // SL 6
396 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 4, 251), 0.104), iMCTrack, ERightLeft::c_Left});
397 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 4, 250), 0.272), iMCTrack, ERightLeft::c_Left});
398 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 4, 249), 0.488), iMCTrack, ERightLeft::c_Left});
399 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 4, 248), 0.764), iMCTrack, ERightLeft::c_Left});
400 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 3, 247), 0.9), iMCTrack, ERightLeft::c_Right});
401 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 4, 247), 1.024), iMCTrack, ERightLeft::c_Left});
402 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 3, 246), 0.64), iMCTrack, ERightLeft::c_Right});
403 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 3, 245), 0.304), iMCTrack, ERightLeft::c_Right});
404 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 3, 244), 0.012), iMCTrack, ERightLeft::c_Right});
405 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 3, 243), 0.352), iMCTrack, ERightLeft::c_Left});
406 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 3, 242), 0.74), iMCTrack, ERightLeft::c_Left});
407 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 2, 241), 0.46), iMCTrack, ERightLeft::c_Right});
408 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 2, 240), 0.02), iMCTrack, ERightLeft::c_Right});
409 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 2, 239), 0.46), iMCTrack, ERightLeft::c_Left});
410 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 2, 238), 0.884), iMCTrack, ERightLeft::c_Left});
411 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 1, 238), 1.104), iMCTrack, ERightLeft::c_Right});
412 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 1, 237), 0.612), iMCTrack, ERightLeft::c_Right});
413 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 1, 236), 0.12), iMCTrack, ERightLeft::c_Right});
414 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 1, 235), 0.356), iMCTrack, ERightLeft::c_Left});
415 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 1, 234), 0.884), iMCTrack, ERightLeft::c_Left});
416 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 0, 235), 1.032), iMCTrack, ERightLeft::c_Right});
417 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 0, 234), 0.52), iMCTrack, ERightLeft::c_Right});
418 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 0, 233), 0.06), iMCTrack, ERightLeft::c_Left});
419 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 0, 232), 0.62), iMCTrack, ERightLeft::c_Left});
420
421 // SL 5
422 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 5, 206), 1.116), iMCTrack, ERightLeft::c_Right});
423 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 5, 205), 0.464), iMCTrack, ERightLeft::c_Right});
424 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 5, 204), 0.168), iMCTrack, ERightLeft::c_Right});
425 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 4, 204), 1.08), iMCTrack, ERightLeft::c_Right});
426 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 4, 203), 0.392), iMCTrack, ERightLeft::c_Right});
427 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 4, 202), 0.304), iMCTrack, ERightLeft::c_Left});
428 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 3, 201), 0.968), iMCTrack, ERightLeft::c_Right});
429 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 3, 200), 0.252), iMCTrack, ERightLeft::c_Right});
430 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 3, 199), 0.476), iMCTrack, ERightLeft::c_Left});
431 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 2, 199), 0.736), iMCTrack, ERightLeft::c_Right});
432 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 2, 198), 0.008), iMCTrack, ERightLeft::c_Left});
433 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 2, 197), 0.788), iMCTrack, ERightLeft::c_Left});
434 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 1, 197), 1.188), iMCTrack, ERightLeft::c_Right});
435 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 1, 196), 0.404), iMCTrack, ERightLeft::c_Right});
436 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 1, 195), 0.356), iMCTrack, ERightLeft::c_Left});
437 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 0, 195), 0.74), iMCTrack, ERightLeft::c_Right});
438 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 0, 194), 0.04), iMCTrack, ERightLeft::c_Left});
439 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 0, 193), 0.832), iMCTrack, ERightLeft::c_Left});
440
441 // SL 4
442 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 5, 173), 0.692), iMCTrack, ERightLeft::c_Right});
443 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 5, 172), 0.22), iMCTrack, ERightLeft::c_Left});
444 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 5, 171), 1.132), iMCTrack, ERightLeft::c_Left});
445 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 4, 172), 0.816), iMCTrack, ERightLeft::c_Right});
446 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 4, 171), 0.136), iMCTrack, ERightLeft::c_Left});
447 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 4, 170), 1.048), iMCTrack, ERightLeft::c_Left});
448 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 3, 170), 0.884), iMCTrack, ERightLeft::c_Right});
449 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 3, 169), 0.032), iMCTrack, ERightLeft::c_Left});
450 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 3, 168), 0.96), iMCTrack, ERightLeft::c_Left});
451 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 2, 169), 0.972), iMCTrack, ERightLeft::c_Right});
452 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 2, 168), 0.044), iMCTrack, ERightLeft::c_Right});
453 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 2, 167), 0.872), iMCTrack, ERightLeft::c_Left});
454 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 1, 167), 1.004), iMCTrack, ERightLeft::c_Right});
455 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 1, 166), 0.1), iMCTrack, ERightLeft::c_Right});
456 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 1, 165), 0.828), iMCTrack, ERightLeft::c_Left});
457 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 0, 166), 1.004), iMCTrack, ERightLeft::c_Right});
458 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 0, 165), 0.084), iMCTrack, ERightLeft::c_Right});
459 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 0, 164), 0.82), iMCTrack, ERightLeft::c_Left});
460
461 // SL 3
462 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 5, 145), 0.508), iMCTrack, ERightLeft::c_Right});
463 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 5, 144), 0.5), iMCTrack, ERightLeft::c_Left});
464 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 4, 145), 1.348), iMCTrack, ERightLeft::c_Right});
465 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 4, 144), 0.292), iMCTrack, ERightLeft::c_Right});
466 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 4, 143), 0.68), iMCTrack, ERightLeft::c_Left});
467 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 3, 143), 1.136), iMCTrack, ERightLeft::c_Right});
468 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 3, 142), 0.12), iMCTrack, ERightLeft::c_Right});
469 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 3, 141), 0.872), iMCTrack, ERightLeft::c_Left});
470 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 2, 142), 0.96), iMCTrack, ERightLeft::c_Right});
471 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 2, 141), 0.036), iMCTrack, ERightLeft::c_Left});
472 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 1, 140), 0.756), iMCTrack, ERightLeft::c_Right});
473 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 1, 139), 0.204), iMCTrack, ERightLeft::c_Left});
474 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 0, 139), 0.588), iMCTrack, ERightLeft::c_Right});
475 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 0, 138), 0.332), iMCTrack, ERightLeft::c_Left});
476
477 // SL 2
478 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 5, 116), 1.1), iMCTrack, ERightLeft::c_Right});
479 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 5, 115), 0.008), iMCTrack, ERightLeft::c_Left});
480 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 5, 114), 1.048), iMCTrack, ERightLeft::c_Left});
481 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 4, 115), 0.712), iMCTrack, ERightLeft::c_Right});
482 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 4, 114), 0.316), iMCTrack, ERightLeft::c_Left});
483 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 3, 113), 0.428), iMCTrack, ERightLeft::c_Right});
484 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 3, 112), 0.572), iMCTrack, ERightLeft::c_Left});
485 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 2, 112), 0.188), iMCTrack, ERightLeft::c_Right});
486 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 2, 111), 0.776), iMCTrack, ERightLeft::c_Left});
487 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 1, 111), 0.92), iMCTrack, ERightLeft::c_Right});
488 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 1, 110), 0.024), iMCTrack, ERightLeft::c_Left});
489 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 1, 109), 0.928), iMCTrack, ERightLeft::c_Left});
490 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 0, 110), 0.776), iMCTrack, ERightLeft::c_Right});
491 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 0, 109), 0.116), iMCTrack, ERightLeft::c_Left});
492 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 0, 108), 0.992), iMCTrack, ERightLeft::c_Left});
493
494 // SL 1
495 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 5, 87), 0.664), iMCTrack, ERightLeft::c_Right});
496 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 5, 86), 0.3), iMCTrack, ERightLeft::c_Left});
497 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 4, 86), 0.504), iMCTrack, ERightLeft::c_Right});
498 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 4, 85), 0.424), iMCTrack, ERightLeft::c_Left});
499 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 3, 85), 1.256), iMCTrack, ERightLeft::c_Right});
500 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 3, 84), 0.388), iMCTrack, ERightLeft::c_Right});
501 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 3, 83), 0.5), iMCTrack, ERightLeft::c_Left});
502 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 2, 84), 1.128), iMCTrack, ERightLeft::c_Right});
503 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 2, 83), 0.28), iMCTrack, ERightLeft::c_Right});
504 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 2, 82), 0.532), iMCTrack, ERightLeft::c_Left});
505 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 1, 82), 1.084), iMCTrack, ERightLeft::c_Right});
506 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 1, 81), 0.3), iMCTrack, ERightLeft::c_Right});
507 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 1, 80), 0.472), iMCTrack, ERightLeft::c_Left});
508 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 0, 81), 1.124), iMCTrack, ERightLeft::c_Right});
509 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 0, 80), 0.428), iMCTrack, ERightLeft::c_Right});
510 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 0, 79), 0.296), iMCTrack, ERightLeft::c_Left});
511 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 0, 78), 0.972), iMCTrack, ERightLeft::c_Left});
512
513 // SL 0
514 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 7, 81), 0.192), iMCTrack, ERightLeft::c_Right});
515 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 7, 80), 0.452), iMCTrack, ERightLeft::c_Left});
516 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 6, 80), 0.596), iMCTrack, ERightLeft::c_Right});
517 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 6, 79), 0.024), iMCTrack, ERightLeft::c_Left});
518 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 6, 78), 0.66), iMCTrack, ERightLeft::c_Left});
519 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 5, 79), 0.388), iMCTrack, ERightLeft::c_Right});
520 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 5, 78), 0.184), iMCTrack, ERightLeft::c_Left});
521 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 4, 77), 0.296), iMCTrack, ERightLeft::c_Right});
522 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 4, 76), 0.244), iMCTrack, ERightLeft::c_Left});
523 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 3, 76), 0.268), iMCTrack, ERightLeft::c_Right});
524 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 3, 75), 0.212), iMCTrack, ERightLeft::c_Left});
525 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 2, 74), 0.316), iMCTrack, ERightLeft::c_Right});
526 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 2, 73), 0.112), iMCTrack, ERightLeft::c_Right});
527 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 2, 72), 0.588), iMCTrack, ERightLeft::c_Left});
528 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 1, 73), 0.464), iMCTrack, ERightLeft::c_Right});
529 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 1, 72), 0.028), iMCTrack, ERightLeft::c_Left});
530 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 0, 70), 0.284), iMCTrack, ERightLeft::c_Right});
531 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 0, 69), 0.088), iMCTrack, ERightLeft::c_Left});
532 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 0, 68), 0.416), iMCTrack, ERightLeft::c_Left});
533
534 // Second MC track
536 iMCTrack = 1;
537
538 // SL 0
539 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 1, 140), 0.308), iMCTrack, ERightLeft::c_Left});
540 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 2, 139), 0.08), iMCTrack, ERightLeft::c_Left});
541 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 3, 139), 0.16), iMCTrack, ERightLeft::c_Right});
542 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 4, 139), 0.404), iMCTrack, ERightLeft::c_Left});
543 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 4, 138), 0.38), iMCTrack, ERightLeft::c_Right});
544 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 5, 139), 0.132), iMCTrack, ERightLeft::c_Left});
545 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 6, 138), 0.108), iMCTrack, ERightLeft::c_Right});
546 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 7, 139), 0.48), iMCTrack, ERightLeft::c_Left});
547 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(0, 7, 138), 0.424), iMCTrack, ERightLeft::c_Right});
548
549 // SL 1
550 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 0, 136), 0.532), iMCTrack, ERightLeft::c_Left});
551 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 0, 135), 0.452), iMCTrack, ERightLeft::c_Right});
552 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 1, 135), 0.396), iMCTrack, ERightLeft::c_Left});
553 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 2, 135), 0.26), iMCTrack, ERightLeft::c_Left});
554 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 1, 134), 0.64), iMCTrack, ERightLeft::c_Right});
555 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 3, 134), 0.092), iMCTrack, ERightLeft::c_Left});
556 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 4, 134), 0.16), iMCTrack, ERightLeft::c_Right});
557 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(1, 5, 133), 0.524), iMCTrack, ERightLeft::c_Right});
558
559 // SL 2
560 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 0, 163), 0.228), iMCTrack, ERightLeft::c_Right});
561 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 1, 162), 0.356), iMCTrack, ERightLeft::c_Right});
562 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 2, 163), 0.776), iMCTrack, ERightLeft::c_Left});
563 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 2, 162), 0.46), iMCTrack, ERightLeft::c_Right});
564 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 3, 162), 0.744), iMCTrack, ERightLeft::c_Left});
565 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 3, 161), 0.58), iMCTrack, ERightLeft::c_Right});
566 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 4, 162), 0.656), iMCTrack, ERightLeft::c_Left});
567 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 4, 161), 0.68), iMCTrack, ERightLeft::c_Right});
568 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 5, 161), 0.568), iMCTrack, ERightLeft::c_Left});
569 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(2, 5, 160), 0.812), iMCTrack, ERightLeft::c_Right});
570
571 // SL 3
572 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 0, 190), 0.54), iMCTrack, ERightLeft::c_Left});
573 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 1, 188), 0.688), iMCTrack, ERightLeft::c_Right});
574 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 2, 188), 0.656), iMCTrack, ERightLeft::c_Right});
575 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 3, 188), 0.664), iMCTrack, ERightLeft::c_Left});
576 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 3, 187), 0.68), iMCTrack, ERightLeft::c_Right});
577 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 4, 188), 0.724), iMCTrack, ERightLeft::c_Left});
578 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 4, 187), 0.656), iMCTrack, ERightLeft::c_Right});
579 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(3, 5, 186), 0.676), iMCTrack, ERightLeft::c_Right});
580
581 // SL 4
582 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 0, 211), 0.42), iMCTrack, ERightLeft::c_Left});
583 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 0, 210), 0.872), iMCTrack, ERightLeft::c_Right});
584 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 1, 210), 0.548), iMCTrack, ERightLeft::c_Left});
585 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 1, 209), 0.796), iMCTrack, ERightLeft::c_Right});
586 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 2, 210), 0.716), iMCTrack, ERightLeft::c_Left});
587 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 2, 209), 0.656), iMCTrack, ERightLeft::c_Right});
588 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 3, 209), 0.856), iMCTrack, ERightLeft::c_Left});
589 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 4, 209), 1.056), iMCTrack, ERightLeft::c_Left});
590 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 4, 208), 0.36), iMCTrack, ERightLeft::c_Right});
591 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(4, 5, 207), 0.232), iMCTrack, ERightLeft::c_Right});
592
593 // SL 5
594 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 0, 231), 0.224), iMCTrack, ERightLeft::c_Left});
595 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 0, 230), 1.088), iMCTrack, ERightLeft::c_Right});
596 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 1, 230), 0.452), iMCTrack, ERightLeft::c_Left});
597 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 1, 229), 0.912), iMCTrack, ERightLeft::c_Right});
598 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 2, 230), 0.72), iMCTrack, ERightLeft::c_Left});
599 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 2, 229), 0.632), iMCTrack, ERightLeft::c_Right});
600 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 3, 229), 1.016), iMCTrack, ERightLeft::c_Left});
601 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 3, 228), 0.34), iMCTrack, ERightLeft::c_Right});
602 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 4, 228), 0.04), iMCTrack, ERightLeft::c_Right});
603 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 5, 227), 0.22), iMCTrack, ERightLeft::c_Left});
604 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(5, 5, 226), 1.196), iMCTrack, ERightLeft::c_Right});
605
606 // SL 6
607 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 0, 254), 0.104), iMCTrack, ERightLeft::c_Left});
608 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 1, 253), 0.504), iMCTrack, ERightLeft::c_Left});
609 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 1, 252), 0.78), iMCTrack, ERightLeft::c_Right});
610 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 2, 253), 0.968), iMCTrack, ERightLeft::c_Left});
611 simpleSimHits.push_back(SimpleSimHit{CDCWireHit(WireID(6, 2, 252), 0.332), iMCTrack, ERightLeft::c_Right});
612
613 std::vector<CDCTrack> mcTracks = constructMCTracks(nMCTracks, std::move(simpleSimHits));
614 return mcTracks;
615}
std::vector< TrackingUtilities::CDCTrack > constructMCTracks(int nMCTracks, std::vector< SimpleSimHit > simpleSimHits)
Creates TrackingUtilities::CDCWireHits and uses them to construct the true TrackingUtilities::CDCTrac...

◆ setEventTime()

void setEventTime ( double eventTime)
inline

Setter for a global event time offset.

Definition at line 145 of file CDCSimpleSimulation.h.

146 { m_eventTime = eventTime; }

◆ setMaxNHitOnWire()

void setMaxNHitOnWire ( int maxNHitOnWire)
inline

Setter for the maximal number of hits that are allowed on each layer.

Definition at line 161 of file CDCSimpleSimulation.h.

162 { m_maxNHitOnWire = maxNHitOnWire; }

◆ simulate() [1/2]

std::vector< CDCTrack > simulate ( const std::vector< TrackingUtilities::CDCTrajectory3D > & trajectories3D)

Propagates the trajectories through the CDC as without energy loss until they first leave the CDC.

Parameters
trajectories3DIdeal trajectories to be propagated.
Returns
The true tracks containing the hits generated in this process

Assign mc trajectories to the tracks

Definition at line 50 of file CDCSimpleSimulation.cc.

51{
52 std::vector<SimpleSimHit> simpleSimHits;
53 const size_t nMCTracks = trajectories3D.size();
54
55 for (size_t iMCTrack = 0; iMCTrack < nMCTracks; ++iMCTrack) {
56 const CDCTrajectory3D& trajectory3D = trajectories3D[iMCTrack];
57
58 const UncertainHelix& localHelix = trajectory3D.getLocalHelix();
59 const Vector3D& localOrigin = trajectory3D.getLocalOrigin();
60
61 Helix globalHelix = localHelix;
62 const double arcLength2DOffset = globalHelix.passiveMoveBy(-localOrigin);
63 std::vector<SimpleSimHit> simpleSimHitsForTrajectory = createHits(globalHelix, arcLength2DOffset);
64
65 for (SimpleSimHit& simpleSimHit : simpleSimHitsForTrajectory) {
66 simpleSimHit.m_iMCTrack = iMCTrack;
67 simpleSimHits.push_back(simpleSimHit);
68 }
69 }
70
71 std::vector<CDCTrack> mcTracks = constructMCTracks(nMCTracks, std::move(simpleSimHits));
72
74 for (size_t iMCTrack = 0; iMCTrack < nMCTracks; ++iMCTrack) {
75 CDCTrack& mcTrack = mcTracks[iMCTrack];
76 CDCTrajectory3D mcTrajectory = trajectories3D[iMCTrack];
77 if (not mcTrack.empty()) {
78 mcTrajectory.setLocalOrigin(mcTrack.front().getRecoPos3D());
79 mcTrack.setStartTrajectory3D(mcTrajectory);
80 mcTrajectory.setLocalOrigin(mcTrack.back().getRecoPos3D());
81 mcTrack.setEndTrajectory3D(mcTrajectory);
82 } else {
83 mcTrack.setStartTrajectory3D(mcTrajectory);
84 mcTrack.setEndTrajectory3D(mcTrajectory);
85 }
86 }
87 return mcTracks;
88}
std::vector< SimpleSimHit > createHits(const TrackingUtilities::Helix &globalHelix, double arcLength2DOffset) const
Generate hits for the given helix in starting from the two dimensional arc length.
void setStartTrajectory3D(const CDCTrajectory3D &startTrajectory3D)
Setter for the two dimensional trajectory.
Definition CDCTrack.h:96
void setEndTrajectory3D(const CDCTrajectory3D &endTrajectory3D)
Setter for the three dimensional trajectory.
Definition CDCTrack.h:103
const UncertainHelix & getLocalHelix() const
Getter for the helix in local coordinates.
double setLocalOrigin(const Vector3D &localOrigin)
Setter for the origin of the local coordinate system.
const Vector3D & getLocalOrigin() const
Getter for the origin of the local coordinate system.

◆ simulate() [2/2]

CDCTrack simulate ( const TrackingUtilities::CDCTrajectory3D & trajectory3D)

Same as above for one trajectory.

Definition at line 44 of file CDCSimpleSimulation.cc.

45{
46 return std::move(simulate(std::vector<CDCTrajectory3D>(1, trajectory3D)).front());
47}
std::vector< TrackingUtilities::CDCTrack > simulate(const std::vector< TrackingUtilities::CDCTrajectory3D > &trajectories3D)
Propagates the trajectories through the CDC as without energy loss until they first leave the CDC.

Member Data Documentation

◆ m_addInWireSignalDelay

bool m_addInWireSignalDelay = false
private

Switch to activate the in wire signal delay.

Definition at line 187 of file CDCSimpleSimulation.h.

◆ m_addTOFDelay

bool m_addTOFDelay = false
private

Switch to activate the addition of the time of flight.

Definition at line 184 of file CDCSimpleSimulation.h.

◆ m_driftLengthSigma

double m_driftLengthSigma = std::sqrt(m_driftLengthVariance)
private

Standard deviation by which the drift length should be smeared.

Definition at line 194 of file CDCSimpleSimulation.h.

◆ m_driftLengthVariance

double m_driftLengthVariance = s_nominalDriftLengthVariance
private

Variance by which the drift length should be smeared.

Definition at line 191 of file CDCSimpleSimulation.h.

◆ m_driftSpeed

double m_driftSpeed = s_nominalDriftSpeed
private

Electron drift speed in the cdc gas.

Definition at line 200 of file CDCSimpleSimulation.h.

◆ m_eventTime

double m_eventTime = 0
private

A global event time.

Definition at line 181 of file CDCSimpleSimulation.h.

◆ m_maxNHitOnWire

int m_maxNHitOnWire = 0
private

Maximal number of hits allowed on each wire (0 means all).

Definition at line 178 of file CDCSimpleSimulation.h.

◆ m_propSpeed

double m_propSpeed = s_nominalPropSpeed
private

Electrical current propagation speed in the wires.

Definition at line 197 of file CDCSimpleSimulation.h.

◆ m_sharedWireHits

std::shared_ptr<const std::vector<TrackingUtilities::CDCWireHit> > m_sharedWireHits
private

Space for the memory of the generated wire hits.

Definition at line 166 of file CDCSimpleSimulation.h.

◆ s_nominalDriftLengthVariance

const double s_nominalDriftLengthVariance = 0.000169
private

Default drift length variance.

Definition at line 169 of file CDCSimpleSimulation.h.

◆ s_nominalDriftSpeed

const double s_nominalDriftSpeed = 4e-3
private

Default electron drift speed in cdc gas - 4 * 10^-3 cm / ns.

Definition at line 175 of file CDCSimpleSimulation.h.

◆ s_nominalPropSpeed

const double s_nominalPropSpeed = 27.25
private

Default in wire signal propagation speed - 27.25 cm / ns.

Definition at line 172 of file CDCSimpleSimulation.h.


The documentation for this class was generated from the following files: