59{
63
65 JLimit_t& numberOfEvents = inputFile.getLimit();
67 string detectorFile;
68 double Tmax_ns;
69 double roadWidth_m;
70 double ctMin;
71 double alpha_deg;
72 double sigma_ns;
73 int numberOfOutliers;
74 bool useTrue;
76
77 try {
78
79 JParser<> zap(
"Example program to test chi2 calculations of co-variance matrix including direction uncertainty.");
80
93
94 zap(argc, argv);
95 }
96 catch(const exception& error) {
97 FATAL(error.what() << endl);
98 }
99
100
102
103
104 const unsigned int NUMBER_OF_HITS = 6;
105 const double STANDARD_DEVIATIONS = 3.0;
106 const double HIT_OFF = 1.0e3 * sigma_ns*sigma_ns;
107
108
110
111 try {
113 }
116 }
117
120
122
123
125
126
127 TH1D h0("h0", NULL, 50, 0.0, 20.0);
128 TH1D h1("h1", NULL, 50, 0.0, 20.0);
129
130 TH1D p0("p0", NULL, 50, 0.0, 1.0);
131 TH1D
p1(
"p1", NULL, 50, 0.0, 1.0);
132
134
135 {
137
138 for ( ;
x < 10.0;
x += 1.0) { X.push_back(x); }
139 for ( ;
x < 25.0;
x += 2.0) { X.push_back(x); }
140 for ( ;
x < 100.0;
x += 5.0) { X.push_back(x); }
141 }
142
143 TProfile n0("n0", NULL, X.size() - 1, X.data());
144 TProfile n1("n1", NULL, X.size() - 1, X.data());
145
146
151
153
155
157
159
161 const Evt*
event = ps;
162
164
165 vector<Trk>::const_iterator muon = find_if(event->mc_trks.begin(), event->mc_trks.end(),
is_muon);
166
167 if (muon != event->mc_trks.end()) {
168
170
172
174 tz.rotate(R);
175
176 const double theta = alpha_deg * PI / 180.0;
177 const double phi = gRandom->Uniform(0.0, 2*PI);
178
180
181
183
184 if (!useTrue) {
185
186 buildL2(*tev, moduleRouter, back_inserter(data));
187
188 data.erase(unique(
data.begin(),
data.end(), equal_to<JDAQModuleIdentifier>()),
data.end());
189
190 } else {
191
193
194 for (vector<Hit>::const_iterator i = event->mc_hits.begin(); i != event->mc_hits.end(); ++i) {
195
197
198 const JPMTAddress& address = pmtRouter.getAddress(i->pmt_id);
200 const JPMT& pmt = pmtRouter.getPMT(address);
201 const double t1 = converter.putTime(
getTime(*i));
202
204 }
205 }
206
208
209 sort(i->second.begin(), i->second.end(), less<JHit>());
210
211 data.push_back(i->second[0]);
212 }
213 }
214
215
216
217
219
220
221
222
223 for (JData_t::iterator i =
data.begin(); i !=
data.end(); ++i) {
224 i->rotate(R);
225 }
226
228
229
230
231
233
234
235
236
237 for (JData_t::iterator i =
data.begin(); i !=
data.end(); ++i) {
238 i->sub(tz.getPosition());
239 }
240
242
243
244
245
246 for (JData_t::iterator i =
data.begin(); i !=
data.end(); ++i) {
247 i->rotate_back(Rs);
248 }
249
250
251 if (
data.size() >= NUMBER_OF_HITS + numberOfOutliers) {
252
253 JData_t::iterator __end =
data.end();
254
255 for (
int n = 0;
n < numberOfOutliers &&
distance(
data.begin(), __end) > NUMBER_OF_HITS; ++
n) {
256
257 double ymax = 0.0;
258 JData_t::iterator kill = __end;
259
260 for (JData_t::iterator i =
data.begin(); i != __end; ++i) {
261
262 const double y = fabs(i->getT() - tz.getT(*i)) / sigma_ns;
263
264 if (y > ymax) {
266 kill = i;
267 }
268 }
269
270 if (ymax >= STANDARD_DEVIATIONS)
271 iter_swap(kill, --__end);
272 else
273 break;
274 }
275
276 const double chi2 =
getChi2(tz,
data.begin(), __end, sigma_ns);
278
279 h0.Fill(chi2 / N);
280 p0.Fill(TMath::Prob(chi2, N));
281 n0.Fill((
double)
data.size(), (
double) N / (
double)
data.size());
282 }
283
284
285 if (
data.size() >= NUMBER_OF_HITS + numberOfOutliers) {
286
289
290 V.
set(tz,
data.begin(),
data.end(), alpha_deg, sigma_ns);
292
294
295 unsigned int N =
data.size();
296
298
299 double ymax = 0.0;
300 int kill = -1;
301
302 for (
unsigned int i = 0; i != V.
size(); ++i) {
303
305
306 if (y > ymax) {
308 kill = i;
309 }
310 }
311
312 if (ymax >= STANDARD_DEVIATIONS * STANDARD_DEVIATIONS)
314 else
315 break;
316 }
317
318 const double chi2 = V.
getDot(Y);
319
320 h1.Fill(chi2 / N);
321 p1.Fill(TMath::Prob(chi2, N));
322 n1.Fill((
double)
data.size(), (
double) N / (
double)
data.size());
323 }
324 }
325 }
327
328 out.Write();
329 out.Close();
330}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
int first
index of module in detector data structure
Router for direct addressing of module data in detector data structure.
Address of PMT in detector data structure.
Router for direct addressing of PMT data in detector data structure.
Data structure for PMT geometry, calibration and status.
Data structure for fit of straight line paralel to z-axis.
Determination of the co-variance matrix of hits for a track along z-axis (JFIT::JLine1Z).
void set(const JVector3D &pos, T __begin, T __end, const double alpha, const double sigma)
Set co-variance matrix.
static double getDot(const variance &first, const variance &second)
Get dot product.
Determination of the time residual vector of hits for a track along z-axis (JFIT::JLine1Z).
void set(const JLine1Z &track, T __begin, T __end)
Set time residual vector.
Data structure for angles in three dimensions.
Data structure for vector in three dimensions.
double getZ() const
Get z position.
Utility class to parse command line options.
counter_type getCounter() const
Get counter.
Data structure for L0 hit.
static void setSlewing(const bool slewing)
Set slewing option.
3D match criterion with road width.
Auxiliary class to convert DAQ hit time to/from Monte Carlo hit time.
JDirection3D getDirection(const Vec &dir)
Get direction.
JPosition3D getPosition(const Vec &pos)
Get position.
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
bool is_noise(const Hit &hit)
Verify hit origin.
Vec getOffset(const JHead &header)
Get offset.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
double getChi2(const double P)
Get chi2 corresponding to given probability.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
const char * getTime()
Get current local time conform ISO-8601 standard.
JHitIterator_t clusterizeWeight(JHitIterator_t __begin, JHitIterator_t __end, const JMatch_t &match)
Partition data according given binary match operator.
KM3NeT DAQ data structures and auxiliaries.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
General purpose class for multiple pointers.
size_t size() const
Get dimension of matrix.
void update(const size_t k, const double value)
Update inverted matrix at given diagonal element.
void invert()
Invert matrix according LDU decomposition.
Auxiliary class for defining the range of iterations of objects.
static counter_type max()
Get maximum counter value.
Auxiliary class to synchronously read DAQ events and Monte Carlo events (and optionally other events)...
virtual bool hasNext() override
Check availability of next element.
virtual const multi_pointer_type & next() override
Get next element.
Data structure for L2 parameters.
The Vec class is a straightforward 3-d vector, which also works in pyroot.