2 #include "textfile.h"
\r
6 const int MAX_LINE = 4096;
\r
7 const int MAX_HEADINGS = 32;
\r
8 static char Heading[MAX_HEADINGS];
\r
9 static unsigned HeadingCount = 0;
\r
10 static float Mx[32][32];
\r
16 for (int i = 0; i < 20; ++i)
\r
17 Log(" %c", LetterToChar(i));
\r
20 for (int i = 0; i < 20; ++i)
\r
22 Log("%c ", LetterToChar(i));
\r
23 for (int j = 0; j < 20; ++j)
\r
24 Log("%5.1f", Mx[i][j]);
\r
30 static unsigned MxCharToLetter(char c)
\r
32 for (unsigned Letter = 0; Letter < HeadingCount; ++Letter)
\r
33 if (Heading[Letter] == c)
\r
35 Quit("Letter '%c' has no heading", c);
\r
39 PTR_SCOREMATRIX ReadMx(TextFile &File)
\r
41 // Find column headers
\r
42 char Line[MAX_LINE];
\r
45 bool EndOfFile = File.GetLine(Line, sizeof(Line));
\r
47 Quit("Premature EOF in matrix file");
\r
51 else if (Line[0] == ' ')
\r
54 Quit("Invalid line in matrix file: '%s'", Line);
\r
57 // Read column headers
\r
59 for (char *p = Line; *p; ++p)
\r
63 Heading[HeadingCount++] = c;
\r
66 if (HeadingCount > 0 && Heading[HeadingCount-1] == '*')
\r
69 if (HeadingCount < 20)
\r
70 Quit("Error in matrix file: < 20 headers, line='%s'", Line);
\r
75 Log("%d headings: ", HeadingCount);
\r
76 for (unsigned i = 0; i < HeadingCount; ++i)
\r
77 Log("%c", Heading[i]);
\r
83 for (int i = 0; i < MAX_ALPHA; ++i)
\r
84 for (int j = 0; j < MAX_ALPHA; ++j)
\r
88 for (unsigned RowIndex = 0; RowIndex < HeadingCount; ++RowIndex)
\r
90 bool EndOfFile = File.GetTrimLine(Line, sizeof(Line));
\r
92 Quit("Premature EOF in matrix file");
\r
94 Log("Line=%s\n", Line);
\r
101 Log("Row char=%c\n", c);
\r
103 if (!IsResidueChar(c))
\r
105 unsigned RowLetter = CharToLetter(c);
\r
106 if (RowLetter >= 20)
\r
109 Log("Row letter = %u\n", RowLetter);
\r
112 char *p = Line + 1;
\r
113 char *maxp = p + strlen(Line);
\r
114 for (unsigned Col = 0; Col < HeadingCount - 1; ++Col)
\r
117 Quit("Too few fields in line of matrix file: '%s'", Line);
\r
118 while (isspace(*p))
\r
121 while (!isspace(*p))
\r
123 float v = (float) atof(Value);
\r
124 char HeaderChar = Heading[Col];
\r
125 if (IsResidueChar(HeaderChar))
\r
127 unsigned ColLetter = CharToLetter(HeaderChar);
\r
128 if (ColLetter >= 20)
\r
130 Mx[RowLetter][ColLetter] = v;
\r
136 // Sanity check for symmetry
\r
137 for (int i = 0; i < 20; ++i)
\r
138 for (int j = 0; j < i; ++j)
\r
140 if (Mx[i][j] != Mx[j][i])
\r
142 Warning("Matrix is not symmetrical, %c->%c=%g, %c->%c=%g",
\r