OscProb
OscProb::EarthModelBinned Class Reference

Implements an earth model with depth/latitude/longitude bins. More...

#include <EarthModelBinned.h>

Inheritance diagram for OscProb::EarthModelBinned:
OscProb::EarthModelBase

Classes

struct  LatBinInfo
 A struct holding information about upcoming latitude bin crossings along the neutrino's trajectory. More...
 
struct  LonBinInfo
 A struct holding information about upcoming longitude bin crossings along the neutrino's trajectory. More...
 

Public Member Functions

 EarthModelBinned (std::string filename="")
 Constructor. More...
 
virtual ~EarthModelBinned ()
 Destructor. More...
 
void SetDetPos (double rad, double lat=0, double lon=0)
 
int FillPath (double cosT, double phi=0)
 
virtual void LoadModel (std::string filename)
 Load an earth model from a file. More...
 
virtual std::vector< EarthBinGetEarthBins ()
 
virtual void SetRegionZoA (int index, double zoa)
 Set Z/A of all bins with specified region index. More...
 
virtual double GetRegionZoA (int index)
 Get Z/A of all bins with specified region index. More...
 
virtual void ScaleRegionDensity (int index, double scalingfactor)
 
virtual std::vector< NuPathGetNuPath ()
 
virtual std::vector< NuPathGetMergedPaths (double prec=0.25)
 Get merged path sequence in a vector. More...
 
virtual double GetTotalL (double cosT)
 Get the total baseline for a given cosTheta. More...
 
virtual double GetCosT (double L)
 Get the cosTheta for a given total baseline. More...
 
virtual void SetRemoveSmallPaths (bool rp=true)
 Set tag to remove small paths. More...
 

Protected Member Functions

virtual void ClearModel ()
 Clear the earth model information. More...
 
virtual void AddBin (double radius_out, double radius_in, double latitude, double longitude, double density, double zoa, double layer)
 Add a bin to the model (angles in degrees) More...
 
virtual void AddPath (double length, EarthBin bin)
 Add a path segment to the sequence. More...
 
virtual double DetDistForNextLatBin (int cur_index, LatBinInfo &L)
 
virtual double DetDistForNextLonBin (double prev_lon, LonBinInfo &L)
 
virtual void RecordLatLonBinCrossings (double detDist_nextDbin, double &DetDist, int &index, LatBinInfo &latI, LonBinInfo &lonI)
 
virtual int LonBinIndex (double longitude)
 Find lon bin index containing longitude. More...
 
 ClassDef (EarthModelBinned, 1)
 
virtual void SetDetectorCoordinates (double rad, double lat, double lon)
 
virtual void AddPathSegment (double length, double density, double zoa, int index)
 Add a path segment to the sequence. More...
 
 ClassDef (EarthModelBase, 1)
 

Protected Attributes

TrajConstants fC
 Useful constants for the trajectory. More...
 
std::vector< EarthBinfEarthBins
 The bins in the earth model. More...
 
int fnDepthBins
 Total number of depth bins. More...
 
int fnLonBins
 Total number of longitude bins. More...
 
int fnLatBins
 Total number of latitude bins. More...
 
double fInvLonBinWidth
 1/binwidth for each longitude bin More...
 
double fInvLatBinWidth
 1/binwidth for each latitude bin More...
 
double fHalfLonBinWidth
 Half-width of each longitude bin. More...
 
double fHalfLatBinWidth
 Half-width of each latitude bin. More...
 
int fmaxRegIndex
 Largest region index in model. More...
 
std::string fErrorMessage_LonInfo
 
int fLonError
 
std::vector< NuPathfNuPath
 The current neutrino path sequence. More...
 
double fRadiusMax
 Maximum radius in Earth model (in km) More...
 
double fDetRadius
 The radius where the detector sits (in km) More...
 
double fDetLat
 The latitude (in rad) where the detector sits. More...
 
double fDetLon
 The longitude (in rad) where the detector sits. More...
 
bool fRemoveSmallPaths
 Tag whether to merge small paths. More...
 

Detailed Description

This class implements a 3D (asymmetric) model of the earth using EarthBin's to store bins with different properties.

The class is then able to produce path sequences through the Earth as a function of the azimuthal angle and cosine of the zenith angle with respect to the detector.

The detector can be positioned at any point within the Earth, and the path sequences will take into account the fact that some layers are above the detector.

Using indices to specify various regions (which must have a constant Z/A value), the Z/A value for a region can be changed, and the density throughout the region can be scaled by a constant factor.

By default this implements the model stored in EarthTables/earth_binned_default.txt with the detector at the bottom of the ocean layer (radius = 6368 km) where the prime meridian intersects the equator.

This class inherits from EarthModelBase and can be saved in ROOT files.

Author
rpestes@apc.in2p3.fr

Definition at line 214 of file EarthModelBinned.h.

Constructor & Destructor Documentation

◆ EarthModelBinned()

EarthModelBinned::EarthModelBinned ( std::string  filename = "")

Constructor.

By default this implements the model stored in EarthTables/earth_binned_default.txt with the detector 6368 km from the center of the Earth, having a latitude of 0 deg N and a longitude of 0 deg E.

Parameters
filename- The txt file containing a table of earth layers

Definition at line 94 of file EarthModelBinned.cxx.

95{
96 SetDetPos(6368, 0, 0);
97 LoadModel(filename);
99 fLonError = 0;
100}
virtual void SetRemoveSmallPaths(bool rp=true)
Set tag to remove small paths.
virtual void LoadModel(std::string filename)
Load an earth model from a file.
void SetDetPos(double rad, double lat=0, double lon=0)

References fLonError, LoadModel(), SetDetPos(), and OscProb::EarthModelBase::SetRemoveSmallPaths().

◆ ~EarthModelBinned()

EarthModelBinned::~EarthModelBinned ( )
virtual

Nothing to clean.

Definition at line 106 of file EarthModelBinned.cxx.

106{}

Member Function Documentation

◆ AddBin()

void EarthModelBinned::AddBin ( double  radius_out,
double  radius_in,
double  latitude,
double  longitude,
double  density,
double  zoa,
double  index 
)
protectedvirtual

Add a bin to the earth model.

Parameters
radius_out- The outer depth of the bin in km
radius_in- The inner depth of the bin in km
latitude- The latitude of the bin center in degrees
longitude- The longitude of the bin center in degrees
density- The density of the matter in the bin in g/cm^3
zoa- The effective Z/A value of the matter in the bin
index- Region index

Definition at line 160 of file EarthModelBinned.cxx.

163{
164 fEarthBins.push_back(EarthBin(radius_out, radius_in, latitude, longitude,
165 density, zoa, index));
166}
std::vector< EarthBin > fEarthBins
The bins in the earth model.

References fEarthBins.

Referenced by LoadModel().

◆ AddPath()

void EarthModelBinned::AddPath ( double  length,
EarthBin  bin 
)
protectedvirtual

Add a path segment to the sequence.

For a given EarthBin, adds a path of a given length in that material

Parameters
length- The length of the path segment in km
bin- The bin we are crossing

Definition at line 406 of file EarthModelBinned.cxx.

407{
408 AddPathSegment(length, bin.density, bin.zoa, bin.index);
409}
virtual void AddPathSegment(double length, double density, double zoa, int index)
Add a path segment to the sequence.
double zoa
The effective Z/A value of the matter in the bin.
int index
Region index.
double density
The density of the matter in the bin in g/cm^3.

References OscProb::EarthModelBase::AddPathSegment(), OscProb::EarthBin::density, OscProb::EarthBin::index, and OscProb::EarthBin::zoa.

Referenced by FillPath(), and RecordLatLonBinCrossings().

◆ AddPathSegment()

void EarthModelBase::AddPathSegment ( double  length,
double  density,
double  zoa,
int  index 
)
protectedvirtualinherited

Add a path segment to the sequence.

For a given EarthBin, adds a path of a given length in that material

Parameters
length- The length of the path segment in km
density- The density along the path segment
zoa- Z/A along the path segment
index- Index for the matter along the path segment

Definition at line 65 of file EarthModelBase.cxx.

67{
68 fNuPath.push_back(NuPath(length, density, zoa, index));
69}
std::vector< NuPath > fNuPath
The current neutrino path sequence.
A struct representing a neutrino path segment.
Definition: NuPath.h:34

References OscProb::EarthModelBase::fNuPath.

Referenced by AddPath(), and OscProb::PremModel::AddPath().

◆ ClassDef() [1/2]

OscProb::EarthModelBase::ClassDef ( EarthModelBase  ,
 
)
protectedinherited

◆ ClassDef() [2/2]

OscProb::EarthModelBinned::ClassDef ( EarthModelBinned  ,
 
)
protected

◆ ClearModel()

void EarthModelBinned::ClearModel ( )
protectedvirtual

Clear the earth model information.

Definition at line 120 of file EarthModelBinned.cxx.

121{
122 fnDepthBins = 0;
123 fnLonBins = 0;
124 fnLatBins = 0;
125 fEarthBins.clear();
126}
int fnDepthBins
Total number of depth bins.
int fnLatBins
Total number of latitude bins.
int fnLonBins
Total number of longitude bins.

References fEarthBins, fnDepthBins, fnLatBins, and fnLonBins.

Referenced by LoadModel().

◆ DetDistForNextLatBin()

double EarthModelBinned::DetDistForNextLatBin ( int  cur_index,
LatBinInfo L 
)
protectedvirtual

Calculate the detector distance at the edge of the current lat bin along the neutrino's trajectory

Calculate the distance to the detector along a neutrino trajectory, specified by cosT and the azimuthal angle, at the edge of the current latitude bin in the direction specified by dir. Returns a negative value if the next latitude bin will not be reached before the neutrino reaches the detector. Flips L.sign and changes L.maxreached to true if the extreme latitude is within the cur_index Earth bin.

In an attempt to make this calculation more robust, this function turns the latitude bin iteration around when sin^2(lat) gets within 10^(-14) of its extreme limit.

Parameters
cur_index- Index of current Earth bin
L- Information for the lat bin crossings
Returns
Calculated detector distance

Definition at line 429 of file EarthModelBinned.cxx.

430{
431 // Find next lat bin boundary (bin center +/- 1/2-binwidth)
432 double NewLat = fEarthBins[cur_index].latitude + L.sign * L.dLat;
433 // Turn around if lat reaches +/- 90 degrees (or close enough)
434 if (abs(NewLat) - 0.5 * M_PI > -1.0e-14) {
435 if (L.maxreached) return -1; // Only turn around once
436 L.maxreached = true;
437// cout << "Max latitude reached..." << endl;
438 L.sign = -L.sign;
439 NewLat = fEarthBins[cur_index].latitude + L.sign * L.dLat;
440 if (abs(NewLat) - 0.5 * M_PI > -1.0e-14)
441 return -1; // This would happen if there's only one latitude bin...
442 }
443
444 // Calculate parts of answer
445 double sinNewLat = sin(NewLat);
446 double NsinSqNewLat = -sinNewLat * sinNewLat;
447 double radicand = fC.maxSinSqLat + NsinSqNewLat; //1-[sin(NewLat)]^2-[sin(phi)cos(DetLat)]^2
448 // Turn around if the radicand is 0 (close enough) or less
449 if (radicand < 1.0e-14) {
450 if (L.maxreached) return -1; // Only turn around once
451 L.maxreached = true;
452// cout << "Max latitude reached..." << endl;
453 L.sign = -L.sign;
454 NewLat = fEarthBins[cur_index].latitude + L.sign * L.dLat;
455 sinNewLat = sin(NewLat);
456 NsinSqNewLat = -sinNewLat * sinNewLat;
457 radicand = fC.maxSinSqLat + NsinSqNewLat;
458 if (radicand < 1.0e-14)
459 return -1; // The rest of the track is contained in this lat bin
460 }
461 double denominator = fC.gammaSq + NsinSqNewLat;
462
463 // Calculate distance from the detector at next lat bin boundary
464 double answer;
465 if (denominator == 0) {
466 answer =
468 //There is a "possible" case where answer would be 0:
469 // if the detector is at the center of the Earth... just don't...
470 }
471 else {
472 answer = -(fC.rDetCosT * NsinSqNewLat + fC.rDetGammaSinDetLat +
473 L.sign * fC.rDetSinT * sinNewLat * sqrt(radicand)) /
474 denominator;
475 }
476
477 // Check to see if going to the edge of the bin jumped to an invalid
478 // part of the function (cosA*rDetCosDetLat/beta = x at max lat)
479 if (L.maxreached && answer >= fC.xlatextreme) {
480 return -1; // The rest of the track is contained in this lat bin
481 }
482
483 return answer;
484}
TrajConstants fC
Useful constants for the trajectory.
double gammaSq
[sin(T)*cos(phi)*cos(DetLat)+cosT*sin(DetLat)]^2
double rDetSinT
rDet*sin(T)
double xlatextreme
rDet*cos(phi)*cos(DetLat)/[sin(T)*sin(DetLat)-cos(phi)*cosT*cos(DetLat)], unless the denominator is 0...
double rDetCosT
rDet*cosT
double rDetGammaSinDetLat
rDet*sin(DetLat)*[sin(T)*cos(phi)*cos(DetLat)+cosT*sin(DetLat)]
double gamma
sin(T)*cos(phi)*cos(DetLat)+cosT*sin(DetLat)
double maxSinSqLat
1 - [sin(phi)*cos(DetLat)]^2
double rDetSinDetLat
rDet*sin(DetLat)

References OscProb::EarthModelBinned::LatBinInfo::dLat, fC, fEarthBins, OscProb::TrajConstants::gamma, OscProb::TrajConstants::gammaSq, OscProb::EarthModelBinned::LatBinInfo::maxreached, OscProb::TrajConstants::maxSinSqLat, OscProb::TrajConstants::rDetCosT, OscProb::TrajConstants::rDetGammaSinDetLat, OscProb::TrajConstants::rDetSinDetLat, OscProb::TrajConstants::rDetSinT, OscProb::EarthModelBinned::LatBinInfo::sign, and OscProb::TrajConstants::xlatextreme.

Referenced by FillPath(), and RecordLatLonBinCrossings().

◆ DetDistForNextLonBin()

double EarthModelBinned::DetDistForNextLonBin ( double  prev_lon,
LonBinInfo L 
)
protectedvirtual

Calculate the detector distance at the edge of the current lon bin along the neutrino's trajectory and increment L.bin

Calculate the distance to the detector at the edge of the current longitude bin along a neutrino trajectory specified by cosT and the azimuthal angle, setting the index for the next longitude bin in the process. The maximum/minimum longitude are expressed around the 0-2pi boundary. So, if the track spans that boundary, the actual allowed range for lon is [min_lon,2pi)U[0,max_lon].

Parameters
prev_lon- Value at center of initial longitude bin
L- Information about longitude bin crossings
Returns
Calculated detector distance

Definition at line 499 of file EarthModelBinned.cxx.

500{
501 double twoPi = 2 * M_PI;
502 // Increment to next bin in direction dLon
503 double lon = prev_lon + L.dLon;
504 if (lon < 0 || lon >= twoPi) { lon -= floor(lon / twoPi) * twoPi; }
505 if (L.dLon > 0) {
506 L.nextBin = L.bin + 1;
507 if (L.nextBin >= fnLonBins) {
508 // cross from 2pi to 0
509 L.nextBin = 0;
510 }
511 }
512 else {
513 L.nextBin = L.bin - 1;
514 if (L.nextBin < 0) {
515 // cross from 0 to 2pi
516 L.nextBin = fnLonBins - 1;
517 }
518 }
519
520 // Check if lon is outside of range covered by neutrino's trajectory
521 if (L.max < L.min) {
522 if (0 > lon - L.min && L.max - lon < 0) return -1;
523 }
524 else {
525 if (0 > lon - L.min || L.max - lon < 0) return -1;
526 }
527
528 // Parts of the answer
529 double cosNewLon = cos(lon);
530 double sinNewLon = sin(lon);
531 double expression = fC.sinDetLon * cosNewLon - sinNewLon * fC.cosDetLon;
532 double denominator = fC.alpha * expression +
533 fC.sinTsinAcosDetLon * cosNewLon +
534 fC.sinTsinAsinDetLon * sinNewLon;
535
536 // Calculate & return detector distance
537 if (denominator == 0) { // Is there ever a case when this is true???
538 // Error message will be printed at the end of the FillPath function
539 L.err_message.assign("Longitude along neutrino trajectory = " +
540 std::to_string(lon));
541 L.error = -1;
542 return -1;
543 }
544 return fC.rDetCosDetLat * expression / denominator;
545}
double cosDetLon
cos(DetLon)
double alpha
sin(T)*cos(phi)*sin(DetLat)-cosT*cos(DetLat)
double sinDetLon
sin(DetLon)
double sinTsinAsinDetLon
sin(T)*sin(phi)*sin(DetLon)
double rDetCosDetLat
rDet*cos(DetLat)
double sinTsinAcosDetLon
sin(T)*sin(phi)*cos(DetLon)

References OscProb::TrajConstants::alpha, OscProb::EarthModelBinned::LonBinInfo::bin, OscProb::TrajConstants::cosDetLon, OscProb::EarthModelBinned::LonBinInfo::dLon, OscProb::EarthModelBinned::LonBinInfo::err_message, OscProb::EarthModelBinned::LonBinInfo::error, fC, fnLonBins, OscProb::EarthModelBinned::LonBinInfo::max, OscProb::EarthModelBinned::LonBinInfo::min, OscProb::EarthModelBinned::LonBinInfo::nextBin, OscProb::TrajConstants::rDetCosDetLat, OscProb::TrajConstants::sinDetLon, OscProb::TrajConstants::sinTsinAcosDetLon, and OscProb::TrajConstants::sinTsinAsinDetLon.

Referenced by FillPath(), and RecordLatLonBinCrossings().

◆ FillPath()

int EarthModelBinned::FillPath ( double  cosT,
double  phi = 0 
)
virtual

Fill the path sequence in a vector (phi in degrees)

Fill the path sequence in a vector.

This will start at the upper-most layer (where the neutrino's path started) and find path lengths to the next bin crossed. When reaching the inner-most depth in the given direction, the paths move back to outer layers until hitting the detector. The neutrino direction is specified as the zenith angle and azimuthal angle of the vector pointing from the detector to where the neutrino entered the Earth.

The path sequence is stored as an attribute and can be retrieved with the function GetNuPath.

Note: This function assumes uniform bin sizes for the latitude bins and the longitude bins.

Parameters
cosT- The cosine of the zenith angle of the neutrino direction
phi- The azimuthal angle (in degrees from North) of the neutrino direction
Returns
The number of path segments in the sequence

Implements OscProb::EarthModelBase.

Definition at line 652 of file EarthModelBinned.cxx.

653{
654 // Clear current path sequence
655 fNuPath.clear();
656
657 // Do nothing if cosine is unphysical
658 if (fabs(cosT) > 1) return 0;
659
660 // Calculate useful combinations of variables
661 double Az = phi / 180.0 * M_PI; // convert from degrees to radians
662 fC.UpdateNuAngles(cosT, Az);
663 fC.Recalculate();
664 double rDetSqSinSqT = pow(fC.rDetSinT, 2);
665 double distEdgeToMin =
666 sqrt(fRadiusMax * fRadiusMax -
667 rDetSqSinSqT); // distance from point where neutrino enters to
668 // minimum depth (neglecting stopping at the detector)
669 double baseline = distEdgeToMin - fC.rDetCosT; // total baseline
670
671 // Define the maximum depth (minimum radius) along the path (detector
672 // depth/radius, if cosT is non-negative)
673 double minRadius = fDetRadius;
674 if (cosT < 0) { minRadius = fC.rDetSinT; }
675
676 // Starting latitude
677/* cout << "Pieces of init_lat calculation:" << endl
678 << "\trDetSinT = " << fC.rDetSinT << endl
679 << "\tbeta = " << fC.beta << endl
680 << "\tgamma = " << fC.gamma << endl
681 << "\tdistEdgeToMin = " << distEdgeToMin << endl
682 << "\tRadiusMax = " << fRadiusMax << endl; */
683 double init_lat = asin((fC.rDetSinT * fC.beta + fC.gamma * distEdgeToMin) /
684 fRadiusMax); // in radians
685
686 // Starting longitude
687 double init_lon = atan2(
689 baseline * (fC.alpha * fC.sinDetLon + fC.sinTsinAcosDetLon),
691 baseline *
693 fC.alpha * fC.cosDetLon)); // in radians (between -M_PI and M_PI)
694 if (init_lon < 0) { init_lon += 2 * M_PI; }
695
696 // Get initial Earth bin and # of bins per depth layer
697 LatBinInfo latinfo;
698 LonBinInfo loninfo;
699 int binsPerDepth = fEarthBins.size() / fnDepthBins;
700 int init_lonBin = LonBinIndex(init_lon);
701 int init_latBin = floor((init_lat + M_PI / 2.0) * fInvLatBinWidth);
702 int index =
703 fEarthBins.size() - binsPerDepth + init_lonBin * fnLatBins + init_latBin;
704
705 latinfo.bin = init_latBin;
706 loninfo.bin = init_lonBin;
707// cout << "Neutrino starting at (lat,lon)=(" << init_lat << "rad," << init_lon << "rad) in Earth bin " << index << " = (r" << floor(index/binsPerDepth) << ", lon" << loninfo.bin << ", lat" << latinfo.bin << ")" << endl;
708
709 /* Find detector distances for 1st latitude/longitude bin changes */
710 latinfo.dLat = fHalfLatBinWidth; // change in lat from bin center to next bin
711 // (0 if no more than 1 lat bin change)
712 // Condition calculation for starting sign in x(lat) equation
713 latinfo.sign = 1; //+ => lat incr., - => lat decr. (with decr. x)
714 latinfo.maxreached = false; // this changes to true if past the lat func transition
715 if (fC.beta < 0) latinfo.sign = -1;
716 if (fC.beta == 0) {
717 if (fC.cosA > 0) latinfo.sign = -1;
718 }
719 else if (baseline < fC.xlatextreme) {
720 latinfo.sign = -(latinfo.sign);
721 latinfo.maxreached = true;
722 }
723 // Condition calculation for incr./decr. Longitude (with decr. x)
724 loninfo.dLon =
725 fHalfLonBinWidth; // change in lon from bin center to next bin (includes
726 // direction; 0 if no more than 1 lon bin change)
727 loninfo.min = init_lon; // initial lon if lon is inc.
728 loninfo.max = fDetLon; // detector lon if lon is inc.
729 if (fC.sinA < 0) {
730 loninfo.dLon = -(loninfo.dLon);
731 loninfo.min = loninfo.max;
732 loninfo.max = init_lon;
733 // Switch max/min if dec., instead of inc.
734 loninfo.max = init_lon;
735 loninfo.min = fDetLon;
736 }
737 // Remainder of detDist (and nextBin) calculations
738 if (fC.sinT == 0) {
739 // both latitude and logitude flip at center of the Earth
740 loninfo.detDist_nextBin =
741 -fC.rDetCosT; // formula is divided by cosT, but cosT = +-1
742 loninfo.nextBin = LonBinIndex(fDetLon);
743 loninfo.dLon = 0;
744 latinfo.detDist_nextBin = loninfo.detDist_nextBin;
745 latinfo.nextBin = floor((fDetLat + 0.5 * M_PI) * fInvLatBinWidth);
746 latinfo.dLat = 0;
747 }
748 else {
749 if (fC.sinA == 0) {
750 if (fC.alpha == 0) { // crosses "at" infinity
751 loninfo.detDist_nextBin = -1;
752 }
753 else { // longitude flips at center of the Earth
754 loninfo.detDist_nextBin = fC.rDetCosDetLat / fC.alpha;
755 loninfo.nextBin = LonBinIndex(fDetLon);
756 }
757 loninfo.dLon = 0;
758 }
759 else if (fC.cosDetLat == 0) {
760 loninfo.detDist_nextBin = -1;
761 }
762 else {
763 // x(lon) calculation
764 loninfo.detDist_nextBin = DetDistForNextLonBin(
765 fEarthBins[index].longitude, loninfo); // also sets loninfo.nextBin
766 }
767 // x(lat) calculation
768 latinfo.detDist_nextBin = DetDistForNextLatBin(index, latinfo);
769 latinfo.nextBin = init_latBin + latinfo.sign;
770 }
771
772 // Get initial Detector Distance
773 double prev_DetDistance = baseline;
774
775 /* Start at the top layer of Earth model and go down to minimum (not including
776 * minimum), looping over depth bins */
777 int dBin = 0; // depth bin index
778 for (dBin = 0; dBin < fnDepthBins - 1; dBin++) {
779 // Check if minimum radius is contained in depth bin
780 double r_in = fEarthBins[index].radius_in; // inner-most radius
781 if (r_in < minRadius) break;
782
783 // Distance from detector at inner-most radius
784 double DetDistance = -fC.rDetCosT + sqrt(r_in * r_in - rDetSqSinSqT);
785
786 // Check for latitude/longitude bin crossings
787 RecordLatLonBinCrossings(DetDistance, prev_DetDistance, index, latinfo,
788 loninfo);
789
790 // Add Segment to next depth bin to path
791 AddPath(prev_DetDistance - DetDistance, fEarthBins[index]);
792
793 // Reset variables for next depth bin
794 prev_DetDistance = DetDistance;
795 index -= binsPerDepth;
796// cout << "Depth bin crossing at x=" << DetDistance << "km...now in Earth bin " << index << " = (r" << floor(index/binsPerDepth) << ", lon" << loninfo.bin << ", lat" << latinfo.bin << ")" << endl;
797 }
798
799 /* Do minimum depth bin and then go up to the detector */
800 int index2 = index;
801 for (index2 = index; fEarthBins[index2].radius_out < fDetRadius;
802 index2 += binsPerDepth) {
803 double r_out = fEarthBins[index2].radius_out; // outer-most radius
804
805 // Distance from detector at outer-most radius
806 double DetDistance = -fC.rDetCosT - sqrt(r_out * r_out - rDetSqSinSqT);
807
808 // Check for latitude/longitude bin crossings
809 RecordLatLonBinCrossings(DetDistance, prev_DetDistance, index2, latinfo,
810 loninfo);
811
812 // Add Segment in depth bin to path
813 AddPath(prev_DetDistance - DetDistance, fEarthBins[index2]);
814
815 // Reset variables for "previous" depth bin
816 prev_DetDistance = DetDistance;
817// cout << "Depth bin crossing at x=" << DetDistance << "km...now in Earth bin " << index2 << " = (r" << floor((index2+binsPerDepth)/binsPerDepth) << ", lon" << loninfo.bin << ", lat" << latinfo.bin << ")" << endl;
818 }
819
820 /* Do path to detector */
821 // Check for latitude/longitude bin crossings
822 RecordLatLonBinCrossings(0, prev_DetDistance, index2, latinfo, loninfo);
823 // Add the path segment within the detector bin
824 AddPath(prev_DetDistance, fEarthBins[index2]);
825
826 // Longitude calculation error message, if needed
827 if (loninfo.error < 0) {
828 cerr
829 << "ERROR: Oops... It turns out that I was wrong about the denominator"
830 << " of the x(long) equation never being 0 apart from the cases where "
831 << "sin(Zenith) = 0, sin(Azimuthal) = 0, or cos(Detector Longitude) = "
832 << "0."
833 << " Send the following message to rpestes@apc.in2p3.fr:" << endl
834 << endl
835 << "You were wrong about the denominator of x(long)... "
836 << "Here are the values of the variables that broke it:" << endl
837 << "\tDetector Coordinates (r,lat,lon) = (" << fDetRadius << ", "
838 << fDetLat << ", " << fDetLon << ")" << endl
839 << "\tcos(Zenith Angle) = " << cosT << endl
840 << "\tAzimuthal Angle = " << phi << " deg" << endl
841 << "\t" << loninfo.err_message << endl
842 << "Please fix this ASAP!" << endl;
843 return -1;
844 }
845
846 // Return the number of path segments
847 return fNuPath.size();
848}
double fRadiusMax
Maximum radius in Earth model (in km)
double fDetLat
The latitude (in rad) where the detector sits.
double fDetLon
The longitude (in rad) where the detector sits.
double fDetRadius
The radius where the detector sits (in km)
virtual double DetDistForNextLonBin(double prev_lon, LonBinInfo &L)
virtual void AddPath(double length, EarthBin bin)
Add a path segment to the sequence.
virtual void RecordLatLonBinCrossings(double detDist_nextDbin, double &DetDist, int &index, LatBinInfo &latI, LonBinInfo &lonI)
double fHalfLonBinWidth
Half-width of each longitude bin.
double fHalfLatBinWidth
Half-width of each latitude bin.
double fInvLatBinWidth
1/binwidth for each latitude bin
virtual int LonBinIndex(double longitude)
Find lon bin index containing longitude.
virtual double DetDistForNextLatBin(int cur_index, LatBinInfo &L)
double beta
sin(T)*sin(DetLat)-cos(phi)*cosT*cos(DetLat)
void UpdateNuAngles(double cosTheta, double phi)
double cosDetLat
cos(DetLat)
double sinT
sin(T) = sqrt(sinSqT)

References AddPath(), OscProb::TrajConstants::alpha, OscProb::TrajConstants::beta, OscProb::EarthModelBinned::LatBinInfo::bin, OscProb::EarthModelBinned::LonBinInfo::bin, OscProb::TrajConstants::cosA, OscProb::TrajConstants::cosDetLat, OscProb::TrajConstants::cosDetLon, OscProb::EarthModelBinned::LatBinInfo::detDist_nextBin, OscProb::EarthModelBinned::LonBinInfo::detDist_nextBin, DetDistForNextLatBin(), DetDistForNextLonBin(), OscProb::EarthModelBinned::LatBinInfo::dLat, OscProb::EarthModelBinned::LonBinInfo::dLon, OscProb::EarthModelBinned::LonBinInfo::err_message, OscProb::EarthModelBinned::LonBinInfo::error, fC, OscProb::EarthModelBase::fDetLat, OscProb::EarthModelBase::fDetLon, OscProb::EarthModelBase::fDetRadius, fEarthBins, fHalfLatBinWidth, fHalfLonBinWidth, fInvLatBinWidth, fnDepthBins, fnLatBins, OscProb::EarthModelBase::fNuPath, OscProb::EarthModelBase::fRadiusMax, OscProb::TrajConstants::gamma, LonBinIndex(), OscProb::EarthModelBinned::LonBinInfo::max, OscProb::EarthModelBinned::LatBinInfo::maxreached, OscProb::EarthModelBinned::LonBinInfo::min, OscProb::EarthModelBinned::LatBinInfo::nextBin, OscProb::EarthModelBinned::LonBinInfo::nextBin, OscProb::TrajConstants::rDetCosDetLat, OscProb::TrajConstants::rDetCosT, OscProb::TrajConstants::rDetSinT, OscProb::TrajConstants::Recalculate(), RecordLatLonBinCrossings(), OscProb::EarthModelBinned::LatBinInfo::sign, OscProb::TrajConstants::sinA, OscProb::TrajConstants::sinDetLon, OscProb::TrajConstants::sinT, OscProb::TrajConstants::sinTsinAcosDetLon, OscProb::TrajConstants::sinTsinAsinDetLon, OscProb::TrajConstants::UpdateNuAngles(), and OscProb::TrajConstants::xlatextreme.

◆ GetCosT()

double EarthModelBase::GetCosT ( double  L)
virtualinherited

Get the cosTheta for a given total baseline.

Given a baseline, find the direction of the neutrino. This could be useful for experiments with fixed baselines for example.

The baseline must be within the range of possible values in this earth model. Will return vertical neutrinos otherwise.

Parameters
L- The total baseline of the neutrino

Definition at line 99 of file EarthModelBase.cxx.

100{
101 if (L < fRadiusMax - fDetRadius) return 1;
102 if (L > fRadiusMax + fDetRadius) return -1;
103
104 return (fRadiusMax * fRadiusMax - fDetRadius * fDetRadius - L * L) /
105 (2 * fDetRadius * L);
106}

References OscProb::EarthModelBase::fDetRadius, and OscProb::EarthModelBase::fRadiusMax.

◆ GetEarthBins()

vector< EarthBin > EarthModelBinned::GetEarthBins ( )
virtual

Get the set of earth layers

Get the set of Earth bins

This returns the set of bins for this Earth model.

Definition at line 114 of file EarthModelBinned.cxx.

114{ return fEarthBins; }

References fEarthBins.

◆ GetMergedPaths()

vector< NuPath > EarthModelBase::GetMergedPaths ( double  prec = 0.25)
virtualinherited

Merge similar paths to reduce number of steps

This method will merge consecutive paths and take their averages until it finds a large enough gap to start a new merged path.

The merged paths will be returned, and the original detailed path will not be changed and will stay stored as an attribute.

Parameters
prec- The precision to merge paths in g/cm^3
Returns
The vector of merged path segments

Definition at line 121 of file EarthModelBase.cxx.

122{
123 // The output vector
124 vector<NuPath> mergedPath;
125
126 // Start with the first path
127 NuPath path = fNuPath[0];
128
129 // Track the total length
130 double totL = 0;
131
132 // Loop over all paths starting from second
133 for (int i = 1; i < fNuPath.size(); i++) {
134 // If this path electron density is beyond the tolerance
135 if (fabs(path.density * path.zoa - fNuPath[i].density * fNuPath[i].zoa) >
136 prec * path.zoa) {
137 // Add merged path to vector
138 mergedPath.push_back(path);
139
140 // Set this path as new merged path
141 path = fNuPath[i];
142 }
143 else { // If path is within tolerance
144
145 // Merge the path with current merged path
146 path = AvgPath(path, fNuPath[i]);
147 }
148
149 // Increment total length
150 totL += fNuPath[i].length;
151
152 } // End of loop over paths
153
154 // Add the final merged path to vector
155 mergedPath.push_back(path);
156
157 // If tag is true, remove small paths
158 if (fRemoveSmallPaths) {
159 // Start at first path
160 int k = 0;
161
162 // While not at the end of vector
163 while (k + 1 < mergedPath.size()) {
164 // If length is less than 1% of total
165 if (mergedPath[k].length < 0.01 * totL) {
166 // Merge path with following path
167 mergedPath = MergePaths(mergedPath, k, k + 1);
168 }
169 // If path is long enough skip it
170 else
171 k++;
172
173 } // End of while loop
174
175 } // End of if statement
176
177 // return the merged vector
178 return mergedPath;
179}
bool fRemoveSmallPaths
Tag whether to merge small paths.
std::vector< NuPath > MergePaths(std::vector< NuPath > &inputPath, int j, int k)
Merge paths j and k in vector.
Definition: NuPath.cxx:89
NuPath AvgPath(NuPath &p1, NuPath &p2)
Get the average of two paths.
Definition: NuPath.cxx:27
double density
The density of the path segment in g/cm^3.
Definition: NuPath.h:79
double zoa
The effective Z/A value of the path segment.
Definition: NuPath.h:80

References OscProb::AvgPath(), OscProb::NuPath::density, OscProb::EarthModelBase::fNuPath, OscProb::EarthModelBase::fRemoveSmallPaths, OscProb::MergePaths(), and OscProb::NuPath::zoa.

◆ GetNuPath()

vector< NuPath > EarthModelBase::GetNuPath ( )
virtualinherited

Get the current neutrino path sequence

Get the current neutrino path sequence

The path needs to be filled for a given cosTheta before calling this function.

Definition at line 52 of file EarthModelBase.cxx.

52{ return fNuPath; }

References OscProb::EarthModelBase::fNuPath.

◆ GetRegionZoA()

double EarthModelBinned::GetRegionZoA ( int  index)
virtual

Get the effective Z/A value for all bins in region specified by index, e.g. all outer-core layers. (Assumes that all bins of given index have same Z/A value)

Parameters
index- The region index
Returns
Z/A corresponding to index

Definition at line 345 of file EarthModelBinned.cxx.

346{
347 if (index > fmaxRegIndex) {
348 cerr << "ERROR: Index " << index << " does not exist in model "
349 << "(max index = " << fmaxRegIndex << "). Returning 0" << endl;
350 return 0;
351 }
352
353 int nbins = fEarthBins.size();
354
355 for (int i = 0; i < nbins; i++) {
356 if (fEarthBins[i].index != index)
357 continue;
358
359 else
360 return fEarthBins[i].zoa;
361 }
362
363 // End of vector reached without finding index
364 cerr << "ERROR: Index " << index << " not found! Returning 0" << endl;
365 return 0;
366}
int fmaxRegIndex
Largest region index in model.

References fEarthBins, and fmaxRegIndex.

◆ GetTotalL()

double EarthModelBase::GetTotalL ( double  cosT)
virtualinherited

Get the total baseline for a given cosTheta.

Parameters
cosT- The cosine of the neutrino direction

Definition at line 77 of file EarthModelBase.cxx.

78{
79 if (fabs(cosT) > 1) return 0;
80
81 double sinsqrT = 1 - cosT * cosT;
82
83 return -fDetRadius * cosT +
84 sqrt(fRadiusMax * fRadiusMax - fDetRadius * fDetRadius * sinsqrT);
85}

References OscProb::EarthModelBase::fDetRadius, and OscProb::EarthModelBase::fRadiusMax.

◆ LoadModel()

void EarthModelBinned::LoadModel ( std::string  filename)
virtual

Load an earth model from a file.

By default it loads the model stored in EarthTables/earth_binned_default.txt

The row format for the model table needs to be: longitude (deg) latitude (deg) outer depth (km) density (g/cm^3?) Z/A region_index The data in the table must be in order of decreasing depth, followed by increasing longitude, and then increasing latitude. Latitude bin widths and longitude bin widths must each be constant. In each bin of one coordinate, the bins centers for the other coordinates must be the same. This assumes that the center of the Earth is at a depth of 6371km.

Parameters
filename- The txt file containing a table of earth layers

Definition at line 187 of file EarthModelBinned.cxx.

188{
189 // Clear the current model
190 ClearModel();
191 double EarthRadius = 6371.0;
192
193 // Use default if no file provided
194 if (filename == "") { filename = PREM3D_DEFAULT; }
195 cout << "Loading Earth model table from " << filename << "..." << endl;
196
197 // Open the file
198 ifstream fin;
199 fin.open(filename.c_str());
200 if (!fin) {
201 cerr << "ERROR: File " << filename << " not found!" << endl;
202 return;
203 }
204
205 // Variables for storing table rows
206 float depth, latitude, longitude, density, zoa, index;
207
208 // Keep track of previous depth/latitude/longitude
209 double radius_prev = 0;
210 double lat_prev = -90.0;
211 double lon_prev = 0;
212
213 // Hold onto previous different depth, so we have depth maximum for bin
214 double radius_min = radius_prev;
215
216 // Initialize max region index
217 fmaxRegIndex = -1;
218
219 // Loop over table rows
220 while (fin >> longitude >> latitude >> depth >> density >> zoa >> index) {
221 double outer_radius = EarthRadius - depth;
222
223 // Move minimum depth (and reset latitude/longitude) if depth has changed
224 // from previous one
225 if (outer_radius > radius_prev) {
226 radius_min = radius_prev;
227 lat_prev = -90.0;
228 lon_prev = 0.0;
229 fnDepthBins++;
230 }
231 else if (outer_radius <
232 radius_prev) { // Depths must be ordered in model file
233 cerr << "ERROR: Depths are not sorted in decreasing order in the model "
234 "file "
235 << "(or depth is greater than " << EarthRadius << " km)." << endl;
236 ClearModel();
237 return;
238 }
239 else if (longitude > lon_prev) { // Reset latitude if longitude has changed
240 // from previous one
241 lat_prev = -90.0;
242 fnLonBins++;
243 }
244 else if (longitude < lon_prev) { // Longitudes must be ordered in model file
245 // (after depths)
246 cerr << "ERROR: Longitudes are not sorted in increasing order (after "
247 "depths) in the model file."
248 << endl;
249 ClearModel();
250 return;
251 }
252 else if (latitude < lat_prev) { // Latitudes must be ordered in model file
253 // (after longitudes)
254 cerr << "ERROR: Latitudes are not sorted in increasing order (after "
255 "longitudes) in the model file."
256 << endl;
257 ClearModel();
258 return;
259 }
260
261 // Add this bin to the model
262 AddBin(outer_radius, radius_min, latitude, longitude, density, zoa, index);
263
264 // Check region index
265 if (index > fmaxRegIndex) { fmaxRegIndex = index; }
266
267 // Set previous coordinates for next bin
268 radius_prev = outer_radius;
269 lat_prev = latitude;
270 lon_prev = longitude;
271 }
272
273 // Set Outermost Radius
274 fRadiusMax = radius_prev;
275
276 // Modify number of longitude bins to how many there actually are (instead of
277 // how many times we changed the longitude bin without changing the depth bin
278 // = nLonBins-1 times per depth bin)
280 fInvLonBinWidth = 0.5 * fnLonBins / M_PI; // in radians^(-1)
281 fHalfLonBinWidth = M_PI / fnLonBins; // in radians
282
283 // Calculate number of latitude bins
285 fInvLatBinWidth = fnLatBins / M_PI; // in radians^(-1)
286 fHalfLatBinWidth = 0.5 * M_PI / fnLatBins; // in radians
287
288 // Error if first latitude bin center deviates from about half of the
289 // calculated latitude bin width
290 if (abs(fHalfLatBinWidth - (fEarthBins[0].latitude + 0.5 * M_PI)) >
291 fHalfLatBinWidth * 0.01) { // Warn if first latitude bin center isn't about
292 // half of the latitude bin width
293 cerr << "ERROR: Latitude of 1st bin center (" << fEarthBins[0].latitude
294 << ") is not in the middle of the first bin, whose size should be "
295 << 2 * fHalfLatBinWidth << " rad, as calculated from having "
296 << fnLatBins << " latitude bins." << endl;
297 ClearModel();
298 return;
299 }
300
301 cout << "\t...done (" << fEarthBins.size() << " bins: " << fnDepthBins
302 << " depth, " << fnLatBins << " latitude, and " << fnLonBins
303 << " longitude)." << endl;
304}
virtual void ClearModel()
Clear the earth model information.
double fInvLonBinWidth
1/binwidth for each longitude bin
virtual void AddBin(double radius_out, double radius_in, double latitude, double longitude, double density, double zoa, double layer)
Add a bin to the model (angles in degrees)

References AddBin(), ClearModel(), fEarthBins, fHalfLatBinWidth, fHalfLonBinWidth, fInvLatBinWidth, fInvLonBinWidth, fmaxRegIndex, fnDepthBins, fnLatBins, fnLonBins, and OscProb::EarthModelBase::fRadiusMax.

Referenced by EarthModelBinned().

◆ LonBinIndex()

int EarthModelBinned::LonBinIndex ( double  longitude)
protectedvirtual

Find and return longitude bin index that contains longitude.

Parameters
longitude- longitude for which bin is found

Definition at line 616 of file EarthModelBinned.cxx.

617{
618 // Find difference between longitude and beginning of first lon bin
619 double londiff = longitude - (fEarthBins[0].longitude - fHalfLonBinWidth);
620
621 // Shift londiff to be between 0 and 2pi
622 if (londiff < 0 || londiff >= 2 * M_PI)
623 londiff -= floor(londiff / (2 * M_PI));
624
625 // Number of binwidths after from first lon bin
626 return floor(londiff * fInvLonBinWidth);
627}

References fEarthBins, fHalfLonBinWidth, and fInvLonBinWidth.

Referenced by FillPath().

◆ RecordLatLonBinCrossings()

void EarthModelBinned::RecordLatLonBinCrossings ( double  detDist_nextDbin,
double &  DetDist,
int &  index,
LatBinInfo latI,
LonBinInfo lonI 
)
protectedvirtual

Record path segments for each latitude/longitude bin crossed before reaching detDist_nextDbin

Record all the path segments as the neutrino crosses into new latitude and longitude bins until it reaches the next depth bin.

Parameters
detDist_nextDbin- Distance from the detector at which neutrino passes into next depth bin
DetDist- Current distance from the detector
index- Index of current Earth bin
latI- Information about lat bin crossings
lonI- Information about lon bin crossings

Definition at line 559 of file EarthModelBinned.cxx.

563{
564 //Keep going as long as there is a lat or lon bin crossing before
565 //the next depth bin crossing
566 while (detDist_nextDbin < latI.detDist_nextBin ||
567 detDist_nextDbin < lonI.detDist_nextBin) {
568 if (latI.detDist_nextBin > lonI.detDist_nextBin) { //if next lat bin crossing is before next lon bin crossing
569 // Add segment to next lat bin to path
570 AddPath(DetDist - latI.detDist_nextBin, fEarthBins[index]);
571 double latitude_crossing = fEarthBins[index].latitude + latI.sign * latI.dLat;
572
573 // Move lat bins
574 DetDist = latI.detDist_nextBin;
575 index += latI.nextBin - latI.bin;
576 latI.bin = latI.nextBin;
577// cout << "Latitude bin crossing at x=" << DetDist << "km,lat=" << latitude_crossing << "rad...now in Earth bin " << index << " = (r" << floor(index/(fnLonBins*fnLatBins)) << ", lon" << lonI.bin << ", lat" << latI.bin << ")" << endl;
578
579 // Find next lat bin
580 if (latI.dLat == 0) { //Only 1 lat bin crossing along entire neutrino trajectory
581 latI.detDist_nextBin = -1;
582 }
583 else {
584 latI.detDist_nextBin = DetDistForNextLatBin(index, latI);
585 latI.nextBin = latI.bin + latI.sign;
586 }
587 }
588 else { //if next lon bin crossing is before (or simultaneous with) next lat bin corssing
589 // Add segment to next lon bin to path
590 AddPath(DetDist - lonI.detDist_nextBin, fEarthBins[index]);
591
592 // Move lon bins
593 DetDist = lonI.detDist_nextBin;
594 index += (lonI.nextBin - lonI.bin) * fnLatBins;
595 lonI.bin = lonI.nextBin;
596// cout << "Longitude bin crossing at x=" << DetDist << "km...now in Earth bin " << index << " = (r" << floor(index/(fnLonBins*fnLatBins)) << ", lon" << lonI.bin << ", lat" << latI.bin << ")" << endl;
597
598 // Find next lon bin
599 if (lonI.dLon == 0) { //Only 1 lon bin crossing along entire neutrino trajectory
600 lonI.detDist_nextBin = -1;
601 }
602 else {
603 lonI.detDist_nextBin =
604 DetDistForNextLonBin(fEarthBins[index].longitude, lonI);
605 }
606 }
607 }
608}

References AddPath(), OscProb::EarthModelBinned::LatBinInfo::bin, OscProb::EarthModelBinned::LonBinInfo::bin, OscProb::EarthModelBinned::LatBinInfo::detDist_nextBin, OscProb::EarthModelBinned::LonBinInfo::detDist_nextBin, DetDistForNextLatBin(), DetDistForNextLonBin(), OscProb::EarthModelBinned::LatBinInfo::dLat, OscProb::EarthModelBinned::LonBinInfo::dLon, fEarthBins, fnLatBins, OscProb::EarthModelBinned::LatBinInfo::nextBin, OscProb::EarthModelBinned::LonBinInfo::nextBin, and OscProb::EarthModelBinned::LatBinInfo::sign.

Referenced by FillPath().

◆ ScaleRegionDensity()

void EarthModelBinned::ScaleRegionDensity ( int  index,
double  factor 
)
virtual

Set Z/A of all bins with specified region index

Scale density by scaling factor for all bins in region specified by given index.

Parameters
index- The region index
factor- The scaling factor for changing the density

Definition at line 376 of file EarthModelBinned.cxx.

377{
378 if (index > fmaxRegIndex) {
379 cerr << "WARNING: Index " << index << " does not exist in model "
380 << "(max index = " << fmaxRegIndex << ")." << endl
381 << "Doing nothing." << endl;
382 return;
383 }
384
385 int nbins = fEarthBins.size();
386
387 // Loop over all bins and change the ones
388 // with the given index
389 for (int i = 0; i < nbins; i++) {
390 if (fEarthBins[i].index != index) continue;
391
392 double density_init = fEarthBins[i].density;
393 fEarthBins[i].density = factor * density_init;
394 }
395}

References fEarthBins, and fmaxRegIndex.

◆ SetDetectorCoordinates()

void EarthModelBase::SetDetectorCoordinates ( double  rad,
double  lat,
double  lon 
)
protectedvirtualinherited

Set the coordinates of the detector (rad = radius in km, lat/lon in deg)

Set the coordinates of the detector: radius in km, latitude in degrees, longitude in degrees

Parameters
rad- The distance from the detector to the Earth's center in km
lat- The latitude of the detector in deg N (between -90 and 90)
lon- The longitude of the detector in deg E (between 0 and 360)

Definition at line 25 of file EarthModelBase.cxx.

26{
27 // Force radius to be non-negative
28 if (rad < 0) {
29 cerr << "WARNING: Negative radius detected. Setting to absolute value."
30 << endl;
31 rad = -rad;
32 }
33 fDetRadius = rad;
34
35 // Force latitude to be between -90 and 90 deg
36 lat -= floor((lat + 90.0) / 360.0) * 360.0;
37 if (lat > 90) { lat = 180.0 - lat; }
38 fDetLat = lat / 180.0 * M_PI; // convert to radians
39
40 // Force longitude to be between 0 and 360 deg
41 lon -= floor(lon / 360.0) * 360.0;
42 fDetLon = lon / 180.0 * M_PI; // convert to radians
43}

References OscProb::EarthModelBase::fDetLat, OscProb::EarthModelBase::fDetLon, and OscProb::EarthModelBase::fDetRadius.

Referenced by SetDetPos(), and OscProb::PremModel::SetDetPos().

◆ SetDetPos()

void EarthModelBinned::SetDetPos ( double  rad,
double  lat = 0,
double  lon = 0 
)
virtual

Set the detector position (rad = radius in km, lat/lon in deg)

Set the coordinates of the detector: radius in km, latitude in degrees, longitude in degrees Also, updates the detector-coordinate-dependent parts of the trajectory constants.

Note: If lat = -90 (or 90), lon (or -lon) defines where the azimuthal angle for the neutrino's trajectory is 0.

Parameters
rad- The distance from the detector to the Earth's center in km
lat- The latitude of the detector in deg N (between -90 and 90)
lon- The longitude of the detector in deg E (between 0 and 360)

Implements OscProb::EarthModelBase.

Definition at line 142 of file EarthModelBinned.cxx.

143{
144 SetDetectorCoordinates(rad, lat, lon);
146}
virtual void SetDetectorCoordinates(double rad, double lat, double lon)
void UpdateDetPos(double rDet, double DetLat, double DetLon)

References fC, OscProb::EarthModelBase::fDetLat, OscProb::EarthModelBase::fDetLon, OscProb::EarthModelBase::fDetRadius, OscProb::EarthModelBase::SetDetectorCoordinates(), and OscProb::TrajConstants::UpdateDetPos().

Referenced by EarthModelBinned().

◆ SetRegionZoA()

void EarthModelBinned::SetRegionZoA ( int  index,
double  zoa 
)
virtual

Set the effective Z/A value for all bins with given region index.

Use this to change the Z/A of indexed bin, e.g. all outer-core layers

Parameters
index- The region index
zoa- The effective Z/A value to use

Definition at line 316 of file EarthModelBinned.cxx.

317{
318 if (index > fmaxRegIndex) {
319 cerr << "WARNING: Index " << index << " does not exist in model "
320 << "(max index = " << fmaxRegIndex << ")." << endl
321 << "Doing nothing." << endl;
322 return;
323 }
324
325 int nbins = fEarthBins.size();
326
327 // Loop over all bins and change the ones
328 // with the given index
329 for (int i = 0; i < nbins; i++) {
330 if (fEarthBins[i].index != index) continue;
331
332 fEarthBins[i].zoa = zoa;
333 }
334}

References fEarthBins, and fmaxRegIndex.

◆ SetRemoveSmallPaths()

void EarthModelBase::SetRemoveSmallPaths ( bool  rp = true)
virtualinherited

Set the boolean to tag whether to remove small paths when merging Small is defined as <1% of the total baseline

Parameters
rp- Boolean value to set

Definition at line 188 of file EarthModelBase.cxx.

188{ fRemoveSmallPaths = rp; }

References OscProb::EarthModelBase::fRemoveSmallPaths.

Referenced by EarthModelBinned(), and OscProb::PremModel::PremModel().

Member Data Documentation

◆ fC

TrajConstants OscProb::EarthModelBinned::fC
protected

◆ fDetLat

double OscProb::EarthModelBase::fDetLat
protectedinherited

◆ fDetLon

double OscProb::EarthModelBase::fDetLon
protectedinherited

◆ fDetRadius

◆ fEarthBins

std::vector<EarthBin> OscProb::EarthModelBinned::fEarthBins
protected

◆ fErrorMessage_LonInfo

std::string OscProb::EarthModelBinned::fErrorMessage_LonInfo
protected

Part of error message containing the longitude information

Definition at line 331 of file EarthModelBinned.h.

◆ fHalfLatBinWidth

double OscProb::EarthModelBinned::fHalfLatBinWidth
protected

Definition at line 326 of file EarthModelBinned.h.

Referenced by FillPath(), and LoadModel().

◆ fHalfLonBinWidth

double OscProb::EarthModelBinned::fHalfLonBinWidth
protected

Definition at line 325 of file EarthModelBinned.h.

Referenced by FillPath(), LoadModel(), and LonBinIndex().

◆ fInvLatBinWidth

double OscProb::EarthModelBinned::fInvLatBinWidth
protected

Definition at line 324 of file EarthModelBinned.h.

Referenced by FillPath(), and LoadModel().

◆ fInvLonBinWidth

double OscProb::EarthModelBinned::fInvLonBinWidth
protected

Definition at line 323 of file EarthModelBinned.h.

Referenced by LoadModel(), and LonBinIndex().

◆ fLonError

int OscProb::EarthModelBinned::fLonError
protected

Definition at line 333 of file EarthModelBinned.h.

Referenced by EarthModelBinned().

◆ fmaxRegIndex

int OscProb::EarthModelBinned::fmaxRegIndex
protected

Definition at line 328 of file EarthModelBinned.h.

Referenced by GetRegionZoA(), LoadModel(), ScaleRegionDensity(), and SetRegionZoA().

◆ fnDepthBins

int OscProb::EarthModelBinned::fnDepthBins
protected

Definition at line 320 of file EarthModelBinned.h.

Referenced by ClearModel(), FillPath(), and LoadModel().

◆ fnLatBins

int OscProb::EarthModelBinned::fnLatBins
protected

Definition at line 322 of file EarthModelBinned.h.

Referenced by ClearModel(), FillPath(), LoadModel(), and RecordLatLonBinCrossings().

◆ fnLonBins

int OscProb::EarthModelBinned::fnLonBins
protected

Definition at line 321 of file EarthModelBinned.h.

Referenced by ClearModel(), DetDistForNextLonBin(), and LoadModel().

◆ fNuPath

std::vector<NuPath> OscProb::EarthModelBase::fNuPath
protectedinherited

◆ fRadiusMax

double OscProb::EarthModelBase::fRadiusMax
protectedinherited

◆ fRemoveSmallPaths

bool OscProb::EarthModelBase::fRemoveSmallPaths
protectedinherited

The documentation for this class was generated from the following files: