Run a Simple ROOT Script

Last update: 23 Aug 2024 [History] [Edit]

It is also possible to set up ROOT, and run ROOT-based code on the grid.

First you should log out of lxplus, and then log back in. Create a new directory in GridTutorial:

mkdir RootGridTest 
cd RootGridTest
setupATLAS

Next we will set up a standalone version of ROOT (and also the pandaclient tools). You can see which versions are available with:

lsetup 'root --help'

In our case, we will use the following version (see how we added panda as well, so that all steps are configured together):

lsetup "root 6.32.06-x86_64-el9-gcc13-opt" panda

tip It’s good practice to set up all the tools you will need in one go with lsetup. The script has some built-in features that let it gracefully handle conflicts and give you a fully-functional environment.

Next we will create a simple macro to create a root file, create a histogram, fill the histogram with random values, and write the output.

Create a file called HistTest.C and copy and paste the following lines into it:

void HistTest() {
  TFile * foo = TFile::Open("foo.root","recreate");
  TH1D * h = new TH1D("h_gaus","h_gaus",30,-5,5);
  TRandom3 rand(0);
  for (unsigned int i=0; i< 100000; ++i) {
        h->Fill(rand.Gaus(0.2,1.0));
  }
  h->Write();
  foo->Close();
}

As usual, we check that the code runs normally first locally:

root -b -q HistTest.C

tip The -b option in ROOT is for “batch mode”, which turns off graphics. The -q option is for “quit”, which makes it exit after it has run the script.

You should see that a root file called foo.root was created with a single histogram.

We will now run the same command on the grid and retrieve the output into a rucio dataset.

tip Remove the local foo.root before launching the job:

rm foo.root

It’s generally good practice to have a very clean running area before you submit jobs to the grid, because all the files in your directory (with some exceptions) will be packed up and shipped to the grid.

Run the command:

prun --exec="root -b -q HistTest.C" --nJobs=1 --outputs=foo.root --outDS=user.$USER.prunroottest1 --rootVer=6.32.06 --cmtConfig=x86_64-el9-gcc13-opt

Be sure to replace $USER if necessary.

We have added some arguments to the prun command: the root version and config. This ensures that the same version of root is set up on the grid worker node. Note that certain files (such as ROOT files – e.g., foo.root –) are not automatically uploaded to the grid with the grid job.

tip If you don’t remove foo.root before submitting your job, you will see that prun tells you it’s ignoring the file: “skip root file ./foo.root”

Once the job completes, you should be able to use rucio to download the dataset containing the root file output. Follow the same steps you did in the previous section, and make sure you look for the output ending in .root instead of .tgz.

tip PanDA has lots of handy options for controlling output. In this job we told it to expect an output file called foo.root. If we hadn’t, or the output had a different name, it might have packed it up in the log file tarball that it saves with the job. When your job has many outputs, PanDA also has options for splitting up the outputs into different datasets. The documentation you can find on the website and via the command line (prun --help) is quite extensive.