GeoMagnetic.h
1 #ifndef GEOMAGNETIC_H
2 #define GEOMAGNETIC_H
3 
4 #include <vector>
5 #include "TArrow.h"
6 #include "TVector3.h"
7 #include "UsefulAdu5Pat.h"
8 
16 class TCanvas;
17 namespace GeoMagnetic{
18 
19 
20  //I want these in the GeoMagnetic namespace so I can just call them
21  // I read xMax for a 1e19 eV proton off a plot in an Auger paper
22  const double xMaxP19 = 0.8e4; // kg / m^{2}
23  // The minimum for ANITA, an 1e18 Fe, would be more like:
24  const double xMaxFe18 = 0.65e4; // kg / m^{2}
25 
26 
27 
35 class FieldPoint : public TArrow {
36  public:
37  FieldPoint (UInt_t unixTime, double lon, double lat, double alt);
38  FieldPoint (UInt_t unixTime, const TVector3& position);
39  virtual ~FieldPoint(){}
40  virtual void Draw(Option_t* opt = "");
41 
42  double posX() const {return fPosition.X();}
43  double posY() const {return fPosition.Y();}
44  double posZ() const {return fPosition.Z();}
45  double posR() const {return fPosition.Mag();}
46  double posTheta() const {return fPosition.Theta();}
47  double posPhi() const {return fPosition.Phi();}
48 
49  double componentX() const {return fField.X();}
50  double componentY() const {return fField.Y();}
51  double componentZ() const {return fField.Z();}
52 
53  const TVector3& field(){return fField;}
54  const TVector3& position(){return fPosition;}
55  UInt_t getUnixTime(){return fUnixTime;}
56 
57  // TODO, maybe for checking
58  // double componentRHat() const;
59  // double componentThetaHat() const;
60  // double componentPhiHat() const;
61 
62  private:
63  void calculateFieldAtPosition();
64  double fDrawScaleFactor;
65  TVector3 fField;
66  TVector3 fPosition;
67  UInt_t fUnixTime;
68 };
69 
70 
71  double getExpectedPolarisation(UsefulAdu5Pat& usefulPat, double phiWave, double thetaWave, double xmax=xMaxP19);
72  double getExpectedPolarisationUpgoing(UsefulAdu5Pat& usefulPat, double phiWave, double thetaWave, double pathLength);
73 
74  TVector3 getUnitVectorAlongThetaWavePhiWave(UsefulAdu5Pat& usefulPat, double phiWave, double thetaWave);
75 
76  const double n_air = 1;
77  const double n_ice = 1.31; // might need to check this
78 
79 
80  TVector3 specularReflection(const TVector3& reflectionPointToSource, const TVector3& surfaceNormal);
81  TVector3 fresnelReflection(const TVector3& sourceToReflection, const TVector3& surfaceNormal, TVector3& electricFieldVec, double n1=n_air, double n2=n_ice);
82  TCanvas* plotFresnelReflection();
83 
84  double g(UInt_t unixTime, int n, int m);
85  double h(UInt_t unixTime, int n, int m);
86 
87  double getPotentialAtSpherical(UInt_t unixTime, double r, double theta, double phi);
88  double getPotentialAtLonLatAlt(UInt_t unixTime, double lon, double lat, double alt);
89 
90  double X_atLonLatAlt(UInt_t unixTime, double lon, double lat, double alt);
91  double X_atSpherical(UInt_t unixTime, double r, double theta, double phi);
92 
93  double Y_atLonLatAlt(UInt_t unixTime, double lon, double lat, double alt);
94  double Y_atSpherical(UInt_t unixTime, double r, double theta, double phi);
95 
96  double Z_atLonLatAlt(UInt_t unixTime, double lon, double lat, double alt);
97  double Z_atSpherical(UInt_t unixTime, double r, double theta, double phi);
98 
99  TCanvas* plotFieldAtAltitude(UInt_t unixTime, double altitude);
100  TCanvas* plotAtmosphere();
101 
102  double getAtmosphericDensity(double altitude);
103  TVector3 getXMaxPosition(const TVector3& initialPosition, const TVector3& cosmicRayDirection, double xMax);
104  TVector3 getInitialPosition(const TVector3& destination, const TVector3& destinationToSource);
105  void setDebug(bool db);
106 
107 
108 }
109 #endif
FieldPoint(UInt_t unixTime, double lon, double lat, double alt)
As UsefulAnitaEvent is to RawAnitaEvent, UsefulAdu5Pat is to Adu5Pat. Well not quite as useful but yo...
Definition: UsefulAdu5Pat.h:39
virtual void Draw(Option_t *opt="")