6 #include <utl/Reader.h>
7 #include <utl/ErrorLogger.h>
8 #include <utl/AugerUnits.h>
9 #include <utl/AugerException.h>
10 #include <utl/MathConstants.h>
11 #include <utl/PhysicalConstants.h>
12 #include <utl/PhysicalFunctions.h>
13 #include <utl/Point.h>
14 #include <utl/Vector.h>
15 #include <utl/AxialVector.h>
16 #include <utl/TabulatedFunction.h>
17 #include <utl/TabulatedFunctionErrors.h>
18 #include <utl/UTMPoint.h>
19 #include <utl/ReferenceEllipsoid.h>
20 #include <utl/TransformationMatrix.h>
21 #include <utl/TimeStamp.h>
22 #include <utl/AugerCoordinateSystem.h>
24 #include <utl/Particle.h>
26 #include <evt/Event.h>
27 #include <evt/ShowerSimData.h>
28 #include <evt/LaserData.h>
30 #include <fevt/FEvent.h>
32 #include <fevt/TelescopeSimData.h>
33 #include <fevt/Telescope.h>
35 #include <fwk/CentralConfig.h>
36 #include <fwk/LocalCoordinateSystem.h>
38 #include <det/Detector.h>
39 #include <fdet/FDetector.h>
41 #include <fdet/Telescope.h>
42 #include <fdet/Camera.h>
44 #include <atm/AttenuationResult.h>
45 #include <atm/ScatteringResult.h>
46 #include <atm/Atmosphere.h>
47 #include <atm/ProfileResult.h>
48 #include <atm/InclinedAtmosphericProfile.h>
59 using namespace LightAtDiaphragmSimulatorKG;
72 CentralConfig::GetInstance()->
GetTopBranch(
"LightAtDiaphragmSimulatorKG");
82 topB.
GetChild(
"laserRayleighScattered").
GetData(fLaserRayleighScattered);
85 const bool showerMode = fFluorDirect ||
86 fCherDirect || fCherDirectCORSIKA || fCherRayleighScattered || fCherMieScattered;
88 const bool laserMode = fLaserMieScattered || fLaserRayleighScattered;
90 if (showerMode && laserMode) {
91 ERROR(
"You cannot propagate shower and laser light simultanously. "
92 "Check your xml data card!");
96 if (fCherDirect && fCherDirectCORSIKA) {
97 ERROR(
"You cannot simulate direct Cherenkov from parameterization and CORSIKA at the same time. Check your xml settings!");
105 << GetVersionInfo(VModule::eRevisionNumber) <<
"\n"
108 info <<
" -- shower mode -- \n"
109 " fluorescence: " << fFluorDirect <<
"\n"
110 " cherenkov direct: " << fCherDirect <<
" " << (fCherDirectCORSIKA ?
"[CORSIKA]" :
"[model]") <<
"\n"
111 " cherenkov Mie: " << fCherMieScattered <<
"\n"
112 " cherenkov Rayleigh: " << fCherRayleighScattered <<
"\n"
113 " wavelength dep. n: " << fWlRefrac <<
"\n";
114 }
else if (laserMode) {
115 info <<
" -- laser mode -- \n"
116 " laser Mie scattered: " << fLaserMieScattered <<
"\n"
117 " laser Rayleigh scat: " << fLaserRayleighScattered <<
"\n";
119 info <<
" -- unknown mode !!! -- \n";
131 ERROR(
"Missing FEvent. Check your module configurations and ModuleSequence.");
136 ERROR(
"Event has no simulated shower.");
145 ERROR(
"Event has no longitudinal profile for the simulated shower.");
152 const Point core(0, 0, 0, showerCS);
153 const Vector showerAxis(0, 0, -1, showerCS);
154 const double zenith = (-simShower.
GetDirection()).GetTheta(localCS);
155 const double absCosZenith = std::fabs(cos(zenith));
160 Detector& detector = Detector::GetInstance();
163 bool flatEarth =
false;
176 vector <double> WLengthLaser;
178 double laserWavelength =
event.GetSimShower().GetLaserData().GetLaserWavelength();
179 WLengthLaser.push_back (laserWavelength);
182 ERROR(
"Shower without GH-fit: Cannot compute 3D shower structure ! SKIPPING !");
184 return eContinueLoop;
189 const vector<double>& WLengthFluo = atmo.
GetWavelengths(Atmosphere::eFluorescence);
190 const vector<double>& WLengthCkov = atmo.
GetWavelengths(Atmosphere::eCerenkov);
191 const unsigned int NWLengthFluo = WLengthFluo.size();
192 const unsigned int NWLengthCkov = WLengthCkov.size();
200 INFO(
" ... computing, this may take a while ... ");
228 const double tracebin = distanceTrace.
GetBinning();
229 const double nBins = distanceTrace.
GetSize();
235 const double tMinAtDia = photonStartTimeAtDia - timeAtCore;
237 const Vector telToCore = telPosition - core;
238 const double distTelToCore = telToCore.
GetMag();
239 const double cosBeta =
CosAngle(telToCore, showerAxis);
248 for (
int iBin = 0; iBin < nBins; ++iBin) {
250 const double timeBinStart = tMinAtDia + tracebin * iBin;
251 const double timeBin = timeBinStart + 0.5*tracebin;
252 const double timeBinEnd = timeBinStart + tracebin;
255 const double distance = CalculateDistanceFromCore(timeBin, Rp, T0);
256 const Point pave = core + showerAxis * distance;
261 const double distanceStart = CalculateDistanceFromCore(timeBinStart, Rp, T0);
262 const Point stepStart = core + showerAxis * distanceStart;
265 const double distanceEnd = CalculateDistanceFromCore(timeBinEnd, Rp, T0);
266 const Point stepEnd = core + showerAxis * distanceEnd;
268 const double xStepWidth = std::fabs(distanceEnd-distanceStart);
269 distanceTrace[iBin] = distance;
271 if (slantDepthVsDistance &&
272 (distance > slantDepthVsDistance->
MaxX() ||
273 distance < slantDepthVsDistance->
MinX())) {
286 const Vector paveDir = pave - telPosition;
287 const double paveDist2 = paveDir.
GetMag2();
288 const double paveDist =
sqrt(paveDist2);
289 const double geoFactor = 1. / (4.*
kPi*paveDist2);
308 if (!fIsLaserEvent) {
331 for (
unsigned int iwl = 0; iwl < NWLengthFluo; ++iwl) {
342 const double att = (*rAttFluo)[iwl].
Y() * (*mAttFluo)[iwl].Y();
350 *(fluoPhotons.
XBegin()) < distance &&
351 *(fluoPhotons.
XEnd() - 1) > distance)
352 auxPh = fluoPhotons.
Y(distance);
353 const double photons = auxPh * geoFactor * att * xStepWidth;
354 fluorDirectTrace[iBin] += photons;
363 if (fCherDirect || fCherMieScattered || fCherRayleighScattered) {
367 const double Xslant = (flatEarth ?
368 depthProfile->
Y(coreZ-distance*absCosZenith)/absCosZenith :
369 slantDepthVsDistance->
Y(distance));
379 double directCher = 0;
393 const double scattAngle = acos(-showerAxis*paveDir / paveDir.
GetMag());
396 if (fCherMieScattered) {
398 scattAngle, paveDist,
404 if (fCherRayleighScattered) {
406 scattAngle, paveDist,
418 for (
unsigned int iwl = 0; iwl < NWLengthCkov; ++iwl) {
423 const double att = (*rAttCkov)[iwl].Y() * (*mAttCkov)[iwl].Y();
425 double beamPhotons = 0;
429 *cherPhotons.
XBegin() < distance &&
430 *(cherPhotons.
XEnd() - 1) > distance)
431 beamPhotons += cherPhotons.
Y(distance);
434 double directPhotons = 0;
438 *cherPhotons.
XBegin() < distance &&
439 *(cherPhotons.
XEnd() - 1) > distance)
440 directPhotons += cherPhotons.
Y (distance);
444 if (fCherMieScattered) {
448 const double photons = beamPhotons * (*mFactor)[iwl].Y() * att;
449 cherMieTrace[iBin] += photons;
453 if (fCherRayleighScattered) {
457 const double photons = beamPhotons * (*rFactor)[iwl].Y() * att;
458 cherRayleighTrace[iBin] += photons;
464 showerAge, WLengthCkov[iwl]) : 1.;
468 const double photons = directPhotons * directCher*directCherWl * att * xStepWidth;
469 cherDirectTrace[iBin] += photons;
487 const double scattAngle = acos(-showerAxis*paveDir / paveDir.
GetMag());
491 rAttLaser = &rAttenLaser.GetTransmissionFactor();
497 scattAngle, paveDist,
502 scattAngle, paveDist,
507 double att = (*rAttLaser)[0].
Y() * (*mAttLaser)[0].Y();
508 double laserPhotons = 0;
512 *laserLight.
XBegin() < distance &&
513 *(laserLight.
XEnd() - 1) > distance)
514 laserPhotons += laserLight.
Y(distance);
516 if (fLaserMieScattered) {
522 const double photons = laserPhotons * att * mFactor[0].
Y();
523 laserMieTrace[iBin] += photons;
526 if (fLaserRayleighScattered) {
531 const double photons = laserPhotons * att * rFactor[0].
Y();
532 laserRayleighTrace[iBin] += photons;
545 if (fCherDirectCORSIKA) {
546 EvaluateDirectCherenkovHits(event);
555 LightAtDiaphragmSimulator::Finish()
579 LightAtDiaphragmSimulator::CalculateDistanceFromCore(
const double tDia,
592 explicit my_facet(
size_t refs = 0) : std::numpunct<char>(refs) {}
598 LightAtDiaphragmSimulator::EvaluateDirectCherenkovHits(
evt::Event &event)
602 Detector& detector = Detector::GetInstance();
608 TH2D* hist2D =
new TH2D(
"hist2D",
"hist2D", 600, -0e3, 10e3, 600, 50e3, 60e3);
609 TH2D* histObs2D =
new TH2D(
"histObs2D",
"histObs2D", 600, -0e3, 10e3, 600, 50e3, 60e3);
610 TH2D* histCore2D =
new TH2D(
"histCore2D",
"histCore2D", 300, -40e3, 40e3, 300, -40e3, 40e3);
611 TH2D* hist2Demit =
new TH2D(
"hist2Demit_site",
"hist2Demit_site", 300, -5e3, 75e3, 300, 0e3, 85e3);
612 TH2D* histObs2Demit =
new TH2D(
"histObs2Demit_site",
"histObs2Demit_site", 300, -5e3, 75e3, 300, 0e3, 85e3);
613 TH2D* histCore2Demit =
new TH2D(
"histCore2Demit_site",
"histCore2Demit_site", 300, -40e3, 40e3, 300, -40e3, 40e3);
614 const double deltaZoom = 5.e3;
615 TH2D* hist2DzoomLL =
new TH2D(
"hist2DzoomLL",
"hist2DzoomLL", 300, -deltaZoom, deltaZoom, 300, -deltaZoom, deltaZoom);
616 TH2D* hist2DzoomLA =
new TH2D(
"hist2DzoomLA",
"hist2DzoomLA", 300, -deltaZoom, deltaZoom, 300, -deltaZoom, deltaZoom);
617 TH2D* hist2DzoomLM =
new TH2D(
"hist2DzoomLM",
"hist2DzoomLM", 300, -deltaZoom, deltaZoom, 300, -deltaZoom, deltaZoom);
618 TH2D* hist2DzoomCO =
new TH2D(
"hist2DzoomCO",
"hist2DzoomCO", 300, -deltaZoom, deltaZoom, 300, -deltaZoom, deltaZoom);
619 TH2D* angle2D =
new TH2D(
"angle2D",
"angle2D", 100, -1, 1, 100, -1, 1);
620 TH2D* onTel2D =
new TH2D(
"onTel2D",
"onTel2D(telCS)", 500, -100, 100, 500, -100, 100);
621 TH1D* histCos =
new TH1D(
"histCos",
"histCos", 100,-1,1);
622 TH1D* histCosEmission =
new TH1D(
"histCosEmission",
"histCosEmission", 100,-1,1);
623 TH1D* histTimeCher =
new TH1D(
"histTimeCher",
"histTimeCher", 100,1,0);
624 TH1D* histTimeArrival =
new TH1D(
"histTimeArrival",
"histTimeArrival", 100,1,0);
625 vector<double> eyesX, eyesY;
627 map<int, fevt::TelescopeSimData*> tel_sim;
628 map<int, map<int, double>> tel_time_bin_trace;
629 map<int, double> tel_time_bin_width;
630 map<int, double> tel_time_nbins;
660 map<int, int> countPhot;
661 map<int, double> weightPhot;
662 map<int, double> weightSqrPhot;
663 unsigned int countAll = 0;
673 map<int, map<int, bool> > doneThis;
675 vector<utl::AttributeMap> allTelEyeCombinations;
684 unsigned int eyeId = eyeEvent.
GetId();
689 unsigned int telId = iTel->GetId();
698 thisDet[
"eye"] = std::to_string(eyeId);
699 thisDet[
"tel"] = std::to_string(telId);
700 allTelEyeCombinations.push_back(thisDet);
703 thisDet[
"eye"] = std::to_string(eyeId);
704 allTelEyeCombinations.push_back(thisDet);
707 allTelEyeCombinations.push_back(thisDet);
711 for (
const auto& itCombi:allTelEyeCombinations) {
715 const bool hasTelAttribute = am.count(
"tel");
716 const unsigned int telAttribute = hasTelAttribute ? std::stoi(am[
"tel"]) : 0;
717 const bool hasEyeAttribute = am.count(
"eye");
718 const unsigned int eyeAttribute = hasEyeAttribute ? std::stoi(am[
"eye"]) : 0;
731 map<int, map<int, bool> > flagThis;
732 unsigned int countThis = 0;
740 err <<
"Cherenkov input particle not of type \'photon\': " << iCher->GetName();
748 const Vector& nIn = iCher->GetDirection();
749 const Point& pIn = iCher->GetPosition();
750 double weight = iCher->GetWeight();
751 const double energy = iCher->GetTotalEnergy();
755 std::function<void (CoordinateSystemPtr,TH2D*,TH2D*)> func = [pIn,nIn,weight](
CoordinateSystemPtr csDet, TH2D* hist, TH2D* hist2) {
756 const Point site(0,0,0,csDet);
762 const Point site_pos = site;
763 const Vector site_normal(0,0,1,cs);
764 const Vector emission_location = site_pos - pIn;
766 const double distance_perp = emission_location * site_normal;
767 const double cosTheta = site_normal*nIn;
768 const double distance = distance_perp / cosTheta;
769 const Point pGround = pIn + distance*nIn;
771 hist2->Fill(pIn.GetX(cs)/
meter, pIn.GetY(cs)/
meter, weight);
786 func(coreCS, histCore2D, histCore2Demit);
787 func(siteCS, hist2D, hist2Demit);
788 func(obsCS, histObs2D, histObs2Demit);
789 func(llCS, hist2DzoomLL,0);
790 func(laCS, hist2DzoomLA,0);
791 func(lmCS, hist2DzoomLM,0);
792 func(coCS, hist2DzoomCO,0);
804 const unsigned int eyeId = eyeEvent.
GetId();
805 if (hasEyeAttribute && eyeAttribute != eyeId)
811 unsigned int telId = iTel->GetId();
812 if (hasTelAttribute && telAttribute != telId)
815 if (doneThis.count(eyeId) && doneThis[eyeId].count(telId) && doneThis[eyeId][telId])
818 flagThis[eyeId][telId] =
true;
830 const int tel_unique = eyeId * 100000 + telId;
838 const double cosTheta = telNormal*nIn;
840 const Vector emission_location = telPosition - pIn;
841 const double emission_distance = emission_location.
GetMag();
842 const double distance_perp = emission_location * telNormal;
844 const double cosThetaEmission = distance_perp / emission_distance;
846 histCos->Fill(cosTheta);
847 histCosEmission->Fill(cosThetaEmission);
848 angle2D->Fill(cosThetaEmission,cosTheta);
850 if (-cosThetaEmission<cosFOV) {
854 if (-cosTheta<cosFOV) {
858 const double distance = distance_perp / cosTheta;
859 const Point onDia = pIn + distance*nIn;
872 weight *= rAttCkov * mAttCkov;
874 countPhot[tel_unique] ++;
875 weightPhot[tel_unique] += weight;
876 weightSqrPhot[tel_unique] += weight*weight;
878 tel_sim[tel_unique] = &telSim;
882 const TimeInterval timeDia = timePhoton - traceAtTelTime;
884 histTimeCher->Fill(iCher->GetTime()/
ns);
885 histTimeArrival->Fill(timeDia/
ns);
907 utl::Photon photonIn(onDia, nIn, wavelength, weight, lightSource);
921 const int CkovBin = WLengthCkov.size()/2;
931 if (tel_time_bin_trace.count(tel_unique) == 0) {
932 tel_time_bin_width[tel_unique] = distanceTrace.
GetBinning();
933 tel_time_nbins[tel_unique] = distanceTrace.
GetSize();
934 tel_time_bin_trace[tel_unique] = map<int, double>();
936 const int tel_time_bin = timeDiaAbs.
GetInterval() / tel_time_bin_width[tel_unique];
937 tel_time_bin_trace[tel_unique][tel_time_bin] += weight_loc;
941 weight /= rAttCkov * mAttCkov;
952 for (
const auto& flagEye : flagThis)
953 for (
const auto& flagTel : flagEye.second)
954 doneThis[flagEye.first][flagTel.first] =
true;
957 info <<
"Read " << countThis <<
" photons with attributes: eye=\""
958 << (hasEyeAttribute ? am[
"eye"] :
"-") <<
"\", tel=\"" << (hasTelAttribute ? am[
"tel"] :
"-") <<
"\" ";
964 bool lowQualityProblem =
false;
966 for (map<int,double>::const_iterator iDT = tel_time_bin_width.begin();
967 iDT != tel_time_bin_width.end(); ++iDT) {
968 const int tel_unique = iDT->first;
969 unsigned int eyeId = tel_unique /100000;
970 unsigned int telId = tel_unique % 100000;
972 if (countPhot.count(tel_unique)) {
973 const double weight = weightPhot[tel_unique] / countPhot[tel_unique];
974 const double weightRMS =
sqrt(weightSqrPhot[tel_unique] / countPhot[tel_unique] - weight*weight);
975 info <<
"Eye=" << eyeId <<
", Tel=" << telId <<
": ";
976 info <<
"detected " << countPhot[tel_unique] <<
" photons on diaphragm with total weight= " << weightPhot[tel_unique];
977 info <<
": <weight>=" << weight <<
", RMS(weight)=" << weightRMS;
978 if (weight>10000 || weightRMS>1000) {
979 lowQualityProblem =
true;
980 info <<
" [WEIGHTS TOO LARGE! CANNOT HANDLE!]";
986 if (lowQualityProblem) {
988 err <<
"Please consider to run CORSIKA with less thinning. Cherenkov simulation makes no sense with huge weights";
997 std::locale withgroupings(global,
new my_facet);
998 inf.imbue(withgroupings);
1000 inf <<
"Found a total of " << countAll <<
" Cherenkov photons in input file" << endl;
1006 static int iSave = 0;
1008 ostringstream savename;
1009 savename <<
"save_" << iSave <<
".root";
1011 TDirectory* saveDir = gDirectory;
1012 TFile*
file = TFile::Open(savename.str().c_str(),
"recreate");
1015 TCanvas* can2D =
new TCanvas(
"can2D");
1020 hist2Demit->Draw(
"colz");
1024 hist2D->Draw(
"colz");
1028 histCore2D->Draw(
"colz");
1032 histObs2D->Draw(
"colz");
1036 hist2DzoomLL->Draw(
"colz");
1040 hist2DzoomLA->Draw(
"colz");
1044 hist2DzoomLM->Draw(
"colz");
1048 hist2DzoomCO->Draw(
"colz");
1050 TGraph* geyes =
new TGraph(eyesX.size(), &eyesX.front(), &eyesY.front());
1051 geyes->SetMarkerStyle(20);
1052 geyes->SetMarkerSize(1.5);
1077 histCore2D->Write();
1078 hist2Demit->Write();
1079 histObs2Demit->Write();
1080 histCore2Demit->Write();
1081 hist2DzoomLL->Write();
1082 hist2DzoomLA->Write();
1083 hist2DzoomLM->Write();
1084 hist2DzoomCO->Write();
1086 histCosEmission->Write();
1089 histTimeArrival->Write();
1090 histTimeCher->Write();
1098 map<int,double>::const_iterator iDT = tel_time_bin_width.begin();
1099 map<int,map<int,double>>::const_iterator iPh = tel_time_bin_trace.begin();
1100 map<int,fevt::TelescopeSimData*>::const_iterator iTS = tel_sim.begin();
1102 for (; iDT!=tel_time_bin_width.end(); ++iDT, ++iPh, ++iTS) {
1105 const int CkovBin = WLengthCkov.size()/2;
1110 ERROR(
"ERROR too! RUDEBUG ");
1114 const int firstBin = (iPh->second).begin()->first;
1115 const int nBins = (iPh->second).rbegin()->first - firstBin + 1;
1119 for (map<int,double>::const_iterator iBin=iPh->second.begin(); iBin!=iPh->second.end(); ++iBin) {
1121 if (iBin->first >= 0 && iBin->first < nBins-1)
1122 cherDirectTrace[iBin->first] = iBin->second;
AxialVector cross(const Vector &l, const Vector &r)
vector cross product
Branch GetTopBranch() const
double GetModelRelativeEfficiency(const double wl) const
unsigned int GetId() const
utl::CoordinateSystemPtr GetLocalCoordinateSystem() const
Get the Auger coordinate system associated to the shower core position.
Iterator to retrieve particles from utl::VShowerParticlList.
unsigned int GetNPoints() const
Top of the interface to Atmosphere information.
bool HasLaserData() const
Check initialization of the LaserData.
const utl::TimeStamp & GetTimeStamp() const
Get the TimeStamp of the absolute shower core-time.
atm::AttenuationResult EvaluateMieAttenuation(const utl::Point &xInit, const utl::Point &xFinal, const std::vector< double > &wLength) const
double GetFieldOfView() const
bool HasPhotonTrace(const fevt::FdConstants::LightSource source, const int wl) const
Check that light trace for source /par source is present for the given wavelength bin...
Base class for all exceptions used in the auger offline code.
const std::vector< double > & GetWavelengths(const EmissionMode mode=eFluorescence) const
Fluorescence Detector Eye Event.
const utl::TabulatedFunctionErrors & GetTransmissionFactor() const
Transmission factor.
const evt::VGaisserHillasParameter & GetGHParameters() const
Get the Gaisser-Hillas parameters of the shower.
virtual std::string do_grouping() const
utl::ShowerParticleIterator GroundCherenkovEnd(const utl::AttributeMap &am) const
ArrayIterator XEnd()
end of array of X
Class to hold collection (x,y) points and provide interpolation between them.
bool HasCherenkovPhotons(const int wavelength) const
bool HasSimShower() const
std::map< std::string, std::string > AttributeMap
EyeIterator EyesEnd(const ComponentSelector::Status status)
const utl::TabulatedFunction & GetFluorescencePhotons(const int wavelength) const
Get the fluorescence photons generated along the shower axis.
double GetBinning() const
size of one slot
double GetDiaphragmRadius() const
bool HasFluorescencePhotons(const int wavelength) const
const utl::TabulatedFunction & GetCherenkovBeamPhotons(const int wavelength) const
Get the beam of Cherenkov beam photons along the shower axis.
utl::Vector GetAxis() const
#define INFO(message)
Macro for logging informational messages.
void AddPhoton(const utl::Photon &p)
void Init()
Initialise the registry.
bool HasCherenkovBeamPhotons(const int wavelength) const
const Eye & GetEye(const unsigned int eyeId) const
Find eye by numerical Id.
boost::filter_iterator< ComponentSelector, AllEyeIterator > EyeIterator
selective Eye iterators
utl::TimeStamp GetPhotonsStartTime() const
Start Time of the photons trace.
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
utl::CoordinateSystemPtr GetSiteCoordinateSystem() const
Get the coordinate system for the site.
double pow(const double x, const unsigned int i)
const Camera & GetCamera() const
Get the Camera object that belongs to the telescope.
Detector description interface for FDetector-related data.
double Y(const double x) const
Get the Y value (coordinate) for given X (ordinate)
A TimeStamp holds GPS second and nanosecond for some event.
Exception for reporting variable out of valid range.
Class holding the output of the ScatteringResult function.
Interface class to access Shower Simulated parameters.
const atm::Atmosphere & GetAtmosphere() const
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
const utl::TabulatedFunction & GetCherenkovPhotons(const int wavelength) const
Get the Cherenkov photon production along the shower axis.
fevt::TelescopeSimData & GetSimData()
Description of simulated data for one Telescope.
Class representing a document branch.
bool HasGroundCherenkov(const utl::AttributeMap &am) const
utl::CoordinateSystemPtr GetTelescopeCoordinateSystem() const
void MakePhotonTrace(const fevt::FdConstants::LightSource source, const int wl, const unsigned int size=0, const double binSize=0)
Reference ellipsoids for UTM transformations.
const utl::Vector & GetDirection() const
Get the direction of the shower axis. This is the true direction of shower movement.
LightSource
Possible light sources.
double GetX(const CoordinateSystemPtr &coordinateSystem) const
utl::CoordinateSystemPtr GetEyeCoordinateSystem() const
Returns the Eye Coordinate system.
Class describing the Atmospheric profile.
TelescopeIterator TelescopesEnd()
first available tel of status eHasData (DEPRECATED)
atm::AttenuationResult EvaluateRayleighAttenuation(const utl::Point &xInit, const utl::Point &xFinal, const std::vector< double > &wLength) const
Compute Rayleigh attenuation between points.
Top of the hierarchy of the detector description interface.
EyeIterator EyesBegin(const ComponentSelector::Status status)
Triple PointToLatitudeLongitudeHeight(const Point &thePoint) const
Convert Point to Lat/Long/Height.
utl::TraceD & GetPhotonTrace(const fevt::FdConstants::LightSource source, const int wl)
Photon trace at diaphragm.
const atm::ProfileResult & EvaluateDepthVsHeight() const
Tabulated function giving Y=depth as a function of X=height.
const fdet::FDetector & GetFDetector() const
atm::ScatteringResult EvaluateRayleighScattering(const utl::Point &xA, const utl::Point &xB, const double angle, const double distance, const std::vector< double > &xLength) const
boost::filter_iterator< ComponentSelector, AllTelescopeIterator > TelescopeIterator
selective Telescope iterators
#define WARNING(message)
Macro for logging warning messages.
void GetData(bool &b) const
Overloads of the GetData member template function.
Top of Fluorescence Detector event hierarchy.
bool HasDistanceTrace() const
Check that trace for the distance along the shower axis is present.
TelescopeIterator TelescopesBegin()
first available tel of status eHasData (DEPRECATED)
double GetInterval() const
Get the time interval as a double (in Auger base units)
const utl::TabulatedFunctionErrors & GetScatteringFactor() const
Scattering factor.
double GetY(const CoordinateSystemPtr &coordinateSystem) const
constexpr double kSpeedOfLight
Detector description interface for Telescope-related data.
A TimeInterval is used to represent time elapsed between two events.
double MinX() const
Return the minimum value for X (ordinate) stored in the profile.
ResultFlag
Flag returned by module methods to the RunController.
const Telescope & GetTelescope(const fevt::Telescope &eventTel) const
Get fdet::Telescope from fevt::Telescope.
double GetDiaphragmArea() const
double ShowerAge(const double slantDepth, const double showerMax)
General definition of shower age.
ArrayIterator XBegin()
begin of array of X
virtual char do_thousands_sep() const
bool HasGHParameters() const
Check initialization of the Gaisser-Hillas parameters.
utl::Point GetPosition() const
execption handling for calculation/access for inclined atmosphere model
double EvaluateDirectCherenkovProbability(const utl::Point &xA, const utl::Point &xB, const utl::Point &xEye, const double showerAge) const
double CosAngle(const Vector &l, const Vector &r)
Fluorescence Detector Telescope Event.
double Y(const double x) const
Get or interpolate the Y value that corresponds to parameter x.
void SetTime(const utl::TimeInterval &t)
const atm::ProfileResult & EvaluateSlantDepthVsDistance() const
#define ERROR(message)
Macro for logging error messages.
ComponentSelector::Status GetStatus() const
utl::ShowerParticleIterator GroundCherenkovBegin(const utl::AttributeMap &am) const
bool HasLongitudinalProfile(const ProfileType type=eCharged) const
Check initialization of the longitudinal profile.
utl::CoordinateSystemPtr GetShowerCoordinateSystem() const
Class describing the Atmospheric attenuation.
double MaxX() const
Return the maximum value for X (ordinate) stored in the profile.
utl::TraceD & GetDistanceTrace()
Trace for the distance along the shower axis of the light at the diaphragm.
atm::ScatteringResult EvaluateMieScattering(const utl::Point &xA, const utl::Point &xB, const double angle, const double distance, const std::vector< double > &xLength) const