---
# System prepended metadata

title: MarlinMT hist manager

---

# MarlinMT hist manager

## Comments from Remi:

1. The code should be placed in directories `include/marlin/book` and `src/book`. Example `include/marlin/book/BookStore.h` and `src/book/BookStore.cc`
2. The project is located on [https://github.com/iLCSoft/MarlinMT](https://github.com/iLCSoft/MarlinMT).
3. Julian: for all `book` stuff, make a new PR
4. The `book` component in MarlinMT must be optional, as it relies on ROOT 7 experimental library

## Comments from Julian:
1. added `include/marlin/hist`

### ROOT Confusions
* Coordinate Array is an `std::array<double, Dimensions>` under the hood
* funFact:
    > if you destroy the filler before the histogram you get a segfault ...
* root Add don't keep the EntrieCount !
## TODO list

Remi:
- [x] Merge the marlin-mt branch in master (PR) 
- [x] Implement a proper CMake find_package call for finding ROOT 7 hist headers
- [ ] Integrate ROOT 7 -> 6 conversion from Hadrian in a PR
- [ ] Fix std hash warning
- [ ] Cleanup MarlinMT test directory

Julian:
- [ ] Define the HistManager interface
    - [x] write Down First ideas
    - [x] iterate over Deseign
    - [x] impliment example Header [link](eba09726811910d330a5d69e507d4cbbfb49dc77)
    - [x] add namspace to MemLayer
    - [x] move Flags in Flag_t
    - [x] add if Malin_Book for tests
- [ ] WriteTest
    - [ ] remove explicit construction
    - [x] no use of default arguments
- [ ] Model the internal storage of booked elements
    - [ ] DataModel modeling
    - [ ] define C++ header
- [ ] Define the XML interface (code and XML)
    - [ ] Construct XML Interface
    - [ ] Define in XML
    - [ ] Define in Code



## BookStore

### Implimentation

#### DataModel
1. unorderd_map<path, shared<HistEntry>>, path = /<processor>/<histPath>
   + **pro** 
       + easy
       + scalable
       + map has O(1) to worst case O(N)
   + **contra**
       + deadlinks when Hist is deleted
       + wastet memory

### API

#### HistogramBooking
```cpp
enum struct Flags : uint8_t {
    MutipleInstance = 1 << 0,
    Default         = 0b…1,
};

template<class BookT>
HND<trait<BookT>>
book( … );

```

#### HistHandle
* types
```cpp
    using Type = HistType;
```
* Filling
```cpp
    histHnd->Fill(…);
    
    /// add one value
    void
    fill(const FillType& x, const Weight_t& w);
    
    /// add mutible values
    void
    fillN(
        const std::span<CoordArray_t const>& xN,
        const std::span<Weight_t const>& w);
```
* Reading
```cpp
    /// finalize object and return it
    const Type& Get();
    
```
   
* :::warning
    **Only read in serial parts**. Reading is **not** thread save.

