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 
  206        const double xmin  = 
getRadians(h2.GetXaxis()->GetBinLowEdge(ix));
 
  207        const double xmax  = 
getRadians(h2.GetXaxis()->GetBinUpEdge (ix));
 
  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.