home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Educational / MolViewer / Source / AminoView.m < prev    next >
Encoding:
Text File  |  1995-06-12  |  4.2 KB  |  227 lines

  1. /* AminoView.m - Copyright 1993  Steve Ludtke */
  2. /* This view currently just displays protein molecular weights and */
  3. /* helical wheel diagrams. More may happen in future releases */
  4.  
  5. /* This view is so simple that I don't think I'll comment it ... */
  6.  
  7. #import "Mtypes.h"
  8. #import "AminoView.h"
  9. #import "MolObj.h"
  10. #import <ctype.h>
  11.  
  12. /* Table of 20 common amino acids */
  13. ACID acid[AADEF] = {
  14. { "X","UNK","Unknown",0,2,        -1,-1,-1,-1 },
  15. { "A","Ala","Alanine",89,2,        1,0,0,0 },
  16. { "V","Val","Valine",117,3,        3,0,0,0 },
  17. { "L","Leu","Leucine",131,3,    4,0,0,0 },
  18. { "I","Ile","Isoleucine",131,3,    4,0,0,0 },
  19. { "P","Pro","Proline",115,2,    3,0,0,0 },
  20. { "F","Phe","Phenylalanine",165,3,    7,0,0,0 },
  21. { "W","Trp","Tryptophan",204,2,    9,0,0,1 },
  22. { "M","Met","Methionine",149,3,    3,1,0,0 },
  23. { "G","Gly","Glycine",75,2,        0,0,0,0 },
  24. { "S","Ser","Serine",105,2,        1,0,1,0 },
  25. { "T","Thr","Threonine",119,2,    2,0,2,0 },
  26. { "C","Cys","Cysteine",121,2,    1,1,0,0 },
  27. { "Y","Tyr","Tyrosine",181,2,    7,0,1,0 },
  28. { "N","Asn","Asparagine",132,1,    2,0,1,1 },
  29. { "Q","Gln","Glutamine",146,1,    3,0,1,1 },
  30. { "D","Asp","Aspartic Acid",133,1, 2,0,2,0 },
  31. { "E","Glu","Glutamic Acid",147,1, 3,0,2,0 },
  32. { "K","Lys","Lysine",146,1,        4,0,0,1 },
  33. { "R","Arg","Arginine",174,1,    4,0,0,3 },
  34. { "H","His","Histidine",155,1,    4,0,0,2 }
  35. };
  36.  
  37. @implementation AminoView
  38.  
  39. -initFrame:(NXRect *)myrect
  40. {
  41. [super initFrame:myrect];
  42. [self setDrawSize:2.0 :2.0];
  43. [self setDrawOrigin:-1.0 :-1.0];
  44.  
  45. fCir=0;
  46. fAmb=fPho=1;
  47. AR=100.0;
  48.  
  49. return self;
  50. }
  51.  
  52. - superviewSizeChanged:(const NXSize *)oldsize
  53. {
  54. [super superviewSizeChanged:oldsize];
  55.  
  56. [self setDrawSize:2.0 :2.0*frame.size.height/frame.size.width];
  57. [self setDrawOrigin:-1.0 :-1.0];
  58. return self;
  59. }
  60.  
  61. - setSequence:sender
  62. {
  63. int i,k;
  64.  
  65. strcpy(seq,[sender stringValue]);
  66. seql=strlen(seq);
  67. seqmw=0;
  68.  
  69. if (seql>MAXSEQ) {
  70.     seql=0;
  71.     [sender setStringValue:"Max. seq len exceeded"];
  72.     return self;
  73. }
  74.  
  75. for (i=0; i<seql; i++) {
  76.     seq[i]=toupper(seq[i]);
  77.     for (k=0; k<AADEF; k++) if (seq[i]==acid[k].d1[0]) break;
  78.     if (k==AADEF) seq[i]=tolower(seq[i]);
  79.     seqa[i]=k;
  80.     seqmw+=acid[k].wt-18;
  81. }
  82. seq[seql]=0;
  83.  
  84. [sender setStringValue:seq];
  85. [self display];
  86. [seqlD setIntValue:seql];
  87. [seqmwD setIntValue:seqmw];
  88. return self;
  89. }
  90.  
  91. - setSeqStr:sender :(char *)str;
  92. {
  93. int i,k;
  94.  
  95. strcpy(seq,str);
  96. seql=strlen(seq);
  97. seqmw=0;
  98.  
  99. if (seql>MAXSEQ) {
  100.     seql=0;
  101.     [seqStr setStringValue:"Max. seq len exceeded"];
  102.     return self;
  103. }
  104.  
  105. for (i=0; i<seql; i++) {
  106.     seq[i]=toupper(seq[i]);
  107.     for (k=0; k<AADEF; k++) if (seq[i]==acid[k].d1[0]) break;
  108.     if (k==AADEF) seq[i]=tolower(seq[i]);
  109.     seqa[i]=k;
  110.     seqmw+=acid[k].wt-18;
  111. }
  112. seq[seql]=0;
  113.  
  114. [seqStr setStringValue:seq];
  115. [self display];
  116. [seqlD setIntValue:seql];
  117. [seqmwD setIntValue:seqmw];
  118. return self;
  119. }
  120.  
  121. -drawSelf:(NXRect *)rects :(int)rectCount
  122. {
  123. int i;
  124. float r,t;
  125. char s[10];
  126.  
  127. PSsetgray(1.0);
  128. NXRectFill(&bounds);
  129.  
  130. PSsetsma();
  131. PSsetlinewidth(0.008);
  132. s[1]=0;
  133.  
  134. if (fCir) {
  135.     PSsetgray(.66667);
  136.     PSmoveto(.30,0.0);
  137.     PSarc(0.0,0.0,.30,0.0,360.0);
  138.  
  139.     PSmoveto(.55,0.0);
  140.     PSarc(0.0,0.0,.55,0.0,360.0);
  141.  
  142.     PSmoveto(.80,0.0);
  143.     PSarc(0.0,0.0,.80,0.0,360.0);
  144.     
  145.     PSstroke();
  146. }
  147.  
  148. PSsetgray(0.0);
  149. for (i=0; i<seql; i++) {
  150.     if (seqa[i]==AADEF) continue;
  151.     t=(float) i*AR*DRC;
  152.     r=(float)acid[seqa[i]].phob/4.0;
  153.     if (!fAmb && r==.5) continue;
  154.     if (!fPho) r= 1.0-r;
  155.     s[0]=acid[seqa[i]].d1[0];
  156.     PSmoveto(0.0,0.0);
  157.     PSlineto(r*cos(t),r*sin(t));
  158.     PSstroke();
  159.     r+=.05;    
  160.     PSsetgray(1.0);
  161.     PSmoveto(r*cos(t)+.05,r*sin(t));
  162.     PSarc(r*cos(t),r*sin(t),.05,0.0,360.0);
  163.     PSfill();
  164.     PSsetgray(0.0);
  165.     PSmoveto(r*cos(t)+.05,r*sin(t));
  166.     PSarc(r*cos(t),r*sin(t),.05,0.0,360.0);
  167.     PSmoveto(r*cos(t)-.025,r*sin(t)-.025);
  168.     PSshow(s);
  169.     PSstroke();
  170. }
  171. return self;
  172. }
  173.  
  174. - dumpEPS:sender
  175. {
  176. static id savePanel=nil;
  177. NXStream *out;
  178.  
  179. if (!savePanel) {
  180.     savePanel=[SavePanel new];
  181.     [savePanel setRequiredFileType:"eps"];
  182. }
  183.  
  184. if([savePanel runModal]){
  185.     out=NXOpenMemory(NULL,0, NX_WRITEONLY);
  186.     [self copyPSCodeInside:&bounds to:out];
  187.     NXSaveToFile(out,[savePanel filename]);
  188.     NXCloseMemory(out,NX_FREEBUFFER);
  189. }
  190. return self;
  191. }
  192.  
  193. - setCircles:sender
  194. {
  195. if ([sender intValue]) fCir=1;
  196. else fCir=0;
  197. [self display];
  198.  
  199. return self;
  200. }
  201.  
  202. - setAmbiv:sender
  203. {
  204. if ([sender intValue]) fAmb=1;
  205. else fAmb=0;
  206. [self display];
  207.  
  208. return self;
  209. }
  210.  
  211. - setPhobicOut:sender
  212. {
  213. if ([sender intValue]) fPho=1;
  214. else fPho=0;
  215. [self display];
  216.  
  217. return self;
  218. }
  219.  
  220. -setAR:sender
  221. {
  222. AR=[sender floatValue];
  223. [self display];
  224. return self;
  225. }
  226. @end
  227.