ATLAS Offline Software
RNTupleAuxDynStore.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 
10 
11 #include "RNTupleAuxDynStore.h"
12 #include "RNTupleAuxDynReader.h"
13 
14 #if ROOT_VERSION_CODE >= ROOT_VERSION( 6, 31, 0 )
15 #include "ROOT/RNTupleReader.hxx"
16 #endif
17 
18 using namespace RootAuxDynIO;
19 
21  long long entry, bool standalone,
22  std::recursive_mutex* iomtx )
23  : RootAuxDynStore( aux_reader, entry, standalone, iomtx ),
24  m_reader( aux_reader )
25 {
26 }
27 
28 
30 {
31  try {
32  auto& fieldInfo = m_reader.getFieldInfo(auxid, *this);
33  if( fieldInfo.status == RNTupleAuxDynReader::FieldInfo::NotFound ) return false;
34 
35  // Make a 1-element vector in the underlying AuxStore for the given auxid
36  SG::AuxStoreInternal::getDataInternal(auxid, 1, 1, true);
37  if( fieldInfo.isPackedContainer ) {
38  setOption (auxid, SG::AuxDataOption ("nbits", 32));
39  }
40 
41  // get memory location where to write data from the branch entry
42  // const_cast because Field::CaptureValue() requires void*
43  [[maybe_unused]] void* data ATLAS_THREAD_SAFE = const_cast<void*>(SG::AuxStoreInternal::getIOData(auxid));
44 
45  // if have mutex, lock to prevent potential concurrent I/O from elsewhere
46  auto io_lock = m_iomutex? std::unique_lock<std::recursive_mutex>(*m_iomutex)
47  : std::unique_lock<std::recursive_mutex>();
48 
49 #if ROOT_VERSION_CODE >= ROOT_VERSION( 6, 31, 0 )
50  //auto view = m_reader.getNativeReader()->GetView<void>(fieldInfo.fieldName, nullptr);
51  fieldInfo.view_p->BindRawPtr(data);
52  (*fieldInfo.view_p)(m_entry);
53 #endif
54 
55  int nbytes = 1; // MN: TODO how to get this?
56  if( nbytes <= 0 ) {
57  throw std::string("Error reading field ") + fieldInfo.fieldName;
58  }
59  // read OK
60  m_reader.addBytes(nbytes);
61  }
62  catch(const std::string& e_str) {
63  ATHCONTAINERS_ERROR("RNTupleAuxDynStore::getData", e_str);
64  return false;
65  }
66  return true;
67 }
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
RootAuxDynIO::RNTupleAuxDynReader
Definition: RNTupleAuxDynReader.h:28
RNTupleAuxDynStore::readData
virtual bool readData(SG::auxid_t auxid) override final
read data from ROOT and store it in m_vecs. Returns False on error
Definition: RNTupleAuxDynStore.cxx:29
RNTupleAuxDynStore::RNTupleAuxDynStore
RNTupleAuxDynStore(RootAuxDynIO::RNTupleAuxDynReader &aux_reader, long long entry, bool standalone, std::recursive_mutex *iomtx=nullptr)
Definition: RNTupleAuxDynStore.cxx:20
RNTupleAuxDynStore::m_reader
RootAuxDynIO::RNTupleAuxDynReader & m_reader
Definition: RNTupleAuxDynStore.h:35
ATHCONTAINERS_ERROR
#define ATHCONTAINERS_ERROR(ctx, msg)
Definition: error.h:50
exceptions.h
Exceptions that can be thrown from AthContainers.
RootAuxDynIO::RNTupleAuxDynReader::getFieldInfo
const FieldInfo & getFieldInfo(const SG::auxid_t &auxid, const SG::AuxStoreInternal &store)
get field informatino for auxid
Definition: RNTupleAuxDynReader.cxx:182
RootAuxDynStore
Definition: RootAuxDynStore.h:16
AuxDataOption.h
Hold information about an option setting request.
SG::auxid_t
size_t auxid_t
Identifier for a particular aux data item.
Definition: AuxTypes.h:27
RootAuxDynStore::m_entry
long long m_entry
Definition: RootAuxDynStore.h:61
lumiFormat.e_str
e_str
Definition: lumiFormat.py:87
error.h
Helper for emitting error messages.
SG::AuxStoreInternal::setOption
virtual bool setOption(auxid_t id, const AuxDataOption &option) override
Set an option for an auxiliary data variable.
Definition: AuxStoreInternal.cxx:610
SG::AuxStoreInternal::getDataInternal
virtual void * getDataInternal(SG::auxid_t auxid, size_t size, size_t capacity, bool no_lock_check)
Return the data vector for one aux data item.
Definition: AuxStoreInternal.cxx:708
SG::AuxStoreInternal::getIOData
virtual const void * getIOData(SG::auxid_t auxid) const override
Return a pointer to the data to be stored for one aux data item.
Definition: AuxStoreInternal.cxx:489
SG::AuxDataOption
Hold information about an option setting request.
Definition: AuxDataOption.h:37
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
RNTupleAuxDynReader.h
RNTupleAuxDynStore.h
RootAuxDynIO
Specialization of RootAuxDynStore for reading Aux Dynamic attributes from RNTuple.
Definition: RNTupleContainer.h:25
AuxTypeRegistry.h
Handle mappings between names and auxid_t.
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
RootAuxDynStore::m_iomutex
std::recursive_mutex * m_iomutex
Optional mutex used to serialize I/O with RootStorageSvc (not owned)
Definition: RootAuxDynStore.h:69
RootAuxDynIO::RNTupleAuxDynReader::addBytes
void addBytes(size_t bytes)
Definition: RNTupleAuxDynReader.h:97