Belle II Software development
FacetCreator.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/FacetCreator.h>
9
10#include <tracking/trackingUtilities/eventdata/segments/CDCWireHitCluster.h>
11#include <tracking/trackingUtilities/eventdata/hits/CDCFacet.h>
12#include <tracking/trackingUtilities/eventdata/hits/CDCWireHit.h>
13
14#include <tracking/trackingUtilities/filters/base/RelationFilterUtil.h>
15#include <tracking/trackFindingCDC/fitting/FacetFitter.h>
16
17#include <tracking/trackingUtilities/utilities/VectorRange.h>
18#include <tracking/trackingUtilities/utilities/StringManipulation.h>
19
20#include <framework/core/ModuleParamList.templateDetails.h>
21
22#include <vector>
23#include <string>
24#include <algorithm>
25
26using namespace Belle2;
27using namespace TrackFindingCDC;
28using namespace TrackingUtilities;
29
35
37{
38 return "Creates hit triplet (facets) from each cluster filtered by a acceptance criterion.";
39}
40
41void FacetCreator::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
42{
43 m_wireHitRelationFilter.exposeParameters(moduleParamList, prefix);
44 m_feasibleRLFacetFilter.exposeParameters(moduleParamList, prefix);
45 m_facetFilter.exposeParameters(moduleParamList, prefix);
46
47 moduleParamList->addParameter(prefixed(prefix, "updateDriftLength"),
49 "Switch to reestimate the drift length",
51
52 moduleParamList->addParameter(prefixed(prefix, "leastSquareFit"),
54 "Switch to fit the facet with the least square method "
55 "for drift length estimation",
57}
58
59void FacetCreator::apply(const std::vector<CDCWireHitCluster>& inputClusters, std::vector<CDCFacet>& facets)
60{
61 int iCluster = -1;
62 for (const CDCWireHitCluster& cluster : inputClusters) {
63 ++iCluster;
64 // Skip clusters that have been detected as background
65 if (cluster.getBackgroundFlag()) {
66 continue;
67 }
68 B2ASSERT("Expect the clusters to be sorted", std::is_sorted(cluster.begin(), cluster.end()));
69
70 // Obtain the set of wire hits as references
71 const std::vector<CDCWireHit*>& wireHits = cluster;
72
73 // Create the neighborhood of wire hits on the cluster
74 m_wireHitRelations.clear();
76
77 B2ASSERT("Wire neighborhood is not symmetric. Check the geometry.",
79
80 // Create the facets
81 std::size_t nBefore = facets.size();
82 createFacets(cluster, m_wireHitRelations, facets);
83 std::size_t nAfter = facets.size();
84
85 VectorRange<CDCFacet> facetsInCluster(facets.begin() + nBefore, facets.begin() + nAfter);
86 // Sort the facets in their cluster
87 std::sort(facetsInCluster.begin(), facetsInCluster.end());
88
89 B2ASSERT("Expected all facets to be different",
90 std::adjacent_find(facetsInCluster.begin(), facetsInCluster.end()) ==
91 facetsInCluster.end());
92
93 for (CDCFacet& facet : facetsInCluster) {
94 facet.setICluster(iCluster);
95 }
96 }
97}
98
99void FacetCreator::createFacets(const std::vector<CDCWireHit*>& wireHits,
100 const std::vector<WeightedRelation<CDCWireHit> >& wireHitRelations,
101 std::vector<CDCFacet>& facets)
102{
103 for (const CDCWireHit* ptrMiddleWireHit : wireHits) {
104 if (not ptrMiddleWireHit) continue;
105 const CDCWireHit& middleWireHit = *ptrMiddleWireHit;
106 if (middleWireHit->hasTakenFlag()) continue;
107
108 const auto neighbors = asRange(
109 std::equal_range(wireHitRelations.begin(), wireHitRelations.end(), ptrMiddleWireHit));
110
111 for (const WeightedRelation<CDCWireHit>& startWireHitRelation : neighbors) {
112 const CDCWireHit* ptrStartWireHit(startWireHitRelation.getTo());
113
114 if (not ptrStartWireHit) continue;
115 const CDCWireHit& startWireHit = *ptrStartWireHit;
116 if (startWireHit->hasTakenFlag()) continue;
117
118 for (const WeightedRelation<CDCWireHit>& endWireHitRelation : neighbors) {
119 const CDCWireHit* ptrEndWireHit(endWireHitRelation.getTo());
120
121 if (not ptrEndWireHit) continue;
122 const CDCWireHit& endWireHit = *ptrEndWireHit;
123 if (endWireHit->hasTakenFlag()) continue;
124
125 // Skip combinations where the facet starts and ends on the same wire
126 if (ptrStartWireHit->isOnWire(ptrEndWireHit->getWire())) continue;
127
128 createFacetsForHitTriple(startWireHit, middleWireHit, endWireHit, facets);
129 } // end for itEndWireHit
130 } // end for itStartWireHit
131 } // end for itMiddleWireHit
132}
133
135 const CDCWireHit& middleWireHit,
136 const CDCWireHit& endWireHit,
137 std::vector<CDCFacet>& facets)
138{
140 CDCRLWireHit startRLWireHit(&startWireHit, ERightLeft::c_Left);
141 CDCRLWireHit middleRLWireHit(&middleWireHit, ERightLeft::c_Left);
142 CDCRLWireHit endRLWireHit(&endWireHit, ERightLeft::c_Left);
143 CDCFacet facet(startRLWireHit, middleRLWireHit, endRLWireHit, UncertainParameterLine2D());
144
145 for (ERightLeft startRLInfo : {ERightLeft::c_Left, ERightLeft::c_Right}) {
146 facet.setStartRLInfo(startRLInfo);
147 for (ERightLeft middleRLInfo : {ERightLeft::c_Left, ERightLeft::c_Right}) {
148 facet.setMiddleRLInfo(middleRLInfo);
149 for (ERightLeft endRLInfo : {ERightLeft::c_Left, ERightLeft::c_Right}) {
150 facet.setEndRLInfo(endRLInfo);
151
152 // Reset the lines
153 // The filter shall do the fitting of the tangent lines if it wants to.
154 // He should set them if he accepts the facet.
155 facet.invalidateFitLine();
156
158 Weight feasibleWeight = m_feasibleRLFacetFilter(facet);
159 if (std::isnan(feasibleWeight)) continue;
160 }
161
163
164 // Reset drift length
168
170 /*double chi2 =*/FacetFitter::fit(facet);
171 } else {
172 facet.adjustFitLine();
173 }
174
175 // Update drift length
176 m_driftLengthEstimator.updateDriftLength(facet);
177 }
178
179 Weight weight = m_facetFilter(facet);
180
181 if (not std::isnan(weight)) {
182 facet.getAutomatonCell().setCellWeight(weight);
183 facets.insert(facets.end(), facet);
184 }
185 } // end for endRLWireHit
186 } // end for middleRLWireHit
187 } // end for startRLWireHit
188}
The Module parameter list class.
DriftLengthEstimator m_driftLengthEstimator
Instance of the drift length estimator to be used.
void createFacetsForHitTriple(const TrackingUtilities::CDCWireHit &startWireHit, const TrackingUtilities::CDCWireHit &middleWireHit, const TrackingUtilities::CDCWireHit &endWireHit, std::vector< TrackingUtilities::CDCFacet > &facets)
Generates reconstruted facets on the three given wire hits by hypothesizing over the 8 left right pas...
BridgingWireHitRelationFilter m_wireHitRelationFilter
The filter for the hit neighborhood.
bool m_param_feasibleRLOnly
Parameter : Switch to apply the rl feasibility cut.
void apply(const std::vector< TrackingUtilities::CDCWireHitCluster > &inputClusters, std::vector< TrackingUtilities::CDCFacet > &facets) final
Central function creating the hit triplets from the clusters.
bool m_param_leastSquareFit
Parameter : Switch to fit the facet with least square method for the drift length update.
std::string getDescription() final
Short description of the findlet.
std::vector< TrackingUtilities::WeightedRelation< TrackingUtilities::CDCWireHit > > m_wireHitRelations
Memory for the wire hit neighborhood in within a cluster.
ChooseableFacetFilter m_facetFilter
The filter to be used for the facet generation.
bool m_param_updateDriftLength
Parameter : Switch to reestimate the drift length.
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) final
Expose the parameters to a module.
FeasibleRLFacetFilter m_feasibleRLFacetFilter
The feasibility filter for the right left passage information.
void createFacets(const std::vector< TrackingUtilities::CDCWireHit * > &wireHits, const std::vector< TrackingUtilities::WeightedRelation< TrackingUtilities::CDCWireHit > > &wireHitRelations, std::vector< TrackingUtilities::CDCFacet > &facets)
Generates facets on the given wire hits generating neighboring triples of hits.
FacetCreator()
Constructor adding the filter as a subordinary processing signal listener.
static double fit(const TrackingUtilities::CDCFacet &facet, int nSteps=100)
Fits a proper line to facet and returns the chi2.
bool hasTakenFlag() const
Gets the current state of the taken marker flag.
void setCellWeight(Weight weight)
Setter for the cell weight.
Class representing a triple of neighboring oriented wire with additional trajectory information.
Definition CDCFacet.h:32
void adjustFitLine() const
Adjusts the contained fit line to touch such that it touches the first and third hit.
Definition CDCFacet.cc:62
AutomatonCell & getAutomatonCell() const
Mutable getter for the automaton cell.
Definition CDCFacet.h:130
void invalidateFitLine()
Clear all information in the fit.
Definition CDCFacet.cc:67
void setEndRLInfo(const ERightLeft endRLInfo)
Setter for the right left passage information of the third oriented wire hit.
CDCRLWireHit & getStartRLWireHit()
Getter for the first oriented wire hit.
void setMiddleRLInfo(const ERightLeft middleRLInfo)
Setter for the right left passage information of the second oriented wire hit.
CDCRLWireHit & getEndRLWireHit()
Getter for the third oriented wire hit.
CDCRLWireHit & getMiddleRLWireHit()
Getter for the second oriented wire hit.
void setStartRLInfo(const ERightLeft startRLInfo)
Setter for the right left passage information of the first oriented wire 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 hit wire in the central drift chamber.
Definition CDCWireHit.h:58
double getRefDriftLength() const
Getter for the drift length at the reference position of the wire.
Definition CDCWireHit.h:227
Iterator begin() const
Begin of the range for range based for.
Definition Range.h:64
Iterator end() const
End of the range for range based for.
Definition Range.h:68
A parameter line including including an line covariance matrix which is interpreted as located in the...
Type for two related objects with a weight.
void addParameter(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module list.
Abstract base class for different kinds of events.
static void appendUsing(ARelationFilter &relationFilter, const std::vector< AObject * > &froms, const std::vector< AObject * > &tos, std::vector< WeightedRelation< AObject > > &weightedRelations, unsigned int maximumNumberOfRelations=std::numeric_limits< unsigned int >::max())
Appends relations between elements in the given AItems using the ARelationFilter.
static bool areSymmetric(const AWeightedRelations &weightedRelations)
Checks for the symmetry of a range of weighted relations Explicitly checks for each weighted relation...