1
0
Fork 0
mirror of https://github.com/gwm17/Mask.git synced 2024-11-26 12:08:52 -05:00

Changed name of Kinematics class to MaskApp, better enforced use of scoped RxnType across all applications (see new RxnType.h)

This commit is contained in:
Gordon McCann 2021-10-08 14:17:20 -04:00
parent 6c21c214b4
commit d50a48190e
12 changed files with 273 additions and 177 deletions

View File

@ -30,7 +30,7 @@ private:
DetectorResult IsRing2(Mask::Nucleus& nucleus); DetectorResult IsRing2(Mask::Nucleus& nucleus);
DetectorResult IsQQQ(Mask::Nucleus& nucleus); DetectorResult IsQQQ(Mask::Nucleus& nucleus);
DetectorResult IsAnasen(Mask::Nucleus& nucleus); DetectorResult IsAnasen(Mask::Nucleus& nucleus);
void CountCoincidences(const Mask::MaskFileData& data, std::vector<int>& counts, int rxn_type); void CountCoincidences(const Mask::MaskFileData& data, std::vector<int>& counts, Mask::RxnType rxn_type);
std::vector<StripDetector> m_Ring1, m_Ring2; std::vector<StripDetector> m_Ring1, m_Ring2;
std::vector<QQQDetector> m_forwardQQQs; std::vector<QQQDetector> m_forwardQQQs;

View File

@ -1,47 +0,0 @@
#ifndef KINEMATICS_H
#define KINEMATICS_H
#include "ReactionSystem.h"
#include "DecaySystem.h"
#include "OneStepSystem.h"
#include "TwoStepSystem.h"
#include "ThreeStepSystem.h"
namespace Mask {
class Kinematics {
public:
Kinematics();
~Kinematics();
bool LoadConfig(const std::string& filename);
bool SaveConfig(const std::string& filename);
inline int GetNumberOfSamples() { return m_nsamples; };
inline const std::string GetSystemName() { return sys == nullptr ? "" : sys->GetSystemEquation(); };
inline const std::string GetOutputName() { return m_outfile_name; };
inline const int GetReactionType() { return m_rxn_type; };
void Run();
enum RxnType {
ONESTEP_DECAY,
ONESTEP_RXN,
TWOSTEP,
THREESTEP
};
private:
void RunOneStepRxn();
void RunOneStepDecay();
void RunTwoStep();
void RunThreeStep();
ReactionSystem* sys;
std::string m_outfile_name;
int m_rxn_type, m_nsamples;
};
}
#endif

42
include/MaskApp.h Normal file
View File

@ -0,0 +1,42 @@
#ifndef MASKAPP_H
#define MASKAPP_H
#include "ReactionSystem.h"
#include "DecaySystem.h"
#include "OneStepSystem.h"
#include "TwoStepSystem.h"
#include "ThreeStepSystem.h"
#include "RxnType.h"
namespace Mask {
class MaskApp {
public:
MaskApp();
~MaskApp();
bool LoadConfig(const std::string& filename);
bool SaveConfig(const std::string& filename);
inline int GetNumberOfSamples() const { return m_nsamples; };
inline const std::string GetSystemName() const { return sys == nullptr ? "" : sys->GetSystemEquation(); };
inline const std::string GetOutputName() const { return m_outfile_name; };
inline const RxnType GetReactionType() const { return m_rxn_type; };
void Run();
private:
void RunOneStepRxn();
void RunOneStepDecay();
void RunTwoStep();
void RunThreeStep();
ReactionSystem* sys;
std::string m_outfile_name;
RxnType m_rxn_type;
uint64_t m_nsamples;
};
}
#endif

View File

@ -6,11 +6,12 @@
#include <vector> #include <vector>
#include "Nucleus.h" #include "Nucleus.h"
#include "RxnType.h"
namespace Mask { namespace Mask {
struct MaskFileHeader { struct MaskFileHeader {
int rxn_type = -1; RxnType rxn_type = RxnType::None;
int nsamples = -1; int nsamples = -1;
}; };
@ -36,7 +37,7 @@ namespace Mask {
inline bool IsOpen() { return file.is_open(); } inline bool IsOpen() { return file.is_open(); }
void Close(); void Close();
void WriteHeader(int rxn_type, int nsamples); void WriteHeader(RxnType rxn_type, int nsamples);
void WriteData(std::vector<Nucleus>& data); void WriteData(std::vector<Nucleus>& data);
void WriteData(MaskFileData& data); void WriteData(MaskFileData& data);
MaskFileHeader ReadHeader(); MaskFileHeader ReadHeader();
@ -51,7 +52,7 @@ namespace Mask {
unsigned int buffer_position; unsigned int buffer_position;
unsigned int buffer_end; unsigned int buffer_end;
unsigned int data_size; unsigned int data_size;
int m_rxn_type; RxnType m_rxn_type;
int buffersize_bytes; int buffersize_bytes;
std::fstream file; std::fstream file;

58
include/RxnType.h Normal file
View File

@ -0,0 +1,58 @@
#ifndef RXNTYPE_H
#define RXNTYPE_H
#include <string>
namespace Mask {
enum class RxnType
{
PureDecay=0,
OneStepRxn=1,
TwoStepRxn=2,
ThreeStepRxn=3,
None=4
};
static RxnType GetRxnTypeFromString(const std::string& type_str)
{
if (type_str == "PureDecay")
return RxnType::PureDecay;
else if (type_str == "OneStepRxn")
return RxnType::OneStepRxn;
else if (type_str == "TwoStepRxn")
return RxnType::TwoStepRxn;
else if (type_str == "ThreeStepRxn")
return RxnType::ThreeStepRxn;
else
return RxnType::None;
}
static std::string GetStringFromRxnType(RxnType type)
{
switch(type)
{
case RxnType::PureDecay: return "PureDecay";
case RxnType::OneStepRxn: return "OneStepRxn";
case RxnType::TwoStepRxn: return "TwoStepRxn";
case RxnType::ThreeStepRxn: return "ThreeStepRxn";
}
return "None";
}
static RxnType GetRxnTypeFromInt(uint32_t value)
{
return static_cast<RxnType>(value);
}
static uint32_t GetIntFromRxnType(RxnType type)
{
return static_cast<uint32_t>(type);
}
}
#endif

View File

@ -1,9 +1,7 @@
----------Data Information---------- ----------Data Information----------
OutputFile: /media/gordon/ANASENData/MaskData/Kinematics/7Bedp_870keV_beam_50CD2.mask OutputFile: /media/gordon/ANASENData/MaskData/Kinematics/7Bedp_870keV_beam_50CD2_test.mask
SaveTree: yes
SavePlots: yes
----------Reaction Information---------- ----------Reaction Information----------
ReactionType: 2 ReactionType: TwoStepRxn
Z A (order is target, projectile, ejectile, break1, break3(if pure decay is target, ejectile)) Z A (order is target, projectile, ejectile, break1, break3(if pure decay is target, ejectile))
1 2 1 2
4 7 4 7

View File

@ -1,5 +1,4 @@
#include "AnasenEfficiency.h" #include "AnasenEfficiency.h"
#include "Kinematics.h"
#include <fstream> #include <fstream>
#include <iomanip> #include <iomanip>
@ -321,16 +320,16 @@ DetectorResult AnasenEfficiency::IsAnasen(Mask::Nucleus& nucleus) {
return result; return result;
} }
void AnasenEfficiency::CountCoincidences(const Mask::MaskFileData& data, std::vector<int>& counts, int rxn_type) { void AnasenEfficiency::CountCoincidences(const Mask::MaskFileData& data, std::vector<int>& counts, Mask::RxnType rxn_type) {
if (rxn_type == 0 && data.detect_flag[1] && data.detect_flag[2]) if (rxn_type == Mask::RxnType::PureDecay && data.detect_flag[1] && data.detect_flag[2])
{ {
counts[0]++; counts[0]++;
} }
else if (rxn_type == 1 && data.detect_flag[2] && data.detect_flag[3]) else if (rxn_type == Mask::RxnType::OneStepRxn && data.detect_flag[2] && data.detect_flag[3])
{ {
counts[0]++; counts[0]++;
} }
else if(rxn_type == 2) else if(rxn_type == Mask::RxnType::TwoStepRxn)
{ {
if(data.detect_flag[2] && data.detect_flag[4]) if(data.detect_flag[2] && data.detect_flag[4])
{ {
@ -349,7 +348,7 @@ void AnasenEfficiency::CountCoincidences(const Mask::MaskFileData& data, std::ve
counts[3]++; counts[3]++;
} }
} }
else if(rxn_type == 3) else if(rxn_type == Mask::RxnType::ThreeStepRxn)
{ {
if(data.detect_flag[2] && data.detect_flag[4]) if(data.detect_flag[2] && data.detect_flag[4])
{ {
@ -418,25 +417,25 @@ void AnasenEfficiency::CalculateEfficiency(const std::string& inputname, const s
std::vector<int> counts; std::vector<int> counts;
std::vector<int> coinc_counts; std::vector<int> coinc_counts;
switch(header.rxn_type) { switch(header.rxn_type) {
case 0: case Mask::RxnType::PureDecay:
counts.resize(3, 0); counts.resize(3, 0);
coinc_counts.resize(1, 0); coinc_counts.resize(1, 0);
break; break;
case 1: case Mask::RxnType::OneStepRxn:
counts.resize(4, 0); counts.resize(4, 0);
coinc_counts.resize(1, 0); coinc_counts.resize(1, 0);
break; break;
case 2: case Mask::RxnType::TwoStepRxn:
counts.resize(6, 0); counts.resize(6, 0);
coinc_counts.resize(4, 0); coinc_counts.resize(4, 0);
break; break;
case 3: case Mask::RxnType::ThreeStepRxn:
counts.resize(8, 0); counts.resize(8, 0);
coinc_counts.resize(11, 0); coinc_counts.resize(11, 0);
break; break;
default: default:
{ {
std::cerr<<"Bad reaction type at AnasenEfficiency::CalculateEfficiency (given value: "<<header.rxn_type<<"). Quiting..."<<std::endl; std::cerr<<"Bad reaction type at AnasenEfficiency::CalculateEfficiency (given value: "<<GetStringFromRxnType(header.rxn_type)<<"). Quiting..."<<std::endl;
input.Close(); input.Close();
output.Close(); output.Close();
stats.close(); stats.close();
@ -494,17 +493,17 @@ void AnasenEfficiency::CalculateEfficiency(const std::string& inputname, const s
} }
stats<<"Coincidence Efficiency"<<std::endl; stats<<"Coincidence Efficiency"<<std::endl;
stats<<"---------------------"<<std::endl; stats<<"---------------------"<<std::endl;
if(header.rxn_type == 0) if(header.rxn_type == Mask::RxnType::PureDecay)
{ {
stats<<std::setw(10)<<"1 + 2"<<"|"<<std::setw(10)<<((double)coinc_counts[0]/header.nsamples)<<std::endl; stats<<std::setw(10)<<"1 + 2"<<"|"<<std::setw(10)<<((double)coinc_counts[0]/header.nsamples)<<std::endl;
stats<<"---------------------"<<std::endl; stats<<"---------------------"<<std::endl;
} }
else if(header.rxn_type == 1) else if(header.rxn_type == Mask::RxnType::OneStepRxn)
{ {
stats<<std::setw(10)<<"2 + 3"<<"|"<<std::setw(10)<<((double)coinc_counts[0]/header.nsamples)<<std::endl; stats<<std::setw(10)<<"2 + 3"<<"|"<<std::setw(10)<<((double)coinc_counts[0]/header.nsamples)<<std::endl;
stats<<"---------------------"<<std::endl; stats<<"---------------------"<<std::endl;
} }
else if(header.rxn_type == 2) else if(header.rxn_type == Mask::RxnType::TwoStepRxn)
{ {
stats<<std::setw(10)<<"2 + 4"<<"|"<<std::setw(10)<<((double)coinc_counts[0]/header.nsamples)<<std::endl; stats<<std::setw(10)<<"2 + 4"<<"|"<<std::setw(10)<<((double)coinc_counts[0]/header.nsamples)<<std::endl;
stats<<"---------------------"<<std::endl; stats<<"---------------------"<<std::endl;
@ -515,7 +514,7 @@ void AnasenEfficiency::CalculateEfficiency(const std::string& inputname, const s
stats<<std::setw(10)<<"2 + 4 + 5"<<"|"<<std::setw(10)<<((double)coinc_counts[3]/header.nsamples)<<std::endl; stats<<std::setw(10)<<"2 + 4 + 5"<<"|"<<std::setw(10)<<((double)coinc_counts[3]/header.nsamples)<<std::endl;
stats<<"---------------------"<<std::endl; stats<<"---------------------"<<std::endl;
} }
else if(header.rxn_type == 3) else if(header.rxn_type == Mask::RxnType::ThreeStepRxn)
{ {
stats<<std::setw(10)<<"2 + 4"<<"|"<<std::setw(10)<<((double)coinc_counts[0]/header.nsamples)<<std::endl; stats<<std::setw(10)<<"2 + 4"<<"|"<<std::setw(10)<<((double)coinc_counts[0]/header.nsamples)<<std::endl;
stats<<"---------------------"<<std::endl; stats<<"---------------------"<<std::endl;

View File

@ -53,21 +53,21 @@ void SabreEfficiency::CalculateEfficiency(const std::string& inputname, const st
std::vector<int> counts; std::vector<int> counts;
switch(header.rxn_type) { switch(header.rxn_type) {
case 0: case Mask::RxnType::PureDecay:
counts.resize(3, 0); counts.resize(3, 0);
break; break;
case 1: case Mask::RxnType::OneStepRxn:
counts.resize(4, 0); counts.resize(4, 0);
break; break;
case 2: case Mask::RxnType::TwoStepRxn:
counts.resize(6, 0); counts.resize(6, 0);
break; break;
case 3: case Mask::RxnType::ThreeStepRxn:
counts.resize(8, 0); counts.resize(8, 0);
break; break;
default: default:
{ {
std::cerr<<"Bad reaction type at AnasenEfficiency::CalculateEfficiency (given value: "<<header.rxn_type<<"). Quiting..."<<std::endl; std::cerr<<"Bad reaction type at AnasenEfficiency::CalculateEfficiency (given value: "<<GetStringFromRxnType(header.rxn_type)<<"). Quiting..."<<std::endl;
input.Close(); input.Close();
output.Close(); output.Close();
stats.close(); stats.close();

View File

@ -1,46 +1,49 @@
#include "Kinematics.h" #include "MaskApp.h"
#include "MaskFile.h" #include "MaskFile.h"
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
namespace Mask { namespace Mask {
Kinematics::Kinematics() : MaskApp::MaskApp() :
sys(nullptr) sys(nullptr)
{ {
std::cout<<"----------GWM Kinematics Simulation----------"<<std::endl; std::cout<<"----------GWM Kinematics Simulation----------"<<std::endl;
} }
Kinematics::~Kinematics() { MaskApp::~MaskApp()
{
if(sys) delete sys; if(sys) delete sys;
} }
bool Kinematics::LoadConfig(const std::string& filename) { bool MaskApp::LoadConfig(const std::string& filename)
{
std::cout<<"Loading configuration in "<<filename<<"..."<<std::endl; std::cout<<"Loading configuration in "<<filename<<"..."<<std::endl;
std::ifstream input(filename); std::ifstream input(filename);
if(!input.is_open()) { if(!input.is_open())
{
return false; return false;
} }
std::string junk; std::string junk;
getline(input, junk); getline(input, junk);
input>>junk>>m_outfile_name; input>>junk>>m_outfile_name;
input>>junk>>junk;
input>>junk>>junk;
std::vector<int> avec, zvec, svec; std::vector<int> avec, zvec, svec;
int z, a, s; int z, a, s;
getline(input, junk); getline(input, junk);
getline(input, junk); getline(input, junk);
input>>junk>>m_rxn_type; input>>junk>>junk;
m_rxn_type = GetRxnTypeFromString(junk);
getline(input, junk); getline(input, junk);
getline(input, junk); getline(input, junk);
switch(m_rxn_type) { switch(m_rxn_type)
case 0: {
case RxnType::PureDecay:
{ {
sys = new DecaySystem(); sys = new DecaySystem();
m_rxn_type = ONESTEP_DECAY; m_rxn_type = RxnType::PureDecay;
for(int i=0; i<2; i++) { for(int i=0; i<2; i++) {
input>>z>>a; input>>z>>a;
avec.push_back(a); avec.push_back(a);
@ -48,10 +51,10 @@ namespace Mask {
} }
break; break;
} }
case 1: case RxnType::OneStepRxn:
{ {
sys = new OneStepSystem(); sys = new OneStepSystem();
m_rxn_type = ONESTEP_RXN; m_rxn_type = RxnType::OneStepRxn;
for(int i=0; i<3; i++) { for(int i=0; i<3; i++) {
input>>z>>a; input>>z>>a;
avec.push_back(a); avec.push_back(a);
@ -59,10 +62,10 @@ namespace Mask {
} }
break; break;
} }
case 2: case RxnType::TwoStepRxn:
{ {
sys = new TwoStepSystem(); sys = new TwoStepSystem();
m_rxn_type = TWOSTEP; m_rxn_type = RxnType::TwoStepRxn;
for(int i=0; i<4; i++) { for(int i=0; i<4; i++) {
input>>z>>a; input>>z>>a;
avec.push_back(a); avec.push_back(a);
@ -70,10 +73,10 @@ namespace Mask {
} }
break; break;
} }
case 3: case RxnType::ThreeStepRxn:
{ {
sys = new ThreeStepSystem(); sys = new ThreeStepSystem();
m_rxn_type = THREESTEP; m_rxn_type = RxnType::TwoStepRxn;
for(int i=0; i<5; i++) { for(int i=0; i<5; i++) {
input>>z>>a; input>>z>>a;
avec.push_back(a); avec.push_back(a);
@ -92,7 +95,8 @@ namespace Mask {
getline(input, junk); getline(input, junk);
input>>junk>>junk; input>>junk>>junk;
input>>junk>>nlayers; input>>junk>>nlayers;
for(int i=0; i<nlayers; i++) { for(int i=0; i<nlayers; i++)
{
input>>junk>>junk>>thickness; input>>junk>>junk>>thickness;
getline(input, junk); getline(input, junk);
getline(input, junk); getline(input, junk);
@ -116,18 +120,19 @@ namespace Mask {
input>>junk>>par1>>junk>>par2; input>>junk>>par1>>junk>>par2;
sys->SetBeamDistro(par1, par2); sys->SetBeamDistro(par1, par2);
input>>junk>>par1; input>>junk>>par1;
switch(m_rxn_type) { switch(m_rxn_type)
case ONESTEP_RXN : {
case RxnType::OneStepRxn :
{ {
dynamic_cast<OneStepSystem*>(sys)->SetReactionThetaType(par1); dynamic_cast<OneStepSystem*>(sys)->SetReactionThetaType(par1);
break; break;
} }
case TWOSTEP: case RxnType::TwoStepRxn :
{ {
dynamic_cast<TwoStepSystem*>(sys)->SetReactionThetaType(par1); dynamic_cast<TwoStepSystem*>(sys)->SetReactionThetaType(par1);
break; break;
} }
case THREESTEP: case RxnType::ThreeStepRxn :
{ {
dynamic_cast<ThreeStepSystem*>(sys)->SetReactionThetaType(par1); dynamic_cast<ThreeStepSystem*>(sys)->SetReactionThetaType(par1);
break; break;
@ -141,8 +146,9 @@ namespace Mask {
sys->SetExcitationDistro(par1, par2); sys->SetExcitationDistro(par1, par2);
input>>junk>>dfile1; input>>junk>>dfile1;
input>>junk>>dfile2; input>>junk>>dfile2;
switch(m_rxn_type) { switch(m_rxn_type)
case ONESTEP_DECAY: {
case RxnType::OneStepRxn :
{ {
DecaySystem* this_sys = dynamic_cast<DecaySystem*>(sys); DecaySystem* this_sys = dynamic_cast<DecaySystem*>(sys);
this_sys->SetDecay1Distribution(dfile1); this_sys->SetDecay1Distribution(dfile1);
@ -150,7 +156,7 @@ namespace Mask {
std::cout<<"Decay1 total branching ratio: "<<this_sys->GetDecay1BranchingRatio()<<std::endl; std::cout<<"Decay1 total branching ratio: "<<this_sys->GetDecay1BranchingRatio()<<std::endl;
break; break;
} }
case TWOSTEP: case RxnType::TwoStepRxn :
{ {
TwoStepSystem* this_sys = dynamic_cast<TwoStepSystem*>(sys); TwoStepSystem* this_sys = dynamic_cast<TwoStepSystem*>(sys);
this_sys->SetDecay1Distribution(dfile1); this_sys->SetDecay1Distribution(dfile1);
@ -158,7 +164,7 @@ namespace Mask {
std::cout<<"Decay1 total branching ratio: "<<this_sys->GetDecay1BranchingRatio()<<std::endl; std::cout<<"Decay1 total branching ratio: "<<this_sys->GetDecay1BranchingRatio()<<std::endl;
break; break;
} }
case THREESTEP: case RxnType::ThreeStepRxn :
{ {
ThreeStepSystem* this_sys = dynamic_cast<ThreeStepSystem*>(sys); ThreeStepSystem* this_sys = dynamic_cast<ThreeStepSystem*>(sys);
this_sys->SetDecay1Distribution(dfile1); this_sys->SetDecay1Distribution(dfile1);
@ -174,27 +180,28 @@ namespace Mask {
return true; return true;
} }
bool Kinematics::SaveConfig(const std::string& filename) { return true; } bool MaskApp::SaveConfig(const std::string& filename) { return true; }
void Kinematics::Run() { void MaskApp::Run() {
std::cout<<"Running simulation..."<<std::endl; std::cout<<"Running simulation..."<<std::endl;
switch(m_rxn_type) { switch(m_rxn_type)
case ONESTEP_DECAY: {
case RxnType::PureDecay :
{ {
RunOneStepDecay(); RunOneStepDecay();
break; break;
} }
case ONESTEP_RXN: case RxnType::OneStepRxn :
{ {
RunOneStepRxn(); RunOneStepRxn();
break; break;
} }
case TWOSTEP: case RxnType::TwoStepRxn :
{ {
RunTwoStep(); RunTwoStep();
break; break;
} }
case THREESTEP: case RxnType::ThreeStepRxn :
{ {
RunThreeStep(); RunThreeStep();
break; break;
@ -205,9 +212,10 @@ namespace Mask {
std::cout<<"---------------------------------------------"<<std::endl; std::cout<<"---------------------------------------------"<<std::endl;
} }
void Kinematics::RunOneStepRxn() { void MaskApp::RunOneStepRxn() {
OneStepSystem* this_sys = dynamic_cast<OneStepSystem*>(sys); OneStepSystem* this_sys = dynamic_cast<OneStepSystem*>(sys);
if(this_sys == nullptr) { if(this_sys == nullptr)
{
return; return;
} }
@ -218,12 +226,14 @@ namespace Mask {
//For progress tracking //For progress tracking
int percent5 = 0.05*m_nsamples; uint64_t percent5 = 0.05*m_nsamples;
int count = 0; uint64_t count = 0;
int npercent = 0; uint64_t npercent = 0;
for(int i=0; i<m_nsamples; i++) { for(uint64_t i=0; i<m_nsamples; i++)
if(++count == percent5) {//Show update every 5 percent {
if(++count == percent5)
{//Show update every 5 percent
npercent++; npercent++;
count = 0; count = 0;
std::cout<<"\rPercent complete: "<<npercent*5<<"%"<<std::flush; std::cout<<"\rPercent complete: "<<npercent*5<<"%"<<std::flush;
@ -241,9 +251,10 @@ namespace Mask {
output.Close(); output.Close();
} }
void Kinematics::RunOneStepDecay() { void MaskApp::RunOneStepDecay() {
DecaySystem* this_sys = dynamic_cast<DecaySystem*>(sys); DecaySystem* this_sys = dynamic_cast<DecaySystem*>(sys);
if(this_sys == nullptr) { if(this_sys == nullptr)
{
return; return;
} }
@ -253,12 +264,14 @@ namespace Mask {
output.WriteHeader(m_rxn_type, m_nsamples); output.WriteHeader(m_rxn_type, m_nsamples);
//For progress tracking //For progress tracking
int percent5 = 0.05*m_nsamples; uint64_t percent5 = 0.05*m_nsamples;
int count = 0; uint64_t count = 0;
int npercent = 0; uint64_t npercent = 0;
for(int i=0; i<m_nsamples; i++) { for(uint64_t i=0; i<m_nsamples; i++)
if(++count == percent5) {//Show update every 5 percent {
if(++count == percent5)
{
npercent++; npercent++;
count = 0; count = 0;
std::cout<<"\rPercent complete: "<<npercent*5<<"%"<<std::flush; std::cout<<"\rPercent complete: "<<npercent*5<<"%"<<std::flush;
@ -274,10 +287,11 @@ namespace Mask {
output.Close(); output.Close();
} }
void Kinematics::RunTwoStep() { void MaskApp::RunTwoStep() {
TwoStepSystem* this_sys = dynamic_cast<TwoStepSystem*>(sys); TwoStepSystem* this_sys = dynamic_cast<TwoStepSystem*>(sys);
if(this_sys == nullptr) { if(this_sys == nullptr)
{
return; return;
} }
@ -287,12 +301,14 @@ namespace Mask {
output.WriteHeader(m_rxn_type, m_nsamples); output.WriteHeader(m_rxn_type, m_nsamples);
//For progress tracking //For progress tracking
int percent5 = 0.05*m_nsamples; uint64_t percent5 = 0.05*m_nsamples;
int count = 0; uint64_t count = 0;
int npercent = 0; uint64_t npercent = 0;
for(int i=0; i<m_nsamples; i++) { for(uint64_t i=0; i<m_nsamples; i++)
if(++count == percent5) {//Show update every 5 percent {
if(++count == percent5)
{
npercent++; npercent++;
count = 0; count = 0;
std::cout<<"\rPercent complete: "<<npercent*5<<"%"<<std::flush; std::cout<<"\rPercent complete: "<<npercent*5<<"%"<<std::flush;
@ -311,10 +327,11 @@ namespace Mask {
output.Close(); output.Close();
} }
void Kinematics::RunThreeStep() { void MaskApp::RunThreeStep() {
ThreeStepSystem* this_sys = dynamic_cast<ThreeStepSystem*>(sys); ThreeStepSystem* this_sys = dynamic_cast<ThreeStepSystem*>(sys);
if(this_sys == nullptr) { if(this_sys == nullptr)
{
return; return;
} }
@ -324,12 +341,14 @@ namespace Mask {
output.WriteHeader(m_rxn_type, m_nsamples); output.WriteHeader(m_rxn_type, m_nsamples);
//For progress updating //For progress updating
int percent5 = 0.05*m_nsamples; uint64_t percent5 = 0.05*m_nsamples;
int count = 0; uint64_t count = 0;
int npercent = 0; uint64_t npercent = 0;
for(int i=0; i<m_nsamples; i++) { for(uint64_t i=0; i<m_nsamples; i++)
if(++count == percent5) {//Show update every 5 percent {
if(++count == percent5)
{
npercent++; npercent++;
count = 0; count = 0;
std::cout<<"\rPercent complete: "<<npercent*5<<"%"<<std::flush; std::cout<<"\rPercent complete: "<<npercent*5<<"%"<<std::flush;

View File

@ -64,33 +64,45 @@ namespace Mask {
file.close(); file.close();
} }
void MaskFile::WriteHeader(int rxn_type, int nsamples) { void MaskFile::WriteHeader(RxnType rxn_type, int nsamples) {
//size of a datum = data nuclei per event * (# doubles per nucleus * sizeof double + # ints per nucleus * sizeof int + sizeof bool)
if(rxn_type == 0) { m_rxn_type = rxn_type;
m_rxn_type = 0; switch(rxn_type)
{
case RxnType::PureDecay :
{
data_size = 3 * ( 5 * double_size + 2 * int_size + bool_size); data_size = 3 * ( 5 * double_size + 2 * int_size + bool_size);
break;
} }
else if (rxn_type == 1) { case RxnType::OneStepRxn :
m_rxn_type = 1; {
data_size = 4 * ( 5 * double_size + 2 * int_size + bool_size); data_size = 4 * ( 5 * double_size + 2 * int_size + bool_size);
break;
} }
else if (rxn_type == 2) { case RxnType::TwoStepRxn :
m_rxn_type = 2; {
data_size = 6 * ( 5 * double_size + 2 * int_size + bool_size); data_size = 6 * ( 5 * double_size + 2 * int_size + bool_size);
break;
} }
else if (rxn_type == 3) { case RxnType::ThreeStepRxn :
m_rxn_type = 3; {
data_size = 8 * ( 5 * double_size + 2 * int_size + bool_size); data_size = 8 * ( 5 * double_size + 2 * int_size + bool_size);
} else { break;
std::cerr<<"Invalid number of nuclei at MaskFile::WriteHeader! Returning"<<std::endl; }
case RxnType::None :
{
std::cerr<<"Invalid RxnType at MaskFile::WriteHeader!"<<std::endl;
return; return;
} }
}
buffersize_bytes = buffersize * data_size; //buffersize_bytes = # of events * size of an event buffersize_bytes = buffersize * data_size; //buffersize_bytes = # of events * size of an event
data_buffer.resize(buffersize_bytes); data_buffer.resize(buffersize_bytes);
uint32_t type_value = GetIntFromRxnType(m_rxn_type);
file.write((char*) &nsamples, int_size); file.write((char*) &nsamples, int_size);
file.write((char*) &m_rxn_type, int_size); file.write((char*) &type_value, int_size);
} }
MaskFileHeader MaskFile::ReadHeader() { MaskFileHeader MaskFile::ReadHeader() {
@ -99,24 +111,38 @@ namespace Mask {
file.read(temp_buffer.data(), 4); file.read(temp_buffer.data(), 4);
header.nsamples = *(int*)(&temp_buffer[0]); header.nsamples = *(int*)(&temp_buffer[0]);
file.read(temp_buffer.data(), 4); file.read(temp_buffer.data(), 4);
m_rxn_type = *(int*)(&temp_buffer[0]); uint32_t type_value = *(uint32_t*)(&temp_buffer[0]);
m_rxn_type = GetRxnTypeFromInt(type_value);
//size of a datum = data nuclei per event * (# doubles per nucleus * sizeof double + # ints per nucleus * sizeof int + sizeof bool) switch(m_rxn_type)
if(m_rxn_type == 0) { {
case RxnType::PureDecay:
{
data_size = 3 * ( 5 * double_size + 2 * int_size + bool_size); data_size = 3 * ( 5 * double_size + 2 * int_size + bool_size);
break;
} }
else if (m_rxn_type == 1) { case RxnType::OneStepRxn:
{
data_size = 4 * ( 5 * double_size + 2 * int_size + bool_size); data_size = 4 * ( 5 * double_size + 2 * int_size + bool_size);
break;
} }
else if (m_rxn_type == 2) { case RxnType::TwoStepRxn:
{
data_size = 6 * ( 5 * double_size + 2 * int_size + bool_size); data_size = 6 * ( 5 * double_size + 2 * int_size + bool_size);
break;
} }
else if (m_rxn_type == 3) { case RxnType::ThreeStepRxn:
{
data_size = 8 * ( 5 * double_size + 2 * int_size + bool_size); data_size = 8 * ( 5 * double_size + 2 * int_size + bool_size);
} else { break;
std::cerr<<"Unexpected reaction type at MaskFile::ReadHeader (rxn type = "<<m_rxn_type<<")! Returning"<<std::endl; }
case RxnType::None:
{
std::cerr<<"Unexpected reaction type at MaskFile::ReadHeader (rxn type = "<<GetIntFromRxnType(m_rxn_type)<<")! Returning"<<std::endl;
return header; return header;
} }
}
buffersize_bytes = buffersize * data_size;//buffersize_bytes = size of a datum * # of events buffersize_bytes = buffersize * data_size;//buffersize_bytes = size of a datum * # of events
header.rxn_type = m_rxn_type; header.rxn_type = m_rxn_type;

View File

@ -98,7 +98,7 @@ int main(int argc, char** argv) {
Mask::MaskFileHeader header = input.ReadHeader(); Mask::MaskFileHeader header = input.ReadHeader();
std::cout<<"File Header -- rxn type: "<<header.rxn_type<<" nsamples: "<<header.nsamples<<std::endl; std::cout<<"File Header -- rxn type: "<<GetStringFromRxnType(header.rxn_type)<<" nsamples: "<<header.nsamples<<std::endl;
Mask::MaskFileData data; Mask::MaskFileData data;
Mask::Nucleus nucleus; Mask::Nucleus nucleus;

View File

@ -2,7 +2,7 @@
#include <string> #include <string>
#include "Stopwatch.h" #include "Stopwatch.h"
#include "MaskFile.h" #include "MaskFile.h"
#include "Kinematics.h" #include "MaskApp.h"
#include "KinematicsExceptions.h" #include "KinematicsExceptions.h"
int main(int argc, char** argv) { int main(int argc, char** argv) {
@ -13,7 +13,7 @@ int main(int argc, char** argv) {
Stopwatch sw; Stopwatch sw;
Mask::Kinematics calculator; Mask::MaskApp calculator;
sw.Start(); sw.Start();
try { try {
if(!calculator.LoadConfig(argv[1])) { if(!calculator.LoadConfig(argv[1])) {
@ -33,7 +33,7 @@ int main(int argc, char** argv) {
Mask::MaskFileData data; Mask::MaskFileData data;
Mask::MaskFileHeader header = input.ReadHeader(); Mask::MaskFileHeader header = input.ReadHeader();
std::cout<<"Header Found -- rxn type: "<<header.rxn_type<<" nsamples: "<<header.nsamples; std::cout<<"Header Found -- rxn type: "<<GetStringFromRxnType(header.rxn_type)<<" nsamples: "<<header.nsamples;
std::cout<<std::endl; std::cout<<std::endl;
int counter=0; int counter=0;