Jpp 20.0.0-rc.7
the software that should make you happy
Loading...
Searching...
No Matches
JMuonFeatures.hh
Go to the documentation of this file.
1#ifndef __JRECONSTRUCTION__JMUONFEATURES__
2#define __JRECONSTRUCTION__JMUONFEATURES__
3
4#include <string>
5#include <iostream>
6#include <iomanip>
7#include <vector>
8#include <algorithm>
9
10#include <map>
11
15
16#include "JTrigger/JHitL0.hh"
17#include "JTrigger/JBuildL0.hh"
18
19#include "JFit/JFitToolkit.hh"
20#include "JFit/JLine1Z.hh"
21#include "JFit/JLine3Z.hh"
22#include "JFit/JModel.hh"
23#include "JFit/JGandalf.hh"
25
30
31#include "JPhysics/JPDFTable.hh"
33#include "JPhysics/JGeane.hh"
34
36
38
40
42
43#include "JTools/JRange.hh"
44
45#include "Jeep/JMessage.hh"
46
47#include "JLang/JVectorize.hh"
48
49
50/**
51 * \author eleguirriec, mdejong
52 */
53
54namespace JRECONSTRUCTION {}
55namespace JPP { using namespace JRECONSTRUCTION; }
56
57namespace JRECONSTRUCTION {
58
62 using JFIT::JRegressor;
63 using JFIT::JLine3Z;
64 using JFIT::JGandalf;
65 using JFIT::JTimeRange;
67
68
69 /**
70 * Wrapper class to add features after the final fit of muon trajectory.
71 *
72 * JMuonFeatures computes value of number of hists, number of doms and number of lines from the hits of an event.
73 * Note that no values computed at previous steps are modified.
74 */
77 public JRegressor<JLine3Z, JGandalf>
78 {
82
83 using JRegressor_t::operator();
84
85 /**
86 * Input data type.
87 */
88 struct input_type :
89 public JDAQEventHeader
90 {
91 /**
92 * Default constructor.
93 */
95 {}
96
97
98 /**
99 * Constructor.
100 *
101 * \param header header
102 * \param in start values
103 * \param coverage coverage
104 */
106 const JEvt& in,
107 const coverage_type& coverage) :
108 JDAQEventHeader(header),
109 in(in),
111 {}
112
117 };
118
119 /**
120 * Constructor
121 *
122 * \param parameters parameters
123 * \param storage storage
124 * \param debug debug
125 */
127 const storage_type& storage,
128 const int debug = 0) :
129 JMuonGandalfParameters_t(parameters),
130 JRegressor_t(storage)
131 {
132 using namespace JFIT;
133
134 if (this->getRmax() < roadWidth_m) {
135 roadWidth_m = this->getRmax();
136 }
137
138 JRegressor_t::debug = debug;
139 JRegressor_t::T_ns.setRange(TMin_ns, TMax_ns);
140 JRegressor_t::Vmax_npe = VMax_npe;
141 JRegressor_t::MAXIMUM_ITERATIONS = NMax;
142
143 this->parameters.resize(5);
144
145 this->parameters[0] = JLine3Z::pX();
146 this->parameters[1] = JLine3Z::pY();
147 this->parameters[2] = JLine3Z::pT();
148 this->parameters[3] = JLine3Z::pDX();
149 this->parameters[4] = JLine3Z::pDY();
150
151 }
152
153 /**
154 * Get input data.
155 *
156 * \param router module router
157 * \param summary summary data
158 * \param event event
159 * \param in start values
160 * \param coverage coverage
161 * \return input data
162 */
164 const JSummaryRouter& summary,
165 const JDAQEvent& event,
166 const JEvt& in,
167 const coverage_type& coverage) const
168 {
169 using namespace std;
170 using namespace JTRIGGER;
171
172 const JBuildL0<JHitL0> buildL0;
173
174 input_type input(event.getDAQEventHeader(), in, coverage);
175
176 vector<JHitL0> data;
177
178 buildL0(event, router, true, back_inserter(data));
179
180 for (const auto& hit : data) {
181 input.data.push_back(hit_type(hit, summary.getRate(hit.getPMTIdentifier(), this->R_Hz)));
182 input.mapString[hit.getModuleID()] = router.getModule(hit.getModuleID()).getString();
183 }
184
185 return input;
186 }
187
188
189 /**
190 * Fit function.
191 *
192 * \param input input data
193 * \return fit results
194 */
196 {
197 using namespace std;
198 using namespace JFIT;
199 using namespace JGEOMETRY3D;
200
201 JEvent event(JMUONFEATURES);
202
203 JEvt out;
204
205 const buffer_type& data = input.data;
206
207 // select start values
208
209 JEvt in = input.in;
210
212
213 if (!in.empty()) {
214 in.select(JHistory::is_event(in.begin()->getHistory()));
215 }
216
217 for (JEvt::const_iterator track = in.begin(); track != in.end(); ++track) {
218
219 const JRotation3D R (getDirection(*track));
220 const JLine1Z tz(getPosition (*track).rotate(R), track->getT());
221 JRange<double> Z_m;
222
223 if (track->hasW(JSTART_LENGTH_METRES) &&
224 track->getW(JSTART_LENGTH_METRES) > 0.0) {
225 Z_m = JZRange(ZMin_m, ZMax_m + track->getW(JSTART_LENGTH_METRES));
226 }
227
228 const JModel<JLine1Z> match(tz, roadWidth_m, JRegressor_t::T_ns, Z_m);
229
230 // hit selection based on start value
231
232 buffer_type buffer;
233
234 for (buffer_type::const_iterator i = data.begin(); i != data.end(); ++i) {
235
236 hit_type hit(*i);
237
238 hit.rotate(R);
239
240 if (match(hit)) {
241 buffer.push_back(hit);
242 }
243 }
244
245 // select first hit
246
247 std::map<int, int> mapString = input.mapString;
248
249 std::set<int> stringSet;
250 for (buffer_type::const_iterator i = buffer.begin(); i != buffer.end(); ++i) {
251 auto it = mapString.find((*i).getModuleID());
252 stringSet.insert(it->second);
253 }
254
255 const int number_of_hits = JLANG::getCount(JLANG::make_array(buffer.begin(), buffer.end(), &JHitW0::getPMTIdentifier));
256 const int number_of_doms = JLANG::getCount(JLANG::make_array(buffer.begin(), buffer.end(), &JHitW0::getModuleIdentifier));
257 const int number_of_lines = stringSet.size();
258
259 const int NDF = number_of_hits - this->parameters.size();
260
261 if (NDF > 0) {
262
263 out.push_back(JFit(*track).add(JMUONFEATURES));
264
265 // set additional values
266
267 out.rbegin()->setW(JMUONFEATURES_NUMBER_OF_HITS , number_of_hits);
268 out.rbegin()->setW(JMUONFEATURES_NUMBER_OF_DOMS , number_of_doms);
269 out.rbegin()->setW(JMUONFEATURES_NUMBER_OF_LINES , number_of_lines);
270
271 }
272 }
273
274 // apply default sorter
275
276 sort(out.begin(), out.end(), qualitySorter);
277
278 copy(input.in.begin(), input.in.end(), back_inserter(out));
279
280 return out;
281 }
282
283 };
284}
285
286#endif
287
Coverage of dynamical detector calibration.
Auxiliary methods to evaluate Poisson probabilities and chi2.
Energy loss of muon.
Basic data structure for L0 hit.
Data regression method for JFIT::JLine3Z.
General purpose messaging.
int debug
debug level
Definition JSirene.cc:72
Direct access to module in detector data structure.
Auxiliary methods for PDF calculations.
Auxiliary class to define a range between two values.
Auxiliary methods to convert data members or return values of member methods of a set of objects to a...
int getString() const
Get string number.
Definition JLocation.hh:135
Router for direct addressing of module data in detector data structure.
const JModule & getModule(const JObjectID &id) const
Get module parameters.
Data structure for set of track fit results.
void select(const JSelector_t &selector)
Select fits.
JFit & add(const int type)
Add event to history.
Fit method based on the Levenberg-Marquardt method.
Definition JGandalf.hh:87
Data structure for fit of straight line paralel to z-axis.
Definition JLine1Z.hh:29
static parameter_type pY()
Definition JLine1Z.hh:181
static parameter_type pX()
Definition JLine1Z.hh:180
static parameter_type pT()
Definition JLine1Z.hh:182
Data structure for fit of straight line in positive z-direction.
Definition JLine3Z.hh:40
static parameter_type pDY()
Definition JLine3Z.hh:320
static parameter_type pDX()
Definition JLine3Z.hh:319
JAxis3D & rotate(const JRotation3D &R)
Rotate axis.
Definition JAxis3D.hh:225
JPosition3D & rotate(const JRotation3D &R)
Rotate.
Auxiliary class for a hit with background rate value.
Definition JHitW0.hh:23
Router for fast addressing of summary data in KM3NETDAQ::JDAQSummaryslice data structure as a functio...
double getRate(const JDAQPMTIdentifier &id) const
Get rate.
Template L0 hit builder.
Definition JBuildL0.hh:38
const JDAQEventHeader & getDAQEventHeader() const
Get DAQ event header.
const JDAQModuleIdentifier & getModuleIdentifier() const
Get Module identifier.
const JDAQPMTIdentifier & getPMTIdentifier() const
Get PMT identifier.
static const int JMUONFEATURES_NUMBER_OF_LINES
number of lines see JRECONSTRUCTION::JMuonFeatures
static const int JSTART_LENGTH_METRES
distance between projected positions on the track of optical modules for which the response does not ...
static const int JMUONFEATURES_NUMBER_OF_HITS
number of hits see JRECONSTRUCTION::JMuonFeatures
static const int JMUONFEATURES_NUMBER_OF_DOMS
number of doms see JRECONSTRUCTION::JMuonFeatures
Auxiliary classes and methods for linear and iterative data regression.
JTOOLS::JRange< double > JZRange
Auxiliary classes and methods for 3D geometrical objects and operations.
Definition JAngle3D.hh:19
const array_type< JValue_t > & make_array(const JValue_t(&array)[N])
Method to create array of values.
Definition JVectorize.hh:54
size_t getCount(const array_type< T > &buffer, const JCompare_t &compare)
Count number of unique values.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
JPosition3D getPosition(const JFit &fit)
Get position.
void copy(const JFIT::JEvt::const_iterator __begin, const JFIT::JEvt::const_iterator __end, Evt &out)
Copy tracks.
bool qualitySorter(const JFit &first, const JFit &second)
Comparison of fit results.
JDirection3D getDirection(const JFit &fit)
Get direction.
Auxiliary classes and methods for triggering.
Model for fit to acoustics data.
Data structure for coverage of detector by dynamical calibrations.
Definition JCoverage.hh:19
Auxiliary class for historical event.
Definition JHistory.hh:40
Auxiliary class to test history.
Definition JHistory.hh:157
Template definition of a data regressor of given model.
Definition JRegressor.hh:70
input_type(const JDAQEventHeader &header, const JEvt &in, const coverage_type &coverage)
Constructor.
Wrapper class to add features after the final fit of muon trajectory.
JMuonFeatures(const JMuonGandalfParameters_t &parameters, const storage_type &storage, const int debug=0)
Constructor.
JEvt operator()(const input_type &input)
Fit function.
JRegressor< JLine3Z, JGandalf > JRegressor_t
std::vector< hit_type > buffer_type
input_type getInput(const JModuleRouter &router, const JSummaryRouter &summary, const JDAQEvent &event, const JEvt &in, const coverage_type &coverage) const
Get input data.
double TMin_ns
minimal time w.r.t. Cherenkov hypothesis [ns]
double TMax_ns
maximal time w.r.t. Cherenkov hypothesis [ns]
double VMax_npe
maximum number of of photo-electrons