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