Toy simulation to study morphology of source and detector resolution.
45{
48
52
53 struct {
55 } parameters;
56
57 size_t numberOfEvents;
61 UTC_t UTC;
64 double background;
65 double omega;
66 UInt_t seed;
68
69 try {
70
72
74
76
83 zap[
'M'] =
make_field(morphology,
"morphology: \"<type> (parameters)+\"");
84 zap[
'r'] =
make_field(resolution,
"resolution: \"<type> (parameters)+\"");
85 zap[
'B'] =
make_field(background,
"number of events / s / sr") = 0.0;
86 zap[
'O'] =
make_field(omega,
"effective bin width [sr]") = 1.0e-4;
89
90 if (zap.
read(argc, argv) != 0)
91 return 1;
92 }
93 catch(const exception &error) {
94 FATAL(error.what() << endl);
95 }
96
97 gRandom->SetSeed(seed);
98
99
101
102 const time_t Tmin_s = UTC.getLowerLimit().getTime();
103 const time_t Tmax_s = UTC.getUpperLimit().getTime();
104
105 double x0 = -1.0;
106 {
111
112 const double V = (ymax - ymin) * (xmax - xmin);
113
114 x0 = 1.0 - V / (sqrt(2.0)*2.0*PI);
115 }
116 const double dx = omega / (2.0*PI);
117 const int nx = (int) ((1.0 - x0) / dx);
118
119 TH1D ha("ha", NULL, 70, -3.0, +2.3);
120 TH1D h1("h1", NULL, nx, 1.0 - nx*dx, +1.0);
121 TH2D h2("h2", NULL,
124
126 JGraph_t g2;
127
128 TH2D hs("hs", NULL, 100, 0.0, NUMBER_OF_SECONDS_PER_SEDERIAL_DAY / NUMBER_OF_SECONDS_PER_HOUR, 100, -1.0, +1.0);
129
130 for (size_t counter = 0; counter != numberOfEvents; ++counter) {
131
132 STATUS(
"counter: "<< setw(8) << counter <<
'\r');
DEBUG(endl);
133
134
135
136
137 const double t1 =
getTimeMJD(Tmin_s + gRandom->Rndm() * (Tmax_s - Tmin_s));
139
140
141
142
144
145
146
147
149
150
151
152 {
154
156 }
157
158
159
160
161 hs.Fill(fmod(t1, NUMBER_OF_SECONDS_PER_SEDERIAL_DAY) / NUMBER_OF_SECONDS_PER_HOUR, u3.
getDZ());
162
163 if (!parameters.ct(u3.
getDZ())) {
164 continue;
165 }
166
167
168
169
171
173
174
175
176
177 const JRotation3D Rs(morphology->getSourceLocation());
178
181
182 us.rotate(Rs);
183 vs.rotate(Rs);
184
185 const double x =
getDegrees(asin(vs.getDX() - us.getDX()));
186 const double y =
getDegrees(asin(vs.getDY() - us.getDY()));
187
188 h2.Fill(x, y);
189 g2.put (x, y);
190
191 const double dot =
getDot(us, vs);
192
194 h1.Fill(dot);
195 }
197
198
199 if (background > 0.0) {
200
201 NOTICE(
"Background: " <<
FIXED(9,5) << background * (Tmax_s - Tmin_s) * omega <<
" events / bin" << endl);
202
203 for (Int_t ix = 1; ix <= h2.GetXaxis()->GetNbins(); ++ix) {
204 for (Int_t iy = 1; iy <= h2.GetYaxis()->GetNbins(); ++iy) {
205
208 const double ymin = sin(
getRadians(h2.GetYaxis()->GetBinLowEdge(iy)));
209 const double ymax = sin(
getRadians(h2.GetYaxis()->GetBinUpEdge (iy)));
210
211 const double omega = (ymax - ymin) * (xmax - xmin);
212
213 const double mu = background * omega * (Tmax_s - Tmin_s);
214
215 const double x = h2.GetXaxis()->GetBinCenter(ix);
216 const double y = h2.GetYaxis()->GetBinCenter(iy);
217 const double z = gRandom->Poisson(mu);
218
219 h2.Fill(x, y, z);
220 }
221 }
222
227
228 const double omega = (ymax - ymin) * (xmax - xmin);
229
230 const double mu = background * omega * (Tmax_s - Tmin_s);
231
232 const size_t N = gRandom->Poisson(mu);
233
234 for (size_t i = 0; i != N; ++i) {
235
236 const double x = gRandom->Uniform(xmin, xmax);
237 const double y = gRandom->Uniform(ymin, ymax);
238
240
241 const double dot = sqrt(1.0 - y*y - sin(x)*sin(x));
242
243 h1.Fill(dot);
244 }
245 }
246
247
249
250 out << ha << h1 << h2 << hs;
253
254 out.Write();
255 out.Close();
256}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
Double_t g1(const Double_t x)
Function.
Auxiliary class to make coordinate transformations for a specific geographical location of the detect...
Utility class to parse parameter values.
Data structure for direction in three dimensions.
JDirection3D & rotate_back(const JRotation3D &R)
Rotate back.
double getDZ() const
Get z direction.
Utility class to parse command line options.
int read(const int argc, const char *const argv[])
Parse the program's command line options.
double getTimeMJD(time_t t1_s)
Get MJD time given UTC time.
double getDegrees(const double angle)
Convert angle to degrees.
double getRadians(const double angle)
Convert angle to radians.
double getDot(const JFirst_t &first, const JSecond_t &second)
Get dot product of objects.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary data structure for floating point format specification.
Helper for source morphology.
Direction of incident neutrino.
const JNeutrinoDirection & getNeutrinoDirection() const
Get neutrino direction.
Helper for detector resolution.
Location of astrophysical source.
const JSourceLocation & getSourceLocation() const
Get source location.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary data structure to build TGraph.