Belle II Software development
AsicBackgroundLibraryCreator.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
9#include <tracking/trackFindingCDC/findlets/complete/AsicBackgroundLibraryCreator.h>
10#include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
11#include <tracking/trackFindingCDC/eventdata/tracks/CDCTrack.h>
12#include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h>
13#include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectorySZ.h>
14#include <tracking/trackFindingCDC/topology/CDCWire.h>
15#include <tracking/trackFindingCDC/utilities/StringManipulation.h>
16#include <framework/core/ModuleParamList.templateDetails.h>
17#include <cdc/dataobjects/CDCHit.h>
18#include <framework/logging/Logger.h>
19
20#include <TTree.h>
21#include <TFile.h>
22#include <TBranch.h>
23
24#include <iostream>
25#include <cmath>
26
27using namespace Belle2;
28using namespace TrackFindingCDC;
29
30using std::vector;
31using std::map;
32using std::pair;
33using std::sort;
34using std::min;
35using std::max;
36
38
39float getDist2D(const TrackFindingCDC::CDCTrajectory3D& trajectory, const TrackFindingCDC::CDCWireHit* wireHit)
40{
41 const TrackFindingCDC::CDCTrajectory2D& trajectory2D = trajectory.getTrajectory2D();
42 const TrackFindingCDC::CDCTrajectorySZ& trajectorySZ = trajectory.getTrajectorySZ();
44 if (wireHit->isAxial()) {
45 recoPos2D = wireHit->reconstruct2D(trajectory2D);
46 } else {
47 const TrackFindingCDC::CDCWire& wire = wireHit->getWire();
48 const TrackFindingCDC::Vector2D& posOnXYPlane = wireHit->reconstruct2D(trajectory2D);
49 const double arcLength = trajectory2D.calcArcLength2D(posOnXYPlane);
50 const double z = trajectorySZ.mapSToZ(arcLength);
51 const TrackFindingCDC::Vector2D& wirePos2DAtZ = wire.getWirePos2DAtZ(z);
52 const TrackFindingCDC::Vector2D& recoPosOnTrajectory = trajectory2D.getClosest(wirePos2DAtZ);
53 const double driftLength = wireHit->getRefDriftLength();
54 TrackFindingCDC::Vector2D disp2D = recoPosOnTrajectory - wirePos2DAtZ;
55 disp2D.normalizeTo(driftLength);
56 recoPos2D = wirePos2DAtZ + disp2D;
57 }
58 const float distanceToHit = trajectory2D.getDist2D(recoPos2D);
59 return std::abs(distanceToHit);
60}
61
63{
65 // database:
66 m_channelMapFromDB = std::make_unique<DBArray<CDCChannelMap>> ();
67
68 if ((*m_channelMapFromDB).isValid()) {
69 B2DEBUG(29, "CDC Channel map is valid");
70 } else {
71 B2FATAL("CDC Channel map is not valid");
72 }
73
74 // Library for writing
75
76 auto leavesCreator = [this](TTree & tree) {
78 tree.Branch("Dist", &m_dist_signal, "DistSig/f:DistBg/f");
79 tree.Branch("ADC", &m_adc_sig, "ADC_Sig/S:ADC_bg/S");
80 tree.Branch("Track", &m_n_hit_track, "tr_nhit/S");
81 }
82 tree.Branch("Board", &m_board, "board/b");
83 tree.Branch("Channel", &m_channel, "channel/b");
84 tree.Branch("Nhit", &m_n_hit, "nhit/b");
85 tree.Branch("Asic", &m_asic_info[0],
86 "TDC0/S:ADC0/S:TOT0/S:TDC1/S:ADC1/S:TOT1/S:TDC2/S:ADC2/S:TOT2/S:TDC3/S:ADC3/S:TOT3/S:TDC4/S:ADC4/S:TOT4/S:TDC5/S:ADC5/S:TOT5/S:TDC6/S:ADC6/S:TOT6/S:TDC7/S:ADC7/S:TOT7/S");
87 return;
88 };
89
90 m_recorder.reset(new Recorder(
91 leavesCreator
93 , "ASIC"));
94}
95
97{
99 // Load map from DB:
100 for (const auto& cm : (*m_channelMapFromDB)) {
101 const int isl = cm.getISuperLayer();
102 const int il = cm.getILayer();
103 const int iw = cm.getIWire();
104 const int iBoard = cm.getBoardID();
105 const int iCh = cm.getBoardChannel();
106 const WireID wireId(isl, il, iw);
107 m_map[wireId.getEWire()] = std::pair<int, int>(iBoard, iCh);
108 }
109}
110
112{
113 return "Finds suitable ASICs with a single hit attached to a track and uses them to create the library";
114}
115
116void AsicBackgroundLibraryCreator::apply(const std::vector<CDCWireHit>& wireHits, const std::vector<CDCTrack>& tracks)
117{
118
119 map< pair<int, int>, vector<const CDCWireHit*>> groupedByAsic;
120 for (const CDCWireHit& wireHit : wireHits) {
121 auto eWire = wireHit.getWireID().getEWire();
122 B2ASSERT("Channel map NOT found for the channel", m_map.count(eWire) > 0);
123 auto board = m_map[eWire].first;
124 auto channel = m_map[eWire].second;
125 auto asicID = pair<int, int>(board, channel / 8); // ASIC are groups of 8 channels
126 groupedByAsic[asicID].push_back(&wireHit);
127 };
128 for (auto& asicList : groupedByAsic) {
129 selectAsic(asicList.second, tracks);
130 };
131
132 return;
133}
134
135void AsicBackgroundLibraryCreator::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
136{
137 Super::exposeParameters(moduleParamList, prefix);
138 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minimalHitNumberASIC"),
140 "Required number of hits per ASIC for library creation",
142
143 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "AsicLibraryFileName"),
145 "ASIC library file name",
147
148 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "maximalDistanceSignal"),
150 "maximal distance in cm from track to signal hit",
152
153 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minimalDistanceBackground"),
155 "minimal distance in cm from track to background hit",
157
158 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "useAxialHitsOnly"),
160 "use axial layers only",
162
163 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "writeExtraVars"),
165 "Write extra variables to the library",
167
168 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minimalHitsOnTrack"),
170 "Required number of hits on track for library creation",
172
173 // set some defaults:
174 moduleParamList->getParameter<std::string>("inputTracks").setDefaultValue("CDCTrackVector");
175 moduleParamList->getParameter<std::string>("inputWireHits").setDefaultValue("CDCWireHitVector");
176}
177
183
184void AsicBackgroundLibraryCreator::selectAsic(const std::vector<const CDCWireHit*>& wireHits, const std::vector<CDCTrack>& tracks)
185{
186
187 if (wireHits.size() < m_minimal_hit_number) {
188 return;
189 };
190
191 if (wireHits.size() > 8) {
192 B2ERROR("Number of hits per asic should not exceed 8, observe too many hits." << LogVar("nHits", wireHits.size()));
194 return;
195 }
196
197
198 // count taken non-background hits:
199 int count = 0;
200 const CDCWireHit* signal = nullptr;
201 for (auto& hit : wireHits) {
202 if (!(*hit)->hasBackgroundFlag() && (*hit)->hasTakenFlag()) {
203 count += 1;
204 signal = hit;
205 }
206 }
207
208 // require one and only one taken hit
209 if (count != 1) {
210 return;
211 }
212
213
214 // check if only axial hits are used:
215
216 if ((!signal->isAxial()) && m_use_axial_hits_only) {
217 return;
218 }
219
220 // find the track to which this hit belongs
221 const CDCTrack* signalTrack = nullptr;
222 for (auto& track : tracks) {
223 for (auto& hit : track) {
224 if (&hit.getWireHit() == signal) {
225 signalTrack = &track;
226 break;
227 }
228 }
229 if (signalTrack != nullptr) {
230 break;
231 }
232 }
233
234 if (signalTrack == nullptr) {
235 B2DEBUG(29, "AsicBackgroundLibraryCreator::No track found for the signal hit");
236 return;
237 }
238
239 m_n_hit_track = signalTrack->size();
240
242
243 // check the distance from the track to each signal hit
244 const auto& trajectory = signalTrack->getStartTrajectory3D();
245
246 m_dist_bg = 1000.;
247
248 for (auto& hit : wireHits) {
249
250 const float dist = getDist2D(trajectory, hit);
251
252
253 if (hit == signal) {
254 m_dist_signal = dist;
255 if (dist > m_distance_signal_max) return;
256 } else {
257 m_dist_bg = min(m_dist_bg, dist);
258 if (dist < m_distance_background_min) return;
259 }
260 }
261
262
263 // Ok, passes all cuts !
264
265 // reset the library entries
266 for (auto& channel : m_asic_info) {
267 channel.TDC = -1;
268 channel.ADC = -1;
269 channel.TOT = -1;
270 }
271
272 // add to the library
273
274 m_n_hit = wireHits.size();
275
276 m_adc_max_bg = 0;
277 for (auto& hit : wireHits) {
278 auto eWire = hit->getWireID().getEWire();
279 auto channel = m_map[eWire].second;
280 auto asicCH = channel % 8;
281 m_asic_info[asicCH].ADC = hit->getHit()->getADCCount();
282 m_asic_info[asicCH].TDC = hit->getHit()->getTDCCount();
283 m_asic_info[asicCH].TOT = hit->getHit()->getTOT();
284
285 if (hit != signal) {
286 m_adc_max_bg = max(m_adc_max_bg, m_asic_info[asicCH].ADC);
287 }
288 }
289 // also signal hit info
290 auto eWire = signal->getWireID().getEWire();
291 m_channel = m_map[eWire].second;
292 m_board = m_map[eWire].first;
293 m_adc_sig = signal->getHit()->getADCCount();
294
295 // make sure that ADC of the signal is >= than ADC of the background:
296 if (m_adc_sig < m_adc_max_bg) return;
297
298 // write out
299 m_recorder->capture();
300}
The Module parameter list class.
double m_distance_signal_max
maximal distance from track to signal hit
std::unique_ptr< DBArray< CDCChannelMap > > m_channelMapFromDB
Channel map retrieved from DB.
void initialize() final
Access database here, open library for writing:
std::map< int, std::pair< int, int > > m_map
map from ewire to board/channel ID
std::string getDescription() final
Short description of the findlet.
void selectAsic(const std::vector< const CDCWireHit * > &wireHits, const std::vector< CDCTrack > &tracks)
Algorithm to select suitable ASIC for library creation.
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) final
Expose the parameters to a module.
UChar_t m_n_hit
For debugging, store also number of channels with hits.
std::unique_ptr< Recorder > m_recorder
Recorder for the root output.
double m_distance_background_min
minimal distance from track to background hit
size_t m_minimal_hit_number
min. number of hits in ASIC for background check
void apply(const std::vector< CDCWireHit > &wireHits, const std::vector< CDCTrack > &tracks) final
Main algorithm marking hit as background.
Class representing a sequence of three dimensional reconstructed hits.
Definition CDCTrack.h:41
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.
Vector2D getClosest(const Vector2D &point) const
Calculates the closest approach on the trajectory to the given point.
double getDist2D(const Vector2D &point) const
Calculates the distance from the point to the trajectory as seen from the xy projection.
Particle full three dimensional trajectory.
CDCTrajectory2D getTrajectory2D() const
Getter for the two dimensional trajectory.
CDCTrajectorySZ getTrajectorySZ() const
Getter for the sz trajectory.
Linear trajectory in sz space.
double mapSToZ(const double s=0) const
Translates the travel distance to the z coordinate.
Class representing a hit wire in the central drift chamber.
Definition CDCWireHit.h:55
const WireID & getWireID() const
Getter for the WireID of the wire the hit is located on.
Definition CDCWireHit.h:185
Class representing a sense wire in the central drift chamber.
Definition CDCWire.h:58
Vector2D getWirePos2DAtZ(const double z) const
Gives the xy projected position of the wire at the given z coordinate.
Definition CDCWire.h:192
virtual void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix)
Class to fill a tree from a set of variables.
Definition Recorder.h:29
A two dimensional vector which is equipped with functions for correct handling of orientation relate...
Definition Vector2D.h:32
double normalizeTo(const double toLength)
Normalizes the vector to the given length.
Definition Vector2D.h:313
Class to identify a wire inside the CDC.
Definition WireID.h:34
unsigned short getEWire() const
Getter for encoded wire number.
Definition WireID.h:154
Class to store variables with their name which were sent to the logging service.
ModuleParam< T > & getParameter(const std::string &name) const
Returns a reference to a parameter.
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.