1
0
Fork 0
mirror of https://github.com/gwm17/Specter.git synced 2024-11-26 12:18:51 -05:00

Added in instrumentation classes for generating json files. Will allow for more complete profiling (at least as a start).

This commit is contained in:
Gordon McCann 2022-05-08 15:51:17 -04:00
parent 6cb8536c3c
commit d789a5d6d5
24 changed files with 356 additions and 8 deletions

1
.gitignore vendored
View File

@ -9,6 +9,7 @@ Makefile
*.sln
*.vcxproj
*.vcxproj.filters
*.json
Navigator/Makefile
NavProject/Makefile

View File

@ -14,6 +14,7 @@
*/
MassMap::MassMap()
{
NAV_PROFILE_FUNCTION();
std::ifstream massfile("Assets/amdc2016_mass.txt");
if (massfile.is_open())
{
@ -42,6 +43,7 @@ MassMap::~MassMap() {}
//Returns nuclear mass in MeV
double MassMap::FindMass(int Z, int A)
{
NAV_PROFILE_FUNCTION();
std::string key = "(" + std::to_string(Z) + "," + std::to_string(A) + ")";
auto data = massTable.find(key);
if (data == massTable.end())
@ -55,6 +57,7 @@ double MassMap::FindMass(int Z, int A)
//returns element symbol
std::string MassMap::FindSymbol(int Z, int A)
{
NAV_PROFILE_FUNCTION();
auto data = elementTable.find(Z);
if (data == elementTable.end())
{

View File

@ -13,6 +13,7 @@ namespace Navigator {
AnalysisStage("SPSAnalysis"), delayFLTime("delayFLTime"), delayFRTime("delayFRTime"), delayBLTime("delayBLTime"), delayBRTime("delayBRTime"), x1("x1"), x2("x2"), xavg("xavg"),
scintLeft("scintLeft"), anodeBack("anodeBack"), cathode("cathode"), xavg_sabreCoinc("xavg_sabreCoinc"), x1_weight("x1_weight"), x2_weight("x2_weight")
{
NAV_PROFILE_FUNCTION();
SpectrumManager& manager = SpectrumManager::GetInstance();
manager.BindParameter(delayFLTime);
manager.BindParameter(delayFRTime);
@ -49,6 +50,7 @@ namespace Navigator {
void SPSAnalysisStage::AnalyzePhysicsEvent(const NavEvent& event)
{
NAV_PROFILE_FUNCTION();
//Most analysis stages will start kinda like this. Take the raw event data and
//put it into NavParameters using the hit id. Switches are perfect for this. Can also
//create mapping classes to use text-file-based id association (commonly called channel maps).

View File

@ -45,6 +45,7 @@ namespace Navigator {
void SPSInputLayer::OnImGuiRender()
{
NAV_PROFILE_FUNCTION();
if (ImGui::Begin("SPS Input"))
{
//Create widgets for all of our inputs
@ -73,6 +74,7 @@ namespace Navigator {
void SPSInputLayer::UpdateWeights()
{
NAV_PROFILE_FUNCTION();
m_rxnEqn = ""; //reset
//Calculate residual nucleus from reaction

View File

@ -30,9 +30,15 @@ int main(int argc, const char** argv)
Navigator::Logger::Init();
NAV_TRACE("Logger Initialized!");
NAV_PROFILE_BEGIN_SESSION("Startup", "navprofile_startup.json");
auto app = Navigator::CreateApplication();
NAV_PROFILE_END_SESSION();
NAV_PROFILE_BEGIN_SESSION("Runtime", "navprofile_runtime.json");
app->Run();
NAV_PROFILE_END_SESSION();
NAV_PROFILE_BEGIN_SESSION("Shutdown", "navprofile_shutdown.json");
delete app;
NAV_PROFILE_END_SESSION();
}

View File

@ -33,5 +33,6 @@
#include "Navigator/Core/Layer.h"
#include "Navigator/Events/Event.h"
#include "Navigator/Utils/TestServerLayer.h"
#include "Navigator/Utils/Instrumentor.h"
#endif

View File

@ -14,11 +14,14 @@
namespace Navigator {
Application* Application::s_instance = nullptr;
Application::Application() :
m_runFlag(true)
{
NAV_PROFILE_FUNCTION();
s_instance = this;
m_window = std::unique_ptr<Window>(Window::Create());
@ -39,6 +42,7 @@ namespace Navigator {
void Application::OnEvent(Event& event)
{
NAV_PROFILE_FUNCTION();
EventDispatcher dispatch(event);
dispatch.Dispatch<WindowCloseEvent>(BIND_EVENT_FUNCTION(Application::OnWindowCloseEvent));
for(auto iter = m_stack.end(); iter != m_stack.begin(); )
@ -58,18 +62,21 @@ namespace Navigator {
void Application::PushLayer(Layer* layer)
{
NAV_PROFILE_FUNCTION();
m_stack.PushLayer(layer);
layer->OnAttach();
}
void Application::PushOverlay(Layer* layer)
{
NAV_PROFILE_FUNCTION();
m_stack.PushOverlay(layer);
layer->OnAttach();
}
void Application::Run()
{
NAV_PROFILE_FUNCTION();
while(m_runFlag)
{
RenderCommand::SetClearColor(m_bckgnd_color);

View File

@ -21,6 +21,7 @@ namespace Navigator {
std::string ConvertCutTypeToString(CutType type)
{
NAV_PROFILE_FUNCTION();
switch(type)
{
case CutType::Cut1D: return "Cut1D";
@ -43,12 +44,14 @@ namespace Navigator {
void Cut1D::IsInside(double x, double y)
{
NAV_PROFILE_FUNCTION();
m_isValid = x >= m_minVal && x <= m_maxVal;
}
//Only within an ImPlot/ImGui context!!!
void Cut1D::Draw() const
{
NAV_PROFILE_FUNCTION();
double points[2] = { m_minVal, m_maxVal };
ImPlot::PlotVLines(m_params.name.c_str(), points, 2);
}
@ -71,7 +74,8 @@ namespace Navigator {
*/
void Cut2D::IsInside(double x, double y)
{
m_isValid = false;
NAV_PROFILE_FUNCTION();
m_isValid = false;
double slope;
for(size_t i=0; i<(m_xpoints.size()-1); i++)
{
@ -99,7 +103,8 @@ namespace Navigator {
//Only in ImPlot/ImGui context!!!!
void Cut2D::Draw() const
{
ImPlot::PlotLine(m_params.name.c_str(), m_xpoints.data(), m_ypoints.data(), (int)m_xpoints.size());
NAV_PROFILE_FUNCTION();
ImPlot::PlotLine(m_params.name.c_str(), m_xpoints.data(), m_ypoints.data(), (int)m_xpoints.size());
}
/*CutSummaryAll -- Can only be made on a HistogramSummary but can be applied to any*/
@ -114,12 +119,14 @@ namespace Navigator {
void CutSummary::IsInside(double x, double y)
{
NAV_PROFILE_FUNCTION();
m_isValid = x >= m_minVal && x <= m_maxVal;
}
//Only within an ImPlot/ImGui context!!!
void CutSummary::Draw() const
{
NAV_PROFILE_FUNCTION();
double points[2] = { m_minVal, m_maxVal };
ImPlot::PlotVLines(m_params.name.c_str(), points, 2);
}

View File

@ -33,6 +33,7 @@ namespace Navigator {
std::string ConvertSpectrumTypeToString(SpectrumType type)
{
NAV_PROFILE_FUNCTION();
switch (type)
{
case SpectrumType::Histo1D: return "Histogram1D";
@ -56,6 +57,7 @@ namespace Navigator {
void Histogram1D::InitBins()
{
NAV_PROFILE_FUNCTION();
m_params.type = SpectrumType::Histo1D;
if(m_params.nbins_x == 0 || (m_params.min_x >= m_params.max_x))
{
@ -81,6 +83,7 @@ namespace Navigator {
//Note: only x is used here, y is simply present to maintain compliance with 2D case and can be ignored
void Histogram1D::FillData(double x, double y)
{
NAV_PROFILE_FUNCTION();
if (x < m_params.min_x || x >= m_params.max_x)
return;
int bin = int((x - m_params.min_x)/(m_binWidth));
@ -90,6 +93,7 @@ namespace Navigator {
//Can only be used within an ImGui / ImPlot context!!
void Histogram1D::Draw()
{
NAV_PROFILE_FUNCTION();
ImPlot::SetupAxes(m_params.x_par.c_str(), "Counts",0, ImPlotAxisFlags_LockMin | ImPlotAxisFlags_AutoFit);
ImPlot::PlotBars(m_params.name.c_str(), &m_binCenters.data()[0], &m_binCounts.data()[0], m_params.nbins_x, m_binWidth);
}
@ -103,6 +107,7 @@ namespace Navigator {
//Again here yvalues can be ignored, only for compliance
StatResults Histogram1D::AnalyzeRegion(double x_min, double x_max, double y_min, double y_max)
{
NAV_PROFILE_FUNCTION();
int bin_min, bin_max;
StatResults results;
@ -148,6 +153,7 @@ namespace Navigator {
void Histogram2D::InitBins()
{
NAV_PROFILE_FUNCTION();
m_params.type = SpectrumType::Histo2D;
if(m_params.nbins_x <= 0 || m_params.nbins_y <= 0 || m_params.min_x >= m_params.max_x || m_params.min_y >= m_params.max_y)
{
@ -172,6 +178,7 @@ namespace Navigator {
void Histogram2D::FillData(double x, double y)
{
NAV_PROFILE_FUNCTION();
if (x < m_params.min_x || x >= m_params.max_x || y <= m_params.min_y || y > m_params.max_y)
return;
int bin_x = int((x - m_params.min_x)/m_binWidthX);
@ -192,6 +199,7 @@ namespace Navigator {
*/
void Histogram2D::Draw()
{
NAV_PROFILE_FUNCTION();
ImPlot::SetupAxes(m_params.x_par.c_str(), m_params.y_par.c_str());
ImPlot::PushColormap(ImPlotColormap_Viridis);
ImPlot::PlotHeatmap(m_params.name.c_str(), &m_binCounts.data()[0], m_params.nbins_y, m_params.nbins_x, m_colorScaleRange[0], m_colorScaleRange[1], NULL,
@ -208,6 +216,7 @@ namespace Navigator {
StatResults Histogram2D::AnalyzeRegion(double x_min, double x_max, double y_min, double y_max)
{
NAV_PROFILE_FUNCTION();
int xbin_min, xbin_max, ybin_min, ybin_max;
int curbin;
@ -294,6 +303,7 @@ namespace Navigator {
void HistogramSummary::InitBins()
{
NAV_PROFILE_FUNCTION();
m_params.type = SpectrumType::Summary;
if (m_params.nbins_x <= 0 || m_params.min_x >= m_params.max_x)
{
@ -322,6 +332,7 @@ namespace Navigator {
void HistogramSummary::FillData(double x, double y)
{
NAV_PROFILE_FUNCTION();
if (x < m_params.min_x || x >= m_params.max_x || y <= m_params.min_y || y > m_params.max_y)
return;
int bin_x = int((x - m_params.min_x) / m_binWidthX);
@ -333,6 +344,7 @@ namespace Navigator {
void HistogramSummary::Draw()
{
NAV_PROFILE_FUNCTION();
ImPlot::SetupAxisTicks(ImAxis_Y1, m_params.min_y, m_params.max_y, m_params.nbins_y, m_labels, false);
ImPlot::PushColormap(ImPlotColormap_Viridis);
ImPlot::PlotHeatmap(m_params.name.c_str(), &m_binCounts.data()[0], m_params.nbins_y, m_params.nbins_x, m_colorScaleRange[0], m_colorScaleRange[1], NULL,
@ -348,6 +360,7 @@ namespace Navigator {
StatResults HistogramSummary::AnalyzeRegion(double x_min, double x_max, double y_min, double y_max)
{
NAV_PROFILE_FUNCTION();
int xbin_min, xbin_max, ybin_min, ybin_max;
int curbin;

View File

@ -28,6 +28,7 @@ namespace Navigator {
void SpectrumManager::AddHistogram(const HistogramArgs& params)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
if (params.y_par == "None") //Check dimensionality
m_histoMap[params.name].reset(new Histogram1D(params));
@ -37,18 +38,21 @@ namespace Navigator {
void SpectrumManager::AddHistogramSummary(const HistogramArgs& params, const std::vector<std::string>& subhistos)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
m_histoMap[params.name].reset(new HistogramSummary(params, subhistos));
}
void SpectrumManager::RemoveHistogram(const std::string& name)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
m_histoMap.erase(name);
}
void SpectrumManager::AddCutToHistogramDraw(const std::string& cutname, const std::string& histoname)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
auto iter = m_histoMap.find(histoname);
if (iter != m_histoMap.end())
@ -57,6 +61,7 @@ namespace Navigator {
void SpectrumManager::AddCutToHistogramApplied(const std::string& cutname, const std::string& histoname)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
auto iter = m_histoMap.find(histoname);
if (iter != m_histoMap.end())
@ -66,6 +71,7 @@ namespace Navigator {
//Use this to fill histograms. Currently can only be filled in bulk; maybe a use case for individual fills?
void SpectrumManager::UpdateHistograms()
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
//Set state of all cuts for the event
@ -128,6 +134,7 @@ namespace Navigator {
void SpectrumManager::ClearHistograms()
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
for (auto& pair : m_histoMap)
pair.second->ClearData();
@ -135,6 +142,7 @@ namespace Navigator {
void SpectrumManager::ClearHistogram(const std::string& name)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
auto iter = m_histoMap.find(name);
if (iter != m_histoMap.end())
@ -143,6 +151,7 @@ namespace Navigator {
void SpectrumManager::DrawHistogram(const std::string& name)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
auto iter = m_histoMap.find(name);
if (iter != m_histoMap.end())
@ -155,6 +164,7 @@ namespace Navigator {
const HistogramArgs& SpectrumManager::GetHistogramParams(const std::string& name)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
auto iter = m_histoMap.find(name);
if (iter != m_histoMap.end())
@ -166,6 +176,7 @@ namespace Navigator {
//For 2D spectra, we want to allow zooming along the z-axis (color)
float* SpectrumManager::GetColorScaleRange(const std::string& name)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
auto iter = m_histoMap.find(name);
if (iter != m_histoMap.end())
@ -190,6 +201,7 @@ namespace Navigator {
std::vector<std::string> SpectrumManager::GetSubHistograms(const std::string& name)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
auto iter = m_histoMap.find(name);
if (iter != m_histoMap.end() && iter->second->GetType() == SpectrumType::Summary)
@ -233,6 +245,7 @@ namespace Navigator {
//Bind a NavParameter instance to the manager. If the Parameter doesn't exist, make a new one, otherwise attach to extant memory
void SpectrumManager::BindParameter(NavParameter& param)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
auto iter = m_paramMap.find(param.GetName());
if (iter == m_paramMap.end())
@ -247,6 +260,7 @@ namespace Navigator {
//Additionally, make a default 1D histogram for the parameter (histogram has same name as parameter)
void SpectrumManager::BindParameter(NavParameter& param, int nbins, double minVal, double maxVal)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
auto iter = m_paramMap.find(param.GetName());
if (iter == m_paramMap.end())
@ -267,6 +281,7 @@ namespace Navigator {
//Once an analysis pass is done and histograms filled, reset all parameters
void SpectrumManager::InvalidateParameters()
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
for (auto& param : m_paramMap)
{
@ -295,6 +310,7 @@ namespace Navigator {
void SpectrumManager::BindVariable(NavVariable& var)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
auto iter = m_varMap.find(var.GetName());
if (iter == m_varMap.end())
@ -320,6 +336,7 @@ namespace Navigator {
void SpectrumManager::RemoveCut(const std::string& name)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_managerMutex);
m_cutMap.erase(name);
RemoveCutFromHistograms(name); //Once a cut is gone, remove all references to it.
@ -379,6 +396,7 @@ namespace Navigator {
//Can only be called by RemoveCut currently. May be a use case where this should be promoted to public to on the fly mod a gram.
void SpectrumManager::RemoveCutFromHistograms(const std::string& cutname)
{
NAV_PROFILE_FUNCTION();
for (auto& gram : m_histoMap)
{
auto& params = gram.second->GetParameters();
@ -402,6 +420,7 @@ namespace Navigator {
//Obv. only need to draw a cut if its parent histogram is drawn.
void SpectrumManager::DrawCut(const std::string& name)
{
NAV_PROFILE_FUNCTION();
auto iter = m_cutMap.find(name);
if (iter != m_cutMap.end())
iter->second->Draw();
@ -410,6 +429,7 @@ namespace Navigator {
//Set the state of the cuts for the current event. Called by the
void SpectrumManager::CheckCuts()
{
NAV_PROFILE_FUNCTION();
for (auto& iter : m_cutMap)
{
const std::string& xpar = iter.second->GetXParameter();
@ -472,6 +492,7 @@ namespace Navigator {
bool SpectrumManager::IsCutValid(const std::string& name)
{
NAV_PROFILE_FUNCTION();
auto iter = m_cutMap.find(name);
if (iter != m_cutMap.end())
return iter->second->IsValid();

View File

@ -68,6 +68,7 @@ namespace Navigator {
//The main function
void EditorLayer::OnImGuiRender()
{
NAV_PROFILE_FUNCTION();
static bool startFlag = true; //first render retrieve base
if(startFlag)
{
@ -276,6 +277,7 @@ namespace Navigator {
void EditorLayer::RemoveHistogramDialog()
{
NAV_PROFILE_FUNCTION();
static std::string selectedGram = "";
if (m_removeHistogram)
{
@ -311,6 +313,7 @@ namespace Navigator {
void EditorLayer::RemoveCutDialog()
{
NAV_PROFILE_FUNCTION();
static std::string selectedCut = "";
if (m_removeCut)
{
@ -347,6 +350,7 @@ namespace Navigator {
void EditorLayer::ExportHistogramDialog()
{
NAV_PROFILE_FUNCTION();
static std::string filename = "";
static HistogramArgs selectedGram = HistogramArgs();
if(m_exportHistogram)

View File

@ -20,6 +20,7 @@ namespace Navigator {
//Helper function to handle file size printing
std::string ConvertFileSystemSizeToString(std::uintmax_t value)
{
NAV_PROFILE_FUNCTION();
int i = 0;
double mantissa = (double)value;
for (; mantissa >= 1024.0; ++i)
@ -41,6 +42,7 @@ namespace Navigator {
std::pair<std::string, FileDialog::Type> FileDialog::RenderFileDialog(const std::string& ext)
{
NAV_PROFILE_FUNCTION();
if (m_openDialogFlag)
{
m_selectedItem = "";
@ -79,6 +81,7 @@ namespace Navigator {
std::string FileDialog::ImGuiRenderOpenFile(const std::string& ext)
{
NAV_PROFILE_FUNCTION();
std::string result = "";
std::string text = "";
@ -143,6 +146,7 @@ namespace Navigator {
std::string FileDialog::ImGuiRenderSaveFile(const std::string& ext)
{
NAV_PROFILE_FUNCTION();
std::string result = "";
std::string text = "";
@ -207,6 +211,7 @@ namespace Navigator {
std::string FileDialog::ImGuiRenderOpenDir()
{
NAV_PROFILE_FUNCTION();
std::string result = "";
std::string text = "";

View File

@ -27,6 +27,7 @@ namespace Navigator {
void SourceDialog::ImGuiRenderSourceDialog()
{
NAV_PROFILE_FUNCTION();
static bool onlineFlag = false;
static bool offlineFlag = false;
static std::vector<DataSource::SourceType> availTypes = { DataSource::SourceType::CompassOnline, DataSource::SourceType::CompassOffline };

View File

@ -26,6 +26,7 @@ namespace Navigator {
bool SpectrumDialog::ImGuiRenderSpectrumDialog(const std::vector<HistogramArgs>& histoList, const std::vector<CutArgs>& cutList, const std::vector<std::string>& paramList)
{
NAV_PROFILE_FUNCTION();
static std::string selectedCut = "";
bool result = false;
if (m_openFlag)

View File

@ -15,6 +15,7 @@ namespace Navigator {
//Convert a StatResults struct from analysis to a std::string helper function
std::string GenerateStatString(const std::string& name, const StatResults& results, bool is2D = true)
{
NAV_PROFILE_FUNCTION();
std::stringstream stream;
stream << "Region: " << name << "\n" << "Integral: " << results.integral << "\n";
if (results.integral == 0.0)
@ -36,6 +37,7 @@ namespace Navigator {
//Main render function. Handles generating subplot regions as well as the zoomed in region
bool SpectrumPanel::OnImGuiRender(const std::vector<HistogramArgs>& histoList, const std::vector<CutArgs>& cutList, const std::vector<std::string>& paramList)
{
NAV_PROFILE_FUNCTION();
static bool acceptCutFlag = false;
m_result = false;
if (ImGui::Begin("Active View"))

View File

@ -32,6 +32,7 @@ namespace Navigator {
void ImGuiLayer::OnAttach()
{
NAV_PROFILE_FUNCTION();
IMGUI_CHECKVERSION();
NAV_INFO("Creating ImGui Context...");
@ -82,6 +83,7 @@ namespace Navigator {
void ImGuiLayer::OnDetach()
{
NAV_PROFILE_FUNCTION();
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImPlot::DestroyContext();
@ -90,6 +92,7 @@ namespace Navigator {
void ImGuiLayer::Begin()
{
NAV_PROFILE_FUNCTION();
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
@ -98,6 +101,7 @@ namespace Navigator {
void ImGuiLayer::End()
{
NAV_PROFILE_FUNCTION();
Application& app = Application::Get();
ImGuiIO& io = ImGui::GetIO();

View File

@ -47,6 +47,7 @@ namespace Navigator {
void CompassFile::Open(const std::string& filename)
{
NAV_PROFILE_FUNCTION();
eofFlag = false;
hitUsedFlag = true;
m_filename = filename;
@ -106,6 +107,7 @@ namespace Navigator {
*/
bool CompassFile::GetNextHit()
{
NAV_PROFILE_FUNCTION();
if(!IsOpen()) return true;
if((bufferIter == nullptr || bufferIter == bufferEnd) && !IsEOF())
@ -131,8 +133,8 @@ namespace Navigator {
*/
void CompassFile::GetNextBuffer()
{
if(m_file->eof())
NAV_PROFILE_FUNCTION();
if(m_file->eof())
{
eofFlag = true;
return;
@ -147,7 +149,7 @@ namespace Navigator {
void CompassFile::ParseNextHit()
{
NAV_PROFILE_FUNCTION();
m_currentHit.board = *((uint16_t*)bufferIter);
bufferIter += 2;
m_currentHit.channel = *((uint16_t*)bufferIter);

View File

@ -35,6 +35,7 @@ namespace Navigator {
void CompassOnlineSource::InitConnection(const std::string& hostname, const std::string& port)
{
NAV_PROFILE_FUNCTION();
m_validFlag = false;
m_connection.Connect(hostname, port);
if (m_connection.IsOpen())
@ -45,6 +46,7 @@ namespace Navigator {
const NavData& CompassOnlineSource::GetData()
{
NAV_PROFILE_FUNCTION();
size_t range = m_bufferEnd - m_bufferIter; //how much buffer we have left
if (!IsValid())
{
@ -75,6 +77,7 @@ namespace Navigator {
void CompassOnlineSource::FillBuffer()
{
NAV_PROFILE_FUNCTION();
if (!m_connection.IsOpen()) //Make sure connection is still cool
{
m_validFlag = false;
@ -100,6 +103,7 @@ namespace Navigator {
void CompassOnlineSource::GetHit()
{
NAV_PROFILE_FUNCTION();
m_currentHit.board = *((uint16_t*)m_bufferIter);
m_bufferIter += 2;
m_currentHit.channel = *((uint16_t*)m_bufferIter);

View File

@ -33,6 +33,7 @@ namespace Navigator {
void CompassRun::CollectFiles()
{
NAV_PROFILE_FUNCTION();
int nfiles=0;
for(auto& item : std::filesystem::directory_iterator(m_directory))
{
@ -90,7 +91,7 @@ namespace Navigator {
*/
bool CompassRun::GetHitsFromFiles()
{
NAV_PROFILE_FUNCTION();
std::pair<CompassHit, bool*> earliestHit = std::make_pair(CompassHit(), nullptr);
for(unsigned int i=m_startIndex; i<m_datafiles.size(); i++)
{
@ -122,6 +123,7 @@ namespace Navigator {
const NavData& CompassRun::GetData()
{
NAV_PROFILE_FUNCTION();
if(!IsValid())
{
NAV_ERROR("Trying to access CompassRun data when invalid, bug detected!");

View File

@ -23,6 +23,7 @@ namespace Navigator {
bool PhysicsEventBuilder::AddDatumToEvent(const NavData& datum)
{
NAV_PROFILE_FUNCTION();
if (datum.timestamp == 0) //Ignore empty data (need a valid timestamp)
return false;

View File

@ -20,6 +20,7 @@ namespace Navigator {
PhysicsLayer::~PhysicsLayer()
{
NAV_PROFILE_FUNCTION();
if (m_activeFlag)
{
DetachDataSource();
@ -43,6 +44,7 @@ namespace Navigator {
void PhysicsLayer::OnEvent(Event& event)
{
NAV_PROFILE_FUNCTION();
EventDispatcher dispatch(event);
dispatch.Dispatch<PhysicsStartEvent>(BIND_EVENT_FUNCTION(PhysicsLayer::OnPhysicsStartEvent));
dispatch.Dispatch<PhysicsStopEvent>(BIND_EVENT_FUNCTION(PhysicsLayer::OnPhysicsStopEvent));
@ -50,6 +52,7 @@ namespace Navigator {
bool PhysicsLayer::OnPhysicsStartEvent(PhysicsStartEvent& event)
{
NAV_PROFILE_FUNCTION();
//If the Physics thread is active, kill it
if(m_activeFlag)
{
@ -70,6 +73,7 @@ namespace Navigator {
bool PhysicsLayer::OnPhysicsStopEvent(PhysicsStopEvent& event)
{
NAV_PROFILE_FUNCTION();
if (m_activeFlag)
{
DetachDataSource();
@ -89,6 +93,7 @@ namespace Navigator {
void PhysicsLayer::DestroyPhysThread()
{
NAV_PROFILE_FUNCTION();
NAV_INFO("Destroying the analysis thread...");
//Join the thread back to the parent (finish up the thread)
if(m_physThread != nullptr && m_physThread->joinable())
@ -107,6 +112,7 @@ namespace Navigator {
void PhysicsLayer::AttachDataSource(PhysicsStartEvent& event)
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_sourceMutex); //Shouldn't matter for this, but safety first
m_source.reset(CreateDataSource(event.GetSourceLocation(), event.GetSourcePort(), event.GetSourceType()));
m_eventBuilder.SetCoincidenceWindow(event.GetCoincidenceWindow());
@ -125,6 +131,7 @@ namespace Navigator {
void PhysicsLayer::DetachDataSource()
{
NAV_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_sourceMutex);
NAV_INFO("Detaching physics data source...");
m_activeFlag = false;
@ -134,6 +141,7 @@ namespace Navigator {
void PhysicsLayer::RunSource()
{
NAV_PROFILE_FUNCTION();
SpectrumManager& manager = SpectrumManager::GetInstance();
NavEvent event;

View File

@ -0,0 +1,251 @@
#ifndef INSTRUMENTOR_H
#define INSTRUMENTOR_H
#include <algorithm>
#include <chrono>
#include <fstream>
#include <iomanip>
#include <string>
#include <thread>
#include <mutex>
#include <sstream>
#include "Navigator/Core/Logger.h"
#include "Timer.h"
namespace Navigator {
using FloatingPointMicroseconds = std::chrono::duration<double, std::micro>;
struct ProfileResult
{
std::string name;
FloatingPointMicroseconds start;
std::chrono::microseconds elapsedTime;
std::thread::id threadID;
};
struct InstrumentationSession
{
std::string name;
};
class Instrumentor
{
public:
Instrumentor(const Instrumentor&) = delete;
Instrumentor(Instrumentor&&) = delete;
void BeginSession(const std::string& name, const std::string filename="inst_results.json")
{
std::scoped_lock<std::mutex> guard(m_instMutex);
if (m_session)
{
/*
* Can only ever have one session rolling. If for whatever reason attempt to open second, handle gracefully
*/
if (Logger::GetLogger()) //Ensure logger exists
{
NAV_ERROR("Attempting to create new instr. session ({0}) while session ({1}) is running! Setting to session {0}", name, m_session->name);
}
InternalEndSession();
}
m_outputFile.open(filename);
if (m_outputFile.is_open())
{
m_session = new InstrumentationSession({ name });
WriteHeader();
}
else if(Logger::GetLogger())
{
NAV_ERROR("Unable to open instr. output file named {0}!", filename);
}
}
void EndSession()
{
std::scoped_lock<std::mutex> guard(m_instMutex);
InternalEndSession();
}
void WriteProfile(const ProfileResult& result)
{
std::scoped_lock<std::mutex> guard(m_instMutex);
std::stringstream json_string;
json_string << std::setprecision(3) << std::fixed;
json_string << ",{";
json_string << "\"cat\":\"function\",";
json_string << "\"dur\":" << (result.elapsedTime.count()) << ',';
json_string << "\"name\":\"" << result.name << "\",";
json_string << "\"ph\":\"X\",";
json_string << "\"pid\":0,";
json_string << "\"tid\":" << result.threadID << ",";
json_string << "\"ts\":" << result.start.count();
json_string << "}";
if (m_session)
{
m_outputFile << json_string.str();
m_outputFile.flush();
}
}
static Instrumentor& Get()
{
static Instrumentor s_instance;
return s_instance;
}
private:
Instrumentor::Instrumentor() :
m_session(nullptr)
{
}
Instrumentor::~Instrumentor()
{
EndSession();
}
void InternalEndSession()
{
if (m_session)
{
WriteFooter();
m_outputFile.close();
delete m_session;
m_session = nullptr;
}
}
void WriteHeader()
{
m_outputFile << "{\"otherData\": {},\"traceEvents\":[{}";
m_outputFile.flush();
}
void WriteFooter()
{
m_outputFile << "]}";
m_outputFile.flush();
}
std::mutex m_instMutex;
InstrumentationSession* m_session;
std::ofstream m_outputFile;
};
class InstrumentationTimer
{
public:
InstrumentationTimer(const char* name) :
m_name(name), m_stopped(false)
{
m_startTime = Clock::now();
}
~InstrumentationTimer()
{
if (!m_stopped)
Stop();
}
void Stop()
{
auto stopTime = Clock::now();
FloatingPointMicroseconds start = FloatingPointMicroseconds((m_startTime).time_since_epoch());
auto elapsedTime = std::chrono::time_point_cast<std::chrono::microseconds>(stopTime).time_since_epoch() - std::chrono::time_point_cast<std::chrono::microseconds>(m_startTime).time_since_epoch();
m_stopped = true;
Instrumentor::Get().WriteProfile({ m_name, start, elapsedTime, std::this_thread::get_id() });
}
private:
using Time = std::chrono::steady_clock::time_point;
using Clock = std::chrono::steady_clock;
const char* m_name;
Time m_startTime;
bool m_stopped;
};
namespace InstrumentorUtils {
template<size_t N>
struct ChangeResult
{
char data[N];
};
template<size_t N, size_t M>
constexpr auto CleanupOutputString(const char(&expr)[N], const char(&remove)[M])
{
ChangeResult<N> result = {};
size_t srcIndex = 0;
size_t destIndex = 0;
while (srcIndex < N)
{
size_t matchIndex = 0;
while (matchIndex < M - 1 && srcIndex + matchIndex < N - 1 && expr[srcIndex + matchIndex] == remove[matchIndex])
matchIndex++;
if (matchIndex == M - 1)
srcIndex += matchIndex;
result.data[destIndex++] = expr[srcIndex] == '"' ? '\'' : expr[srcIndex];
srcIndex++;
}
return result;
}
}
}
//Macros for ease of use
#define NAV_PROFILE 0
#if NAV_PROFILE
//Attempt to resolve function signature with precompiler
#if defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) || (defined(__ICC) && (__ICC >= 600)) || defined(__ghs__)
#define NAV_FUNC_SIG __PRETTY_FUNCTION__
#elif defined(__DMC__) && (__DMC__ >= 0x810)
#define NAV_FUNC_SIG __PRETTY_FUNCTION__
#elif (defined(__FUNCSIG__) || (_MSC_VER))
#define NAV_FUNC_SIG __FUNCSIG__
#elif (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 600)) || (defined(__IBMCPP__) && (__IBMCPP__ >= 500))
#define NAV_FUNC_SIG __FUNCTION__
#elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x550)
#define NAV_FUNC_SIG __FUNC__
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
#define NAV_FUNC_SIG __func__
#elif defined(__cplusplus) && (__cplusplus >= 201103)
#define NAV_FUNC_SIG __func__
#else
#define NAV_FUNC_SIG "NAV_FUNC_SIG unknown!"
#endif
#define NAV_PROFILE_BEGIN_SESSION(name, filename) ::Navigator::Instrumentor::Get().BeginSession(name, filename);
#define NAV_PROFILE_END_SESSION() ::Navigator::Instrumentor::Get().EndSession();
#define NAV_PROFILE_SCOPE_LINE2(name, line) constexpr auto fixedName##line = ::Navigator::InstrumentorUtils::CleanupOutputString(name, "__cdecl ");\
::Navigator::InstrumentationTimer timer##line(fixedName##line.data)
#define NAV_PROFILE_SCOPE_LINE(name, line) NAV_PROFILE_SCOPE_LINE2(name, line)
#define NAV_PROFILE_SCOPE(name) NAV_PROFILE_SCOPE_LINE(name, __LINE__)
#define NAV_PROFILE_FUNCTION() NAV_PROFILE_SCOPE(NAV_FUNC_SIG)
#else
#define NAV_PROFILE_BEGIN_SESSION(name, filename)
#define NAV_PROFILE_END_SESSION()
#define NAV_PROFILE_SCOPE_LINE2(name, line)
#define NAV_PROFILE_SCOPE_LINE(name, line)
#define NAV_PROFILE_SCOPE(name)
#define NAV_PROFILE_FUNCTION()
#endif
#endif

View File

@ -26,7 +26,7 @@ namespace Navigator {
auto stopTime = Clock::now();
int64_t start = std::chrono::time_point_cast<std::chrono::microseconds>(m_startTime).time_since_epoch().count();
int64_t stop = std::chrono::time_point_cast<std::chrono::microseconds>(stopTime).time_since_epoch().count();
float duration = (stop - start)*0.001;
float duration = (stop - start)*0.001f;
m_stopped = true;
NAV_INFO("{1} -- Duration: {0} ms", m_name, duration);

View File

@ -16,7 +16,7 @@
#include <cstdint>
#include "Navigator/Core/Logger.h"
#include "Navigator/Utils/Instrumentor.h"
#endif