Skip to content

Commit

Permalink
Merge PodioDataSvc into k4DataSvc
Browse files Browse the repository at this point in the history
- Move k4DataSvc to core library
- Make PodioDataSvc an alias for now
  • Loading branch information
tmadlener committed May 23, 2024
1 parent 5f9a69f commit 8e447dd
Show file tree
Hide file tree
Showing 8 changed files with 171 additions and 189 deletions.
8 changes: 4 additions & 4 deletions k4FWCore/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ gaudi_install(PYTHON)


gaudi_add_library(k4FWCore
SOURCES src/PodioDataSvc.cpp
src/KeepDropSwitch.cpp
LINK Gaudi::GaudiKernel podio::podioRootIO ROOT::Core ROOT::RIO ROOT::Tree
)
SOURCES src/k4DataSvc.cpp
src/KeepDropSwitch.cpp
LINK Gaudi::GaudiKernel podio::podioRootIO ROOT::Core ROOT::RIO ROOT::Tree
)
target_include_directories(k4FWCore PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
Expand Down
4 changes: 2 additions & 2 deletions k4FWCore/components/PodioInput.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
#include <string>
#include <vector>

class PodioDataSvc;
class k4DataSvc;

/** @class PodioInput
*
Expand All @@ -51,7 +51,7 @@ class PodioInput final : public Gaudi::Functional::Consumer<void(), BaseClass_t>
Gaudi::Property<std::vector<std::string>> m_collectionNames{
this, "collections", {}, "Collections that should be read (default all)"};
// Data service: needed to register objects and get collection IDs. Just an observing pointer.
PodioDataSvc* m_podioDataSvc;
k4DataSvc* m_podioDataSvc;
mutable std::map<std::string_view, std::function<void(std::string_view)>> m_readers;
};

Expand Down
4 changes: 2 additions & 2 deletions k4FWCore/components/PodioOutput.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ namespace podio {
#include <vector>

// forward declarations
class PodioDataSvc;
class k4DataSvc;

class PodioOutput : public Gaudi::Algorithm {
public:
Expand All @@ -62,7 +62,7 @@ class PodioOutput : public Gaudi::Algorithm {
"An optional file path to copy the outputfile to."};
/// Switch for keeping or dropping outputs
KeepDropSwitch m_switch;
PodioDataSvc* m_podioDataSvc;
k4DataSvc* m_podioDataSvc;
/// The actual ROOT frame writer
std::unique_ptr<podio::ROOTWriter> m_framewriter;
/// The stored collections
Expand Down
13 changes: 1 addition & 12 deletions k4FWCore/components/k4DataSvc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#include "k4DataSvc.h"
#include "k4FWCore/k4DataSvc.h"

// Instantiation of a static factory class used by clients to create
// instances of this service
DECLARE_COMPONENT(k4DataSvc)

/// Standard Constructor
k4DataSvc::k4DataSvc(const std::string& name, ISvcLocator* svc) : PodioDataSvc(name, svc) {
declareProperty("inputs", m_filenames = {}, "Names of the files to read");
declareProperty("input", m_filename = "", "Name of the file to read");
declareProperty("FirstEventEntry", m_1stEvtEntry = 0, "First event to read");
}

/// Standard Destructor
k4DataSvc::~k4DataSvc() {}
33 changes: 0 additions & 33 deletions k4FWCore/components/k4DataSvc.h

This file was deleted.

118 changes: 5 additions & 113 deletions k4FWCore/include/k4FWCore/PodioDataSvc.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,119 +16,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef FWCORE_PODIODATASVC_H
#define FWCORE_PODIODATASVC_H
#ifndef K4FWCORE_PODIODATASVC_H
#define K4FWCORE_PODIODATASVC_H

#include "GaudiKernel/DataSvc.h"
#include "GaudiKernel/IConversionSvc.h"
// PODIO
#include <utility>
#include "podio/CollectionBase.h"
#include "podio/CollectionIDTable.h"
#include "podio/Frame.h"
#include "podio/podioVersion.h"
#if PODIO_BUILD_VERSION >= PODIO_VERSION(0, 99, 0)
#include "podio/ROOTReader.h"
#else
#include "podio/ROOTFrameReader.h"
namespace podio {
using ROOTReader = podio::ROOTFrameReader;
}
#endif
// Forward declarations
#include "k4FWCore/DataWrapper.h"
class DataWrapperBase;
class PodioOutput;
template <typename T> class MetaDataHandle;

/** @class PodioEvtSvc EvtDataSvc.h
*
* An EvtDataSvc for PODIO classes
*
* @author B. Hegner
*/
class PodioDataSvc : public DataSvc {
template <typename T> friend class MetaDataHandle;
friend class PodioOutput;
friend class Lcio2EDM4hepTool;

public:
typedef std::vector<std::pair<std::string, podio::CollectionBase*>> CollRegistry;

StatusCode initialize() final;
StatusCode reinitialize() final;
StatusCode finalize() final;
StatusCode clearStore() final;
StatusCode i_setRoot(std::string root_path, IOpaqueAddress* pRootAddr) final;
StatusCode i_setRoot(std::string root_path, DataObject* pRootObj) final;

/// Standard Constructor
PodioDataSvc(const std::string& name, ISvcLocator* svc);

/// Standard Destructor
virtual ~PodioDataSvc();
#include "k4FWCore/k4DataSvc.h"

// Use DataSvc functionality except where we override
using DataSvc::registerObject;
/// Overriding standard behaviour of evt service
/// Register object with the data store.
virtual StatusCode registerObject(std::string_view parentPath, std::string_view fullPath,
DataObject* pObject) override final;
using PodioDataSvc [[deprecated("Use k4DataSvc instead")]] = k4DataSvc;

const std::string_view getCollectionType(const std::string& collName);

template <typename T> StatusCode readCollection(const std::string& collName) {
DataObject* objectPtr = nullptr;
if (DataSvc::findObject("/Event", "/" + collName, objectPtr)) {
debug() << "Collection " << collName << " already read, not reading it again" << endmsg;
return StatusCode::SUCCESS;
}
const T* collection(nullptr);
collection = static_cast<const T*>(m_eventframe.get(collName));
if (collection == nullptr) {
error() << "Collection " << collName << " does not exist." << endmsg;
}
auto wrapper = new DataWrapper<T>;
wrapper->setData(collection);
m_podio_datawrappers.push_back(wrapper);
return DataSvc::registerObject("/Event", "/" + collName, wrapper);
}

const podio::Frame& getEventFrame() const { return m_eventframe; }

/// Resets caches of reader and event store, increases event counter
void endOfRead();

/// TODO: Make this private again after conversions have been properly solved
podio::Frame& getMetaDataFrame() { return m_metadataframe; }

private:
/// PODIO reader for ROOT files
podio::ROOTReader m_reader;
/// PODIO Frame, used to initialise collections
podio::Frame m_eventframe;
/// PODIO Frame, used to store metadata
podio::Frame m_metadataframe;
/// Counter of the event number
int m_eventNum{0};
/// Number of events in the file / to process
int m_numAvailableEvents{-1};
int m_requestedEventMax{-1};
/// Whether reading from file at all
bool m_reading_from_file{false};

SmartIF<IConversionSvc> m_cnvSvc;

// Registry of data wrappers; needed for memory management
std::vector<DataWrapperBase*> m_podio_datawrappers;

protected:
/// ROOT file name the input is read from. Set by option filename
std::vector<std::string> m_filenames;
std::string m_filename;
/// Jump to nth events at the beginning. Set by option FirstEventEntry
/// This option is helpful when we want to debug an event in the middle of a file
unsigned m_1stEvtEntry{0};
bool m_bounds_check_needed{true};
};
#endif // CORE_PODIODATASVC_H
#endif
133 changes: 133 additions & 0 deletions k4FWCore/include/k4FWCore/k4DataSvc.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
/*
* Copyright (c) 2014-2024 Key4hep-Project.
*
* This file is part of Key4hep.
* See https://key4hep.github.io/key4hep-doc/ for further info.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef K4FWCORE_K4DATASVC_H
#define K4FWCORE_K4DATASVC_H

#include "GaudiKernel/DataSvc.h"
#include "GaudiKernel/IConversionSvc.h"
// PODIO
#include <utility>
#include "podio/CollectionBase.h"
#include "podio/Frame.h"
#include "podio/podioVersion.h"
#if PODIO_BUILD_VERSION >= PODIO_VERSION(0, 99, 0)
#include "podio/ROOTReader.h"
#else
#include "podio/ROOTFrameReader.h"
namespace podio {
using ROOTReader = podio::ROOTFrameReader;
}
#endif
// Forward declarations
#include "k4FWCore/DataWrapper.h"
class DataWrapperBase;
class PodioOutput;
template <typename T> class MetaDataHandle;

/** @class k4DataSvc
*
* An EvtDataSvc for PODIO classes
*
* @author B. Hegner
*/
class k4DataSvc : public DataSvc {
template <typename T> friend class MetaDataHandle;
friend class PodioOutput;
friend class Lcio2EDM4hepTool;

public:
typedef std::vector<std::pair<std::string, podio::CollectionBase*>> CollRegistry;

StatusCode initialize() final;
StatusCode reinitialize() final;
StatusCode finalize() final;
StatusCode clearStore() final;
StatusCode i_setRoot(std::string root_path, IOpaqueAddress* pRootAddr) final;
StatusCode i_setRoot(std::string root_path, DataObject* pRootObj) final;

/// Standard Constructor
k4DataSvc(const std::string& name, ISvcLocator* svc);

/// Standard Destructor
virtual ~k4DataSvc();

// Use DataSvc functionality except where we override
using DataSvc::registerObject;
/// Overriding standard behaviour of evt service
/// Register object with the data store.
virtual StatusCode registerObject(std::string_view parentPath, std::string_view fullPath,
DataObject* pObject) override final;

const std::string_view getCollectionType(const std::string& collName);

template <typename T> StatusCode readCollection(const std::string& collName) {
DataObject* objectPtr = nullptr;
if (DataSvc::findObject("/Event", "/" + collName, objectPtr)) {
debug() << "Collection " << collName << " already read, not reading it again" << endmsg;
return StatusCode::SUCCESS;
}
const T* collection(nullptr);
collection = static_cast<const T*>(m_eventframe.get(collName));
if (collection == nullptr) {
error() << "Collection " << collName << " does not exist." << endmsg;
}
auto wrapper = new DataWrapper<T>;
wrapper->setData(collection);
m_podio_datawrappers.push_back(wrapper);
return DataSvc::registerObject("/Event", "/" + collName, wrapper);
}

const podio::Frame& getEventFrame() const { return m_eventframe; }

/// Resets caches of reader and event store, increases event counter
void endOfRead();

/// TODO: Make this private again after conversions have been properly solved
podio::Frame& getMetaDataFrame() { return m_metadataframe; }

private:
/// PODIO reader for ROOT files
podio::ROOTReader m_reader;
/// PODIO Frame, used to initialise collections
podio::Frame m_eventframe;
/// PODIO Frame, used to store metadata
podio::Frame m_metadataframe;
/// Counter of the event number
int m_eventNum{0};
/// Number of events in the file / to process
int m_numAvailableEvents{-1};
int m_requestedEventMax{-1};
/// Whether reading from file at all
bool m_reading_from_file{false};

SmartIF<IConversionSvc> m_cnvSvc;

// Registry of data wrappers; needed for memory management
std::vector<DataWrapperBase*> m_podio_datawrappers;

protected:
/// ROOT file name the input is read from. Set by option filename
std::vector<std::string> m_filenames;
std::string m_filename;
/// Jump to nth events at the beginning. Set by option FirstEventEntry
/// This option is helpful when we want to debug an event in the middle of a file
unsigned m_1stEvtEntry{0};
bool m_bounds_check_needed{true};
};
#endif // CORE_PODIODATASVC_H
Loading

0 comments on commit 8e447dd

Please sign in to comment.