Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 83 additions & 0 deletions artdaq/ArtModules/ArtdaqRunInfoServiceInterface.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#ifndef artdaq_ArtModules_ArtdaqRunInfoServiceInterface_h
#define artdaq_ArtModules_ArtdaqRunInfoServiceInterface_h

#include "art/Framework/Services/Registry/ServiceDeclarationMacros.h"
#include "canvas/Persistency/Provenance/IDNumber.h"

#include <cerrno>
#include <cstddef>
#include <cstring>
#include <string>

#include <fcntl.h>
#include <sys/file.h>
#include <unistd.h>

class ArtdaqRunInfoServiceInterface
{
public:
ArtdaqRunInfoServiceInterface() = default;

virtual ~ArtdaqRunInfoServiceInterface() = default;

virtual bool addSubrunRecord(
art::RunNumber_t run,
art::SubRunNumber_t subrun,
size_t nEvents,
art::EventNumber_t firstEvent,
art::EventNumber_t lastEvent,
std::string const& datastream = "default") = 0;

virtual bool addFileSummary(
std::string const& fileName,
art::RunNumber_t run,
art::SubRunNumber_t firstSubrun,
art::SubRunNumber_t lastSubrun,
size_t nEvents,
size_t fileSize,
std::string const& metadata = "{}",
std::string const& datastream = "default") = 0;

protected:
bool appendToCsv(std::string const& path, std::string const& header, std::string const& row)
{
int fd = open(path.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0666);
if (fd < 0) { return false; }

flock(fd, LOCK_EX);

std::string buf;
if (lseek(fd, 0, SEEK_END) == 0) { buf = header; }
buf += row;

ssize_t total = 0;
auto remaining = static_cast<ssize_t>(buf.size());
while (remaining > 0)
{
ssize_t written = ::write(fd, buf.c_str() + total, static_cast<size_t>(remaining));
if (written < 0)
{
if (errno == EINTR) { continue; }
flock(fd, LOCK_UN);
close(fd);
return false;
}
total += written;
remaining -= written;
}

flock(fd, LOCK_UN);
close(fd);
return true;
}

private:
ArtdaqRunInfoServiceInterface(ArtdaqRunInfoServiceInterface const&) = delete;
ArtdaqRunInfoServiceInterface(ArtdaqRunInfoServiceInterface&&) = delete;
ArtdaqRunInfoServiceInterface& operator=(ArtdaqRunInfoServiceInterface const&) = delete;
ArtdaqRunInfoServiceInterface& operator=(ArtdaqRunInfoServiceInterface&&) = delete;
};

DECLARE_ART_SERVICE_INTERFACE(ArtdaqRunInfoServiceInterface, LEGACY)

#endif /* artdaq_ArtModules_ArtdaqRunInfoServiceInterface_h */
103 changes: 103 additions & 0 deletions artdaq/ArtModules/ArtdaqRunInfoService_service.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
#include "TRACE/tracemf.h"

#include "artdaq/ArtModules/ArtdaqRunInfoServiceInterface.h"

#include "art/Framework/Services/Registry/ServiceDefinitionMacros.h"

#include "fhiclcpp/ParameterSet.h"

#include <cstddef>
#include <filesystem>
#include <iomanip>
#include <sstream>
#include <string>

#define TRACE_NAME "ArtdaqRunInfoService"

class ArtdaqRunInfoService : public ArtdaqRunInfoServiceInterface
{
public:
ArtdaqRunInfoService(fhicl::ParameterSet const& pset, art::ActivityRegistry&);
~ArtdaqRunInfoService() override = default;

bool addSubrunRecord(
art::RunNumber_t run,
art::SubRunNumber_t subrun,
size_t nEvents,
art::EventNumber_t firstEvent,
art::EventNumber_t lastEvent,
std::string const& datastream) override;

bool addFileSummary(
std::string const& fileName,
art::RunNumber_t run,
art::SubRunNumber_t firstSubrun,
art::SubRunNumber_t lastSubrun,
size_t nEvents,
size_t fileSize,
std::string const& metadata,
std::string const& datastream) override;

private:
std::string summaryDir_;
};

DECLARE_ART_SERVICE_INTERFACE_IMPL(ArtdaqRunInfoService, ArtdaqRunInfoServiceInterface, LEGACY)

ArtdaqRunInfoService::ArtdaqRunInfoService(fhicl::ParameterSet const& pset, art::ActivityRegistry& /*unused*/)
: summaryDir_(pset.get<std::string>("summaryDir", ""))
{
TLOG(TLVL_INFO) << "ArtdaqRunInfoService: summaryDir=\"" << summaryDir_ << "\"";
}

bool ArtdaqRunInfoService::addSubrunRecord(
art::RunNumber_t run,
art::SubRunNumber_t subrun,
size_t nEvents,
art::EventNumber_t firstEvent,
art::EventNumber_t lastEvent,
std::string const& datastream)
{
if (summaryDir_.empty()) { return true; }

std::ostringstream fname;
fname << summaryDir_;
if (summaryDir_.back() != '/') { fname << '/'; }
fname << "subrun_record_run" << std::setw(6) << std::setfill('0') << run << ".csv";

std::ostringstream row;
row << run << "," << subrun << "," << nEvents << "," << firstEvent << "," << lastEvent
<< "," << datastream << "\n";

return appendToCsv(fname.str(),
"run,subrun,n_events,first_event,last_event,datastream\n", row.str());
}

bool ArtdaqRunInfoService::addFileSummary(
std::string const& fileName,
art::RunNumber_t run,
art::SubRunNumber_t firstSubrun,
art::SubRunNumber_t lastSubrun,
size_t nEvents,
size_t fileSize,
std::string const& /*metadata*/,
std::string const& datastream)
{
if (summaryDir_.empty()) { return true; }

std::ostringstream fname;
fname << summaryDir_;
if (summaryDir_.back() != '/') { fname << '/'; }
fname << "file_summary_run" << std::setw(6) << std::setfill('0') << run << ".csv";

std::string const outputFile = std::filesystem::path(fileName).filename().string();

std::ostringstream row;
row << outputFile << "," << run << "," << firstSubrun << "," << lastSubrun
<< "," << nEvents << "," << fileSize << "," << datastream << "\n";

return appendToCsv(fname.str(),
"file_name,run,first_subrun,last_subrun,n_events,file_size,datastream\n", row.str());
}

DEFINE_ART_SERVICE_INTERFACE_IMPL(ArtdaqRunInfoService, ArtdaqRunInfoServiceInterface)
16 changes: 16 additions & 0 deletions artdaq/ArtModules/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ cet_build_plugin(RootDAQOutMF art::module
LIBRARIES REG
artdaq::RootDAQOutput
artdaq::ArtModules
artdaq_plugin_types::ArtdaqRunInfoService
TRACE::MF
art_root_io::detail
art_root_io::art_root_io
Expand Down Expand Up @@ -128,6 +129,21 @@ cet_make_library(SOURCE
art::Framework_Services_Registry
)

cet_make_library(LIBRARY_NAME ArtdaqRunInfoService INTERFACE
EXPORT_SET AMPluginTypes
SOURCE ArtdaqRunInfoServiceInterface.h
LIBRARIES INTERFACE
canvas::canvas
art_plugin_types::serviceDeclaration
)

cet_build_plugin(ArtdaqRunInfoService art::service
LIBRARIES PRIVATE
artdaq_plugin_types::ArtdaqRunInfoService
fhiclcpp::fhiclcpp
TRACE::MF
)

cet_make_library(LIBRARY_NAME ArtdaqFragmentNamingService INTERFACE
EXPORT_SET AMPluginTypes
SOURCE ArtdaqFragmentNamingService.h
Expand Down
Loading
Loading