13 #include "TProfile2D.h"
97 template<
class function_type,
112 const string file_name =
getFilename(file_descriptor, this->type);
114 STATUS(
"loading input from file " << file_name <<
"... " << flush);
117 function.load(file_name.c_str());
129 function_type
function;
130 integral_type integral;
134 typedef JCDFHelper<JCDF4D_t, JCDF1D_t> JCDF_t;
135 typedef JCDFHelper<JCDF5D_t, JCDF2D_t> JCDG_t;
144 inline JVersor3Z getRandomDirection(
const double t2)
146 const double tv = sqrt(gRandom->Exp(1.0) * t2);
147 const double phi = gRandom->Uniform(-
PI, +
PI);
195 int main(
int argc,
char **argv)
200 string fileDescriptor;
228 JParser<> zap(
"Main program to simulate detector response to muons and showers.");
231 zap[
'F'] =
make_field(fileDescriptor,
"file name descriptor for CDF tables");
236 zap[
's'] =
make_field(writeEMShowers,
"store generated EM showers in event");
237 zap[
'k'] =
make_field(keep,
"keep position of tracks");
238 zap[
'N'] =
make_field(numberOfHits,
"minimum number of hits to output event") = 1;
239 zap[
'U'] =
make_field(factor,
"scaling factor applied to light yields") = 1.0;
245 catch(
const exception &error) {
246 FATAL(error.what() << endl);
250 gRandom->SetSeed(seed);
253 const JMeta meta(argc, argv);
255 const double Zbed = 0.0;
269 double maximal_road_width = 0.0;
270 double maximal_distance = 0.0;
272 for (
size_t i = 0; i != CDF.size(); ++i) {
274 DEBUG(
"Range CDF["<< CDF[i].type <<
"] " << CDF[i].
function.intensity.getXmax() <<
" m" << endl);
276 maximal_road_width = max(maximal_road_width, CDF[i].
function.intensity.getXmax());
279 for (
size_t i = 0; i != CDG.size(); ++i) {
281 DEBUG(
"Range CDG["<< CDG[i].type <<
"] " << CDG[i].
function.intensity.getXmax() <<
" m" << endl);
284 maximal_road_width = max(maximal_road_width, CDG[i].
function.intensity.getXmax());
287 maximal_distance = max(maximal_distance, CDG[i].
function.intensity.getXmax());
290 NOTICE(
"Maximal road width [m] " << maximal_road_width << endl);
291 NOTICE(
"Maximal distance [m] " << maximal_distance << endl);
294 if (detectorFile ==
"" || inputFile.empty()) {
295 STATUS(
"Nothing to be done." << endl);
303 STATUS(
"Load detector... " << flush);
315 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ) {
316 if (!module->empty())
327 STATUS(
"Setting up radiation tables... " << flush);
331 const JRadiation hydrogen ( 1.0, 1.0, 40, 0.01, 0.1, 0.1);
332 const JRadiation oxygen ( 8.0, 16.0, 40, 0.01, 0.1, 0.1);
333 const JRadiation chlorine (17.0, 35.5, 40, 0.01, 0.1, 0.1);
334 const JRadiation sodium (11.0, 23.0, 40, 0.01, 0.1, 0.1);
336 const JRadiation calcium (20.0, 40.0, 40, 0.01, 0.1, 0.1);
337 const JRadiation magnesium(12.0, 24.3, 40, 0.01, 0.1, 0.1);
338 const JRadiation potassium(19.0, 39.0, 40, 0.01, 0.1, 0.1);
339 const JRadiation sulphur (16.0, 32.0, 40, 0.01, 0.1, 0.1);
408 header = inputFile.getHeader();
410 JHead buffer(header);
412 center = get<Vec>(buffer);
424 buffer.
detector.rbegin()->filename = detectorFile;
441 center +=
Vec(circle.getX(), circle.getY(), 0.0);
443 copy(buffer, header);
450 NOTICE(
"Offset applied to true tracks is: " << center << endl);
452 NOTICE(
"No offset applied to true tracks." << endl);
458 if (cylinder.getZmin() < Zbed) {
459 cylinder.setZmin(Zbed);
462 NOTICE(
"Light generation volume: " << cylinder << endl);
464 TH1D job(
"job", NULL, 400, 0.5, 400.5);
465 TProfile cpu(
"cpu", NULL, 16, 0.0, 8.0);
466 TProfile2D rms(
"rms", NULL, 16, 0.0, 8.0, 201, -0.5, 200.5);
467 TProfile2D rad(
"rad", NULL, 16, 0.0, 8.0, 201, -0.5, 200.5);
487 STATUS(
"event: " << setw(10) <<
in.getCounter() <<
'\r');
DEBUG(endl);
491 Evt* evt =
in.next();
495 track->pos += center;
501 event.mc_hits.clear();
510 if (!track->is_finalstate()) {
526 double Zmin = intersection.first;
527 double Zmax = intersection.second;
533 JVertex vertex(0.0, track->t, track->E);
535 if (track->pos.z < Zbed) {
537 if (track->dir.z > 0.0)
538 vertex.
step(
gRock, (Zbed - track->pos.z) / track->dir.z);
543 if (vertex.
getZ() < Zmin) {
553 const JDetectorSubset_t subdetector(
detector,
getAxis(*track), maximal_road_width);
555 if (subdetector.empty()) {
565 const int N = radiation.size();
570 for (
int i = 0; i !=
N; ++i) {
571 ls += li[i] = radiation[i]->getInverseInteractionLength(vertex.
getE());
576 for (
size_t i = 0; i != ionization.size(); ++i) {
577 As += ionization[i]->getA(vertex.
getE());
580 double step = gRandom->Exp(1.0) / ls;
592 rms.Fill(
log10(vertex.
getE()), (Double_t) 0, ts*ts);
596 vertex.
step(As, min(step,range));
604 double y = gRandom->Uniform(ls);
606 for (
int i = 0; i !=
N; ++i) {
612 Es = radiation[i]->getEnergyOfShower(vertex.
getE());
613 ts = radiation[i]->getThetaRMS(vertex.
getE(), Es);
617 rms.Fill(
log10(vertex.
getE()), (Double_t) radiation[i]->getID(), ts*ts);
618 rad.Fill(
log10(vertex.
getE()), (Double_t) radiation[i]->getID(), Es);
626 vertex.
applyEloss(getRandomDirection(T2), Es);
628 muon.push_back(vertex);
637 muon.push_back(vertex);
646 if (trk != event.
mc_trks.end()) {
647 trk->len = (muon.rbegin()->getZ() < Zmax ? +1 : -1) * (muon.rbegin()->getZ() - muon.begin()->getZ());
651 for (JDetector::const_iterator module = subdetector.begin(); module != subdetector.end(); ++module) {
653 const double z0 = muon.begin()->getZ();
654 const double t0 = muon.begin()->getT();
655 const double Z = module->getZ() - module->getX() /
getTanThetaC();
657 if (Z >= muon.begin()->getZ() && Z <= muon.rbegin()->getZ()) {
660 const double R = hypot(module->getX() - pos.
getX(),
661 module->getY() - pos.
getY());
663 for (
size_t i = 0; i != CDF.size(); ++i) {
665 if (R < CDF[i].integral.getXmax()) {
675 const double NPE = CDF[i].integral.getNPE(R) * module->size() * factor * W;
676 const int N = gRandom->Poisson(NPE);
682 for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++pmt) {
684 const double R = hypot(pmt->getX() - pos.
getX(),
685 pmt->getY() - pos.
getY());
686 const double theta = pi.
constrain(pmt->getTheta());
687 const double phi = pi.
constrain(fabs(pmt->getPhi()));
689 npe.push_back(CDF[i].
function.
getNPE(R, theta, phi) * factor * W);
694 for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++pmt) {
696 const double R = hypot(pmt->getX() - pos.
getX(),
697 pmt->getY() - pos.
getY());
698 const double Z = pmt->getZ() - z0;
699 const double theta = pi.
constrain(pmt->getTheta());
700 const double phi = pi.
constrain(fabs(pmt->getPhi()));
704 job.Fill((
double) (100 + CDF[i].type), (
double) n0);
708 const double t1 = CDF[i].function.getTime(R, theta, phi, gRandom->Rndm());
711 mc_hits.push_back(
JHit_t(mc_hits.size() + 1,
723 job.Fill((
double) (300 + CDF[i].type));
727 catch(
const exception& error) {
728 job.Fill((
double) (200 + CDF[i].type));
735 for (JTrack::const_iterator vertex = muon.begin(); vertex != muon.end(); ++vertex) {
737 const double Es = vertex->
getEs();
741 const double z0 = vertex->
getZ();
742 const double t0 = vertex->
getT();
747 if (writeEMShowers) {
748 origin =
event.mc_trks.size() + 1;
751 int number_of_hits = 0;
753 JDetectorSubset_t::range_type
range = subdetector.getRange(z0 - maximal_distance,
754 z0 + maximal_distance);
756 for (JDetector::const_iterator module = range.begin(); module != range.end(); ++module) {
758 const double R = hypot(module->getX() - vertex->
getX(),
759 module->getY() - vertex->
getY());
760 const double Z = module->getZ() - z0 -
DZ;
761 const double D = sqrt(R*R + Z*Z);
762 const double cd = Z /
D;
764 for (
size_t i = 0; i != CDG.size(); ++i) {
766 if (D < CDG[i].integral.getXmax()) {
770 const double NPE = CDG[i].integral.getNPE(D, cd) * Es * module->size() * factor;
771 const int N = gRandom->Poisson(NPE);
777 for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++pmt) {
779 const double R = hypot(pmt->getX() - vertex->
getX(),
780 pmt->getY() - vertex->
getY());
781 const double Z = pmt->getZ() - z0 -
DZ;
782 const double D = sqrt(R*R + Z*Z);
783 const double cd = Z /
D;
784 const double theta = pi.
constrain(pmt->getTheta());
785 const double phi = pi.
constrain(fabs(pmt->getPhi()));
787 npe.push_back(CDG[i].
function.
getNPE(D, cd, theta, phi) * Es * factor);
792 for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++pmt) {
794 const double R = hypot(pmt->getX() - vertex->
getX(),
795 pmt->getY() - vertex->
getY());
796 const double theta = pi.
constrain(pmt->getTheta());
797 const double phi = pi.
constrain(fabs(pmt->getPhi()));
801 job.Fill((
double) (100 + CDG[i].type), (
double) n0);
806 const double Z = pmt->getZ() - z0 - dz;
807 const double D = sqrt(R*R + Z*Z);
808 const double cd = Z /
D;
810 const double t1 = CDG[i].function.getTime(D, cd, theta, phi, gRandom->Rndm());
813 mc_hits.push_back(
JHit_t(mc_hits.size() + 1,
822 number_of_hits += n1;
827 job.Fill((
double) (300 + CDG[i].type));
831 catch(
const exception& error) {
832 job.Fill((
double) (200 + CDG[i].type));
838 if (writeEMShowers && number_of_hits != 0) {
840 event.mc_trks.push_back(
JTrk_t(origin,
843 track->pos + track->dir * vertex->
getZ(),
851 }
else if (track->len > 0.0) {
859 const double z0 = 0.0;
860 const double z1 = z0 + track->len;
861 const double t0 = track->t;
862 const double E = track->E;
868 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
872 const double R = pos.
getX();
877 R > maximal_road_width) {
881 for (
size_t i = 0; i != CDF.size(); ++i) {
893 if (R < CDF[i].integral.getXmax()) {
897 const double NPE = CDF[i].integral.getNPE(R) * module->size() * factor * W;
898 const int N = gRandom->Poisson(NPE);
908 for (JModule::const_iterator pmt = buffer.begin(); pmt != buffer.end(); ++pmt) {
910 const double R = pmt->getX();
911 const double theta = pi.
constrain(pmt->getTheta());
912 const double phi = pi.
constrain(fabs(pmt->getPhi()));
914 npe.push_back(CDF[i].
function.
getNPE(R, theta, phi) * factor * W);
919 for (JModule::const_iterator pmt = buffer.begin(); pmt != buffer.end(); ++pmt) {
921 const double R = pmt->getX();
922 const double Z = pmt->getZ() - z0;
923 const double theta = pi.
constrain(pmt->getTheta());
924 const double phi = pi.
constrain(fabs(pmt->getPhi()));
928 job.Fill((
double) (120 + CDF[i].type), (
double) n0);
932 const double t1 = CDF[i].function.getTime(R, theta, phi, gRandom->Rndm());
935 mc_hits.push_back(
JHit_t(mc_hits.size() + 1,
947 job.Fill((
double) (320 + CDF[i].type));
951 catch(
const exception& error) {
952 job.Fill((
double) (220 + CDF[i].type));
959 if (!buffer.empty()) {
978 catch(
const exception& error) {
979 ERROR(error.what() << endl);
982 E =
pythia(track->type, E);
986 const double z0 = 0.0;
987 const double t0 = track->t;
994 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
998 const double R = pos.
getX();
999 const double Z = pos.
getZ() - z0 -
DZ;
1000 const double D = sqrt(R*R + Z*Z);
1001 const double cd = Z /
D;
1003 for (
size_t i = 0; i != CDG.size(); ++i) {
1005 if (D < CDG[i].integral.getXmax()) {
1009 const double NPE = CDG[i].integral.getNPE(D, cd) * E * module->size() * factor;
1010 const int N = gRandom->Poisson(NPE);
1020 for (JModule::const_iterator pmt = buffer.begin(); pmt != buffer.end(); ++pmt) {
1022 const double R = pmt->getX();
1023 const double Z = pmt->getZ() - z0 -
DZ;
1024 const double D = sqrt(R*R + Z*Z);
1025 const double cd = Z /
D;
1026 const double theta = pi.
constrain(pmt->getTheta());
1027 const double phi = pi.
constrain(fabs(pmt->getPhi()));
1029 npe.push_back(CDG[i].
function.
getNPE(D, cd, theta, phi) * E * factor);
1034 for (JModule::const_iterator pmt = buffer.begin(); pmt != buffer.end(); ++pmt) {
1036 const double theta = pi.
constrain(pmt->getTheta());
1037 const double phi = pi.
constrain(fabs(pmt->getPhi()));
1041 job.Fill((
double) (140 + CDG[i].type), (
double) n0);
1046 const double Z = pmt->getZ() - z0 - dz;
1047 const double D = sqrt(R*R + Z*Z);
1048 const double cd = Z /
D;
1050 const double t1 = CDG[i].function.getTime(D, cd, theta, phi, gRandom->Rndm());
1053 mc_hits.push_back(
JHit_t(mc_hits.size() + 1,
1065 job.Fill((
double) (340 + CDG[i].type));
1069 catch(
const exception& error) {
1070 job.Fill((
double) (240 + CDG[i].type));
1076 if (!buffer.empty()) {
1087 if (!mc_hits.empty()) {
1091 event.mc_hits.resize(mc_hits.size());
1093 copy(mc_hits.begin(), mc_hits.end(),
event.mc_hits.begin());
1102 if (event.
mc_hits.size() >= numberOfHits) {
const char *const energy_lost_in_can
Data structure for vector in two dimensions.
Utility class to parse command line options.
Custom class for CDF table in 2 dimensions.
Multi-dimensional CDF table for arrival time of Cherenkov light.
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[])
static const uint32_t K[64]
ROOT TTree parameter settings of various packages.
static const JRadiationSource_t EErad_t
double getT() const
Get time.
double getE() const
Get muon energy.
JVertex & step(const double ds)
Step using default ionisation energy loss.
Data structure for a composite optical module.
then usage $script< input file >[option[primary[working directory]]] nWhere option can be E
void merge(const double Tmax_ns)
Merge hits on same PMT that are within given time window.
Auxiliary class to set-up Trk.
JTransformation3D getTransformation(const Trk &track)
Get transformation.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Data structure for circle in two dimensions.
#define gmake_property(A)
macro to convert (template) parameter to JPropertiesElement object
double safetyFactor
safety factor for average CDF integral of optical module
Generator for simulation.
double getIndexOfRefraction()
Get average index of refraction of water corresponding to group velocity.
scattered light from EM shower
bool has_neutrino(const Evt &evt)
Test whether given event has an incoming neutrino.
This file contains converted Fortran code from km3.
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
Implementation for calculation of ionization constant.
Recording of objects on file according a format that follows from the file name extension.
JHitType_t getHitType(const JPDFType_t pdf, const bool shower=false)
Get hit type corresponding to given PDF type.
Auxiliary class for PMT parameters including threshold.
double getDeltaRaysFromTau(const double E)
Equivalent EM-shower energy due to delta-rays per unit tau track length.
Utility class to parse parameter values.
static double O()
Estimated mass fractions of chemical elements in sea water.
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
Jpp environment information.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
static const JGeane_t gRock(2.67e-1 *0.9 *DENSITY_ROCK, 3.40e-4 *1.2 *DENSITY_ROCK)
Function object for energy loss of muon in rock.
static const JGeaneWater gWater
Function object for energy loss of muon in sea water.
static counter_type max()
Get maximum counter value.
static const double DENSITY_SEA_WATER
Fixed environment values.
Muon radiative cross sections.
std::vector< JAANET::simul > simul
static const JPythia pythia
Function object for relative light yield as a function of GEANT particle code.
double getTime(const Hit &hit)
Get true time of hit.
double getY() const
Get y position.
Data structure for detector geometry and calibration.
static const char *const APPLICATION_JSIRENE
detector simulation
Utility class to parse parameter values.
Fast implementation of class JRadiation.
Implementation for calculation of inverse interaction length and shower energy.
Various implementations of functional maps.
Auxiliary data structure for list of hits with hit merging capability.
static const JPDB & getInstance()
Get particle data book.
Numbering scheme for PDF types.
bool is_neutrino(const Trk &track)
Test whether given track is a neutrino.
static const double C
Physics constants.
Auxiliary class to extract a subset of optical modules from a detector.
scattered light from muon
Auxiliary class for defining the range of iterations of objects.
double getThetaMCS(const double E, const double x, const double X0, const double M, const double Q)
Get multiple Coulomb scattering angle.
Implementation for calculation of inverse interaction length and shower energy due to deep-inelastic ...
The Vec class is a straightforward 3-d vector, which also works in pyroot.
void push(T JHead::*pd)
Push given data member to Head.
I/O formatting auxiliaries.
std::string getGITVersion(const std::string &tag)
Get GIT version for given GIT tag.
double getKineticEnergy(const double E, const double m)
Get kinetic energy of particle with given mass.
Auxiliary class for the calculation of the muon radiative cross sections.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
set_variable E_E log10(E_{fit}/E_{#mu})"
static const JGeanz geanz(1.85, 0.62, 0.54)
Function object for longitudinal EM-shower profile.
double getX() const
Get x position.
JAxis3D getAxis(const Trk &track)
Get axis.
double getE(const double z) const
Get muon energy at given position along trajectory.
Auxiliary class for CPU timing and usage.
JPosition3D getPosition(const Vec &pos)
Get position.
scattered light from delta-rays
direct light from EM shower
static const double PI
Mathematical constants.
void addMargin(const double D)
Add (safety) margin.
double getY() const
Get y position.
static const JRadiationSource_t Brems_t
General purpose messaging.
double getEs() const
Get shower energy.
Detector subset with binary search functionality.
Detector subset without binary search functionality.
Vertex of energy loss of muon.
const JVersor3Z & getDirection() const
Get direction.
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
Scanning of objects from multiple files according a format that follows from the extension of each fi...
const char * getDate()
Get current local date conform ISO-8601 standard.
Custom class for CDF table in 1 dimension.
direct light from delta-rays
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
void applyEloss(const JVersor3Z &Ts, const double Es)
Apply shower energy loss.
then JCookie sh JDataQuality D $DETECTOR_ID R
virtual const char * what() const override
Get error message.
std::vector< JAANET::detector > detector
then usage $script< input file >[option[primary[working directory]]] nWhere option can be N
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
double getMaximum(const double E) const
Get depth of shower maximum.
General purpose class for object reading from a list of file names.
JVector2D getPosition(const double z) const
Get muon position at given position along trajectory.
Utility class to parse command line options.
std::vector< Hit > mc_hits
MC: list of MC truth hits.
bool is_scattered(const int pdf)
Test if given PDF type corresponds to scattered light.
void transform(const JRotation3D &R, const JVector3D &pos)
Transformation of geometry (see method JGEOMETRY3D::JPosition3D::transform(const JRotation3D&, const JVector3D&)).
struct JSIRENE::@62 getNumberOfPhotoElectrons
Auxiliary data structure for determination of number of photo-electrons.
bool is_deltarays(const int pdf)
Test if given PDF type corresponds to Cherenkov light from delta-rays.
Auxiliary class to set-up Hit.
double getX() const
Get x position.
double getDeltaRaysFromMuon(const double E)
Equivalent EM-shower energy due to delta-rays per unit muon track length.
void copy(const Head &from, JHead &to)
Copy header from from to to.
Auxiliary data structure to list files in directory.
std::string getFilename(const std::string &file_name)
Get file name part, i.e. part after last JEEP::PATHNAME_SEPARATOR if any.
double getTanThetaC()
Get average tangent of Cherenkov angle of water corresponding to group velocity.
double getNPE(const Hit &hit)
Get true charge of hit.
do set_variable MODULE getModule a $WORKDIR detector_a datx L $STRING JEditDetector a $WORKDIR detector_a datx M $MODULE setz o $WORKDIR detector_a datx JEditDetector a $WORKDIR detector_b datx M $MODULE setz o $WORKDIR detector_b datx done echo Output stored at $WORKDIR detector_a datx and $WORKDIR tripod_a txt JDrawDetector2D a $WORKDIR detector_a datx a $WORKDIR detector_b datx L BL o detector $FORMAT $BATCH JDrawDetector2D T $WORKDIR tripod_a txt T $WORKDIR tripod_b txt L BL o tripod $FORMAT $BATCH JCompareDetector a $WORKDIR detector_a datx b $WORKDIR detector_b datx o $WORKDIR abc root &dev null for KEY in X Y Z
Data structure for position in three dimensions.
const JLimit & getLimit() const
Get limit.
Longitudinal emission profile EM-shower.
double getLength(const double E, const double P, const double eps=1.0e-3) const
Get shower length for a given integrated probability.
const Trk & get_neutrino(const Evt &evt)
Get incoming neutrino.
do set_variable DETECTOR_TXT $WORKDIR detector
bool is_tau(const Trk &track)
Test whether given track is a (anti-)tau.
static const JRadiationSource_t GNrad_t
double getRange() const
Get visible range of muon using default ionisation energy loss.
JAANET::coord_origin coord_origin
Data structure for normalised vector in positive z-direction.
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
do echo Generating $dir eval D
Vec coord_origin() const
Get coordinate origin.
int numberOfBins
number of bins for average CDF integral of optical module
double getZ() const
Get z position.
std::vector< Trk > mc_trks
MC: list of MC truth tracks.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
#define DEBUG(A)
Message macros.