1#import "BCCreator.h"
2#import "../BCUtils/BCUtilStrings.h"
3
4@implementation BCCreator
5
6
7- (void)saveFile:matrix withComments:comments extraBlocks:eb
8{
9    int runResult;
10    NSSavePanel *sp;
11    NSString *fileString, *fileFormat, *fileType;
12    [NSBundle loadNibNamed:@"View" owner:self];
13    sp = [NSSavePanel savePanel];
14    [sp setAccessoryView:formatPopupView];
15
16    runResult = [sp runModalForDirectory:[@"~/" stringByExpandingTildeInPath] file:@"Untitled"];
17    if (runResult == NSOKButton) {
18        fileFormat = [formatPopup titleOfSelectedItem];
19
20        if ([fileFormat isEqualTo:@"Nexus"]) {
21            fileString = [self createNexusFile:matrix withComments:comments extraBlocks:eb];
22            fileType = @"nex";
23        }
24        else if ([fileFormat isEqualTo:@"Clustal"]) {
25            fileString = [self createClustalFile:matrix];
26            fileType = @"aln";
27        }
28        else if ([fileFormat isEqualTo:@"GCG-MSF"]) {
29            fileString = [self createMSFFile:matrix];
30            fileType = @"msf";
31        }
32        else if ([fileFormat isEqualTo:@"PIR"]) {
33            fileString = [self createPirFile:matrix];
34            fileType = @"pir";
35        }
36        else if ([fileFormat isEqualTo:@"GDE"]) {
37            fileString = [self createGDEFile:matrix];
38            fileType = @"gde";
39        }
40        else if ([fileFormat isEqualTo:@"Fasta"]) {
41            fileString = [self createFastaFile:matrix];
42            fileType = @"fst";
43        }
44        else if ([fileFormat isEqualTo:@"SwissProt"]) {
45            fileString = [self createSwissProtFile:matrix];
46            fileType = @"fst";
47        }
48        else {
49            fileString = [self createPhylipFile:matrix];
50            fileType = @"phy";
51        }
52
53        if (![fileString writeToFile:[NSString stringWithFormat:@"%@.%@",[sp filename],fileType] atomically:YES])
54            NSBeep();
55    }
56}
57
58
59
60
61//Method that creates a Nexus file NSString
62- (NSString *)createNexusFile:(NSDictionary *)matrix withComments:(NSString *)comments extraBlocks:(NSString *)eb
63{
64    int i;
65    NSString *exportString;
66    if (comments) {
67        exportString = [NSString stringWithFormat:@"#NEXUS%@[!Nexus file created with the cocoaNexus framework. %@]%@%@BEGIN DATA;%@DIMENSIONS NTAX=%d NCHAR=%d;%@FORMAT DATATYPE=DNA MISSING=? GAP=- MATCHCHAR=. ;%@%@MATRIX%@%@", lineBreak, comments, lineBreak, lineBreak, lineBreak, [[matrix allKeys] count], [(NSString *)[matrix objectForKey:[[matrix allKeys]objectAtIndex:1]]length], lineBreak, lineBreak, lineBreak, lineBreak, lineBreak];
68    }
69    else {
70        exportString = [NSString stringWithFormat:@"#NEXUS%@[!Nexus file created with the cocoaNexus framework.]%@%@BEGIN DATA;%@DIMENSIONS NTAX=%d NCHAR=%d;%@FORMAT DATATYPE=DNA MISSING=? GAP=- MATCHCHAR=. ;%@%@MATRIX%@%@", lineBreak, lineBreak, lineBreak, lineBreak, [[matrix allKeys] count], [(NSString *)[matrix objectForKey:[[matrix allKeys]objectAtIndex:1]]length], lineBreak, lineBreak, lineBreak, lineBreak, lineBreak];
71    }
72
73    for (i = 0; i < [[matrix allKeys] count]; i++) {
74        exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@"%@   %@%@%@", [[[matrix allKeys] objectAtIndex:i]stringByReplacingSpaceWithUnderscore], [matrix objectForKey:[[matrix allKeys]objectAtIndex:i]], lineBreak, lineBreak ]];
75    }
76
77    exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@"%@;%@END;%@%@", lineBreak, lineBreak, lineBreak, lineBreak]];
78    if (eb) {
79        exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@"%@%@", eb, lineBreak]];
80    }
81    return exportString;
82}
83
84
85//Method that creates a Nexus file NSString
86- (NSString *)createNexusFile:(NSDictionary *)matrix
87{
88    return [self createNexusFile:matrix withComments:nil extraBlocks:nil];
89}
90
91//Method that creates a Fasta file NSString
92- (NSString *)createFastaFile:(NSDictionary *)matrix
93{
94    int i;
95    NSString *exportString;
96    exportString = @"";
97
98    for (i = 0; i < [[matrix allKeys] count]; i++) {
99        exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@">%@%@%@%@", [[matrix allKeys] objectAtIndex:i], lineBreak, [matrix objectForKey:[[matrix allKeys]objectAtIndex:i]], lineBreak ]];
100    }
101
102    return exportString;
103}
104
105
106//Method that creates a Phylip file NSString
107- (NSString *)createPhylipFile:(NSDictionary *)matrix
108{
109    int i;
110    NSString *exportString, *itemName;
111
112    exportString = [NSString stringWithFormat:@"%d   %d%@", [[matrix allKeys] count], [(NSString *)[matrix objectForKey:[[matrix allKeys]objectAtIndex:1]]length], lineBreak];
113
114    for (i = 0; i < [[matrix allKeys] count]; i++) {
115        itemName = [[matrix allKeys] objectAtIndex:i];
116        if ([itemName length] > 10) {
117            itemName = [itemName substringToIndex:10];
118        }
119        exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@"%@   %@%@%@", itemName, [matrix objectForKey:[[matrix allKeys]objectAtIndex:i]], lineBreak, lineBreak ]];
120    }
121
122    return exportString;
123}
124
125
126//Method that creates a PIR file NSString
127- (NSString *)createPirFile:(NSDictionary *)matrix
128{
129    int i;
130    NSString *exportString;
131    exportString = @"";
132
133    for (i = 0; i < [[matrix allKeys] count]; i++) {
134        exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@">DL; %@%@%@%@%@*%@", [[matrix allKeys] objectAtIndex:i], lineBreak, [[matrix allKeys] objectAtIndex:i], lineBreak, [matrix objectForKey:[[matrix allKeys]objectAtIndex:i]], lineBreak]];
135    }
136    return exportString;
137}
138
139
140//Method that creates a Clustal file NSString
141- (NSString *)createClustalFile:(NSDictionary *)matrix
142{
143    int i, j, numberOfChars;
144    NSString *exportString;
145    exportString = [NSString stringWithFormat:@"CLUSTAL X (1.81) multiple sequence alignment%@%@%@", lineBreak, lineBreak, lineBreak];
146    numberOfChars = [(NSString *)[matrix objectForKey:[[matrix allKeys]objectAtIndex:1]]length];
147
148    for (j = 0; j < numberOfChars; j=j+100) {
149
150        for (i = 0; i < [[matrix allKeys] count]; i++) {
151
152            if (j+100 < numberOfChars) {
153                exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@"%@  %@%@", [[matrix allKeys] objectAtIndex:i], [[matrix objectForKey:[[matrix allKeys]objectAtIndex:i]]substringWithRange:NSMakeRange(j, 100)], lineBreak ]];
154            }
155            else {
156                exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@"%@  %@%@", [[matrix allKeys] objectAtIndex:i], [[matrix objectForKey:[[matrix allKeys]objectAtIndex:i]]substringWithRange:NSMakeRange(j, numberOfChars-j)], lineBreak ]];
157            }
158
159        }
160        exportString = [exportString stringByAppendingString:lineBreak];
161    }
162    exportString = [exportString stringByAppendingString:lineBreak];
163    return exportString;
164}
165
166
167//Method that creates a MSF file NSString
168- (NSString *)createMSFFile:(NSDictionary *)matrix
169{
170    int i, j, numberOfChars, totalCheckSum;
171    NSString *exportString;
172    NSMutableString *sequence;
173    numberOfChars = [(NSString *)[matrix objectForKey:[[matrix allKeys]objectAtIndex:1]]length];
174
175    //Calculate the total checksum
176    totalCheckSum = 0;
177    for (i = 0; i < [[matrix allKeys] count]; i++) {
178        sequence = [matrix objectForKey:[[matrix allKeys]objectAtIndex:i]];
179        [sequence replaceOccurrencesOfString:@"-" withString:@"." options:NULL range:NSMakeRange(0, [sequence length])];
180        totalCheckSum = totalCheckSum + (int)[self GCGCheckSum:sequence];
181    }
182    totalCheckSum = totalCheckSum % 10000;
183
184    //Create the header with the total cheksum and length
185    exportString = [NSString stringWithFormat:@"PileUp%@%@%@%@MSF: %d  Type: N    Check:  %d   ..%@%@", lineBreak, lineBreak, lineBreak, lineBreak, numberOfChars, totalCheckSum, lineBreak, lineBreak];
186
187    //Add a line for every item with length and checksum
188    for (i = 0; i < [[matrix allKeys] count]; i++) {
189        sequence = [matrix objectForKey:[[matrix allKeys]objectAtIndex:i]];
190exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@"Name: %@ oo  Len: %d  Check:  %d  Weight:  100.0%@", [[matrix allKeys] objectAtIndex:i], [sequence length], [self GCGCheckSum:sequence], lineBreak ]];
191    }
192
193    //Add the //
194    exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@"%@//%@%@%@%@", lineBreak, lineBreak, lineBreak, lineBreak, lineBreak]];
195
196
197    for (j = 0; j < numberOfChars; j=j+100) {
198        for (i = 0; i < [[matrix allKeys] count]; i++) {
199
200            if (j+100 < numberOfChars) {
201                exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@"%@  %@%@", [[matrix allKeys] objectAtIndex:i], [[matrix objectForKey:[[matrix allKeys]objectAtIndex:i]]substringWithRange:NSMakeRange(j, 100)], lineBreak ]];
202            }
203            else {
204                exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@"%@  %@%@", [[matrix allKeys] objectAtIndex:i], [[matrix objectForKey:[[matrix allKeys]objectAtIndex:i]]substringWithRange:NSMakeRange(j, numberOfChars-j)], lineBreak ]];
205            }
206        }
207        exportString = [exportString stringByAppendingString:lineBreak];
208    }
209    exportString = [exportString stringByAppendingString:lineBreak];
210    return exportString;
211}
212
213
214
215//Method that creates a SwissProt file NSString
216- (NSString *)createSwissProtFile:(NSDictionary *)matrix
217{
218    int i;
219    NSString *exportString;
220    exportString = @"";
221
222    for (i = 0; i < [[matrix allKeys] count]; i++)
223	{
224//        exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@"#%@%@%@%@",
225//						[[matrix allKeys] objectAtIndex:i], lineBreak,
226//						[matrix objectForKey:[[matrix allKeys]objectAtIndex:i]], lineBreak ]];
227    }
228
229    return exportString;
230}
231
232
233//Method that creates a GDE file NSString
234- (NSString *)createGDEFile:(NSDictionary *)matrix
235{
236    int i;
237    NSString *exportString;
238    exportString = @"";
239
240    for (i = 0; i < [[matrix allKeys] count]; i++) {
241        exportString = [exportString stringByAppendingString:[NSString stringWithFormat:@"#%@%@%@%@", [[matrix allKeys] objectAtIndex:i], lineBreak, [matrix objectForKey:[[matrix allKeys]objectAtIndex:i]], lineBreak ]];
242    }
243
244    return exportString;
245}
246
247
248-(int)GCGCheckSum:(NSString *)seq
249{
250    const char *sequence = [seq lossyCString];
251    long i, check, count;
252    int len, val;
253
254    check = count = 0;
255    len = [seq length];
256    for(i = 0; i < len; i++)  {
257        val = sequence[i];
258        if((val == -3) || (val == 253)) break;
259        count++;
260        check += count * toupper((int) sequence[i]);
261        if(count == 57) {
262            count = 0;
263        }
264    }
265    check %= 10000;
266    return check;
267}
268
269
270
271- (void)useLineBreakFromSource:(NSDictionary *)matrix
272{
273    if ([matrix objectForKey:@"lineBreak"]) {
274        [self setLineBreak:[matrix objectForKey:@"lineBreak"]];
275    }
276}
277
278- (void)useUnixLineBreak
279{
280    [self setLineBreak:@"\n"];
281}
282
283- (void)useWindowsLineBreak
284{
285    [self setLineBreak:@"\r\n"];
286}
287
288
289
290//Accessors for the line break
291- (NSString *) lineBreak
292{
293    return lineBreak;
294}
295
296- (void) setLineBreak: (NSString *) aLineBreak
297{
298    if (lineBreak != aLineBreak)
299    {
300        [aLineBreak retain];
301        [lineBreak release];
302        lineBreak = aLineBreak;
303    }
304}
305
306
307
308// Memory management
309
310- (id)init
311{
312    if (self = [super init]) {
313        [self setLineBreak:@"\r"];
314    }
315    return self;
316}
317
318
319- (void)dealloc
320{
321    [lineBreak release];
322    [super dealloc];
323}
324
325
326
327@end
328