18 #include "RampdemReader.h" 19 #include "AnitaGeomTool.h" 20 #include "TProfile2D.h" 28 typedef std::vector<std::vector<short> > VecVec;
29 typedef std::map<RampdemReader::dataSet, VecVec > DataMap;
30 static DataMap bedMap2Data;
31 typedef std::map<RampdemReader::dataSet, Double_t> HeaderMap;
33 static HeaderMap numXs;
34 static HeaderMap numYs;
35 static HeaderMap noDatas;
36 static HeaderMap minXs;
37 static HeaderMap minYs;
38 static HeaderMap maxXs;
39 static HeaderMap maxYs;
40 static HeaderMap cellSizes;
44 static const VecVec& getDataIfNeeded(RampdemReader::dataSet dataSet);
53 static double scale_factor=0.97276901289;
55 static double ellipsoid_inv_f = 298.257223563;
59 static double eccentricity = sqrt((1/ellipsoid_inv_f)*(2-(1/ellipsoid_inv_f)));
61 static double a_bar = pow(eccentricity,2)/2 + 5*pow(eccentricity,4)/24 + pow(eccentricity,6)/12 + 13*pow(eccentricity,8)/360;
63 static double b_bar = 7*pow(eccentricity,4)/48 + 29*pow(eccentricity,6)/240 + 811*pow(eccentricity,8)/11520;
65 static double c_bar = 7*pow(eccentricity,6)/120 + 81*pow(eccentricity,8)/1120;
67 static double d_bar = 4279*pow(eccentricity,8)/161280;
69 static double c_0 = (2*R_EARTH / sqrt(1-pow(eccentricity,2))) * pow(( (1-eccentricity) / (1+eccentricity) ),eccentricity/2);
166 Double_t easting, northing;
181 getDataIfNeeded(dataSet);
182 const VecVec& surface_elevation = bedMap2Data[dataSet];
184 Int_t x_min = minXs[dataSet];
185 Int_t y_min = minYs[dataSet];
186 Int_t cell_size = cellSizes[dataSet];
188 Double_t non_integer_e_coord = (easting - x_min) / cell_size;
189 Double_t non_integer_n_coord = (-1*northing - y_min) / cell_size;
191 Int_t e1 = floor(non_integer_e_coord);
192 Int_t n1 = floor(non_integer_n_coord);
198 double q11, q12, q21, q22;
200 Int_t nCols_surface = dataSet == rampdem ? numYs[dataSet] : numXs[dataSet];
201 Int_t nRows_surface = dataSet == rampdem ? numXs[dataSet] : numYs[dataSet];
202 bool e1Good = e1 >= 0 && e1 <nCols_surface;
203 bool e2Good = e2 >= 0 && e2 <nCols_surface;
204 bool n1Good = n1 >= 0 && n1 <nRows_surface;
205 bool n2Good = n2 >= 0 && n2 <nRows_surface;
207 if(dataSet==rampdem){
208 q11 = e1Good && n1Good ? double(surface_elevation[e1][n1]) : -9999;
209 q12 = e1Good && n2Good ? double(surface_elevation[e1][n2]) : -9999;
210 q21 = e2Good && n1Good ? double(surface_elevation[e2][n1]) : -9999;
211 q22 = e2Good && n2Good ? double(surface_elevation[e2][n2]) : -9999;
214 q11 = e1Good && n1Good ? double(surface_elevation[n1][e1]) : -9999;
215 q12 = e1Good && n2Good ? double(surface_elevation[n1][e2]) : -9999;
216 q21 = e2Good && n1Good ? double(surface_elevation[n2][e1]) : -9999;
217 q22 = e2Good && n2Good ? double(surface_elevation[n2][e2]) : -9999;
220 double easting1 = e1*cell_size + x_min;
221 double easting2 = e2*cell_size + x_min;
222 double northing1 = -n1*cell_size - y_min;
223 double northing2 = -n2*cell_size - y_min;
228 double dEasting = easting - easting1;
229 double dNorthing = northing - northing1;
230 double deltaEasting = easting2 - easting1;
231 double deltaNorthing = northing2 - northing1;
233 double q11_q21_interp = q11 + dEasting*(q21 - q11)/(deltaEasting);
234 double q12_q22_interp = q12 + dEasting*(q22 - q12)/(deltaEasting);
235 double bilinearlyInterpolatedSurface = q11_q21_interp + dNorthing*(q12_q22_interp - q11_q21_interp)/(deltaNorthing);
236 return bilinearlyInterpolatedSurface;
251 Double_t easting, northing;
267 getDataIfNeeded(dataSet);
268 const VecVec& surface_elevation = bedMap2Data[dataSet];
270 Int_t nCols_surface = dataSet == rampdem ? numYs[dataSet] : numXs[dataSet];
271 Int_t nRows_surface = dataSet == rampdem ? numXs[dataSet] : numYs[dataSet];
275 Int_t e_coord_surface=0;
276 Int_t n_coord_surface=0;
279 if(e_coord_surface >= nCols_surface || e_coord_surface <0){
283 else if(n_coord_surface >= nRows_surface || n_coord_surface <0){
288 if(dataSet==rampdem){
289 surface = double(surface_elevation[e_coord_surface][n_coord_surface]);
292 surface = double(surface_elevation[n_coord_surface][e_coord_surface]);
312 return (GEOID_MIN*GEOID_MAX/sqrt(pow(GEOID_MIN,2)-(pow(GEOID_MIN,2)-pow(GEOID_MAX,2))*pow(cos(latitude*TMath::DegToRad()),2)));
330 char calibDir[FILENAME_MAX];
331 char *calibEnv=getenv(
"ANITA_CALIB_DIR");
333 char *utilEnv=getenv(
"ANITA_UTIL_INSTALL_DIR");
335 sprintf(calibDir,
"calib");
338 sprintf(calibDir,
"%s/share/anitaCalib",utilEnv);
342 strncpy(calibDir,calibEnv,FILENAME_MAX);
345 char dem_filename[FILENAME_MAX];
346 char header_filename[FILENAME_MAX];
348 std::ifstream dem_data;
349 std::ifstream dem_header;
351 sprintf(dem_filename,
"%s/ramp1kmdem_wgs_v2.bin",calibDir);
352 sprintf(header_filename,
"%s/ramp1kmdem_wgs_v2.hdr",calibDir);
360 dem_header.open(header_filename);
361 if (!dem_header.is_open()){
362 std::cerr <<
"[RampdemReader::readRAMPDEM] Error! Could not open header file " << header_filename
363 <<
"! Exiting method.\n";
367 dem_data.open(dem_filename, std::ios::in | std::ios::binary );
368 if (!dem_data.is_open()){
369 std::cerr <<
"[RampdemReader::readRAMPDEM] Error! Could not open binary data file " << dem_filename
370 <<
"! Exiting method.\n";
378 double cell_size, x_min, x_max, y_min, y_max, min_value, max_value, mean, std_deviation;
379 int nRows_surface, nCols_surface, nBytes_surface;
380 dem_header.ignore( 5000,
'=');
381 dem_header >> cell_size;
382 dem_header.ignore( 5000,
'=');
383 dem_header >> nRows_surface;
384 dem_header.ignore( 5000,
'=');
385 dem_header.ignore( 5000,
'=');
386 dem_header >> nCols_surface;
387 dem_header.ignore( 5000,
'=');
388 dem_header >> nBytes_surface;
389 dem_header.ignore( 5000,
'=');
391 dem_header.ignore( 5000,
'=');
392 dem_header >> min_value;
393 dem_header.ignore( 5000,
'=');
395 dem_header.ignore( 5000,
'=');
396 dem_header >> max_value;
397 dem_header.ignore( 5000,
'=');
399 dem_header.ignore( 5000,
'=');
401 dem_header.ignore( 5000,
'=');
403 dem_header.ignore( 5000,
'=');
404 dem_header >> std_deviation;
406 numXs[RampdemReader::rampdem] = nRows_surface;
407 numYs[RampdemReader::rampdem] = nCols_surface;
408 minXs[RampdemReader::rampdem] = x_min;
409 minYs[RampdemReader::rampdem] = y_min;
410 maxXs[RampdemReader::rampdem] = x_max;
411 maxYs[RampdemReader::rampdem] = y_max;
412 cellSizes[RampdemReader::rampdem] = cell_size;
413 noDatas[RampdemReader::rampdem] = -9999;
418 VecVec& surface_elevation = bedMap2Data[RampdemReader::rampdem];
421 surface_elevation = std::vector< std::vector<short> >(nCols_surface, std::vector<short>(nRows_surface, 0 ) );
425 for (
unsigned int row_index=0; row_index < surface_elevation[0].size(); ++row_index){
426 for (
unsigned int column_index=0; column_index < surface_elevation.size(); ++column_index){
427 if (!dem_data.read( (
char *)&temp_data,
sizeof(
short) )){
428 std::cerr <<
"[RampdemReader::readRAMPDEM] Error! Read from data file failed! Row " << row_index
429 <<
", column " << column_index <<
".\n";
432 flipEndian(temp_data);
433 surface_elevation[column_index][row_index] = temp_data;
436 if(dem_data.read((
char*)&temp_data,
sizeof(
short))){
437 std::cerr <<
"[RampdemReader::readRAMPDEM] Error! I could read a value (" << temp_data
438 <<
") from the data file after I thought that it was empty!.\n";
460 getDataIfNeeded(dataSet);
461 Double_t cell_size = cellSizes[dataSet];
463 Double_t lat_rad = -latitude * TMath::DegToRad();
465 return (pow(cell_size* ((1 + sin(71*TMath::DegToRad())) / (1 + sin(lat_rad))),2));
484 getDataIfNeeded(dataSet);
510 getDataIfNeeded(dataSet);
512 Int_t x_min = minXs[dataSet];
513 Int_t y_min = minYs[dataSet];
514 Int_t cell_size = cellSizes[dataSet];
516 e_coord = (int)((easting - x_min) / cell_size);
517 n_coord = (int)((-1*northing - y_min) / cell_size);
538 Double_t lon_rad = lon * TMath::DegToRad();
539 Double_t lat_rad = -lat * TMath::DegToRad();
541 const double R_factor = scale_factor*c_0 * pow(( (1 + eccentricity*sin(lat_rad)) / (1 - eccentricity*sin(lat_rad)) ),eccentricity/2) * tan((TMath::Pi()/4) - lat_rad/2);
543 easting = R_factor * sin(lon_rad);
544 northing = R_factor * cos(lon_rad);
565 getDataIfNeeded(dataSet);
566 Double_t x_min = minXs[dataSet];
567 Double_t y_min = minYs[dataSet];
568 Double_t cell_size = cellSizes[dataSet];
570 Double_t isometric_lat=0;
571 Double_t easting = x_min+(cell_size*(e_coord+0.5));
572 Double_t northing = -1*(y_min+(cell_size*(n_coord+0.5)));
577 lon = atan(easting/northing);
579 lon = 90*TMath::DegToRad();
582 if (easting > 0 && lon < 0)
584 else if (easting < 0 && lon > 0)
586 else if (easting == 0 && northing < 0)
592 R_factor = TMath::Abs(easting/sin(lon));
593 else if (easting == 0 && northing != 0)
594 R_factor = TMath::Abs(northing);
597 lon = lon*TMath::RadToDeg();
601 isometric_lat = (TMath::Pi()/2) - 2*atan(R_factor/(scale_factor*c_0));
603 lat = isometric_lat + a_bar*sin(2*isometric_lat) + b_bar*sin(4*isometric_lat) + c_bar*sin(6*isometric_lat) + d_bar*sin(8*isometric_lat);
605 lon = lon * TMath::RadToDeg();
606 lat = -lat*TMath::RadToDeg();
625 double lon_rad = atan2(easting,northing);
626 lon = lon_rad * TMath::RadToDeg();
627 double R_factor = sqrt(easting*easting+northing*northing);
628 double isometric_lat = (TMath::Pi()/2) - 2*atan(R_factor/(scale_factor*c_0));
629 lat = isometric_lat + a_bar*sin(2*isometric_lat) + b_bar*sin(4*isometric_lat) + c_bar*sin(6*isometric_lat) + d_bar*sin(8*isometric_lat);
630 lat = -lat*TMath::RadToDeg();
653 TProfile2D* theHist =
getMap(RampdemReader::rampdem, coarseness);
655 xBins = theHist->GetNbinsX();
656 yBins = theHist->GetNbinsY();
659 for(UInt_t bx = 1; bx <= xBins; bx++){
660 for(UInt_t by = 1; by <= yBins; by++){
661 double val = theHist->GetBinContent(bx, by);
663 theHist->SetBinContent(bx, by, TMath::Log10(val));
668 theHist->SetStats(0);
695 double centralLon,
double centralLat,
double rangeMetres,
696 Int_t &xBins, Int_t &yBins,
697 Double_t &xMin, Double_t &xMax,
698 Double_t &yMin,Double_t &yMax){
701 TProfile2D* theHist =
getMapPartial(RampdemReader::rampdem, coarseness, centralLon, centralLat, rangeMetres);
702 xBins = theHist->GetNbinsX();
703 yBins = theHist->GetNbinsY();
704 xMin = theHist->GetXaxis()->GetBinLowEdge(1);
705 xMax = theHist->GetXaxis()->GetBinLowEdge(xBins+1);
706 yMin = theHist->GetYaxis()->GetBinLowEdge(1);
707 yMax = theHist->GetYaxis()->GetBinLowEdge(yBins+1);
718 TGaxis *RampdemReader::distanceScale(Double_t xMin,Double_t xMax,Double_t yMin,Double_t yMax){
720 if(xMax<=xMin && yMax<=yMin) {
721 std::cerr <<
"size ordering wrong: xMin " << xMin <<
" xMax " << xMax <<
" yMin " << yMin <<
" yMax " << yMax << std::endl;
725 TGaxis *theAxis =
new TGaxis(xMin,yMin,xMax,yMax,0,sqrt((xMax-xMin)/1e3*(xMax-xMin)/1e3-(yMax-yMin)/1e3*(yMax-yMin)/1e3),2,
"");
726 theAxis->SetTitle(
"km");
743 double &xMax,
double &yMax,
744 RampdemReader::dataSet dataSet){
748 getDataIfNeeded(dataSet);
749 xMin = minXs[dataSet];
750 yMin = minYs[dataSet];
751 xMax = maxXs[dataSet];
752 yMax = maxYs[dataSet]+cellSizes[dataSet];
767 RampdemReader::dataSet dataSet){
769 getDataIfNeeded(dataSet);
770 numX = numXs[dataSet];
771 numY = numYs[dataSet];
800 static const char* dataSetToString(RampdemReader::dataSet dataSet){
803 case RampdemReader::rampdem:
805 case RampdemReader::bed:
811 case RampdemReader::icemask_grounded_and_shelves:
812 return "icemask_grounded_and_shelves";
817 case RampdemReader::surface:
819 case RampdemReader::thickness:
824 std::cerr <<
"Error in " << __FILE__ <<
", unknown RampdemReader::dataSet requested" << std::endl;
842 case RampdemReader::rampdem:
843 return "Surface height (m)";
844 case RampdemReader::bed:
845 return "Bed height (m)";
850 case RampdemReader::icemask_grounded_and_shelves:
851 return "Grounding line and floating ice shelves";
856 case RampdemReader::surface:
857 return "Surface height (m)";
858 case RampdemReader::thickness:
859 return "Ice thickness (m)";
863 std::cerr <<
"Error in " << __FILE__ <<
", unknown RampdemReader::dataSet requested" << std::endl;
882 static const VecVec& getDataIfNeeded(RampdemReader::dataSet dataSet){
886 if(bedMap2Data.size()==0){
887 bedMap2Data[RampdemReader::rampdem] = VecVec();
888 bedMap2Data[RampdemReader::bed] = VecVec();
891 bedMap2Data[RampdemReader::icemask_grounded_and_shelves] = VecVec();
894 bedMap2Data[RampdemReader::surface] = VecVec();
895 bedMap2Data[RampdemReader::thickness] = VecVec();
899 DataMap::iterator it = bedMap2Data.find(dataSet);
900 if(it==bedMap2Data.end()){
901 std::cerr <<
"Error in " << __FILE__ <<
", unable to find requested data set!" << std::endl;
905 VecVec& data = it->second;
908 if(dataSet==RampdemReader::rampdem){
916 if(data.size() == 0){
917 const char* anitaEnv =
"ANITA_UTIL_INSTALL_DIR";
918 const char* anitaUtilInstallDir = getenv(anitaEnv);
919 if(anitaUtilInstallDir==NULL){
920 std::cerr <<
"Error in " << __FILE__ <<
", could not find environment variable " << anitaEnv << std::endl;
925 std::string fileName(anitaUtilInstallDir);
927 fileName.append(
"/share/anitaCalib/bedmap2_bin/bedmap2_");
930 const char* dataName = dataSetToString(dataSet);
931 fileName.append(dataName);
934 std::string headName = fileName;
935 headName.append(
".hdr");
939 std::ifstream header(headName.c_str());
940 if(!header.is_open()){
941 std::cerr <<
"Error! Unable to open file " << headName << std::endl;
942 std::cerr <<
"The BEDMAP2 data set is large and not bundled with anitaEventCorrelator by default." << std::endl;
943 std::cerr <<
"To download the BEDMAP2 data set and have it installed in the proper place, run the script anitaEventCorrelator/downloadBEDMAP2subset.sh" << std::endl;
944 std::cerr <<
"If you have a slow internet connection, beware, the total size of the files is ~50MB." << std::endl;
945 std::cerr <<
"See https://github.com/anitaNeutrino/subsetOfBedmap2Data for more information." << std::endl;
951 std::string key, value;
952 header >> key >> value;
956 numXs[dataSet] = atoi(value.c_str());
958 else if(key==
"nrows"){
959 numYs[dataSet] = atoi(value.c_str());
961 else if(key==
"NODATA_value"){
962 noDatas[dataSet] = atoi(value.c_str());
964 else if(key==
"xllcorner"){
965 minXs[dataSet]= atoi(value.c_str());
967 else if(key==
"yllcorner"){
968 minYs[dataSet] = atoi(value.c_str());
970 else if(key==
"cellsize"){
971 cellSizes[dataSet] = atoi(value.c_str());
974 }
while(!header.eof());
978 maxXs[dataSet] = minXs[dataSet] + numXs[dataSet]*cellSizes[dataSet];
979 maxYs[dataSet] = minYs[dataSet] + numYs[dataSet]*cellSizes[dataSet];
982 fileName.append(
".flt");
983 FILE* fBedMap2 = fopen(fileName.c_str(),
"r");
985 std::cerr <<
"Error in " << __FILE__ <<
", could not open file " << fileName << std::endl;
991 const int numX = numXs[dataSet];
992 const int numY = numYs[dataSet];
994 std::vector<float> tempData(numX, 0);
996 for(
int y=0; y < numY; y++){
997 fread(&tempData[0],
sizeof(
float), numX, fBedMap2);
998 data.push_back(std::vector<short>(numX, 0));
1000 for(
int x = 0; x < numX; x++){
1001 data.at(y).at(x) = short(tempData.at(x));
1028 const VecVec& data = getDataIfNeeded(dataSet);
1029 if(data.size() > 0){
1030 Double_t cellSize = cellSizes[dataSet];
1032 Int_t xBins = numXs[dataSet];
1033 Int_t yBins = numYs[dataSet];
1035 Double_t xMin = minXs[dataSet];
1036 Double_t yMin = minYs[dataSet];
1040 Double_t noData = noDatas[dataSet];
1042 if(dataSet==RampdemReader::rampdem){
1043 for(UInt_t yBin=0; yBin < data.at(0).size(); yBin++){
1044 for(UInt_t xBin=0; xBin < data.size(); xBin++){
1046 theHist->Fill(xMin +
double(xBin)*cellSize,
1047 -(yMin +
double(yBin)*cellSize),
1048 data.at(xBin).at(yBin));
1053 for(Int_t yBin=0; yBin < yBins; yBin++){
1054 for(Int_t xBin=0; xBin < xBins; xBin++){
1055 if(data[yBin][xBin] != noData){
1056 theHist->Fill(xMin +
double(xBin)*cellSize,
1057 -(yMin +
double(yBin)*cellSize),
1064 theHist->SetStats(0);
1083 getDataIfNeeded(dataSet);
1085 Int_t xBins = numXs[dataSet];
1086 Int_t yBins = numYs[dataSet];
1088 Double_t xMin = minXs[dataSet];
1089 Double_t yMin = minYs[dataSet];
1091 Double_t xMax = maxXs[dataSet];
1092 Double_t yMax = maxYs[dataSet];
1093 Double_t cellSize = cellSizes[dataSet];
1095 TString hName = TString::Format(
"h_%s_%d", dataSetToString(dataSet), coarseness);
1096 TProfile2D * theHist =
new TProfile2D(hName,
"",
1097 xBins/coarseness, xMin, xMax,
1098 yBins/coarseness, yMin, yMax+cellSize);
1101 theHist->SetDirectory(0);
1125 double centralLon,
double centralLat,
double rangeMetres){
1127 Int_t central_e_coord,central_n_coord;
1128 LonLattoEN(centralLon, centralLat, central_e_coord, central_n_coord, dataSet);
1130 Double_t central_easting,central_northing;
1133 Int_t max_e_coord, max_n_coord;
1135 max_e_coord, max_n_coord, dataSet);
1137 Int_t min_e_coord, min_n_coord;
1139 min_e_coord, min_n_coord, dataSet);
1141 if(max_e_coord<min_e_coord){
1142 Int_t swap_e = max_e_coord;
1143 max_e_coord = min_e_coord;
1144 min_e_coord = swap_e;
1146 if(max_n_coord<min_n_coord){
1147 Int_t swap_n = max_n_coord;
1148 max_n_coord = min_n_coord;
1149 min_n_coord = swap_n;
1152 Int_t thisXBins = (max_e_coord-min_e_coord)/coarseness;
1153 Int_t thisYBins = (max_n_coord-min_n_coord)/coarseness;
1158 double thisXMin = central_easting - rangeMetres;
1159 double thisXMax = central_easting + rangeMetres;
1160 double thisYMin = central_northing - rangeMetres;
1161 double thisYMax = central_northing + rangeMetres;
1163 TString histName = TString::Format(
"h_%s_partial_%d", dataSetToString(dataSet), coarseness);
1164 TProfile2D *theHist =
new TProfile2D(histName,
"",
1165 thisXBins, thisXMin, thisXMax,
1166 thisYBins, thisYMin, thisYMax);
1187 const VecVec& data = getDataIfNeeded(RampdemReader::surface);
1188 int e_coord, n_coord;
1189 LonLattoEN(lon, lat, e_coord, n_coord, RampdemReader::surface);
1193 if(n_coord >= 0 && n_coord < numYs[RampdemReader::surface] &&
1194 e_coord >= 0 && e_coord < numXs[RampdemReader::surface]){
1196 if(data.at(n_coord).at(e_coord)!=noDatas[RampdemReader::surface]){
1216 const VecVec& data = getDataIfNeeded(RampdemReader::icemask_grounded_and_shelves);
1217 int e_coord, n_coord;
1218 LonLattoEN(lon, lat, e_coord, n_coord, RampdemReader::icemask_grounded_and_shelves);
1221 Bool_t iceShelf =
false;
1222 if(n_coord >= 0 && n_coord < numYs[RampdemReader::icemask_grounded_and_shelves] &&
1223 e_coord >= 0 && e_coord < numXs[RampdemReader::icemask_grounded_and_shelves]){
1225 double val = data.at(n_coord).at(e_coord);
1249 const VecVec& data = getDataIfNeeded(RampdemReader::thickness);
1250 int e_coord, n_coord;
1251 LonLattoEN(lon, lat, e_coord, n_coord, RampdemReader::thickness);
1254 Double_t thickness = 0;
1255 if(n_coord >= 0 && n_coord < numYs[RampdemReader::thickness] &&
1256 e_coord >= 0 && e_coord < numXs[RampdemReader::thickness]){
1258 thickness = data.at(n_coord).at(e_coord);
static TProfile2D * rampMapPartial(int coarseness_factor, double centralLon, double centralLat, double rangeMetres, Int_t &xBins, Int_t &yBins, Double_t &xMin, Double_t &xMax, Double_t &yMin, Double_t &yMax) __attribute__((deprecated))
static Double_t BilinearInterpolatedSurfaceAboveGeoid(Double_t longitude, Double_t latitude, RampdemReader::dataSet=rampdem)
static Double_t SurfaceAboveGeoidEN(Double_t Easting, Double_t Northing, RampdemReader::dataSet=rampdem)
static void getNumXY(Int_t &numX, Int_t &numY, RampdemReader::dataSet dataSet=rampdem)
static TProfile2D * rampMap(int coarseness_factor, int set_log_scale, UInt_t &xBins, UInt_t &yBins) __attribute__((deprecated))
static TProfile2D * getMap(RampdemReader::dataSet dataSet, int coarseness_factor)
static TProfile2D * getMapPartial(RampdemReader::dataSet dataSet, int coarseness, double centralLon, double centralLat, double rangeMetres)
static Double_t SurfaceAboveGeoid(Double_t longitude, Double_t latitude, RampdemReader::dataSet=rampdem)
static Double_t iceThickness(Double_t lon, Double_t lat)
static RampdemReader * Instance() __attribute__((deprecated))
Instance generator.
static void getMapCoordinates(double &xMin, double &yMin, double &xMax, double &yMax, RampdemReader::dataSet=rampdem)
static Double_t Surface(Double_t longitude, Double_t latitude)
static void LonLattoEN(Double_t lon, Double_t lat, int &e_coord, int &n_coord, RampdemReader::dataSet=rampdem)
static RampdemReader * fgInstance
Pointer to instance.
static Double_t Area(Double_t latitude, RampdemReader::dataSet=rampdem)
static Bool_t isOnContinent(Double_t lon, Double_t lat)
static void EastingNorthingToEN(Double_t easting, Double_t northing, Int_t &e_coord, Int_t &n_coord, RampdemReader::dataSet=rampdem)
static Double_t BilinearInterpolatedSurfaceAboveGeoidEastingNorthing(Double_t easting, Double_t northing, RampdemReader::dataSet=rampdem)
static const char * dataSetToAxisTitle(RampdemReader::dataSet dataSet)
static TProfile2D * fillThisHist(TProfile2D *theHist, RampdemReader::dataSet dataSet)
static void ENtoLonLat(Int_t e_coord, Int_t n_coord, Double_t &lon, Double_t &lat, RampdemReader::dataSet=rampdem)
static Bool_t isOnIceShelf(Double_t lon, Double_t lat)
static void LonLatToEastingNorthing(Double_t lon, Double_t lat, Double_t &easting, Double_t &northing)
static void EastingNorthingToLonLat(Double_t easting, Double_t northing, Double_t &lon, Double_t &lat)
static Double_t Geoid(Double_t latitude)