Skip to content

Commit 0721b60

Browse files
committed
More informative error messages when parsing modifications and amino acids
1 parent 0780293 commit 0721b60

File tree

1 file changed

+68
-21
lines changed

1 file changed

+68
-21
lines changed

src/main/java/edu/ucsd/msjava/msutil/AminoAcidSet.java

+68-21
Original file line numberDiff line numberDiff line change
@@ -743,27 +743,34 @@ public static AminoAcidSet getAminoAcidSetFromModFile(String modFilePath) {
743743
try {
744744
numMods = Integer.parseInt(modSetting.split("=")[1].trim());
745745
} catch (NumberFormatException e) {
746-
System.err.println(fileName + ": Invalid NumMods option at line " + lineNum + ": " + s);
746+
System.err.println("Error: Invalid NumMods option at line " +
747+
lineNum + " in file " + modFile.getName() + ": " + modSetting);
747748
e.printStackTrace();
748749
System.exit(-1);
749750
}
750751
} else {
751752
String[] modInfo = modSetting.split(",");
752753
if (modInfo.length < 5) {
754+
System.out.println("Ignoring line in ");
753755
continue;
754756
}
755757

756758
// Mass or Composition
757759
double modMass = 0;
758760
String compStr = modInfo[0].trim();
761+
762+
// First try to parse compStr as an empirical formula
763+
// Supports C, H, N, O, S, P, Br, Cl, Fe, and Se
764+
759765
Double mass = Composition.getMass(compStr);
760766
if (mass != null)
761767
modMass = mass;
762768
else {
763769
try {
764770
modMass = Double.parseDouble(compStr);
765771
} catch (NumberFormatException e) {
766-
System.err.println(fileName + ": AminoAcidSet: Invalid Mass/Composition at line " + lineNum + ": " + s);
772+
System.err.println("Error: Invalid Mass/Composition at line " +
773+
lineNum + " in file " + modFile.getName() + ": " + modSetting);
767774
e.printStackTrace();
768775
System.exit(-1);
769776
}
@@ -804,21 +811,25 @@ else if (modInfo[2].trim().equalsIgnoreCase("custom"))
804811
modTypeParseFailed = true;
805812

806813
if ((!isResidueStrLegitimate && !isCustomAminoAcid) || (isCustomAminoAcid && matchesCustomAA)) {
807-
System.err.println(fileName + ": AminoAcidSet: Invalid Residue(s) at line " + lineNum + ": " + s);
814+
System.err.println("Error: Invalid Residue(s) at line " +
815+
lineNum + " in file " + modFile.getName() + ": " + modSetting);
808816
System.exit(-1);
809817
}
810818
if (isCustomAminoAcid && (residueStr.length() > 1 || !residueStr.toLowerCase().matches("[bjouxz]"))) {
811-
System.err.println(fileName + ": AminoAcidSet: Invalid Residue(s) at line " + lineNum + ": " + s);
819+
System.err.println("Error: Invalid Residue(s) at line " +
820+
lineNum + " in file " + modFile.getName() + ": " + modSetting);
812821
System.err.println("Custom Amino acids are only allowed using B, J, O, U, X, or Z as the custom symbol.");
813822
System.exit(-1);
814823
}
815824
if (isCustomAminoAcid && !compStr.matches("([CHNOS][0-9]{0,3})+")) {
816-
System.err.println(fileName + ": AminoAcidSet: Invalid composition/mass at line " + lineNum + ": " + s);
825+
System.err.println("Error: Invalid composition/mass at line " +
826+
lineNum + " in file " + modFile.getName() + ": " + modSetting);
817827
System.err.println("Custom Amino acids must supply a composition string, and must not use elements other than C H N O S.");
818828
System.exit(-1);
819829
}
820830
if (modTypeParseFailed) {
821-
System.err.println(fileName + ": AminoAcidSet: Modification must be either fix, opt, or custom at line " + lineNum + ": " + s);
831+
System.err.println("Error: Modification must be either fix, opt, or custom at line " +
832+
lineNum + " in file " + modFile.getName() + ": " + modSetting);
822833
System.exit(-1);
823834
}
824835

@@ -839,7 +850,8 @@ else if (locStr.equalsIgnoreCase("Prot-C-Term") || locStr.equalsIgnoreCase("Prot
839850
else if (isCustomAminoAcid)
840851
customResidueBase = locStr;
841852
else {
842-
System.err.println(fileName + ": AminoAcidSet: Invalid Location at line " + lineNum + ": " + s);
853+
System.err.println("Error: Invalid Location at line " +
854+
lineNum + " in file " + modFile.getName() + ": " + modSetting);
843855
System.exit(-1);
844856
}
845857

@@ -902,7 +914,7 @@ public static AminoAcidSet getAminoAcidSetFromXMLFile(String modFilePath) {
902914

903915
int numMods = 2;
904916

905-
// memorize keywords
917+
// Define keywords
906918
String numModsKey = "<parameter name=\"ptm.mods\">";
907919
String cysKey = "<parameter name=\"cysteine_protease.cysteine\">";
908920
String oxidationKey = "<parameter name=\"ptm.OXIDATION\">on</parameter>";
@@ -925,7 +937,8 @@ public static AminoAcidSet getAminoAcidSetFromXMLFile(String modFilePath) {
925937
String value = dataLine.substring(numModsKey.length(), dataLine.lastIndexOf(closeKey));
926938
numMods = Integer.parseInt(value);
927939
} catch (NumberFormatException e) {
928-
System.err.println(fileName + ": Invalid ptm.mods option at line " + lineNum + ": " + s);
940+
System.err.println("Error: Invalid ptm.mods option at line " +
941+
lineNum + " in file " + modFile.getName() + ": " + dataLine);
929942
e.printStackTrace();
930943
System.exit(-1);
931944
}
@@ -951,7 +964,8 @@ public static AminoAcidSet getAminoAcidSetFromXMLFile(String modFilePath) {
951964
} else if (value.equals("None")) {
952965
// do nothing
953966
} else {
954-
System.err.println(fileName + ": Invalid Cycteine protecting group at line " + lineNum + ": " + s);
967+
System.err.println("Error: Invalid Cysteine protecting group at line " +
968+
lineNum + " in file " + modFile.getName() + ": "+ dataLine);
955969
System.exit(-1);
956970
}
957971
} else if (dataLine.startsWith(ptmKey)) // custom PTM
@@ -960,7 +974,8 @@ public static AminoAcidSet getAminoAcidSetFromXMLFile(String modFilePath) {
960974
String[] token = value.split(",");
961975

962976
if (token.length != 3) {
963-
System.err.println(fileName + ": Invalid custom ptm option at line " + lineNum + ": " + s);
977+
System.err.println("Error: Invalid custom ptm option at line " +
978+
lineNum + " in file " + modFile.getName() + ": "+ dataLine);
964979
System.exit(-1);
965980
}
966981

@@ -969,7 +984,8 @@ public static AminoAcidSet getAminoAcidSetFromXMLFile(String modFilePath) {
969984
try {
970985
modMass = Double.parseDouble(token[0]);
971986
} catch (NumberFormatException e) {
972-
System.err.println(fileName + ": AminoAcidSet: Invalid Mass at line " + lineNum + ": " + s);
987+
System.err.println("Error: Invalid Mass at line " +
988+
lineNum + " in file " + modFile.getName() + ": "+ dataLine);
973989
e.printStackTrace();
974990
System.exit(-1);
975991
}
@@ -989,7 +1005,8 @@ public static AminoAcidSet getAminoAcidSetFromXMLFile(String modFilePath) {
9891005
isResidueStrLegitimate = false;
9901006
}
9911007
if (!isResidueStrLegitimate) {
992-
System.err.println(fileName + ": AminoAcidSet: Invalid Residue(s) at line " + lineNum + ": " + s);
1008+
System.err.println("Error: Invalid Residue(s) at line " +
1009+
lineNum + " in file " + modFile.getName() + ": " + dataLine);
9931010
System.exit(-1);
9941011
}
9951012

@@ -1017,7 +1034,8 @@ public static AminoAcidSet getAminoAcidSetFromXMLFile(String modFilePath) {
10171034
isFixedModification = true;
10181035
location = Location.C_Term;
10191036
} else {
1020-
System.err.println(fileName + ": AminoAcidSet: Invalid Type(s) at line " + lineNum + ": " + s);
1037+
System.err.println("Error: Invalid Type(s) at line " +
1038+
lineNum + " in file " + modFile.getName() + ": " + dataLine);
10211039
System.exit(-1);
10221040
}
10231041

@@ -1159,18 +1177,22 @@ public static AminoAcidSet getAminoAcidSet(String aaFilePath) {
11591177

11601178
String[] token = dataLine.split(",");
11611179
if (token.length != 3) {
1180+
System.out.println("Ignoring line " +
1181+
lineNum + " in file " + aaFile.getName() + " since not 3 comma separated fields");
11621182
continue;
11631183
}
1184+
11641185
String residueStr = token[0].trim();
11651186
if (residueStr.length() != 1) {
1166-
System.err.println("Invalid amino acid file format: " + fileName);
1167-
System.err.println("Residue must be a single character: " + s);
1187+
System.err.println("Error: Invalid AASet file format at line " +
1188+
lineNum + " in file " + aaFile.getName() + " (residue must be a single character): " + dataLine);
11681189
System.exit(-1);
11691190
}
1191+
11701192
char residue = residueStr.charAt(0);
11711193
if (!Character.isUpperCase(residue)) {
1172-
System.err.println("Invalid amino acid file format: " + fileName);
1173-
System.err.println("Residue must be an upper case letter: " + s);
1194+
System.err.println("Error: Invalid AASet file format at line " +
1195+
lineNum + " in file " + aaFile.getName() + " (residue must be an upper case letter): " + dataLine);
11741196
System.exit(-1);
11751197
}
11761198
String name = token[1].trim();
@@ -1186,33 +1208,58 @@ public static AminoAcidSet getAminoAcidSet(String aaFilePath) {
11861208
try {
11871209
mass = Double.parseDouble(token[2]);
11881210
} catch (NumberFormatException e) {
1189-
System.err.println("Invalid AASet File format at line " + lineNum + ": " + s);
1211+
System.err.println("Error: Invalid AASet file format at line " +
1212+
lineNum + " in file " + aaFile.getName() +
1213+
" (should be a composition like C5H7NO3 or a mass): " + dataLine);
11901214
System.exit(-1);
11911215
}
11921216
aa = AminoAcid.getCustomAminoAcid(residue, name, mass);
11931217
}
11941218
} else {
11951219
// fileType == 1, only masses (and probabilities) are available (e.g. D=115 or D=115,0.0467)
11961220
String[] token = dataLine.split("=");
1221+
if (token.length != 2) {
1222+
System.err.println("Error: Invalid AASet file format at line" +
1223+
lineNum + " in file " + aaFile.getName() + " (splitting on = should give 2 items): " + dataLine);
11971224
System.exit(-1);
11981225
}
1226+
1227+
if (token[0].length() != 1) {
1228+
System.err.println("Error: Invalid AASet file format at line" +
1229+
lineNum + " in file " + aaFile.getName() + " (amino acid symbol must be a single character): " + dataLine);
1230+
System.exit(-1);
1231+
}
1232+
1233+
if (!Character.isLetter(token[0].charAt(0))) {
1234+
System.err.println("Error: Invalid AASet file format at line" +
1235+
lineNum + " in file " + aaFile.getName() + " (amino acid symbol must be a letter): " + dataLine);
1236+
System.exit(-1);
1237+
}
1238+
11991239
char residue = token[0].charAt(0);
12001240
String name = token[0];
12011241
float mass = -1;
12021242
float prob = 0.05f;
1243+
String probabilityAddon = "";
1244+
12031245
try {
12041246
if (!token[1].contains(","))
12051247
mass = Float.parseFloat(token[1]);
12061248
else {
1249+
probabilityAddon = " or probability";
12071250
mass = Float.parseFloat(token[1].split(",")[0]);
12081251
prob = Float.parseFloat(token[1].split(",")[1]);
12091252
}
12101253
} catch (NumberFormatException e) {
1211-
System.err.println("Invalid AASet File format at line" + lineNum + ": " + s);
1254+
System.err.println("Invalid AASet file format at line" +
1255+
lineNum + " in file " + aaFile.getName() +
1256+
" (NumberFormatException parsing the mass" + probabilityAddon + "): " + dataLine);
12121257
System.exit(-1);
12131258
}
12141259
if (mass <= 0) {
1215-
System.err.println("Invalid AASet File format at line" + lineNum + ": " + s);
1260+
System.err.println("Invalid AASet file format at line" +
1261+
lineNum + " in file " + aaFile.getName() +
1262+
" (could not parse the mass" + probabilityAddon + "): " + dataLine);
12161263
System.exit(-1);
12171264
}
12181265
aa = AminoAcid.getCustomAminoAcid(residue, name, mass).setProbability(prob);

0 commit comments

Comments
 (0)