Framework/Atmosphere/Atmosphere.cc
Go to the documentation of this file.
1 
9 #include <atm/Atmosphere.h>
10 
11 #include <atm/VRayleighModel.h>
12 #include <atm/VProfileModel.h>
13 #include <atm/VMieModel.h>
14 #include <atm/VFluorescenceModel.h>
15 #include <atm/VCherenkovModel.h>
16 #include <atm/VCloudModel.h>
17 
18 #include <atm/ScatteringResult.h>
19 #include <atm/AttenuationResult.h>
20 #include <atm/ProfileResult.h>
21 #include <atm/CloudResult.h>
22 #include <atm/InclinedAtmosphericProfile.h>
23 
24 #include <atm/ModelRegister.h>
25 
26 #include <det/Detector.h>
27 #include <fdet/Pixel.h>
28 #include <fdet/Telescope.h>
29 
30 #include <fevt/Pixel.h>
31 
32 #include <fwk/CentralConfig.h>
33 
34 #include <utl/Reader.h>
35 #include <utl/ErrorLogger.h>
36 
37 #include <atm/AerosolDB.h>
38 #include <atm/MolecularDB.h>
39 #include <atm/OverallQualityDB.h>
40 #include <atm/LidarDB.h>
41 #include <atm/GOESDB.h>
42 
43 using namespace std;
44 using namespace atm;
45 using namespace det;
46 using namespace fwk;
47 using namespace utl;
48 
49 
50 namespace atm {
51 
52  template<class Factory>
53  typename Factory::ObjectPtrType
54  CreateAndInit(const Branch& topB, const string& modelType)
55  {
56  typename Factory::ObjectPtrType model = nullptr;
57  const Branch branch = topB.GetChild(modelType);
58  if (!branch) {
59  ostringstream msg;
60  msg << "Could not find branch " << modelType << ". "
61  "This model will not be available";
62  WARNING(msg);
63  } else {
64  const auto modelName = branch.Get<string>();
65  model = Factory::Create(modelName);
66  if (model) {
67  model->Init();
68  } else {
69  ostringstream msg;
70  msg << "Failed loading model " << modelName << ". "
71  "Available models are: ";
72  for (typename Factory::Iterator it = Factory::Begin();
73  it != Factory::End(); ++it) {
74  msg << it->first << ", ";
75  }
76  WARNING(msg);
77  }
78  }
79  return model;
80  }
81 
82 
84  Atmosphere::EvaluateRayleighAttenuation(const Point& xInit,
85  const Point& xFinal,
86  const vector<double>& wLength)
87  const
88  {
89  if (!HasModel(fRayleighModel))
91 
92  if (!fRayleighModel->HasData())
93  throw NoDataForModelException("Rayleigh model could not locate data");
94 
95  return fRayleighModel->EvaluateRayleighAttenuation(xInit, xFinal, wLength);
96  }
97 
98 
99  double
100  Atmosphere::EvaluateRayleighAttenuation(const Point& xInit,
101  const Point& xFinal,
102  const double wLength)
103  const
104  {
105  if (!HasModel(fRayleighModel))
107 
108  if (!fRayleighModel->HasData())
109  throw NoDataForModelException("Rayleigh model could not locate data");
110 
111  return fRayleighModel->EvaluateRayleighAttenuation(xInit, xFinal, wLength);
112  }
113 
114 
116  Atmosphere::EvaluateMieAttenuation(const Point& xInit,
117  const Point& xFinal,
118  const vector<double>& wLength)
119  const
120  {
121  if (!HasModel(fMieModel))
123 
124  if (!fMieModel->HasData())
125  throw NoDataForModelException("Mie model could not locate data.");
126 
127  return fMieModel->EvaluateMieAttenuation(xInit, xFinal, wLength);
128  }
129 
130 
131  double
132  Atmosphere::EvaluateMieAttenuation(const Point& xInit,
133  const Point& xFinal,
134  const double wLength)
135  const
136  {
137  if (!HasModel(fMieModel))
139 
140  if (!fMieModel->HasData())
141  throw NoDataForModelException("Mie model could not locate data.");
142 
143  return fMieModel->EvaluateMieAttenuation(xInit, xFinal, wLength);
144  }
145 
146 
147  double
148  Atmosphere::GetMieAttenuationLength(const Point& xA,
149  const double wLength)
150  const
151  {
152  if (!HasModel(fMieModel))
154 
155  if (!fMieModel->HasData())
156  throw NoDataForModelException("Mie model could not locate data.");
157 
158  return fMieModel->GetAttenuationLength(xA, wLength);
159  }
160 
161 
162  double
163  Atmosphere::GetVerticalAerosolOpticalDepth(const unsigned int eyeId,
164  const double altitude)
165  const
166  {
167  if (!HasModel(fMieModel))
169 
170  if (!fMieModel->HasData())
171  throw NoDataForModelException("Mie model could not locate data.");
172 
173  return fMieModel->GetVerticalAerosolOpticalDepth(eyeId, altitude);
174  }
175 
176 
178  Atmosphere::EvaluateCloudCoverage(const fdet::Pixel& pixel,
179  const Point& x)
180  const
181  {
182  if (!HasModel(fCloudModel))
184 
185  if (!fCloudModel->HasData())
186  throw NoDataForModelException("Cloud model could not locate data.");
187 
188  return fCloudModel->EvaluateCloudCoverage(pixel, x);
189  }
190 
191 
193  Atmosphere::EvaluateCloudCoverage(const fevt::Pixel& pixel,
194  const Point& x)
195  const
196  {
197  if (!HasModel(fCloudModel))
199 
200  if (!fCloudModel->HasData())
201  throw NoDataForModelException("Cloud model could not locate data.");
202 
203  return fCloudModel->EvaluateCloudCoverage(pixel, x);
204  }
205 
206 
208  Atmosphere::EvaluateCloudCoverage(const unsigned int eyeId,
209  const unsigned int telId,
210  const unsigned int pixId,
211  const Point& x)
212  const
213  {
214  if (!HasModel(fCloudModel))
216 
217  if (!fCloudModel->HasData())
218  throw NoDataForModelException("Cloud model could not locate data.");
219 
220  return fCloudModel->EvaluateCloudCoverage(eyeId, telId, pixId, x);
221  }
222 
223 
224  const ProfileResult&
225  Atmosphere::EvaluateDepthVsHeight()
226  const
227  {
228  if (!HasModel(fProfileModel))
230 
231  if (!fProfileModel->HasData())
232  throw NoDataForModelException("Profile model could not locate data");
233 
234  return fProfileModel->EvaluateDepthVsHeight();
235  }
236 
237 
238  const ProfileResult&
239  Atmosphere::EvaluateHeightVsDepth()
240  const
241  {
242  if (!HasModel(fProfileModel))
244 
245  if (!fProfileModel->HasData())
246  throw NoDataForModelException("Profile model could not locate data");
247 
248  return fProfileModel->EvaluateHeightVsDepth();
249  }
250 
251 
252  const ProfileResult&
253  Atmosphere::EvaluatePressureVsHeight()
254  const
255  {
256  if (!HasModel(fProfileModel))
258 
259  if (!fProfileModel->HasData())
260  throw NoDataForModelException("Profile model could not locate data");
261 
262  return fProfileModel->EvaluatePressureVsHeight();
263  }
264 
265 
266  const ProfileResult&
267  Atmosphere::EvaluateTemperatureVsHeight()
268  const
269  {
270  if (!HasModel(fProfileModel))
272 
273  if (!fProfileModel->HasData())
274  throw NoDataForModelException("Profile model could not locate data");
275 
276  return fProfileModel->EvaluateTemperatureVsHeight();
277  }
278 
279 
280  const ProfileResult&
281  Atmosphere::EvaluateVaporPressureVsHeight()
282  const
283  {
284  if (!HasModel(fProfileModel))
286 
287  if (!fProfileModel->HasData())
288  throw NoDataForModelException("Profile model could not locate data");
289 
290  return fProfileModel->EvaluateVaporPressureVsHeight();
291  }
292 
293 
294  const ProfileResult&
295  Atmosphere::EvaluateDensityVsHeight()
296  const
297  {
298  if (!HasModel(fProfileModel))
300 
301  if (!fProfileModel->HasData())
302  throw NoDataForModelException("Profile model could not locate data");
303 
304  return fProfileModel->EvaluateDensityVsHeight();
305  }
306 
307 
308  const ProfileResult&
309  Atmosphere::EvaluateRefractionIndexVsHeight()
310  const
311  {
312  if (!HasModel(fProfileModel))
314 
315  if (!fProfileModel->HasData())
316  throw NoDataForModelException("Profile model could not locate data");
317 
318  return fProfileModel->EvaluateRefractionIndexVsHeight();
319  }
320 
321 
322  const ProfileResult&
323  Atmosphere::EvaluateRefractionIndexVsHeight(const double wavelength)
324  const
325  {
326  if (!HasModel(fProfileModel))
328 
329  if (!fProfileModel->HasData())
330  throw NoDataForModelException("Profile model could not locate data");
331 
332  return fProfileModel->EvaluateRefractionIndexVsHeight(wavelength);
333  }
334 
335 
336  void
337  Atmosphere::InitSlantProfileModel(const Point& core,
338  const Vector& dir,
339  const double deltaX)
340  const
341  {
342  delete fInclinedProfileModel;
343  try {
344  fInclinedProfileModel = new InclinedAtmosphericProfile(core, dir, deltaX);
345  } catch (...) {
346  fInclinedProfileModel = nullptr;
347  throw;
348  }
349  }
350 
351 
352  double
353  Atmosphere::IntegratedGrammage(const Point& pStart,
354  const Point& pStop,
355  const double delta)
356  const
357  {
358  return InclinedAtmosphericProfile::IntegratedGrammage(pStart, pStop, delta);
359  }
360 
361 
362  const ProfileResult&
363  Atmosphere::EvaluateSlantDepthVsDistance()
364  const
365  {
366  if (!fInclinedProfileModel)
367  throw InclinedAtmosphericProfile::InclinedAtmosphereModelException("First initialize the inclined atmosphere model!");
368 
369  return fInclinedProfileModel->EvaluateSlantDepthVsDistance();
370  }
371 
372 
373  const ProfileResult&
374  Atmosphere::EvaluateDistanceVsSlantDepth()
375  const
376  {
377  if (!fInclinedProfileModel)
378  throw InclinedAtmosphericProfile::InclinedAtmosphereModelException("First initialize the inclined atmosphere model!");
379 
380  return fInclinedProfileModel->EvaluateDistanceVsSlantDepth();
381  }
382 
383 
384  const ProfileResult&
385  Atmosphere::EvaluateHeightVsSlantDepth()
386  const
387  {
388  if (!fInclinedProfileModel)
389  throw InclinedAtmosphericProfile::InclinedAtmosphereModelException("First initialize the inclined atmosphere model!");
390 
391  return fInclinedProfileModel->EvaluateHeightVsSlantDepth();
392  }
393 
394 
395  const ProfileResult&
396  Atmosphere::EvaluateHeightVsDistance()
397  const
398  {
399  if (!fInclinedProfileModel)
400  throw InclinedAtmosphericProfile::InclinedAtmosphereModelException("First initialize the inclined atmosphere model!");
401 
402  return fInclinedProfileModel->EvaluateHeightVsDistance();
403  }
404 
405 
407  Atmosphere::EvaluateRayleighScattering(const Point& x1,
408  const Point& x2,
409  const double angle,
410  const double distance,
411  const vector<double>& wLength)
412  const
413  {
414  if (!HasModel(fRayleighModel))
416 
417  if (!fRayleighModel->HasData())
418  throw NoDataForModelException("Rayleigh model could not locate data");
419 
420  return fRayleighModel->EvaluateRayleighScattering(x1, x2, angle, distance, wLength);
421  }
422 
423 
425  Atmosphere::EvaluateRayleighScattering(const Point& x1,
426  const Point& x2,
427  const double angle,
428  const double distance,
429  const AttenuationResult& rayleighAttenuation)
430  const
431  {
432  if (!HasModel(fRayleighModel))
434 
435  if (!fRayleighModel->HasData())
436  throw NoDataForModelException("Rayleigh model could not locate data");
437 
438  return fRayleighModel->EvaluateRayleighScattering(x1, x2, angle, distance, rayleighAttenuation);
439  }
440 
441 
442  double
443  Atmosphere::EvaluateRayleighScattering(const Point& x1,
444  const Point& x2,
445  const double angle,
446  const double distance,
447  const double wLength)
448  const
449  {
450  if (!HasModel(fRayleighModel))
452 
453  if (!fRayleighModel->HasData())
454  throw NoDataForModelException("Rayleigh model could not locate data");
455 
456  return fRayleighModel->EvaluateRayleighScattering(x1, x2, angle, distance, wLength);
457  }
458 
459 
460  double
461  Atmosphere::EvaluateRayleighScattering(const Point& x1,
462  const Point& x2,
463  const double angle,
464  const double distance,
465  const double wLength,
466  const double rayleighAttenuation)
467  const
468  {
469  if (!HasModel(fRayleighModel))
471 
472  if (!fRayleighModel->HasData())
473  throw NoDataForModelException("Rayleigh model could not locate data");
474 
475  return fRayleighModel->EvaluateRayleighScattering(x1, x2, angle, distance, wLength, rayleighAttenuation);
476  }
477 
478 
479  double
480  Atmosphere::GetRayleighAttenuationLength(const Point& xA,
481  const double wLength)
482  const
483  {
484  if (!HasModel(fRayleighModel))
486 
487  if (!fRayleighModel->HasData())
488  throw NoDataForModelException("Rayleigh model could not locate data");
489 
490  return fRayleighModel->GetAttenuationLength(xA, wLength);
491  }
492 
493 
495  Atmosphere::EvaluateMieScattering(const Point& x1,
496  const Point& x2,
497  const double angle,
498  const double distance,
499  const vector<double>& wLength)
500  const
501  {
502  if (!HasModel(fMieModel))
504 
505  if (!fMieModel->HasData())
506  throw NoDataForModelException("Mie model could not locate data.");
507 
508  return fMieModel->EvaluateMieScattering(x1, x2, angle, distance, wLength);
509  }
510 
511 
512  double
513  Atmosphere::EvaluateMieScattering(const Point& x1,
514  const Point& x2,
515  const double angle,
516  const double distance,
517  const double wLength)
518  const
519  {
520  if (!HasModel(fMieModel))
522 
523  if (!fMieModel->HasData())
524  throw NoDataForModelException("Mie model could not locate data.");
525 
526  return fMieModel->EvaluateMieScattering(x1, x2, angle, distance, wLength);
527  }
528 
529 
531  Atmosphere::EvaluateMieScattering(const Point& x1,
532  const Point& x2,
533  const double angle,
534  const double distance,
535  const AttenuationResult& mieAttenuation)
536  const
537  {
538  if (!HasModel(fMieModel))
540 
541  if (!fMieModel->HasData())
542  throw NoDataForModelException("Mie model could not locate data.");
543 
544  return fMieModel->EvaluateMieScattering(x1, x2, angle, distance, mieAttenuation);
545  }
546 
547 
548  double
549  Atmosphere::EvaluateMieScattering(const Point& x1,
550  const Point& x2,
551  const double angle,
552  const double distance,
553  const double wLength,
554  const double mieAttenuation)
555  const
556  {
557  if (!HasModel(fMieModel))
559 
560  if (!fMieModel->HasData())
561  throw NoDataForModelException("Mie model could not locate data.");
562 
563  return fMieModel->EvaluateMieScattering(x1, x2, angle, distance, wLength, mieAttenuation);
564  }
565 
566 
567  const TabulatedFunction&
568  Atmosphere::EvaluateFluorescenceYield(const double heightAboveSeaLevel)
569  const
570  {
571  if (!HasModel(fFluorescenceModel))
573 
574  return fFluorescenceModel->EvaluateFluorescenceYield(heightAboveSeaLevel);
575  }
576 
577 
578  const vector<double>&
579  Atmosphere::GetWavelengths(const EmissionMode mode)
580  const
581  {
582  switch (mode) {
583  case eFluorescence:
584  if (!HasModel(fFluorescenceModel))
586  return fFluorescenceModel->GetWavelengths();
587  case eCerenkov:
588  if (!HasModel(fCherenkovModel))
590  return fCherenkovModel->GetWavelengths();
591  default:
592  throw NonExistentComponentException("Asked for not-implemeted EmissionMode");
593  }
594  }
595 
596 
597  double
598  Atmosphere::GetdEdX0()
599  const
600  {
601  if (!HasModel(fFluorescenceModel))
603 
604  return fFluorescenceModel->GetdEdX0();
605  }
606 
607 
608  double
609  Atmosphere::GetDeExcitationTime(const double height)
610  const
611  {
612  if (!HasModel(fFluorescenceModel))
614 
615  return fFluorescenceModel->GetDeExcitationTime(height);
616  }
617 
618 
619  double
620  Atmosphere::GetVerticalTimeOfFlight(const double height1,
621  const double height2)
622  const
623  {
624  if (!HasModel(fProfileModel))
626 
627  if (!fProfileModel->HasData())
628  throw NoDataForModelException("Profile model could not locate data");
629 
630  return fProfileModel->GetVerticalTimeOfFlight(height1, height2);
631  }
632 
633 
634  void
635  Atmosphere::SetCherenkovEnergyCutoff(const double eCut)
636  const
637  {
638  if (!HasModel(fCherenkovModel))
640 
641  return fCherenkovModel->SetEnergyCutoff(eCut);
642  }
643 
644 
645  const TabulatedFunction&
646  Atmosphere::EvaluateCherenkovPhotons(const Point& xA,
647  const Point& xB,
648  const double meanShowerAge)
649  const
650  {
651  if (!HasModel(fCherenkovModel))
653 
654  return fCherenkovModel->EvaluateCherenkovPhotons(xA, xB,
655  meanShowerAge);
656  }
657 
658 
659  const TabulatedFunction&
660  Atmosphere::EvaluateCherenkovDirect(const Point& xA,
661  const Point& xB,
662  const Point& xEye,
663  const double meanShowerAge)
664  const
665  {
666  if (!HasModel(fCherenkovModel))
668 
669  return fCherenkovModel->EvaluateCherenkovDirect(xA, xB, xEye,
670  meanShowerAge);
671  }
672 
673 
674  double
675  Atmosphere::EvaluateDirectCherenkovProbability(const Point& xA,
676  const Point& xB,
677  const Point& xEye,
678  const double meanShowerAge)
679  const
680  {
681  if (!HasModel(fCherenkovModel))
683 
684  return fCherenkovModel->EvaluateDirectCherenkovProbability(xA, xB, xEye,
685  meanShowerAge);
686  }
687 
688  double
689  Atmosphere::EvaluateDirectCherenkovProbability(const Point& xA,
690  const Point& xB,
691  const Point& xEye,
692  const double meanShowerAge,
693  const double wavelength)
694  const
695  {
696  if (!HasModel(fCherenkovModel))
698 
699  return fCherenkovModel->EvaluateDirectCherenkovProbability(xA, xB, xEye,
700  meanShowerAge, wavelength);
701  }
702 
703  const AerosolDB&
704  Atmosphere::GetAerosolDB()
705  const
706  {
707  if (!fAerosolDB)
708  fAerosolDB = new AerosolDB;
709  return *fAerosolDB;
710  }
711 
712 
713  const OverallQualityDB&
714  Atmosphere::GetOverallQualityDB()
715  const
716  {
717  if (!fOverallQualityDB)
718  fOverallQualityDB = new OverallQualityDB;
719  return *fOverallQualityDB;
720  }
721 
722 
723  const LidarDB&
724  Atmosphere::GetLidarDB()
725  const
726  {
727  if (!fLidarDB)
728  fLidarDB = new LidarDB;
729  return *fLidarDB;
730  }
731 
732  const GOESDB&
733  Atmosphere::GetGOESDB()
734  const
735  {
736  if (!fGOESDB)
737  fGOESDB = new GOESDB;
738  return *fGOESDB;
739  }
740 
741 
742  const MolecularDB&
743  Atmosphere::GetMolecularDB(const MolecularIds::ProfileId& id)
744  const
745  {
746  // Check if requested MolecularDB is in the map. If not, create it
747  // and put it in the map. This creation could be done in
748  // the VAtmosphere constructor instead.
749 
750  MolecularDBMap::iterator it = fMolecularDBMap.find(id);
751  if (it != fMolecularDBMap.end())
752  return *it->second;
753  else {
754  MolecularDB* const m = new MolecularDB(id);
755  fMolecularDBMap.insert(make_pair(id, m));
756  return *m;
757  }
758  }
759 
760 
761  bool
762  Atmosphere::HasModel(VModel* const model)
763  {
764  if (!model) {
765  ERROR("Call to a not registered or not configured model");
766  return false;
767  }
768  return true;
769  }
770 
771 
772  void
774  {
775  Branch topB = CentralConfig::GetInstance()->GetTopBranch("Atmosphere");
776 
777  if (!topB) {
778  DEBUGLOG("Could not find branch Atmosphere; "
779  "Atmosphere will not be available");
780  return;
781  }
782 
783  delete fProfileModel;
784  fProfileModel = CreateAndInit<VProfileModelFactory>(topB, "ProfileModel");
785 
786  delete fRayleighModel;
787  fRayleighModel = CreateAndInit<VRayleighModelFactory>(topB, "RayleighModel");
788 
789  delete fMieModel;
790  fMieModel = CreateAndInit<VMieModelFactory>(topB, "MieModel");
791 
792  delete fFluorescenceModel;
793  fFluorescenceModel = CreateAndInit<VFluorescenceModelFactory>(topB, "FluorescenceModel");
794 
795  delete fCherenkovModel;
796  fCherenkovModel = CreateAndInit<VCherenkovModelFactory>(topB, "CherenkovModel");
797 
798  delete fCloudModel;
799  fCloudModel = CreateAndInit<VCloudModelFactory>(topB, "CloudModel");
800  }
801 
802 
803  void
804  Atmosphere::Clean()
805  {
806  delete fOverallQualityDB;
807  fOverallQualityDB = nullptr;
808 
809  delete fLidarDB;
810  fLidarDB = nullptr;
811 
812  delete fAerosolDB;
813  fAerosolDB = nullptr;
814 
815  for (MolecularDBMap::iterator it = fMolecularDBMap.begin();
816  it != fMolecularDBMap.end(); ++it)
817  delete it->second;
818 
819  fMolecularDBMap.clear();
820 
821  delete fInclinedProfileModel;
822  fInclinedProfileModel = nullptr;
823 
824  delete fGOESDB;
825  fGOESDB = nullptr;
826  }
827 
828 
829  void
830  Atmosphere::SetUncertaintyBound(const ModelWithUncertainty model,
831  const double nSigma)
832  const
833  {
834  switch (model) {
835  case eMie:
836  fMieModel->SetUncertaintyBound(nSigma);
837  break;
838  default:
839  ERROR(" SetUncertaintyBound not implemented ...");
840  }
841  }
842 
843 
844  double
845  Atmosphere::AngularCherenkovCDF(const double theta,
846  const double verticalDepth,
847  const double showerAge)
848  const
849  {
850  if (!HasModel(fCherenkovModel))
852 
853  return fCherenkovModel->AngularCDF(theta, verticalDepth, showerAge);
854  }
855 
856 
857  double
858  Atmosphere::AngularCherenkovPDF(const double theta,
859  const double verticalDepth,
860  const double showerAge)
861  const
862  {
863  if (!HasModel(fCherenkovModel))
865 
866  return fCherenkovModel->AngularPDF(theta, verticalDepth, showerAge);
867  }
868 
869 }
Branch GetTopBranch() const
Definition: Branch.cc:63
Point object.
Definition: Point.h:32
Detector description interface for GOES cloud data.
Definition: GOESDB.h:29
Class to hold collection (x,y) points and provide interpolation between them.
Detector description interface for data in the Atm_Molecular database.
Definition: MolecularDB.h:29
void Init()
Initialise the registry.
Base class for exceptions trying to access non-existing components.
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
Definition: Branch.cc:211
Exception to use in a atmosphere model cannot find data it needs.
Class holding the output of the ScatteringResult function.
T Get() const
Definition: Branch.h:271
Base class of atmospheric functions.
Definition: VModel.h:35
Class representing a document branch.
Definition: Branch.h:107
Class for loading and storing a collection of aerosol data.
Definition: AerosolDB.h:14
Fluorescence Detector Pixel event.
Definition: FEvent/Pixel.h:28
Class describing the Atmospheric profile.
Definition: ProfileResult.h:25
ProfileId
Monitoring profiles:
Definition: MolecularIds.h:8
#define DEBUGLOG(message)
Macro for logging debugging messages.
Definition: ErrorLogger.h:157
#define WARNING(message)
Macro for logging warning messages.
Definition: ErrorLogger.h:163
Provides translational services for inclined profile.
Store the obscuration of an FD pixel by a cloud in the field of view.
Definition: CloudResult.h:43
Detector description interface for LidarDB-realted data.
Definition: LidarDB.h:26
Description of a pixel.
execption handling for calculation/access for inclined atmosphere model
Vector object.
Definition: Vector.h:30
Access to database describing overall atmospheric quality.
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165
constexpr double m
Definition: AugerUnits.h:121
Class describing the Atmospheric attenuation.
Factory::ObjectPtrType CreateAndInit(const Branch &topB, const string &modelType)

, generated on Tue Sep 26 2023.