Accelerate your analysis with ServiceX
Select and transform large datasets into analysis-ready data using Python.
pip install servicex
Simplify your analysis code
Analyze data without writing or building C++ code, reducing tech debt and startup time. A single Python query produces analysis-ready histogram data with minimal environment setup.
uproot_raw_query = query.UprootRaw([{
'treename': 'reco',
'filter_name': [
"truth_alp_decayVtxX",
"truth_alp_decayVtxY",
"truth_alp_pt",
"jet_pt_NOSYS",
],
'cut': '(num(jet_pt_NOSYS)<2) & any((truth_alp_pt>20)',
}])
query = FuncADLQueryPHYSLITE()
jets_per_event = (query
.Select(lambda e: e.Jets().Where(lambda j: (j.pt() / 1000 > 30)))
.Select(lambda jets: {
'pt': jets.Select(lambda j: j.pt() / 1000),
})
)
jet_data = get_data(jets_per_event, dataset)
plt.hist(ak.flatten(data.jet), bins=50, range=(0, 100))
Transfer far less data
ServiceX applies your branch selection and your event cuts where the data already lives. Only what you asked for is sent back, so a dataset measured in terabytes arrives as something you can hold on a laptop.
That means less time waiting on transfers, less local storage, and no separate skimming step to maintain.
Inspect a dataset without downloading it
Checking whether a dataset actually contains the branch you need normally means pulling a file off the grid first. get_structure() asks ServiceX for the file structure instead, and returns the branches and their types. No event data is read and nothing lands on your disk.
You can filter to the branches you care about, print the result, save it to a text file, or ask for ak.Array types back for programmatic checks. Results are cached, so a second look is much faster.
from servicex_analysis_utils import get_structure
get_structure(
"mc23_13TeV:some-dataset-rucio-id",
filter_branch="jet_",
do_print=True,
)
servicex-get-structure "scope:dataset-id" --filter_branch "el_"
What you get
Python, not C++
Write your selection in Python. There is no framework to build and no compile step to wait on.
Modular backends
Raw Uproot, a plain Python function, or FuncADL, pick the transformer that suits your data; the delivery workflow does not change.
Cached transformations
Repeat a request and ServiceX returns the cached result rather than redoing the transformation.
Standard output formats
Results come back as Parquet, ROOT TTree, or RNTuple, written to a local cache.
From install to histogram in 15 minutes
The 15-Minute Histogram Challenge walks you from a fresh environment to a plotted result.