Belle II Software development
SegmentTripleCreator.cc
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#include <tracking/trackFindingCDC/findlets/minimal/SegmentTripleCreator.h>
9
10#include <tracking/trackingUtilities/eventdata/tracks/CDCSegmentTriple.h>
11#include <tracking/trackingUtilities/eventdata/tracks/CDCAxialSegmentPair.h>
12#include <tracking/trackingUtilities/eventdata/segments/CDCSegment2D.h>
13
14#include <cdc/topology/ISuperLayer.h>
15
16#include <framework/logging/Logger.h>
17
18#include <vector>
19#include <array>
20#include <string>
21#include <algorithm>
22
23using namespace Belle2;
24using namespace CDC;
25using namespace TrackFindingCDC;
26using namespace TrackingUtilities;
27
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
39void SegmentTripleCreator::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
40{
41 m_segmentTripleFilter.exposeParameters(moduleParamList, prefix);
42}
43
44void 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}
The Module parameter list class.
void create(const TrackingUtilities::CDCAxialSegmentPair &axialSegmentPair, const std::vector< const TrackingUtilities::CDCSegment2D * > &middleSegments, std::vector< TrackingUtilities::CDCSegmentTriple > &segmentTriples)
Creates segment triples by adding the middle segment to the axial segments and filter out the valuabl...
std::string getDescription() final
Short description of the findlet.
std::array< std::vector< const TrackingUtilities::CDCSegment2D * >, CDC::ISuperLayerUtil::c_N > m_segmentsBySuperLayer
Structure for the segments grouped by super layer id.
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) final
Expose the parameters to a module.
SegmentTripleCreator()
Constructor adding the filter as a subordinary processing signal listener.
void apply(const std::vector< TrackingUtilities::CDCSegment2D > &inputSegments, const std::vector< TrackingUtilities::CDCAxialSegmentPair > &inputAxialSegmentPairs, std::vector< TrackingUtilities::CDCSegmentTriple > &segmentTriples) final
Main method constructing pairs in adjacent super layers.
ChooseableSegmentTripleFilter m_segmentTripleFilter
The filter to be used for the segment triple generation.
void setCellWeight(Weight weight)
Setter for the cell weight.
Class representing a pair of reconstructed axial segments in adjacent superlayer.
A reconstructed sequence of two dimensional hits in one super layer.
Class representing a triple of reconstructed segments in adjacent superlayer.
AutomatonCell & getAutomatonCell() const
Mutable getter for the automaton cell.
void setMiddleSegment(const CDCStereoSegment2D *middleSegment)
Setter for the middle stereo segment.
void clearTrajectory3D() const
Clears the three dimensional helix trajectory.
signed short ISuperLayer
The type of the layer and superlayer ids.
Definition ISuperLayer.h:24
Abstract base class for different kinds of events.
static bool isAxial(ISuperLayer iSuperLayer)
Returns if the super layer with the given id is axial.
static ISuperLayer getNextInwards(ISuperLayer iSuperLayer)
Returns the super layer that is inside of the given super layer.
static ISuperLayer getNextOutwards(ISuperLayer iSuperLayer)
Returns the super layer that is outside of the given super layer.
static bool isInCDC(ISuperLayer iSuperLayer)
Indicates if the given number corresponds to a true cdc superlayer - excludes the logic ids for inner...