/* General source file for reading and verifying RSS gridded binary data files Implements methods for Dataset and Verify as specified in 'dataset.h' To contact RSS support: http://www.remss.com/support 8/2014 n.picard */ #include #include #include #include #include #include "dataset.h" using namespace std; typedef vector > > > datamap; /* Implementing Dataset methods */ Dataset::Dataset() {} datamap Dataset::get(char * filename) { dimensions = get_dimensions(); data = get_data(filename); return data; } datamap Dataset::get_data(char * filename) { unsigned short * stream = readgz(filename); return unpack(stream); } unsigned short * Dataset::readgz(char * filename) { streampos size; unsigned char * memblock; unsigned short * memblock_num; fstream file (filename, ios::in|ios::binary|ios::ate); if (file.is_open()) { size = file.tellg(); memblock = new unsigned char [size]; memblock_num = new unsigned short [size]; file.seekg (0, ios::beg); file.read (reinterpret_cast(memblock), size); file.close(); cout << "File loaded: \'" << filename << "\' of size: " << size << "\n"; if ((int)size != (int)dimensions[3]*dimensions[2]*dimensions[1]*dimensions[0]) { cout << "Data shape size: " << dimensions[3]*dimensions[2]*dimensions[1]*dimensions[0] << "\n"; } for(int i = 0; i < size; i++) { memblock_num[i] = (unsigned short)memblock[i]; } } else { cout << "Unable to open file: " << filename << "\n"; cout << "-File may be in wrong directory" << "\n"; memblock_num = new unsigned short [0]; cin.get(); exit(EXIT_FAILURE); } return memblock_num; } datamap Dataset::unpack(unsigned short * stream) { int count = 1; datamap temp; vector > > v3; vector > v2; vector v1; for(int _asc = 0; _asc < dimensions[0]; _asc++) { cout << "Ascending: " <<_asc << "\n"; vector > > v3; for(int _feature = 0; _feature < dimensions[1]; _feature++) { cout << "-Feature: " << get_variables().at(_feature) << "\n"; vector > v2; float scale = get_scale(get_variables().at(_feature)); float offset = get_offset(get_variables().at(_feature)); for(int _long = 0; _long < dimensions[2]; _long++) { vector v1; for(int _lat = 0; _lat < dimensions[3]; _lat++) { float point = (float) stream[_lat +(dimensions[3]*_long) +(dimensions[3]*dimensions[2]*_feature) +(dimensions[3]*dimensions[2]*dimensions[1]*_asc)]; if (point <= 250) { point = (point * scale) + offset; } v1.push_back(point); } v2.push_back(v1); } v3.push_back(v2); } temp.push_back(v3); } cout << "Data dimensions: " << temp.size() << ", " << temp.at(0).size() << ", " << temp.at(0).at(0).size() << ", " << temp.at(0).at(0).at(0).size() << "\n"; return temp; } void Dataset::show_somedata(int iasc, vector var_names, int ilat1, int ilat2, int ilon1, int ilon2) { cout << "\nReading Asc:" << iasc << " Vars:"; for(unsigned int i = 0; i < var_names.size(); i++) {cout << var_names.at(i) << ", ";} cout << "Lat:" << ilat1 << "-" << ilat2 << " Lon:" << ilon1 << "-" << ilon2 << "\n"; std::cout.precision(2); std::cout.setf(std::ios::fixed, std:: ios::floatfield); for(unsigned int i = 0; i < var_names.size(); i++) { int var_index = get_index(var_names.at(i)); cout << "\n" << var_names.at(i) << " - " << get_long_name(var_names.at(i)) << ": units:" << get_units(var_names.at(i)) << "\n"; for(int px = ilat1; px <= ilat2; px++) { if (px == ilat1) { for(int py = ilon1; py <= ilon2; py++) {cout << " " << py << " ";} cout << "\n"; } for(int py = ilon1; py <= ilon2; py++) { float next = data.at(iasc).at(var_index).at(px).at(py); if (next < 1000 && next > -100) {cout << " "; if (next < 100 && next > -10) {cout << " "; if (next < 10 && (next > -0.000 || next == 0)) cout << " ";}} cout << next << " "; } cout << "\n"; } } } void Dataset::show_somedata_scat(int iasc, std::vector var_names, int ilat1, int ilat2, int ilon1, int ilon2) { cout << "\nReading Asc:" << iasc << " Vars:"; for(unsigned int i = 0; i < var_names.size(); i++) {cout << var_names.at(i) << ", ";} cout << "Lat:" << ilat1 << "-" << ilat2 << " Lon:" << ilon1 << "-" << ilon2 << "\n"; std::cout.precision(2); std::cout.setf(std::ios::fixed, std:: ios::floatfield); cout << "Lon Lat"; for(unsigned int i= 0; i < var_names.size(); i++) { for(int j = 0; j < 8-var_names.at(i).size(); j++) { cout << " "; } cout << var_names.at(i); } cout << "\n"; for(int px = ilat1; px <= ilat2; px++) { for(int py = ilon1; py <= ilon2; py++) { cout << "" << py << " " << px << " "; for(unsigned int i = 0; i < var_names.size(); i++) { int var_index = get_index(var_names.at(i)); float next = data.at(iasc).at(var_index).at(px).at(py); if (next < 1000 && next > -100) {cout << " "; if (next < 100 && next > -10) {cout << " "; if (next < 10 && (next > -0.000 || next == 0)) cout << " ";}} cout << next << " "; } cout << "\n"; } } } void Dataset::show_dimensions() { cout << "Dimensions: "; for(int i = 0; i < dimensions.size(); i++) { cout << dimensions.at(i) << ", "; } cout << "\n" << "\n"; } void Dataset::show_variables() { cout << "Variables: " << "\n"; vector var_names = get_variables(); int max_name = 0; for(int i = 0; i < var_names.size(); i++) { if (var_names.at(i).size() > max_name) max_name = var_names.at(i).size(); } for(int i = 0; i < var_names.size(); i++) { cout << var_names.at(i); for(int j = 0; j < max_name-var_names.at(i).size(); j++) cout << " "; cout << ":" << get_long_name(var_names.at(i)) << "\n"; } cout << "\n"; } void Dataset::show_validrange() { cout << "Valid range and units: " << "\n"; vector var_names = get_variables(); int max_name = 0; for(int i = 0; i < var_names.size(); i++) { if (var_names.at(i).size() > max_name) max_name = var_names.at(i).size(); } for(int i = 0; i < var_names.size(); i++) { cout << var_names.at(i); for(int j = 0; j < max_name-var_names.at(i).size(); j++) cout << " "; cout << ":" << get_valid_min(var_names.at(i)) << " to " << get_valid_max(var_names.at(i)) << " ("<< get_units(var_names.at(i)) << ")\n"; } cout << "\n"; } vector Dataset::get_attributes() {vector m; return m;} vector Dataset::get_dimensions() {vector m; return m;} vector Dataset::get_coordinates() {vector m; return m;} vector Dataset::get_variables() {vector m; return m;} int Dataset::get_index(string var) {return 0;} float Dataset::get_scale(string var) {return 1;} float Dataset::get_offset(string var) {return 0;} string Dataset::get_long_name(string var) {return "";} string Dataset::get_units(string var) {return "";} float Dataset::get_valid_min(string var) {return 0;} float Dataset::get_valid_max(string var) {return 0;} /* Implementing Verify methods */ Verify::Verify() {} void Verify::checkVerify(Dataset &dataset) { dataset.show_somedata(iasc, variables, ilat1, ilat2, ilon1, ilon2); }