Next version of JABA
[jabaws.git] / binaries / src / muscle / physeq.cpp
1 #include "muscle.h"\r
2 #include "msa.h"\r
3 #include "textfile.h"\r
4 \r
5 const int BLOCKSIZE = 60;\r
6 \r
7 static char FixChar(char c)\r
8         {\r
9         switch (c)\r
10                 {\r
11         case '(':\r
12         case ')':\r
13         case '[':\r
14         case ']':\r
15         case ':':\r
16         case ';':\r
17         case ',':\r
18                 return '_';\r
19                 }\r
20         if (!isprint(c))\r
21                 return '_';\r
22         return c;\r
23         }\r
24 \r
25 static void FixName(char Name[])\r
26         {\r
27         while (char c = *Name)\r
28                 *Name++ = FixChar(c);\r
29         }\r
30 \r
31 void MSA::ToPhySequentialFile(TextFile &File) const\r
32         {\r
33         const unsigned SeqCount = GetSeqCount();\r
34         const unsigned ColCount = GetColCount();\r
35 \r
36         File.PutFormat("%d %d\n", SeqCount, ColCount);\r
37 \r
38         if (0 == ColCount)\r
39                 return;\r
40 \r
41         for (unsigned Seq = 0; Seq < SeqCount; ++Seq)\r
42                 {\r
43                 char Name[11];\r
44                 const char *ptrName = GetSeqName(Seq);\r
45                 size_t n = strlen(ptrName);\r
46                 if (n > 10)\r
47                         n = 10;\r
48                 memcpy(Name, ptrName, n);\r
49                 Name[n] = 0;\r
50                 FixName(Name);\r
51                 File.PutFormat("%-10.10s", Name);\r
52 \r
53                 int BlockIndex = 0;\r
54                 int Col = 0;\r
55                 for (;;)\r
56                         {\r
57                         const unsigned MaxCols = (BlockIndex == 0) ? (BLOCKSIZE - 10) : BLOCKSIZE;\r
58                         for (unsigned ColsThisBlock = 0; ColsThisBlock < MaxCols; ++ColsThisBlock)\r
59                                 {\r
60                                 if (Col == ColCount)\r
61                                         break;\r
62                                 if (ColsThisBlock%10 == 0 && (BlockIndex == 0 || ColsThisBlock > 0))\r
63                                         File.PutChar(' ');\r
64                                 char c = GetChar(Seq, Col);\r
65                                 if (isalpha(c))\r
66                                         c = toupper(c);\r
67                                 File.PutChar(c);\r
68                                 ++Col;\r
69                                 }\r
70                         File.PutChar('\n');\r
71                         if (Col == ColCount)\r
72                                 break;\r
73                         ++BlockIndex;\r
74                         }\r
75                 }\r
76         }\r
77 \r
78 void MSA::ToPhyInterleavedFile(TextFile &File) const\r
79         {\r
80         const unsigned SeqCount = GetSeqCount();\r
81         const unsigned ColCount = GetColCount();\r
82 \r
83         File.PutFormat("%d %d\n", SeqCount, ColCount);\r
84 \r
85         if (0 == ColCount)\r
86                 return;\r
87 \r
88         int Col = 0;\r
89         for (;;)\r
90                 {\r
91                 const unsigned ColBlockStart = Col;\r
92                 const unsigned MaxCols = (ColBlockStart == 0) ? (BLOCKSIZE - 10) : BLOCKSIZE;\r
93 \r
94                 for (unsigned Seq = 0; Seq < SeqCount; ++Seq)\r
95                         {\r
96                         if (0 == ColBlockStart)\r
97                                 {\r
98                                 char Name[11];\r
99                                 const char *ptrName = GetSeqName(Seq);\r
100                                 size_t n = strlen(ptrName);\r
101                                 if (n > 10)\r
102                                         n = 10;\r
103                                 memcpy(Name, ptrName, n);\r
104                                 Name[n] = 0;\r
105                                 FixName(Name);\r
106                                 File.PutFormat("%-10.10s", Name);\r
107                                 }\r
108 \r
109                         Col = ColBlockStart;\r
110                         for (unsigned ColsThisBlock = 0; ColsThisBlock < MaxCols; ++ColsThisBlock)\r
111                                 {\r
112                                 if (Col == ColCount)\r
113                                         break;\r
114                                 if (ColsThisBlock%10 == 0 && (0 == ColBlockStart || ColsThisBlock > 0))\r
115                                         File.PutChar(' ');\r
116                                 char c = GetChar(Seq, Col);\r
117                                 if (isalpha(c))\r
118                                         c = toupper(c);\r
119                                 File.PutChar(c);\r
120                                 ++Col;\r
121                                 }\r
122                         File.PutChar('\n');\r
123                         }\r
124                 if (Col == ColCount)\r
125                         break;\r
126                 File.PutChar('\n');\r
127                 }\r
128         }\r