8#include <tracking/trackFindingCDC/mclookup/CDCSimHitLookUp.h>
10#include <tracking/trackFindingCDC/mclookup/CDCMCManager.h>
11#include <tracking/trackFindingCDC/mclookup/CDCMCMap.h>
13#include <tracking/trackingUtilities/eventdata/hits/CDCRecoHit3D.h>
14#include <tracking/trackingUtilities/eventdata/hits/CDCRecoHit2D.h>
15#include <tracking/trackingUtilities/eventdata/hits/CDCWireHit.h>
17#include <cdc/topology/CDCWireTopology.h>
19#include <tracking/trackingUtilities/geometry/VectorUtil.h>
21#include <tracking/trackingUtilities/utilities/VectorRange.h>
23#include <cdc/dataobjects/CDCSimHit.h>
24#include <cdc/dataobjects/CDCHit.h>
30using namespace TrackFindingCDC;
31using namespace TrackingUtilities;
48 B2DEBUG(25,
"In CDCSimHitLookUp::fill()");
62 B2WARNING(
"CDCMCMap not set. Cannot setup primary sim hit map");
67 int nMissingPrimarySimHits = 0;
70 const CDCHit* ptrHit = std::get<const CDCHit* const>(relation);
71 const CDCSimHit* ptrSimHit = std::get<const CDCSimHit*>(relation);
74 B2ERROR(
"CDCHit has no related CDCSimHit in CDCSimHitLookUp::fill()");
80 if (not primarySimHit) {
81 ++nMissingPrimarySimHits;
86 if (nMissingPrimarySimHits != 0) {
87 B2WARNING(
"NO primary hit found for " << nMissingPrimarySimHits <<
" reassigned secondaries");
99 B2WARNING(
"CDCMCMap not set. Cannot find primary sim hit");
112 if (not ptrMCParticle) {
117 std::vector<const CDCSimHit*> primarySimHitsOnSameOrNeighborWire;
120 for (
const auto& simHitByMCParticleRelation : mcMap.
getSimHits(ptrMCParticle)) {
122 const CDCSimHit* ptrPrimarySimHit = std::get<const CDCSimHit*>(simHitByMCParticleRelation);
125 const CDCSimHit& primarySimHit = *ptrPrimarySimHit;
131 primarySimHitsOnSameOrNeighborWire.push_back(ptrPrimarySimHit);
137 auto compareDistanceBetweenSimHits =
138 [&simHit](
const CDCSimHit * primarySimHit,
139 const CDCSimHit * otherPrimarySimHit) ->
bool {
140 ROOT::Math::XYZVector primaryHitPos(primarySimHit->
getPosTrack());
141 ROOT::Math::XYZVector otherPrimaryHitPos(otherPrimarySimHit->getPosTrack());
142 ROOT::Math::XYZVector secondaryHitPos(simHit.
getPosTrack());
143 return VectorUtil::Distance(primaryHitPos, secondaryHitPos) < VectorUtil::Distance(otherPrimaryHitPos, secondaryHitPos);
146 auto itClosestPrimarySimHit = std::min_element(primarySimHitsOnSameOrNeighborWire.begin(),
147 primarySimHitsOnSameOrNeighborWire.end(),
148 compareDistanceBetweenSimHits);
150 if (itClosestPrimarySimHit != primarySimHitsOnSameOrNeighborWire.end()) {
152 return *itClosestPrimarySimHit;
162 B2WARNING(
"CDCMCMap not set in look up of closest primary sim hit.");
170 const CDCSimHit* simHit = itFoundPrimarySimHit->second;
171 if (simHit)
return simHit;
180 if (not ptrHit)
return ROOT::Math::XYZVector();
183 B2WARNING(
"CDCMCMap not set. Cannot find direction of flight");
184 return ROOT::Math::XYZVector();
191 if (not ptrSimHit)
return ROOT::Math::XYZVector();
196 if (not ptrPrimarySimHit) {
198 ptrPrimarySimHit = ptrSimHit;
203 const CDCSimHit& primarySimHit = *ptrPrimarySimHit;
206 ROOT::Math::XYZVector directionOfFlight{primarySimHit.
getMomentum()};
207 return directionOfFlight;
214 B2WARNING(
"CDCMCMap not set. Cannot setup right left passage information map");
221 const CDCHit* ptrHit = std::get<const CDCHit* const>(relation);
222 const CDCSimHit* ptrSimHit = std::get<const CDCSimHit*>(relation);
224 if (not ptrSimHit)
continue;
228 if (VectorUtil::isNull(directionOfFlight))
continue;
232 ERightLeft rlInfo = VectorUtil::isRightOrLeftOf(VectorUtil::getXYVector(trackPosToWire),
233 VectorUtil::getXYVector(directionOfFlight));
241 return itFoundHit ==
m_rightLeftInfos.end() ? ERightLeft::c_Invalid : itFoundHit->second;
247 B2WARNING(
"CDCMCMap not set. Cannot find reconstructed position");
248 return ROOT::Math::XYZVector();
255 B2WARNING(
"No CDCSimHit related to CDCHit");
256 return ROOT::Math::XYZVector();
260 return ROOT::Math::XYZVector{simHit.
getPosTrack()};
266 B2WARNING(
"CDCMCMap not set. Cannot find reconstructed position");
274 B2WARNING(
"No CDCSimHit related to CDCHit");
285 if (ptrPrimarySimHit) {
286 const CDCSimHit& primarySimHit = *ptrPrimarySimHit;
287 return ROOT::Math::XYZVector{primarySimHit.
getPosTrack()};
295 if (ptrPrimarySimHit) {
296 const CDCSimHit& primarySimHit = *ptrPrimarySimHit;
304 const std::vector<CDCWireHit>& wireHits)
const
306 if (not ptrHit)
return nullptr;
307 ConstVectorRange<CDCWireHit> wireHit{std::equal_range(wireHits.begin(), wireHits.end(), *ptrHit)};
309 if (wireHit.empty()) {
312 return &(wireHit.front());
317 const std::vector<CDCWireHit>& wireHits)
const
322 B2ASSERT(
"Could not find CDCWireHit for the requested hit", wireHit);
327 const std::vector<CDCWireHit>& wireHits)
const
338 const std::vector<CDCWireHit>& wireHits)
const
348 const std::vector<CDCWireHit>& wireHits)
const
355 const std::vector<CDCWireHit>& wireHits)
const
Class containing the result of the unpacker in raw data and the result of the digitizer in simulation...
B2Vector3D getPosWire() const
The method to get position on wire.
WireID getWireID() const
Getter for WireID object.
B2Vector3D getPosTrack() const
The method to get position on the track.
double getDriftLength() const
The method to get drift length.
B2Vector3D getMomentum() const
The method to get momentum.
static constexpr const double c_simpleDriftLengthVariance
A default value for the drift length variance if no variance from the drift length translation is ava...
Class representing the sense wire arrangement in the whole of the central drift chamber.
bool arePrimaryNeighbors(const WireID &wireID, const WireID &otherWireID) const
Checks if two wires are primary neighbors.
static CDCWireTopology & getInstance()
Getter for the singleton instance of the wire topology.
A Class to store the Monte Carlo particle information.
static const CDCSimHitLookUp & getSimHitLookUp()
Getter for the singleton instance of the CDCSimHitLookUp.
Class to organize and present the Monte Carlo hit information.
TrackingUtilities::MayBePtr< const CDCSimHit > getSimHit(const CDCHit *hit) const
Seeks the CDCSimHit related to the CDCHit.
const std::multimap< const CDCHit *, const CDCSimHit * > & getSimHitsByHit() const
Getter for the CDCHit -> CDCSimHit relations.
TrackingUtilities::MayBePtr< const MCParticle > getMCParticle(const CDCHit *hit) const
Seeks the MCParticle related to the CDCHit.
bool isReassignedSecondary(const CDCSimHit *ptrSimHit) const
Indicates if the CDCSimHit has been reassigned to a primary MCParticle.
auto getSimHits(const MCParticle *mcParticle) const
Getter for the range MCParticle to CDCSimHits relations which come from the given MCParticle.
TrackingUtilities::CDCRecoHit3D getClosestPrimaryRecoHit3D(const CDCHit *ptrHit, const std::vector< TrackingUtilities::CDCWireHit > &wireHits) const
Construct an CDCRecoHit3D from the closest primary CDCSimHit information related to the CDCHit.
void fillRLInfo()
Construct the look up relation for the right left passage information as used in track finding.
std::map< const CDCHit *, TrackingUtilities::MayBePtr< const CDCSimHit > > m_primarySimHits
Memory for the look up relation of close primary CDCSimHits.
static const CDCSimHitLookUp & getInstance()
Getter for the singletone instance.
double getClosestPrimaryDriftLength(const CDCHit *ptrHit) const
Look up the drift length from the primary ionisation to the wire from related simulated hit.
double getDriftLength(const CDCHit *ptrHit) const
Look up the drift length from the primary ionisation to the wire from related simulated hit.
ROOT::Math::XYZVector getClosestPrimaryRecoPos3D(const CDCHit *ptrHit) const
Look up the position of the primary ionisation from the closest primary simulated hit.
void fillPrimarySimHits()
Constructs the relation from reassigned secondary to a close by primary hit from the same MCParticle.
TrackingUtilities::MayBePtr< const CDCSimHit > getClosestPrimarySimHit(const CDCSimHit *ptrSimHit) const
Helper function to find the closest primary hit for the given CDCSimHit from the same MCParticle - nu...
CDCSimHitLookUp(CDCSimHitLookUp &)=delete
Singleton: Delete copy constructor and assignment operator.
TrackingUtilities::CDCRecoHit3D getRecoHit3D(const CDCHit *ptrHit, const std::vector< TrackingUtilities::CDCWireHit > &wireHits) const
Construct an CDCRecoHit3D from the (potential secondary) CDCSimHit information related to the CDCHit.
const CDCMCMap * m_ptrMCMap
Reference to the CDCMCMap to be used in this event.
TrackingUtilities::CDCRecoHit2D getClosestPrimaryRecoHit2D(const CDCHit *ptrHit, const std::vector< TrackingUtilities::CDCWireHit > &wireHits) const
Construct an TrackingUtilities::CDCRecoHit2D from the closest primary CDCSimHit information related t...
const TrackingUtilities::CDCWireHit * getWireHit(const CDCHit *ptrHit, const std::vector< TrackingUtilities::CDCWireHit > &wireHits) const
Retrieve the wire hit the given CDCHit form the given wire hits.
std::map< const CDCHit *, TrackingUtilities::ERightLeft > m_rightLeftInfos
Memory for the look up relation of the right left passage information as defined in tracking.
TrackingUtilities::CDCRecoHit2D getRecoHit2D(const CDCHit *ptrHit, const std::vector< TrackingUtilities::CDCWireHit > &wireHits) const
Construct an TrackingUtilities::CDCRecoHit2D from the (potential secondary) CDCSimHit information rel...
ROOT::Math::XYZVector getDirectionOfFlight(const CDCHit *ptrHit)
Calculate the local direction of flight. If the hit is secondary take the direction of flight from a ...
void fill(const CDCMCMap *ptrMCMap)
Gather the information about the right left passage using the CDCMCMap.
void clear()
Clear all information from the last event.
TrackingUtilities::CDCRLWireHit getRLWireHit(const CDCHit *ptrHit, const std::vector< TrackingUtilities::CDCWireHit > &wireHits) const
Retrieve the wire hit including right left passage information for the given CDCHit form the given wi...
TrackingUtilities::ERightLeft getRLInfo(const CDCHit *ptrHit) const
Look up the Monte Carlo right left passage information for the given hit.
ROOT::Math::XYZVector getRecoPos3D(const CDCHit *ptrHit) const
Look up the position of the primary ionisation from related simulated hit.
Class representing an oriented hit wire including a hypotheses whether the causing track passes left ...
void setRefDriftLength(double driftLength)
Setter for the drift length at the reference position of the wire.
Class representing a two dimensional reconstructed hit in the central drift chamber.
Class representing a three dimensional reconstructed hit.
CDCRecoHit2D getRecoHit2D() const
Constructs a two dimensional reconstructed hit by carrying out the stereo !
Class representing a hit wire in the central drift chamber.
Class to identify a wire inside the CDC.
Abstract base class for different kinds of events.