diff --git a/benchmarks/tcs/analysis/tcs_tests.cxx b/benchmarks/tcs/analysis/tcs_tests.cxx
index 5fe49b7be9b473ec28b5a694eb99d8fab2327c73..f833b43a5f41c936b8db6ca92fbcb870a6abc9a2 100644
--- a/benchmarks/tcs/analysis/tcs_tests.cxx
+++ b/benchmarks/tcs/analysis/tcs_tests.cxx
@@ -6,6 +6,7 @@
 #include "ROOT/RDataFrame.hxx"
 #include "Math/Vector4D.h"
 #include "TCanvas.h"
+#include "TLegend.h"
 
 #include <nlohmann/json.hpp>
 using json = nlohmann::json;
@@ -28,13 +29,33 @@ void tcs_tests(const char* fname = "rec_tcs.root"){
   ROOT::EnableImplicitMT();
   ROOT::RDataFrame df("events", fname);
 
+  auto ff_theta_mrad = [] (
+      const std::vector<eic::ReconstructedParticleData>& v,
+      const int16_t status
+  ) -> std::vector<float> {
+    std::vector<float> theta;
+    for (const auto& p: v)
+      if (p.status == status)
+        theta.push_back(1000. * p.direction.theta);
+    return theta;
+  };
+
   auto df0 = df.Define("n_parts", "ReconstructedParticles.size()")
                .Define("isQ2gt1", "InclusiveKinematicsTruth.Q2 > 1.0")
-               .Define("n_Q2gt1", "isQ2gt1.size()");
+               .Define("n_Q2gt1", "isQ2gt1.size()")
+               .Define("ff_theta_mrad_B0", [&](const std::vector<eic::ReconstructedParticleData>& v){return ff_theta_mrad(v,1);}, {"ReconstructedFFParticles"})
+               .Define("ff_theta_mrad_RP", [&](const std::vector<eic::ReconstructedParticleData>& v){return ff_theta_mrad(v,2);}, {"ReconstructedFFParticles"})
+               .Define("ff_theta_mrad_OMD",[&](const std::vector<eic::ReconstructedParticleData>& v){return ff_theta_mrad(v,3);}, {"ReconstructedFFParticles"})
+               .Define("ff_theta_mrad_ZDC",[&](const std::vector<eic::ReconstructedParticleData>& v){return ff_theta_mrad(v,4);}, {"ReconstructedFFParticles"})
+               ;
 
   auto h_n_parts = df0.Histo1D({"h_n_parts", "; h_n_parts n", 10, 0, 10}, "n_parts");
   auto h_Q2      = df0.Histo1D({"h_Q2", "; Q^{2} [GeV^{2}/c^{2}]", 100, 0, 30}, "InclusiveKinematicsTruth.Q2");
-  auto h_ff_status = df0.Histo1D({"h_ff_status", "; FF status", 10, -0.5, 9.5}, "ReconstructedFFParticles.status");
+  auto h_FF      = df0.Histo1D({"h_FF", "; FF status", 10, -0.5, 9.5}, "ReconstructedFFParticles.status");
+  auto h_FF_B0   = df0.Histo1D({"h_FF_B0",  "; FF B0 Theta [mrad]",  100, 0.0, 25.0}, "ff_theta_mrad_B0");
+  auto h_FF_RP   = df0.Histo1D({"h_FF_RP",  "; FF RP Theta [mrad]",  100, 0.0, 25.0}, "ff_theta_mrad_RP");
+  auto h_FF_OMD  = df0.Histo1D({"h_FF_OMD", "; FF OMD Theta [mrad]", 100, 0.0, 25.0}, "ff_theta_mrad_OMD");
+  auto h_FF_ZDC  = df0.Histo1D({"h_FF_ZDC", "; FF ZDC Theta [mrad]", 100, 0.0, 25.0}, "ff_theta_mrad_ZDC");
   auto n_Q2gt1   = df0.Mean("n_Q2gt1");
   auto n_parts   = df0.Mean("n_parts");
 
@@ -54,7 +75,25 @@ void tcs_tests(const char* fname = "rec_tcs.root"){
   c->SaveAs("results/tcs/n_parts.pdf");
 
   c = new TCanvas();
-  h_ff_status->DrawCopy();
-  c->SaveAs("results/tcs/ff_status.png");
-  c->SaveAs("results/tcs/ff_status.pdf");
+  h_FF->DrawCopy();
+  c->SaveAs("results/tcs/ff.png");
+  c->SaveAs("results/tcs/ff.pdf");
+
+  c = new TCanvas();
+  h_FF_B0->SetLineColor(1);
+  h_FF_B0->DrawCopy();
+  h_FF_RP->SetLineColor(2);
+  h_FF_RP->DrawCopy("same");
+  h_FF_OMD->SetLineColor(3);
+  h_FF_OMD->DrawCopy("same");
+  h_FF_ZDC->SetLineColor(4);
+  h_FF_ZDC->DrawCopy("same");
+  auto legend = new TLegend(0.1,0.7,0.48,0.9);
+  legend->AddEntry(h_FF_B0.GetPtr(),  "B0",  "L");
+  legend->AddEntry(h_FF_RP.GetPtr(),  "RP",  "L");
+  legend->AddEntry(h_FF_OMD.GetPtr(), "OMD", "L");
+  legend->AddEntry(h_FF_ZDC.GetPtr(), "ZDC", "L");
+  legend->Draw();
+  c->SaveAs("results/tcs/ff_theta.png");
+  c->SaveAs("results/tcs/ff_theta.pdf");
 }
diff --git a/benchmarks/tcs/tcs.sh b/benchmarks/tcs/tcs.sh
index d2c6e879ed15f915655e38225c6a8e36ee456d0f..6c8589470489d74b6fca36e7ff873c06f2bbf4e4 100644
--- a/benchmarks/tcs/tcs.sh
+++ b/benchmarks/tcs/tcs.sh
@@ -111,7 +111,7 @@ echo "JUGGLER_DETECTOR    = ${JUGGLER_DETECTOR}"
 ## 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 . cat --insecure ${DATA_URL} | gunzip -c | head -n 1004 |  sanitize_hepmc3 > "${JUGGLER_MC_FILE}"
+  mc -C . cat --insecure ${DATA_URL} | gunzip -c | head -n $((20+10*JUGGLER_N_EVENTS)) |  sanitize_hepmc3 > "${JUGGLER_MC_FILE}"
   if [[ "$?" -ne "0" ]] ; then
     echo "Failed to download hepmc file"
     exit 1
@@ -135,6 +135,7 @@ if [[ -n "${DO_SIM}" || -n "${DO_ALL}" ]] ; then
 fi
 
 ### Step 3. Run the reconstruction (juggler)
+export PBEAM
 if [[ -n "${DO_REC}" || -n "${DO_ALL}" ]] ; then
   for rec in options/*.py ; do
     unset tag