Using xAODs in our algorithm package

Last update: 11 Mar 2024 [History] [Edit]

In both EventLoop and Athena if you want to do any sort of real analysis you will access the xAOD objects through the event store. To add some xAOD-related output to our job let’s retrieve the EventInfo object and print out the run and event number for each event. We chose this, because every xAOD you encounter will have an EventInfo object (so you can run this on any file) and because knowing the run and event number can actually be useful when you are debugging your job and need to identify a specific event.

The run and event number are stored in the EventInfo object, which is defined in the xAODEventInfo package, so let’s add that to our MyAnalysis/CMakeLists.txt LINK_LIBRARIES field. It should now look like this (we only added xAODEventInfo to it, the rest of the command is unchanged):

atlas_add_library (MyAnalysisLib
  MyAnalysis/*.h Root/*.cxx
  LINK_LIBRARIES AnaAlgorithmLib xAODEventInfo)

In the future when we tell you to add a library just add it to the end of that command (we won’t be spelling this out again). The name of the library is usually either the package name (e.g. PackageName) or the package name with the Lib suffix (e.g. PackageNameLib). It is somewhat arbitrary which convention is used for any given package. You’ll have to check the documentation, look at the CMakeLists.txt file in that package, or just try both alternatives.

Next add the corresponding include at the top of MyAnalysis/Root/MyxAODAnalysis.cxx:

#include <xAODEventInfo/EventInfo.h>

Then in execute() we need to retrieve the EventInfo object and print out the run and event number

StatusCode MyxAODAnalysis :: execute ()
  // Here you do everything that needs to be done on every single
  // events, e.g. read input variables, apply cuts, and fill
  // histograms and trees. This is where most of your actual analysis
  // code will go.

  ANA_MSG_INFO ("in execute");

  // Retrieve the eventInfo object from the event store
  const xAOD::EventInfo *eventInfo = nullptr;
  ANA_CHECK (evtStore()->retrieve (eventInfo, "EventInfo"));

  // Print out run and event number from retrieved object
  ANA_MSG_INFO ("in execute, runNumber = " << eventInfo->runNumber() << ", eventNumber = " << eventInfo->eventNumber());

  return StatusCode::SUCCESS;

There is quite a bit of magic going on here. If everything seems clear to you: great! If not, don’t worry too much, we’ll be coming back to it and explaining the different parts in more detail (it’s a bit of a chicken and an egg problem).

Now let’s recompile:

cd ../build/

Note that when we called make it calls cmake for us, because it realizes that we modified the CMakeLists.txt file and need to call cmake.

If we go to the run directory and re-run our job we should now see it print out run and event numbers for every event.

If you are using EventLoop call:

cd ../run --submission-dir=submitDir

If you are using Athena call:

cd ../run MyAnalysis/

tip Putting INFO messages in execute() will clutter your screen each time you run and will make it difficult to parse the output. It is recommended that you change the messages in execute() to use ANA_MSG_DEBUG. You can leave the messages in initialize() and finalize() as ANA_MSG_INFO since they will only be called once. Be sure to compile and test this change before committing.

When you are happy that your code changes are working as expected, commit and push your changes.

⭐️ Bonus Exercise

Browse the xAOD code in LXR and see if your can find how to print the Bunch Crossing ID, or another property of EventInfo.