Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-22 09:21:22

0001 // Author: Enrico Guiraud CERN 09/2020
0002 // Author: Vincenzo Eduardo Padulano CERN 09/2024
0003 
0004 /*************************************************************************
0005  * Copyright (C) 1995-2024, Rene Brun and Fons Rademakers.               *
0006  * All rights reserved.                                                  *
0007  *                                                                       *
0008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
0009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
0010  *************************************************************************/
0011 
0012 #ifndef ROOT_RDF_RTREECOLUMNREADER
0013 #define ROOT_RDF_RTREECOLUMNREADER
0014 
0015 #include "RColumnReaderBase.hxx"
0016 #include <ROOT/RVec.hxx>
0017 #include "ROOT/RDF/Utils.hxx"
0018 #include <Rtypes.h> // Long64_t, R__CLING_PTRCHECK
0019 
0020 #include <array>
0021 #include <memory>
0022 #include <string>
0023 #include <cstddef>
0024 
0025 class TTreeReader;
0026 template <typename T>
0027 class TTreeReaderValue;
0028 
0029 namespace ROOT {
0030 namespace Internal {
0031 
0032 class TTreeReaderOpaqueValue;
0033 class TTreeReaderUntypedArray;
0034 class TTreeReaderUntypedValue;
0035 
0036 namespace RDF {
0037 
0038 class R__CLING_PTRCHECK(off) RTreeOpaqueColumnReader final : public ROOT::Detail::RDF::RColumnReaderBase {
0039    std::unique_ptr<ROOT::Internal::TTreeReaderOpaqueValue> fTreeValue;
0040 
0041    void *GetImpl(Long64_t) override;
0042 
0043 public:
0044    /// Construct the RTreeColumnReader. Actual initialization is performed lazily by the Init method.
0045    RTreeOpaqueColumnReader(TTreeReader &r, std::string_view colName);
0046 
0047    // Rule of five
0048 
0049    RTreeOpaqueColumnReader(const RTreeOpaqueColumnReader &) = delete;
0050    RTreeOpaqueColumnReader &operator=(const RTreeOpaqueColumnReader &) = delete;
0051    RTreeOpaqueColumnReader(RTreeOpaqueColumnReader &&) = delete;
0052    RTreeOpaqueColumnReader &operator=(RTreeOpaqueColumnReader &&) = delete;
0053    ~RTreeOpaqueColumnReader() final; // Define destructor when data member type is fully defined
0054 };
0055 
0056 /// RTreeColumnReader specialization for TTree values read via TTreeReaderUntypedValue
0057 class R__CLING_PTRCHECK(off) RTreeUntypedValueColumnReader final : public ROOT::Detail::RDF::RColumnReaderBase {
0058    std::unique_ptr<ROOT::Internal::TTreeReaderUntypedValue> fTreeValue;
0059 
0060    void *GetImpl(Long64_t) override;
0061 
0062 public:
0063    RTreeUntypedValueColumnReader(TTreeReader &r, std::string_view colName, std::string_view typeName);
0064 
0065    // Rule of five
0066 
0067    RTreeUntypedValueColumnReader(const RTreeUntypedValueColumnReader &) = delete;
0068    RTreeUntypedValueColumnReader &operator=(const RTreeUntypedValueColumnReader &) = delete;
0069    RTreeUntypedValueColumnReader(RTreeUntypedValueColumnReader &&) = delete;
0070    RTreeUntypedValueColumnReader &operator=(RTreeUntypedValueColumnReader &&) = delete;
0071    ~RTreeUntypedValueColumnReader() final; // Define destructor when data member type is fully defined
0072 };
0073 
0074 /// RTreeColumnReader specialization for TTree values read via TTreeReaderUntypedValue
0075 class R__CLING_PTRCHECK(off) RTreeUntypedArrayColumnReader final : public ROOT::Detail::RDF::RColumnReaderBase {
0076 public:
0077    enum class ECollectionType {
0078       kRVec,
0079       kStdArray,
0080       kRVecBool,
0081       kStdVector
0082    };
0083 
0084    RTreeUntypedArrayColumnReader(TTreeReader &r, std::string_view colName, std::string_view valueTypeName,
0085                                  ECollectionType collType);
0086 
0087    // Rule of five
0088 
0089    RTreeUntypedArrayColumnReader(const RTreeUntypedArrayColumnReader &) = delete;
0090    RTreeUntypedArrayColumnReader &operator=(const RTreeUntypedArrayColumnReader &) = delete;
0091    RTreeUntypedArrayColumnReader(RTreeUntypedArrayColumnReader &&) = delete;
0092    RTreeUntypedArrayColumnReader &operator=(RTreeUntypedArrayColumnReader &&) = delete;
0093    ~RTreeUntypedArrayColumnReader() final; // Define destructor when data member type is fully defined
0094 
0095 private:
0096    std::unique_ptr<ROOT::Internal::TTreeReaderUntypedArray> fTreeArray;
0097    ECollectionType fCollectionType;
0098 
0099    using Byte_t = std::byte;
0100    /// We return a reference to this RVec to clients, to guarantee a stable address and contiguous memory layout.
0101    RVec<Byte_t> fRVec{};
0102 
0103    /// When the user explicitly requests std::vector<T>, we use this std::vector as a stable storage.
0104    std::vector<Byte_t> fStdVector{};
0105 
0106    Long64_t fLastEntry = -1;
0107 
0108    /// The size of the collection value type.
0109    std::size_t fValueSize{};
0110 
0111    /// Whether we already printed a warning about performing a copy of the TTreeReaderArray contents
0112    bool fCopyWarningPrinted = false;
0113 
0114    void *GetImpl(Long64_t entry) override;
0115 
0116    void *ReadStdArray(Long64_t entry);
0117    void *ReadStdVector(Long64_t entry);
0118    void *ReadRVec(Long64_t entry);
0119 };
0120 
0121 class R__CLING_PTRCHECK(off) RMaskedColumnReader : public ROOT::Detail::RDF::RColumnReaderBase {
0122    std::unique_ptr<ROOT::Detail::RDF::RColumnReaderBase> fValueReader;
0123    std::unique_ptr<TTreeReaderValue<uint64_t>> fTreeValueMask;
0124    unsigned int fMaskIndex = 0;
0125 
0126    void *GetImpl(Long64_t) override;
0127 
0128 public:
0129    RMaskedColumnReader(TTreeReader &r, std::unique_ptr<ROOT::Detail::RDF::RColumnReaderBase> valueReader,
0130                        std::string_view maskName, unsigned int maskIndex);
0131    ~RMaskedColumnReader() override;
0132    void SetColumnReader(std::unique_ptr<ROOT::Detail::RDF::RColumnReaderBase> reader)
0133    {
0134       fValueReader = std::move(reader);
0135    }
0136 };
0137 
0138 } // namespace RDF
0139 } // namespace Internal
0140 } // namespace ROOT
0141 
0142 #endif