From adb63e8ffa73a4ed1f953cb204a6a67860608e09 Mon Sep 17 00:00:00 2001
From: Wouter Deconinck <wouter.deconinck@umanitoba.ca>
Date: Wed, 28 Jul 2021 05:42:42 +0000
Subject: [PATCH] Finalized RDataFrame example

---
 src/docs/part5/reconstruction_analysis.md | 24 +++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/docs/part5/reconstruction_analysis.md b/src/docs/part5/reconstruction_analysis.md
index 304505c..774b9cb 100644
--- a/src/docs/part5/reconstruction_analysis.md
+++ b/src/docs/part5/reconstruction_analysis.md
@@ -252,9 +252,11 @@ TNetXNGFile**           root://sci-xrootd.jlab.org//osgpool/eic/ATHENA/RECO/SING
 events->Draw("ReconstructedParticlesInitFromTruth.p.px")
 events->Draw("EcalBarrelClusters.polar.phi:EcalBarrelClusters.polar.theta", "EcalBarrelClusters.edep", "colz")
 ```
+These types of plots will likely be limited to simple data inspection.
 
 ## Analysis of full simulation reconstruction output with RDataFrame commands
 
+For a more advanced analysis, you can take advantage of the RDataFrame features, such as in this (shortened) DIS example. The [original](https://eicweb.phy.anl.gov/EIC/benchmarks/physics_benchmarks/-/blob/master/benchmarks/dis/analysis/dis_electrons.cxx) is used in our CI system and determines DIS parameters for every change to the detector geometry, simulation, digitization, or reconstruction.
 ```console
 auto momenta_from_reconstruction(const std::vector<eic::ReconstructedParticleData>& parts) {
   std::vector<ROOT::Math::PxPyPzEVector> momenta{parts.size()};
@@ -264,16 +266,34 @@ auto momenta_from_reconstruction(const std::vector<eic::ReconstructedParticleDat
   return momenta;
 }
 
+auto convertMtoE(const std::vector<ROOT::Math::PxPyPzMVector>& mom) {
+  std::vector<ROOT::Math::PxPyPzEVector> momenta{mom.size()};
+  std::transform(mom.begin(), mom.end(), momenta.begin(), [](const auto& part) {
+    return ROOT::Math::PxPyPzEVector{part.Px(), part.Py(), part.Pz(), part.energy()};
+  });
+  return momenta;
+}
+
+bool sort_mom_bool(ROOT::Math::PxPyPzEVector &mom1, ROOT::Math::PxPyPzEVector &mom2) {
+  return  mom1.energy() > mom2.energy(); 
+}
+
+auto sort_momenta(const std::vector<ROOT::Math::PxPyPzEVector>& mom) {
+  std::vector <ROOT::Math::PxPyPzEVector> sort_mom = mom;
+  sort(sort_mom.begin(), sort_mom.end(), sort_mom_bool);
+  return sort_mom;
+}
+
 auto Q2(const std::vector<ROOT::Math::PxPyPzEVector>& mom) {
   std::vector<double> Q2Vec(mom.size() );
-  ROOT::Math::PxPyPzEVector beamMom = {0, 0, 18, 18};
+  ROOT::Math::PxPyPzEVector beamMom = {0, 0, 5, 5};
   std::transform(mom.begin(), mom.end(), Q2Vec.begin(), [beamMom](const auto& part) {
     return -(part - beamMom).M2();
   });
   return Q2Vec;
 }
 
-ROOT::RDataFrame d("events", "s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/SINGLE/e-/1GeV/45to135deg/e-_1GeV_45to135deg.0001.root");
+ROOT::RDataFrame d("events", "s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO//DIS/crossDivNrgCrab/DIS_NC_Q2gt10_crossDivNrgCrab_25mRad_5x41_v2.root");
 
 auto d0 = d.Define("p", momenta_from_reconstruction, {"ReconstructedParticles"}).Define("Q2", Q2, {"p"});
 
-- 
GitLab