9#include <tracking/trackFindingCDC/findlets/complete/AsicBackgroundLibraryCreator.h>
10#include <tracking/trackingUtilities/eventdata/hits/CDCWireHit.h>
11#include <tracking/trackingUtilities/eventdata/tracks/CDCTrack.h>
12#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectory2D.h>
13#include <tracking/trackingUtilities/eventdata/trajectories/CDCTrajectorySZ.h>
14#include <cdc/topology/CDCWire.h>
15#include <tracking/trackingUtilities/utilities/StringManipulation.h>
16#include <framework/core/ModuleParamList.templateDetails.h>
17#include <cdc/dataobjects/CDCHit.h>
18#include <framework/logging/Logger.h>
20#include <Math/Vector2D.h>
30using namespace TrackFindingCDC;
31using namespace TrackingUtilities;
39 ROOT::Math::XYVector recoPos2D;
40 if (wireHit->isAxial()) {
41 recoPos2D = wireHit->reconstruct2D(trajectory2D);
43 const CDCWire& wire = wireHit->getWire();
44 const ROOT::Math::XYVector& posOnXYPlane = wireHit->reconstruct2D(trajectory2D);
46 const double z = trajectorySZ.
mapSToZ(arcLength);
48 const ROOT::Math::XYVector& recoPosOnTrajectory = trajectory2D.
getClosest(wirePos2DAtZ);
49 const double driftLength = wireHit->getRefDriftLength();
50 ROOT::Math::XYVector disp2D = recoPosOnTrajectory - wirePos2DAtZ;
51 if (disp2D.R() != 0.0) {
52 disp2D *= (driftLength / disp2D.R());
54 recoPos2D = wirePos2DAtZ + disp2D;
56 const float distanceToHit = trajectory2D.
getDist2D(recoPos2D);
57 return std::abs(distanceToHit);
66 if ((*m_channelMapFromDB).isValid()) {
67 B2DEBUG(29,
"CDC Channel map is valid");
69 B2FATAL(
"CDC Channel map is not valid");
74 auto leavesCreator = [
this](TTree & tree) {
77 tree.Branch(
"ADC", &
m_adc_sig,
"ADC_Sig/S:ADC_bg/S");
80 tree.Branch(
"Board", &
m_board,
"board/b");
81 tree.Branch(
"Channel", &
m_channel,
"channel/b");
82 tree.Branch(
"Nhit", &
m_n_hit,
"nhit/b");
84 "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");
99 const int isl = cm.getISuperLayer();
100 const int il = cm.getILayer();
101 const int iw = cm.getIWire();
102 const int iBoard = cm.getBoardID();
103 const int iCh = cm.getBoardChannel();
104 const WireID wireId(isl, il, iw);
111 return "Finds suitable ASICs with a single hit attached to a track and uses them to create the library";
117 std::map< std::pair<int, int>, std::vector<const CDCWireHit*>> groupedByAsic;
120 B2ASSERT(
"Channel map NOT found for the channel",
m_map.count(eWire) > 0);
121 auto board =
m_map[eWire].first;
122 auto channel =
m_map[eWire].second;
123 auto asicID = std::pair<int, int>(board, channel / 8);
124 groupedByAsic[asicID].push_back(&wireHit);
126 for (
auto& asicList : groupedByAsic) {
136 moduleParamList->
addParameter(prefixed(prefix,
"minimalHitNumberASIC"),
138 "Required number of hits per ASIC for library creation",
141 moduleParamList->
addParameter(prefixed(prefix,
"AsicLibraryFileName"),
143 "ASIC library file name",
146 moduleParamList->
addParameter(prefixed(prefix,
"maximalDistanceSignal"),
148 "maximal distance in cm from track to signal hit",
151 moduleParamList->
addParameter(prefixed(prefix,
"minimalDistanceBackground"),
153 "minimal distance in cm from track to background hit",
156 moduleParamList->
addParameter(prefixed(prefix,
"useAxialHitsOnly"),
158 "use axial layers only",
161 moduleParamList->
addParameter(prefixed(prefix,
"writeExtraVars"),
163 "Write extra variables to the library",
166 moduleParamList->
addParameter(prefixed(prefix,
"minimalHitsOnTrack"),
168 "Required number of hits on track for library creation",
172 moduleParamList->
getParameter<std::string>(
"inputTracks").setDefaultValue(
"CDCTrackVector");
173 moduleParamList->
getParameter<std::string>(
"inputWireHits").setDefaultValue(
"CDCWireHitVector");
189 if (wireHits.size() > 8) {
190 B2ERROR(
"Number of hits per asic should not exceed 8, observe too many hits." <<
LogVar(
"nHits", wireHits.size()));
199 for (
auto& hit : wireHits) {
200 if (!(*hit)->hasBackgroundFlag() && (*hit)->hasTakenFlag()) {
219 const CDCTrack* signalTrack =
nullptr;
220 for (
auto& track : tracks) {
221 for (
auto& hit : track) {
222 if (&hit.getWireHit() == signal) {
223 signalTrack = &track;
227 if (signalTrack !=
nullptr) {
232 if (signalTrack ==
nullptr) {
233 B2DEBUG(29,
"AsicBackgroundLibraryCreator::No track found for the signal hit");
242 const auto& trajectory = signalTrack->getStartTrajectory3D();
246 for (
auto& hit : wireHits) {
248 const float dist = getDist2D(trajectory, hit);
275 for (
auto& hit : wireHits) {
276 auto eWire = hit->getWireID().getEWire();
277 auto channel =
m_map[eWire].second;
278 auto asicCH = channel % 8;
279 m_asic_info[asicCH].ADC = hit->getHit()->getADCCount();
280 m_asic_info[asicCH].TDC = hit->getHit()->getTDCCount();
288 auto eWire = signal->getWireID().getEWire();
291 m_adc_sig = signal->getHit()->getADCCount();
Class representing a sense wire in the central drift chamber.
ROOT::Math::XYVector getWirePos2DAtZ(const double z) const
Gives the xy projected position of the wire at the given z coordinate.
The Module parameter list class.
double m_distance_signal_max
maximal distance from track to signal hit
Short_t m_adc_sig
ADC of the signal.
std::unique_ptr< DBArray< CDCChannelMap > > m_channelMapFromDB
Channel map retrieved from DB.
asicChannel m_asic_info[8]
all 8 channels
UShort_t m_n_hit_track
Number of hits on the track.
void selectAsic(const std::vector< const TrackingUtilities::CDCWireHit * > &wireHits, const std::vector< TrackingUtilities::CDCTrack > &tracks)
Algorithm to select suitable ASIC for library creation.
void initialize() final
Access database here, open library for writing:
void beginRun() final
Reload channel map if needed.
bool m_use_axial_hits_only
use axial layers only
size_t m_minimal_hits_on_track
min. number of hits on the track
float m_dist_bg
min. distance to non-linked hits
UChar_t m_board
signal boardID
float m_dist_signal
Distance to signal hit.
void apply(const std::vector< TrackingUtilities::CDCWireHit > &wireHits, const std::vector< TrackingUtilities::CDCTrack > &tracks) final
Main algorithm marking hit as background.
std::string m_library_name
output library name
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 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.
UChar_t m_channel
signal channelID
bool m_write_extra_vars
extra vars to the library
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
std::unique_ptr< TrackingUtilities::Recorder > m_recorder
Recorder for the root output.
Short_t m_adc_max_bg
Max. ADC background.
void terminate() final
write out the library
Class representing a sequence of three dimensional reconstructed hits.
Particle trajectory as it is seen in xy projection represented as a circle.
ROOT::Math::XYVector getClosest(const ROOT::Math::XYVector &point) const
Calculates the closest approach on the trajectory to the given point.
double calcArcLength2D(const ROOT::Math::XYVector &point) const
Calculate the travel distance from the start position of the trajectory.
double getDist2D(const ROOT::Math::XYVector &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.
const WireID & getWireID() const
Getter for the WireID of the wire the hit is located on.
void initialize() override
void terminate() override
virtual void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix)
Class to fill a tree from a set of variables.
Class to identify a wire inside the CDC.
unsigned short getEWire() const
Getter for encoded wire number.
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 ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module list.
Abstract base class for different kinds of events.