227 lines
10 KiB
C++
227 lines
10 KiB
C++
#include "stdafx.h"
|
||
#include "SigmaDatabase.h"
|
||
#include <set>
|
||
#include <map>
|
||
#include "BaseConstVariable.h"
|
||
|
||
struct SigmaParam {
|
||
double p1;
|
||
double p2;
|
||
double p3;
|
||
double p4;
|
||
double p5;
|
||
double p6;
|
||
};
|
||
|
||
|
||
|
||
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<long, SigmaParam>();
|
||
this->HV_sigmaParam = std::map<long, SigmaParam>();
|
||
this->VH_sigmaParam = std::map<long, SigmaParam>();
|
||
this->VV_sigmaParam = std::map<long, SigmaParam>();
|
||
|
||
|
||
this->HH_sigmaParam.clear();
|
||
this->HV_sigmaParam.clear();
|
||
this->VH_sigmaParam.clear();
|
||
this->VV_sigmaParam.clear();
|
||
|
||
//0
|
||
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(0, SigmaParam{ 0,0,0, 0, 0,0 }));
|
||
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(0, SigmaParam{ 0,0,0, 0, 0,0 }));
|
||
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(0, SigmaParam{ 0,0,0, 0, 0,0 }));
|
||
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(0, SigmaParam{ 0,0,0, 0, 0,0 }));
|
||
|
||
//12
|
||
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(12, SigmaParam{ -21.1019701821713, 9.00621457243906, 6.52932182540331, - 1.11157376729893, - 15.8022895411007, 11.4690828129602 }));
|
||
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(12, SigmaParam{ -30.0103645753547, 27.1700862271921, 11.8007376386356, - 0.933835390422269, - 16.4640776105300, 11.8318838032267 }));
|
||
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(12, SigmaParam{ -30.0103645753547, 27.1700862271921, 11.8007376386356, -0.933835390422269, -16.4640776105300, 11.8318838032267 }));
|
||
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(12, SigmaParam{ -21.1019701821713, 9.00621457243906, 6.52932182540331, -1.11157376729893, -15.8022895411007, 11.4690828129602 }));
|
||
|
||
//22
|
||
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(22, SigmaParam{ -43.6677042155964, 32.0245140457417, 0.511060658303930, - 2.68482232690106, 6.29783274559538, 1.96648609622833 }));
|
||
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(22, SigmaParam{ -36.3971634075803, 13.1296247093899, 1.12707368693158, - 1.88195857790977, 6.57450737122974, 2.11755051297951 }));
|
||
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(22, SigmaParam{ -36.3971634075803, 13.1296247093899, 1.12707368693158, -1.88195857790977, 6.57450737122974, 2.11755051297951 }));
|
||
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(22, SigmaParam{ -43.6677042155964, 32.0245140457417, 0.511060658303930, -2.68482232690106, 6.29783274559538, 1.96648609622833 }));
|
||
|
||
//30
|
||
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(30, SigmaParam{ -59.1080014669385, 47.6710707363975, 0.300193452564135, - 3.93463636916976, 5.99799798331127, - 10.3772604045974 }));
|
||
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(30, SigmaParam{ -55.1864353240982, 32.2453149408716, 0.333758208816865, - 3.38774208141056, 6.12774897769798, - 10.1192846531823 }));
|
||
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(30, SigmaParam{ -55.1864353240982, 32.2453149408716, 0.333758208816865, - 3.38774208141056, 6.12774897769798, - 10.1192846531823 }));
|
||
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(30, SigmaParam{ -59.1080014669385, 47.6710707363975, 0.300193452564135, -3.93463636916976, 5.99799798331127, -10.3772604045974 }));
|
||
|
||
//50
|
||
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(50, SigmaParam{ -22.9105602882378, 8170.54100628307, 15.4916054293135, - 0.970580847008280, 28.9025325818511, - 21.4319176514170 }));
|
||
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(50, SigmaParam{ -39.7459019584805, 151.391039247574, 5.17117231380975, - 4.10303899418773, 8.04893424718507, - 3.17171678851531 }));
|
||
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(50, SigmaParam{ -39.7459019584805, 151.391039247574, 5.17117231380975, -4.10303899418773, 8.04893424718507, -3.17171678851531 }));
|
||
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(50, SigmaParam{ -22.9105602882378, 8170.54100628307, 15.4916054293135, -0.970580847008280, 28.9025325818511, -21.4319176514170 }));
|
||
|
||
//61
|
||
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(61, SigmaParam{ 27.2590864500905, 95.6840751800642, 3.98975084647232, 50.3262749621072, 3.09962879546370, - 5.10400310274333 }));
|
||
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(61, SigmaParam{ -65.9799383836613, 106.831320929437, 1.53821651203361, 0.704332523237733, 36.3654715437260, - 13.7449876973719 }));
|
||
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(61, SigmaParam{ -65.9799383836613, 106.831320929437, 1.53821651203361, 0.704332523237733, 36.3654715437260, -13.7449876973719 }));
|
||
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(61, SigmaParam{ 27.2590864500905, 95.6840751800642, 3.98975084647232, 50.3262749621072, 3.09962879546370, -5.10400310274333 }));
|
||
|
||
//62
|
||
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(62, SigmaParam{ -34.3961764495281, 21.7503968763591, 1.15914650010176, - 2.83950292185421, 10.3519995095232, 2.75293811408200 }));
|
||
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(62, SigmaParam{ -34.0710914034599, 14.1778732014224, 3.47049853590805, - 1.73813229616801, 10.9627971440838, 2.19731364578002 }));
|
||
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(62, SigmaParam{ -34.0710914034599, 14.1778732014224, 3.47049853590805, -1.73813229616801, 10.9627971440838, 2.19731364578002 }));
|
||
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(62, SigmaParam{ -34.3961764495281, 21.7503968763591, 1.15914650010176, -2.83950292185421, 10.3519995095232, 2.75293811408200 }));
|
||
|
||
//80
|
||
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(80, SigmaParam{ -5.76486750987210, - 7.80014668607246, 0.0880097904597720, - 5.44564720816575, - 0.530358195545799, 1.04332202699956 }));
|
||
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(80, SigmaParam{ 484.928701445606, - 0.992170190244375, - 1.98914783519718, - 507.127544388772, 0.195180814149377, 6.21339949756719 }));
|
||
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(80, SigmaParam{ 484.928701445606, -0.992170190244375, -1.98914783519718, -507.127544388772, 0.195180814149377, 6.21339949756719 }));
|
||
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(80, SigmaParam{ -5.76486750987210, -7.80014668607246, 0.0880097904597720, -5.44564720816575, -0.530358195545799, 1.04332202699956 }));
|
||
|
||
//90
|
||
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(90, SigmaParam{ -20.1761798059391, 13.2752519275021, 2.74667225608397, 3.63052241744923, 8.99932188120922, 34.8246533269446 }));
|
||
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(90, SigmaParam{ -26.8776515733889, 10.4251866500052, 8.43273666535992, 4.33165922141213, 8.68204389555939, - 2.51718779582920 }));
|
||
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(90, SigmaParam{ -26.8776515733889, 10.4251866500052, 8.43273666535992, 4.33165922141213, 8.68204389555939, - 2.51718779582920 }));
|
||
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(90, SigmaParam{ -20.1761798059391, 13.2752519275021, 2.74667225608397, 3.63052241744923, 8.99932188120922, 34.8246533269446 }));
|
||
}
|
||
|
||
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<long, SigmaParam> 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<long, SigmaParam>();
|
||
}
|
||
}
|
||
|
||
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::writeParamsToFile(const std::string& filename) {
|
||
std::ofstream outfile(filename);
|
||
if (!outfile.is_open()) {
|
||
std::cerr << "Failed to create file: " << filename << std::endl;
|
||
return;
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD>C++11<31><31>lambdaд<61><D0B4>
|
||
auto writePolarData = [&outfile](const std::string& polarType,
|
||
const std::map<long, SigmaParam>& 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";
|
||
}
|
||
};
|
||
|
||
writePolarData("HH", HH_sigmaParam);
|
||
writePolarData("HV", HV_sigmaParam);
|
||
writePolarData("VH", VH_sigmaParam);
|
||
writePolarData("VV", VV_sigmaParam);
|
||
|
||
outfile.close();
|
||
} |