Jpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JPDFTransformer.hh
Go to the documentation of this file.
1 #ifndef __JPHYSICS__JPDFTRANSFORMER__
2 #define __JPHYSICS__JPDFTRANSFORMER__
3 
4 #include <cmath>
5 
6 #include "JLang/JCC.hh"
7 #include "JIO/JSerialisable.hh"
8 #include "JTools/JConstants.hh"
10 #include "JTools/JFunction1D_t.hh"
11 #include "JTools/JGrid.hh"
12 #include "JPhysics/JGeant_t.hh"
13 
14 
15 /**
16  * \author mdejong
17  */
18 
19 namespace JPHYSICS {}
20 namespace JPP { using namespace JPHYSICS; }
21 
22 namespace JPHYSICS {
23 
24  using JIO::JReader;
25  using JIO::JWriter;
27 
28 
29  /**
30  * Transformer for the 1D probability density function (PDF) of the time response of a PMT to a muon.
31  *
32  * PDFs are evaluated by interpolation for:
33  * -# distance of closest approach of the muon to the PMT [m]
34  * -# arrival time [ns]
35  *
36  * The evaluation of the weights is based on:
37  * -# effective attenuation length
38  */
39  template<class JArgument_t>
41  public JMultiMapTransformer<1, JArgument_t>
42  {
43  public:
44 
46 
50 
52 
53  /**
54  * Get shortest distance of approach.
55  *
56  * \return distance [m]
57  */
58  static double getRmin()
59  {
60  return 0.01;
61  }
62 
63 
64  /**
65  * Default constructor.
66  */
68  ln (0.0),
69  alpha(0),
70  kmin (0.0),
71  kmax (0.0)
72  {}
73 
74 
75  /**
76  * Constructor.
77  *
78  * \param ln Effective attenuation length [m]
79  * \param alpha Distance dependence (power term)
80  * \param kmin Minimal kappa
81  * \param kmax Maximal kappa
82  */
83  JPDFTransformer_t(const double ln,
84  const int alpha,
85  const double kmin,
86  const double kmax) :
87  ln (ln),
88  alpha(alpha),
89  kmin (kmin),
90  kmax (kmax)
91  {}
92 
93 
94  /**
95  * Clone object.
96  *
97  * \return pointer to newly created transformer
98  */
99  virtual clone_type clone() const
100  {
101  return new JPDFTransformer_t(*this);
102  }
103 
104 
105  /**
106  * Evaluate arrival time.
107  *
108  * \param buffer {R_m}
109  * \param xn old t_ns
110  * \return new t_ns
111  */
112  virtual argument_type putXn(const_array_type& buffer, const argument_type xn) const
113  {
114  using namespace JTOOLS;
115 
116  const double R = buffer[0];
117 
118  double x = xn;
119 
120  const double t0 = R * getTanThetaC() * getInverseSpeedOfLight();
121  const double t1 = R * kmin * getInverseSpeedOfLight();
122 
123  x -= t1 - t0;
124 
125  if (kmax > kmin) {
126  x /= R * (kmax - kmin) * getInverseSpeedOfLight();
127  }
128 
129  return x;
130  }
131 
132 
133  /**
134  * Evaluate arrival time.
135  *
136  * \param buffer {R_m}
137  * \param xn old t_ns
138  * \return new t_ns
139  */
140  virtual argument_type getXn(const_array_type& buffer, const argument_type xn) const
141  {
142  using namespace JTOOLS;
143 
144  const double R = buffer[0];
145 
146  double x = xn;
147 
148  if (kmax > kmin) {
149  x *= R * (kmax - kmin) * getInverseSpeedOfLight();
150  }
151 
152  const double t0 = R * getTanThetaC() * getInverseSpeedOfLight();
153  const double t1 = R * kmin * getInverseSpeedOfLight();
154 
155  x += t1 - t0;
156 
157  return x;
158  }
159 
160 
161  /**
162  * Weight function.
163  *
164  * \param buffer {R_m}
165  * \return weight
166  */
167  virtual double getWeight(const_array_type& buffer) const
168  {
169  using namespace JTOOLS;
170 
171  const double R = buffer[0];
172 
173  const double n = getIndexOfRefraction();
174  const double ct0 = 1.0 / n;
175  const double st0 = sqrt((1.0 + ct0)*(1.0 - ct0));
176 
177  const double d = sqrt(getRmin()*getRmin() + R*R) / st0;
178 
179  return exp(-d/ln) / pow(d,alpha);
180  }
181 
182 
183  /**
184  * Read PDF transformer from input.
185  *
186  * \param in reader
187  * \return reader
188  */
189  virtual JReader& read(JReader& in)
190  {
191  in >> ln;
192  in >> alpha;
193  in >> kmin;
194  in >> kmax;
195 
196  return in;
197  }
198 
199 
200  /**
201  * Write PDF transformer to output.
202  *
203  * \param out writer
204  * \return writer
205  */
206  virtual JWriter& write(JWriter& out) const
207  {
208  out << ln;
209  out << alpha;
210  out << kmin;
211  out << kmax;
212 
213  return out;
214  }
215 
216 
217  /**
218  * Print PDF transformer to output stream.
219  *
220  * \param out output stream
221  * \return output stream
222  */
223  std::ostream& print(std::ostream& out) const
224  {
225  using namespace std;
226 
227  out << "Effective attenuation length [m] " << ln << endl;
228  out << "Distance dependence (power term) " << alpha << endl;
229  out << "Minimal kappa " << kmin << endl;
230  out << "Maximal kappa " << kmax << endl;
231 
232  return out;
233  }
234 
235 
236  double ln; //!< Effective attenuation length [m]
237  int alpha; //!< Distance dependence (power term)
238  double kmin; //!< minimal kappa
239  double kmax; //!< maximal kappa
240  };
241 
242 
243  /**
244  * Transformer for the 1D probability density function (PDF) of the time response of a PMT due to a point source.
245  *
246  * PDFs are evaluated by interpolation for:
247  * -# distance between point source and PMT [m]
248  * -# arrival time [ns]
249  *
250  * The evaluation of the weights is based on:
251  * -# effective attenuation length
252  */
253  template<class JArgument_t>
255  public JMultiMapTransformer<1, JArgument_t>
256  {
257  public:
258 
260 
264 
266 
267  /**
268  * Get shortest distance.
269  *
270  * \return distance [m]
271  */
272  static double getDmin()
273  {
274  return 0.01;
275  }
276 
277 
278  /**
279  * Default constructor.
280  */
282  ln (0.0),
283  alpha(0),
284  kmin (0.0),
285  kmax (0.0)
286  {}
287 
288 
289  /**
290  * Constructor.
291  *
292  * \param ln Effective attenuation length [m]
293  * \param alpha Distance dependence (power term)
294  * \param kmin Minimal kappa
295  * \param kmax Maximal kappa
296  */
297  JPD0Transformer_t(const double ln,
298  const int alpha,
299  const double kmin,
300  const double kmax) :
301  ln (ln),
302  alpha(alpha),
303  kmin (kmin),
304  kmax (kmax)
305  {}
306 
307 
308  /**
309  * Clone object.
310  *
311  * \return pointer to newly created transformer
312  */
313  virtual clone_type clone() const
314  {
315  return new JPD0Transformer_t(*this);
316  }
317 
318 
319  /**
320  * Evaluate arrival time.
321  *
322  * \param buffer {D_m}
323  * \param xn old t_ns
324  * \return new t_ns
325  */
326  virtual argument_type putXn(const_array_type& buffer, const argument_type xn) const
327  {
328  using namespace JTOOLS;
329 
330  const double D = buffer[0];
331 
332  double x = xn;
333 
334  const double t0 = D * getIndexOfRefraction() * getInverseSpeedOfLight();
335  const double t1 = D * kmin * getInverseSpeedOfLight();
336 
337  x -= t1 - t0;
338 
339  if (kmax > kmin) {
340  x /= D * (kmax - kmin) * getInverseSpeedOfLight();
341  }
342 
343  return x;
344  }
345 
346 
347  /**
348  * Evaluate arrival time.
349  *
350  * \param buffer {D_m}
351  * \param xn old t_ns
352  * \return new t_ns
353  */
354  virtual argument_type getXn(const_array_type& buffer, const argument_type xn) const
355  {
356  using namespace JTOOLS;
357 
358  const double D = buffer[0];
359 
360  double x = xn;
361 
362  if (kmax > kmin) {
363  x *= D * (kmax - kmin) * getInverseSpeedOfLight();
364  }
365 
366  const double t0 = D * getIndexOfRefraction() * getInverseSpeedOfLight();
367  const double t1 = D * kmin * getInverseSpeedOfLight();
368 
369  x += t1 - t0;
370 
371  return x;
372  }
373 
374 
375  /**
376  * Weight function.
377  *
378  * \param buffer {D_m}
379  * \return weight
380  */
381  virtual double getWeight(const_array_type& buffer) const
382  {
383  using namespace JTOOLS;
384 
385  const double D = buffer[0];
386 
387  const double d = sqrt(getDmin()*getDmin() + D*D);
388 
389  return exp(-d/ln) / pow(d,alpha);
390  }
391 
392 
393  /**
394  * Read PDF transformer from input.
395  *
396  * \param in reader
397  * \return reader
398  */
399  virtual JReader& read(JReader& in)
400  {
401  in >> ln;
402  in >> alpha;
403  in >> kmin;
404  in >> kmax;
405 
406  return in;
407  }
408 
409 
410  /**
411  * Write PDF transformer to output.
412  *
413  * \param out writer
414  * \return writer
415  */
416  virtual JWriter& write(JWriter& out) const
417  {
418  out << ln;
419  out << alpha;
420  out << kmin;
421  out << kmax;
422 
423  return out;
424  }
425 
426 
427  /**
428  * Print PDF transformer to output stream.
429  *
430  * \param out output stream
431  * \return output stream
432  */
433  std::ostream& print(std::ostream& out) const
434  {
435  using namespace std;
436 
437  out << "Effective attenuation length [m] " << ln << endl;
438  out << "Distance dependence (power term) " << alpha << endl;
439  out << "Minimal kappa " << kmin << endl;
440  out << "Maximal kappa " << kmax << endl;
441 
442  return out;
443  }
444 
445 
446  double ln; //!< Effective attenuation length [m]
447  int alpha; //!< Distance dependence (power term)
448  double kmin; //!< minimal kappa
449  double kmax; //!< maximal kappa
450  };
451 
452 
453  /**
454  * Transformer for the 2D probability density function (PDF) of the time response of a PMT due to an EM shower.
455  *
456  * PDFs are evaluated by interpolation for:
457  * -# distance between EM shower and PMT [m]
458  * -# cosine angle EM shower direction and EM shower - PMT position
459  * -# arrival time [ns]
460  *
461  * The evaluation of the weights is based on:
462  * -# effective attenuation length
463  * -# emission profile of the photons
464  */
465  template<class JArgument_t>
467  public JMultiMapTransformer<2, JArgument_t>
468  {
469  public:
470 
473 
477 
479 
480 
481  /**
482  * Default constructor.
483  */
485  transformer(),
486  getShowerProbability()
487  {}
488 
489 
490  /**
491  * Constructor.
492  *
493  * \param ln Effective attenuation length [m]
494  * \param alpha Distance dependence (power term)
495  * \param kmin Minimal kappa
496  * \param kmax Maximal kappa
497  * \param geant Function photon emission from EM-shower
498  * \param bmin Baseline photon emission from EM-shower
499  */
500  JPDGTransformer_t(const double ln,
501  const int alpha,
502  const double kmin,
503  const double kmax,
504  const JGeant_t& geant,
505  const double bmin) :
506  transformer(ln, alpha, kmin, kmax),
507  getShowerProbability(geant)
508  {
509  getShowerProbability.add(bmin);
510  getShowerProbability.compile();
511  }
512 
513 
514  /**
515  * Clone object.
516  *
517  * \return pointer to newly created transformer
518  */
519  virtual clone_type clone() const
520  {
521  return new JPDGTransformer_t(*this);
522  }
523 
524 
525  /**
526  * Evaluate arrival time.
527  *
528  * \param buffer {D_m, cd}
529  * \param xn old t_ns
530  * \return new t_ns
531  */
532  virtual argument_type putXn(const_array_type& buffer, const argument_type xn) const
533  {
534  return transformer.putXn(buffer, xn);
535  }
536 
537 
538  /**
539  * Evaluate arrival time.
540  *
541  * \param buffer {D_m, cd}
542  * \param xn old t_ns
543  * \return new t_ns
544  */
545  virtual argument_type getXn(const_array_type& buffer, const argument_type xn) const
546  {
547  return transformer.getXn(buffer, xn);
548  }
549 
550 
551  /**
552  * Weight function.
553  *
554  * \param buffer {D_m, cd}
555  * \return weight
556  */
557  virtual double getWeight(const_array_type& buffer) const
558  {
559  using namespace JTOOLS;
560 
561  //const double D = buffer[0];
562  const double cd = buffer[1];
563 
564  return transformer.getWeight(buffer) * getShowerProbability(getIndexOfRefractionPhase(), cd);
565  }
566 
567 
568  /**
569  * Read PDF transformer from input.
570  *
571  * \param in reader
572  * \return reader
573  */
574  virtual JReader& read(JReader& in)
575  {
576  in >> transformer;
577  in >> getShowerProbability;
578 
579  return in;
580  }
581 
582 
583  /**
584  * Write PDF transformer to output.
585  *
586  * \param out writer
587  * \return writer
588  */
589  virtual JWriter& write(JWriter& out) const
590  {
591  out << transformer;
592  out << getShowerProbability;
593 
594  return out;
595  }
596 
597 
598  /**
599  * Print PDF transformer to output stream.
600  *
601  * \param out output stream
602  * \return output stream
603  */
604  std::ostream& print(std::ostream& out) const
605  {
606  return transformer.print(out);
607  }
608 
609 
612  };
613 
614 
615  /**
616  * Template definition of transformer of the probability density function (PDF) of the time response of a PMT.\n
617  * The actual implementation follows from the number of dimensions.
618  */
619  template<unsigned int N, class JArgument_t>
621 
622 
623  /**
624  * Template specialisation of transformer of the 2D probability density function (PDF) of the time response of a PMT due to a bright point.
625  *
626  * PDFs are evaluated by interpolation for:
627  * -# distance between bright point and PMT [m]
628  * -# cosine PMT angle
629  * -# arrival time [ns]
630  *
631  * The evaluation of the weights is based on:
632  * -# effective attenuation length
633  */
634  template<class JArgument_t>
635  class JPDFTransformer<2, JArgument_t> :
636  public JMultiMapTransformer<2, JArgument_t>
637  {
638  public:
639 
642 
646 
647 
648  /**
649  * Default constructor.
650  */
652  transformer()
653  {}
654 
655 
656  /**
657  * Constructor.
658  *
659  * \param ln Effective attenuation length [m]
660  * \param alpha Distance dependence (power term)
661  * \param kmin Minimal kappa
662  * \param kmax Maximal kappa
663  */
664  JPDFTransformer(const double ln,
665  const int alpha,
666  const double kmin,
667  const double kmax) :
668  transformer(ln, alpha, kmin, kmax)
669  {}
670 
671 
672  /**
673  * Clone object.
674  *
675  * \return pointer to newly created transformer
676  */
677  virtual clone_type clone() const
678  {
679  return new JPDFTransformer(*this);
680  }
681 
682 
683  /**
684  * Evaluate arrival time.
685  *
686  * \param buffer {D_m, ct}
687  * \param xn old t_ns
688  * \return new t_ns
689  */
690  virtual argument_type putXn(const_array_type& buffer, const argument_type xn) const
691  {
692  return transformer.putXn(buffer, xn);
693  }
694 
695 
696  /**
697  * Evaluate arrival time.
698  *
699  * \param buffer {D_m, ct}
700  * \param xn old t_ns
701  * \return new t_ns
702  */
703  virtual argument_type getXn(const_array_type& buffer, const argument_type xn) const
704  {
705  return transformer.getXn(buffer, xn);
706  }
707 
708 
709  /**
710  * Weight function.
711  *
712  * \param buffer {D_m, ct}
713  * \return weight
714  */
715  virtual double getWeight(const_array_type& buffer) const
716  {
717  return transformer.getWeight(buffer);
718  }
719 
720 
721  /**
722  * Read PDF transformer from input.
723  *
724  * \param in reader
725  * \return reader
726  */
727  virtual JReader& read(JReader& in)
728  {
729  in >> transformer;
730 
731  return in;
732  }
733 
734 
735  /**
736  * Write PDF transformer to output.
737  *
738  * \param out writer
739  * \return writer
740  */
741  virtual JWriter& write(JWriter& out) const
742  {
743  out << transformer;
744 
745  return out;
746  }
747 
748 
749  /**
750  * Print PDF transfomer to output stream.
751  *
752  * \param out output stream
753  * \return output stream
754  */
755  std::ostream& print(std::ostream& out) const
756  {
757  return transformer.print(out);
758  }
759 
760 
762  };
763 
764 
765  /**
766  * Template specialisation of transformer of the 3D probability density function (PDF) of the time response of a PMT due to a muon.
767  *
768  * PDFs are evaluated by interpolation for:
769  * -# distance of closest approach of the muon to the PMT [m]
770  * -# zenith angle of the PMT
771  * -# azimuthal angle of the PMT
772  * -# arrival time [ns]
773  *
774  * The evaluation of the weights is based on:
775  * -# effective attenuation length
776  * -# angular acceptance of PMT
777  */
778  template<class JArgument_t>
779  class JPDFTransformer<3, JArgument_t> :
780  public JMultiMapTransformer<3, JArgument_t>
781  {
782  public:
783 
786 
790 
792 
794 
795 
796  /**
797  * Default constructor.
798  */
800  transformer(),
802  {}
803 
804 
805  /**
806  * Constructor.
807  *
808  * \param ln Effective attenuation length [m]
809  * \param alpha Distance dependence (power term)
810  * \param kmin Minimal kappa
811  * \param kmax Maximal kappa
812  * \param pmt Function angular acceptance of PMT
813  * \param amin Baseline angular acceptance of PMT
814  */
815  template<class T>
816  JPDFTransformer(const double ln,
817  const int alpha,
818  const double kmin,
819  const double kmax,
820  T pmt,
821  const double amin) :
822  transformer(ln, alpha, kmin, kmax),
824  {
825  getAngularAcceptance.configure(JTOOLS::make_grid(1000, -1.0, +1.0), pmt);
826  getAngularAcceptance.add(amin);
827  getAngularAcceptance.compile();
828  getAngularAcceptance.setExceptionHandler(new JFunction1D_t::JDefaultResult(0.0));
829  }
830 
831 
832  /**
833  * Clone object.
834  *
835  * \return pointer to newly created transformer
836  */
837  virtual clone_type clone() const
838  {
839  return new JPDFTransformer(*this);
840  }
841 
842 
843  /**
844  * Evaluate arrival time.
845  *
846  * \param buffer {R_m, theta, phi}
847  * \param xn old t_ns
848  * \return new t_ns
849  */
850  virtual argument_type putXn(const_array_type& buffer, const argument_type xn) const
851  {
852  return transformer.putXn(buffer, xn);
853  }
854 
855 
856  /**
857  * Evaluate arrival time.
858  *
859  * \param buffer {R_m, theta, phi}
860  * \param xn old t_ns
861  * \return new t_ns
862  */
863  virtual argument_type getXn(const_array_type& buffer, const argument_type xn) const
864  {
865  return transformer.getXn(buffer, xn);
866  }
867 
868 
869  /**
870  * Weight function.
871  *
872  * \param buffer {R_m, theta, phi}
873  * \return weight
874  */
875  virtual double getWeight(const_array_type& buffer) const
876  {
877  using namespace JTOOLS;
878 
879  //const double R = buffer[0];
880  const double theta = buffer[1];
881  const double phi = buffer[2];
882 
883  const double n = getIndexOfRefraction();
884  const double ct0 = 1.0 / n;
885  const double st0 = sqrt((1.0 + ct0)*(1.0 - ct0));
886 
887  const double px = sin(theta)*cos(phi);
888  //const double py = sin(theta)*sin(phi);
889  const double pz = cos(theta);
890 
891  const double ct = st0*px + ct0*pz;
892 
893  return transformer.getWeight(buffer) * getAngularAcceptance(ct);
894  }
895 
896 
897  /**
898  * Read PDF transformer from input.
899  *
900  * \param in reader
901  * \return reader
902  */
903  virtual JReader& read(JReader& in)
904  {
905  in >> transformer;
906  in >> getAngularAcceptance;
907 
908  getAngularAcceptance.compile();
909 
910  return in;
911  }
912 
913 
914  /**
915  * Write PDF transformer to output.
916  *
917  * \param out writer
918  * \return writer
919  */
920  virtual JWriter& write(JWriter& out) const
921  {
922  out << transformer;
923  out << getAngularAcceptance;
924 
925  return out;
926  }
927 
928 
929  /**
930  * Print PDF transformer to output stream.
931  *
932  * \param out output stream
933  * \return output stream
934  */
935  std::ostream& print(std::ostream& out) const
936  {
937  return transformer.print(out);
938  }
939 
940 
943  };
944 
945 
946  /**
947  * Template specialisation of transformer of the 4D probability density function (PDF) of the time response of a PMT due to an EM shower.
948  *
949  * PDFs are evaluated by interpolation for:
950  * -# distance between EM shower and PMT [m]
951  * -# cosine angle EM shower direction and EM shower - PMT position
952  * -# zenith angle of the PMT
953  * -# azimuthal angle of the PMT
954  * -# arrival time [ns]
955  *
956  * The evaluation of the weights is based on:
957  * -# effective attenuation length
958  * -# emission profile of the photons
959  * -# angular acceptance of PMT
960  */
961  template<class JArgument_t>
962  class JPDFTransformer<4, JArgument_t> :
963  public JMultiMapTransformer<4, JArgument_t>
964  {
965  public:
966 
969 
973 
975 
977 
978 
979  /**
980  * Default constructor.
981  */
983  transformer(),
985  {}
986 
987 
988  /**
989  * Constructor.
990  *
991  * \param ln Effective attenuation length [m]
992  * \param alpha Distance dependence (power term)
993  * \param kmin Minimal kappa
994  * \param kmax Maximal kappa
995  * \param geant Function photon emission from EM-shower
996  * \param bmin Baseline photon emission from EM-shower
997  * \param pmt Function angular acceptance of PMT
998  * \param amin Baseline angular acceptance of PMT
999  */
1000  template<class T>
1001  JPDFTransformer(const double ln,
1002  const int alpha,
1003  const double kmin,
1004  const double kmax,
1005  const JGeant_t& geant,
1006  const double bmin,
1007  T pmt,
1008  const double amin) :
1009  transformer(ln, alpha, kmin, kmax, geant, bmin),
1011  {
1012  getAngularAcceptance.configure(JTOOLS::make_grid(1000, -1.0, +1.0), pmt);
1013  getAngularAcceptance.add(amin);
1014  getAngularAcceptance.compile();
1015  getAngularAcceptance.setExceptionHandler(new JFunction1D_t::JDefaultResult(0.0));
1016  }
1017 
1018 
1019  /**
1020  * Clone object.
1021  *
1022  * \return pointer to newly created transformer
1023  */
1024  virtual clone_type clone() const
1025  {
1026  return new JPDFTransformer(*this);
1027  }
1028 
1029 
1030  /**
1031  * Evaluate arrival time.
1032  *
1033  * \param buffer {D_m, cd, theta, phi}
1034  * \param xn old t_ns
1035  * \return new t_ns
1036  */
1037  virtual argument_type putXn(const_array_type& buffer, const argument_type xn) const
1038  {
1039  return transformer.putXn(buffer, xn);
1040  }
1041 
1042 
1043  /**
1044  * Evaluate arrival time.
1045  *
1046  * \param buffer {D_m, cd, theta, phi}
1047  * \param xn old t_ns
1048  * \return new t_ns
1049  */
1050  virtual argument_type getXn(const_array_type& buffer, const argument_type xn) const
1051  {
1052  return transformer.getXn(buffer, xn);
1053  }
1054 
1055 
1056  /**
1057  * Weight function.
1058  *
1059  * \param buffer {D_m, cd, theta, phi}
1060  * \return weight
1061  */
1062  virtual double getWeight(const_array_type& buffer) const
1063  {
1064  const double cd = buffer[1];
1065  const double theta = buffer[2];
1066  const double phi = buffer[3];
1067 
1068  const double ct0 = cd;
1069  const double st0 = sqrt((1.0 + ct0)*(1.0 - ct0));
1070 
1071  const double px = sin(theta)*cos(phi);
1072  //const double py = sin(theta)*sin(phi);
1073  const double pz = cos(theta);
1074 
1075  const double ct = st0*px + ct0*pz;
1076 
1077  return transformer.getWeight(buffer) * getAngularAcceptance(ct);
1078  }
1079 
1080 
1081  /**
1082  * Read PDF transformer from input.
1083  *
1084  * \param in reader
1085  * \return reader
1086  */
1087  virtual JReader& read(JReader& in)
1088  {
1089  in >> transformer;
1090  in >> getAngularAcceptance;
1091 
1092  getAngularAcceptance.compile();
1093 
1094  return in;
1095  }
1096 
1097 
1098  /**
1099  * Write PDF transformer to output.
1100  *
1101  * \param out writer
1102  * \return writer
1103  */
1104  virtual JWriter& write(JWriter& out) const
1105  {
1106  out << transformer;
1107  out << getAngularAcceptance;
1108 
1109  return out;
1110  }
1111 
1112 
1113  /**
1114  * Print PDF transfomer to output stream.
1115  *
1116  * \param out output stream
1117  * \return output stream
1118  */
1119  std::ostream& print(std::ostream& out) const
1120  {
1121  return transformer.print(out);
1122  }
1123 
1124 
1127  };
1128 
1129 
1130  /**
1131  * Template specialisation of transformer of the 5D probability density function (PDF) of the time response of a PMT due to an EM shower.
1132  *
1133  * PDFs are evaluated by interpolation for:
1134  * -# energy of the EM shower
1135  * -# distance between EM shower and PMT [m]
1136  * -# cosine angle EM shower direction and EM shower - PMT position
1137  * -# zenith angle of the PMT
1138  * -# azimuthal angle of the PMT
1139  * -# arrival time [ns]
1140  *
1141  * The evaluation of the weights is based on:
1142  * -# energy of the EM shower
1143  * -# effective attenuation length
1144  * -# emission profile of the photons
1145  * -# angular acceptance of PMT
1146  */
1147  template<class JArgument_t>
1148  class JPDFTransformer<5, JArgument_t> :
1149  public JMultiMapTransformer<5, JArgument_t>
1150  {
1151  public:
1152 
1155 
1159 
1160 
1161  /**
1162  * Default constructor.
1163  */
1165  transformer()
1166  {}
1167 
1168 
1169  /**
1170  * Constructor.
1171  *
1172  * \param ln Effective attenuation length [m]
1173  * \param alpha Distance dependence (power term)
1174  * \param kmin Minimal kappa
1175  * \param kmax Maximal kappa
1176  * \param geant Function photon emission from EM-shower
1177  * \param bmin Baseline photon emission from EM-shower
1178  * \param pmt Function angular acceptance of PMT
1179  * \param amin Baseline angular acceptance of PMT
1180  */
1181 
1182  template<class T>
1183  JPDFTransformer(const double ln,
1184  const int alpha,
1185  const double kmin,
1186  const double kmax,
1187  const JGeant_t& geant,
1188  const double bmin,
1189  T pmt,
1190  const double amin) :
1191  transformer(ln, alpha, kmin, kmax, geant, bmin, pmt, amin)
1192  {}
1193 
1194 
1195  /**
1196  * Clone object.
1197  *
1198  * \return pointer to newly created transformer
1199  */
1200  virtual clone_type clone() const
1201  {
1202  return new JPDFTransformer(*this);
1203  }
1204 
1205 
1206  /**
1207  * Evaluate arrival time.
1208  *
1209  * \param buffer {E_GeV, D_m, cd, theta, phi}
1210  * \param xn old t_ns
1211  * \return new t_ns
1212  */
1213  virtual argument_type putXn(const_array_type& buffer, const argument_type xn) const
1214  {
1215  return transformer.putXn(buffer.pop_front(), xn);
1216  }
1217 
1218 
1219  /**
1220  * Evaluate arrival time.
1221  *
1222  * \param buffer {E_GeV, D_m, cd, theta, phi}
1223  * \param xn old t_ns
1224  * \return new t_ns
1225  */
1226  virtual argument_type getXn(const_array_type& buffer, const argument_type xn) const
1227  {
1228  return transformer.getXn(buffer.pop_front(), xn);
1229  }
1230 
1231 
1232  /**
1233  * Weight function.
1234  *
1235  * \param buffer {E_GeV, D_m, cd, theta, phi}
1236  * \return weight
1237  */
1238  virtual double getWeight(const_array_type& buffer) const
1239  {
1240  const double E = buffer[0];
1241 
1242  return transformer.getWeight(buffer.pop_front()) / E;
1243  }
1244 
1245 
1246  /**
1247  * Read PDF transformer from input.
1248  *
1249  * \param in reader
1250  * \return reader
1251  */
1252  virtual JReader& read(JReader& in)
1253  {
1254  in >> transformer;
1255 
1256  return in;
1257  }
1258 
1259 
1260  /**
1261  * Write PDF transformer to output.
1262  *
1263  * \param out writer
1264  * \return writer
1265  */
1266  virtual JWriter& write(JWriter& out) const
1267  {
1268  out << transformer;
1269 
1270  return out;
1271  }
1272 
1273 
1274  /**
1275  * Print PDF transfomer to output stream.
1276  *
1277  * \param out output stream
1278  * \return output stream
1279  */
1280  std::ostream& print(std::ostream& out) const
1281  {
1282  return transformer.print(out);
1283  }
1284 
1286  };
1287 }
1288 
1289 #endif
double getIndexOfRefractionPhase()
Get average index of refraction of water.
Definition: JConstants.hh:122
virtual argument_type getXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
Interface for binary output.
do echo Generating $dir eval D
Definition: JDrawLED.sh:50
virtual clone_type clone() const
Clone object.
std::ostream & print(std::ostream &out) const
Print PDF transformer to output stream.
JMultiMapTransformer_t::clone_type clone_type
JPDGTransformer_t< JArgument_t > JFunction2DTransformer_t
JMultiMapTransformer_t::const_array_type const_array_type
Base class for photon emission profile EM-shower.
virtual clone_type clone() const
Clone object.
std::ostream & print(std::ostream &out) const
Print PDF transformer to output stream.
virtual JReader & read(JReader &in)
Read PDF transformer from input.
double getIndexOfRefraction()
Get average index of refraction of water.
Definition: JConstants.hh:111
virtual argument_type putXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
virtual argument_type putXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
int alpha
Distance dependence (power term)
JMultiMapTransformer_t::clone_type clone_type
virtual double getWeight(const_array_type &buffer) const
Weight function.
std::ostream & print(std::ostream &out) const
Print PDF transfomer to output stream.
JMultiMapTransformer< 4, JArgument_t > JMultiMapTransformer_t
JMultiMapTransformer_t::clone_type clone_type
Template definition of transformer of the probability density function (PDF) of the time response of ...
virtual argument_type getXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
esac print_variable DETECTOR INPUT_FILE OUTPUT_FILE CDF for TYPE in
Definition: JSirene.sh:45
JPDFTransformer_t< JArgument_t > JFunction1DTransformer_t
virtual JReader & read(JReader &in)
Read PDF transformer from input.
JArray< N-1, T > pop_front() const
Make a copy in which the first element is removed.
Definition: JArray.hh:309
JMultiMapTransformer_t::argument_type argument_type
virtual JReader & read(JReader &in)
Read PDF transformer from input.
JMultiMapTransformer_t::argument_type argument_type
JMultiMapTransformer< 5, JArgument_t > JMultiMapTransformer_t
JFunction1DTransformer_t transformer
JMultiMapTransformer_t::clone_type clone_type
virtual clone_type clone() const
Clone object.
JMultiMapTransformer_t::const_array_type const_array_type
JClonable< multimaptransformer_type >::clone_type clone_type
static const JGeant geant(geanx, 0.0001)
Function object for the number of photons from EM-shower as a function of emission angle...
virtual JWriter & write(JWriter &out) const
Write PDF transformer to output.
JMultiMapTransformer< 1, JArgument_t > JMultiMapTransformer_t
virtual JWriter & write(JWriter &out) const
Write PDF transformer to output.
JMultiMapTransformer_t::clone_type clone_type
virtual JWriter & write(JWriter &out) const
Write PDF transformer to output.
esac $JPP_DIR examples JDetector JTransitTime o $OUTPUT_FILE n N $NPE T $TTS_NS d $DEBUG for HISTOGRAM in tts tt2 pmt
Definition: JTransitTime.sh:36
JPDFTransformer< 4, JArgument_t > JFunction4DTransformer_t
JMultiMapTransformer_t::argument_type argument_type
virtual JReader & read(JReader &in)
Read PDF transformer from input.
double ln
Effective attenuation length [m].
Type definition of a 1st degree polynomial interpolation based on a JGridCollection with result type ...
static double getDmin()
Get shortest distance.
JMultiMapTransformer_t::const_array_type const_array_type
virtual argument_type putXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
const double getInverseSpeedOfLight()
Get inverse speed of light.
Definition: JConstants.hh:100
Transformer for the 2D probability density function (PDF) of the time response of a PMT due to an EM ...
Transformer for the 1D probability density function (PDF) of the time response of a PMT to a muon...
JPDFTransformer(const double ln, const int alpha, const double kmin, const double kmax)
Constructor.
Compiler version dependent expressions, macros, etc.
Constants.
virtual JReader & read(JReader &in)
Read PDF transformer from input.
JMultiMapTransformer_t::const_array_type const_array_type
std::ostream & print(std::ostream &out) const
Print PDF transformer to output stream.
virtual argument_type putXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
virtual double getWeight(const_array_type &buffer) const =0
Weight function.
virtual double getWeight(const_array_type &buffer) const
Weight function.
JClonable< JClonable_t >::clone_type clone_type
Definition: JClonable.hh:61
JMultiMapTransformer_t::argument_type argument_type
virtual JWriter & write(JWriter &out) const
Write PDF transformer to output.
virtual argument_type getXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
std::ostream & print(std::ostream &out) const
Print PDF transformer to output stream.
virtual argument_type putXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
virtual double getWeight(const_array_type &buffer) const
Weight function.
virtual argument_type putXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
JPDFTransformer(const double ln, const int alpha, const double kmin, const double kmax, T pmt, const double amin)
Constructor.
virtual JReader & read(JReader &in)
Read PDF transformer from input.
JMultiMapTransformer< 1, JArgument_t > JMultiMapTransformer_t
double kmax
maximal kappa
do set_variable OUTPUT_DIRECTORY $WORKDIR T
JTOOLS::JGridPolint1Function1D_t JFunction1D_t
virtual argument_type getXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
JPD0Transformer_t< JArgument_t > JFunction1DTransformer_t
then print_variable DETECTOR INPUT_FILE INTERMEDIATE_FILE check_input_file $DETECTOR $INPUT_FILE check_output_file $INTERMEDIATE_FILE $OUTPUT_FILE JMCEvt f $INPUT_FILE o $INTERMEDIATE_FILE d
Definition: JPath.sh:52
JMultiMapTransformer_t::clone_type clone_type
JMultiMapTransformer_t::const_array_type const_array_type
virtual double getWeight(const_array_type &buffer) const
Weight function.
virtual argument_type putXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
JPD0Transformer_t< JArgument_t > JFunction1DTransformer_t
JTOOLS::JGridPolint1Function1D_t JFunction1D_t
JMultiMapTransformer_t::argument_type argument_type
double kmax
maximal kappa
JPDFTransformer(const double ln, const int alpha, const double kmin, const double kmax, const JGeant_t &geant, const double bmin, T pmt, const double amin)
Constructor.
virtual JWriter & write(JWriter &out) const
Write PDF transformer to output.
Interface for binary input.
JPD0Transformer_t(const double ln, const int alpha, const double kmin, const double kmax)
Constructor.
One dimensional array of template objects with fixed length.
Definition: JArray.hh:35
then usage $script[distance] fi case set_variable R
Definition: JDrawLED.sh:40
Transformer for the 1D probability density function (PDF) of the time response of a PMT due to a poin...
Base class for the probability density function of photon emission from EM-shower as a function of th...
Definition: JGeant_t.hh:32
virtual JWriter & write(JWriter &out) const
Write PDF transformer to output.
int alpha
Distance dependence (power term)
virtual double getWeight(const_array_type &buffer) const
Weight function.
virtual argument_type getXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
virtual clone_type clone() const
Clone object.
JPDFTransformer_t(const double ln, const int alpha, const double kmin, const double kmax)
Constructor.
virtual clone_type clone() const
Clone object.
JPDFTransformer_t()
Default constructor.
alias put_queue eval echo n
Definition: qlib.csh:19
JMultiMapTransformer_t::argument_type argument_type
virtual JReader & read(JReader &in)
Read PDF transformer from input.
JPDFTransformer(const double ln, const int alpha, const double kmin, const double kmax, const JGeant_t &geant, const double bmin, T pmt, const double amin)
Constructor.
Interface for weight application and coordinate transformation of function.
JMultiMapTransformer_t::const_array_type const_array_type
JMultiMapTransformer_t::const_array_type const_array_type
static double getRmin()
Get shortest distance of approach.
virtual argument_type getXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
double kmin
minimal kappa
JMultiMapTransformer_t::clone_type clone_type
JMultiMapTransformer< 2, JArgument_t > JMultiMapTransformer_t
JPDGTransformer_t()
Default constructor.
JPD0Transformer_t()
Default constructor.
double ln
Effective attenuation length [m].
virtual double getWeight(const_array_type &buffer) const
Weight function.
std::ostream & print(std::ostream &out) const
Print PDF transfomer to output stream.
virtual double getWeight(const_array_type &buffer) const
Weight function.
std::ostream & print(std::ostream &out) const
Print PDF transfomer to output stream.
JMultiMapTransformer_t::argument_type argument_type
double getTanThetaC()
Get average tangent of Cherenkov angle of water.
Definition: JConstants.hh:133
JPDGTransformer_t(const double ln, const int alpha, const double kmin, const double kmax, const JGeant_t &geant, const double bmin)
Constructor.
JGrid< JAbscissa_t > make_grid(const int nx, const JAbscissa_t Xmin, const JAbscissa_t Xmax)
Helper method for JGrid.
Definition: JGrid.hh:177
Template specialisation of transformer of the 4D probability density function (PDF) of the time respo...
JMultiMapTransformer< 3, JArgument_t > JMultiMapTransformer_t
JMultiMapTransformer< 2, JArgument_t > JMultiMapTransformer_t
double kmin
minimal kappa
virtual argument_type getXn(const_array_type &buffer, const argument_type xn) const
Evaluate arrival time.
virtual clone_type clone() const
Clone object.
then usage $script[input file[working directory[option]]] nWhere option can be E
Definition: JMuonPostfit.sh:37
virtual JWriter & write(JWriter &out) const
Write PDF transformer to output.
virtual clone_type clone() const
Clone object.
then set_variable FORMULA *[0] exp(-0.5 *(x-[1])*(x-[1])/([2]*[2]))" set_variable OUTPUT_FILE histogram.root JHistogram1D -o $WORKDIR/$OUTPUT_FILE -F "$FORMULA" -
double getAngularAcceptance(const double x)
Angular acceptence of PMT.
Definition: JDrawLED.cc:84