Back to home page

EIC code displayed by LXR

 
 

    


Warning, file /include/root/ROOT/RDF/RTreeColumnReader.hxx was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

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    };
0082 
0083    RTreeUntypedArrayColumnReader(TTreeReader &r, std::string_view colName, std::string_view valueTypeName,
0084                                  ECollectionType collType);
0085 
0086    // Rule of five
0087 
0088    RTreeUntypedArrayColumnReader(const RTreeUntypedArrayColumnReader &) = delete;
0089    RTreeUntypedArrayColumnReader &operator=(const RTreeUntypedArrayColumnReader &) = delete;
0090    RTreeUntypedArrayColumnReader(RTreeUntypedArrayColumnReader &&) = delete;
0091    RTreeUntypedArrayColumnReader &operator=(RTreeUntypedArrayColumnReader &&) = delete;
0092    ~RTreeUntypedArrayColumnReader() final; // Define destructor when data member type is fully defined
0093 
0094 private:
0095    std::unique_ptr<ROOT::Internal::TTreeReaderUntypedArray> fTreeArray;
0096    ECollectionType fCollectionType;
0097 
0098    using Byte_t = std::byte;
0099    /// We return a reference to this RVec to clients, to guarantee a stable address and contiguous memory layout.
0100    RVec<Byte_t> fRVec{};
0101 
0102    Long64_t fLastEntry = -1;
0103 
0104    /// The size of the collection value type.
0105    std::size_t fValueSize{};
0106 
0107    /// Whether we already printed a warning about performing a copy of the TTreeReaderArray contents
0108    bool fCopyWarningPrinted = false;
0109 
0110    void *GetImpl(Long64_t entry) override;
0111 };
0112 
0113 class R__CLING_PTRCHECK(off) RMaskedColumnReader : public ROOT::Detail::RDF::RColumnReaderBase {
0114    std::unique_ptr<ROOT::Detail::RDF::RColumnReaderBase> fValueReader;
0115    std::unique_ptr<TTreeReaderValue<uint64_t>> fTreeValueMask;
0116    unsigned int fMaskIndex = 0;
0117 
0118    void *GetImpl(Long64_t) override;
0119 
0120 public:
0121    RMaskedColumnReader(TTreeReader &r, std::unique_ptr<ROOT::Detail::RDF::RColumnReaderBase> valueReader,
0122                        std::string_view maskName, unsigned int maskIndex);
0123    ~RMaskedColumnReader() override;
0124    void SetColumnReader(std::unique_ptr<ROOT::Detail::RDF::RColumnReaderBase> reader)
0125    {
0126       fValueReader = std::move(reader);
0127    }
0128 };
0129 
0130 } // namespace RDF
0131 } // namespace Internal
0132 } // namespace ROOT
0133 
0134 #endif