/** \file Declaration of AnalyticalCherenkovModel \author Luis Prado Jr. \version $Id: AnalyticalCherenkovModel.h 20705 2012-03-28 16:20:59Z javierg $ \date 27 Jan 2004 */ #ifndef _atm_AnalyticalCherenkovModel_h_ #define _atm_AnalyticalCherenkovModel_h_ static const char CVSId_atm_AnalyticalCherenkovModel[] = "$Id: AnalyticalCherenkovModel.h 20705 2012-03-28 16:20:59Z javierg $"; #include #include #include namespace utl { class TabulatedFunction; } namespace atm { /** \class AnalyticalCherenkovModel AnalyticalCherenkovModel.h "atm/AnalyticalCherenkovModel.h" \brief Model with analytical calculation of the Cherenkov light \author Luis Prado Jr \date 27 Jan 2004 \ingroup atm_models */ class AnalyticalCherenkovModel : public atm::VCherenkovModel { public: /// Model Constructor AnalyticalCherenkovModel(); /// Model Destructor virtual ~AnalyticalCherenkovModel() { } /// Init method of the model void Init(); // Possible parametrizations for the Energy Electron Spectrum. enum Parametrization { eHillas, eGiller, eNerling }; // Possible parametrizations for the Angular Electron Distribution. enum ParametrizationAngular { eAngHillas, eAngNerling, eAngGiller }; /// Calculation of Cherenkov photons produced between two points utl::TabulatedFunction& EvaluateCherenkovPhotons(const utl::Point& xA, const utl::Point& xB, const double showerAge) const; /// Calculation of probability of Cherenkov emission utl::TabulatedFunction& EvaluateCherenkovDirect(const utl::Point& xA, const utl::Point& xB, const utl::Point& xEye, const double showerAge) const; double EvaluateDirectCherenkovProbability(const utl::Point& xA, const utl::Point& xB, const utl::Point& xEye, const double showerAge) const; double AngularCDF(const double theta, const double verticalDepth, const double showerAge) const; double AngularPDF(const double theta, const double verticalDepth, const double showerAge) const; bool HasData() const {return true;}; void SetEnergyCutoff(double ecut) const; private: static const double fdE; static const double fjMax; /// Limits for the shower age in the use of the Nerling parameterizations static const double fNerlingMinValidShowerAge; static const double fNerlingMaxValidShowerAge; /// Number of photons as function of the wavelength mutable utl::TabulatedFunction fCherenkovPhotons; mutable utl::TabulatedFunction fDirectCherenkovPhotons; /// Wavelengths to calculate the light production std::vector fWavelength; /// Parametrization to be used in the Cherenkov light calculation Parametrization fParam; ParametrizationAngular fParamAngular; /// Calculation of a special track length to be used in the Cherenkov light evaluation double CherenkovTrackLength(double energy, double showerAge) const; /// Calculation of Cherenkov Photons between two wavelengths double DeltaPhotons(double nIndex, double eelec, double dSlant, double wl1, double wl2) const; /// Calculation of the Cherenkov angle integral int(df/dtheta*sin(theta)) double CherenkovIntegral(double lowAngle, double highAngle, double meanShowerAge, double eThreshold) const; const std::vector& GetWavelengths() const { return fWavelength; } /// Keep reference to previous calculation, to prevent re-calculation mutable utl::Point fxAprevious; mutable utl::Point fxBprevious; mutable double fShowerAgePrevious; mutable std::vector fNerlingFactor; REGISTER_MODEL(atm::VCherenkovModel, "Analytical",AnalyticalCherenkovModel); }; } #endif // Configure (x)emacs for this file ... // Local Variables: // mode: c++ // compile-command: "make -C .. -k" // End: