π€ SCRIPTS#
Obtain file paths#
Before starting with the analysis you may need to get the paths of the HDF5 files you want to use.
They could be already availbale in the folder: /eos/experiment/neutplatform/protodune/experiments/ProtoDUNE-VD/ruciopaths/ (for NP02) or you can get the rucio_path using the tools listed below:
setup_rucio_a9.sh: script to setup therucioenvironment variables in your terminal. After that you can produce all the paths you need without re-authenticating.fetch_rucio_replicas.py: script that wraps the needed tools to save the paths of the HDF5 files you want to decode.
This can be summarized in the following steps:
Get path for several runs (without re-authenticating)#
For using these scripts you need valid FNAL credentials. Have a look at the RUCIO DOCS for more details of this process.
source setup_rucio_a9.sh
python fetch_rucio_replicas.py --runs <run_number>, <run_number2>,...
.. warning:: The following five paragraphs (00_HDF5toROOT, C++, Python, 01_Process, 02_RawAna) are valid only for NP04 data
00_HDF5toROOT#
We have developed two decoders (C++ and Python) which output is a root file with the same structure. After running them check /eos/experiment/neutplatform/protodune/experiments/ProtoDUNE-II/PDS_Commissioning/waffles/2_daq_root/run_YOUR_RUN_NUMBER/ for the output root files.
To use the decoders can follow the next instructions:
C++#
Compile the scripts (just the first time)
cd scripts/cpp_utils # Go to the C++ scripts folder
./compile_decoder.sh # Run the script to compile the C++ scripts (will clone the HDF5 library and compile it together with the decoder)
Run the decoder
cd .. # Go back to the scripts folder
sh 00_HDF5toROOT.sh # Run the bash script to manage the C++ macros
# You can also give the run number as an argument (sh 00_HDF5toROOT.sh 27632)
During the execution of the bash script you will be asked for the run number to be processed:
[INFO] Welcome to the script decoding the HDF5 files using the CPP TOOLS [make sure you have compiled the decoder]!. To execute the script just run: sh 00_HDF5toROOT.sh. Optionally:
* [1st argument] the run number (separated by commas: 02ABC,02XYZ),
* [2nd,3rd] first and number of hdf5 files to process (default 0, -1 --> ALL) and
* [4th] path to save the root files (default /eos/experiment/neutplatform/protodune/experiments/ProtoDUNE-II/PDS_Commissioning/waffles/2_daq_root/).
You can run the script without any flag and the required arguments will be asked
Example: sh 00_HDF5toROOT.sh 27644,27645 3 5 --> will process 5 files starting from the 4rd (index 3) file of the run 27644 and 27645 and save the output in the default path
Enjoy! :)
The user should input the run number (27632 or a list as 26755,26756) and choose the running mode (1=decoder, 2=duplications check):
Please provide a run(s) number(s) to be analysed, separated by commas :)
Do you want to run the DUMP an output root file in eos (1) or just a DUPLICATION check (2)? (1/2)
The outputs will be saved in the default eos path /eos/experiment/neutplatform/protodune/experiments/ProtoDUNE-II/PDS_Commissioning/waffles/2_daq_root/run_XXXX or in the path provided by the user.
Tip
CPP UTILS
Once you have compiled the cpp macros (HDF5toROOT_decoder and HDF5LIBS_duplications) you can use them from the command line from wherever you are. The bash script 00_HDF5toROOT.sh is just a wrapper to manage the input arguments and the output paths. Therefore if you have an output .hdf5 file not included in rucio you can decode it by running: HDF5toROOT_decoder /path/to/your/file.hdf5
Python#
Run the decoder
python 00_HDF5toROOT.py # Run the Python script to decode the HDF5 files
# You can also give the run number as an argument (python 00_HDF5toROOT.py --runs 27632)
In order to use this decoder you need to have ROOT installed in your virtual environment. If you donβt have it, you can install it by running:
UNDER TESTING
# INSIDE THE VIRTUAL ENVIRONMENT (you have source env.sh before)
git clone --branch latest-stable --depth=1 https://github.com/root-project/root.git root_src
mkdir root_build root_install && cd root_build
cmake -DCMAKE_INSTALL_PREFIX=../root_install -Ddataframe=OFF ../root_src
cmake --build . -- install -j1
If some error appears during the installation related with Roofit, just disable it by adding the command -Droofit=OFF on the cmake.
After that, every time you log in, you need to source ROOT, or you can edit env.sh and add this command:
source ../root_install/bin/thisroot.sh
01_Process#
This script is used to convert the raw .hdf5 files into waffles classes and save it locally in .pkl format. In order to run this script make sure you have a waffles/data folder to store the output files. In summary what this script does is:
import waffles.input_output.raw_hdf5_reader as reader
rucio_files = f"/eos/experiment/neutplatform/protodune/experiments/ProtoDUNE-II/PDS_Commissioning/waffles/1_rucio_paths/028602.txt"
allfilepath = reader.get_filepaths_from_rucio(rucio_filepath)
waveformset = reader.WaveformSet_from_hdf5_files( filepaths[:int(file_lim)], read_full_streaming_data = False)
with open(f"data/{run}_full_wfset_raw.pkl", "wb") as f:
pickle.dump(wfset, f)
Some decorators are included to require the user inputs, such as the run number and the number of files to process. This allows the analysers to have a common starting point and avoid the need to change the code every time they want to process a new run.
02_RawAna#
Following the same structure as the previous script, this one reads the WaveformSet objects stored in the .pkl files from 01_Process and performs some basic analysis. The goal of this script is to provide the user quick visualization of the BasicAnalysis output channel by channel. Make sure you have a waffles/config/run_number.json folder and file with the input parameters for the analysis. A template for these configuration files could be:
{
"standard": { #analysis_label
"base_lim": [0, 70, 900, 1000], #limits for the baseline computation
"int_ll": 50, #lower limit for the integral computation
"int_ul": 130, #upper limit for the integral computation
"amp_ll": 0, #lower limit for the amplitude computation
"amp_ul": 1000 #upper limit for the amplitude computation
},
"avanced": { ... }
}
After filtering the full WaveformSet object, a plot will be displayed using plot_ChannelWsGrid from the waffles.plotting module. This plot will show 10 Waveform objects together with the baseline and analysis limits. Additionally, the analyser can plot the waveforms objects using the plot_WaveformAdcs function from the same module with a loop as follows:
for wf in filter_wfset.waveforms:
plot_WaveformAdcs( wf, figure = figure,
plot_analysis_markers = True,
show_baseline_limits = True,
show_baseline = True,
show_general_integration_limits = True,
show_general_amplitude_limits = True,
show_spotted_peaks = True,
show_peaks_integration_limits = False)
07_save_structured_from_config.py#
This script is used to convert the raw .hdf5 files into waffles classes and save it in a compressed .hdf5 format.