diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index bf7f0bfd3a8979b89234495999a08c5028c9f2c4..b611efc246ab8fb57c89bf15a4640249932cdc1b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -70,6 +70,7 @@ include:
   - local: 'benchmarks/dvcs/config.yml'
   - local: 'benchmarks/u_omega/config.yml'
   - local: 'benchmarks/single/config.yml'
+  - local: 'benchmarks/synchrotron/config.yml'
 
 summary:
   stage: finish
diff --git a/benchmarks/synchrotron/analysis/synchrotron_raw.cxx b/benchmarks/synchrotron/analysis/synchrotron_raw.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..3798cd86e4db39885aa8b3cb991cbc9b14065c6b
--- /dev/null
+++ b/benchmarks/synchrotron/analysis/synchrotron_raw.cxx
@@ -0,0 +1,30 @@
+#include <cmath>
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include "ROOT/RDataFrame.hxx"
+#include "Math/Vector4D.h"
+#include "TCanvas.h"
+
+#include <nlohmann/json.hpp>
+using json = nlohmann::json;
+
+R__LOAD_LIBRARY(libfmt.so)
+#include "fmt/core.h"
+#include "fmt/color.h"
+
+R__LOAD_LIBRARY(libeicd.so)
+R__LOAD_LIBRARY(libDD4pod.so)
+
+#include "eicd/ReconstructedParticleCollection.h"
+
+void synchrotron_raw(const char* fname = "rec_synchrotron.raw.root"){
+
+  fmt::print(fmt::emphasis::bold | fg(fmt::color::forest_green), "Running synchrotron analysis...\n");
+
+  // Run this in multi-threaded mode if desired
+  ROOT::EnableImplicitMT();
+  ROOT::RDataFrame df("events", fname);
+
+}
diff --git a/benchmarks/synchrotron/analysis/synchrotron_sim.cxx b/benchmarks/synchrotron/analysis/synchrotron_sim.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..00b0835b404c389f7b4b794758378842b8498dbb
--- /dev/null
+++ b/benchmarks/synchrotron/analysis/synchrotron_sim.cxx
@@ -0,0 +1,41 @@
+#include <cmath>
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include "ROOT/RDataFrame.hxx"
+#include "Math/Vector4D.h"
+#include "TCanvas.h"
+
+#include <nlohmann/json.hpp>
+using json = nlohmann::json;
+
+R__LOAD_LIBRARY(libfmt.so)
+#include "fmt/core.h"
+#include "fmt/color.h"
+
+R__LOAD_LIBRARY(libeicd.so)
+R__LOAD_LIBRARY(libDD4pod.so)
+
+#include "eicd/ReconstructedParticleCollection.h"
+
+void synchrotron_sim(const char* fname = "sim_synchrotron.root"){
+
+  fmt::print(fmt::emphasis::bold | fg(fmt::color::forest_green), "Running synchrotron analysis...\n");
+
+  // Run this in multi-threaded mode if desired
+  ROOT::EnableImplicitMT();
+  ROOT::RDataFrame df("events", fname);
+
+  // Define variables
+  auto df0 = df
+    .Define("n_VertexBarrelHits", "VertexBarrelHits.size()")
+    .Define("n_VertexEndcapHits", "VertexEndcapHits.size()")
+  ;
+
+  auto n_VertexBarrelHits = df0.Mean("n_VertexBarrelHits");
+  auto n_VertexEndcapHits = df0.Mean("n_VertexEndcapHits");
+
+  std::cout << "n_VertexBarrelHits = " << *n_VertexBarrelHits << " / ev" << std::endl;
+  std::cout << "n_VertexEndcapHits = " << *n_VertexEndcapHits << " / ev" << std::endl;
+}
diff --git a/benchmarks/synchrotron/config.yml b/benchmarks/synchrotron/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6232b12c6809e212b937bb80aef07cabaf0557e6
--- /dev/null
+++ b/benchmarks/synchrotron/config.yml
@@ -0,0 +1,15 @@
+synchrotron:process:
+  stage: process
+  extends: .phy_benchmark
+  tags:
+    - s3
+  needs: ["common:detector"]
+  script:
+    - compile_analyses.py synchrotron
+    - bash benchmarks/synchrotron/synchrotron.sh --all
+
+synchrotron:results:
+  stage: collect
+  needs: ["synchrotron:process"]
+  script:
+    - ls -lrth
diff --git a/benchmarks/synchrotron/synchrotron.sh b/benchmarks/synchrotron/synchrotron.sh
new file mode 100644
index 0000000000000000000000000000000000000000..e103ba350f9e2f7ccbeb0615bc5e3ddd26f547c0
--- /dev/null
+++ b/benchmarks/synchrotron/synchrotron.sh
@@ -0,0 +1,163 @@
+#!/bin/bash
+
+function print_the_help {
+  echo "USAGE: ${0} [--rec] [--sim] [--ana] [--all] "
+  echo "    The default options are to run all steps (sim,rec,ana) "
+  echo "OPTIONS: "
+  echo "  --data-init     download the input event data"
+  echo "  --sim,-s        Runs the Geant4 simulation"
+  echo "  --rec,-r        Run the juggler reconstruction"
+  echo "  --ana,-a        Run the analysis scripts"
+  echo "  --all           (default) Do all steps. Argument is included so usage can convey intent."
+  exit 
+}
+
+DO_ALL=1
+DATA_INIT=
+DO_SIM=
+DO_REC=
+DO_ANA=
+
+POSITIONAL=()
+while [[ $# -gt 0 ]]
+do
+  key="$1"
+
+  case $key in
+    -h|--help)
+      shift # past argument
+      print_the_help
+      ;;
+    --all)
+      DO_ALL=2
+      if [[ ! "${DO_REC}${DO_SIM}${DO_ANA}" -eq "" ]] ; then
+        echo "Error: cannot use --all with other arguments." 1>&2
+        print_the_help
+        exit 1
+      fi
+      shift # past value
+      ;;
+    -s|--sim)
+      DO_SIM=1
+      DO_ALL=
+      shift # past value
+      ;;
+    --data-init)
+      DATA_INIT=1
+      DO_ALL=
+      shift # past value
+      ;;
+    -r|--rec)
+      DO_REC=1
+      DO_ALL=
+      shift # past value
+      ;;
+    -a|--analysis)
+      DO_ANA=1
+      DO_ALL=
+      shift # past value
+      ;;
+    *)    # unknown option
+      #POSITIONAL+=("$1") # save it in an array for later
+      echo "unknown option $1"
+      print_the_help
+      shift # past argument
+      ;;
+  esac
+done
+set -- "${POSITIONAL[@]}" # restore positional parameters
+
+# assuming something like .local/bin/env.sh has already been sourced.
+print_env.sh
+
+FILE_NAME_TAG="synchrotron"
+DATA_URL="S3/eictest/ATHENA/EVGEN/SR/SR.10GeV_5kVthreshold_hepmc/25098.hepmc"
+
+export JUGGLER_MC_FILE="${LOCAL_DATA_PATH}/mc_${FILE_NAME_TAG}.hepmc"
+export JUGGLER_SIM_FILE="${LOCAL_DATA_PATH}/sim_${FILE_NAME_TAG}.root"
+export JUGGLER_REC_FILE="${LOCAL_DATA_PATH}/rec_${FILE_NAME_TAG}.root"
+
+echo "FILE_NAME_TAG       = ${FILE_NAME_TAG}"
+echo "JUGGLER_N_EVENTS    = ${JUGGLER_N_EVENTS}"
+echo "JUGGLER_DETECTOR    = ${JUGGLER_DETECTOR}"
+
+
+## To run the reconstruction, we need the following global variables:
+## - JUGGLER_INSTALL_PREFIX: Install prefix for Juggler (simu/recon)
+## - JUGGLER_DETECTOR:       the detector package we want to use for this benchmark
+## - DETECTOR_PATH:          full path to the detector definitions
+
+## Step 1. Get the data
+if [[ -n "${DATA_INIT}" || -n "${DO_ALL}" ]] ; then
+  mc -C . config host add S3 https://dtn01.sdcc.bnl.gov:9000 $S3_ACCESS_KEY $S3_SECRET_KEY
+  mc -C . head -n $((2+5*${JUGGLER_N_EVENTS})) --insecure ${DATA_URL} > ${JUGGLER_MC_FILE}
+  if [[ "$?" -ne "0" ]] ; then
+    echo "Failed to download hepmc files"
+    exit 1
+  fi
+fi
+
+### Step 2. Run the simulation (geant4)
+if [[ -n "${DO_SIM}" || -n "${DO_ALL}" ]] ; then
+  ## run geant4 simulations
+  npsim --runType batch \
+    --part.minimalKineticEnergy 1000*GeV  \
+    --filter.tracker edep0 \
+    -v ERROR \
+    --numberOfEvents ${JUGGLER_N_EVENTS} \
+    --compactFile ${DETECTOR_PATH}/${JUGGLER_DETECTOR}.xml \
+    --inputFiles ${JUGGLER_MC_FILE} \
+    --outputFile ${JUGGLER_SIM_FILE}
+  if [[ "$?" -ne "0" ]] ; then
+    echo "ERROR running npsim"
+    exit 1
+  fi
+fi
+
+### Step 3. Run the reconstruction (juggler)
+if [[ -n "${DO_REC}" || -n "${DO_ALL}" ]] ; then
+  for rec in options/*.py ; do
+    unset tag
+    [[ $(basename ${rec} .py) =~ (.*)\.(.*) ]] && tag=".${BASH_REMATCH[2]}"
+    JUGGLER_REC_FILE=${JUGGLER_REC_FILE/.root/${tag:-}.root} \
+    xenv -x ${JUGGLER_INSTALL_PREFIX}/Juggler.xenv \
+      gaudirun.py ${rec}
+  done
+  if [[ "$?" -ne "0" ]] ; then
+    echo "ERROR running juggler"
+    exit 1
+  fi
+
+  root_filesize=$(stat --format=%s "${JUGGLER_REC_FILE}")
+  if [[ "${JUGGLER_N_EVENTS}" -lt "500" ]] ; then 
+    # file must be less than 10 MB to upload
+    if [[ "${root_filesize}" -lt "10000000" ]] ; then 
+      cp ${JUGGLER_REC_FILE} results/.
+    fi
+  fi
+fi
+
+### Step 4. Run the analysis code
+if [[ -n "${DO_ANA}" || -n "${DO_ALL}" ]] ; then
+  echo "Running analysis scripts"
+  rootls -t  ${JUGGLER_REC_FILE}
+
+  # Store all plots here (preferribly png and pdf files)
+  mkdir -p results/synchrotron
+
+  # here you can add as many scripts as you want.
+  root -b -q "benchmarks/synchrotron/analysis/synchrotron_sim.cxx+(\"${JUGGLER_SIM_FILE}\")"
+  if [[ "$?" -ne "0" ]] ; then
+    echo "ERROR running root script"
+    exit 1
+  fi
+
+  root -b -q "benchmarks/synchrotron/analysis/synchrotron_raw.cxx+(\"${JUGGLER_REC_FILE/.root/.raw.root}\")"
+  if [[ "$?" -ne "0" ]] ; then
+    echo "ERROR running root script"
+    exit 1
+  fi
+fi
+
+
+