#include "stdafx.h" #include "SigmaDatabase.h" #include #include #include "BaseConstVariable.h" double getSigma(double& theta, SigmaParam& param) { return param.p1 + param.p2 * exp(-param.p3 * theta) + param.p4 * cos(param.p5 * theta + param.p6); } SigmaDatabase::SigmaDatabase() { this->HH_sigmaParam = std::map(); this->HV_sigmaParam = std::map(); this->VH_sigmaParam = std::map(); this->VV_sigmaParam = std::map(); this->HH_sigmaParam.clear(); this->HV_sigmaParam.clear(); this->VH_sigmaParam.clear(); this->VV_sigmaParam.clear(); //0 this->HH_sigmaParam.insert(std::pair(0, SigmaParam{ 0,0,0, 0, 0,0 })); this->HV_sigmaParam.insert(std::pair(0, SigmaParam{ 0,0,0, 0, 0,0 })); this->VH_sigmaParam.insert(std::pair(0, SigmaParam{ 0,0,0, 0, 0,0 })); this->VV_sigmaParam.insert(std::pair(0, SigmaParam{ 0,0,0, 0, 0,0 })); ////12 //this->HH_sigmaParam.insert(std::pair(12, SigmaParam{ -21.1019701821713, 9.00621457243906, 6.52932182540331, - 1.11157376729893, - 15.8022895411007, 11.4690828129602 })); //this->HV_sigmaParam.insert(std::pair(12, SigmaParam{ -30.0103645753547, 27.1700862271921, 11.8007376386356, - 0.933835390422269, - 16.4640776105300, 11.8318838032267 })); //this->VH_sigmaParam.insert(std::pair(12, SigmaParam{ -30.0103645753547, 27.1700862271921, 11.8007376386356, -0.933835390422269, -16.4640776105300, 11.8318838032267 })); //this->VV_sigmaParam.insert(std::pair(12, SigmaParam{ -21.1019701821713, 9.00621457243906, 6.52932182540331, -1.11157376729893, -15.8022895411007, 11.4690828129602 })); ////22 //this->HH_sigmaParam.insert(std::pair(22, SigmaParam{ -43.6677042155964, 32.0245140457417, 0.511060658303930, - 2.68482232690106, 6.29783274559538, 1.96648609622833 })); //this->HV_sigmaParam.insert(std::pair(22, SigmaParam{ -36.3971634075803, 13.1296247093899, 1.12707368693158, - 1.88195857790977, 6.57450737122974, 2.11755051297951 })); //this->VH_sigmaParam.insert(std::pair(22, SigmaParam{ -36.3971634075803, 13.1296247093899, 1.12707368693158, -1.88195857790977, 6.57450737122974, 2.11755051297951 })); //this->VV_sigmaParam.insert(std::pair(22, SigmaParam{ -43.6677042155964, 32.0245140457417, 0.511060658303930, -2.68482232690106, 6.29783274559538, 1.96648609622833 })); ////30 //this->HH_sigmaParam.insert(std::pair(30, SigmaParam{ -59.1080014669385, 47.6710707363975, 0.300193452564135, - 3.93463636916976, 5.99799798331127, - 10.3772604045974 })); //this->HV_sigmaParam.insert(std::pair(30, SigmaParam{ -55.1864353240982, 32.2453149408716, 0.333758208816865, - 3.38774208141056, 6.12774897769798, - 10.1192846531823 })); //this->VH_sigmaParam.insert(std::pair(30, SigmaParam{ -55.1864353240982, 32.2453149408716, 0.333758208816865, - 3.38774208141056, 6.12774897769798, - 10.1192846531823 })); //this->VV_sigmaParam.insert(std::pair(30, SigmaParam{ -59.1080014669385, 47.6710707363975, 0.300193452564135, -3.93463636916976, 5.99799798331127, -10.3772604045974 })); ////50 //this->HH_sigmaParam.insert(std::pair(50, SigmaParam{ -22.9105602882378, 8170.54100628307, 15.4916054293135, - 0.970580847008280, 28.9025325818511, - 21.4319176514170 })); //this->HV_sigmaParam.insert(std::pair(50, SigmaParam{ -39.7459019584805, 151.391039247574, 5.17117231380975, - 4.10303899418773, 8.04893424718507, - 3.17171678851531 })); //this->VH_sigmaParam.insert(std::pair(50, SigmaParam{ -39.7459019584805, 151.391039247574, 5.17117231380975, -4.10303899418773, 8.04893424718507, -3.17171678851531 })); //this->VV_sigmaParam.insert(std::pair(50, SigmaParam{ -22.9105602882378, 8170.54100628307, 15.4916054293135, -0.970580847008280, 28.9025325818511, -21.4319176514170 })); ////61 //this->HH_sigmaParam.insert(std::pair(61, SigmaParam{ 27.2590864500905, 95.6840751800642, 3.98975084647232, 50.3262749621072, 3.09962879546370, - 5.10400310274333 })); //this->HV_sigmaParam.insert(std::pair(61, SigmaParam{ -65.9799383836613, 106.831320929437, 1.53821651203361, 0.704332523237733, 36.3654715437260, - 13.7449876973719 })); //this->VH_sigmaParam.insert(std::pair(61, SigmaParam{ -65.9799383836613, 106.831320929437, 1.53821651203361, 0.704332523237733, 36.3654715437260, -13.7449876973719 })); //this->VV_sigmaParam.insert(std::pair(61, SigmaParam{ 27.2590864500905, 95.6840751800642, 3.98975084647232, 50.3262749621072, 3.09962879546370, -5.10400310274333 })); ////62 //this->HH_sigmaParam.insert(std::pair(62, SigmaParam{ -34.3961764495281, 21.7503968763591, 1.15914650010176, - 2.83950292185421, 10.3519995095232, 2.75293811408200 })); //this->HV_sigmaParam.insert(std::pair(62, SigmaParam{ -34.0710914034599, 14.1778732014224, 3.47049853590805, - 1.73813229616801, 10.9627971440838, 2.19731364578002 })); //this->VH_sigmaParam.insert(std::pair(62, SigmaParam{ -34.0710914034599, 14.1778732014224, 3.47049853590805, -1.73813229616801, 10.9627971440838, 2.19731364578002 })); //this->VV_sigmaParam.insert(std::pair(62, SigmaParam{ -34.3961764495281, 21.7503968763591, 1.15914650010176, -2.83950292185421, 10.3519995095232, 2.75293811408200 })); ////80 //this->HH_sigmaParam.insert(std::pair(80, SigmaParam{ -5.76486750987210, - 7.80014668607246, 0.0880097904597720, - 5.44564720816575, - 0.530358195545799, 1.04332202699956 })); //this->HV_sigmaParam.insert(std::pair(80, SigmaParam{ 484.928701445606, - 0.992170190244375, - 1.98914783519718, - 507.127544388772, 0.195180814149377, 6.21339949756719 })); //this->VH_sigmaParam.insert(std::pair(80, SigmaParam{ 484.928701445606, -0.992170190244375, -1.98914783519718, -507.127544388772, 0.195180814149377, 6.21339949756719 })); //this->VV_sigmaParam.insert(std::pair(80, SigmaParam{ -5.76486750987210, -7.80014668607246, 0.0880097904597720, -5.44564720816575, -0.530358195545799, 1.04332202699956 })); ////90 //this->HH_sigmaParam.insert(std::pair(90, SigmaParam{ -20.1761798059391, 13.2752519275021, 2.74667225608397, 3.63052241744923, 8.99932188120922, 34.8246533269446 })); //this->HV_sigmaParam.insert(std::pair(90, SigmaParam{ -26.8776515733889, 10.4251866500052, 8.43273666535992, 4.33165922141213, 8.68204389555939, - 2.51718779582920 })); //this->VH_sigmaParam.insert(std::pair(90, SigmaParam{ -26.8776515733889, 10.4251866500052, 8.43273666535992, 4.33165922141213, 8.68204389555939, - 2.51718779582920 })); //this->VV_sigmaParam.insert(std::pair(90, SigmaParam{ -20.1761798059391, 13.2752519275021, 2.74667225608397, 3.63052241744923, 8.99932188120922, 34.8246533269446 })); this->HH_sigmaParam.insert(std::pair(10, SigmaParam{ 28.15,-39.73,0.0986,2.863,4.356,-6.279 })); this->HH_sigmaParam.insert(std::pair(20, SigmaParam{ 36.13,-48.2,0.1299,-1.838,5.404,-4.015 })); this->HH_sigmaParam.insert(std::pair(30, SigmaParam{ 183.5,-194.6,0.0167,2.952,-4.1,6.026 })); this->HH_sigmaParam.insert(std::pair(40, SigmaParam{ 50.97,-62.9,0.0968,1.604,4.637,6.108 })); this->HH_sigmaParam.insert(std::pair(50, SigmaParam{ -10.31,15.96,37.73,-4.584,4.997,-3.569 })); this->HH_sigmaParam.insert(std::pair(60, SigmaParam{ -12.45,0.1561,-3.187,-2.482,8.244,0.3632 })); this->HH_sigmaParam.insert(std::pair(80, SigmaParam{ -19.23,0.3623,-2.209,9.649,0.1292,-0.264 })); this->HH_sigmaParam.insert(std::pair(100, SigmaParam{ 56.61,-62.29,0.01388,2.767,-3.943,5.995 })); } SigmaDatabase::~SigmaDatabase() { this->HH_sigmaParam.clear(); this->HV_sigmaParam.clear(); this->VH_sigmaParam.clear(); this->VV_sigmaParam.clear(); } double SigmaDatabase::getAmpHH(long cls, double angle) { if (this->HH_sigmaParam.find(cls) == this->HH_sigmaParam.end()) { return 0; } else { return std::pow(10, getSigma(angle, this->HH_sigmaParam[cls]) / 10.0); } } double SigmaDatabase::getAmpHV(long cls, double angle) { if (this->HV_sigmaParam.find(cls) == this->HV_sigmaParam.end()) { return 0; } else { return std::pow(10, getSigma(angle, this->HV_sigmaParam[cls]) / 10.0); } } double SigmaDatabase::getAmpVH(long cls, double angle) { if (this->VH_sigmaParam.find(cls) == this->VH_sigmaParam.end()) { return 0; } else { return std::pow(10, getSigma(angle, this->VH_sigmaParam[cls]) / 10.0); } } double SigmaDatabase::getAmpVV(long cls, double angle) { if (this->VV_sigmaParam.find(cls) == this->VV_sigmaParam.end()) { return 0; } else { return std::pow(10, getSigma(angle, this->VV_sigmaParam[cls]) / 10.0); } } double SigmaDatabase::getAmp(long cls, double angle, POLARTYPEENUM polartype) { switch (polartype) { case(POLARHH): { return this->getAmpHH(cls, angle); } case(POLARHV): { return this->getAmpHV(cls, angle); } case(POLARVH): { return this->getAmpVH(cls, angle); } case(POLARVV): { return this->getAmpVV(cls, angle); } default: return 1; } } std::map SigmaDatabase::getsigmaParams(POLARTYPEENUM polartype) { switch (polartype) { case(POLARHH): { return this->HH_sigmaParam; } case(POLARHV): { return this->HV_sigmaParam; } case(POLARVH): { return this->VH_sigmaParam; } case(POLARVV): { return this->VV_sigmaParam; } default: return std::map(); } } void SigmaDatabase::readParamsFromFile(const std::string& filename) { std::ifstream infile(filename); if (!infile.is_open()) { std::cerr << "Failed to open file: " << filename << std::endl; return; } std::string line; while (std::getline(infile, line)) { std::istringstream iss(line); std::string polarType; long cls; SigmaParam param; if (!(iss >> polarType >> cls >> param.p1 >> param.p2 >> param.p3 >> param.p4 >> param.p5 >> param.p6)) { std::cerr << "Error parsing line: " << line << std::endl; continue; } if (polarType == "HH") HH_sigmaParam[cls] = param; else if (polarType == "HV") HV_sigmaParam[cls] = param; else if (polarType == "VH") VH_sigmaParam[cls] = param; else if (polarType == "VV") VV_sigmaParam[cls] = param; else std::cerr << "Unknown polarization type: " << polarType << std::endl; } infile.close(); } void SigmaDatabase::writePolarData(std::ofstream& outfile, const std::string& polarType, const std::map& params) { for (const auto& entry : params) { const long cls = entry.first; const SigmaParam& param = entry.second; outfile << polarType << " " << cls << " " << param.p1 << " " << param.p2 << " " << param.p3 << " " << param.p4 << " " << param.p5 << " " << param.p6 << "\n"; } } void SigmaDatabase::writeParamsToFile(const std::string& filename) { std::ofstream outfile(filename); if (!outfile.is_open()) { std::cerr << "Failed to create file: " << filename << std::endl; return; } // 显式调用四次消除重复 writePolarData(outfile, "HH", HH_sigmaParam); writePolarData(outfile, "HV", HV_sigmaParam); writePolarData(outfile, "VH", VH_sigmaParam); writePolarData(outfile, "VV", VV_sigmaParam); outfile.close(); }