Skip to content

Commit

Permalink
Add ACADA decoder base classes
Browse files Browse the repository at this point in the history
  • Loading branch information
sfegan committed Sep 6, 2024
1 parent 7e1e220 commit 2cc84bd
Show file tree
Hide file tree
Showing 5 changed files with 704 additions and 57 deletions.
78 changes: 25 additions & 53 deletions include/iact_data/acada_data_source.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,35 +37,51 @@ using std::streamoff; // needed for IFits.h

namespace calin { namespace iact_data { namespace acada_data_source {

template<typename EventMessage>
class ACADACameraEventDataSource:
public virtual calin::io::data_source::DataSource<EventMessage>
{
public:
CALIN_TYPEALIAS(event_type, EventMessage);

ACADACameraEventDataSource():
calin::io::data_source::DataSource<EventMessage>() {
/* nothing to see here */ }
virtual ~ACADACameraEventDataSource();

virtual const EventMessage* borrow_next_event(uint64_t& seq_index_out) = 0;
virtual void release_borrowed_event(const EventMessage* event) = 0;
};

template<typename EventMessage, typename HeaderMessage>
class ACADACameraEventDataSourceWithRunHeader:
public calin::io::data_source::DataSource<EventMessage>
public virtual ACADACameraEventDataSource<EventMessage>
{
public:
CALIN_TYPEALIAS(event_type, EventMessage);
CALIN_TYPEALIAS(header_type, HeaderMessage);

ACADACameraEventDataSourceWithRunHeader():
calin::io::data_source::DataSource<event_type>() {
ACADACameraEventDataSourceWithRunHeader():
ACADACameraEventDataSource<EventMessage>() {
/* nothing to see here */ }
virtual ~ACADACameraEventDataSourceWithRunHeader();
virtual header_type* get_run_header() = 0;
};

template<typename EventMessage, typename HeaderMessage>
class ACADACameraEventRandomAccessDataSourceWithRunHeader:
public calin::io::data_source::RandomAccessDataSource<EventMessage>
public virtual calin::io::data_source::RandomAccessDataSource<EventMessage>,
public virtual ACADACameraEventDataSourceWithRunHeader<EventMessage,HeaderMessage>
{
public:
CALIN_TYPEALIAS(event_type, EventMessage);
CALIN_TYPEALIAS(header_type, HeaderMessage);

ACADACameraEventRandomAccessDataSourceWithRunHeader();
ACADACameraEventRandomAccessDataSourceWithRunHeader():
calin::io::data_source::RandomAccessDataSource<EventMessage>(),
ACADACameraEventDataSourceWithRunHeader<EventMessage,HeaderMessage>() {
/* nothing to see here */ }
virtual ~ACADACameraEventRandomAccessDataSourceWithRunHeader();
virtual header_type* get_run_header() = 0;

virtual const event_type* borrow_next_event(uint64_t& seq_index_out) = 0;
virtual void release_borrowed_event(const event_type* event) = 0;
};

/*
Expand All @@ -92,28 +108,6 @@ class ACADACameraEventRandomAccessDataSourceWithRunHeader:
CALIN_TYPEALIAS(ACADA_L0_EventMessage, DataModel::CameraEvent);
CALIN_TYPEALIAS(ACADA_L0_HeaderMessage, DataModel::CameraRunHeader);

// CALIN_TYPEALIAS(ACADA_L0_CameraEventDataSource,
// calin::io::data_source::DataSource<ACADA_L0_EventMessage>);
// CALIN_TYPEALIAS(ACADA_L0_CameraEventRandomAccessDataSource,
// calin::io::data_source::RandomAccessDataSource<ACADA_L0_EventMessage>);

// CALIN_TYPEALIAS(ConstACADA_L0_CameraEventDataSource,
// calin::io::data_source::DataSource<const ACADA_L0_EventMessage>);
// CALIN_TYPEALIAS(ConstACADA_L0_CameraEventDataSink,
// calin::io::data_source::DataSink<const ACADA_L0_EventMessage>);

// CALIN_TYPEALIAS(ACADA_L0_CameraEventDataSourceWithRunHeader,
// ACADA_CameraEventDataSourceWithRunHeader<ACADA_L0_EventMessage,ACADA_L0_HeaderMessage>);
// CALIN_TYPEALIAS(ACADA_L0_CameraEventRandomAccessDataSourceWithRunHeader,
// ACADA_CameraEventRandomAccessDataSourceWithRunHeader<ACADA_L0_EventMessage,ACADA_L0_HeaderMessage>);

// CALIN_TYPEALIAS(ACADA_L0_CameraEventChainedRandomAccessDataSourceWithRunHeader,
// calin::io::data_source::BasicChainedRandomAccessDataSource<
// ACADA_L0_CameraEventRandomAccessDataSourceWithRunHeader>);
// CALIN_TYPEALIAS(ACADA_L0_CameraEventRandomAccessDataSourceOpener,
// calin::io::data_source::DataSourceOpener<
// ACADA_L0_CameraEventRandomAccessDataSourceWithRunHeader>);

/*
RRRRRRRRRRRRRRRRR 1111111 000000000
Expand All @@ -138,28 +132,6 @@ CALIN_TYPEALIAS(ACADA_L0_HeaderMessage, DataModel::CameraRunHeader);
CALIN_TYPEALIAS(ACADA_R1v0_EventMessage, R1::CameraEvent);
CALIN_TYPEALIAS(ACADA_R1v0_HeaderMessage, R1::CameraConfiguration);

// CALIN_TYPEALIAS(ACADA_R1v0_CameraEventDataSource,
// calin::io::data_source::DataSource<ACADA_R1v0_EventMessage>);
// CALIN_TYPEALIAS(ACADA_R1v0_CameraEventRandomAccessDataSource,
// calin::io::data_source::RandomAccessDataSource<ACADA_R1v0_EventMessage>);

// CALIN_TYPEALIAS(ConstACADA_R1v0_CameraEventDataSource,
// calin::io::data_source::DataSource<const ACADA_R1v0_EventMessage>);
// CALIN_TYPEALIAS(ConstACADA_R1v0_CameraEventDataSink,
// calin::io::data_source::DataSink<const ACADA_R1v0_EventMessage>);

// CALIN_TYPEALIAS(ACADA_R1v0_CameraEventDataSourceWithRunHeader,
// ACADA_CameraEventDataSourceWithRunHeader<ACADA_R1v0_EventMessage,ACADA_R1v0_HeaderMessage>);
// CALIN_TYPEALIAS(ACADA_R1v0_CameraEventRandomAccessDataSourceWithRunHeader,
// ACADA_CameraEventRandomAccessDataSourceWithRunHeader<ACADA_R1v0_EventMessage,ACADA_R1v0_HeaderMessage>);

// CALIN_TYPEALIAS(ACADA_R1v0_CameraEventChainedRandomAccessDataSourceWithRunHeader,
// calin::io::data_source::BasicChainedRandomAccessDataSource<
// ACADA_R1v0_CameraEventRandomAccessDataSourceWithRunHeader>);
// CALIN_TYPEALIAS(ACADA_R1v0_CameraEventRandomAccessDataSourceOpener,
// calin::io::data_source::DataSourceOpener<
// ACADA_R1v0_CameraEventRandomAccessDataSourceWithRunHeader>);

/*
RRRRRRRRRRRRRRRRR 1111111 1111111
Expand Down
135 changes: 135 additions & 0 deletions include/iact_data/acada_event_decoder.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
/*
calin/iact_data/acada_event_decoder.hpp -- Stephen Fegan -- 2024-09-05
Base for all decoders of ACADA event types
Copyright 2024, Stephen Fegan <[email protected]>
Laboratoire Leprince-Ringuet, CNRS/IN2P3, Ecole Polytechnique, Institut Polytechnique de Paris
This file is part of "calin"
"calin" is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2 or
later, as published by the Free Software Foundation.
"calin" is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
*/

#pragma once

#include <string>

#include <calin_global_definitions.hpp>
#include <calin_global_config.hpp>
#include <io/chained_data_source.hpp>
#include <iact_data/acada_data_source.hpp>
#include <iact_data/telescope_data_source.hpp>

namespace calin { namespace iact_data { namespace acada_event_decoder {

#ifdef CALIN_HAVE_CTA_CAMERASTOACTL

void decode_cdts_data(calin::ix::iact_data::telescope_event::CDTSData* calin_cdts_data,
const DataModel::AnyArray& cta_array);

void decode_tib_data(calin::ix::iact_data::telescope_event::TIBData* calin_tib_data,
const DataModel::AnyArray& cta_array);

calin::ix::iact_data::telescope_event::TriggerType determine_trigger_type(
const calin::ix::iact_data::telescope_event::TIBData* calin_tib_data,
const calin::ix::iact_data::telescope_event::CDTSData* calin_cdts_data);

template<typename EventMessage, typename HeaderMessage>
class ACADACameraEventDecoder
{
public:
CALIN_TYPEALIAS(event_type, EventMessage);
CALIN_TYPEALIAS(header_type, HeaderMessage);

virtual ~ACADACameraEventDecoder();
virtual bool decode(
calin::ix::iact_data::telescope_event::TelescopeEvent* event,
const EventMessage* cta_event) = 0;
virtual bool decode_run_config(
calin::ix::iact_data::telescope_run_configuration::
TelescopeRunConfiguration* run_config,
const HeaderMessage* cta_run_header,
const EventMessage* cta_event) = 0;
virtual ACADACameraEventDecoder* clone() const = 0;
};

template<typename EventMessage, typename HeaderMessage>
class DecodedACADACameraEventDataSource:
public calin::iact_data::telescope_data_source::TelescopeDataSource
{
public:
CALIN_TYPEALIAS(event_type, EventMessage);
CALIN_TYPEALIAS(header_type, HeaderMessage);

CALIN_TYPEALIAS(ACADACameraEventDataSource,
calin::iact_data::acada_data_source::ACADACameraEventDataSource<EventMessage>);
CALIN_TYPEALIAS(ACADACameraEventDecoder,
ACADACameraEventDecoder<EventMessage,HeaderMessage>);

DecodedACADACameraEventDataSource(
ACADACameraEventDataSource* acada_src, ACADACameraEventDecoder* decoder,
bool adopt_acada_src = false, bool adopt_decoder = false);

virtual ~DecodedACADACameraEventDataSource();

calin::ix::iact_data::telescope_event::TelescopeEvent* get_next(
uint64_t& seq_index_out, google::protobuf::Arena** arena = nullptr) override;

protected:
ACADACameraEventDecoder* decoder_;
virtual const EventMessage* borrow_next_acada_event(uint64_t& seq_index_out);
virtual void release_borrowed_acada_event(const EventMessage* event);

private:
bool adopt_decoder_ = false;
ACADACameraEventDataSource* acada_src_ = nullptr;
bool adopt_acada_src_ = false;
};

template<typename EventMessage, typename HeaderMessage>
class DecodedACADACameraEventDataSourceWithRunConfig:
public virtual calin::iact_data::telescope_data_source::TelescopeDataSourceWithRunConfig,
public virtual DecodedACADACameraEventDataSource<EventMessage,HeaderMessage>
{
public:
CALIN_TYPEALIAS(event_type, EventMessage);
CALIN_TYPEALIAS(header_type, HeaderMessage);

CALIN_TYPEALIAS(ACADACameraEventDataSourceWithRunHeader,
calin::iact_data::acada_data_source::ACADACameraEventDataSourceWithRunHeader<EventMessage,HeaderMessage>);
CALIN_TYPEALIAS(ACADACameraEventDecoder,
ACADACameraEventDecoder<EventMessage,HeaderMessage>);

DecodedACADACameraEventDataSourceWithRunConfig(
ACADACameraEventDataSourceWithRunHeader* acada_src, ACADACameraEventDecoder* decoder,
bool adopt_acada_src = false, bool adopt_decoder = false);

virtual ~DecodedACADACameraEventDataSourceWithRunConfig();

calin::ix::iact_data::telescope_run_configuration::
TelescopeRunConfiguration* get_run_configuration() override;

protected:
const EventMessage* borrow_next_acada_event(uint64_t& seq_index_out) override;
void ensure_run_config();

private:
ACADACameraEventDataSourceWithRunHeader* acada_src_ = nullptr;
const EventMessage* saved_event_ = nullptr;
uint64_t saved_seq_index_ = 0;
calin::ix::iact_data::telescope_run_configuration::TelescopeRunConfiguration* run_config_ = nullptr;
};

#endif

} } } // namespace calin::iact_data::acada_event_decoder
2 changes: 1 addition & 1 deletion src/iact_data/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ set(CALIN_SOURCES algorithms.cpp

if(CTA_CAMERASTOACTL_FOUND)
set(CALIN_SOURCES ${CALIN_SOURCES}
acada_data_source.cpp zfits_acada_data_source.cpp
acada_data_source.cpp zfits_acada_data_source.cpp acada_event_decoder.cpp
actl_event_decoder.cpp
nectarcam_actl_l0_event_decoder.cpp nectarcam_actl_r1_event_decoder.cpp
lstcam_actl_r1_event_decoder.cpp
Expand Down
18 changes: 15 additions & 3 deletions src/iact_data/acada_data_source.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,16 @@

using namespace calin::iact_data::acada_data_source;

template<typename EventMessage>
ACADACameraEventDataSource<EventMessage>::
~ACADACameraEventDataSource()
{
// nothing to see here
}

template<typename EventMessage, typename HeaderMessage>
ACADACameraEventRandomAccessDataSourceWithRunHeader<EventMessage,HeaderMessage>::
ACADACameraEventRandomAccessDataSourceWithRunHeader():
calin::io::data_source::RandomAccessDataSource<EventMessage>()
ACADACameraEventDataSourceWithRunHeader<EventMessage,HeaderMessage>::
~ACADACameraEventDataSourceWithRunHeader()
{
// nothing to see here
}
Expand All @@ -41,6 +47,12 @@ ACADACameraEventRandomAccessDataSourceWithRunHeader<EventMessage,HeaderMessage>:

namespace calin { namespace iact_data { namespace acada_data_source {

template class ACADACameraEventDataSource<ACADA_L0_EventMessage>;
template class ACADACameraEventDataSource<ACADA_R1v0_EventMessage>;

template class ACADACameraEventDataSourceWithRunHeader<ACADA_L0_EventMessage, ACADA_L0_HeaderMessage>;
template class ACADACameraEventDataSourceWithRunHeader<ACADA_R1v0_EventMessage, ACADA_R1v0_HeaderMessage>;

template class ACADACameraEventRandomAccessDataSourceWithRunHeader<ACADA_L0_EventMessage, ACADA_L0_HeaderMessage>;
template class ACADACameraEventRandomAccessDataSourceWithRunHeader<ACADA_R1v0_EventMessage, ACADA_R1v0_HeaderMessage>;

Expand Down
Loading

0 comments on commit 2cc84bd

Please sign in to comment.