From 54f551a0b98806b5e3ab23c873cc414b407bd2c1 Mon Sep 17 00:00:00 2001
From: Gabriel Studer <gabriel.studer@unibas.ch>
Date: Thu, 23 Jun 2016 14:18:21 +0200
Subject: [PATCH] speed up of ResidueNameToAminoAcid function

Up to 20 string comparisons had to be performed in the previous implementation.
This number has been reduced by using a switch statement on the first letter
of the residue name.
---
 modules/conop/src/amino_acids.cc | 129 +++++++++++++++++--------------
 1 file changed, 70 insertions(+), 59 deletions(-)

diff --git a/modules/conop/src/amino_acids.cc b/modules/conop/src/amino_acids.cc
index b7cc3e5d0..2ce42a485 100644
--- a/modules/conop/src/amino_acids.cc
+++ b/modules/conop/src/amino_acids.cc
@@ -187,67 +187,78 @@ AminoAcid ResidueNameToAminoAcid(String rn)
 
 char ResidueNameToOneLetterCode(String rn)
 {
+  if (rn.empty()) return 'X';
+
   std::transform(rn.begin(),rn.end(),rn.begin(),toupper);
-  if (rn == "ALA") {    
-    return 'A';
-  }  
-  if (rn == "ARG") {
-    return 'R';
+
+  switch(rn[0]){
+    case 'A': {
+      if (rn == "ALA") return 'A';
+      if (rn == "ARG") return 'R';      
+      if (rn == "ASN") return 'N';
+      if (rn == "ASP") return 'D';
+      break;
+    }
+
+    case 'C': {
+      if (rn == "CYS") return 'C';
+      break;;
+    }
+    
+    case 'G': {
+      if (rn == "GLN") return 'Q';
+      if (rn == "GLU") return 'E';
+      if (rn == "GLY") return 'G';
+      break;
+    }
+
+    case 'H': {
+      if (rn == "HIS") return 'H';
+      break;
+    }
+
+    case 'I': {
+      if (rn == "ILE") return 'I';
+      break;
+    }
+
+    case 'L': {
+      if (rn == "LEU") return 'L';
+      if (rn == "LYS") return 'K';
+      break;
+    }
+
+    case 'M': {
+      if (rn == "MET") return 'M';
+      break;
+    }  
+
+    case 'P': {
+      if (rn == "PRO") return 'P';
+      if (rn == "PHE") return 'F';
+      break;
+    } 
+
+    case 'S': {
+      if (rn == "SER") return 'S';
+      break;
+    }  
+
+    case 'T': {
+      if (rn == "TYR") return 'Y';
+      if (rn == "TRP") return 'W';
+      if (rn == "THR") return 'T';
+      break;
+    }  
+
+    case 'V': {
+      if (rn == "VAL") return 'V';
+      break;
+    }  
+
+    default: break;
   }
-  if (rn == "ASN") {
-    return 'N';
-  }  
-  if (rn == "ASP") {
-    return 'D';
-  }  
-  if (rn == "GLN") {
-    return 'Q';
-  }  
-  if (rn == "GLU") {
-    return 'E';
-  }  
-  if (rn == "LYS") {
-    return 'K';
-  }  
-  if (rn == "SER") {
-    return 'S';
-  }  
-  if (rn == "CYS") {      
-    return 'C';
-  }  
-  if (rn == "TYR") {  
-    return 'Y';
-  }  
-  if (rn == "TRP") {
-    return 'W';
-  }  
-  if (rn == "THR") {
-    return 'T';
-  }  
-  if (rn == "VAL") {
-    return 'V';
-  }  
-  if (rn == "ILE") {
-    return 'I';
-  }  
-  if (rn == "MET") {
-    return 'M';
-  }  
-  if (rn == "LEU") {  
-    return 'L';
-  }  
-  if (rn == "GLY") {  
-    return 'G';
-  }  
-  if (rn == "PRO") {  
-    return 'P';
-  }  
-  if (rn == "HIS") {  
-    return 'H';
-  }  
-  if (rn == "PHE") {
-    return 'F';
-  }  
+
   return 'X';
 }
 
-- 
GitLab