diff --git a/part3/cmssw/src/L1Trigger/L1TMLDemo/plugins/l1tDemoMLPatternWriter.cc b/part3/cmssw/src/L1Trigger/L1TMLDemo/plugins/l1tDemoMLPatternWriter.cc
index 7e3fc49255a5fe185c4b8f00c581b4e503889382..8dd7e2e6bec7cca513de6d4cf3de9605e9053e10 100644
--- a/part3/cmssw/src/L1Trigger/L1TMLDemo/plugins/l1tDemoMLPatternWriter.cc
+++ b/part3/cmssw/src/L1Trigger/L1TMLDemo/plugins/l1tDemoMLPatternWriter.cc
@@ -23,6 +23,7 @@
 #include "hls4ml/emulator.h"
 
 #include <iostream>
+#include <sstream>
 
 class L1TMLDemoPatternWriter : public edm::one::EDAnalyzer<edm::one::SharedResources> {
 public:
@@ -56,15 +57,43 @@ private:
   std::vector<bias_t> bias;
 
   bool write_patterns;
-  //l1t::demo::BoardDataWriter inFileWriter;
+  std::map<l1t::demo::LinkId, std::pair<l1t::demo::ChannelSpec, std::vector<size_t>>> inChannelSpec;
   std::map<l1t::demo::LinkId, std::pair<l1t::demo::ChannelSpec, std::vector<size_t>>> outChannelSpec;
 
+  l1t::demo::BoardDataWriter inFileWriter;
   l1t::demo::BoardDataWriter outFileWriter;
 
 };
 
 L1TMLDemoPatternWriter::L1TMLDemoPatternWriter(const edm::ParameterSet& cfg)
- : outChannelSpec{{{"y", 0}, {{1,0}, {0}}}}, 
+ : inChannelSpec{{{"MET", 0}, {{1,0}, {0}}},
+                 {{"jet", 1}, {{1,0}, {1}}},
+                 {{"jet", 2}, {{1,0}, {2}}},
+                 {{"jet", 3}, {{1,0}, {3}}},
+                 {{"jet", 4}, {{1,0}, {4}}},
+                 {{"jet", 5}, {{1,0}, {5}}},
+                 {{"jet", 6}, {{1,0}, {6}}},
+                 {{"jet", 7}, {{1,0}, {7}}},
+                 {{"jet", 8}, {{1,0}, {8}}},
+                 {{"eg", 9}, {{1,0}, {9}}},
+                 {{"eg", 10}, {{1,0}, {10}}},
+                 {{"eg", 11}, {{1,0}, {11}}},
+                 {{"eg", 12}, {{1,0}, {12}}},
+                 {{"eg", 13}, {{1,0}, {13}}},
+                 {{"eg", 14}, {{1,0}, {14}}},
+                 {{"eg", 15}, {{1,0}, {15}}},
+                 {{"eg", 112}, {{1,0}, {112}}},
+                 {{"mu", 113}, {{1,0}, {113}}},
+                 {{"mu", 114}, {{1,0}, {114}}}
+   },
+   outChannelSpec{{{"y", 0}, {{1,0}, {0}}}}, 
+   inFileWriter(l1t::demo::FileFormat::EMPv2,        // pattern file format
+                "L1TMLDemoPatterns_in",              // file name
+                "txt",                               // file extension
+                1,                                   // frames per BX
+                1,                                   // TMUX 
+                1024,                                // max lines per file
+                inChannelSpec),
    outFileWriter(l1t::demo::FileFormat::EMPv2,        // pattern file format
                  "L1TMLDemoPatterns_out",             // file name
                  "txt",                               // file extension
@@ -72,7 +101,7 @@ L1TMLDemoPatternWriter::L1TMLDemoPatternWriter(const edm::ParameterSet& cfg)
                  1,                                   // TMUX 
                  1024,                                // max lines per file
                  outChannelSpec)
- {
+  {
   // consume
   muToken = consumes<l1t::MuonBxCollection>(cfg.getParameter<edm::InputTag>("muToken"));
   egToken = consumes<l1t::EGammaBxCollection>(cfg.getParameter<edm::InputTag>("egToken"));
@@ -186,6 +215,7 @@ void L1TMLDemoPatternWriter::analyze(const edm::Event& iEvent, const edm::EventS
 
   // write the patterns
   if(write_patterns){
+    pack_inputs(X_unscaled);
     pack_outputs(y);
   }
 
@@ -195,10 +225,66 @@ void L1TMLDemoPatternWriter::beginJob(){
 }
 
 void L1TMLDemoPatternWriter::endJob(){
+  inFileWriter.flush();
   outFileWriter.flush();
 }
 
+// from https://github.com/cms-sw/cmssw/blob/CMSSW_13_3_0_pre3/DataFormats/L1TParticleFlow/interface/bit_encoding.h
+template <typename U, typename T>
+inline void pack_into_bits(U& u, unsigned int& start, const T& data) {
+  const unsigned int w = T::width;
+  u(start + w - 1, start) = data(w - 1, 0);
+  start += w;
+}
+
 void L1TMLDemoPatternWriter::pack_inputs(ap_fixed<14,13>* X_unscaled) {
+  std::vector<size_t> links{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 112, 113, 114};
+  l1t::demo::EventData eventDataIn;
+  ap_uint<64> bits = 0;
+  unsigned int start = 0;
+  // MET
+  pack_into_bits(bits, start, X_unscaled[0]);
+  pack_into_bits(bits, start, X_unscaled[1]);
+  std::vector<ap_uint<64>> bits_v;
+  bits_v.push_back(bits);
+  eventDataIn.add({"MET", links[0]}, bits_v);
+  for(unsigned i = 0; i < nJet; i++){
+    bits = 0;
+    start = 0;
+    pack_into_bits(bits, start, X_unscaled[2+3*i+0]); // ET
+    pack_into_bits(bits, start, X_unscaled[2+3*i+1]); // eta
+    pack_into_bits(bits, start, X_unscaled[2+3*i+2]); // phi
+    bits_v[0] = bits;
+    //std::ostringstream oss;
+    //oss << "jet" << std::to_string(i);
+    eventDataIn.add({"jet", links[1+i]}, bits_v);
+  }
+
+  for(unsigned i = 0; i < nEG; i++){
+    bits = 0;
+    start = 0;
+    pack_into_bits(bits, start, X_unscaled[2+3*nJet+3*i+0]); // ET
+    pack_into_bits(bits, start, X_unscaled[2+3*nJet+3*i+1]); // eta
+    pack_into_bits(bits, start, X_unscaled[2+3*nJet+3*i+2]); // phi
+    bits_v[0] = bits;
+    //std::ostringstream oss;
+    //oss << "eg" << std::to_string(i);
+    eventDataIn.add({"eg", links[1+nJet+i]}, bits_v);
+  }
+
+  for(unsigned i = 0; i < nMu; i++){
+    bits = 0;
+    start = 0;
+    pack_into_bits(bits, start, X_unscaled[2+3*(nJet+nEG)+3*i+0]); // ET
+    pack_into_bits(bits, start, X_unscaled[2+3*(nJet+nEG)+3*i+1]); // eta
+    pack_into_bits(bits, start, X_unscaled[2+3*(nJet+nEG)+3*i+2]); // phi
+    bits_v[0] = bits;
+    //std::ostringstream oss;
+    //oss << "mu" << std::to_string(i);
+    eventDataIn.add({"mu", links[1+nJet+nEG+i]}, bits_v);
+  }
+
+  inFileWriter.addEvent(eventDataIn);
 
 }