55{
59
61 typedef JParallelFileScanner_t::multi_pointer_type multi_pointer_type;
65
66 JParallelFileScanner_t inputFile;
69 string detectorFile;
70 JCalibration_t calibrationFile;
71 double Tmax_s;
72 string pdfFile;
75
76 try {
77
79
80 JParser<> zap(
"Program to perform compass calibration using reconstructed muon trajectories.");
81
91
92 zap(argc, argv);
93 }
94 catch(const exception& error) {
95 FATAL(error.what() << endl);
96 }
97
98
101 }
102
104
105 try {
107 }
110 }
111
112 unique_ptr<JDynamics> dynamics;
113
114 if (!calibrationFile.empty()) {
115
116 try {
117
119
120 dynamics->load(calibrationFile);
121 }
122 catch(const exception& error) {
124 }
125 }
126
128
130
131 const JMuonGandalf::storage_type storage(pdfFile, parameters.
TTS_ns);
132
134
137
139
141 const int ny = 101;
142
143 TH2D h2(
h2_t, NULL, nx, -0.5, nx - 0.5, ny, -PI, +PI);
144
145 while (inputFile.hasNext()) {
146
147 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
148
149 multi_pointer_type ps = inputFile.next();
150
153
154 summary.update(*tev);
155
156 if (dynamics) {
157 dynamics->update(*tev);
158 }
159
161
162 JDataL0_t dataL0;
163
164 buildL0(*tev, router, true, back_inserter(dataL0));
165
166 for (JFIT::JEvt::const_iterator track = in->begin(); track != in->end(); ++track) {
167
171
174 }
175
177
178
179
181
182 for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
183
184 double rate_Hz = summary.getRate(*i);
185
186 if (rate_Hz <= 0.0) {
187 rate_Hz = summary.getRate();
188 }
189
191
192 hit.rotate(R);
193
194 if (match(hit)) {
195 data[hit.getModuleID()].push_back(hit);
196 }
197 }
198
200
201 for (auto& i : data) {
202
203 const JModule& module = router.getModule(i.first);
204
205
206
208
209 JDataW0_t::iterator __end = unique(i.second.begin(), i.second.end(), equal_to<JDAQPMTIdentifier>());
210
211 for (Int_t iy = 1; iy <= h2.GetYaxis()->GetNbins(); ++iy) {
212
213 const double x = router.getIndex(i.first);
214 const double y = h2.GetYaxis()->GetBinCenter(iy);
215
217
218 double chi2 = 0.0;
219
220 for (JDataW0_t::const_iterator p = i.second.begin(); p != __end; ++p) {
221
223
224 hit.rotate_back(R);
225
227 hit.rotate(Rz);
229
230 hit.rotate(R);
231
232 chi2 += fit(ta, hit);
233 }
234
235 h2.Fill(x, y, chi2);
236 }
237 }
238 }
239 }
241
243
245
246 out << h2;
247
248 out.Write();
249 out.Close();
250}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Router for direct addressing of module data in detector data structure.
Data structure for a composite optical module.
Data structure for set of track fit results.
void select(const JSelector_t &selector)
Select fits.
Data structure for fit of straight line paralel to z-axis.
Data structure for fit of straight line in positive z-direction.
JPosition3D & rotate(const JRotation3D &R)
Rotate.
const JPosition3D & getPosition() const
Get position.
Utility class to parse command line options.
Auxiliary class for a hit with background rate value.
General purpose class for object reading from a list of file names.
General purpose class for parallel reading of objects from a single file or multiple files.
File router for fast addressing of summary data.
static const int JSTART_LENGTH_METRES
distance between projected positions on the track of optical modules for which the response does not ...
JDirection3D getDirection(const Vec &dir)
Get direction.
JPosition3D getPosition(const Vec &pos)
Get position.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
JTOOLS::JRange< double > JZRange
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
bool qualitySorter(const JFit &first, const JFit &second)
Comparison of fit results.
const char *const h2_t
Name of histogram with results from JMuonCompass.cc.
bool putObject(TDirectory &dir, const TObject &object)
Write object to ROOT directory.
static const JModuleCounter getNumberOfModules
Function object to count unique modules.
KM3NeT DAQ data structures and auxiliaries.
Dynamic detector calibration.
Auxiliary class to match data points with given model.
Auxiliary class for recursive type list generation.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Data structure for fit parameters.
double TTS_ns
transition-time spread [ns]
double TMin_ns
minimal time w.r.t. Cherenkov hypothesis [ns]
double roadWidth_m
road width [m]
double TMax_ns
maximal time w.r.t. Cherenkov hypothesis [ns]
double ZMax_m
maximal z-positon [m]
double ZMin_m
minimal z-positon [m]
double R_Hz
default rate [Hz]
size_t numberOfPrefits
number of prefits
Wrapper class to make final fit of muon trajectory.
Auxiliary class for defining the range of iterations of objects.
const JLimit & getLimit() const
Get limit.
static counter_type max()
Get maximum counter value.
Auxiliary data structure for sorting of hits.