iLCSoft / LCIO

Linear Collider I/O
BSD 3-Clause "New" or "Revised" License
17 stars 34 forks source link

LCReader::readEvent(int runNumber, int evtNumber) is broken #142

Closed dudarboh closed 2 years ago

dudarboh commented 2 years ago

Reproducable in iLCSoft release:

source /cvmfs/ilc.desy.de/sw/x86_64_gcc82_centos7/v02-02-02/init_ilcsoft.sh

.rootlogon.C inlcudes

gInterpreter->AddIncludePath("$LCIO");
gSystem->Load("${LCIO}/lib/liblcio.so");
gSystem->Load("${LCIO}/lib/liblcioDict.so");

Reproducer bug.C

#ifndef __CINT__
#include "lcio.h"
#include "IO/LCReader.h"
#include "IOIMPL/LCFactory.h"
#include "EVENT/LCCollection.h"
#include "EVENT/ReconstructedParticle.h"
#include "EVENT/MCParticle.h"
#include "EVENT/LCEvent.h"
#include "UTIL/LCTOOLS.h"
#endif

#include "TH1F.h"
#include "UTIL/LCRelationNavigator.h"
// #include "TInterpreter.h"

using namespace lcio;
using namespace std;

void bug(){
    const char* file = "/pnfs/desy.de/ilc/prod/ilc/mc-2020/ild/dst-merged/1-calib/single/ILD_l5_o1_v02_nobg/v02-02-01/00015417/000/rv02-02-01.sv02-02-01.mILD_l5_o1_v02_nobg.E1-calib.I110175.Ps_310_p010.e0.p0.n001.d_dstm_15417_0.slcio";
    IO::LCReader* lcReader = IOIMPL::LCFactory::getInstance()->createLCReader();
    lcReader->setReadCollectionNames( { "PandoraPFOs"} );
    lcReader->open(file);
    int nEventsInFile = lcReader->getNumberOfEvents();
    int nRunsInFile = lcReader->getNumberOfRuns();

    cout<<"File has "<<nRunsInFile<<" runs and "<<nEventsInFile<<" events"<<endl;
    vector<int> runNumbers;
    lcReader->getRuns(runNumbers);
    vector<int> eventNumbers;
    lcReader->getEvents(eventNumbers);

    for(auto run : runNumbers){
        for(auto ev : eventNumbers){
            cout<<"Run number "<<run<<" event number "<<ev<<endl;
            LCEvent* evt = nullptr;
            evt = lcReader->readEvent(run, ev);
            // evt = lcReader->readNextEvent();

            if (evt == nullptr){
                cout<<"Oops... I am empty :("<<endl;
                continue;
            }
            else{
                LCCollection* pfoCol = evt->getCollection("PandoraPFOs");
                cout<<"Yaay! I am working"<<endl;
            }
        }
    }
    lcReader->close();
}

run simply as root bug.C

Input file used as an example

/pnfs/desy.de/ilc/prod/ilc/mc-2020/ild/dst-merged/1-calib/single/ILD_l5_o1_v02_nobg/v02-02-01/00015417/000/rv02-02-01.sv02-02-01.mILD_l5_o1_v02_nobg.E1-calib.I110175.Ps_310_p010.e0.p0.n001.d_dstm_15417_0.slcio

Output vs expected

Using evt = lcReader->readEvent(run, ev); always returns nullptr While using evt = lcReader->readNextEvent(); works fine..

Guess:

Maybe falls in the else here:

https://github.com/iLCSoft/LCIO/blob/8f9e86b93b7d5d83221fabb872ed7e82f1638476/src/cpp/src/MT/LCReader.cc#L323-L336

dudarboh commented 2 years ago

Wasn't reading documentation carefully enough..

getEvents() returns both run number and event number... getRuns() is redundant then?

Closing as irrelevant