4 #ifndef JUGBASE_DATAHANDLE_H
5 #define JUGBASE_DATAHANDLE_H
10 #include <GaudiKernel/AlgTool.h>
11 #include <GaudiKernel/Algorithm.h>
12 #include <GaudiKernel/DataObjectHandle.h>
13 #include <GaudiKernel/GaudiException.h>
14 #include <Gaudi/Property.h>
15 #include <GaudiKernel/ServiceLocatorHelper.h>
19 #include <type_traits>
33 class DataHandle :
public DataObjectHandle<DataWrapper<T>> {
44 DataHandle(DataObjID& descriptor, Gaudi::DataHandle::Mode a, IDataHandleHolder* fatherAlg);
46 DataHandle(
const std::string& k, Gaudi::DataHandle::Mode a, IDataHandleHolder* fatherAlg);
62 ServiceHandle<IDataProviderSvc> m_eds;
63 bool m_isGoodType{
false};
64 bool m_isCollection{
false};
71 if constexpr (std::is_integral_v<T> || std::is_floating_point_v<T>) {
79 : DataObjectHandle<
DataWrapper<T>>(descriptor, a, fatherAlg), m_eds(
"EventDataSvc",
"DataHandle") {
85 : DataObjectHandle<
DataWrapper<T>>(descriptor, a, fatherAlg), m_eds(
"EventDataSvc",
"DataHandle") {
87 if (a == Gaudi::DataHandle::Writer) {
88 auto ret = m_eds.retrieve();
94 if (std::is_convertible<T*,podio::CollectionBase*>::value) {
98 }
else if constexpr (std::is_integral_v<T>) {
106 tree->Branch(descriptor.c_str(), m_dataPtr, (descriptor +
"/I").c_str());
107 }
else if constexpr (std::is_floating_point_v<T>) {
113 tree->Branch(descriptor.c_str(), m_dataPtr, (descriptor +
"/D").c_str());
115 tree->Branch(descriptor.c_str(), m_dataPtr, (descriptor +
"/F").c_str());
122 tree->Branch(descriptor.c_str(), &m_dataPtr);
135 template <
typename T>
137 DataObject* dataObjectp =
nullptr;
138 auto sc = m_eds->retrieveObject(DataObjectHandle<
DataWrapper<T>>::fullKey().
key(), dataObjectp);
140 if (LIKELY(sc.isSuccess())) {
141 if (UNLIKELY(!m_isGoodType && !m_isCollection)) {
143 m_isGoodType =
nullptr !=
dynamic_cast<DataWrapper<T>*
>(dataObjectp);
146 if (tmp !=
nullptr) {
147 m_isCollection =
nullptr !=
dynamic_cast<T*
>(tmp->collectionBase());
151 if (LIKELY(m_isGoodType)) {
153 }
else if (m_isCollection) {
159 std::string errorMsg(
"The type provided for " + DataObjectHandle<
DataWrapper<T>>::pythonRepr() +
160 " is different from the one of the object in the store.");
161 throw GaudiException(errorMsg,
"wrong product type", StatusCode::FAILURE);
164 std::string msg(
"Could not retrieve product " + DataObjectHandle<
DataWrapper<T>>::pythonRepr());
165 throw GaudiException(msg,
"wrong product name", StatusCode::FAILURE);
169 template <
typename T>
171 std::unique_ptr<DataWrapper<T>> dw = std::make_unique<DataWrapper<T>>();
174 if constexpr (std::is_integral_v<T> || std::is_floating_point_v<T>) {
175 *m_dataPtr = *objectp;
179 dw->setData(objectp);
180 DataObjectHandle<DataWrapper<T>>::put(std::move(dw));
189 template <
typename T>
191 T* objectp =
new T();
199 class Property<::
DataHandle<T>&> :
public ::DataHandleProperty {