diff --git a/MGF2msAlign/mgf2msalign.py b/MGF2msAlign/mgf2msalign.py
new file mode 100644
index 0000000000000000000000000000000000000000..8a562a39175454b24a7df15aed7ed27655e64f4e
--- /dev/null
+++ b/MGF2msAlign/mgf2msalign.py
@@ -0,0 +1,100 @@
+# MGF2msAlign
+# Created and translated from MATLAB
+# by Kyowon Jeong, University of Tuebingen
+# Initial version: April 21, 2022
+
+import sys
+
+n = len(sys.argv)
+if n != 4:
+    print('Usage: python mgf2msalign.py [input mgf file] [output msalign file] [activation (CID, ETD, or HCD)]')
+    sys.exit()
+
+mgf = sys.argv[1]
+msalign = sys.argv[2]
+act = sys.argv[3]
+
+file1 = open(mgf, 'r')
+file2 = open(msalign, 'w')
+
+Lines = file1.readlines()
+
+proton_mass = 1.007276466621
+
+
+class Spec:
+    id = 1
+
+    def __init__(self,act):
+        self.mz = .0
+        self.intensity = .0
+        self.scan = 0
+        self.activation = act
+        self.premz = .0
+        self.preintensity = .0
+        self.premass = .0
+        self.precharge = 0
+        self.rt = .0
+        self.peaks = []
+
+    def addPeaks(self, str):
+        tstr = str.split('	')
+        tpeaks = [float(tstr[0]), float(tstr[1]), int(tstr[2][0:-1])]
+        self.peaks.append(tpeaks)
+
+    def len(self):
+        return len(self.peaks)
+
+    def tomsalign(self):
+        tstr = "BEGIN IONS\nID="
+        tstr += str(Spec.id)
+        tstr += "\nSCANS="
+        tstr += str(self.scan)
+        tstr += "\nACTIVATION="+self.activation
+        tstr += "\nPRECURSOR_MZ="
+        tstr += str(self.premz)
+        tstr += "\nPRECURSOR_CHARGE="
+        tstr += str(self.precharge)
+        tstr += "\nPRECURSOR_MASS="
+        tstr += str(self.precharge * (self.premz - proton_mass))
+        tstr += "\nPRECURSOR_INTENSITY="
+        tstr += str(self.preintensity)
+        tstr += "\nRETENTION_TIME="
+        tstr += str(self.rt) + "\n"
+        for peak in self.peaks:
+            tstr+=str(peak[0])+" "+str(peak[1])+" "+str(peak[2])+"\n"
+        tstr += "END IONS\n"
+        Spec.id += 1
+        return tstr
+
+spec = Spec(act)
+
+# Strips the newline character
+for line in Lines:
+    if not line:
+        break
+    line = line.strip()
+    if len(line) == 0:
+        continue
+    elif line.startswith("BEGIN IONS"):  # when a spec begins, reset all buffers
+        spec = Spec(act)
+    elif line.startswith("END IONS"):  # when a spec ends write to msalign
+        if spec.len() > 0:
+            file2.write(spec.tomsalign())
+    elif line.startswith("SCANS"):
+        spec.scan = int(line.split("=")[1])
+    elif line.startswith("RTINSECONDS"):
+        spec.rt = float(line.split("=")[1])
+    elif line.startswith("CHARGE"):
+        spec.precharge = int(line.split("=")[1][0:-1])
+        if  spec.precharge == 0:
+            spec.precharge = 1
+    elif line.startswith("PEPMASS"):
+        tstr = line.split("=")[1].split(' ')
+        spec.premz = float(tstr[0])
+        spec.preintensity = float(tstr[1])
+    elif line[0].isdigit():
+        spec.addPeaks(line)
+
+file2.close()
+file1.close()