1
0
Fork 0
mirror of https://github.com/gwm17/Specter.git synced 2024-11-22 18:28:52 -05:00

Make MassMap less bad, fix some typos

This commit is contained in:
Gordon McCann 2022-10-01 19:00:48 -04:00
parent c1d0069f80
commit 54a33d5123
3 changed files with 28 additions and 21 deletions

View File

@ -18,18 +18,18 @@ MassMap::MassMap()
std::ifstream massfile("Assets/amdc2016_mass.txt"); std::ifstream massfile("Assets/amdc2016_mass.txt");
if (massfile.is_open()) if (massfile.is_open())
{ {
std::string junk, A, element; std::string junk, element;
int Z; uint32_t Z, A, key;
double atomicMassBig, atomicMassSmall, isotopicMass; double atomicMassBig, atomicMassSmall, isotopicMass;
getline(massfile, junk); getline(massfile, junk);
getline(massfile, junk); getline(massfile, junk);
while (massfile >> junk) while (massfile >> junk)
{ {
massfile >> Z >> A >> element >> atomicMassBig >> atomicMassSmall; massfile >> Z >> A >> element >> atomicMassBig >> atomicMassSmall;
isotopicMass = (atomicMassBig + atomicMassSmall * 1e-6 - Z * electron_mass) * u_to_mev; isotopicMass = (atomicMassBig + atomicMassSmall * 1e-6 - Z * s_eMass) * s_u2MeV;
std::string key = "(" + std::to_string(Z) + "," + A + ")"; key = GenerateID(Z, A);
massTable[key] = isotopicMass; massTable[key] = isotopicMass;
elementTable[Z] = element; elementTable[key] = std::to_string(A) + element;
} }
} }
else else
@ -41,10 +41,10 @@ MassMap::MassMap()
MassMap::~MassMap() {} MassMap::~MassMap() {}
//Returns nuclear mass in MeV //Returns nuclear mass in MeV
double MassMap::FindMass(int Z, int A) double MassMap::FindMass(uint32_t Z, uint32_t A)
{ {
SPEC_PROFILE_FUNCTION(); SPEC_PROFILE_FUNCTION();
std::string key = "(" + std::to_string(Z) + "," + std::to_string(A) + ")"; uint32_t key = GenerateID(Z, A);
auto data = massTable.find(key); auto data = massTable.find(key);
if (data == massTable.end()) if (data == massTable.end())
{ {
@ -55,15 +55,17 @@ double MassMap::FindMass(int Z, int A)
} }
//returns element symbol //returns element symbol
std::string MassMap::FindSymbol(int Z, int A) std::string MassMap::FindSymbol(uint32_t Z, uint32_t A)
{ {
SPEC_PROFILE_FUNCTION(); SPEC_PROFILE_FUNCTION();
auto data = elementTable.find(Z); static std::string nullResult = "";
uint32_t key = GenerateID(Z, A);
auto data = elementTable.find(key);
if (data == elementTable.end()) if (data == elementTable.end())
{ {
SPEC_ERROR("Invalid nucleus at MassMap::FindSymbol()! Z: {0} A: {1}", Z, A); SPEC_ERROR("Invalid nucleus at MassMap::FindSymbol()! Z: {0} A: {1}", Z, A);
return ""; return nullResult;
} }
std::string fullsymbol = std::to_string(A) + data->second; return data->second;
return fullsymbol;
} }

View File

@ -16,16 +16,21 @@ class MassMap
public: public:
MassMap(); MassMap();
~MassMap(); ~MassMap();
double FindMass(int Z, int A); double FindMass(uint32_t Z, uint32_t A);
std::string FindSymbol(int Z, int A); std::string FindSymbol(uint32_t Z, uint32_t A);
private: private:
std::unordered_map<std::string, double> massTable; //As demonstrated elsewhere, using Szudzik pairing function to make unique id for two unsigned ints
std::unordered_map<int, std::string> elementTable; uint32_t GenerateID(uint32_t Z, uint32_t A)
{
return Z >= A ? (Z * Z + Z + A) : (A * A + Z);
}
std::unordered_map<uint32_t, double> massTable;
std::unordered_map<uint32_t, std::string> elementTable;
//constants //constants
static constexpr double u_to_mev = 931.4940954; static constexpr double s_u2MeV = 931.4940954;
static constexpr double electron_mass = 0.000548579909; static constexpr double s_eMass = 0.000548579909;
}; };
#endif #endif

View File

@ -38,12 +38,12 @@ namespace Specter {
//a text file to get detector ID information, detector channel number, etc. //a text file to get detector ID information, detector channel number, etc.
std::vector<std::string> sabre_list; //list of names will allow us to create a summary histogram. std::vector<std::string> sabre_list; //list of names will allow us to create a summary histogram.
uint32_t uuid; uint32_t uuid;
for (uint32_t board = 0; board < 7; board++) for (uint32_t board = 0; board < 8; board++)
{ {
for (uint32_t channel = 0; channel < 16; channel++) for (uint32_t channel = 0; channel < 16; channel++)
{ {
//ImGui & spdlog come prepackaged with the fmt library, so make good use of it! //spdlog comes prepackaged with the fmt library, so make good use of it!
sabre_list.push_back(fmt::format("sabre_%d", board*16 + channel)); sabre_list.push_back(fmt::format("sabre_{}", board*16 + channel));
uuid = Utilities::GetBoardChannelUUID(board, channel); uuid = Utilities::GetBoardChannelUUID(board, channel);
sabre[uuid] = Parameter(sabre_list.back()); sabre[uuid] = Parameter(sabre_list.back());
manager->BindParameter(sabre[uuid]); manager->BindParameter(sabre[uuid]);