Belle II Software  release-05-01-25
SegmentTripleCreator.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2012 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Oliver Frost *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #include <tracking/trackFindingCDC/findlets/minimal/SegmentTripleCreator.h>
11 
12 #include <tracking/trackFindingCDC/eventdata/tracks/CDCSegmentTriple.h>
13 #include <tracking/trackFindingCDC/eventdata/tracks/CDCAxialSegmentPair.h>
14 #include <tracking/trackFindingCDC/eventdata/segments/CDCSegment2D.h>
15 
16 #include <tracking/trackFindingCDC/topology/ISuperLayer.h>
17 
18 #include <framework/logging/Logger.h>
19 
20 #include <vector>
21 #include <array>
22 #include <string>
23 #include <algorithm>
24 
25 using namespace Belle2;
26 using namespace TrackFindingCDC;
27 
29 {
31 }
32 
34 {
35  return "Creates segment triples from a set of middle segments and already combined axial "
36  "segment pairs filtered by some acceptance criterion";
37 }
38 
39 void SegmentTripleCreator::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
40 {
41  m_segmentTripleFilter.exposeParameters(moduleParamList, prefix);
42 }
43 
44 void SegmentTripleCreator::apply(const std::vector<CDCSegment2D>& inputSegments,
45  const std::vector<CDCAxialSegmentPair>& inputAxialSegmentPairs,
46  std::vector<CDCSegmentTriple>& segmentTriples)
47 {
48  // Group the segments by their super layer id
49  for (std::vector<const CDCSegment2D*>& segementsInSuperLayer : m_segmentsBySuperLayer) {
50  segementsInSuperLayer.clear();
51  }
52 
53  for (const CDCSegment2D& segment : inputSegments) {
54  ISuperLayer iSuperLayer = segment.getISuperLayer();
55  const CDCSegment2D* ptrSegment = &segment;
56  m_segmentsBySuperLayer[iSuperLayer].push_back(ptrSegment);
57  }
58 
59  for (const CDCAxialSegmentPair& axialSegmentPair : inputAxialSegmentPairs) {
60  const CDCSegment2D* startSegment = axialSegmentPair.getStartSegment();
61  const CDCSegment2D* endSegment = axialSegmentPair.getEndSegment();
62 
63  ISuperLayer startISuperLayer = startSegment->getISuperLayer();
64  ISuperLayer endISuperLayer = endSegment->getISuperLayer();
65 
66  B2ASSERT("Invalid start ISuperLayer", ISuperLayerUtil::isAxial(startISuperLayer));
67  B2ASSERT("Invalid end ISuperLayer", ISuperLayerUtil::isAxial(endISuperLayer));
68 
69  if (startISuperLayer != endISuperLayer) {
70  ISuperLayer middleISuperLayer = (startISuperLayer + endISuperLayer) / 2;
71 
72  B2ASSERT("Middle ISuperLayer is not stereo", not ISuperLayerUtil::isAxial(middleISuperLayer));
73 
74  const std::vector<const CDCSegment2D*>& middleSegments = m_segmentsBySuperLayer[middleISuperLayer];
75  create(axialSegmentPair, middleSegments, segmentTriples);
76  } else {
77  // Case where start and end super layer are the same
78  // Look for stereo segments in the adjacent super layer
79  ISuperLayer middleISuperLayerIn = ISuperLayerUtil::getNextInwards(startISuperLayer);
80  ISuperLayer middleISuperLayerOut = ISuperLayerUtil::getNextOutwards(startISuperLayer);
81  for (ISuperLayer middleISuperLayer : {middleISuperLayerIn, middleISuperLayerOut}) {
82  if (ISuperLayerUtil::isInCDC(middleISuperLayer)) {
83  const std::vector<const CDCSegment2D*>& middleSegments = m_segmentsBySuperLayer[middleISuperLayer];
84  create(axialSegmentPair, middleSegments, segmentTriples);
85  }
86  }
87  }
88  }
89  std::sort(segmentTriples.begin(), segmentTriples.end());
90 }
91 
93  const std::vector<const CDCSegment2D*>& middleSegments,
94  std::vector<CDCSegmentTriple>& segmentTriples)
95 {
96  CDCSegmentTriple segmentTriple(axialSegmentPair);
97  for (const CDCSegment2D* middleSegment : middleSegments) {
98  segmentTriple.setMiddleSegment(middleSegment);
99  segmentTriple.clearTrajectory3D();
100 
101  // Ask the filter to assess this triple
102  Weight weight = m_segmentTripleFilter(segmentTriple);
103 
104  if (not std::isnan(weight)) {
105  segmentTriple.getAutomatonCell().setCellWeight(weight);
106  segmentTriples.insert(segmentTriples.end(), segmentTriple);
107  }
108  }
109 }
Belle2::TrackFindingCDC::SegmentTripleCreator::m_segmentTripleFilter
ChooseableSegmentTripleFilter m_segmentTripleFilter
The filter to be used for the segment triple generation.
Definition: SegmentTripleCreator.h:76
Belle2::TrackFindingCDC::SegmentTripleCreator::getDescription
std::string getDescription() final
Short description of the findlet.
Definition: SegmentTripleCreator.cc:33
Belle2::TrackFindingCDC::SegmentTripleCreator::m_segmentsBySuperLayer
std::array< std::vector< const CDCSegment2D * >, ISuperLayerUtil::c_N > m_segmentsBySuperLayer
Structure for the segments grouped by super layer id.
Definition: SegmentTripleCreator.h:73
Belle2::TrackFindingCDC::CompositeProcessingSignalListener::addProcessingSignalListener
void addProcessingSignalListener(ProcessingSignalListener *psl)
Register a processing signal listener to be notified.
Definition: CompositeProcessingSignalListener.cc:57
Belle2::TrackFindingCDC::ISuperLayerUtil::getNextOutwards
static ISuperLayer getNextOutwards(ISuperLayer iSuperLayer)
Returns the super layer that is outside of the given super layer.
Definition: ISuperLayer.cc:74
Belle2::TrackFindingCDC::CDCSegmentTriple::clearTrajectory3D
void clearTrajectory3D() const
Clears the three dimensional helix trajectory.
Definition: CDCSegmentTriple.h:165
Belle2::TrackFindingCDC::SegmentTripleCreator::SegmentTripleCreator
SegmentTripleCreator()
Constructor adding the filter as a subordinary processing signal listener.
Definition: SegmentTripleCreator.cc:28
Belle2::TrackFindingCDC::CDCAxialSegmentPair
Class representing a pair of reconstructed axial segements in adjacent superlayer.
Definition: CDCAxialSegmentPair.h:41
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TrackFindingCDC::ISuperLayerUtil::getNextInwards
static ISuperLayer getNextInwards(ISuperLayer iSuperLayer)
Returns the super layer that is inside of the given super layer.
Definition: ISuperLayer.cc:65
Belle2::TrackFindingCDC::ISuperLayerUtil::isInCDC
static bool isInCDC(ISuperLayer iSuperLayer)
Indicates if the given number corresponds to a true cdc superlayer - excludes the logic ids for inner...
Definition: ISuperLayer.cc:45
Belle2::TrackFindingCDC::CDCSegmentTriple::setMiddleSegment
void setMiddleSegment(const CDCStereoSegment2D *middleSegment)
Setter for the middle stereo segment.
Definition: CDCSegmentTriple.h:129
Belle2::TrackFindingCDC::SegmentTripleCreator::apply
void apply(const std::vector< CDCSegment2D > &inputSegments, const std::vector< CDCAxialSegmentPair > &inputAxialSegmentPairs, std::vector< CDCSegmentTriple > &segmentTriples) final
Main method constructing pairs in adjacent super layers.
Definition: SegmentTripleCreator.cc:44
Belle2::TrackFindingCDC::ISuperLayerUtil::isAxial
static bool isAxial(ISuperLayer iSuperLayer)
Returns if the super layer with the given id is axial.
Definition: ISuperLayer.cc:23
Belle2::TrackFindingCDC::SegmentTripleCreator::create
void create(const CDCAxialSegmentPair &axialSegmentPair, const std::vector< const CDCSegment2D * > &middleSegments, std::vector< CDCSegmentTriple > &segmentTriples)
Creates segment triples by adding the middle segment to the axial segments and filter out the valuabl...
Definition: SegmentTripleCreator.cc:92
Belle2::TrackFindingCDC::CDCSegment2D
A reconstructed sequence of two dimensional hits in one super layer.
Definition: CDCSegment2D.h:40
Belle2::TrackFindingCDC::CDCSegmentTriple::getAutomatonCell
AutomatonCell & getAutomatonCell() const
Mutable getter for the automaton cell.
Definition: CDCSegmentTriple.h:180
Belle2::TrackFindingCDC::Chooseable::exposeParameters
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) final
Expose the set of parameters of the filter to the module parameter list.
Definition: ChooseableFilter.icc.h:58
Belle2::ModuleParamList
The Module parameter list class.
Definition: ModuleParamList.h:46
Belle2::TrackFindingCDC::SegmentTripleCreator::exposeParameters
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) final
Expose the parameters to a module.
Definition: SegmentTripleCreator.cc:39
Belle2::TrackFindingCDC::CDCSegmentTriple
Class representing a triple of reconstructed segements in adjacent superlayer.
Definition: CDCSegmentTriple.h:42
Belle2::TrackFindingCDC::AutomatonCell::setCellWeight
void setCellWeight(Weight weight)
Setter for the cell weight.
Definition: AutomatonCell.h:132