Skip to content

Reader

hipo::reader

Primary entry point for reading HIPO files.

Construction & Opening

reader();
reader(const char *file);  // open on construction

void open(const char *filename);

Dictionary

void readDictionary(dictionary& dict);

Loads schema definitions from the file header. Must be called after open().

Event Iteration

bool next();                    // advance to next event
bool next(event& evt);         // advance and fill event
bool next(banklist& list);     // advance and fill banks directly
bool hasNext();

Reading

void read(event& evt);         // read current event into evt
void getStructure(structure& str, int group, int item);

Banklist Convenience

banklist getBanks(std::vector<std::string> names);

Creates a vector of bank objects from schema names. Use with next(banklist) for clean iteration:

auto list = reader.getBanks({"REC::Particle", "REC::Event"});
while (reader.next(list)) {
    // list[0] = REC::Particle, list[1] = REC::Event
}
void gotoEvent(int eventNumber);
void gotoRecord(int recordNumber);
void rewind();

gotoEvent() uses the file trailer index for O(log R) random access.

User Metadata

std::string readUserConfig(const char *key);

Tag Filtering

void setTags(std::vector<long> tags);

Only read events with matching tags. Tags are set before iteration begins.

Info

int getEventCount();           // total events in file (from index)
int getNRecords();             // number of records
void setVerbose(int level);
void about();                  // print file info

hipo::readerIndex

Manages event-to-record mapping for navigation. Used internally by reader.

bool canAdvance();
void advance();
void loadRecord();
void gotoEvent(int event);
void gotoRecord(int record);
int  getEventNumber();
int  getRecordNumber();
int  getMaxEvents();

Reading Patterns

Pattern 1: Event-based

hipo::reader reader;
reader.open("data.hipo");

hipo::dictionary dict;
reader.readDictionary(dict);

hipo::bank particles(dict.getSchema("REC::Particle"));
hipo::event event;

while (reader.next()) {
    reader.read(event);
    event.read(particles);
    for (int row = 0; row < particles.getRows(); row++) {
        int pid = particles.getInt("pid", row);
    }
}

Pattern 2: Banklist (preferred)

auto list = reader.getBanks({"REC::Particle", "REC::Event"});
while (reader.next(list)) {
    int nparts = list[0].getRows();
    // ...
}

Pattern 3: Random Access

reader.gotoEvent(5000);
reader.read(event);
event.read(particles);