8#include <tracking/trackFindingCDC/collectors/matchers/StereoHitTrackQuadTreeMatcher.h> 
   10#include <tracking/trackFindingCDC/hough/z0_tanLambda/HitZ0TanLambdaLegendre.h> 
   11#include <tracking/trackFindingCDC/hough/quadratic/HitQuadraticLegendre.h> 
   12#include <tracking/trackFindingCDC/hough/hyperbolic/HitHyperHough.h> 
   14#include <tracking/trackFindingCDC/eventdata/tracks/CDCTrack.h> 
   16#include <tracking/trackFindingCDC/eventdata/hits/CDCRLWireHit.h> 
   17#include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h> 
   18#include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h> 
   20#include <tracking/trackFindingCDC/ca/AutomatonCell.h> 
   22#include <framework/core/ModuleParamList.templateDetails.h> 
   24#include <tracking/trackFindingCDC/utilities/StringManipulation.h> 
   29using namespace TrackFindingCDC;
 
   31template <
class AQuadTree>
 
   33    const std::string& prefix)
 
   35  Super::exposeParameters(moduleParamList, prefix);
 
   37  moduleParamList->
addParameter(prefixed(prefix, 
"level"), m_param_quadTreeLevel,
 
   38                                "The number of levels for the quad tree search.",
 
   39                                m_param_quadTreeLevel);
 
   41  moduleParamList->
addParameter(prefixed(prefix, 
"minimumNumberOfHits"), m_param_minimumNumberOfHits,
 
   42                                "The minimum number of hits in a quad tree bin to be called as result.",
 
   43                                m_param_minimumNumberOfHits);
 
   45  moduleParamList->
addParameter(prefixed(prefix, 
"writeDebugInformation"), m_param_writeDebugInformation,
 
   46                                "Set to true to output debug information.",
 
   47                                m_param_writeDebugInformation);
 
   49  moduleParamList->
addParameter(prefixed(prefix, 
"checkForB2BTracks"),
 
   50                                m_param_checkForB2BTracks,
 
   51                                "Set to false to skip the check for back-2-back tracks " 
   52                                "(good for cosmics).",
 
   53                                m_param_checkForB2BTracks);
 
   55  moduleParamList->
addParameter(prefixed(prefix, 
"checkForInWireBoundsFactor"),
 
   56                                m_param_checkForInWireBoundsFactor,
 
   57                                "Used to scale the CDC before checking " 
   58                                "whether hits are in the CDC z bounds.",
 
   59                                m_param_checkForInWireBoundsFactor);
 
   63template <
class AQuadTree>
 
   68  m_quadTreeInstance.setMaxLevel(m_param_quadTreeLevel);
 
   69  m_quadTreeInstance.initialize();
 
   73template <
class AQuadTree>
 
   78  m_quadTreeInstance.raze();
 
   81template <
class AQuadTree>
 
   83                                                     std::vector<Super::WeightedRelationItem>& relationsForCollector)
 
   91  const CDCTrajectory2D& trajectory2D = track.getStartTrajectory3D().getTrajectory2D();
 
   92  const bool isCurler = trajectory2D.
isCurler();
 
   94  using CDCRecoHitWithRLPointer = std::pair<CDCRecoHit3D, const CDCRLWireHit*>;
 
   95  std::vector<CDCRecoHitWithRLPointer> recoHits;
 
   96  recoHits.reserve(rlWireHits.size() + track.size());
 
  103    if (rlWireHit.getWireHit().getAutomatonCell().hasTakenFlag()) 
continue;
 
  105    const CDCWire& wire = rlWireHit.getWire();
 
  107    double signedDriftLength = rlWireHit.getSignedRefDriftLength();
 
  110      if (not wire.
isInCellZBounds(recoPos3D, m_param_checkForInWireBoundsFactor)) {
 
  120        } 
else if (m_param_checkForB2BTracks) {
 
  124      recoHits.emplace_back(
CDCRecoHit3D(rlWireHit, recoPos3D, perpS), &rlWireHit);
 
  130    if (not recoHit.isAxial()) {
 
  131      recoHit.getWireHit().getAutomatonCell().setAssignedFlag();
 
  133      recoHits.emplace_back(recoHit, &rlWireHit);
 
  138  m_quadTreeInstance.seed(recoHits);
 
  140  if (m_param_writeDebugInformation) {
 
  141    writeDebugInformation();
 
  144  const auto& foundStereoHitsWithNode = m_quadTreeInstance.findSingleBest(m_param_minimumNumberOfHits);
 
  145  m_quadTreeInstance.fell();
 
  147  if (foundStereoHitsWithNode.size() != 1) {
 
  152  auto foundStereoHits = foundStereoHitsWithNode[0].second;
 
  153  const auto& node = foundStereoHitsWithNode[0].first;
 
  155  if (m_param_writeDebugInformation) {
 
  156    std::vector<CDCRecoHit3D> allHits;
 
  157    std::vector<CDCRecoHit3D> foundHits;
 
  159    for (
const CDCRecoHitWithRLPointer& recoHitWithRL : recoHits) {
 
  161      allHits.push_back(recoHit3D);
 
  163    for (
const CDCRecoHitWithRLPointer& recoHitWithRL : foundStereoHits) {
 
  165      foundHits.push_back(recoHit3D);
 
  167    m_quadTreeInstance.drawDebugPlot(allHits, foundHits, node);
 
  171  const auto& isAssignedHit = [](
const CDCRecoHitWithRLPointer & recoHitWithRLPointer) {
 
  172    const CDCRecoHit3D& recoHit3D = recoHitWithRLPointer.first;
 
  177  foundStereoHits.erase(std::remove_if(foundStereoHits.begin(),
 
  178                                       foundStereoHits.end(),
 
  180                        foundStereoHits.end());
 
  183  auto sortByHitAndNodeCenterDistance = [node](
const CDCRecoHitWithRLPointer & lhs,
 
  184  const CDCRecoHitWithRLPointer & rhs) {
 
  193    if (lhsWireHit < rhsWireHit) {
 
  195    } 
else if (rhsWireHit < lhsWireHit)  {
 
  198      return AQuadTree::DecisionAlgorithm::BoxAlgorithm::compareDistances(node, lhsRecoHit, rhsRecoHit); 
 
  202  const auto& sameHitComparer = [](
const CDCRecoHitWithRLPointer & lhs,
 
  203  const CDCRecoHitWithRLPointer & rhs) {
 
  210  std::sort(foundStereoHits.begin(),
 
  211            foundStereoHits.end(),
 
  212            sortByHitAndNodeCenterDistance);
 
  215  foundStereoHits.erase(std::unique(foundStereoHits.begin(),
 
  216                                    foundStereoHits.end(),
 
  218                        foundStereoHits.end());
 
  221  for (
const CDCRecoHitWithRLPointer& recoHitWithRLPointer : foundStereoHits) {
 
  222    const CDCRLWireHit* rlWireHit = recoHitWithRLPointer.second;
 
  223    relationsForCollector.emplace_back(&track, foundStereoHits.size(), rlWireHit);
 
  227template <
class AQuadTree>
 
  230  std::string outputFileName = 
"quadTreeContent_call_" + std::to_string(m_numberOfPassedDebugCalls) + 
".root";
 
  231  m_quadTreeInstance.writeDebugInfoToFile(outputFileName);
 
  233  m_numberOfPassedDebugCalls++;
 
The Module parameter list class.
bool hasAssignedFlag() const
Gets the current state of the already assigned marker flag.
Class representing an oriented hit wire including a hypotheses whether the causing track passes left ...
Class representing a three dimensional reconstructed hit.
const CDCWireHit & getWireHit() const
Getter for the wire hit.
Class representing a sequence of three dimensional reconstructed hits.
Particle trajectory as it is seen in xy projection represented as a circle.
double calcArcLength2D(const Vector2D &point) const
Calculate the travel distance from the start position of the trajectory.
bool isCurler(double factor=1) const
Checks if the trajectory leaves the outer radius of the CDC times the given tolerance factor.
std::array< Vector3D, 2 > reconstructBoth3D(const WireLine &wireLine, double distance=0.0, double z=0) const
Gives the two three dimensional points where the drift circle touches the wire line.
double getArcLength2DPeriod() const
Getter for the arc length for one round trip around the trajectory.
Class representing a hit wire in the central drift chamber.
AutomatonCell & getAutomatonCell() const
Mutable getter for the automaton cell.
Class representing a sense wire in the central drift chamber.
bool isInCellZBounds(const Vector3D &pos3D, const double factor=1) const
Checks whether the position is in the z bounds of the drift cell (scaled by the factor) surrounding t...
const WireLine & getWireLine() const
Getter for the wire line represenation of the wire.
A matcher algorithm for using a stereo quad tree for matching rl tagged wire hits to tracks.
void initialize() override
Initialize the filter and the quad tree.
void terminate() override
Terminate the filter and the quad tree.
void writeDebugInformation()
Use the writeDebugInformation function of the quad tree to write the tree into a root file with a asc...
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) override
Expose the parameters to the module.
void match(CDCTrack &track, const std::vector< CDCRLWireHit > &rlWireHits, std::vector< Super::WeightedRelationItem > &relationsForCollector) override
Create a QuadTree and fill with each unused stereo hit (to be exact: twice for each stereo hit - righ...
A three dimensional vector.
A three dimensional limited line represented by its closest approach to the z-axes (reference positio...
void addParameter(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module list.
Abstract base class for different kinds of events.