44 inline const char*
const track_t() {
return "track"; }
45 inline const char*
const shower_t() {
return "shower"; }
56 int main(
int argc,
char **argv)
60 using namespace KM3NETDAQ;
88 JParser<> zap(
"Example program to analyse track fit results from Evt formatted data.");
110 catch(
const exception& error) {
111 FATAL(error.what() << endl);
114 if (useWeights && numberOfEvents != JLimit::max()) {
115 FATAL(
"Cannot apply weighting to limited number of events.");
123 if (detectorFile !=
"") {
137 bool (*has_reconstruction)(
const Evt&);
138 const Trk& (*get_best_fit)(
const Evt&);
143 }
else if (recotype == shower_t()) {
147 FATAL(
"Invalid recotype: " << recotype);
153 const Int_t N_Nhits = 400;
154 const Double_t Nhits_min = 0.0 - 0.5;
155 const Double_t Nhits_max = 1000.0 - 0.5;
157 const Int_t N_Noverlays = 40;
158 const Double_t Noverlays_min = 0.0 - 0.5;
159 const Double_t Noverlays_max = 1000.0 - 0.5;
161 const Int_t N_radius = 201;
162 const Double_t radius_min = -700.0 - 0.5;
163 const Double_t radius_max = +700.0 + 0.5;
165 const Int_t N_height = 18;
166 const Double_t height_min = 20.0;
167 const Double_t height_max = 200.0;
169 const Int_t N_ToTfrac = 20;
170 const Double_t ToTfrac_min = 0.0;
171 const Double_t ToTfrac_max = 1.0;
173 const Int_t N_dt = 1500;
174 const Double_t dt_min = -500.0 - 0.5;
175 const Double_t dt_max = 1000.0 - 0.5;
177 const Int_t N_zenith = 21;
178 const Double_t zenith_min = -1.0;
179 const Double_t zenith_max = +1.0;
181 const Int_t N_energy = 60;
182 const Double_t energy_min = -2.0;
183 const Double_t energy_max = 4.0;
185 const Int_t N_quality = 100;
186 const Double_t quality_min = -200.0;
187 const Double_t quality_max = +800.0;
189 const Int_t N_beta0 = 60;
190 const Double_t beta0_min = -2.0;
191 const Double_t beta0_max = +3.5;
196 string ordinateLabel(useWeights ?
"Rate [Hz]" :
"Number of events");
200 TH1D hs (
"hs",
MAKE_CSTRING(
"; #snapshot hits; " << ordinateLabel),
201 N_Nhits, Nhits_min, Nhits_max);
202 TH1D hn (
"hn",
MAKE_CSTRING(
"; #triggered hits; " << ordinateLabel),
203 N_Nhits, Nhits_min, Nhits_max);
204 TH1D ho (
"ho",
MAKE_CSTRING(
"; #overlays; " << ordinateLabel),
205 N_Noverlays, Noverlays_min, Noverlays_max);
207 TH1D hz (
"hz",
MAKE_CSTRING(
"; cos(#theta); " << ordinateLabel),
208 N_zenith, zenith_min, zenith_max);
209 TH1D he (
"he",
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); " << ordinateLabel),
210 N_energy, energy_min, energy_max);
211 TH1D ht (
"ht",
MAKE_CSTRING(
"; #Delta t [ns]; " << ordinateLabel),
212 N_dt, dt_min, dt_max);
214 TH1D hZ (
"hZ",
MAKE_CSTRING(
"; longitudinal ToT-barycenter [m]; " << ordinateLabel),
215 N_height, height_min, height_max);
216 TH1D hT0 (
"hT0",
MAKE_CSTRING(
"; ToT-fraction below earliest triggered hit [ns]; " << ordinateLabel),
217 N_ToTfrac, ToTfrac_min, ToTfrac_max);
218 TH1D hT1 (
"hT1",
MAKE_CSTRING(
"; ToT-fraction above earliest triggered hit [ns]; " << ordinateLabel),
219 N_ToTfrac, ToTfrac_min, ToTfrac_max);
221 TH1D hq (
"hq",
MAKE_CSTRING(
"; quality; " << ordinateLabel),
222 N_quality, quality_min, quality_max);
223 TH1D hb0 (
"hb0",
MAKE_CSTRING(
"; #beta_{0}; " << ordinateLabel),
224 N_beta0, beta0_min, beta0_max);
226 TH2D hzo (
"hzo",
MAKE_CSTRING(
"; cos(#theta); #overlays; " << ordinateLabel),
227 N_zenith, zenith_min, zenith_max,
228 N_Noverlays, Noverlays_min, Noverlays_max);
229 TH2D hze (
"hze",
MAKE_CSTRING(
"; cos(#theta); log_{10}(E_{reco} / 1 GeV); " << ordinateLabel),
230 N_zenith, zenith_min, zenith_max,
231 N_energy, energy_min, energy_max);
232 TH2D heo (
"heo",
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); #overlays; " << ordinateLabel),
233 N_energy, energy_min, energy_max,
234 N_Noverlays, Noverlays_min, Noverlays_max);
235 TH2D hzt (
"hzt",
MAKE_CSTRING(
"; cos(#theta); #Delta t [ns]; " << ordinateLabel),
236 N_zenith, zenith_min, zenith_max,
237 N_dt, dt_min, dt_max);
238 TH2D het (
"het",
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); #Delta t [ns]; " << ordinateLabel),
239 N_energy, energy_min, energy_max,
240 N_dt, dt_min, dt_max);
241 TH2D hot (
"hot",
MAKE_CSTRING(
"; #overlays; #Delta t [ns]; " << ordinateLabel),
242 N_Noverlays, Noverlays_min, Noverlays_max,
243 N_dt, dt_min, dt_max);
245 TH2D hzq (
"hzq",
MAKE_CSTRING(
"; cos(#theta); quality; " << ordinateLabel),
246 N_zenith, zenith_min, zenith_max,
247 N_quality, quality_min, quality_max);
248 TH2D heq (
"heq",
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); quality; " << ordinateLabel),
249 N_energy, energy_min, energy_max,
250 N_quality, quality_min, quality_max);
251 TH2D hoq (
"hoq",
MAKE_CSTRING(
"; #overlays; quality; " << ordinateLabel),
252 N_Noverlays, Noverlays_min, Noverlays_max,
253 N_quality, quality_min, quality_max);
255 TH2D hob0(
"hob0",
MAKE_CSTRING(
"; #overlays; log_{10}(#beta_{0}); " << ordinateLabel),
256 N_Noverlays, Noverlays_min, Noverlays_max,
257 N_beta0, beta0_min, beta0_max);
258 TH2D heb0(
"heb0",
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); log_{10}(#beta_{0}); " << ordinateLabel),
259 N_energy, energy_min, energy_max,
260 N_beta0, beta0_min, beta0_max);
261 TH2D hzb0(
"hzb0",
MAKE_CSTRING(
"; cos(#theta); log_{10}(#beta_{0}); " << ordinateLabel),
262 N_zenith, zenith_min, zenith_max,
263 N_beta0, beta0_min, beta0_max);
265 TH2D hxy (
"hxy",
MAKE_CSTRING(
"; x [m]; y [m]; " << ordinateLabel),
266 N_radius, radius_min, radius_max,
267 N_radius, radius_min, radius_max);
272 if (scanners.
setFlux(fluxMaps) == 0) {
273 WARNING(
"No file found containing all given primaries; Flux function not set." << endl);
282 scanner->setLimit(numberOfEvents);
284 while (scanner->hasNext()) {
286 const Evt* evt = scanner->next();
288 if (!has_reconstruction(*evt)) {
continue; }
290 const Trk& best_trk = (*get_best_fit)(*evt);
294 const size_t NsnapshotHits = evt->hits.size();
295 const size_t NtriggeredHits = count_if(evt->hits.begin(), evt->hits.end(),
298 if (!triggeredHitsRange(NtriggeredHits) ||
299 !coszenithRange (tb.
getDZ()) ||
300 !energyRange (tb.
getE())) {
306 const double weight = (useWeights ? scanner->getWeight(*evt) : 1.0);
309 RIGHT (15) << scanner->getCounter() <<
314 hs .Fill(NsnapshotHits, weight);
315 hn .Fill(NtriggeredHits, weight);
316 ho .Fill(evt->overlays, weight);
318 hz .Fill(tb.
getDZ(), weight);
319 he .Fill(logE, weight);
320 hq .Fill(best_trk.
lik, weight);
322 hzo.Fill(tb.
getDZ(), evt->overlays, weight);
323 hze.Fill(tb.
getDZ(), logE, weight);
324 heo.Fill(logE, evt->overlays, weight);
326 hoq.Fill(evt->overlays, best_trk.
lik, weight);
327 hzq.Fill(tb.
getDZ(), best_trk.
lik, weight);
328 heq.Fill(logE, best_trk.
lik, weight);
330 hxy.Fill(tb.
getX(), tb.
getY(), weight);
336 hb0 .Fill(logb0, weight);
337 hob0.Fill(evt->overlays, logb0, weight);
338 heb0.Fill(logE, logb0, weight);
339 hzb0.Fill(tb.
getDZ(), logb0, weight);
342 double ToTbelow = 0.0;
343 double ToTabove = 0.0;
344 double ToTtotal = 0.0;
345 double ToTweightedZ = 0.0;
352 if (router.
hasPMT(hit->pmt_id)) {
356 const double t0 = tb.
getT(pmt);
357 const double t1 =
getTime(*hit);
359 ht .Fill(t1 - t0, weight);
360 hot.Fill(evt->overlays, t1 - t0, weight);
361 hzt.Fill(tb.
getDZ(), t1 - t0, weight);
362 het.Fill(
log10(best_trk.
E), t1 - t0, weight);
366 ToTtotal += hit->tot;
367 ToTweightedZ += hit->tot * hit->pos.z;
369 if (hit->pos.z < firstHit->pos.z) {
370 ToTbelow += hit->tot;
371 }
else if (hit->pos.z >= firstHit->pos.z) {
372 ToTabove += hit->tot;
378 hT0.Fill(ToTbelow / ToTtotal, weight);
379 hT1.Fill(ToTabove / ToTtotal, weight);
380 hZ .Fill(ToTweightedZ / ToTtotal, weight);
Router for direct addressing of PMT data in detector data structure.
Utility class to parse command line options.
JPredicate< JResult_t T::*, JComparison::eq > make_predicate(JResult_t T::*member, const JResult_t value)
Helper method to create predicate for data member.
int main(int argc, char *argv[])
ROOT TTree parameter settings of various packages.
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
JTrack3E getTrack(const Trk &track)
Get track.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
Utility class to parse parameter values.
#define MAKE_CSTRING(A)
Make C-string.
bool hasPMT(const JObjectID &id) const
Has PMT.
const JPMT & getPMT(const JPMTAddress &address) const
Get PMT.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
double getTime(const Hit &hit)
Get true time of hit.
double E
Energy [GeV] (either MC truth or reconstructed)
Data structure for detector geometry and calibration.
Utility class to parse parameter values.
Auxiliary class for defining the range of iterations of objects.
double getE() const
Get energy.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
set_variable E_E log10(E_{fit}/E_{#mu})"
Data structure for PMT geometry, calibration and status.
std::vector< double > fitinf
place to store additional fit info, see km3net-dataformat/definitions/fitparameters.csv
static const int JGANDALF_BETA0_RAD
KM3NeT Data Definitions v3.0.0-5-gcddadc1 https://git.km3net.de/common/km3net-dataformat.
Auxiliary class for parsing multiparticle fluxes.
double getY() const
Get y position.
Direct access to PMT in detector data structure.
Auxiliary methods to convert data members or return values of member methods of a set of objects to a...
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
General purpose messaging.
Scanning of objects from multiple files according a format that follows from the extension of each fi...
Auxiliary base class for list of file names.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
const char *const track_t
std::vector< filescanner_type >::iterator iterator
Auxiliary class to define a range between two values.
ULong64_t trig
non-zero if the hit is a trigger hit.
double lik
likelihood or lambda value (for aafit, lambda)
Utility class to parse command line options.
double t
hit time (from tdc+calibration or MC truth)
double getX() const
Get x position.
size_t setFlux(const int type, const JFlux &flux)
Set flux function for all MC-files corresponding to a given PDG code.
Auxiliary class for organising Monte Carlo file scanners associated with event weighters.
do set_variable DETECTOR_TXT $WORKDIR detector
Auxiliaries for defining the range of iterations of objects.
The Trk class represents a Monte Carlo (MC) particle as well as a reconstructed track/shower.
Auxiliary data structure for floating point format specification.
double getDZ() const
Get z direction.
const array_type< JKey_t > & get_keys(const std::map< JKey_t, JValue_t, JComparator_t, JAllocator_t > &data)
Method to create array of keys of map.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
#define DEBUG(A)
Message macros.