bio-graphics 1.2 → 1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. data/doc/classes/Bio.html +4 -26
  2. data/doc/classes/Bio/Feature.html +350 -0
  3. data/doc/classes/Bio/Feature.src/M000010.html +21 -0
  4. data/doc/classes/Bio/Feature.src/M000011.html +20 -0
  5. data/doc/classes/Bio/Feature.src/M000012.html +19 -0
  6. data/doc/classes/Bio/Feature.src/M000014.html +21 -0
  7. data/doc/classes/Bio/Feature.src/M000016.html +21 -0
  8. data/doc/classes/Bio/Feature.src/M000034.html +21 -0
  9. data/doc/classes/Bio/Feature.src/M000035.html +20 -0
  10. data/doc/classes/Bio/Feature.src/M000036.html +19 -0
  11. data/doc/classes/Bio/Feature.src/M000038.html +21 -0
  12. data/doc/classes/Bio/Feature.src/M000040.html +21 -0
  13. data/doc/classes/Bio/Feature.src/M000042.html +21 -0
  14. data/doc/classes/Bio/Feature.src/M000043.html +20 -0
  15. data/doc/classes/Bio/Feature.src/M000044.html +21 -0
  16. data/doc/classes/Bio/Feature.src/M000045.html +20 -0
  17. data/doc/classes/Bio/Feature.src/M000046.html +19 -0
  18. data/doc/classes/Bio/Feature.src/M000048.html +21 -0
  19. data/doc/classes/Bio/Feature.src/M000050.html +21 -0
  20. data/doc/classes/Bio/Feature.src/M000074.html +21 -0
  21. data/doc/classes/Bio/Feature.src/M000075.html +20 -0
  22. data/doc/classes/Bio/Feature.src/M000076.html +19 -0
  23. data/doc/classes/Bio/Feature.src/M000078.html +21 -0
  24. data/doc/classes/Bio/Feature.src/M000080.html +21 -0
  25. data/doc/classes/Bio/Feature/Qualifier.html +189 -0
  26. data/doc/classes/Bio/Feature/Qualifier.src/M000017.html +18 -0
  27. data/doc/classes/Bio/Feature/Qualifier.src/M000041.html +18 -0
  28. data/doc/classes/Bio/Feature/Qualifier.src/M000049.html +18 -0
  29. data/doc/classes/Bio/Feature/Qualifier.src/M000051.html +18 -0
  30. data/doc/classes/Bio/Feature/Qualifier.src/M000081.html +18 -0
  31. data/doc/classes/Bio/Features.html +329 -0
  32. data/doc/classes/Bio/Features.src/M000004.html +18 -0
  33. data/doc/classes/Bio/Features.src/M000005.html +19 -0
  34. data/doc/classes/Bio/Features.src/M000006.html +21 -0
  35. data/doc/classes/Bio/Features.src/M000007.html +18 -0
  36. data/doc/classes/Bio/Features.src/M000008.html +18 -0
  37. data/doc/classes/Bio/Features.src/M000009.html +18 -0
  38. data/doc/classes/Bio/Features.src/M000028.html +18 -0
  39. data/doc/classes/Bio/Features.src/M000029.html +19 -0
  40. data/doc/classes/Bio/Features.src/M000030.html +21 -0
  41. data/doc/classes/Bio/Features.src/M000031.html +18 -0
  42. data/doc/classes/Bio/Features.src/M000032.html +18 -0
  43. data/doc/classes/Bio/Features.src/M000033.html +18 -0
  44. data/doc/classes/Bio/Features.src/M000036.html +18 -0
  45. data/doc/classes/Bio/Features.src/M000037.html +19 -0
  46. data/doc/classes/Bio/Features.src/M000038.html +18 -0
  47. data/doc/classes/Bio/Features.src/M000039.html +19 -0
  48. data/doc/classes/Bio/Features.src/M000040.html +21 -0
  49. data/doc/classes/Bio/Features.src/M000041.html +18 -0
  50. data/doc/classes/Bio/Features.src/M000042.html +18 -0
  51. data/doc/classes/Bio/Features.src/M000043.html +18 -0
  52. data/doc/classes/Bio/Features.src/M000068.html +18 -0
  53. data/doc/classes/Bio/Features.src/M000069.html +19 -0
  54. data/doc/classes/Bio/Features.src/M000070.html +21 -0
  55. data/doc/classes/Bio/Features.src/M000071.html +18 -0
  56. data/doc/classes/Bio/Features.src/M000072.html +18 -0
  57. data/doc/classes/Bio/Features.src/M000073.html +18 -0
  58. data/doc/classes/Bio/Graphics.html +28 -42
  59. data/doc/classes/Bio/Graphics/{Panel/Track/Feature.html → Feature.html} +98 -125
  60. data/doc/classes/Bio/Graphics/Feature.src/M000020.html +51 -0
  61. data/doc/classes/Bio/Graphics/Feature.src/M000021.html +65 -0
  62. data/doc/classes/Bio/Graphics/Feature.src/M000022.html +55 -0
  63. data/doc/classes/Bio/Graphics/Feature.src/M000023.html +66 -0
  64. data/doc/classes/Bio/Graphics/Feature.src/M000024.html +51 -0
  65. data/doc/classes/Bio/Graphics/Feature.src/M000025.html +65 -0
  66. data/doc/classes/Bio/Graphics/Feature.src/M000026.html +55 -0
  67. data/doc/classes/Bio/Graphics/Feature.src/M000054.html +51 -0
  68. data/doc/classes/Bio/Graphics/Feature.src/M000055.html +65 -0
  69. data/doc/classes/Bio/Graphics/Feature.src/M000056.html +55 -0
  70. data/doc/classes/Bio/Graphics/Feature/SubFeature.html +348 -0
  71. data/doc/classes/Bio/Graphics/Feature/SubFeature.src/M000025.html +68 -0
  72. data/doc/classes/Bio/Graphics/Feature/SubFeature.src/M000026.html +67 -0
  73. data/doc/classes/Bio/Graphics/Glyph.html +178 -0
  74. data/doc/classes/Bio/Graphics/Glyph/Box.html +139 -0
  75. data/doc/classes/Bio/Graphics/Glyph/Box.src/M000004.html +24 -0
  76. data/doc/classes/Bio/Graphics/Glyph/Box.src/M000032.html +24 -0
  77. data/doc/classes/Bio/Graphics/Glyph/Common.html +187 -0
  78. data/doc/classes/Bio/Graphics/Glyph/Common.src/M000004.html +18 -0
  79. data/doc/classes/Bio/Graphics/Glyph/Common.src/M000005.html +18 -0
  80. data/doc/classes/Bio/Graphics/Glyph/Common.src/M000006.html +24 -0
  81. data/doc/classes/Bio/Graphics/Glyph/Common.src/M000007.html +24 -0
  82. data/doc/classes/Bio/Graphics/Glyph/Common.src/M000033.html +18 -0
  83. data/doc/classes/Bio/Graphics/Glyph/Common.src/M000034.html +24 -0
  84. data/doc/classes/Bio/Graphics/Glyph/Common.src/M000035.html +24 -0
  85. data/doc/classes/Bio/Graphics/Glyph/CustomTestGlyph.html +139 -0
  86. data/doc/classes/Bio/Graphics/Glyph/CustomTestGlyph.src/M000037.html +22 -0
  87. data/doc/classes/Bio/Graphics/Glyph/CustomTestGlyphInFile.html +139 -0
  88. data/doc/classes/Bio/Graphics/Glyph/CustomTestGlyphInFile.src/M000038.html +22 -0
  89. data/doc/classes/Bio/Graphics/Glyph/DirectedBox.html +139 -0
  90. data/doc/classes/Bio/Graphics/Glyph/DirectedBox.src/M000009.html +31 -0
  91. data/doc/classes/Bio/Graphics/Glyph/DirectedBox.src/M000039.html +31 -0
  92. data/doc/classes/Bio/Graphics/Glyph/DirectedGeneric.html +139 -0
  93. data/doc/classes/Bio/Graphics/Glyph/DirectedGeneric.src/M000011.html +26 -0
  94. data/doc/classes/Bio/Graphics/Glyph/DirectedGeneric.src/M000013.html +26 -0
  95. data/doc/classes/Bio/Graphics/Glyph/DirectedGeneric.src/M000043.html +26 -0
  96. data/doc/classes/Bio/Graphics/Glyph/DirectedSpliced.html +139 -0
  97. data/doc/classes/Bio/Graphics/Glyph/DirectedSpliced.src/M000008.html +40 -0
  98. data/doc/classes/Bio/Graphics/Glyph/DirectedSpliced.src/M000010.html +40 -0
  99. data/doc/classes/Bio/Graphics/Glyph/DirectedSpliced.src/M000040.html +40 -0
  100. data/doc/classes/Bio/Graphics/{Panel/Track/Feature/PixelRange.html → Glyph/Dot.html} +16 -19
  101. data/doc/classes/Bio/Graphics/Glyph/Dot.src/M000013.html +22 -0
  102. data/doc/classes/Bio/Graphics/Glyph/Dot.src/M000015.html +22 -0
  103. data/doc/classes/Bio/Graphics/Glyph/Dot.src/M000045.html +22 -0
  104. data/doc/classes/Bio/Graphics/Glyph/Generic.html +139 -0
  105. data/doc/classes/Bio/Graphics/Glyph/Generic.src/M000009.html +18 -0
  106. data/doc/classes/Bio/Graphics/Glyph/Generic.src/M000011.html +18 -0
  107. data/doc/classes/Bio/Graphics/Glyph/Generic.src/M000041.html +18 -0
  108. data/doc/classes/Bio/Graphics/Glyph/Line.html +139 -0
  109. data/doc/classes/Bio/Graphics/Glyph/Line.src/M000012.html +20 -0
  110. data/doc/classes/Bio/Graphics/Glyph/Line.src/M000014.html +20 -0
  111. data/doc/classes/Bio/Graphics/Glyph/Line.src/M000044.html +20 -0
  112. data/doc/classes/Bio/Graphics/Glyph/LineWithHandles.html +139 -0
  113. data/doc/classes/Bio/Graphics/Glyph/LineWithHandles.src/M000014.html +28 -0
  114. data/doc/classes/Bio/Graphics/Glyph/LineWithHandles.src/M000016.html +28 -0
  115. data/doc/classes/Bio/Graphics/Glyph/LineWithHandles.src/M000046.html +28 -0
  116. data/doc/classes/Bio/Graphics/Glyph/Spliced.html +139 -0
  117. data/doc/classes/Bio/Graphics/Glyph/Spliced.src/M000010.html +19 -0
  118. data/doc/classes/Bio/Graphics/Glyph/Spliced.src/M000012.html +19 -0
  119. data/doc/classes/Bio/Graphics/Glyph/Spliced.src/M000042.html +19 -0
  120. data/doc/classes/Bio/Graphics/Glyph/Transcript.html +113 -0
  121. data/doc/classes/Bio/Graphics/Glyph/Triangle.html +139 -0
  122. data/doc/classes/Bio/Graphics/Glyph/Triangle.src/M000007.html +21 -0
  123. data/doc/classes/Bio/Graphics/Glyph/Triangle.src/M000008.html +21 -0
  124. data/doc/classes/Bio/Graphics/Glyph/Triangle.src/M000036.html +21 -0
  125. data/doc/classes/{ImageMap.html → Bio/Graphics/ImageMap.html} +50 -16
  126. data/doc/classes/{ImageMap.src/M000001.html → Bio/Graphics/ImageMap.src/M000030.html} +3 -3
  127. data/doc/classes/Bio/Graphics/ImageMap.src/M000031.html +18 -0
  128. data/doc/classes/Bio/Graphics/ImageMap.src/M000032.html +18 -0
  129. data/doc/classes/Bio/Graphics/ImageMap.src/M000033.html +18 -0
  130. data/doc/classes/{ImageMap.src/M000002.html → Bio/Graphics/ImageMap.src/M000034.html} +7 -4
  131. data/doc/classes/Bio/Graphics/ImageMap.src/M000035.html +24 -0
  132. data/doc/classes/Bio/Graphics/ImageMap.src/M000062.html +18 -0
  133. data/doc/classes/Bio/Graphics/ImageMap.src/M000063.html +18 -0
  134. data/doc/classes/Bio/Graphics/ImageMap.src/M000064.html +27 -0
  135. data/doc/classes/Bio/Graphics/ImageMap.src/M000065.html +24 -0
  136. data/doc/classes/{ImageMap/ImageMapElement.html → Bio/Graphics/ImageMap/Element.html} +14 -14
  137. data/doc/classes/{ImageMap/ImageMapElement.src/M000003.html → Bio/Graphics/ImageMap/Element.src/M000034.html} +3 -3
  138. data/doc/classes/{ImageMap/ImageMapElement.src/M000004.html → Bio/Graphics/ImageMap/Element.src/M000035.html} +6 -4
  139. data/doc/classes/Bio/Graphics/ImageMap/Element.src/M000036.html +19 -0
  140. data/doc/classes/Bio/Graphics/ImageMap/Element.src/M000037.html +22 -0
  141. data/doc/classes/Bio/Graphics/ImageMap/Element.src/M000066.html +19 -0
  142. data/doc/classes/Bio/Graphics/ImageMap/Element.src/M000067.html +22 -0
  143. data/doc/classes/Bio/Graphics/Panel.html +70 -69
  144. data/doc/classes/Bio/Graphics/Panel.src/M000025.html +52 -0
  145. data/doc/classes/Bio/Graphics/Panel.src/M000026.html +20 -0
  146. data/doc/classes/Bio/Graphics/Panel.src/M000027.html +98 -0
  147. data/doc/classes/Bio/Graphics/Panel.src/M000028.html +20 -0
  148. data/doc/classes/Bio/Graphics/Panel.src/M000029.html +52 -0
  149. data/doc/classes/Bio/Graphics/Panel.src/M000030.html +20 -0
  150. data/doc/classes/Bio/Graphics/Panel.src/M000031.html +98 -0
  151. data/doc/classes/Bio/Graphics/Panel.src/M000059.html +52 -0
  152. data/doc/classes/Bio/Graphics/Panel.src/M000060.html +20 -0
  153. data/doc/classes/Bio/Graphics/Panel.src/M000061.html +98 -0
  154. data/doc/classes/Bio/Graphics/{Panel/Ruler.html → Ruler.html} +50 -21
  155. data/doc/classes/Bio/Graphics/Ruler.src/M000015.html +30 -0
  156. data/doc/classes/Bio/Graphics/Ruler.src/M000016.html +20 -0
  157. data/doc/classes/Bio/Graphics/Ruler.src/M000017.html +30 -0
  158. data/doc/classes/Bio/Graphics/Ruler.src/M000018.html +20 -0
  159. data/doc/classes/Bio/Graphics/Ruler.src/M000019.html +26 -0
  160. data/doc/classes/Bio/Graphics/Ruler.src/M000020.html +45 -0
  161. data/doc/classes/Bio/Graphics/Ruler.src/M000047.html +30 -0
  162. data/doc/classes/Bio/Graphics/Ruler.src/M000048.html +20 -0
  163. data/doc/classes/Bio/Graphics/Ruler.src/M000049.html +26 -0
  164. data/doc/classes/Bio/Graphics/Ruler.src/M000050.html +45 -0
  165. data/doc/classes/Bio/Graphics/SubFeature.html +348 -0
  166. data/doc/classes/Bio/Graphics/SubFeature.src/M000001.html +73 -0
  167. data/doc/classes/Bio/Graphics/SubFeature.src/M000002.html +69 -0
  168. data/doc/classes/Bio/Graphics/SubFeature.src/M000023.html +73 -0
  169. data/doc/classes/Bio/Graphics/SubFeature.src/M000024.html +69 -0
  170. data/doc/classes/Bio/Graphics/SubFeature.src/M000027.html +73 -0
  171. data/doc/classes/Bio/Graphics/SubFeature.src/M000028.html +69 -0
  172. data/doc/classes/Bio/Graphics/SubFeature.src/M000057.html +73 -0
  173. data/doc/classes/Bio/Graphics/SubFeature.src/M000058.html +69 -0
  174. data/doc/classes/Bio/Graphics/{Panel/Track.html → Track.html} +67 -69
  175. data/doc/classes/Bio/Graphics/Track.src/M000017.html +39 -0
  176. data/doc/classes/Bio/Graphics/Track.src/M000018.html +37 -0
  177. data/doc/classes/Bio/Graphics/Track.src/M000019.html +45 -0
  178. data/doc/classes/Bio/Graphics/Track.src/M000020.html +41 -0
  179. data/doc/classes/Bio/Graphics/Track.src/M000021.html +39 -0
  180. data/doc/classes/Bio/Graphics/Track.src/M000022.html +37 -0
  181. data/doc/classes/Bio/Graphics/Track.src/M000023.html +45 -0
  182. data/doc/classes/Bio/Graphics/Track.src/M000051.html +39 -0
  183. data/doc/classes/Bio/Graphics/Track.src/M000052.html +37 -0
  184. data/doc/classes/Bio/Graphics/Track.src/M000053.html +45 -0
  185. data/doc/classes/Range.html +129 -0
  186. data/doc/classes/String.html +167 -0
  187. data/doc/classes/String.src/M000001.html +18 -0
  188. data/doc/classes/String.src/M000002.html +18 -0
  189. data/doc/classes/String.src/M000003.html +23 -0
  190. data/doc/classes/String.src/M000029.html +18 -0
  191. data/doc/classes/String.src/M000030.html +18 -0
  192. data/doc/classes/String.src/M000031.html +23 -0
  193. data/doc/classes/TestCustomGlyph.html +137 -0
  194. data/doc/classes/TestCustomGlyph.src/M000025.html +25 -0
  195. data/doc/classes/TestCustomGlyphInFile.html +167 -0
  196. data/doc/classes/TestCustomGlyphInFile.src/M000026.html +19 -0
  197. data/doc/classes/TestCustomGlyphInFile.src/M000027.html +25 -0
  198. data/doc/classes/TestCustomGlyphInFile.src/M000028.html +18 -0
  199. data/doc/classes/TestExtensions.html +152 -0
  200. data/doc/classes/TestExtensions.src/M000015.html +22 -0
  201. data/doc/classes/TestExtensions.src/M000016.html +25 -0
  202. data/doc/classes/TestFeature.html +152 -0
  203. data/doc/classes/TestFeature.src/M000017.html +19 -0
  204. data/doc/classes/TestFeature.src/M000018.html +21 -0
  205. data/doc/classes/TestImageMap.html +182 -0
  206. data/doc/classes/TestImageMap.src/M000019.html +22 -0
  207. data/doc/classes/TestImageMap.src/M000020.html +56 -0
  208. data/doc/classes/TestImageMap.src/M000021.html +56 -0
  209. data/doc/classes/TestImageMap.src/M000022.html +20 -0
  210. data/doc/classes/TestPanel.html +276 -0
  211. data/doc/classes/TestPanel.src/M000001.html +18 -0
  212. data/doc/classes/TestPanel.src/M000002.html +61 -0
  213. data/doc/classes/TestPanel.src/M000003.html +35 -0
  214. data/doc/classes/TestPanel.src/M000004.html +54 -0
  215. data/doc/classes/TestPanel.src/M000005.html +54 -0
  216. data/doc/classes/TestPanel.src/M000006.html +41 -0
  217. data/doc/classes/TestPanel.src/M000007.html +36 -0
  218. data/doc/classes/TestPanel.src/M000008.html +20 -0
  219. data/doc/classes/TestPanel.src/M000009.html +26 -0
  220. data/doc/classes/TestPanel.src/M000010.html +21 -0
  221. data/doc/classes/TestRuler.html +152 -0
  222. data/doc/classes/TestRuler.src/M000013.html +22 -0
  223. data/doc/classes/TestRuler.src/M000014.html +31 -0
  224. data/doc/classes/TestSubFeature.html +152 -0
  225. data/doc/classes/TestSubFeature.src/M000023.html +21 -0
  226. data/doc/classes/TestSubFeature.src/M000024.html +18 -0
  227. data/doc/classes/TestTrack.html +152 -0
  228. data/doc/classes/TestTrack.src/M000011.html +19 -0
  229. data/doc/classes/TestTrack.src/M000012.html +23 -0
  230. data/doc/created.rid +1 -1
  231. data/doc/files/README_DEV.html +399 -70
  232. data/doc/files/TUTORIAL.html +188 -67
  233. data/doc/files/lib/bio-graphics_rb.html +3 -2
  234. data/doc/files/lib/bio/graphics/feature_rb.html +12 -6
  235. data/doc/files/lib/bio/graphics/glyphs/box_rb.html +113 -0
  236. data/doc/files/lib/bio/graphics/glyphs/common_rb.html +113 -0
  237. data/doc/files/lib/bio/graphics/glyphs/directed_box_rb.html +113 -0
  238. data/doc/files/lib/bio/graphics/glyphs/directed_generic_rb.html +113 -0
  239. data/doc/files/lib/bio/graphics/glyphs/directed_spliced_rb.html +113 -0
  240. data/doc/files/lib/bio/graphics/glyphs/dot_rb.html +113 -0
  241. data/doc/files/lib/bio/graphics/glyphs/generic_rb.html +113 -0
  242. data/doc/files/lib/bio/graphics/glyphs/line_rb.html +113 -0
  243. data/doc/files/lib/bio/graphics/glyphs/line_with_handles_rb.html +113 -0
  244. data/doc/files/lib/bio/graphics/glyphs/spliced_rb.html +113 -0
  245. data/doc/files/lib/bio/graphics/glyphs/transcript_rb.html +113 -0
  246. data/doc/files/lib/bio/graphics/glyphs/triangle_rb.html +113 -0
  247. data/doc/files/lib/bio/graphics/image_map_rb.html +3 -2
  248. data/doc/files/lib/bio/graphics/panel_rb.html +10 -2
  249. data/doc/files/lib/bio/graphics/ruler_rb.html +3 -2
  250. data/doc/files/lib/bio/graphics/subfeature_rb.html +114 -0
  251. data/doc/files/lib/bio/graphics/track_rb.html +3 -2
  252. data/doc/files/lib/feature_rb.html +101 -0
  253. data/doc/files/samples/arkdb_features_rb.html +101 -0
  254. data/doc/files/samples/glyph_showcase_rb.html +108 -0
  255. data/doc/files/samples/protein_domains_rb.html +115 -0
  256. data/doc/files/samples/subfeatures_rb.html +108 -0
  257. data/doc/files/scripts/gff2png_rb.html +154 -0
  258. data/doc/files/test/unit/custom_glyph_in_file_rb.html +101 -0
  259. data/doc/files/test/unit/test_class_extensions_rb.html +108 -0
  260. data/doc/files/test/unit/test_creation_rb.html +108 -0
  261. data/doc/files/test/unit/test_custom_glyph_rb.html +108 -0
  262. data/doc/files/test/unit/test_draw_rb.html +108 -0
  263. data/doc/files/test/unit/test_imagemap_rb.html +108 -0
  264. data/doc/files/test/unit/test_subfeatures_rb.html +108 -0
  265. data/doc/fr_class_index.html +24 -6
  266. data/doc/fr_file_index.html +14 -0
  267. data/doc/fr_method_index.html +51 -19
  268. data/doc/images/glyph_showcase.png +0 -0
  269. data/doc/images/terms.svg +146 -132
  270. data/images/glyph_showcase.png +0 -0
  271. data/lib/bio-graphics.rb +38 -6
  272. data/lib/bio/graphics/feature.rb +212 -440
  273. data/lib/bio/graphics/glyphs/box.rb +21 -0
  274. data/lib/bio/graphics/glyphs/common.rb +149 -0
  275. data/lib/bio/graphics/glyphs/directed_box.rb +28 -0
  276. data/lib/bio/graphics/glyphs/directed_generic.rb +23 -0
  277. data/lib/bio/graphics/glyphs/directed_spliced.rb +39 -0
  278. data/lib/bio/graphics/glyphs/dot.rb +21 -0
  279. data/lib/bio/graphics/glyphs/generic.rb +15 -0
  280. data/lib/bio/graphics/glyphs/line.rb +17 -0
  281. data/lib/bio/graphics/glyphs/line_with_handles.rb +25 -0
  282. data/lib/bio/graphics/glyphs/spliced.rb +16 -0
  283. data/lib/bio/graphics/glyphs/transcript.rb +12 -0
  284. data/lib/bio/graphics/glyphs/triangle.rb +18 -0
  285. data/lib/bio/graphics/image_map.rb +25 -4
  286. data/lib/bio/graphics/panel.rb +266 -209
  287. data/lib/bio/graphics/ruler.rb +95 -96
  288. data/lib/bio/graphics/subfeature.rb +187 -0
  289. data/lib/bio/graphics/track.rb +155 -156
  290. data/lib/feature.rb +204 -0
  291. data/samples/arkdb_features.rb +10 -8
  292. data/samples/glyph_showcase.rb +58 -22
  293. data/samples/protein_domains.rb +19 -0
  294. data/samples/subfeatures.rb +31 -0
  295. data/test/unit/custom_glyph_in_file.rb +12 -0
  296. data/test/unit/data.txt +32 -0
  297. data/test/unit/test_class_extensions.rb +23 -0
  298. data/test/unit/test_creation.rb +43 -13
  299. data/test/unit/test_custom_glyph.rb +50 -0
  300. data/test/unit/test_draw.rb +211 -0
  301. data/test/unit/test_imagemap.rb +134 -0
  302. data/test/unit/test_subfeatures.rb +17 -0
  303. metadata +396 -119
  304. data/doc/classes/Bio/Graphics/Panel.src/M000005.html +0 -29
  305. data/doc/classes/Bio/Graphics/Panel.src/M000006.html +0 -19
  306. data/doc/classes/Bio/Graphics/Panel.src/M000007.html +0 -68
  307. data/doc/classes/Bio/Graphics/Panel/Ruler.src/M000008.html +0 -20
  308. data/doc/classes/Bio/Graphics/Panel/Ruler.src/M000009.html +0 -28
  309. data/doc/classes/Bio/Graphics/Panel/Ruler.src/M000010.html +0 -54
  310. data/doc/classes/Bio/Graphics/Panel/Ruler.src/M000013.html +0 -20
  311. data/doc/classes/Bio/Graphics/Panel/Ruler.src/M000014.html +0 -20
  312. data/doc/classes/Bio/Graphics/Panel/Ruler.src/M000015.html +0 -28
  313. data/doc/classes/Bio/Graphics/Panel/Ruler.src/M000016.html +0 -59
  314. data/doc/classes/Bio/Graphics/Panel/Ruler.src/M000017.html +0 -20
  315. data/doc/classes/Bio/Graphics/Panel/Ruler.src/M000018.html +0 -28
  316. data/doc/classes/Bio/Graphics/Panel/Ruler.src/M000019.html +0 -59
  317. data/doc/classes/Bio/Graphics/Panel/Track.src/M000008.html +0 -26
  318. data/doc/classes/Bio/Graphics/Panel/Track.src/M000009.html +0 -42
  319. data/doc/classes/Bio/Graphics/Panel/Track.src/M000010.html +0 -52
  320. data/doc/classes/Bio/Graphics/Panel/Track.src/M000011.html +0 -23
  321. data/doc/classes/Bio/Graphics/Panel/Track.src/M000012.html +0 -43
  322. data/doc/classes/Bio/Graphics/Panel/Track.src/M000013.html +0 -259
  323. data/doc/classes/Bio/Graphics/Panel/Track/Feature.src/M000011.html +0 -65
  324. data/doc/classes/Bio/Graphics/Panel/Track/Feature.src/M000012.html +0 -39
  325. data/doc/classes/Bio/Graphics/Panel/Track/Feature.src/M000013.html +0 -27
  326. data/doc/classes/Bio/Graphics/Panel/Track/Feature.src/M000014.html +0 -225
  327. data/doc/classes/Bio/Graphics/Panel/Track/Feature.src/M000015.html +0 -48
  328. data/doc/classes/Bio/Graphics/Panel/Track/Feature/PixelRange.src/M000012.html +0 -18
  329. data/doc/classes/Bio/Graphics/Panel/Track/Feature/PixelRange.src/M000013.html +0 -18
  330. data/doc/classes/Bio/Graphics/Panel/Track/Feature/PixelRange.src/M000015.html +0 -18
  331. data/doc/classes/Bio/Graphics/Panel/Track/Feature/PixelRange.src/M000016.html +0 -18
@@ -1,209 +1,266 @@
1
- #
2
- # = bio/graphics/panel - panel class
3
- #
4
- # Copyright:: Copyright (C) 2007
5
- # Jan Aerts <jan.aerts@bbsrc.ac.uk>
6
- # License:: The Ruby License
7
- #
8
- module Bio
9
- # = DESCRIPTION
10
- # The Bio::Graphics set of objects allow for creating simple images that
11
- # display features on a linear map. A picture consists of:
12
- # * one *panel*: container of all tracks
13
- # * one or more *tracks*: container of the features. Multiple tracks
14
- # can exist in the same graphic to allow for differential visualization of
15
- # different feature types (e.g. genes as blue rectangles and polymorphisms
16
- # as red triangles)
17
- # * one or more *features* in each track: these are the actual features that
18
- # you want to display (e.g. 'gene 1', 'SNP 123445')
19
- # * a *ruler* on top of the panel: is added automatically
20
- #
21
- # Schematically:
22
- # panel
23
- # +-> track 1
24
- # | +-> feature 1
25
- # | +-> feature 2
26
- # | +-> feature 3
27
- # +-> track 2
28
- # | +-> feature 4
29
- # | +-> feature 5
30
- # +-> ruler
31
- #
32
- # = USAGE
33
- # # Create a panel for something with a length of 653. This could be a
34
- # # sequence of 653 bp, but also a genetic map of 653 cM.
35
- # g = Bio::Graphics::Panel.new(653)
36
- #
37
- # # Add the first track (e.g. 'genes')
38
- # track1 = g.add_track('genes')
39
- #
40
- # # And put features in that track
41
- # track1.add_feature('gene1',250,375)
42
- # track1.add_feature('gene2',54,124)
43
- # track1.add_feature('gene3',100,500)
44
- #
45
- # # Add a second track (e.g. 'polymorphisms')
46
- # track2 = g.add_track('polymorphisms',, false, 'red','triangle')
47
- #
48
- # # And put features on this one
49
- # track2.add_feature('polymorphism 1',56,56)
50
- # track2.add_feature('polymorphism 2',103,103)
51
- #
52
- # # Create the actual image as SVG text
53
- # g.draw('my_picture.png')
54
- #
55
- # = FUTURE PROSPECTS
56
- # Any help from other developers is welcomed to work on these features:
57
- # * Would be nice if this module would be easily accessible from any object
58
- # that implements bioruby's Bio::Map::ActsAsMap.
59
- #
60
- module Graphics
61
-
62
- # The defaults
63
- DEFAULT_PANEL_WIDTH = 800 # How many pixels wide do we want the picture to be?
64
- TRACK_HEADER_HEIGHT = 12 # The track header will contain the title.
65
- FEATURE_HEIGHT = 10 # The height in pixels of a glyph.
66
- FEATURE_V_DISTANCE = 5 # The vertical distance in pixels between glyphs
67
- FEATURE_ARROW_LENGTH = 5 # In pixels again.
68
- RULER_TEXT_HEIGHT = 10 # And again...
69
- RULER_MIN_DISTANCE_TICKS_PIXEL = 5 # There should be at least 5 pixels between
70
- # consecutive ticks. This is used for the
71
- # calculation of tick distance.
72
- FONT = ['Georgia', 1, 1]
73
-
74
- # The Bio::Graphics::Panel class describes the complete graph and contains
75
- # all tracks. See Bio::Graphics documentation for explanation of interplay
76
- # between different classes.
77
-
78
- class Panel
79
- # Create a new Bio::Graphics::Panel object
80
- #
81
- # g = Bio::Graphics::Panel.new(456)
82
- #
83
- # The height of the image is calculated automatically depending on how many
84
- # tracks and features it contains. The width of the image defaults to 800 pt
85
- # but can be set manually by using a second argument:
86
- #
87
- # g = Bio::Graphics::Panel.new(456, 400)
88
- #
89
- #
90
- # See also: Bio::Graphics::Track, BioExt::Graphics::Feature
91
- # ---
92
- # *Arguments*:
93
- # * _length_ :: length of the thing you want to visualize, e.g for
94
- # visualizing a sequence that is 3.24 kb long, use 324.
95
- # * _width_ :: width of the resulting image in pt. This should be a string
96
- # and not an integer. Default = '800' (Notice the quotes...).
97
- # * _clickable_ :: whether the picture should have clickable glyphs or not
98
- # (default: false) If set to true, a html file will be created with
99
- # the map.
100
- # * _display_start_ :: start coordinate to be displayed (default: 1)
101
- # * _display_stop_ :: stop coordinate to be displayed (default: length of sequence)
102
- # *Returns*:: Bio::Graphics::Panel object
103
- def initialize(length, width = DEFAULT_PANEL_WIDTH, clickable = false, display_start = nil, display_stop = nil)
104
- @length = length.to_i
105
- @width = width.to_i
106
- @tracks = Array.new
107
- @number_of_feature_rows = 0
108
- @clickable = clickable
109
- @image_map = ( clickable ) ? ImageMap.new : nil
110
- @display_start = ( display_start.nil? or display_start < 0 ) ? 0 : display_start
111
- @display_stop = ( display_stop.nil? or display_stop > @length ) ? @length : display_stop
112
- if @display_stop <= @display_start
113
- raise "[ERROR] Start coordinate to be displayed has to be smaller than stop coordinate."
114
- end
115
- @rescale_factor = (@display_stop - @display_start).to_f / @width
116
- end
117
- attr_accessor :length, :width, :height, :rescale_factor, :tracks, :number_of_feature_rows, :clickable, :image_map, :display_start, :display_stop
118
-
119
- # Adds a Bio::Graphics::Track container to this panel. A panel contains a
120
- # logical grouping of features, e.g. (for sequence annotation:) genes,
121
- # polymorphisms, ESTs, etc.
122
- #
123
- # est_track = g.add_track('ESTs')
124
- # gene_track = g.add_track('genes')
125
- #
126
- # ---
127
- # *Arguments*:
128
- # * _name_ (required) :: Name of the track to be displayed (e.g. 'genes')
129
- # * _label) :: Whether the feature labels should be displayed or not
130
- # * _colour_ :: Colour to be used to draw the features within the track.
131
- # Default = 'blue'
132
- # * _glyph_ :: Glyph to use for drawing the features. Options are:
133
- # 'generic', 'directed_generic', 'spliced', 'directed_spliced' and
134
- # 'triangle'. Triangles can be used
135
- # for features whose start and stop positions are the same (e.g. SNPs).
136
- # If you try to draw a feature that is longer with triangles, an error
137
- # will be shown.
138
- # *Returns*:: Bio::Graphics::Track object that has just been created
139
- def add_track(name, label = true, feature_colour = [0,0,1], feature_glyph = 'generic')
140
- @tracks.push(Bio::Graphics::Panel::Track.new(self, name, label, feature_colour, feature_glyph))
141
- return @tracks[-1]
142
- end
143
-
144
- # Create the drawing
145
- #--
146
- # The fact that display_start and display_stop can be set has two
147
- # consequences:
148
- # 1. not all features are drawn
149
- # 2. the x-coordinate of all glyphs has to be corrected
150
- #++
151
- def draw(file_name)
152
- # Create a panel that is huge vertically
153
- huge_height = 2000
154
-
155
- huge_panel_drawing = nil
156
- huge_panel_drawing = Cairo::ImageSurface.new(1, @width, huge_height)
157
-
158
- background = Cairo::Context.new(huge_panel_drawing)
159
- background.set_source_rgb(1,1,1)
160
- background.rectangle(0,0,@width,huge_height).fill
161
-
162
- # Add ruler
163
- vertical_offset = 0
164
- ruler = Bio::Graphics::Panel::Ruler.new(self)
165
- ruler.draw(huge_panel_drawing, vertical_offset)
166
- vertical_offset += ruler.height
167
-
168
- # Add tracks
169
- @tracks.each do |track|
170
- track.vertical_offset = vertical_offset
171
- track.draw(huge_panel_drawing)
172
- @number_of_feature_rows += track.number_of_feature_rows
173
- vertical_offset += ( track.number_of_feature_rows*(FEATURE_HEIGHT+FEATURE_V_DISTANCE+5)) + 10 # '10' is for the header
174
- end
175
-
176
- # And create a smaller version of the panel
177
- height = ruler.height
178
- @number_of_feature_rows.times do
179
- height += 20
180
- end
181
- @tracks.length.times do #To correct for the track headers
182
- height += 10
183
- end
184
-
185
- resized_panel_drawing = nil
186
- resized_panel_drawing = Cairo::ImageSurface.new(1, @width, height)
187
- resizing_context = Cairo::Context.new(resized_panel_drawing)
188
- resizing_context.set_source(huge_panel_drawing, 0,0)
189
- resizing_context.rectangle(0,0,@width, height).fill
190
-
191
- # And print to file
192
- resized_panel_drawing.write_to_png(file_name)
193
- if @clickable # create png and map
194
- html_filename = file_name.sub(/\.[^.]+$/, '.html')
195
- html = File.open(html_filename,'w')
196
- html.puts "<html>"
197
- html.puts "<body>"
198
- html.puts @image_map.to_s
199
- html.puts "<img border='1' src='" + file_name + "' usemap='#image_map' />"
200
- html.puts "</body>"
201
- html.puts "</html>"
202
- end
203
- end
204
-
205
-
206
-
207
- end #Panel
208
- end #Graphics
209
- end #Bio
1
+ #
2
+ # = bio/graphics/panel - panel class
3
+ #
4
+ # Copyright:: Copyright (C) 2007, 2008
5
+ # Jan Aerts <jan.aerts@bbsrc.ac.uk>
6
+ # Charles Comstock <dgtized@gmail.com>
7
+ # License:: The Ruby License
8
+ #
9
+ include Math
10
+
11
+ # = DESCRIPTION
12
+ # The Bio::Graphics set of objects allow for creating simple images that
13
+ # display features on a linear map. A picture consists of:
14
+ # * one *panel*: container of all tracks
15
+ # * one or more *tracks*: container of the features. Multiple tracks
16
+ # can exist in the same graphic to allow for differential visualization of
17
+ # different feature types (e.g. genes as blue rectangles and polymorphisms
18
+ # as red triangles)
19
+ # * one or more *features* in each track: these are the actual features that
20
+ # you want to display (e.g. 'gene 1', 'SNP 123445')
21
+ # * a *ruler* on top of the panel: is added automatically
22
+ #
23
+ # Schematically:
24
+ # panel
25
+ # +-> track 1
26
+ # | +-> feature 1
27
+ # | +-> feature 2
28
+ # | +-> feature 3
29
+ # +-> track 2
30
+ # | +-> feature 4
31
+ # | +-> feature 5
32
+ # +-> ruler
33
+ #
34
+ # = USAGE
35
+ # # Create a panel for something with a length of 653. This could be a
36
+ # # sequence of 653 bp, but also a genetic map of 653 cM.
37
+ # g = Bio::Graphics::Panel.new(653)
38
+ #
39
+ # # Add the first track (e.g. 'genes')
40
+ # track1 = g.add_track('genes')
41
+ #
42
+ # # And put features in that track
43
+ # track1.add_feature('gene1','250..375')
44
+ # track1.add_feature('gene2','54..124')
45
+ # track1.add_feature('gene3','100..500')
46
+ #
47
+ # # Add a second track (e.g. 'polymorphisms')
48
+ # track2 = g.add_track('polymorphisms', false, [1,0,0], :triangle)
49
+ #
50
+ # # And put features on this one
51
+ # track2.add_feature('polymorphism 1','56')
52
+ # track2.add_feature('polymorphism 2','103')
53
+ #
54
+ # # Create the actual image as SVG text
55
+ # g.draw('my_picture.png')
56
+ #
57
+ # = NOTE ON ARGUMENTS
58
+ # As there can be an overwhelming number of arguments for some methods in
59
+ # Bio::Graphics, any optional arguments have to be provided as a hash. For
60
+ # example: the Track#add_feature method has only one mandatory argument (the
61
+ # feature object) and several optional ones. This is how you can use that
62
+ # method:
63
+ # track.add_feature(my_feature_object,
64
+ # :label => 'anonymous',
65
+ # :link => 'http://www.google.com',
66
+ # :glyph => :box,
67
+ # :colour => [0,1,0]
68
+ # )
69
+ module Bio::Graphics
70
+
71
+ # The defaults
72
+ DEFAULT_PANEL_WIDTH = 800 # How many pixels wide do we want the picture to be?
73
+ TRACK_HEADER_HEIGHT = 12 # The track header will contain the title.
74
+ FEATURE_HEIGHT = 10 # The height in pixels of a glyph.
75
+ FEATURE_V_DISTANCE = 5 # The vertical distance in pixels between glyphs
76
+ FEATURE_ARROW_LENGTH = 5 # In pixels again.
77
+ FONT = ['Georgia', 1, 1]
78
+
79
+ # The Bio::Graphics::Panel class describes the complete graph and contains
80
+ # all tracks. See Bio::Graphics documentation for explanation of interplay
81
+ # between different classes.
82
+ class Bio::Graphics::Panel
83
+ # Create a new Bio::Graphics::Panel object
84
+ #
85
+ # g = Bio::Graphics::Panel.new(456)
86
+ #
87
+ # The height of the image is calculated automatically depending on how many
88
+ # tracks and features it contains. The width of the image defaults to 800 pt
89
+ # but can be set manually by using the width argument to the opts hash:
90
+ #
91
+ # g = Bio::Graphics::Panel.new(456, :width => 1200)
92
+ #
93
+ #
94
+ # See also: Bio::Graphics::Panel::Track,
95
+ # Bio::Graphics::Panel::Track::Feature
96
+ # ---
97
+ # *Arguments*:
98
+ # * _length_ :: length of the thing you want to visualize, e.g for
99
+ # visualizing a sequence that is 3.24 kb long, use 324. (required)
100
+ # * _:width_ :: width of the resulting image in pixels. (default: 800)
101
+ # * _:clickable_ :: whether the picture should have clickable glyphs or not
102
+ # (default: false) If set to true, a html file will be created with
103
+ # the map.
104
+ # * _:display_start_ :: start coordinate to be displayed (default: 1)
105
+ # * _:display_stop_ :: stop coordinate to be displayed (default: length of sequence)
106
+ # * _:vertical_ :: Boolean: false = horizontal (= default)
107
+ # * _:format_ :: File format of the picture. Can be :png, :svg, :pdf or :ps
108
+ # (default: :png)
109
+ # *Returns*:: Bio::Graphics::Panel object
110
+ def initialize(length, opts = {})
111
+ @length = length
112
+ opts = {
113
+ :width => DEFAULT_PANEL_WIDTH,
114
+ :display_range => Range.new(0,@length),
115
+ :vertical => false,
116
+ :clickable => false,
117
+ :format => :png
118
+ }.merge(opts)
119
+
120
+ @width = opts[:width].to_i
121
+
122
+ @display_range = opts[:display_range]
123
+ @display_start = [0, @display_range.lend].max
124
+ @display_stop = [@length,@display_range.rend].min
125
+ if @display_stop <= @display_start
126
+ raise "[ERROR] Start coordinate to be displayed has to be smaller than stop coordinate."
127
+ end
128
+ @display_range = Range.new(@display_start,@display_stop)
129
+
130
+ @vertical = opts[:vertical]
131
+ @clickable = opts[:clickable]
132
+
133
+ @format = opts[:format]
134
+ if ! [:png, :svg, :pdf, :ps].include?(@format)
135
+ raise "[ERROR] Format has to be one of :png, :svg, :pdf or :ps."
136
+ end
137
+
138
+ @tracks = Array.new
139
+ @number_of_feature_rows = 0
140
+ @image_map = ImageMap.new
141
+
142
+ @rescale_factor = (@display_stop - @display_start).to_f / @width
143
+
144
+ # To prevent that we do the whole drawing thing multiple times
145
+ @final_panel_destination = nil
146
+ end
147
+ attr_accessor :length, :width, :height, :rescale_factor, :tracks, :number_of_feature_rows, :clickable, :image_map, :display_start, :display_stop, :display_range, :vertical, :format, :final_panel_destination
148
+
149
+ # Adds a Bio::Graphics::Track container to this panel. A panel contains a
150
+ # logical grouping of features, e.g. (for sequence annotation:) genes,
151
+ # polymorphisms, ESTs, etc.
152
+ #
153
+ # est_track = g.add_track('ESTs', :label => false, :glyph => :directed_generic)
154
+ # gene_track = g.add_track('genes', :label => true)
155
+ #
156
+ # ---
157
+ # *Arguments*:
158
+ # * _name_ :: Name to be displayed at the top of the track. (Required)
159
+ # * _:label_ :: boolean. Whether or not to display the labels for the features.
160
+ # (Default = true)
161
+ # * _:glyph_ :: Default glyph for features in this track. For more info, see
162
+ # the lib/bio/graphics/glyph directory. (Default = :generic)
163
+ # * _:colour_ :: Default colour for features in this track, in RGB
164
+ # (Default = [0,0,1])
165
+ # *Returns*:: Bio::Graphics::Track object that has just been created
166
+ def add_track(name, opts = {})
167
+ track = Bio::Graphics::Track.new(self, name, opts)
168
+ @tracks.push(track)
169
+ return track
170
+ end
171
+
172
+ # Create the drawing
173
+ #--
174
+ # The fact that display_start and display_stop can be set has two
175
+ # consequences:
176
+ # 1. not all features are drawn
177
+ # 2. the x-coordinate of all glyphs has to be corrected
178
+ #++
179
+ def draw(file_name)
180
+ if @final_panel_drawing.nil?
181
+ # Create a panel that is huge vertically
182
+ huge_height = 2000
183
+
184
+ huge_panel_destination = nil
185
+ huge_panel_destination = Cairo::ImageSurface.new(1, @width, huge_height)
186
+
187
+ background = Cairo::Context.new(huge_panel_destination)
188
+ background.set_source_rgb(1,1,1)
189
+ background.rectangle(0,0,@width,huge_height).fill
190
+
191
+ # Add ruler
192
+ vertical_offset = 0
193
+ ruler = Ruler.new(self)
194
+ ruler.draw(huge_panel_destination)
195
+ vertical_offset += ruler.height
196
+
197
+ # Add tracks
198
+ @tracks.each do |track|
199
+ track.vertical_offset = vertical_offset
200
+ track.draw(huge_panel_destination)
201
+ @number_of_feature_rows += track.number_of_feature_rows
202
+ vertical_offset += ( track.number_of_feature_rows*(FEATURE_HEIGHT+FEATURE_V_DISTANCE+5)) + 10 # '10' is for the header
203
+ end
204
+
205
+ # And create a smaller version of the panel
206
+ @height = ruler.height
207
+ @height += 20*@number_of_feature_rows
208
+ @height += 10*@tracks.length #To correct for the track headers
209
+
210
+ if @vertical
211
+ @image_map.flip_orientation(@width)
212
+
213
+ max_size = [@height, @width].max
214
+ rotated_destination = Cairo::ImageSurface.new(1, max_size, max_size)
215
+ rotated_context = Cairo::Context.new(rotated_destination)
216
+ rotated_context.rotate(3*PI/2)
217
+ rotated_context.translate(-@width, 0)
218
+ rotated_context.set_source(huge_panel_destination, 0, 0)
219
+ rotated_context.rectangle(0,0,max_size, max_size).fill
220
+
221
+ @width, @height = @height, @width
222
+ huge_panel_destination = rotated_destination
223
+ end
224
+
225
+ @final_panel_destination = Cairo::ImageSurface.new(1, @width, @height)
226
+ resized_context = Cairo::Context.new(@final_panel_destination)
227
+ resized_context.set_source(huge_panel_destination, 0, 0)
228
+ resized_context.rectangle(0,0,@width, @height).fill
229
+ end
230
+
231
+ # And print to file
232
+ if @format == :png
233
+ @final_panel_destination.write_to_png(file_name)
234
+ else
235
+ case @format
236
+ when :pdf
237
+ output_destination = Cairo::PDFSurface.new(file_name, @width, @height)
238
+ when :ps
239
+ output_destination = Cairo::PSSurface.new(file_name, @width, @height)
240
+ when :svg
241
+ output_destination = Cairo::SVGSurface.new(file_name, @width, @height)
242
+ end
243
+
244
+ output_context = Cairo::Context.new(output_destination)
245
+ output_context.set_source(@final_panel_destination, 0, 0)
246
+ output_context.rectangle(0,0,@width, @height).fill
247
+ end
248
+
249
+
250
+ if @clickable # create png and map
251
+ html_filename = file_name.sub(/\.[^.]+$/, '.html')
252
+ html = File.open(html_filename,'w')
253
+ html.puts "<html>"
254
+ html.puts "<body>"
255
+ html.puts @image_map.to_s
256
+ html.puts "<img border='1' src='" + file_name + "' usemap='#image_map' />"
257
+ html.puts "</body>"
258
+ html.puts "</html>"
259
+ html.close
260
+ end
261
+ end
262
+
263
+
264
+
265
+ end #Panel
266
+ end #Graphics