diff --git a/.gitignore b/.gitignore
index 1ef15ea5..189bfb21 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,8 @@ _site
Gemfile.lock
.jekyll-cache
node_modules
-vendor/
+vendor
+!_sass/bootstrap/vendor/
.project
.settings
+.bundle
diff --git a/Gemfile b/Gemfile
index b5b83a37..18237ac8 100644
--- a/Gemfile
+++ b/Gemfile
@@ -14,5 +14,6 @@ group :jekyll_plugins do
end
# Use a stable sass-embedded version to avoid build issues on GitHub Actions
-gem "sass-embedded", "~> 1.68.0"
-
+gem "sass-embedded", "~> 1.99"
+gem "google-protobuf", "~> 4.32"
+gem 'bootstrap', "~> 5.3"
diff --git a/_config.yml b/_config.yml
index 9bb13c72..b43be32c 100644
--- a/_config.yml
+++ b/_config.yml
@@ -10,7 +10,6 @@
# Review documentation to determine if you should use `theme` or `remote_theme`
# https://mmistakes.github.io/minimal-mistakes/docs/quick-start-guide/#installing-the-theme
-# theme : "minimal-mistakes-jekyll"
remote_theme : "root-project/minimal-mistakes@root-patches"
minimal_mistakes_skin : "root" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise"
@@ -216,9 +215,10 @@ kramdown:
# Sass/SCSS
sass:
- sass_dir: _sass
style: compressed # https://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style
-
+ load_paths:
+ - _sass
+ - ./vendor/bundle/ruby/3.4.0/gems/bootstrap-5.3.8
# Outputting
permalink: /:categories/:title/
diff --git a/_includes/figure_jsroot b/_includes/figure_jsroot
index 1216e5a5..e5eaeadc 100644
--- a/_includes/figure_jsroot
+++ b/_includes/figure_jsroot
@@ -6,7 +6,7 @@
{% assign fig = {{include.fig}} %}
{% assign caption = {{include.caption}} %}
-{% assign id = f | append: o | replace: ".root","" | replace: "/","" %}
+{% assign id = "jsroot_" | append: f | append: o | replace: ".root","" | replace: "/","" %}
{% capture sect_size %}{{ sect | size }}{% endcapture %}
diff --git a/_includes/footer.html b/_includes/footer.html
index ab62186c..a5cadc36 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -1,28 +1,139 @@
diff --git a/_includes/footer/custom.html b/_includes/footer/custom.html
index c18bdaa0..9c2f76bf 100644
--- a/_includes/footer/custom.html
+++ b/_includes/footer/custom.html
@@ -33,4 +33,6 @@
+
+
diff --git a/_includes/head/custom.html b/_includes/head/custom.html
index 8771edf9..0542980e 100644
--- a/_includes/head/custom.html
+++ b/_includes/head/custom.html
@@ -3,6 +3,10 @@
+
+
+
+
\ No newline at end of file
+
diff --git a/_includes/root_showcase.html b/_includes/root_showcase.html
new file mode 100644
index 00000000..12b35f1c
--- /dev/null
+++ b/_includes/root_showcase.html
@@ -0,0 +1,51 @@
+
+
+
ROOT provides all the components you need to turn data into results. See it in action below, using data from the CMS experiment at CERN:
+
+
+
+
+
+
+
+
+
+ {% highlight c++ %}
+{% include showcase/dimuon_jpsi.C %}
+ {% endhighlight %}
+
+
+ {% highlight python %}
+{% include showcase/dimuon_jpsi.py %}
+ {% endhighlight %}
+
+
+
+
+
+
+
+
+
+ {% capture hist_path %}{{ "/gallery/showcase/jpsi.root" | relative_url }}{% endcapture %}
+ {% include figure_jsroot
+ file=hist_path object="Dimuon_mass" width="auto" height="250px"
+ %}
+
+
+
+
diff --git a/_includes/showcase/dimuon_jpsi.C b/_includes/showcase/dimuon_jpsi.C
new file mode 100644
index 00000000..7df5a386
--- /dev/null
+++ b/_includes/showcase/dimuon_jpsi.C
@@ -0,0 +1,26 @@
+void dimuon_jpsi() {
+ // Load the data
+ ROOT::RDataFrame df("Events", "Run2012BC_DoubleMuParked_Muons.root");
+
+ // Select only events with two oppositely-charged muons
+ auto df_2mu = df.Filter("nMuon == 2 && Muon_charge[0] != Muon_charge[1]");
+
+ // Compute invariant mass of the dimuon system
+ auto df_mass =
+ df_2mu.Define("Dimuon_mass", ROOT::VecOps::InvariantMass,
+ {"Muon_pt", "Muon_eta", "Muon_phi", "Muon_mass"});
+
+ // Select events within the J/psi mass spectrum
+ auto df_jpsi = df_mass.Filter("Dimuon_mass > 2.95 && Dimuon_mass < 3.25");
+
+ // Make histogram of dimuon mass spectrum
+ auto hist = df_jpsi.Histo1D(
+ {"Dimuon_mass",
+ "Subset of CMS Run 2010B: J/#psi window;#mu#mu mass [GeV];Events",
+ 128, 2.95, 3.25},
+ "Dimuon_mass");
+
+ // Draw the histogram
+ auto canvas = std::make_unique("c", "", 800, 700);
+ hist->DrawCopy();
+}
diff --git a/_includes/showcase/dimuon_jpsi.py b/_includes/showcase/dimuon_jpsi.py
new file mode 100644
index 00000000..0b818e27
--- /dev/null
+++ b/_includes/showcase/dimuon_jpsi.py
@@ -0,0 +1,28 @@
+import ROOT
+
+# Load the data set
+df = ROOT.RDataFrame("Events", "Run2012BC_DoubleMuParked_Muons.root")
+
+# Select only events with two oppositely-charged muons
+df_2mu = df.Filter("nMuon == 2 && Muon_charge[0] != Muon_charge[1]")
+
+# Compute invariant mass of the dimuon system
+df_mass = df_2mu.Define(
+ "Dimuon_mass", "InvariantMass(Muon_pt, Muon_eta, Muon_phi, Muon_mass)"
+)
+
+# Select events within the J/psi mass spectrum
+df_jpsi = df_mass.Filter("Dimuon_mass > 2.95 && Dimuon_mass < 3.25")
+
+# Make histogram of dimuon mass spectrum
+hist = df_jpsi.Histo1D(
+ (
+ "Dimuon_mass",
+ "Subset of CMS Run 2010B: J/#psi window;#mu#mu mass [GeV];Events",
+ 128, 2.95, 3.25,
+ ),
+ "Dimuon_mass",
+)
+
+c = ROOT.TCanvas("c", "", 800, 700)
+hist.Draw()
diff --git a/_layouts/empty.html b/_layouts/empty.html
index a3292091..ae11251b 100644
--- a/_layouts/empty.html
+++ b/_layouts/empty.html
@@ -15,4 +15,4 @@