This is AminoView.m in view mode; [Download] [Up]
/* AminoView.m - Copyright 1993 Steve Ludtke */ /* This view currently just displays protein molecular weights and */ /* helical wheel diagrams. More may happen in future releases */ /* This view is so simple that I don't think I'll comment it ... */ #import "Mtypes.h" #import "AminoView.h" #import "MolObj.h" #import <ctype.h> /* Table of 20 common amino acids */ ACID acid[AADEF] = { { "X","UNK","Unknown",0,2, -1,-1,-1,-1 }, { "A","Ala","Alanine",89,2, 1,0,0,0 }, { "V","Val","Valine",117,3, 3,0,0,0 }, { "L","Leu","Leucine",131,3, 4,0,0,0 }, { "I","Ile","Isoleucine",131,3, 4,0,0,0 }, { "P","Pro","Proline",115,2, 3,0,0,0 }, { "F","Phe","Phenylalanine",165,3, 7,0,0,0 }, { "W","Trp","Tryptophan",204,2, 9,0,0,1 }, { "M","Met","Methionine",149,3, 3,1,0,0 }, { "G","Gly","Glycine",75,2, 0,0,0,0 }, { "S","Ser","Serine",105,2, 1,0,1,0 }, { "T","Thr","Threonine",119,2, 2,0,2,0 }, { "C","Cys","Cysteine",121,2, 1,1,0,0 }, { "Y","Tyr","Tyrosine",181,2, 7,0,1,0 }, { "N","Asn","Asparagine",132,1, 2,0,1,1 }, { "Q","Gln","Glutamine",146,1, 3,0,1,1 }, { "D","Asp","Aspartic Acid",133,1, 2,0,2,0 }, { "E","Glu","Glutamic Acid",147,1, 3,0,2,0 }, { "K","Lys","Lysine",146,1, 4,0,0,1 }, { "R","Arg","Arginine",174,1, 4,0,0,3 }, { "H","His","Histidine",155,1, 4,0,0,2 } }; @implementation AminoView -initFrame:(NXRect *)myrect { [super initFrame:myrect]; [self setDrawSize:2.0 :2.0]; [self setDrawOrigin:-1.0 :-1.0]; fCir=0; fAmb=fPho=1; AR=100.0; return self; } - superviewSizeChanged:(const NXSize *)oldsize { [super superviewSizeChanged:oldsize]; [self setDrawSize:2.0 :2.0*frame.size.height/frame.size.width]; [self setDrawOrigin:-1.0 :-1.0]; return self; } - setSequence:sender { int i,k; strcpy(seq,[sender stringValue]); seql=strlen(seq); seqmw=0; if (seql>MAXSEQ) { seql=0; [sender setStringValue:"Max. seq len exceeded"]; return self; } for (i=0; i<seql; i++) { seq[i]=toupper(seq[i]); for (k=0; k<AADEF; k++) if (seq[i]==acid[k].d1[0]) break; if (k==AADEF) seq[i]=tolower(seq[i]); seqa[i]=k; seqmw+=acid[k].wt-18; } seq[seql]=0; [sender setStringValue:seq]; [self display]; [seqlD setIntValue:seql]; [seqmwD setIntValue:seqmw]; return self; } - setSeqStr:sender :(char *)str; { int i,k; strcpy(seq,str); seql=strlen(seq); seqmw=0; if (seql>MAXSEQ) { seql=0; [seqStr setStringValue:"Max. seq len exceeded"]; return self; } for (i=0; i<seql; i++) { seq[i]=toupper(seq[i]); for (k=0; k<AADEF; k++) if (seq[i]==acid[k].d1[0]) break; if (k==AADEF) seq[i]=tolower(seq[i]); seqa[i]=k; seqmw+=acid[k].wt-18; } seq[seql]=0; [seqStr setStringValue:seq]; [self display]; [seqlD setIntValue:seql]; [seqmwD setIntValue:seqmw]; return self; } -drawSelf:(NXRect *)rects :(int)rectCount { int i; float r,t; char s[10]; PSsetgray(1.0); NXRectFill(&bounds); PSsetsma(); PSsetlinewidth(0.008); s[1]=0; if (fCir) { PSsetgray(.66667); PSmoveto(.30,0.0); PSarc(0.0,0.0,.30,0.0,360.0); PSmoveto(.55,0.0); PSarc(0.0,0.0,.55,0.0,360.0); PSmoveto(.80,0.0); PSarc(0.0,0.0,.80,0.0,360.0); PSstroke(); } PSsetgray(0.0); for (i=0; i<seql; i++) { if (seqa[i]==AADEF) continue; t=(float) i*AR*DRC; r=(float)acid[seqa[i]].phob/4.0; if (!fAmb && r==.5) continue; if (!fPho) r= 1.0-r; s[0]=acid[seqa[i]].d1[0]; PSmoveto(0.0,0.0); PSlineto(r*cos(t),r*sin(t)); PSstroke(); r+=.05; PSsetgray(1.0); PSmoveto(r*cos(t)+.05,r*sin(t)); PSarc(r*cos(t),r*sin(t),.05,0.0,360.0); PSfill(); PSsetgray(0.0); PSmoveto(r*cos(t)+.05,r*sin(t)); PSarc(r*cos(t),r*sin(t),.05,0.0,360.0); PSmoveto(r*cos(t)-.025,r*sin(t)-.025); PSshow(s); PSstroke(); } return self; } - dumpEPS:sender { static id savePanel=nil; NXStream *out; if (!savePanel) { savePanel=[SavePanel new]; [savePanel setRequiredFileType:"eps"]; } if([savePanel runModal]){ out=NXOpenMemory(NULL,0, NX_WRITEONLY); [self copyPSCodeInside:&bounds to:out]; NXSaveToFile(out,[savePanel filename]); NXCloseMemory(out,NX_FREEBUFFER); } return self; } -makeOne:sender { [molobj makeProt:(int)seql :(int *)seqa]; return self; } - setCircles:sender { if ([sender intValue]) fCir=1; else fCir=0; [self display]; return self; } - setAmbiv:sender { if ([sender intValue]) fAmb=1; else fAmb=0; [self display]; return self; } - setPhobicOut:sender { if ([sender intValue]) fPho=1; else fPho=0; [self display]; return self; } -setAR:sender { AR=[sender floatValue]; [self display]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.