<classpathentry kind="lib" path="lib/log4j-to-slf4j-2.0-rc2.jar"/>
<classpathentry kind="lib" path="lib/slf4j-log4j12-1.7.7.jar"/>
<classpathentry kind="lib" path="lib/VARNAv3-91.jar"/>
- <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/plugin.jar"/>
<classpathentry kind="lib" path="lib/xml-apis.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Plugin.jar"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/plugin"/>
<classpathentry kind="lib" path="lib/jfreesvg-2.1.jar"/>
<classpathentry kind="output" path="classes"/>
</classpath>
--- /dev/null
+JALVIEW_ANNOTATION
+# Created: Fri Jun 21 13:44:50 BST 2013
+
+BAR_GRAPH Conservation Conservation of total alignment less than 25% gaps 1.0,1,1.0,[5d1500]|3.0,3,3.0,[7d3f00]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|1.0,1,1.0,[5d1500]|2.0,2,2.0,[6d2a00]|0.0,0,0.0,[4d0000]|1.0,1,1.0,[5d1500]|0.0,0,0.0,[4d0000]|1.0,1,1.0,[5d1500]|0.0,0,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,0,0.0,[4d0000]|1.0,1,1.0,[5d1500]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|2.0,2,2.0,[6d2a00]|1.0,1,1.0,[5d1500]|1.0,1,1.0,[5d1500]|1.0,1,1.0,[5d1500]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|1.0,1,1.0,[5d1500]|0.0,-,0.0,[4d0000]|2.0,2,2.0,[6d2a00]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|1.0,1,1.0,[5d1500]|0.0,0,0.0,[4d0000]|11.0,*,11.0,[ffe600]|7.0,7,7.0,[be9200]|11.0,*,11.0,[ffe600]|6.0,6,6.0,[ae7d00]|11.0,*,11.0,[ffe600]|6.0,6,6.0,[ae7d00]|8.0,8,8.0,[cea700]|9.0,9,9.0,[dfbc00]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|7.0,7,7.0,[be9200]|11.0,*,11.0,[ffe600]|3.0,3,3.0,[7d3f00]|6.0,6,6.0,[ae7d00]|11.0,*,11.0,[ffe600]|7.0,7,7.0,[be9200]|7.0,7,7.0,[be9200]|9.0,9,9.0,[dfbc00]|5.0,5,5.0,[9e6800]|6.0,6,6.0,[ae7d00]|8.0,8,8.0,[cea700]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|9.0,9,9.0,[dfbc00]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|3.0,3,3.0,[7d3f00]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|3.0,3,3.0,[7d3f00]|11.0,*,11.0,[ffe600]|5.0,5,5.0,[9e6800]|9.0,9,9.0,[dfbc00]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|9.0,9,9.0,[dfbc00]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|11.0,*,11.0,[ffe600]|9.0,9,9.0,[dfbc00]|3.0,3,3.0,[7d3f00]|7.0,7,7.0,[be9200]|11.0,*,11.0,[ffe600]|3.0,3,3.0,[7d3f00]|9.0,9,9.0,[dfbc00]|8.0,8,8.0,[cea700]|11.0,*,11.0,[ffe600]|6.0,6,6.0,[ae7d00]|11.0,*,11.0,[ffe600]|4.0,4,4.0,[8d5300]|5.0,5,5.0,[9e6800]|9.0,9,9.0,[dfbc00]|11.0,*,11.0,[ffe600]|8.0,8,8.0,[cea700]|9.0,9,9.0,[dfbc00]|0.0,0,0.0,[4d0000]|1.0,1,1.0,[5d1500]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|3.0,3,3.0,[7d3f00]|2.0,2,2.0,[6d2a00]|3.0,3,3.0,[7d3f00]|2.0,2,2.0,[6d2a00]|2.0,2,2.0,[6d2a00]|2.0,2,2.0,[6d2a00]|1.0,1,1.0,[5d1500]|3.0,3,3.0,[7d3f00]|2.0,2,2.0,[6d2a00]|2.0,2,2.0,[6d2a00]|0.0,0,0.0,[4d0000]|1.0,1,1.0,[5d1500]|4.0,4,4.0,[8d5300]|3.0,3,3.0,[7d3f00]|1.0,1,1.0,[5d1500]|2.0,2,2.0,[6d2a00]|3.0,3,3.0,[7d3f00]|2.0,2,2.0,[6d2a00]|5.0,5,5.0,[9e6800]|3.0,3,3.0,[7d3f00]|3.0,3,3.0,[7d3f00]|0.0,0,0.0,[4d0000]|0.0,0,0.0,[4d0000]|1.0,1,1.0,[5d1500]|0.0,0,0.0,[4d0000]|0.0,-,0.0,[4d0000]|0.0,-,0.0,[4d0000]|
+BAR_GRAPH Quality Alignment Quality based on Blosum62 scores 29.151815,29.151815,[cba200]|30.574812,30.574812,[d1aa00]|14.400199,14.400199,[8b5000]|16.93248,16.93248,[965e00]|2.1220763,2.1220763,[560c00]|2.2049963,2.2049963,[560c00]|3.647952,3.647952,[5c1400]|4.814642,4.814642,[611b00]|18.351393,18.351393,[9c6600]|17.532412,17.532412,[996200]|7.5054855,7.5054855,[6d2a00]|15.490477,15.490477,[905600]|14.241707,14.241707,[8a4f00]|9.905579,9.905579,[773700]|20.354017,20.354017,[a57100]|26.870352,26.870352,[c19600]|24.969187,24.969187,[b98b00]|27.419409,27.419409,[c39900]|15.350427,15.350427,[8f5600]|21.116522,21.116522,[a87600]|9.34032,9.34032,[753400]|14.1895275,14.1895275,[8a4f00]|10.104505,10.104505,[783800]|8.587312,8.587312,[723000]|18.694708,18.694708,[9e6800]|11.420612,11.420612,[7e4000]|6.8467255,6.8467255,[6a2600]|17.449827,17.449827,[986100]|16.825909,16.825909,[955e00]|2.4334474,2.4334474,[570e00]|15.685622,15.685622,[915700]|9.836516,9.836516,[773700]|3.4712791,3.4712791,[5c1300]|4.531816,4.531816,[601900]|7.8744216,7.8744216,[6f2c00]|0.0,0.0,[4d0000]|9.01113,9.01113,[743200]|3.174218,3.174218,[5a1200]|2.0395048,2.0395048,[550b00]|2.1654668,2.1654668,[560c00]|21.517344,21.517344,[aa7800]|15.738462,15.738462,[915800]|14.844854,14.844854,[8d5300]|22.159096,22.159096,[ad7c00]|13.956608,13.956608,[894e00]|20.147892,20.147892,[a47000]|25.067545,25.067545,[b98c00]|2.0943506,2.0943506,[560c00]|20.30842,20.30842,[a57100]|10.254437,10.254437,[793900]|6.5836596,6.5836596,[692500]|19.446732,19.446732,[a16c00]|6.2202287,6.2202287,[672300]|9.796006,9.796006,[773700]|6.0385494,6.0385494,[672200]|13.963727,13.963727,[894e00]|13.838549,13.838549,[884d00]|18.48424,18.48424,[9d6700]|18.302633,18.302633,[9c6600]|41.172745,41.172745,[ffe600]|32.59908,32.59908,[dab600]|41.172745,41.172745,[ffe600]|34.495945,34.495945,[e2c000]|41.172745,41.172745,[ffe600]|33.501804,33.501804,[debb00]|27.034466,27.034466,[c29700]|40.020737,40.020737,[fadf00]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|29.252739,29.252739,[cba300]|41.172745,41.172745,[ffe600]|14.935498,14.935498,[8d5300]|0.88449144,0.88449144,[500500]|41.172745,41.172745,[ffe600]|20.81991,20.81991,[a77400]|31.73346,31.73346,[d6b100]|29.757969,29.757969,[cea600]|16.279755,16.279755,[935b00]|32.647984,32.647984,[dab600]|38.352337,38.352337,[f3d600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|39.6125,39.6125,[f8dd00]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|9.671661,9.671661,[763600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|11.17141,11.17141,[7d3e00]|41.172745,41.172745,[ffe600]|3.2054348,3.2054348,[5a1200]|38.569283,38.569283,[f4d700]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|39.707684,39.707684,[f9dd00]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|41.172745,41.172745,[ffe600]|39.447525,39.447525,[f8dc00]|21.229778,21.229778,[a97600]|27.779364,27.779364,[c59b00]|41.172745,41.172745,[ffe600]|24.149143,24.149143,[b58700]|39.447525,39.447525,[f8dc00]|33.857655,33.857655,[dfbd00]|41.172745,41.172745,[ffe600]|28.69976,28.69976,[c9a000]|41.172745,41.172745,[ffe600]|14.611241,14.611241,[8c5100]|32.346375,32.346375,[d9b400]|39.24055,39.24055,[f7db00]|41.172745,41.172745,[ffe600]|38.352337,38.352337,[f3d600]|38.569283,38.569283,[f4d700]|22.374107,22.374107,[ae7d00]|36.98438,36.98438,[edce00]|12.34415,12.34415,[824500]|11.811655,11.811655,[804200]|14.798897,14.798897,[8d5200]|36.60138,36.60138,[ebcc00]|14.0762415,14.0762415,[8a4e00]|36.817875,36.817875,[eccd00]|36.53897,36.53897,[ebcc00]|37.583706,37.583706,[efd100]|35.536423,35.536423,[e7c600]|18.004925,18.004925,[9b6400]|37.633095,37.633095,[f0d200]|34.738743,34.738743,[e3c200]|36.451622,36.451622,[ebcb00]|19.948801,19.948801,[a36f00]|28.285,28.285,[c79e00]|35.93151,35.93151,[e8c800]|36.817875,36.817875,[eccd00]|26.762383,26.762383,[c19500]|36.37101,36.37101,[eacb00]|36.413998,36.413998,[eacb00]|37.583706,37.583706,[efd100]|36.282784,36.282784,[eaca00]|34.729824,34.729824,[e3c200]|36.413998,36.413998,[eacb00]|24.348654,24.348654,[b68800]|24.349539,24.349539,[b68800]|34.091675,34.091675,[e0be00]|21.114677,21.114677,[a87600]|13.676696,13.676696,[884c00]|2.1107035,2.1107035,[560c00]|
+BAR_GRAPH Consensus PID 80.0,M,M 80%|80.0,A,A 80%|20.0,+,[AST] 20%|53.333332,T,T 53%|0.0,-,- 0%|0.0,-,- 0%|13.333333,T,T 13%|20.0,P,P 20%|40.0,A,A 40%|40.0,L,L 40%|46.666668,S,S 46%|40.0,G,G 40%|33.333332,T,T 33%|20.0,+,[AIM] 20%|33.333332,V,V 33%|66.666664,S,S 66%|66.666664,T,T 66%|66.666664,S,S 66%|66.666664,F,F 66%|46.666668,L,L 46%|46.666668,R,R 46%|46.666668,R,R 46%|26.666666,Q,Q 26%|46.666668,P,P 46%|40.0,A,A 40%|60.0,P,P 60%|26.666666,T,T 26%|53.333332,S,S 53%|40.0,L,L 40%|20.0,R,R 20%|26.666666,S,S 26%|33.333332,L,L 33%|40.0,P,P 40%|26.666666,S,S 26%|33.333332,+,[AN] 33%|26.666666,V,V 26%|33.333332,G,G 33%|20.0,+,[EQ] 20%|0.0,-,- 0%|0.0,-,- 0%|33.333332,+,[AS] 33%|53.333332,L,L 53%|60.0,F,F 60%|73.333336,G,G 73%|66.666664,L,L 66%|66.666664,K,K 66%|53.333332,S,S 53%|0.0,-,- 0%|40.0,S,S 40%|26.666666,T,T 26%|20.0,A,A 20%|66.666664,R,R 66%|40.0,G,G 40%|53.333332,G,G 53%|46.666668,R,R 46%|33.333332,V,V 33%|46.666668,T,T 46%|53.333332,A,A 53%|66.666664,M,M 66%|100.0,A,A 100%|53.333332,T,T 53%|100.0,Y,Y 100%|86.666664,K,K 86%|100.0,V,V 100%|86.666664,K,K 86%|66.666664,L,L 66%|80.0,I,I 80%|100.0,T,T 100%|100.0,P,P 100%|66.666664,E,E 66%|100.0,G,G 100%|46.666668,E,E 46%|46.666668,Q,Q 46%|100.0,E,E 100%|46.666668,F,F 46%|60.0,E,E 60%|86.666664,C,C 86%|66.666664,P,P 66%|80.0,D,D 80%|93.333336,D,D 93%|100.0,V,V 100%|100.0,Y,Y 100%|66.666664,I,I 66%|100.0,L,L 100%|100.0,D,D 100%|46.666668,A,A 46%|100.0,A,A 100%|100.0,E,E 100%|100.0,E,E 100%|53.333332,A,A 53%|100.0,G,G 100%|60.0,I,I 60%|93.333336,D,D 93%|100.0,L,L 100%|100.0,P,P 100%|93.333336,Y,Y 93%|100.0,S,S 100%|100.0,C,C 100%|100.0,R,R 100%|100.0,A,A 100%|100.0,G,G 100%|100.0,S,S 100%|100.0,C,C 100%|100.0,S,S 100%|100.0,S,S 100%|100.0,C,C 100%|100.0,A,A 100%|100.0,G,G 100%|100.0,K,K 100%|80.0,V,V 80%|60.0,V,V 60%|53.333332,S,S 53%|100.0,G,G 100%|60.0,S,S 60%|80.0,V,V 80%|80.0,D,D 80%|100.0,Q,Q 100%|66.666664,S,S 66%|100.0,D,D 100%|46.666668,+,[GQ] 46%|73.333336,S,S 73%|93.333336,F,F 93%|100.0,L,L 100%|93.333336,D,D 93%|93.333336,D,D 93%|53.333332,D,D 53%|93.333336,Q,Q 93%|53.333332,I,I 53%|40.0,A,A 40%|53.333332,E,E 53%|93.333336,G,G 93%|46.666668,W,W 46%|93.333336,V,V 93%|93.333336,L,L 93%|93.333336,T,T 93%|93.333336,C,C 93%|53.333332,V,V 53%|93.333336,A,A 93%|86.666664,Y,Y 86%|93.333336,P,P 93%|60.0,T,T 60%|73.333336,S,S 73%|93.333336,D,D 93%|93.333336,V,V 93%|66.666664,T,T 66%|93.333336,I,I 93%|93.333336,E,E 93%|93.333336,T,T 93%|93.333336,H,H 93%|86.666664,K,K 86%|93.333336,E,E 93%|73.333336,E,E 73%|60.0,E,E 60%|73.333336,L,L 73%|46.666668,T,T 46%|40.0,A,A 40%|0.0,-,- 0%|
+
+SEQUENCE_REF FER2_ARATH
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.1671,0.1671,[72144e]|0.2129,0.2129,[72144e]|0.247,0.247,[72144e]|0.1554,0.1554,[72144e]|0.1162,0.1162,[72144e]|0.1449,0.1449,[72144e]|0.1731,0.1731,[72144e]|0.2064,0.2064,[72144e]|0.2436,0.2436,[72144e]|0.2715,0.2715,[72144e]|0.3249,0.3249,[72144e]|0.2783,0.2783,[72144e]|0.3019,0.3019,[72144e]|0.2399,0.2399,[72144e]|0.2364,0.2364,[72144e]|0.2645,0.2645,[72144e]|0.2609,0.2609,[72144e]|0.2988,0.2988,[72144e]|0.2064,0.2064,[72144e]|0.2094,0.2094,[72144e]|0.2849,0.2849,[72144e]|0.3426,0.3426,[72144e]|0.3529,0.3529,[72144e]|0.3426,0.3426,[72144e]|0.2817,0.2817,[72144e]|0.2783,0.2783,[72144e]|0.3426,0.3426,[72144e]|0.2715,0.2715,[72144e]|0.2609,0.2609,[72144e]|0.2503,0.2503,[72144e]|0.2364,0.2364,[72144e]|0.2364,0.2364,[72144e]|0.1791,0.1791,[72144e]|0.247,0.247,[72144e]|0.2503,0.2503,[72144e]|0.3149,0.3149,[72144e]|0.3149,0.3149,[72144e]|0.2645,0.2645,[72144e]|0.3356,0.3356,[72144e]|0.2752,0.2752,[72144e]|0.346,0.346,[72144e]|0.346,0.346,[72144e]|0.3426,0.3426,[72144e]|0.2645,0.2645,[72144e]|0.247,0.247,[72144e]|0.1969,0.1969,[72144e]|0.2503,0.2503,[72144e]|0.2503,0.2503,[72144e]|0.1852,0.1852,[72144e]|0.2541,0.2541,[72144e]|0.2951,0.2951,[72144e]|0.3182,0.3182,[72144e]|0.3215,0.3215,[72144e]|0.3392,0.3392,[72144e]|0.374,0.374,[72144e]|0.3948,0.3948,[72144e]|0.3392,0.3392,[72144e]|0.3599,0.3599,[72144e]|0.268,0.268,[72144e]|0.3426,0.3426,[72144e]|0.3599,0.3599,[72144e]|0.4051,0.4051,[72144e]|0.374,0.374,[72144e]|0.3249,0.3249,[72144e]|0.268,0.268,[72144e]|0.2783,0.2783,[72144e]|0.3019,0.3019,[72144e]|0.3286,0.3286,[72144e]|0.3117,0.3117,[72144e]|0.4292,0.4292,[72144e]|0.5296,0.5296,[72144e]|0.4901,0.4901,[72144e]|0.4582,0.4582,[72144e]|0.3667,0.3667,[72144e]|0.384,0.384,[72144e]|0.2918,0.2918,[72144e]|0.3182,0.3182,[72144e]|0.2193,0.2193,[72144e]|0.2752,0.2752,[72144e]|0.1643,0.1643,[72144e]|0.2541,0.2541,[72144e]|0.2034,0.2034,[72144e]|0.1852,0.1852,[72144e]|0.1702,0.1702,[72144e]|0.1399,0.1399,[72144e]|0.2034,0.2034,[72144e]|0.2541,0.2541,[72144e]|0.2292,0.2292,[72144e]|0.1881,0.1881,[72144e]|0.2129,0.2129,[72144e]|0.2292,0.2292,[72144e]|0.1643,0.1643,[72144e]|0.107,0.107,[72144e]|0.1251,0.1251,[72144e]|0.1251,0.1251,[72144e]|0.1759,0.1759,[72144e]|0.1115,0.1115,[72144e]|0.1731,0.1731,[72144e]|0.1501,0.1501,[72144e]|0.2164,0.2164,[72144e]|0.2328,0.2328,[72144e]|0.3286,0.3286,[72144e]|0.3286,0.3286,[72144e]|0.2645,0.2645,[72144e]|0.2034,0.2034,[72144e]|0.2193,0.2193,[72144e]|0.3286,0.3286,[72144e]|0.3529,0.3529,[72144e]|0.3631,0.3631,[72144e]|0.4292,0.4292,[72144e]|0.4541,0.4541,[72144e]|0.4766,0.4766,[72144e]|0.4864,0.4864,[72144e]|0.4652,0.4652,[72144e]|0.4685,0.4685,[72144e]|0.4051,0.4051,[72144e]|0.4087,0.4087,[72144e]|0.3117,0.3117,[72144e]|0.3321,0.3321,[72144e]|0.2918,0.2918,[72144e]|0.2164,0.2164,[72144e]|0.2503,0.2503,[72144e]|0.2364,0.2364,[72144e]|0.2292,0.2292,[72144e]|0.2503,0.2503,[72144e]|0.2918,0.2918,[72144e]|0.3053,0.3053,[72144e]|0.2258,0.2258,[72144e]|0.2292,0.2292,[72144e]|0.2129,0.2129,[72144e]|0.2064,0.2064,[72144e]|0.2164,0.2164,[72144e]|0.2436,0.2436,[72144e]|0.2436,0.2436,[72144e]|0.2193,0.2193,[72144e]|0.2258,0.2258,[72144e]|0.2503,0.2503,[72144e]|0.3117,0.3117,[72144e]|0.2884,0.2884,[72144e]|0.374,0.374,[72144e]|0.4149,0.4149,[72144e]|0.4292,0.4292,[72144e]|0.5098,0.5098,[72144e]|0.4476,0.4476,[72144e]|0.422,0.422,[72144e]|0.4017,0.4017,[72144e]|0.3494,0.3494,[72144e]|0.4087,0.4087,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.82,0.82,[329440]|0.7147,0.7147,[329440]|0.6715,0.6715,[329440]|0.6334,0.6334,[329440]|0.59,0.59,[329440]|0.4513,0.4513,[329440]|0.3263,0.3263,[329440]|0.2963,0.2963,[329440]|0.2657,0.2657,[329440]|0.2292,0.2292,[329440]|0.1998,0.1998,[329440]|0.2209,0.2209,[329440]|0.2865,0.2865,[329440]|0.2122,0.2122,[329440]|0.2041,0.2041,[329440]|0.1667,0.1667,[329440]|0.2602,0.2602,[329440]|0.2558,0.2558,[329440]|0.1844,0.1844,[329440]|0.2483,0.2483,[329440]|0.2292,0.2292,[329440]|0.2657,0.2657,[329440]|0.2748,0.2748,[329440]|0.2748,0.2748,[329440]|0.2865,0.2865,[329440]|0.3762,0.3762,[329440]|0.3847,0.3847,[329440]|0.2786,0.2786,[329440]|0.27,0.27,[329440]|0.1878,0.1878,[329440]|0.1805,0.1805,[329440]|0.1805,0.1805,[329440]|0.1532,0.1532,[329440]|0.2255,0.2255,[329440]|0.1958,0.1958,[329440]|0.2786,0.2786,[329440]|0.2657,0.2657,[329440]|0.2748,0.2748,[329440]|0.3491,0.3491,[329440]|0.2531,0.2531,[329440]|0.3456,0.3456,[329440]|0.3491,0.3491,[329440]|0.3146,0.3146,[329440]|0.282,0.282,[329440]|0.27,0.27,[329440]|0.1998,0.1998,[329440]|0.2558,0.2558,[329440]|0.282,0.282,[329440]|0.2602,0.2602,[329440]|0.2602,0.2602,[329440]|0.1878,0.1878,[329440]|0.1844,0.1844,[329440]|0.2122,0.2122,[329440]|0.2292,0.2292,[329440]|0.2602,0.2602,[329440]|0.2786,0.2786,[329440]|0.282,0.282,[329440]|0.3005,0.3005,[329440]|0.2385,0.2385,[329440]|0.3184,0.3184,[329440]|0.2255,0.2255,[329440]|0.2748,0.2748,[329440]|0.3225,0.3225,[329440]|0.3762,0.3762,[329440]|0.3225,0.3225,[329440]|0.3225,0.3225,[329440]|0.2865,0.2865,[329440]|0.2865,0.2865,[329440]|0.3263,0.3263,[329440]|0.3717,0.3717,[329440]|0.4037,0.4037,[329440]|0.4245,0.4245,[329440]|0.4116,0.4116,[329440]|0.3578,0.3578,[329440]|0.3535,0.3535,[329440]|0.2748,0.2748,[329440]|0.2963,0.2963,[329440]|0.2167,0.2167,[329440]|0.3096,0.3096,[329440]|0.2255,0.2255,[329440]|0.3225,0.3225,[329440]|0.1732,0.1732,[329440]|0.1495,0.1495,[329440]|0.1088,0.1088,[329440]|0.1456,0.1456,[329440]|0.2041,0.2041,[329440]|0.1532,0.1532,[329440]|0.2041,0.2041,[329440]|0.1878,0.1878,[329440]|0.1322,0.1322,[329440]|0.1349,0.1349,[329440]|0.1205,0.1205,[329440]|0.0965,0.0965,[329440]|0.0884,0.0884,[329440]|0.0643,0.0643,[329440]|0.0935,0.0935,[329440]|0.0771,0.0771,[329440]|0.1088,0.1088,[329440]|0.0587,0.0587,[329440]|0.0991,0.0991,[329440]|0.0991,0.0991,[329440]|0.1958,0.1958,[329440]|0.2255,0.2255,[329440]|0.2602,0.2602,[329440]|0.2657,0.2657,[329440]|0.1844,0.1844,[329440]|0.2292,0.2292,[329440]|0.2483,0.2483,[329440]|0.2657,0.2657,[329440]|0.3939,0.3939,[329440]|0.4245,0.4245,[329440]|0.4037,0.4037,[329440]|0.4203,0.4203,[329440]|0.4967,0.4967,[329440]|0.5473,0.5473,[329440]|0.4781,0.4781,[329440]|0.4282,0.4282,[329440]|0.3578,0.3578,[329440]|0.4203,0.4203,[329440]|0.3491,0.3491,[329440]|0.2913,0.2913,[329440]|0.2657,0.2657,[329440]|0.1805,0.1805,[329440]|0.2167,0.2167,[329440]|0.208,0.208,[329440]|0.2963,0.2963,[329440]|0.3806,0.3806,[329440]|0.2963,0.2963,[329440]|0.2255,0.2255,[329440]|0.1456,0.1456,[329440]|0.1635,0.1635,[329440]|0.1766,0.1766,[329440]|0.1698,0.1698,[329440]|0.1349,0.1349,[329440]|0.1532,0.1532,[329440]|0.2292,0.2292,[329440]|0.2483,0.2483,[329440]|0.2432,0.2432,[329440]|0.2041,0.2041,[329440]|0.3005,0.3005,[329440]|0.4037,0.4037,[329440]|0.4749,0.4749,[329440]|0.59,0.59,[329440]|0.5941,0.5941,[329440]|0.6442,0.6442,[329440]|0.6827,0.6827,[329440]|0.7034,0.7034,[329440]|0.8001,0.8001,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF Q93Z60_ARATH
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.1671,0.1671,[72144e]|0.2129,0.2129,[72144e]|0.247,0.247,[72144e]|0.1554,0.1554,[72144e]|0.1162,0.1162,[72144e]|0.1449,0.1449,[72144e]|0.1731,0.1731,[72144e]|0.2064,0.2064,[72144e]|0.2436,0.2436,[72144e]|0.2715,0.2715,[72144e]|0.3215,0.3215,[72144e]|0.2752,0.2752,[72144e]|0.2988,0.2988,[72144e]|0.2364,0.2364,[72144e]|0.2328,0.2328,[72144e]|0.2575,0.2575,[72144e]|0.2575,0.2575,[72144e]|0.2918,0.2918,[72144e]|0.2034,0.2034,[72144e]|0.2034,0.2034,[72144e]|0.2817,0.2817,[72144e]|0.3392,0.3392,[72144e]|0.3494,0.3494,[72144e]|0.3426,0.3426,[72144e]|0.2783,0.2783,[72144e]|0.2752,0.2752,[72144e]|0.3426,0.3426,[72144e]|0.2715,0.2715,[72144e]|0.2609,0.2609,[72144e]|0.247,0.247,[72144e]|0.2364,0.2364,[72144e]|0.2364,0.2364,[72144e]|0.1791,0.1791,[72144e]|0.247,0.247,[72144e]|0.2503,0.2503,[72144e]|0.3215,0.3215,[72144e]|0.3215,0.3215,[72144e]|0.2715,0.2715,[72144e]|0.3426,0.3426,[72144e]|0.2817,0.2817,[72144e]|0.3566,0.3566,[72144e]|0.3566,0.3566,[72144e]|0.3529,0.3529,[72144e]|0.2715,0.2715,[72144e]|0.2575,0.2575,[72144e]|0.2064,0.2064,[72144e]|0.2645,0.2645,[72144e]|0.2645,0.2645,[72144e]|0.1942,0.1942,[72144e]|0.2645,0.2645,[72144e]|0.3053,0.3053,[72144e]|0.3286,0.3286,[72144e]|0.3321,0.3321,[72144e]|0.3494,0.3494,[72144e]|0.384,0.384,[72144e]|0.4051,0.4051,[72144e]|0.3494,0.3494,[72144e]|0.3667,0.3667,[72144e]|0.2752,0.2752,[72144e]|0.346,0.346,[72144e]|0.3631,0.3631,[72144e]|0.4051,0.4051,[72144e]|0.3704,0.3704,[72144e]|0.3215,0.3215,[72144e]|0.268,0.268,[72144e]|0.2783,0.2783,[72144e]|0.2988,0.2988,[72144e]|0.3249,0.3249,[72144e]|0.3053,0.3053,[72144e]|0.422,0.422,[72144e]|0.5139,0.5139,[72144e]|0.4801,0.4801,[72144e]|0.4476,0.4476,[72144e]|0.3566,0.3566,[72144e]|0.374,0.374,[72144e]|0.2849,0.2849,[72144e]|0.3087,0.3087,[72144e]|0.2129,0.2129,[72144e]|0.2645,0.2645,[72144e]|0.1583,0.1583,[72144e]|0.247,0.247,[72144e]|0.2002,0.2002,[72144e]|0.1852,0.1852,[72144e]|0.1702,0.1702,[72144e]|0.1399,0.1399,[72144e]|0.2002,0.2002,[72144e]|0.247,0.247,[72144e]|0.2224,0.2224,[72144e]|0.1852,0.1852,[72144e]|0.2094,0.2094,[72144e]|0.2258,0.2258,[72144e]|0.1611,0.1611,[72144e]|0.1092,0.1092,[72144e]|0.1251,0.1251,[72144e]|0.1251,0.1251,[72144e]|0.1759,0.1759,[72144e]|0.1115,0.1115,[72144e]|0.1731,0.1731,[72144e]|0.1501,0.1501,[72144e]|0.2129,0.2129,[72144e]|0.2292,0.2292,[72144e]|0.3249,0.3249,[72144e]|0.3215,0.3215,[72144e]|0.2645,0.2645,[72144e]|0.2002,0.2002,[72144e]|0.2193,0.2193,[72144e]|0.3286,0.3286,[72144e]|0.3249,0.3249,[72144e]|0.3117,0.3117,[72144e]|0.391,0.391,[72144e]|0.4051,0.4051,[72144e]|0.384,0.384,[72144e]|0.3774,0.3774,[72144e]|0.4292,0.4292,[72144e]|0.4901,0.4901,[72144e]|0.4801,0.4801,[72144e]|0.4582,0.4582,[72144e]|0.4409,0.4409,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.82,0.82,[329440]|0.7147,0.7147,[329440]|0.6715,0.6715,[329440]|0.6334,0.6334,[329440]|0.59,0.59,[329440]|0.4513,0.4513,[329440]|0.3263,0.3263,[329440]|0.2963,0.2963,[329440]|0.2657,0.2657,[329440]|0.2292,0.2292,[329440]|0.1998,0.1998,[329440]|0.2209,0.2209,[329440]|0.2865,0.2865,[329440]|0.2122,0.2122,[329440]|0.2041,0.2041,[329440]|0.1667,0.1667,[329440]|0.2602,0.2602,[329440]|0.2558,0.2558,[329440]|0.1844,0.1844,[329440]|0.2483,0.2483,[329440]|0.2292,0.2292,[329440]|0.2657,0.2657,[329440]|0.2748,0.2748,[329440]|0.2748,0.2748,[329440]|0.2865,0.2865,[329440]|0.3762,0.3762,[329440]|0.3847,0.3847,[329440]|0.2786,0.2786,[329440]|0.27,0.27,[329440]|0.1878,0.1878,[329440]|0.1805,0.1805,[329440]|0.1805,0.1805,[329440]|0.1532,0.1532,[329440]|0.2255,0.2255,[329440]|0.1958,0.1958,[329440]|0.2786,0.2786,[329440]|0.2657,0.2657,[329440]|0.2748,0.2748,[329440]|0.3491,0.3491,[329440]|0.2531,0.2531,[329440]|0.3456,0.3456,[329440]|0.3491,0.3491,[329440]|0.3146,0.3146,[329440]|0.282,0.282,[329440]|0.27,0.27,[329440]|0.1998,0.1998,[329440]|0.2558,0.2558,[329440]|0.282,0.282,[329440]|0.2602,0.2602,[329440]|0.2602,0.2602,[329440]|0.1878,0.1878,[329440]|0.1844,0.1844,[329440]|0.2122,0.2122,[329440]|0.2292,0.2292,[329440]|0.2602,0.2602,[329440]|0.2786,0.2786,[329440]|0.282,0.282,[329440]|0.3005,0.3005,[329440]|0.2385,0.2385,[329440]|0.3184,0.3184,[329440]|0.2255,0.2255,[329440]|0.2748,0.2748,[329440]|0.3225,0.3225,[329440]|0.3762,0.3762,[329440]|0.3225,0.3225,[329440]|0.3225,0.3225,[329440]|0.2865,0.2865,[329440]|0.2865,0.2865,[329440]|0.3263,0.3263,[329440]|0.3717,0.3717,[329440]|0.4037,0.4037,[329440]|0.4245,0.4245,[329440]|0.4116,0.4116,[329440]|0.3578,0.3578,[329440]|0.3535,0.3535,[329440]|0.2748,0.2748,[329440]|0.2963,0.2963,[329440]|0.2167,0.2167,[329440]|0.3096,0.3096,[329440]|0.2255,0.2255,[329440]|0.3225,0.3225,[329440]|0.1732,0.1732,[329440]|0.1495,0.1495,[329440]|0.1088,0.1088,[329440]|0.1456,0.1456,[329440]|0.2041,0.2041,[329440]|0.1532,0.1532,[329440]|0.1998,0.1998,[329440]|0.1844,0.1844,[329440]|0.1205,0.1205,[329440]|0.124,0.124,[329440]|0.1088,0.1088,[329440]|0.0858,0.0858,[329440]|0.0789,0.0789,[329440]|0.0607,0.0607,[329440]|0.0858,0.0858,[329440]|0.0701,0.0701,[329440]|0.1018,0.1018,[329440]|0.0567,0.0567,[329440]|0.0935,0.0935,[329440]|0.0965,0.0965,[329440]|0.1921,0.1921,[329440]|0.2167,0.2167,[329440]|0.2558,0.2558,[329440]|0.2602,0.2602,[329440]|0.1921,0.1921,[329440]|0.2602,0.2602,[329440]|0.2786,0.2786,[329440]|0.2913,0.2913,[329440]|0.4556,0.4556,[329440]|0.5331,0.5331,[329440]|0.5802,0.5802,[329440]|0.6412,0.6412,[329440]|0.7232,0.7232,[329440]|0.8074,0.8074,[329440]|0.8457,0.8457,[329440]|0.8823,0.8823,[329440]|0.9141,0.9141,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF FER1_ARATH
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.1583,0.1583,[72144e]|0.2034,0.2034,[72144e]|0.2364,0.2364,[72144e]|0.1476,0.1476,[72144e]|0.1048,0.1048,[72144e]|0.1349,0.1349,[72144e]|0.1643,0.1643,[72144e]|0.1881,0.1881,[72144e]|0.247,0.247,[72144e]|0.2399,0.2399,[72144e]|0.2951,0.2951,[72144e]|0.2503,0.2503,[72144e]|0.2783,0.2783,[72144e]|0.2129,0.2129,[72144e]|0.2094,0.2094,[72144e]|0.2364,0.2364,[72144e]|0.2328,0.2328,[72144e]|0.2715,0.2715,[72144e]|0.2715,0.2715,[72144e]|0.2715,0.2715,[72144e]|0.346,0.346,[72144e]|0.4051,0.4051,[72144e]|0.4149,0.4149,[72144e]|0.4087,0.4087,[72144e]|0.3392,0.3392,[72144e]|0.3392,0.3392,[72144e]|0.4087,0.4087,[72144e]|0.3321,0.3321,[72144e]|0.3215,0.3215,[72144e]|0.3215,0.3215,[72144e]|0.2884,0.2884,[72144e]|0.3215,0.3215,[72144e]|0.2609,0.2609,[72144e]|0.3321,0.3321,[72144e]|0.3356,0.3356,[72144e]|0.4051,0.4051,[72144e]|0.4017,0.4017,[72144e]|0.3494,0.3494,[72144e]|0.4292,0.4292,[72144e]|0.3667,0.3667,[72144e]|0.346,0.346,[72144e]|0.3494,0.3494,[72144e]|0.346,0.346,[72144e]|0.268,0.268,[72144e]|0.247,0.247,[72144e]|0.1969,0.1969,[72144e]|0.2541,0.2541,[72144e]|0.2541,0.2541,[72144e]|0.1881,0.1881,[72144e]|0.2609,0.2609,[72144e]|0.3019,0.3019,[72144e]|0.3249,0.3249,[72144e]|0.3249,0.3249,[72144e]|0.346,0.346,[72144e]|0.3053,0.3053,[72144e]|0.3249,0.3249,[72144e]|0.2715,0.2715,[72144e]|0.2951,0.2951,[72144e]|0.2034,0.2034,[72144e]|0.2715,0.2715,[72144e]|0.2817,0.2817,[72144e]|0.3249,0.3249,[72144e]|0.2951,0.2951,[72144e]|0.247,0.247,[72144e]|0.1942,0.1942,[72144e]|0.2002,0.2002,[72144e]|0.2224,0.2224,[72144e]|0.2503,0.2503,[72144e]|0.2328,0.2328,[72144e]|0.346,0.346,[72144e]|0.4409,0.4409,[72144e]|0.4087,0.4087,[72144e]|0.3774,0.3774,[72144e]|0.2849,0.2849,[72144e]|0.2988,0.2988,[72144e]|0.2064,0.2064,[72144e]|0.3087,0.3087,[72144e]|0.2094,0.2094,[72144e]|0.2645,0.2645,[72144e]|0.1554,0.1554,[72144e]|0.2399,0.2399,[72144e]|0.1969,0.1969,[72144e]|0.1852,0.1852,[72144e]|0.1702,0.1702,[72144e]|0.1399,0.1399,[72144e]|0.2002,0.2002,[72144e]|0.2503,0.2503,[72144e]|0.2258,0.2258,[72144e]|0.1881,0.1881,[72144e]|0.2129,0.2129,[72144e]|0.2292,0.2292,[72144e]|0.1611,0.1611,[72144e]|0.107,0.107,[72144e]|0.1251,0.1251,[72144e]|0.1229,0.1229,[72144e]|0.1759,0.1759,[72144e]|0.1229,0.1229,[72144e]|0.1914,0.1914,[72144e]|0.1702,0.1702,[72144e]|0.2364,0.2364,[72144e]|0.2503,0.2503,[72144e]|0.3529,0.3529,[72144e]|0.3494,0.3494,[72144e]|0.2884,0.2884,[72144e]|0.2258,0.2258,[72144e]|0.2436,0.2436,[72144e]|0.3529,0.3529,[72144e]|0.3774,0.3774,[72144e]|0.3872,0.3872,[72144e]|0.4119,0.4119,[72144e]|0.4369,0.4369,[72144e]|0.4619,0.4619,[72144e]|0.4725,0.4725,[72144e]|0.433,0.433,[72144e]|0.4369,0.4369,[72144e]|0.374,0.374,[72144e]|0.3774,0.3774,[72144e]|0.2817,0.2817,[72144e]|0.3087,0.3087,[72144e]|0.2715,0.2715,[72144e]|0.1942,0.1942,[72144e]|0.2292,0.2292,[72144e]|0.2164,0.2164,[72144e]|0.2064,0.2064,[72144e]|0.2224,0.2224,[72144e]|0.2609,0.2609,[72144e]|0.3249,0.3249,[72144e]|0.2436,0.2436,[72144e]|0.2503,0.2503,[72144e]|0.2328,0.2328,[72144e]|0.2193,0.2193,[72144e]|0.2715,0.2715,[72144e]|0.2951,0.2951,[72144e]|0.2988,0.2988,[72144e]|0.3149,0.3149,[72144e]|0.3392,0.3392,[72144e]|0.3356,0.3356,[72144e]|0.3948,0.3948,[72144e]|0.3774,0.3774,[72144e]|0.4725,0.4725,[72144e]|0.4864,0.4864,[72144e]|0.5055,0.5055,[72144e]|0.6043,0.6043,[72144e]|0.5296,0.5296,[72144e]|0.5098,0.5098,[72144e]|0.4979,0.4979,[72144e]|0.4507,0.4507,[72144e]|0.5296,0.5296,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.8242,0.8242,[329440]|0.7275,0.7275,[329440]|0.6906,0.6906,[329440]|0.6516,0.6516,[329440]|0.6124,0.6124,[329440]|0.4781,0.4781,[329440]|0.3535,0.3535,[329440]|0.3225,0.3225,[329440]|0.2913,0.2913,[329440]|0.2432,0.2432,[329440]|0.2292,0.2292,[329440]|0.2209,0.2209,[329440]|0.2913,0.2913,[329440]|0.2167,0.2167,[329440]|0.208,0.208,[329440]|0.1766,0.1766,[329440]|0.2657,0.2657,[329440]|0.2657,0.2657,[329440]|0.1958,0.1958,[329440]|0.2558,0.2558,[329440]|0.3184,0.3184,[329440]|0.3456,0.3456,[329440]|0.3456,0.3456,[329440]|0.3399,0.3399,[329440]|0.3578,0.3578,[329440]|0.4458,0.4458,[329440]|0.46,0.46,[329440]|0.3578,0.3578,[329440]|0.3456,0.3456,[329440]|0.2786,0.2786,[329440]|0.2558,0.2558,[329440]|0.2913,0.2913,[329440]|0.2602,0.2602,[329440]|0.3399,0.3399,[329440]|0.3096,0.3096,[329440]|0.3885,0.3885,[329440]|0.3717,0.3717,[329440]|0.3762,0.3762,[329440]|0.4556,0.4556,[329440]|0.363,0.363,[329440]|0.3668,0.3668,[329440]|0.3668,0.3668,[329440]|0.3359,0.3359,[329440]|0.3005,0.3005,[329440]|0.282,0.282,[329440]|0.208,0.208,[329440]|0.2602,0.2602,[329440]|0.282,0.282,[329440]|0.2602,0.2602,[329440]|0.2483,0.2483,[329440]|0.1732,0.1732,[329440]|0.1698,0.1698,[329440]|0.1998,0.1998,[329440]|0.2122,0.2122,[329440]|0.2432,0.2432,[329440]|0.2602,0.2602,[329440]|0.1878,0.1878,[329440]|0.208,0.208,[329440]|0.1532,0.1532,[329440]|0.2209,0.2209,[329440]|0.1456,0.1456,[329440]|0.1844,0.1844,[329440]|0.2255,0.2255,[329440]|0.2748,0.2748,[329440]|0.2209,0.2209,[329440]|0.2255,0.2255,[329440]|0.1878,0.1878,[329440]|0.1844,0.1844,[329440]|0.2167,0.2167,[329440]|0.2657,0.2657,[329440]|0.3005,0.3005,[329440]|0.3225,0.3225,[329440]|0.3096,0.3096,[329440]|0.2483,0.2483,[329440]|0.2483,0.2483,[329440]|0.1698,0.1698,[329440]|0.2602,0.2602,[329440]|0.1805,0.1805,[329440]|0.27,0.27,[329440]|0.1878,0.1878,[329440]|0.2786,0.2786,[329440]|0.138,0.138,[329440]|0.1205,0.1205,[329440]|0.0884,0.0884,[329440]|0.1178,0.1178,[329440]|0.1732,0.1732,[329440]|0.1292,0.1292,[329440]|0.1805,0.1805,[329440]|0.1698,0.1698,[329440]|0.1178,0.1178,[329440]|0.124,0.124,[329440]|0.1088,0.1088,[329440]|0.0858,0.0858,[329440]|0.0771,0.0771,[329440]|0.0554,0.0554,[329440]|0.0832,0.0832,[329440]|0.0677,0.0677,[329440]|0.1018,0.1018,[329440]|0.0554,0.0554,[329440]|0.0965,0.0965,[329440]|0.0965,0.0965,[329440]|0.1921,0.1921,[329440]|0.2167,0.2167,[329440]|0.2558,0.2558,[329440]|0.2602,0.2602,[329440]|0.1844,0.1844,[329440]|0.2333,0.2333,[329440]|0.2531,0.2531,[329440]|0.2657,0.2657,[329440]|0.3992,0.3992,[329440]|0.4333,0.4333,[329440]|0.3762,0.3762,[329440]|0.3992,0.3992,[329440]|0.4781,0.4781,[329440]|0.5374,0.5374,[329440]|0.4651,0.4651,[329440]|0.4203,0.4203,[329440]|0.3535,0.3535,[329440]|0.4078,0.4078,[329440]|0.3311,0.3311,[329440]|0.3096,0.3096,[329440]|0.2865,0.2865,[329440]|0.208,0.208,[329440]|0.2531,0.2531,[329440]|0.2483,0.2483,[329440]|0.3263,0.3263,[329440]|0.4078,0.4078,[329440]|0.3225,0.3225,[329440]|0.3005,0.3005,[329440]|0.2041,0.2041,[329440]|0.2255,0.2255,[329440]|0.2748,0.2748,[329440]|0.2602,0.2602,[329440]|0.208,0.208,[329440]|0.2292,0.2292,[329440]|0.3263,0.3263,[329440]|0.3885,0.3885,[329440]|0.3939,0.3939,[329440]|0.3456,0.3456,[329440]|0.4458,0.4458,[329440]|0.5173,0.5173,[329440]|0.5802,0.5802,[329440]|0.6789,0.6789,[329440]|0.6789,0.6789,[329440]|0.7275,0.7275,[329440]|0.7644,0.7644,[329440]|0.7912,0.7912,[329440]|0.8823,0.8823,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF FER_BRANA
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.1969,0.1969,[72144e]|0.2783,0.2783,[72144e]|0.3182,0.3182,[72144e]|0.384,0.384,[72144e]|0.3321,0.3321,[72144e]|0.3872,0.3872,[72144e]|0.2752,0.2752,[72144e]|0.3182,0.3182,[72144e]|0.3599,0.3599,[72144e]|0.3948,0.3948,[72144e]|0.3566,0.3566,[72144e]|0.3149,0.3149,[72144e]|0.2609,0.2609,[72144e]|0.268,0.268,[72144e]|0.3053,0.3053,[72144e]|0.3321,0.3321,[72144e]|0.3249,0.3249,[72144e]|0.4476,0.4476,[72144e]|0.5456,0.5456,[72144e]|0.5098,0.5098,[72144e]|0.4766,0.4766,[72144e]|0.384,0.384,[72144e]|0.4017,0.4017,[72144e]|0.3087,0.3087,[72144e]|0.3321,0.3321,[72144e]|0.2399,0.2399,[72144e]|0.2918,0.2918,[72144e]|0.1643,0.1643,[72144e]|0.2541,0.2541,[72144e]|0.2094,0.2094,[72144e]|0.1942,0.1942,[72144e]|0.1759,0.1759,[72144e]|0.1323,0.1323,[72144e]|0.1852,0.1852,[72144e]|0.2292,0.2292,[72144e]|0.1914,0.1914,[72144e]|0.1528,0.1528,[72144e]|0.1759,0.1759,[72144e]|0.1791,0.1791,[72144e]|0.1206,0.1206,[72144e]|0.0765,0.0765,[72144e]|0.0888,0.0888,[72144e]|0.0888,0.0888,[72144e]|0.0749,0.0749,[72144e]|0.0473,0.0473,[72144e]|0.0817,0.0817,[72144e]|0.0704,0.0704,[72144e]|0.1048,0.1048,[72144e]|0.1162,0.1162,[72144e]|0.2258,0.2258,[72144e]|0.2364,0.2364,[72144e]|0.1731,0.1731,[72144e]|0.1251,0.1251,[72144e]|0.1399,0.1399,[72144e]|0.2503,0.2503,[72144e]|0.2715,0.2715,[72144e]|0.2783,0.2783,[72144e]|0.3215,0.3215,[72144e]|0.3215,0.3215,[72144e]|0.346,0.346,[72144e]|0.3667,0.3667,[72144e]|0.3249,0.3249,[72144e]|0.3249,0.3249,[72144e]|0.2645,0.2645,[72144e]|0.268,0.268,[72144e]|0.2541,0.2541,[72144e]|0.2817,0.2817,[72144e]|0.2399,0.2399,[72144e]|0.1702,0.1702,[72144e]|0.2034,0.2034,[72144e]|0.1914,0.1914,[72144e]|0.1643,0.1643,[72144e]|0.1823,0.1823,[72144e]|0.2164,0.2164,[72144e]|0.2849,0.2849,[72144e]|0.2002,0.2002,[72144e]|0.2064,0.2064,[72144e]|0.1942,0.1942,[72144e]|0.1823,0.1823,[72144e]|0.2224,0.2224,[72144e]|0.2752,0.2752,[72144e]|0.2752,0.2752,[72144e]|0.2988,0.2988,[72144e]|0.3249,0.3249,[72144e]|0.3249,0.3249,[72144e]|0.3872,0.3872,[72144e]|0.3667,0.3667,[72144e]|0.4685,0.4685,[72144e]|0.4864,0.4864,[72144e]|0.5017,0.5017,[72144e]|0.5951,0.5951,[72144e]|0.5296,0.5296,[72144e]|0.5055,0.5055,[72144e]|0.494,0.494,[72144e]|0.4441,0.4441,[72144e]|0.5254,0.5254,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.7605,0.7605,[329440]|0.7458,0.7458,[329440]|0.7079,0.7079,[329440]|0.6906,0.6906,[329440]|0.6557,0.6557,[329440]|0.6412,0.6412,[329440]|0.5374,0.5374,[329440]|0.5173,0.5173,[329440]|0.3806,0.3806,[329440]|0.3578,0.3578,[329440]|0.3311,0.3311,[329440]|0.3885,0.3885,[329440]|0.3456,0.3456,[329440]|0.3456,0.3456,[329440]|0.3225,0.3225,[329440]|0.3225,0.3225,[329440]|0.3806,0.3806,[329440]|0.4116,0.4116,[329440]|0.4379,0.4379,[329440]|0.4651,0.4651,[329440]|0.4458,0.4458,[329440]|0.3806,0.3806,[329440]|0.3762,0.3762,[329440]|0.2913,0.2913,[329440]|0.3096,0.3096,[329440]|0.2167,0.2167,[329440]|0.3146,0.3146,[329440]|0.2255,0.2255,[329440]|0.3184,0.3184,[329440]|0.1698,0.1698,[329440]|0.138,0.138,[329440]|0.1018,0.1018,[329440]|0.1322,0.1322,[329440]|0.1805,0.1805,[329440]|0.1322,0.1322,[329440]|0.1805,0.1805,[329440]|0.1667,0.1667,[329440]|0.1117,0.1117,[329440]|0.115,0.115,[329440]|0.1018,0.1018,[329440]|0.0771,0.0771,[329440]|0.066,0.066,[329440]|0.0478,0.0478,[329440]|0.0677,0.0677,[329440]|0.0554,0.0554,[329440]|0.0478,0.0478,[329440]|0.0268,0.0268,[329440]|0.0441,0.0441,[329440]|0.0455,0.0455,[329440]|0.1018,0.1018,[329440]|0.124,0.124,[329440]|0.1667,0.1667,[329440]|0.1698,0.1698,[329440]|0.1088,0.1088,[329440]|0.138,0.138,[329440]|0.1532,0.1532,[329440]|0.1667,0.1667,[329440]|0.2786,0.2786,[329440]|0.3184,0.3184,[329440]|0.2602,0.2602,[329440]|0.2558,0.2558,[329440]|0.3399,0.3399,[329440]|0.4078,0.4078,[329440]|0.3263,0.3263,[329440]|0.2786,0.2786,[329440]|0.2913,0.2913,[329440]|0.3491,0.3491,[329440]|0.27,0.27,[329440]|0.2432,0.2432,[329440]|0.2209,0.2209,[329440]|0.1532,0.1532,[329440]|0.1732,0.1732,[329440]|0.1698,0.1698,[329440]|0.2483,0.2483,[329440]|0.3311,0.3311,[329440]|0.2483,0.2483,[329440]|0.2292,0.2292,[329440]|0.1495,0.1495,[329440]|0.1698,0.1698,[329440]|0.2122,0.2122,[329440]|0.2292,0.2292,[329440]|0.1805,0.1805,[329440]|0.1998,0.1998,[329440]|0.3053,0.3053,[329440]|0.3806,0.3806,[329440]|0.3939,0.3939,[329440]|0.3399,0.3399,[329440]|0.4513,0.4513,[329440]|0.5173,0.5173,[329440]|0.5846,0.5846,[329440]|0.6827,0.6827,[329440]|0.6827,0.6827,[329440]|0.7317,0.7317,[329440]|0.7688,0.7688,[329440]|0.7951,0.7951,[329440]|0.8857,0.8857,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF FER3_RAPSA
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.2224,0.2224,[72144e]|0.3053,0.3053,[72144e]|0.346,0.346,[72144e]|0.4087,0.4087,[72144e]|0.3599,0.3599,[72144e]|0.4149,0.4149,[72144e]|0.2988,0.2988,[72144e]|0.3426,0.3426,[72144e]|0.384,0.384,[72144e]|0.4186,0.4186,[72144e]|0.384,0.384,[72144e]|0.3426,0.3426,[72144e]|0.2918,0.2918,[72144e]|0.2988,0.2988,[72144e]|0.3356,0.3356,[72144e]|0.3599,0.3599,[72144e]|0.3529,0.3529,[72144e]|0.4685,0.4685,[72144e]|0.5665,0.5665,[72144e]|0.5342,0.5342,[72144e]|0.4979,0.4979,[72144e]|0.4087,0.4087,[72144e]|0.4256,0.4256,[72144e]|0.3356,0.3356,[72144e]|0.3599,0.3599,[72144e]|0.268,0.268,[72144e]|0.3182,0.3182,[72144e]|0.1881,0.1881,[72144e]|0.2849,0.2849,[72144e]|0.2399,0.2399,[72144e]|0.2224,0.2224,[72144e]|0.2034,0.2034,[72144e]|0.1528,0.1528,[72144e]|0.2094,0.2094,[72144e]|0.2575,0.2575,[72144e]|0.2129,0.2129,[72144e]|0.1759,0.1759,[72144e]|0.1969,0.1969,[72144e]|0.2034,0.2034,[72144e]|0.1424,0.1424,[72144e]|0.0929,0.0929,[72144e]|0.107,0.107,[72144e]|0.107,0.107,[72144e]|0.1501,0.1501,[72144e]|0.1028,0.1028,[72144e]|0.1611,0.1611,[72144e]|0.1399,0.1399,[72144e]|0.1942,0.1942,[72144e]|0.2129,0.2129,[72144e]|0.3249,0.3249,[72144e]|0.3321,0.3321,[72144e]|0.2715,0.2715,[72144e]|0.2094,0.2094,[72144e]|0.2258,0.2258,[72144e]|0.3529,0.3529,[72144e]|0.374,0.374,[72144e]|0.3807,0.3807,[72144e]|0.4256,0.4256,[72144e]|0.4256,0.4256,[72144e]|0.4507,0.4507,[72144e]|0.4685,0.4685,[72144e]|0.4256,0.4256,[72144e]|0.4292,0.4292,[72144e]|0.3667,0.3667,[72144e]|0.3704,0.3704,[72144e]|0.2645,0.2645,[72144e]|0.2918,0.2918,[72144e]|0.2503,0.2503,[72144e]|0.1823,0.1823,[72144e]|0.2129,0.2129,[72144e]|0.2002,0.2002,[72144e]|0.1914,0.1914,[72144e]|0.2094,0.2094,[72144e]|0.247,0.247,[72144e]|0.3117,0.3117,[72144e]|0.2292,0.2292,[72144e]|0.2328,0.2328,[72144e]|0.2193,0.2193,[72144e]|0.2064,0.2064,[72144e]|0.2609,0.2609,[72144e]|0.3087,0.3087,[72144e]|0.3087,0.3087,[72144e]|0.3286,0.3286,[72144e]|0.3983,0.3983,[72144e]|0.3948,0.3948,[72144e]|0.4541,0.4541,[72144e]|0.4369,0.4369,[72144e]|0.5533,0.5533,[72144e]|0.5758,0.5758,[72144e]|0.5992,0.5992,[72144e]|0.708,0.708,[72144e]|0.6375,0.6375,[72144e]|0.6227,0.6227,[72144e]|0.6136,0.6136,[72144e]|0.5577,0.5577,[72144e]|0.6661,0.6661,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.7605,0.7605,[329440]|0.7458,0.7458,[329440]|0.7079,0.7079,[329440]|0.6906,0.6906,[329440]|0.6557,0.6557,[329440]|0.6412,0.6412,[329440]|0.5374,0.5374,[329440]|0.5173,0.5173,[329440]|0.3806,0.3806,[329440]|0.3578,0.3578,[329440]|0.3311,0.3311,[329440]|0.3885,0.3885,[329440]|0.3456,0.3456,[329440]|0.3456,0.3456,[329440]|0.3225,0.3225,[329440]|0.3225,0.3225,[329440]|0.3806,0.3806,[329440]|0.4116,0.4116,[329440]|0.4379,0.4379,[329440]|0.4651,0.4651,[329440]|0.4458,0.4458,[329440]|0.3806,0.3806,[329440]|0.3806,0.3806,[329440]|0.2963,0.2963,[329440]|0.3184,0.3184,[329440]|0.2292,0.2292,[329440]|0.3225,0.3225,[329440]|0.2385,0.2385,[329440]|0.3359,0.3359,[329440]|0.1844,0.1844,[329440]|0.1566,0.1566,[329440]|0.115,0.115,[329440]|0.1495,0.1495,[329440]|0.2041,0.2041,[329440]|0.1532,0.1532,[329440]|0.2041,0.2041,[329440]|0.1878,0.1878,[329440]|0.1322,0.1322,[329440]|0.1349,0.1349,[329440]|0.1205,0.1205,[329440]|0.0965,0.0965,[329440]|0.0832,0.0832,[329440]|0.0607,0.0607,[329440]|0.0858,0.0858,[329440]|0.0701,0.0701,[329440]|0.1018,0.1018,[329440]|0.0554,0.0554,[329440]|0.0909,0.0909,[329440]|0.0909,0.0909,[329440]|0.1844,0.1844,[329440]|0.208,0.208,[329440]|0.2483,0.2483,[329440]|0.2531,0.2531,[329440]|0.1732,0.1732,[329440]|0.2167,0.2167,[329440]|0.2333,0.2333,[329440]|0.2483,0.2483,[329440]|0.3717,0.3717,[329440]|0.4078,0.4078,[329440]|0.3535,0.3535,[329440]|0.3456,0.3456,[329440]|0.4282,0.4282,[329440]|0.4879,0.4879,[329440]|0.4116,0.4116,[329440]|0.3668,0.3668,[329440]|0.3005,0.3005,[329440]|0.3578,0.3578,[329440]|0.282,0.282,[329440]|0.2558,0.2558,[329440]|0.2385,0.2385,[329440]|0.1667,0.1667,[329440]|0.2041,0.2041,[329440]|0.1998,0.1998,[329440]|0.282,0.282,[329440]|0.363,0.363,[329440]|0.282,0.282,[329440]|0.2602,0.2602,[329440]|0.1766,0.1766,[329440]|0.1998,0.1998,[329440]|0.2483,0.2483,[329440]|0.2657,0.2657,[329440]|0.2255,0.2255,[329440]|0.2531,0.2531,[329440]|0.3491,0.3491,[329440]|0.4116,0.4116,[329440]|0.4458,0.4458,[329440]|0.3992,0.3992,[329440]|0.5008,0.5008,[329440]|0.5623,0.5623,[329440]|0.6293,0.6293,[329440]|0.7275,0.7275,[329440]|0.7275,0.7275,[329440]|0.7724,0.7724,[329440]|0.8118,0.8118,[329440]|0.8391,0.8391,[329440]|0.9141,0.9141,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF FER1_MAIZE
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.422,0.422,[72144e]|0.2918,0.2918,[72144e]|0.1852,0.1852,[72144e]|0.1115,0.1115,[72144e]|0.1373,0.1373,[72144e]|0.1643,0.1643,[72144e]|0.1914,0.1914,[72144e]|0.2193,0.2193,[72144e]|0.1731,0.1731,[72144e]|0.2002,0.2002,[72144e]|0.1969,0.1969,[72144e]|0.1969,0.1969,[72144e]|0.2575,0.2575,[72144e]|0.2193,0.2193,[72144e]|0.3087,0.3087,[72144e]|0.384,0.384,[72144e]|0.3566,0.3566,[72144e]|0.3019,0.3019,[72144e]|0.2436,0.2436,[72144e]|0.1731,0.1731,[72144e]|0.2292,0.2292,[72144e]|0.1759,0.1759,[72144e]|0.1759,0.1759,[72144e]|0.2575,0.2575,[72144e]|0.2918,0.2918,[72144e]|0.384,0.384,[72144e]|0.3117,0.3117,[72144e]|0.2817,0.2817,[72144e]|0.2849,0.2849,[72144e]|0.2849,0.2849,[72144e]|0.3529,0.3529,[72144e]|0.3215,0.3215,[72144e]|0.3494,0.3494,[72144e]|0.374,0.374,[72144e]|0.3426,0.3426,[72144e]|0.374,0.374,[72144e]|0.3426,0.3426,[72144e]|0.268,0.268,[72144e]|0.2951,0.2951,[72144e]|0.3249,0.3249,[72144e]|0.3631,0.3631,[72144e]|0.4087,0.4087,[72144e]|0.384,0.384,[72144e]|0.3321,0.3321,[72144e]|0.3704,0.3704,[72144e]|0.3215,0.3215,[72144e]|0.3704,0.3704,[72144e]|0.3019,0.3019,[72144e]|0.3053,0.3053,[72144e]|0.3392,0.3392,[72144e]|0.3704,0.3704,[72144e]|0.3872,0.3872,[72144e]|0.391,0.391,[72144e]|0.4409,0.4409,[72144e]|0.3872,0.3872,[72144e]|0.4087,0.4087,[72144e]|0.3392,0.3392,[72144e]|0.3494,0.3494,[72144e]|0.2951,0.2951,[72144e]|0.3948,0.3948,[72144e]|0.4119,0.4119,[72144e]|0.4582,0.4582,[72144e]|0.391,0.391,[72144e]|0.3426,0.3426,[72144e]|0.2645,0.2645,[72144e]|0.2783,0.2783,[72144e]|0.2849,0.2849,[72144e]|0.3494,0.3494,[72144e]|0.3286,0.3286,[72144e]|0.4149,0.4149,[72144e]|0.5139,0.5139,[72144e]|0.5296,0.5296,[72144e]|0.494,0.494,[72144e]|0.3983,0.3983,[72144e]|0.4119,0.4119,[72144e]|0.3215,0.3215,[72144e]|0.4087,0.4087,[72144e]|0.3087,0.3087,[72144e]|0.3774,0.3774,[72144e]|0.2817,0.2817,[72144e]|0.3356,0.3356,[72144e]|0.2817,0.2817,[72144e]|0.2645,0.2645,[72144e]|0.247,0.247,[72144e]|0.2164,0.2164,[72144e]|0.2918,0.2918,[72144e]|0.3631,0.3631,[72144e]|0.346,0.346,[72144e]|0.3019,0.3019,[72144e]|0.2951,0.2951,[72144e]|0.3117,0.3117,[72144e]|0.2399,0.2399,[72144e]|0.1702,0.1702,[72144e]|0.1554,0.1554,[72144e]|0.1554,0.1554,[72144e]|0.2193,0.2193,[72144e]|0.1554,0.1554,[72144e]|0.2364,0.2364,[72144e]|0.2129,0.2129,[72144e]|0.2918,0.2918,[72144e]|0.3087,0.3087,[72144e]|0.4017,0.4017,[72144e]|0.4017,0.4017,[72144e]|0.3566,0.3566,[72144e]|0.2884,0.2884,[72144e]|0.3087,0.3087,[72144e]|0.4119,0.4119,[72144e]|0.4119,0.4119,[72144e]|0.422,0.422,[72144e]|0.4369,0.4369,[72144e]|0.4409,0.4409,[72144e]|0.4541,0.4541,[72144e]|0.4619,0.4619,[72144e]|0.4409,0.4409,[72144e]|0.4441,0.4441,[72144e]|0.374,0.374,[72144e]|0.3774,0.3774,[72144e]|0.2918,0.2918,[72144e]|0.3494,0.3494,[72144e]|0.3087,0.3087,[72144e]|0.2328,0.2328,[72144e]|0.268,0.268,[72144e]|0.2541,0.2541,[72144e]|0.247,0.247,[72144e]|0.2645,0.2645,[72144e]|0.2849,0.2849,[72144e]|0.3053,0.3053,[72144e]|0.2193,0.2193,[72144e]|0.2224,0.2224,[72144e]|0.2224,0.2224,[72144e]|0.2164,0.2164,[72144e]|0.2752,0.2752,[72144e]|0.3149,0.3149,[72144e]|0.3149,0.3149,[72144e]|0.3356,0.3356,[72144e]|0.346,0.346,[72144e]|0.4017,0.4017,[72144e]|0.4685,0.4685,[72144e]|0.4409,0.4409,[72144e]|0.5296,0.5296,[72144e]|0.5139,0.5139,[72144e]|0.5296,0.5296,[72144e]|0.6136,0.6136,[72144e]|0.5493,0.5493,[72144e]|0.5296,0.5296,[72144e]|0.5139,0.5139,[72144e]|0.4685,0.4685,[72144e]|0.5342,0.5342,[72144e]|0.6136,0.6136,[72144e]|0.7547,0.7547,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.865,0.865,[329440]|0.8488,0.8488,[329440]|0.7724,0.7724,[329440]|0.6557,0.6557,[329440]|0.5253,0.5253,[329440]|0.3847,0.3847,[329440]|0.3399,0.3399,[329440]|0.2913,0.2913,[329440]|0.2432,0.2432,[329440]|0.1958,0.1958,[329440]|0.106,0.106,[329440]|0.1456,0.1456,[329440]|0.1456,0.1456,[329440]|0.115,0.115,[329440]|0.1844,0.1844,[329440]|0.2122,0.2122,[329440]|0.2333,0.2333,[329440]|0.2531,0.2531,[329440]|0.1998,0.1998,[329440]|0.1322,0.1322,[329440]|0.1456,0.1456,[329440]|0.0858,0.0858,[329440]|0.1266,0.1266,[329440]|0.1667,0.1667,[329440]|0.2122,0.2122,[329440]|0.3225,0.3225,[329440]|0.2483,0.2483,[329440]|0.2483,0.2483,[329440]|0.1766,0.1766,[329440]|0.1602,0.1602,[329440]|0.2255,0.2255,[329440]|0.2209,0.2209,[329440]|0.2558,0.2558,[329440]|0.2657,0.2657,[329440]|0.2432,0.2432,[329440]|0.2865,0.2865,[329440]|0.27,0.27,[329440]|0.2748,0.2748,[329440]|0.3146,0.3146,[329440]|0.3184,0.3184,[329440]|0.3491,0.3491,[329440]|0.3847,0.3847,[329440]|0.3668,0.3668,[329440]|0.363,0.363,[329440]|0.4037,0.4037,[329440]|0.3184,0.3184,[329440]|0.4037,0.4037,[329440]|0.3359,0.3359,[329440]|0.4116,0.4116,[329440]|0.3717,0.3717,[329440]|0.3005,0.3005,[329440]|0.2865,0.2865,[329440]|0.3263,0.3263,[329440]|0.3668,0.3668,[329440]|0.3717,0.3717,[329440]|0.3806,0.3806,[329440]|0.3053,0.3053,[329440]|0.3146,0.3146,[329440]|0.2292,0.2292,[329440]|0.3096,0.3096,[329440]|0.2432,0.2432,[329440]|0.3146,0.3146,[329440]|0.3225,0.3225,[329440]|0.3806,0.3806,[329440]|0.3184,0.3184,[329440]|0.3311,0.3311,[329440]|0.2657,0.2657,[329440]|0.2657,0.2657,[329440]|0.2913,0.2913,[329440]|0.3578,0.3578,[329440]|0.3939,0.3939,[329440]|0.4116,0.4116,[329440]|0.3885,0.3885,[329440]|0.4037,0.4037,[329440]|0.3939,0.3939,[329440]|0.3184,0.3184,[329440]|0.4116,0.4116,[329440]|0.3263,0.3263,[329440]|0.4379,0.4379,[329440]|0.363,0.363,[329440]|0.4282,0.4282,[329440]|0.2865,0.2865,[329440]|0.2602,0.2602,[329440]|0.2041,0.2041,[329440]|0.2558,0.2558,[329440]|0.3225,0.3225,[329440]|0.2748,0.2748,[329440]|0.3399,0.3399,[329440]|0.3225,0.3225,[329440]|0.2122,0.2122,[329440]|0.2209,0.2209,[329440]|0.1998,0.1998,[329440]|0.1698,0.1698,[329440]|0.1178,0.1178,[329440]|0.0909,0.0909,[329440]|0.1292,0.1292,[329440]|0.106,0.106,[329440]|0.1532,0.1532,[329440]|0.0935,0.0935,[329440]|0.138,0.138,[329440]|0.138,0.138,[329440]|0.2292,0.2292,[329440]|0.2531,0.2531,[329440]|0.2865,0.2865,[329440]|0.2865,0.2865,[329440]|0.2122,0.2122,[329440]|0.2558,0.2558,[329440]|0.27,0.27,[329440]|0.2786,0.2786,[329440]|0.3847,0.3847,[329440]|0.4203,0.4203,[329440]|0.363,0.363,[329440]|0.3535,0.3535,[329440]|0.4149,0.4149,[329440]|0.4703,0.4703,[329440]|0.3939,0.3939,[329440]|0.3535,0.3535,[329440]|0.2865,0.2865,[329440]|0.3359,0.3359,[329440]|0.2602,0.2602,[329440]|0.2558,0.2558,[329440]|0.2333,0.2333,[329440]|0.1635,0.1635,[329440]|0.1958,0.1958,[329440]|0.1878,0.1878,[329440]|0.2657,0.2657,[329440]|0.3456,0.3456,[329440]|0.2748,0.2748,[329440]|0.2167,0.2167,[329440]|0.1602,0.1602,[329440]|0.1766,0.1766,[329440]|0.2255,0.2255,[329440]|0.2333,0.2333,[329440]|0.1998,0.1998,[329440]|0.2209,0.2209,[329440]|0.3184,0.3184,[329440]|0.3847,0.3847,[329440]|0.3847,0.3847,[329440]|0.3847,0.3847,[329440]|0.4513,0.4513,[329440]|0.4282,0.4282,[329440]|0.4967,0.4967,[329440]|0.6079,0.6079,[329440]|0.6124,0.6124,[329440]|0.6604,0.6604,[329440]|0.6944,0.6944,[329440]|0.7232,0.7232,[329440]|0.8118,0.8118,[329440]|0.8857,0.8857,[329440]|0.9491,0.9491,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF O80429_MAIZE
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.1007,0.1007,[72144e]|0.1028,0.1028,[72144e]|0.1731,0.1731,[72144e]|0.2503,0.2503,[72144e]|0.3249,0.3249,[72144e]|0.2292,0.2292,[72144e]|0.1476,0.1476,[72144e]|0.1731,0.1731,[72144e]|0.1942,0.1942,[72144e]|0.2503,0.2503,[72144e]|0.1969,0.1969,[72144e]|0.2258,0.2258,[72144e]|0.1823,0.1823,[72144e]|0.2094,0.2094,[72144e]|0.1501,0.1501,[72144e]|0.1501,0.1501,[72144e]|0.1611,0.1611,[72144e]|0.1399,0.1399,[72144e]|0.1554,0.1554,[72144e]|0.1823,0.1823,[72144e]|0.1881,0.1881,[72144e]|0.2258,0.2258,[72144e]|0.1969,0.1969,[72144e]|0.2541,0.2541,[72144e]|0.1942,0.1942,[72144e]|0.1671,0.1671,[72144e]|0.1399,0.1399,[72144e]|0.2292,0.2292,[72144e]|0.2575,0.2575,[72144e]|0.1881,0.1881,[72144e]|0.1881,0.1881,[72144e]|0.1399,0.1399,[72144e]|0.2129,0.2129,[72144e]|0.1852,0.1852,[72144e]|0.2645,0.2645,[72144e]|0.1852,0.1852,[72144e]|0.2503,0.2503,[72144e]|0.2193,0.2193,[72144e]|0.2752,0.2752,[72144e]|0.2292,0.2292,[72144e]|0.1611,0.1611,[72144e]|0.1424,0.1424,[72144e]|0.2364,0.2364,[72144e]|0.2884,0.2884,[72144e]|0.3182,0.3182,[72144e]|0.3087,0.3087,[72144e]|0.2783,0.2783,[72144e]|0.2988,0.2988,[72144e]|0.2224,0.2224,[72144e]|0.2224,0.2224,[72144e]|0.2364,0.2364,[72144e]|0.3392,0.3392,[72144e]|0.3566,0.3566,[72144e]|0.4051,0.4051,[72144e]|0.3356,0.3356,[72144e]|0.2817,0.2817,[72144e]|0.1969,0.1969,[72144e]|0.2094,0.2094,[72144e]|0.2164,0.2164,[72144e]|0.1791,0.1791,[72144e]|0.1583,0.1583,[72144e]|0.2436,0.2436,[72144e]|0.3426,0.3426,[72144e]|0.3566,0.3566,[72144e]|0.3286,0.3286,[72144e]|0.2258,0.2258,[72144e]|0.2436,0.2436,[72144e]|0.1554,0.1554,[72144e]|0.2364,0.2364,[72144e]|0.1298,0.1298,[72144e]|0.1914,0.1914,[72144e]|0.1115,0.1115,[72144e]|0.1528,0.1528,[72144e]|0.1115,0.1115,[72144e]|0.1007,0.1007,[72144e]|0.0909,0.0909,[72144e]|0.0734,0.0734,[72144e]|0.1206,0.1206,[72144e]|0.1823,0.1823,[72144e]|0.1643,0.1643,[72144e]|0.1298,0.1298,[72144e]|0.2164,0.2164,[72144e]|0.2399,0.2399,[72144e]|0.1671,0.1671,[72144e]|0.1092,0.1092,[72144e]|0.0948,0.0948,[72144e]|0.0948,0.0948,[72144e]|0.1501,0.1501,[72144e]|0.0967,0.0967,[72144e]|0.1611,0.1611,[72144e]|0.1424,0.1424,[72144e]|0.2328,0.2328,[72144e]|0.2503,0.2503,[72144e]|0.3529,0.3529,[72144e]|0.3494,0.3494,[72144e]|0.2817,0.2817,[72144e]|0.2064,0.2064,[72144e]|0.2193,0.2193,[72144e]|0.3286,0.3286,[72144e]|0.3392,0.3392,[72144e]|0.3494,0.3494,[72144e]|0.384,0.384,[72144e]|0.3872,0.3872,[72144e]|0.4017,0.4017,[72144e]|0.4087,0.4087,[72144e]|0.3807,0.3807,[72144e]|0.384,0.384,[72144e]|0.3117,0.3117,[72144e]|0.3182,0.3182,[72144e]|0.2328,0.2328,[72144e]|0.268,0.268,[72144e]|0.2258,0.2258,[72144e]|0.1501,0.1501,[72144e]|0.1791,0.1791,[72144e]|0.1702,0.1702,[72144e]|0.1611,0.1611,[72144e]|0.1791,0.1791,[72144e]|0.2164,0.2164,[72144e]|0.2328,0.2328,[72144e]|0.1554,0.1554,[72144e]|0.1583,0.1583,[72144e]|0.1528,0.1528,[72144e]|0.1424,0.1424,[72144e]|0.1823,0.1823,[72144e]|0.2224,0.2224,[72144e]|0.2224,0.2224,[72144e]|0.2436,0.2436,[72144e]|0.2541,0.2541,[72144e]|0.2399,0.2399,[72144e]|0.3087,0.3087,[72144e]|0.2817,0.2817,[72144e]|0.3566,0.3566,[72144e]|0.3667,0.3667,[72144e]|0.3774,0.3774,[72144e]|0.4541,0.4541,[72144e]|0.391,0.391,[72144e]|0.3599,0.3599,[72144e]|0.3356,0.3356,[72144e]|0.2783,0.2783,[72144e]|0.3426,0.3426,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.7573,0.7573,[329440]|0.6516,0.6516,[329440]|0.6293,0.6293,[329440]|0.5412,0.5412,[329440]|0.5229,0.5229,[329440]|0.5008,0.5008,[329440]|0.4825,0.4825,[329440]|0.3806,0.3806,[329440]|0.2292,0.2292,[329440]|0.1921,0.1921,[329440]|0.1602,0.1602,[329440]|0.208,0.208,[329440]|0.1667,0.1667,[329440]|0.2167,0.2167,[329440]|0.1416,0.1416,[329440]|0.1878,0.1878,[329440]|0.1921,0.1921,[329440]|0.1635,0.1635,[329440]|0.1322,0.1322,[329440]|0.1088,0.1088,[329440]|0.1805,0.1805,[329440]|0.2748,0.2748,[329440]|0.1805,0.1805,[329440]|0.1921,0.1921,[329440]|0.1495,0.1495,[329440]|0.1495,0.1495,[329440]|0.1088,0.1088,[329440]|0.1532,0.1532,[329440]|0.2531,0.2531,[329440]|0.2531,0.2531,[329440]|0.1805,0.1805,[329440]|0.106,0.106,[329440]|0.1667,0.1667,[329440]|0.1292,0.1292,[329440]|0.1998,0.1998,[329440]|0.1566,0.1566,[329440]|0.2292,0.2292,[329440]|0.1844,0.1844,[329440]|0.27,0.27,[329440]|0.2255,0.2255,[329440]|0.2041,0.2041,[329440]|0.124,0.124,[329440]|0.1205,0.1205,[329440]|0.1416,0.1416,[329440]|0.1998,0.1998,[329440]|0.1958,0.1958,[329440]|0.2292,0.2292,[329440]|0.2483,0.2483,[329440]|0.1732,0.1732,[329440]|0.1805,0.1805,[329440]|0.1667,0.1667,[329440]|0.2432,0.2432,[329440]|0.1732,0.1732,[329440]|0.2385,0.2385,[329440]|0.2531,0.2531,[329440]|0.3096,0.3096,[329440]|0.2385,0.2385,[329440]|0.2531,0.2531,[329440]|0.1844,0.1844,[329440]|0.1921,0.1921,[329440]|0.2167,0.2167,[329440]|0.208,0.208,[329440]|0.2558,0.2558,[329440]|0.27,0.27,[329440]|0.2558,0.2558,[329440]|0.2558,0.2558,[329440]|0.2531,0.2531,[329440]|0.1732,0.1732,[329440]|0.27,0.27,[329440]|0.1844,0.1844,[329440]|0.3005,0.3005,[329440]|0.208,0.208,[329440]|0.282,0.282,[329440]|0.1456,0.1456,[329440]|0.124,0.124,[329440]|0.0884,0.0884,[329440]|0.1292,0.1292,[329440]|0.1805,0.1805,[329440]|0.1416,0.1416,[329440]|0.1998,0.1998,[329440]|0.1844,0.1844,[329440]|0.1635,0.1635,[329440]|0.1667,0.1667,[329440]|0.1532,0.1532,[329440]|0.124,0.124,[329440]|0.0789,0.0789,[329440]|0.0554,0.0554,[329440]|0.0858,0.0858,[329440]|0.0701,0.0701,[329440]|0.106,0.106,[329440]|0.0587,0.0587,[329440]|0.1088,0.1088,[329440]|0.1088,0.1088,[329440]|0.1878,0.1878,[329440]|0.2122,0.2122,[329440]|0.2483,0.2483,[329440]|0.2432,0.2432,[329440]|0.1667,0.1667,[329440]|0.208,0.208,[329440]|0.2041,0.2041,[329440]|0.2209,0.2209,[329440]|0.3311,0.3311,[329440]|0.3668,0.3668,[329440]|0.3184,0.3184,[329440]|0.3096,0.3096,[329440]|0.3762,0.3762,[329440]|0.4282,0.4282,[329440]|0.3578,0.3578,[329440]|0.3096,0.3096,[329440]|0.2385,0.2385,[329440]|0.2865,0.2865,[329440]|0.2167,0.2167,[329440]|0.1878,0.1878,[329440]|0.1732,0.1732,[329440]|0.115,0.115,[329440]|0.1416,0.1416,[329440]|0.1349,0.1349,[329440]|0.208,0.208,[329440]|0.2865,0.2865,[329440]|0.2255,0.2255,[329440]|0.1667,0.1667,[329440]|0.106,0.106,[329440]|0.1205,0.1205,[329440]|0.1456,0.1456,[329440]|0.1495,0.1495,[329440]|0.1266,0.1266,[329440]|0.1416,0.1416,[329440]|0.208,0.208,[329440]|0.27,0.27,[329440]|0.27,0.27,[329440]|0.208,0.208,[329440]|0.3146,0.3146,[329440]|0.3806,0.3806,[329440]|0.4513,0.4513,[329440]|0.5623,0.5623,[329440]|0.5623,0.5623,[329440]|0.6219,0.6219,[329440]|0.6604,0.6604,[329440]|0.6906,0.6906,[329440]|0.7817,0.7817,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF Q7XA98_TRIPR
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.2292,0.2292,[72144e]|0.2645,0.2645,[72144e]|0.3019,0.3019,[72144e]|0.3286,0.3286,[72144e]|0.2328,0.2328,[72144e]|0.2258,0.2258,[72144e]|0.2645,0.2645,[72144e]|0.2988,0.2988,[72144e]|0.3286,0.3286,[72144e]|0.3774,0.3774,[72144e]|0.346,0.346,[72144e]|0.4051,0.4051,[72144e]|0.4051,0.4051,[72144e]|0.4017,0.4017,[72144e]|0.3494,0.3494,[72144e]|0.2988,0.2988,[72144e]|0.3286,0.3286,[72144e]|0.3948,0.3948,[72144e]|0.4864,0.4864,[72144e]|0.494,0.494,[72144e]|0.494,0.494,[72144e]|0.5139,0.5139,[72144e]|0.5419,0.5419,[72144e]|0.4441,0.4441,[72144e]|0.4685,0.4685,[72144e]|0.4685,0.4685,[72144e]|0.5707,0.5707,[72144e]|0.4901,0.4901,[72144e]|0.4831,0.4831,[72144e]|0.4087,0.4087,[72144e]|0.3872,0.3872,[72144e]|0.3566,0.3566,[72144e]|0.3566,0.3566,[72144e]|0.3215,0.3215,[72144e]|0.3566,0.3566,[72144e]|0.346,0.346,[72144e]|0.3983,0.3983,[72144e]|0.4256,0.4256,[72144e]|0.4369,0.4369,[72144e]|0.3667,0.3667,[72144e]|0.3392,0.3392,[72144e]|0.2884,0.2884,[72144e]|0.2609,0.2609,[72144e]|0.2436,0.2436,[72144e]|0.2436,0.2436,[72144e]|0.3392,0.3392,[72144e]|0.2328,0.2328,[72144e]|0.2258,0.2258,[72144e]|0.1791,0.1791,[72144e]|0.2575,0.2575,[72144e]|0.1969,0.1969,[72144e]|0.1969,0.1969,[72144e]|0.2094,0.2094,[72144e]|0.2399,0.2399,[72144e]|0.3149,0.3149,[72144e]|0.3182,0.3182,[72144e]|0.3426,0.3426,[72144e]|0.3599,0.3599,[72144e]|0.3807,0.3807,[72144e]|0.2884,0.2884,[72144e]|0.2884,0.2884,[72144e]|0.2609,0.2609,[72144e]|0.3149,0.3149,[72144e]|0.3774,0.3774,[72144e]|0.4119,0.4119,[72144e]|0.391,0.391,[72144e]|0.3356,0.3356,[72144e]|0.268,0.268,[72144e]|0.2849,0.2849,[72144e]|0.3117,0.3117,[72144e]|0.3599,0.3599,[72144e]|0.346,0.346,[72144e]|0.4292,0.4292,[72144e]|0.5254,0.5254,[72144e]|0.4652,0.4652,[72144e]|0.4369,0.4369,[72144e]|0.346,0.346,[72144e]|0.3704,0.3704,[72144e]|0.2783,0.2783,[72144e]|0.2988,0.2988,[72144e]|0.1969,0.1969,[72144e]|0.2849,0.2849,[72144e]|0.1852,0.1852,[72144e]|0.2752,0.2752,[72144e]|0.2193,0.2193,[72144e]|0.2064,0.2064,[72144e]|0.1942,0.1942,[72144e]|0.1583,0.1583,[72144e]|0.2258,0.2258,[72144e]|0.2918,0.2918,[72144e]|0.2609,0.2609,[72144e]|0.2224,0.2224,[72144e]|0.2258,0.2258,[72144e]|0.2399,0.2399,[72144e]|0.1731,0.1731,[72144e]|0.1184,0.1184,[72144e]|0.1611,0.1611,[72144e]|0.1611,0.1611,[72144e]|0.2292,0.2292,[72144e]|0.1643,0.1643,[72144e]|0.2292,0.2292,[72144e]|0.2064,0.2064,[72144e]|0.3053,0.3053,[72144e]|0.3215,0.3215,[72144e]|0.4149,0.4149,[72144e]|0.4119,0.4119,[72144e]|0.3494,0.3494,[72144e]|0.2884,0.2884,[72144e]|0.3053,0.3053,[72144e]|0.4087,0.4087,[72144e]|0.433,0.433,[72144e]|0.4409,0.4409,[72144e]|0.4685,0.4685,[72144e]|0.5176,0.5176,[72144e]|0.5139,0.5139,[72144e]|0.5296,0.5296,[72144e]|0.5098,0.5098,[72144e]|0.5098,0.5098,[72144e]|0.433,0.433,[72144e]|0.4369,0.4369,[72144e]|0.3249,0.3249,[72144e]|0.3249,0.3249,[72144e]|0.2951,0.2951,[72144e]|0.1969,0.1969,[72144e]|0.2064,0.2064,[72144e]|0.2002,0.2002,[72144e]|0.1942,0.1942,[72144e]|0.2094,0.2094,[72144e]|0.2436,0.2436,[72144e]|0.3087,0.3087,[72144e]|0.2258,0.2258,[72144e]|0.2328,0.2328,[72144e]|0.2164,0.2164,[72144e]|0.2034,0.2034,[72144e]|0.2541,0.2541,[72144e]|0.2575,0.2575,[72144e]|0.2783,0.2783,[72144e]|0.3019,0.3019,[72144e]|0.3019,0.3019,[72144e]|0.3529,0.3529,[72144e]|0.3948,0.3948,[72144e]|0.384,0.384,[72144e]|0.4766,0.4766,[72144e]|0.5254,0.5254,[72144e]|0.5419,0.5419,[72144e]|0.6755,0.6755,[72144e]|0.6136,0.6136,[72144e]|0.5901,0.5901,[72144e]|0.5807,0.5807,[72144e]|0.5382,0.5382,[72144e]|0.6322,0.6322,[72144e]|0.6089,0.6089,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.892,0.892,[329440]|0.835,0.835,[329440]|0.7388,0.7388,[329440]|0.6944,0.6944,[329440]|0.6557,0.6557,[329440]|0.6124,0.6124,[329440]|0.4967,0.4967,[329440]|0.4149,0.4149,[329440]|0.3939,0.3939,[329440]|0.3717,0.3717,[329440]|0.3359,0.3359,[329440]|0.3939,0.3939,[329440]|0.363,0.363,[329440]|0.3847,0.3847,[329440]|0.3535,0.3535,[329440]|0.3311,0.3311,[329440]|0.3053,0.3053,[329440]|0.3225,0.3225,[329440]|0.3992,0.3992,[329440]|0.3939,0.3939,[329440]|0.3939,0.3939,[329440]|0.4203,0.4203,[329440]|0.4781,0.4781,[329440]|0.4825,0.4825,[329440]|0.4513,0.4513,[329440]|0.363,0.363,[329440]|0.4651,0.4651,[329440]|0.4967,0.4967,[329440]|0.4749,0.4749,[329440]|0.3535,0.3535,[329440]|0.3456,0.3456,[329440]|0.2558,0.2558,[329440]|0.3225,0.3225,[329440]|0.2963,0.2963,[329440]|0.2602,0.2602,[329440]|0.2657,0.2657,[329440]|0.3184,0.3184,[329440]|0.3359,0.3359,[329440]|0.3491,0.3491,[329440]|0.3491,0.3491,[329440]|0.3578,0.3578,[329440]|0.3096,0.3096,[329440]|0.2865,0.2865,[329440]|0.2292,0.2292,[329440]|0.2292,0.2292,[329440]|0.2865,0.2865,[329440]|0.2292,0.2292,[329440]|0.2255,0.2255,[329440]|0.1566,0.1566,[329440]|0.2333,0.2333,[329440]|0.1766,0.1766,[329440]|0.2209,0.2209,[329440]|0.1602,0.1602,[329440]|0.1088,0.1088,[329440]|0.1495,0.1495,[329440]|0.1766,0.1766,[329440]|0.1921,0.1921,[329440]|0.1998,0.1998,[329440]|0.2122,0.2122,[329440]|0.2255,0.2255,[329440]|0.2385,0.2385,[329440]|0.2041,0.2041,[329440]|0.2483,0.2483,[329440]|0.2122,0.2122,[329440]|0.27,0.27,[329440]|0.3225,0.3225,[329440]|0.3762,0.3762,[329440]|0.3225,0.3225,[329440]|0.3311,0.3311,[329440]|0.2865,0.2865,[329440]|0.282,0.282,[329440]|0.3184,0.3184,[329440]|0.3668,0.3668,[329440]|0.4037,0.4037,[329440]|0.4245,0.4245,[329440]|0.4116,0.4116,[329440]|0.3359,0.3359,[329440]|0.3311,0.3311,[329440]|0.2483,0.2483,[329440]|0.2558,0.2558,[329440]|0.1766,0.1766,[329440]|0.2913,0.2913,[329440]|0.2041,0.2041,[329440]|0.3005,0.3005,[329440]|0.1416,0.1416,[329440]|0.1205,0.1205,[329440]|0.0884,0.0884,[329440]|0.1205,0.1205,[329440]|0.1766,0.1766,[329440]|0.1266,0.1266,[329440]|0.1766,0.1766,[329440]|0.1667,0.1667,[329440]|0.0991,0.0991,[329440]|0.1041,0.1041,[329440]|0.0935,0.0935,[329440]|0.0723,0.0723,[329440]|0.0771,0.0771,[329440]|0.0554,0.0554,[329440]|0.0771,0.0771,[329440]|0.066,0.066,[329440]|0.0935,0.0935,[329440]|0.0526,0.0526,[329440]|0.0771,0.0771,[329440]|0.0744,0.0744,[329440]|0.1805,0.1805,[329440]|0.2041,0.2041,[329440]|0.2333,0.2333,[329440]|0.2385,0.2385,[329440]|0.1667,0.1667,[329440]|0.2167,0.2167,[329440]|0.2255,0.2255,[329440]|0.2333,0.2333,[329440]|0.3717,0.3717,[329440]|0.4037,0.4037,[329440]|0.3399,0.3399,[329440]|0.3806,0.3806,[329440]|0.4333,0.4333,[329440]|0.4918,0.4918,[329440]|0.442,0.442,[329440]|0.3992,0.3992,[329440]|0.3399,0.3399,[329440]|0.4037,0.4037,[329440]|0.3456,0.3456,[329440]|0.2963,0.2963,[329440]|0.2602,0.2602,[329440]|0.1805,0.1805,[329440]|0.2209,0.2209,[329440]|0.2167,0.2167,[329440]|0.2963,0.2963,[329440]|0.3717,0.3717,[329440]|0.2913,0.2913,[329440]|0.2786,0.2786,[329440]|0.1921,0.1921,[329440]|0.2122,0.2122,[329440]|0.27,0.27,[329440]|0.2292,0.2292,[329440]|0.1998,0.1998,[329440]|0.2209,0.2209,[329440]|0.2963,0.2963,[329440]|0.3717,0.3717,[329440]|0.363,0.363,[329440]|0.3578,0.3578,[329440]|0.3992,0.3992,[329440]|0.4967,0.4967,[329440]|0.5549,0.5549,[329440]|0.665,0.665,[329440]|0.6681,0.6681,[329440]|0.7111,0.7111,[329440]|0.7501,0.7501,[329440]|0.7772,0.7772,[329440]|0.8677,0.8677,[329440]|0.904,0.904,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF FER1_PEA
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.1914,0.1914,[72144e]|0.2258,0.2258,[72144e]|0.268,0.268,[72144e]|0.2951,0.2951,[72144e]|0.1914,0.1914,[72144e]|0.1476,0.1476,[72144e]|0.1823,0.1823,[72144e]|0.2094,0.2094,[72144e]|0.247,0.247,[72144e]|0.3019,0.3019,[72144e]|0.2918,0.2918,[72144e]|0.3566,0.3566,[72144e]|0.3566,0.3566,[72144e]|0.3529,0.3529,[72144e]|0.2988,0.2988,[72144e]|0.2752,0.2752,[72144e]|0.3087,0.3087,[72144e]|0.3774,0.3774,[72144e]|0.4541,0.4541,[72144e]|0.4256,0.4256,[72144e]|0.3215,0.3215,[72144e]|0.346,0.346,[72144e]|0.4087,0.4087,[72144e]|0.4087,0.4087,[72144e]|0.3087,0.3087,[72144e]|0.2436,0.2436,[72144e]|0.3392,0.3392,[72144e]|0.3321,0.3321,[72144e]|0.3182,0.3182,[72144e]|0.3182,0.3182,[72144e]|0.3053,0.3053,[72144e]|0.2064,0.2064,[72144e]|0.2258,0.2258,[72144e]|0.1969,0.1969,[72144e]|0.2258,0.2258,[72144e]|0.2399,0.2399,[72144e]|0.2292,0.2292,[72144e]|0.2002,0.2002,[72144e]|0.1501,0.1501,[72144e]|0.1275,0.1275,[72144e]|0.1162,0.1162,[72144e]|0.1162,0.1162,[72144e]|0.1942,0.1942,[72144e]|0.1298,0.1298,[72144e]|0.1162,0.1162,[72144e]|0.0851,0.0851,[72144e]|0.1424,0.1424,[72144e]|0.1424,0.1424,[72144e]|0.1048,0.1048,[72144e]|0.1554,0.1554,[72144e]|0.1914,0.1914,[72144e]|0.2002,0.2002,[72144e]|0.2034,0.2034,[72144e]|0.2752,0.2752,[72144e]|0.2918,0.2918,[72144e]|0.3117,0.3117,[72144e]|0.2164,0.2164,[72144e]|0.2258,0.2258,[72144e]|0.2002,0.2002,[72144e]|0.2575,0.2575,[72144e]|0.3087,0.3087,[72144e]|0.3494,0.3494,[72144e]|0.3249,0.3249,[72144e]|0.2752,0.2752,[72144e]|0.2064,0.2064,[72144e]|0.2193,0.2193,[72144e]|0.247,0.247,[72144e]|0.2988,0.2988,[72144e]|0.2817,0.2817,[72144e]|0.3704,0.3704,[72144e]|0.4476,0.4476,[72144e]|0.391,0.391,[72144e]|0.3599,0.3599,[72144e]|0.2752,0.2752,[72144e]|0.2884,0.2884,[72144e]|0.2164,0.2164,[72144e]|0.2399,0.2399,[72144e]|0.1476,0.1476,[72144e]|0.2328,0.2328,[72144e]|0.1323,0.1323,[72144e]|0.2129,0.2129,[72144e]|0.1583,0.1583,[72144e]|0.1611,0.1611,[72144e]|0.1476,0.1476,[72144e]|0.1206,0.1206,[72144e]|0.1791,0.1791,[72144e]|0.2436,0.2436,[72144e]|0.2164,0.2164,[72144e]|0.1791,0.1791,[72144e]|0.1823,0.1823,[72144e]|0.1969,0.1969,[72144e]|0.1349,0.1349,[72144e]|0.0851,0.0851,[72144e]|0.1184,0.1184,[72144e]|0.1162,0.1162,[72144e]|0.1914,0.1914,[72144e]|0.1373,0.1373,[72144e]|0.2034,0.2034,[72144e]|0.1823,0.1823,[72144e]|0.2575,0.2575,[72144e]|0.2715,0.2715,[72144e]|0.3631,0.3631,[72144e]|0.3599,0.3599,[72144e]|0.2918,0.2918,[72144e]|0.2258,0.2258,[72144e]|0.2436,0.2436,[72144e]|0.3494,0.3494,[72144e]|0.374,0.374,[72144e]|0.384,0.384,[72144e]|0.4051,0.4051,[72144e]|0.4541,0.4541,[72144e]|0.4256,0.4256,[72144e]|0.4369,0.4369,[72144e]|0.391,0.391,[72144e]|0.3948,0.3948,[72144e]|0.3249,0.3249,[72144e]|0.3286,0.3286,[72144e]|0.2064,0.2064,[72144e]|0.2034,0.2034,[72144e]|0.1702,0.1702,[72144e]|0.1092,0.1092,[72144e]|0.1323,0.1323,[72144e]|0.1251,0.1251,[72144e]|0.1251,0.1251,[72144e]|0.1373,0.1373,[72144e]|0.1702,0.1702,[72144e]|0.1852,0.1852,[72144e]|0.1184,0.1184,[72144e]|0.1251,0.1251,[72144e]|0.1115,0.1115,[72144e]|0.1028,0.1028,[72144e]|0.1424,0.1424,[72144e]|0.1449,0.1449,[72144e]|0.1881,0.1881,[72144e]|0.2064,0.2064,[72144e]|0.2328,0.2328,[72144e]|0.2849,0.2849,[72144e]|0.3249,0.3249,[72144e]|0.3182,0.3182,[72144e]|0.4051,0.4051,[72144e]|0.4541,0.4541,[72144e]|0.4725,0.4725,[72144e]|0.5577,0.5577,[72144e]|0.494,0.494,[72144e]|0.4766,0.4766,[72144e]|0.4619,0.4619,[72144e]|0.4149,0.4149,[72144e]|0.4831,0.4831,[72144e]|0.5665,0.5665,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.8781,0.8781,[329440]|0.82,0.82,[329440]|0.7192,0.7192,[329440]|0.6756,0.6756,[329440]|0.6374,0.6374,[329440]|0.59,0.59,[329440]|0.4651,0.4651,[329440]|0.3578,0.3578,[329440]|0.3359,0.3359,[329440]|0.2913,0.2913,[329440]|0.2531,0.2531,[329440]|0.3184,0.3184,[329440]|0.3184,0.3184,[329440]|0.3491,0.3491,[329440]|0.3184,0.3184,[329440]|0.2913,0.2913,[329440]|0.2531,0.2531,[329440]|0.2963,0.2963,[329440]|0.3806,0.3806,[329440]|0.3762,0.3762,[329440]|0.3806,0.3806,[329440]|0.3717,0.3717,[329440]|0.3399,0.3399,[329440]|0.3456,0.3456,[329440]|0.3535,0.3535,[329440]|0.3535,0.3535,[329440]|0.3359,0.3359,[329440]|0.3263,0.3263,[329440]|0.3053,0.3053,[329440]|0.2333,0.2333,[329440]|0.2255,0.2255,[329440]|0.1958,0.1958,[329440]|0.2292,0.2292,[329440]|0.1456,0.1456,[329440]|0.1698,0.1698,[329440]|0.1805,0.1805,[329440]|0.2385,0.2385,[329440]|0.2483,0.2483,[329440]|0.1878,0.1878,[329440]|0.1635,0.1635,[329440]|0.1178,0.1178,[329440]|0.1205,0.1205,[329440]|0.1667,0.1667,[329440]|0.138,0.138,[329440]|0.1322,0.1322,[329440]|0.0813,0.0813,[329440]|0.1416,0.1416,[329440]|0.1456,0.1456,[329440]|0.1349,0.1349,[329440]|0.1322,0.1322,[329440]|0.0909,0.0909,[329440]|0.0884,0.0884,[329440]|0.1088,0.1088,[329440]|0.1602,0.1602,[329440]|0.1635,0.1635,[329440]|0.1495,0.1495,[329440]|0.1635,0.1635,[329440]|0.1698,0.1698,[329440]|0.1456,0.1456,[329440]|0.1844,0.1844,[329440]|0.1602,0.1602,[329440]|0.2167,0.2167,[329440]|0.2483,0.2483,[329440]|0.3053,0.3053,[329440]|0.2483,0.2483,[329440]|0.2602,0.2602,[329440]|0.2122,0.2122,[329440]|0.2167,0.2167,[329440]|0.2432,0.2432,[329440]|0.3053,0.3053,[329440]|0.3263,0.3263,[329440]|0.3491,0.3491,[329440]|0.3359,0.3359,[329440]|0.2748,0.2748,[329440]|0.27,0.27,[329440]|0.2209,0.2209,[329440]|0.2292,0.2292,[329440]|0.1602,0.1602,[329440]|0.2748,0.2748,[329440]|0.1921,0.1921,[329440]|0.282,0.282,[329440]|0.1322,0.1322,[329440]|0.124,0.124,[329440]|0.0909,0.0909,[329440]|0.124,0.124,[329440]|0.1805,0.1805,[329440]|0.1322,0.1322,[329440]|0.1844,0.1844,[329440]|0.1732,0.1732,[329440]|0.1041,0.1041,[329440]|0.1088,0.1088,[329440]|0.0991,0.0991,[329440]|0.0771,0.0771,[329440]|0.0771,0.0771,[329440]|0.0554,0.0554,[329440]|0.0771,0.0771,[329440]|0.0643,0.0643,[329440]|0.1088,0.1088,[329440]|0.0607,0.0607,[329440]|0.1041,0.1041,[329440]|0.1041,0.1041,[329440]|0.208,0.208,[329440]|0.2385,0.2385,[329440]|0.2657,0.2657,[329440]|0.2748,0.2748,[329440]|0.1878,0.1878,[329440]|0.2292,0.2292,[329440]|0.2483,0.2483,[329440]|0.2602,0.2602,[329440]|0.3992,0.3992,[329440]|0.4282,0.4282,[329440]|0.363,0.363,[329440]|0.4116,0.4116,[329440]|0.4333,0.4333,[329440]|0.4967,0.4967,[329440]|0.4203,0.4203,[329440]|0.3762,0.3762,[329440]|0.282,0.282,[329440]|0.3399,0.3399,[329440]|0.2558,0.2558,[329440]|0.1998,0.1998,[329440]|0.1844,0.1844,[329440]|0.1178,0.1178,[329440]|0.1566,0.1566,[329440]|0.1495,0.1495,[329440]|0.2209,0.2209,[329440]|0.3053,0.3053,[329440]|0.2209,0.2209,[329440]|0.1566,0.1566,[329440]|0.0884,0.0884,[329440]|0.1041,0.1041,[329440]|0.1416,0.1416,[329440]|0.1178,0.1178,[329440]|0.1205,0.1205,[329440]|0.1349,0.1349,[329440]|0.2209,0.2209,[329440]|0.282,0.282,[329440]|0.2748,0.2748,[329440]|0.27,0.27,[329440]|0.3005,0.3005,[329440]|0.3992,0.3992,[329440]|0.4703,0.4703,[329440]|0.5762,0.5762,[329440]|0.5762,0.5762,[329440]|0.6293,0.6293,[329440]|0.6715,0.6715,[329440]|0.6944,0.6944,[329440]|0.7951,0.7951,[329440]|0.8781,0.8781,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF FER1_SPIOL
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.3704,0.3704,[72144e]|0.4017,0.4017,[72144e]|0.4292,0.4292,[72144e]|0.3215,0.3215,[72144e]|0.2884,0.2884,[72144e]|0.3566,0.3566,[72144e]|0.3704,0.3704,[72144e]|0.4292,0.4292,[72144e]|0.4619,0.4619,[72144e]|0.4476,0.4476,[72144e]|0.4979,0.4979,[72144e]|0.5807,0.5807,[72144e]|0.5758,0.5758,[72144e]|0.5758,0.5758,[72144e]|0.5382,0.5382,[72144e]|0.5055,0.5055,[72144e]|0.4409,0.4409,[72144e]|0.4685,0.4685,[72144e]|0.5055,0.5055,[72144e]|0.5493,0.5493,[72144e]|0.5533,0.5533,[72144e]|0.5951,0.5951,[72144e]|0.6375,0.6375,[72144e]|0.6322,0.6322,[72144e]|0.5493,0.5493,[72144e]|0.5456,0.5456,[72144e]|0.6043,0.6043,[72144e]|0.4864,0.4864,[72144e]|0.4864,0.4864,[72144e]|0.4507,0.4507,[72144e]|0.4369,0.4369,[72144e]|0.4652,0.4652,[72144e]|0.433,0.433,[72144e]|0.3983,0.3983,[72144e]|0.4292,0.4292,[72144e]|0.4619,0.4619,[72144e]|0.4541,0.4541,[72144e]|0.4831,0.4831,[72144e]|0.5176,0.5176,[72144e]|0.4541,0.4541,[72144e]|0.433,0.433,[72144e]|0.3392,0.3392,[72144e]|0.3286,0.3286,[72144e]|0.2849,0.2849,[72144e]|0.2817,0.2817,[72144e]|0.2224,0.2224,[72144e]|0.2364,0.2364,[72144e]|0.3249,0.3249,[72144e]|0.3599,0.3599,[72144e]|0.422,0.422,[72144e]|0.433,0.433,[72144e]|0.4409,0.4409,[72144e]|0.391,0.391,[72144e]|0.4186,0.4186,[72144e]|0.3249,0.3249,[72144e]|0.3392,0.3392,[72144e]|0.247,0.247,[72144e]|0.2783,0.2783,[72144e]|0.3215,0.3215,[72144e]|0.3321,0.3321,[72144e]|0.3182,0.3182,[72144e]|0.2609,0.2609,[72144e]|0.2193,0.2193,[72144e]|0.247,0.247,[72144e]|0.268,0.268,[72144e]|0.2918,0.2918,[72144e]|0.2645,0.2645,[72144e]|0.3494,0.3494,[72144e]|0.422,0.422,[72144e]|0.4476,0.4476,[72144e]|0.4119,0.4119,[72144e]|0.346,0.346,[72144e]|0.3599,0.3599,[72144e]|0.2918,0.2918,[72144e]|0.3704,0.3704,[72144e]|0.2609,0.2609,[72144e]|0.3494,0.3494,[72144e]|0.2436,0.2436,[72144e]|0.3392,0.3392,[72144e]|0.2817,0.2817,[72144e]|0.268,0.268,[72144e]|0.2541,0.2541,[72144e]|0.2094,0.2094,[72144e]|0.2951,0.2951,[72144e]|0.3566,0.3566,[72144e]|0.3215,0.3215,[72144e]|0.2849,0.2849,[72144e]|0.3117,0.3117,[72144e]|0.3249,0.3249,[72144e]|0.2399,0.2399,[72144e]|0.2064,0.2064,[72144e]|0.1852,0.1852,[72144e]|0.1852,0.1852,[72144e]|0.247,0.247,[72144e]|0.1759,0.1759,[72144e]|0.2399,0.2399,[72144e]|0.2193,0.2193,[72144e]|0.3182,0.3182,[72144e]|0.3321,0.3321,[72144e]|0.4369,0.4369,[72144e]|0.433,0.433,[72144e]|0.3704,0.3704,[72144e]|0.3087,0.3087,[72144e]|0.3249,0.3249,[72144e]|0.433,0.433,[72144e]|0.4476,0.4476,[72144e]|0.4582,0.4582,[72144e]|0.4864,0.4864,[72144e]|0.5296,0.5296,[72144e]|0.5533,0.5533,[72144e]|0.5665,0.5665,[72144e]|0.5456,0.5456,[72144e]|0.5017,0.5017,[72144e]|0.4369,0.4369,[72144e]|0.4369,0.4369,[72144e]|0.3356,0.3356,[72144e]|0.374,0.374,[72144e]|0.3426,0.3426,[72144e]|0.2609,0.2609,[72144e]|0.2817,0.2817,[72144e]|0.2164,0.2164,[72144e]|0.2034,0.2034,[72144e]|0.2164,0.2164,[72144e]|0.2541,0.2541,[72144e]|0.3117,0.3117,[72144e]|0.2328,0.2328,[72144e]|0.2399,0.2399,[72144e]|0.2224,0.2224,[72144e]|0.2064,0.2064,[72144e]|0.2575,0.2575,[72144e]|0.268,0.268,[72144e]|0.268,0.268,[72144e]|0.2918,0.2918,[72144e]|0.3019,0.3019,[72144e]|0.3494,0.3494,[72144e]|0.3872,0.3872,[72144e]|0.3807,0.3807,[72144e]|0.4685,0.4685,[72144e]|0.4831,0.4831,[72144e]|0.494,0.494,[72144e]|0.5854,0.5854,[72144e]|0.5176,0.5176,[72144e]|0.5807,0.5807,[72144e]|0.5707,0.5707,[72144e]|0.5296,0.5296,[72144e]|0.6183,0.6183,[72144e]|0.5992,0.5992,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.928,0.928,[329440]|0.8823,0.8823,[329440]|0.8283,0.8283,[329440]|0.7912,0.7912,[329440]|0.754,0.754,[329440]|0.6474,0.6474,[329440]|0.5473,0.5473,[329440]|0.5296,0.5296,[329440]|0.4918,0.4918,[329440]|0.4703,0.4703,[329440]|0.4379,0.4379,[329440]|0.442,0.442,[329440]|0.4967,0.4967,[329440]|0.5514,0.5514,[329440]|0.5229,0.5229,[329440]|0.4879,0.4879,[329440]|0.4556,0.4556,[329440]|0.4245,0.4245,[329440]|0.4116,0.4116,[329440]|0.4651,0.4651,[329440]|0.4703,0.4703,[329440]|0.5008,0.5008,[329440]|0.5296,0.5296,[329440]|0.5229,0.5229,[329440]|0.5374,0.5374,[329440]|0.6174,0.6174,[329440]|0.6255,0.6255,[329440]|0.5253,0.5253,[329440]|0.5229,0.5229,[329440]|0.4458,0.4458,[329440]|0.442,0.442,[329440]|0.4781,0.4781,[329440]|0.4513,0.4513,[329440]|0.4282,0.4282,[329440]|0.4749,0.4749,[329440]|0.4967,0.4967,[329440]|0.5173,0.5173,[329440]|0.5549,0.5549,[329440]|0.5667,0.5667,[329440]|0.5412,0.5412,[329440]|0.5043,0.5043,[329440]|0.4703,0.4703,[329440]|0.4333,0.4333,[329440]|0.3578,0.3578,[329440]|0.3311,0.3311,[329440]|0.2657,0.2657,[329440]|0.3146,0.3146,[329440]|0.3263,0.3263,[329440]|0.27,0.27,[329440]|0.3184,0.3184,[329440]|0.3456,0.3456,[329440]|0.3311,0.3311,[329440]|0.3311,0.3311,[329440]|0.3311,0.3311,[329440]|0.2531,0.2531,[329440]|0.2748,0.2748,[329440]|0.1921,0.1921,[329440]|0.1921,0.1921,[329440]|0.1456,0.1456,[329440]|0.1698,0.1698,[329440]|0.2122,0.2122,[329440]|0.2657,0.2657,[329440]|0.2333,0.2333,[329440]|0.2385,0.2385,[329440]|0.1844,0.1844,[329440]|0.1844,0.1844,[329440]|0.1998,0.1998,[329440]|0.2209,0.2209,[329440]|0.2432,0.2432,[329440]|0.2657,0.2657,[329440]|0.2483,0.2483,[329440]|0.27,0.27,[329440]|0.2657,0.2657,[329440]|0.208,0.208,[329440]|0.282,0.282,[329440]|0.1998,0.1998,[329440]|0.3184,0.3184,[329440]|0.2432,0.2432,[329440]|0.3359,0.3359,[329440]|0.1732,0.1732,[329440]|0.1566,0.1566,[329440]|0.1205,0.1205,[329440]|0.1602,0.1602,[329440]|0.2255,0.2255,[329440]|0.1766,0.1766,[329440]|0.2385,0.2385,[329440]|0.2255,0.2255,[329440]|0.1635,0.1635,[329440]|0.1732,0.1732,[329440]|0.1602,0.1602,[329440]|0.1292,0.1292,[329440]|0.0771,0.0771,[329440]|0.0701,0.0701,[329440]|0.0965,0.0965,[329440]|0.0858,0.0858,[329440]|0.124,0.124,[329440]|0.0643,0.0643,[329440]|0.0935,0.0935,[329440]|0.0935,0.0935,[329440]|0.2041,0.2041,[329440]|0.2209,0.2209,[329440]|0.2602,0.2602,[329440]|0.2657,0.2657,[329440]|0.1878,0.1878,[329440]|0.2333,0.2333,[329440]|0.2432,0.2432,[329440]|0.2531,0.2531,[329440]|0.3668,0.3668,[329440]|0.3992,0.3992,[329440]|0.3359,0.3359,[329440]|0.3717,0.3717,[329440]|0.4556,0.4556,[329440]|0.4825,0.4825,[329440]|0.4245,0.4245,[329440]|0.3806,0.3806,[329440]|0.3146,0.3146,[329440]|0.3762,0.3762,[329440]|0.3263,0.3263,[329440]|0.3005,0.3005,[329440]|0.2748,0.2748,[329440]|0.1998,0.1998,[329440]|0.2432,0.2432,[329440]|0.1878,0.1878,[329440]|0.2657,0.2657,[329440]|0.3456,0.3456,[329440]|0.2748,0.2748,[329440]|0.2558,0.2558,[329440]|0.1766,0.1766,[329440]|0.1998,0.1998,[329440]|0.2483,0.2483,[329440]|0.2209,0.2209,[329440]|0.1732,0.1732,[329440]|0.1921,0.1921,[329440]|0.282,0.282,[329440]|0.3535,0.3535,[329440]|0.3456,0.3456,[329440]|0.3491,0.3491,[329440]|0.3806,0.3806,[329440]|0.4458,0.4458,[329440]|0.5084,0.5084,[329440]|0.6174,0.6174,[329440]|0.6174,0.6174,[329440]|0.7034,0.7034,[329440]|0.7418,0.7418,[329440]|0.7644,0.7644,[329440]|0.8595,0.8595,[329440]|0.8945,0.8945,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF FER1_MESCR
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.3117,0.3117,[72144e]|0.2951,0.2951,[72144e]|0.3249,0.3249,[72144e]|0.3566,0.3566,[72144e]|0.3426,0.3426,[72144e]|0.2503,0.2503,[72144e]|0.2436,0.2436,[72144e]|0.3053,0.3053,[72144e]|0.3182,0.3182,[72144e]|0.3426,0.3426,[72144e]|0.3948,0.3948,[72144e]|0.4619,0.4619,[72144e]|0.4619,0.4619,[72144e]|0.4979,0.4979,[72144e]|0.4652,0.4652,[72144e]|0.433,0.433,[72144e]|0.3983,0.3983,[72144e]|0.4619,0.4619,[72144e]|0.5296,0.5296,[72144e]|0.5419,0.5419,[72144e]|0.4864,0.4864,[72144e]|0.5176,0.5176,[72144e]|0.5176,0.5176,[72144e]|0.5176,0.5176,[72144e]|0.4541,0.4541,[72144e]|0.3599,0.3599,[72144e]|0.3872,0.3872,[72144e]|0.4119,0.4119,[72144e]|0.4292,0.4292,[72144e]|0.3948,0.3948,[72144e]|0.4017,0.4017,[72144e]|0.3704,0.3704,[72144e]|0.3356,0.3356,[72144e]|0.3053,0.3053,[72144e]|0.3286,0.3286,[72144e]|0.3286,0.3286,[72144e]|0.3087,0.3087,[72144e]|0.3392,0.3392,[72144e]|0.3774,0.3774,[72144e]|0.3182,0.3182,[72144e]|0.2918,0.2918,[72144e]|0.2609,0.2609,[72144e]|0.2292,0.2292,[72144e]|0.2224,0.2224,[72144e]|0.1731,0.1731,[72144e]|0.2002,0.2002,[72144e]|0.2002,0.2002,[72144e]|0.2436,0.2436,[72144e]|0.247,0.247,[72144e]|0.3426,0.3426,[72144e]|0.3774,0.3774,[72144e]|0.3774,0.3774,[72144e]|0.3704,0.3704,[72144e]|0.4087,0.4087,[72144e]|0.4369,0.4369,[72144e]|0.3704,0.3704,[72144e]|0.3948,0.3948,[72144e]|0.2988,0.2988,[72144e]|0.3807,0.3807,[72144e]|0.391,0.391,[72144e]|0.4292,0.4292,[72144e]|0.4087,0.4087,[72144e]|0.3529,0.3529,[72144e]|0.3149,0.3149,[72144e]|0.3356,0.3356,[72144e]|0.3566,0.3566,[72144e]|0.3807,0.3807,[72144e]|0.3529,0.3529,[72144e]|0.4369,0.4369,[72144e]|0.5139,0.5139,[72144e]|0.4831,0.4831,[72144e]|0.4507,0.4507,[72144e]|0.3566,0.3566,[72144e]|0.3704,0.3704,[72144e]|0.3182,0.3182,[72144e]|0.3392,0.3392,[72144e]|0.2328,0.2328,[72144e]|0.2951,0.2951,[72144e]|0.1791,0.1791,[72144e]|0.2715,0.2715,[72144e]|0.2164,0.2164,[72144e]|0.2002,0.2002,[72144e]|0.1881,0.1881,[72144e]|0.1501,0.1501,[72144e]|0.2164,0.2164,[72144e]|0.2817,0.2817,[72144e]|0.247,0.247,[72144e]|0.2094,0.2094,[72144e]|0.2328,0.2328,[72144e]|0.2503,0.2503,[72144e]|0.1823,0.1823,[72144e]|0.1643,0.1643,[72144e]|0.1852,0.1852,[72144e]|0.1852,0.1852,[72144e]|0.247,0.247,[72144e]|0.1881,0.1881,[72144e]|0.2541,0.2541,[72144e]|0.2328,0.2328,[72144e]|0.3249,0.3249,[72144e]|0.3426,0.3426,[72144e]|0.4369,0.4369,[72144e]|0.4292,0.4292,[72144e]|0.3704,0.3704,[72144e]|0.3117,0.3117,[72144e]|0.3249,0.3249,[72144e]|0.4369,0.4369,[72144e]|0.4507,0.4507,[72144e]|0.4619,0.4619,[72144e]|0.4901,0.4901,[72144e]|0.5055,0.5055,[72144e]|0.5342,0.5342,[72144e]|0.5419,0.5419,[72144e]|0.5176,0.5176,[72144e]|0.4619,0.4619,[72144e]|0.4017,0.4017,[72144e]|0.4051,0.4051,[72144e]|0.3053,0.3053,[72144e]|0.3053,0.3053,[72144e]|0.2783,0.2783,[72144e]|0.1942,0.1942,[72144e]|0.2129,0.2129,[72144e]|0.2002,0.2002,[72144e]|0.2002,0.2002,[72144e]|0.2129,0.2129,[72144e]|0.2503,0.2503,[72144e]|0.3117,0.3117,[72144e]|0.2328,0.2328,[72144e]|0.2399,0.2399,[72144e]|0.2258,0.2258,[72144e]|0.2129,0.2129,[72144e]|0.268,0.268,[72144e]|0.2988,0.2988,[72144e]|0.2988,0.2988,[72144e]|0.3215,0.3215,[72144e]|0.3249,0.3249,[72144e]|0.3774,0.3774,[72144e]|0.4149,0.4149,[72144e]|0.4051,0.4051,[72144e]|0.4979,0.4979,[72144e]|0.5456,0.5456,[72144e]|0.5665,0.5665,[72144e]|0.6755,0.6755,[72144e]|0.6089,0.6089,[72144e]|0.5901,0.5901,[72144e]|0.5807,0.5807,[72144e]|0.5382,0.5382,[72144e]|0.6227,0.6227,[72144e]|0.6043,0.6043,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.8857,0.8857,[329440]|0.8283,0.8283,[329440]|0.7912,0.7912,[329440]|0.7111,0.7111,[329440]|0.6681,0.6681,[329440]|0.6334,0.6334,[329440]|0.5549,0.5549,[329440]|0.4282,0.4282,[329440]|0.3491,0.3491,[329440]|0.3311,0.3311,[329440]|0.2913,0.2913,[329440]|0.3225,0.3225,[329440]|0.3806,0.3806,[329440]|0.442,0.442,[329440]|0.4078,0.4078,[329440]|0.4078,0.4078,[329440]|0.4078,0.4078,[329440]|0.4037,0.4037,[329440]|0.3939,0.3939,[329440]|0.4203,0.4203,[329440]|0.4245,0.4245,[329440]|0.46,0.46,[329440]|0.3885,0.3885,[329440]|0.4282,0.4282,[329440]|0.4556,0.4556,[329440]|0.4149,0.4149,[329440]|0.3885,0.3885,[329440]|0.3847,0.3847,[329440]|0.4203,0.4203,[329440]|0.3263,0.3263,[329440]|0.3311,0.3311,[329440]|0.3263,0.3263,[329440]|0.3005,0.3005,[329440]|0.2432,0.2432,[329440]|0.2786,0.2786,[329440]|0.2865,0.2865,[329440]|0.3146,0.3146,[329440]|0.3578,0.3578,[329440]|0.3535,0.3535,[329440]|0.3263,0.3263,[329440]|0.2913,0.2913,[329440]|0.2558,0.2558,[329440]|0.2913,0.2913,[329440]|0.2657,0.2657,[329440]|0.1698,0.1698,[329440]|0.1958,0.1958,[329440]|0.1878,0.1878,[329440]|0.2748,0.2748,[329440]|0.2041,0.2041,[329440]|0.208,0.208,[329440]|0.1998,0.1998,[329440]|0.2333,0.2333,[329440]|0.2483,0.2483,[329440]|0.2748,0.2748,[329440]|0.2602,0.2602,[329440]|0.2602,0.2602,[329440]|0.2786,0.2786,[329440]|0.1998,0.1998,[329440]|0.2748,0.2748,[329440]|0.1844,0.1844,[329440]|0.2483,0.2483,[329440]|0.2913,0.2913,[329440]|0.3456,0.3456,[329440]|0.3184,0.3184,[329440]|0.3225,0.3225,[329440]|0.27,0.27,[329440]|0.2748,0.2748,[329440]|0.2913,0.2913,[329440]|0.3225,0.3225,[329440]|0.3491,0.3491,[329440]|0.3717,0.3717,[329440]|0.3578,0.3578,[329440]|0.3053,0.3053,[329440]|0.3005,0.3005,[329440]|0.2602,0.2602,[329440]|0.2748,0.2748,[329440]|0.1958,0.1958,[329440]|0.3005,0.3005,[329440]|0.2209,0.2209,[329440]|0.3146,0.3146,[329440]|0.1602,0.1602,[329440]|0.138,0.138,[329440]|0.1041,0.1041,[329440]|0.1349,0.1349,[329440]|0.1958,0.1958,[329440]|0.1532,0.1532,[329440]|0.2041,0.2041,[329440]|0.1878,0.1878,[329440]|0.1322,0.1322,[329440]|0.1349,0.1349,[329440]|0.124,0.124,[329440]|0.0991,0.0991,[329440]|0.0884,0.0884,[329440]|0.0858,0.0858,[329440]|0.1205,0.1205,[329440]|0.1018,0.1018,[329440]|0.138,0.138,[329440]|0.0832,0.0832,[329440]|0.1178,0.1178,[329440]|0.1178,0.1178,[329440]|0.2385,0.2385,[329440]|0.2602,0.2602,[329440]|0.2865,0.2865,[329440]|0.2963,0.2963,[329440]|0.2209,0.2209,[329440]|0.2748,0.2748,[329440]|0.2865,0.2865,[329440]|0.2963,0.2963,[329440]|0.4116,0.4116,[329440]|0.442,0.442,[329440]|0.3885,0.3885,[329440]|0.3885,0.3885,[329440]|0.4651,0.4651,[329440]|0.4749,0.4749,[329440]|0.4149,0.4149,[329440]|0.3762,0.3762,[329440]|0.3184,0.3184,[329440]|0.3668,0.3668,[329440]|0.3146,0.3146,[329440]|0.2657,0.2657,[329440]|0.2333,0.2333,[329440]|0.1667,0.1667,[329440]|0.208,0.208,[329440]|0.1998,0.1998,[329440]|0.2786,0.2786,[329440]|0.3456,0.3456,[329440]|0.2786,0.2786,[329440]|0.2602,0.2602,[329440]|0.1844,0.1844,[329440]|0.1998,0.1998,[329440]|0.2483,0.2483,[329440]|0.2531,0.2531,[329440]|0.2041,0.2041,[329440]|0.2209,0.2209,[329440]|0.2963,0.2963,[329440]|0.3578,0.3578,[329440]|0.3491,0.3491,[329440]|0.3491,0.3491,[329440]|0.3847,0.3847,[329440]|0.4781,0.4781,[329440]|0.5374,0.5374,[329440]|0.6442,0.6442,[329440]|0.6474,0.6474,[329440]|0.6944,0.6944,[329440]|0.7317,0.7317,[329440]|0.7605,0.7605,[329440]|0.8521,0.8521,[329440]|0.892,0.892,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF FER_CAPAN
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.2817,0.2817,[72144e]|0.1671,0.1671,[72144e]|0.1611,0.1611,[72144e]|0.2364,0.2364,[72144e]|0.2783,0.2783,[72144e]|0.2951,0.2951,[72144e]|0.3566,0.3566,[72144e]|0.3426,0.3426,[72144e]|0.3053,0.3053,[72144e]|0.3286,0.3286,[72144e]|0.346,0.346,[72144e]|0.3087,0.3087,[72144e]|0.3321,0.3321,[72144e]|0.3631,0.3631,[72144e]|0.346,0.346,[72144e]|0.3774,0.3774,[72144e]|0.4119,0.4119,[72144e]|0.3566,0.3566,[72144e]|0.384,0.384,[72144e]|0.4766,0.4766,[72144e]|0.4507,0.4507,[72144e]|0.3807,0.3807,[72144e]|0.2884,0.2884,[72144e]|0.3774,0.3774,[72144e]|0.3392,0.3392,[72144e]|0.3019,0.3019,[72144e]|0.2918,0.2918,[72144e]|0.2752,0.2752,[72144e]|0.2503,0.2503,[72144e]|0.2752,0.2752,[72144e]|0.3249,0.3249,[72144e]|0.3149,0.3149,[72144e]|0.2645,0.2645,[72144e]|0.3356,0.3356,[72144e]|0.2399,0.2399,[72144e]|0.1852,0.1852,[72144e]|0.2258,0.2258,[72144e]|0.1969,0.1969,[72144e]|0.1251,0.1251,[72144e]|0.1583,0.1583,[72144e]|0.1229,0.1229,[72144e]|0.1028,0.1028,[72144e]|0.0817,0.0817,[72144e]|0.0799,0.0799,[72144e]|0.1399,0.1399,[72144e]|0.1611,0.1611,[72144e]|0.2399,0.2399,[72144e]|0.247,0.247,[72144e]|0.2783,0.2783,[72144e]|0.2328,0.2328,[72144e]|0.2503,0.2503,[72144e]|0.1643,0.1643,[72144e]|0.1791,0.1791,[72144e]|0.1092,0.1092,[72144e]|0.1702,0.1702,[72144e]|0.1791,0.1791,[72144e]|0.2849,0.2849,[72144e]|0.2645,0.2645,[72144e]|0.2094,0.2094,[72144e]|0.1501,0.1501,[72144e]|0.1643,0.1643,[72144e]|0.1852,0.1852,[72144e]|0.247,0.247,[72144e]|0.2258,0.2258,[72144e]|0.3149,0.3149,[72144e]|0.4087,0.4087,[72144e]|0.3774,0.3774,[72144e]|0.346,0.346,[72144e]|0.3286,0.3286,[72144e]|0.3494,0.3494,[72144e]|0.2541,0.2541,[72144e]|0.3529,0.3529,[72144e]|0.247,0.247,[72144e]|0.3392,0.3392,[72144e]|0.2224,0.2224,[72144e]|0.3249,0.3249,[72144e]|0.268,0.268,[72144e]|0.2541,0.2541,[72144e]|0.2436,0.2436,[72144e]|0.1969,0.1969,[72144e]|0.2752,0.2752,[72144e]|0.3426,0.3426,[72144e]|0.3053,0.3053,[72144e]|0.2645,0.2645,[72144e]|0.2503,0.2503,[72144e]|0.2715,0.2715,[72144e]|0.1823,0.1823,[72144e]|0.1424,0.1424,[72144e]|0.1611,0.1611,[72144e]|0.1611,0.1611,[72144e]|0.1424,0.1424,[72144e]|0.0967,0.0967,[72144e]|0.1528,0.1528,[72144e]|0.1399,0.1399,[72144e]|0.2129,0.2129,[72144e]|0.2292,0.2292,[72144e]|0.3286,0.3286,[72144e]|0.3356,0.3356,[72144e]|0.2752,0.2752,[72144e]|0.2094,0.2094,[72144e]|0.2292,0.2292,[72144e]|0.346,0.346,[72144e]|0.3631,0.3631,[72144e]|0.374,0.374,[72144e]|0.4119,0.4119,[72144e]|0.4619,0.4619,[72144e]|0.4864,0.4864,[72144e]|0.4901,0.4901,[72144e]|0.4979,0.4979,[72144e]|0.4725,0.4725,[72144e]|0.4051,0.4051,[72144e]|0.4087,0.4087,[72144e]|0.3182,0.3182,[72144e]|0.3215,0.3215,[72144e]|0.2817,0.2817,[72144e]|0.1969,0.1969,[72144e]|0.2224,0.2224,[72144e]|0.2164,0.2164,[72144e]|0.2129,0.2129,[72144e]|0.2193,0.2193,[72144e]|0.2575,0.2575,[72144e]|0.3215,0.3215,[72144e]|0.2399,0.2399,[72144e]|0.2436,0.2436,[72144e]|0.2292,0.2292,[72144e]|0.2164,0.2164,[72144e]|0.268,0.268,[72144e]|0.268,0.268,[72144e]|0.2193,0.2193,[72144e]|0.2436,0.2436,[72144e]|0.2436,0.2436,[72144e]|0.247,0.247,[72144e]|0.3087,0.3087,[72144e]|0.3019,0.3019,[72144e]|0.4017,0.4017,[72144e]|0.4441,0.4441,[72144e]|0.4541,0.4541,[72144e]|0.5419,0.5419,[72144e]|0.4831,0.4831,[72144e]|0.4507,0.4507,[72144e]|0.4369,0.4369,[72144e]|0.391,0.391,[72144e]|0.4541,0.4541,[72144e]|0.4292,0.4292,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.8424,0.8424,[329440]|0.8074,0.8074,[329440]|0.7644,0.7644,[329440]|0.6442,0.6442,[329440]|0.5762,0.5762,[329440]|0.5549,0.5549,[329440]|0.5253,0.5253,[329440]|0.4879,0.4879,[329440]|0.4651,0.4651,[329440]|0.3847,0.3847,[329440]|0.2748,0.2748,[329440]|0.2963,0.2963,[329440]|0.3311,0.3311,[329440]|0.2657,0.2657,[329440]|0.3311,0.3311,[329440]|0.3535,0.3535,[329440]|0.3146,0.3146,[329440]|0.3311,0.3311,[329440]|0.3578,0.3578,[329440]|0.363,0.363,[329440]|0.3578,0.3578,[329440]|0.363,0.363,[329440]|0.3225,0.3225,[329440]|0.3491,0.3491,[329440]|0.2913,0.2913,[329440]|0.2657,0.2657,[329440]|0.1878,0.1878,[329440]|0.1878,0.1878,[329440]|0.1732,0.1732,[329440]|0.1732,0.1732,[329440]|0.2292,0.2292,[329440]|0.2255,0.2255,[329440]|0.2255,0.2255,[329440]|0.282,0.282,[329440]|0.2209,0.2209,[329440]|0.1958,0.1958,[329440]|0.1844,0.1844,[329440]|0.138,0.138,[329440]|0.1088,0.1088,[329440]|0.1602,0.1602,[329440]|0.1041,0.1041,[329440]|0.0965,0.0965,[329440]|0.0813,0.0813,[329440]|0.1088,0.1088,[329440]|0.1205,0.1205,[329440]|0.0789,0.0789,[329440]|0.1117,0.1117,[329440]|0.1322,0.1322,[329440]|0.1349,0.1349,[329440]|0.1602,0.1602,[329440]|0.1805,0.1805,[329440]|0.1322,0.1322,[329440]|0.1495,0.1495,[329440]|0.0965,0.0965,[329440]|0.1495,0.1495,[329440]|0.0771,0.0771,[329440]|0.1495,0.1495,[329440]|0.1921,0.1921,[329440]|0.2209,0.2209,[329440]|0.1698,0.1698,[329440]|0.1805,0.1805,[329440]|0.1456,0.1456,[329440]|0.1495,0.1495,[329440]|0.1732,0.1732,[329440]|0.2432,0.2432,[329440]|0.2786,0.2786,[329440]|0.3053,0.3053,[329440]|0.2913,0.2913,[329440]|0.2432,0.2432,[329440]|0.2432,0.2432,[329440]|0.1958,0.1958,[329440]|0.2865,0.2865,[329440]|0.2041,0.2041,[329440]|0.3225,0.3225,[329440]|0.2385,0.2385,[329440]|0.3578,0.3578,[329440]|0.1844,0.1844,[329440]|0.1698,0.1698,[329440]|0.1495,0.1495,[329440]|0.1844,0.1844,[329440]|0.2558,0.2558,[329440]|0.1844,0.1844,[329440]|0.2483,0.2483,[329440]|0.2385,0.2385,[329440]|0.1266,0.1266,[329440]|0.1322,0.1322,[329440]|0.1205,0.1205,[329440]|0.0965,0.0965,[329440]|0.0832,0.0832,[329440]|0.0744,0.0744,[329440]|0.0813,0.0813,[329440]|0.0677,0.0677,[329440]|0.0832,0.0832,[329440]|0.0478,0.0478,[329440]|0.0813,0.0813,[329440]|0.0813,0.0813,[329440]|0.1766,0.1766,[329440]|0.1958,0.1958,[329440]|0.2209,0.2209,[329440]|0.2255,0.2255,[329440]|0.1566,0.1566,[329440]|0.208,0.208,[329440]|0.2209,0.2209,[329440]|0.2292,0.2292,[329440]|0.3668,0.3668,[329440]|0.3939,0.3939,[329440]|0.3263,0.3263,[329440]|0.3717,0.3717,[329440]|0.4513,0.4513,[329440]|0.4825,0.4825,[329440]|0.4245,0.4245,[329440]|0.3762,0.3762,[329440]|0.3399,0.3399,[329440]|0.3885,0.3885,[329440]|0.3053,0.3053,[329440]|0.2531,0.2531,[329440]|0.2385,0.2385,[329440]|0.1635,0.1635,[329440]|0.2041,0.2041,[329440]|0.208,0.208,[329440]|0.2865,0.2865,[329440]|0.3668,0.3668,[329440]|0.2865,0.2865,[329440]|0.27,0.27,[329440]|0.1805,0.1805,[329440]|0.1998,0.1998,[329440]|0.2602,0.2602,[329440]|0.2209,0.2209,[329440]|0.1766,0.1766,[329440]|0.1958,0.1958,[329440]|0.2209,0.2209,[329440]|0.2913,0.2913,[329440]|0.2913,0.2913,[329440]|0.2385,0.2385,[329440]|0.3096,0.3096,[329440]|0.4078,0.4078,[329440]|0.4749,0.4749,[329440]|0.5846,0.5846,[329440]|0.59,0.59,[329440]|0.6334,0.6334,[329440]|0.6681,0.6681,[329440]|0.6906,0.6906,[329440]|0.7869,0.7869,[329440]|0.835,0.835,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF FER_CAPAA
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.247,0.247,[72144e]|0.3392,0.3392,[72144e]|0.2609,0.2609,[72144e]|0.3249,0.3249,[72144e]|0.2258,0.2258,[72144e]|0.2817,0.2817,[72144e]|0.1759,0.1759,[72144e]|0.2364,0.2364,[72144e]|0.2817,0.2817,[72144e]|0.3215,0.3215,[72144e]|0.2918,0.2918,[72144e]|0.2436,0.2436,[72144e]|0.1852,0.1852,[72144e]|0.1942,0.1942,[72144e]|0.2258,0.2258,[72144e]|0.2884,0.2884,[72144e]|0.2783,0.2783,[72144e]|0.3667,0.3667,[72144e]|0.4541,0.4541,[72144e]|0.4292,0.4292,[72144e]|0.3948,0.3948,[72144e]|0.3704,0.3704,[72144e]|0.391,0.391,[72144e]|0.2918,0.2918,[72144e]|0.3948,0.3948,[72144e]|0.2951,0.2951,[72144e]|0.3872,0.3872,[72144e]|0.2575,0.2575,[72144e]|0.3599,0.3599,[72144e]|0.3019,0.3019,[72144e]|0.2849,0.2849,[72144e]|0.2645,0.2645,[72144e]|0.2034,0.2034,[72144e]|0.2752,0.2752,[72144e]|0.3356,0.3356,[72144e]|0.2918,0.2918,[72144e]|0.247,0.247,[72144e]|0.2364,0.2364,[72144e]|0.247,0.247,[72144e]|0.1643,0.1643,[72144e]|0.1275,0.1275,[72144e]|0.1449,0.1449,[72144e]|0.1449,0.1449,[72144e]|0.1323,0.1323,[72144e]|0.0888,0.0888,[72144e]|0.1449,0.1449,[72144e]|0.1275,0.1275,[72144e]|0.1881,0.1881,[72144e]|0.2064,0.2064,[72144e]|0.3149,0.3149,[72144e]|0.3286,0.3286,[72144e]|0.268,0.268,[72144e]|0.2034,0.2034,[72144e]|0.2224,0.2224,[72144e]|0.3494,0.3494,[72144e]|0.3704,0.3704,[72144e]|0.3807,0.3807,[72144e]|0.422,0.422,[72144e]|0.4725,0.4725,[72144e]|0.5017,0.5017,[72144e]|0.5176,0.5176,[72144e]|0.5176,0.5176,[72144e]|0.4901,0.4901,[72144e]|0.422,0.422,[72144e]|0.422,0.422,[72144e]|0.3356,0.3356,[72144e]|0.3356,0.3356,[72144e]|0.2951,0.2951,[72144e]|0.2129,0.2129,[72144e]|0.2436,0.2436,[72144e]|0.2328,0.2328,[72144e]|0.2328,0.2328,[72144e]|0.247,0.247,[72144e]|0.2849,0.2849,[72144e]|0.3494,0.3494,[72144e]|0.2609,0.2609,[72144e]|0.268,0.268,[72144e]|0.2541,0.2541,[72144e]|0.2328,0.2328,[72144e]|0.2849,0.2849,[72144e]|0.2884,0.2884,[72144e]|0.2364,0.2364,[72144e]|0.2609,0.2609,[72144e]|0.2645,0.2645,[72144e]|0.2645,0.2645,[72144e]|0.3286,0.3286,[72144e]|0.3215,0.3215,[72144e]|0.4186,0.4186,[72144e]|0.4582,0.4582,[72144e]|0.4725,0.4725,[72144e]|0.5533,0.5533,[72144e]|0.494,0.494,[72144e]|0.4652,0.4652,[72144e]|0.4476,0.4476,[72144e]|0.3983,0.3983,[72144e]|0.4619,0.4619,[72144e]|0.433,0.433,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.7724,0.7724,[329440]|0.7501,0.7501,[329440]|0.7111,0.7111,[329440]|0.6984,0.6984,[329440]|0.59,0.59,[329440]|0.5711,0.5711,[329440]|0.442,0.442,[329440]|0.4203,0.4203,[329440]|0.2786,0.2786,[329440]|0.27,0.27,[329440]|0.2385,0.2385,[329440]|0.3005,0.3005,[329440]|0.2385,0.2385,[329440]|0.2483,0.2483,[329440]|0.2167,0.2167,[329440]|0.2255,0.2255,[329440]|0.2657,0.2657,[329440]|0.3456,0.3456,[329440]|0.3717,0.3717,[329440]|0.3992,0.3992,[329440]|0.3847,0.3847,[329440]|0.3311,0.3311,[329440]|0.3225,0.3225,[329440]|0.27,0.27,[329440]|0.3668,0.3668,[329440]|0.2786,0.2786,[329440]|0.4037,0.4037,[329440]|0.3096,0.3096,[329440]|0.4116,0.4116,[329440]|0.2255,0.2255,[329440]|0.2041,0.2041,[329440]|0.1602,0.1602,[329440]|0.1998,0.1998,[329440]|0.2657,0.2657,[329440]|0.1921,0.1921,[329440]|0.2558,0.2558,[329440]|0.2483,0.2483,[329440]|0.1322,0.1322,[329440]|0.138,0.138,[329440]|0.124,0.124,[329440]|0.0991,0.0991,[329440]|0.0884,0.0884,[329440]|0.0771,0.0771,[329440]|0.0858,0.0858,[329440]|0.0701,0.0701,[329440]|0.0858,0.0858,[329440]|0.049,0.049,[329440]|0.0813,0.0813,[329440]|0.0813,0.0813,[329440]|0.1766,0.1766,[329440]|0.1998,0.1998,[329440]|0.2255,0.2255,[329440]|0.2255,0.2255,[329440]|0.1566,0.1566,[329440]|0.208,0.208,[329440]|0.2209,0.2209,[329440]|0.2292,0.2292,[329440]|0.3668,0.3668,[329440]|0.3939,0.3939,[329440]|0.3263,0.3263,[329440]|0.3717,0.3717,[329440]|0.4513,0.4513,[329440]|0.4825,0.4825,[329440]|0.4245,0.4245,[329440]|0.3762,0.3762,[329440]|0.3399,0.3399,[329440]|0.3885,0.3885,[329440]|0.3053,0.3053,[329440]|0.2531,0.2531,[329440]|0.2385,0.2385,[329440]|0.1635,0.1635,[329440]|0.2041,0.2041,[329440]|0.208,0.208,[329440]|0.2865,0.2865,[329440]|0.3668,0.3668,[329440]|0.2865,0.2865,[329440]|0.27,0.27,[329440]|0.1805,0.1805,[329440]|0.1998,0.1998,[329440]|0.2602,0.2602,[329440]|0.2209,0.2209,[329440]|0.1766,0.1766,[329440]|0.1958,0.1958,[329440]|0.2209,0.2209,[329440]|0.2913,0.2913,[329440]|0.2913,0.2913,[329440]|0.2385,0.2385,[329440]|0.3096,0.3096,[329440]|0.4078,0.4078,[329440]|0.4749,0.4749,[329440]|0.5846,0.5846,[329440]|0.59,0.59,[329440]|0.6334,0.6334,[329440]|0.6681,0.6681,[329440]|0.6906,0.6906,[329440]|0.7869,0.7869,[329440]|0.835,0.835,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF Q93XJ9_SOLTU
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.3182,0.3182,[72144e]|0.2002,0.2002,[72144e]|0.1449,0.1449,[72144e]|0.2164,0.2164,[72144e]|0.2503,0.2503,[72144e]|0.268,0.268,[72144e]|0.3286,0.3286,[72144e]|0.2951,0.2951,[72144e]|0.2609,0.2609,[72144e]|0.2849,0.2849,[72144e]|0.3053,0.3053,[72144e]|0.2609,0.2609,[72144e]|0.2817,0.2817,[72144e]|0.2541,0.2541,[72144e]|0.2575,0.2575,[72144e]|0.2575,0.2575,[72144e]|0.2645,0.2645,[72144e]|0.2064,0.2064,[72144e]|0.2292,0.2292,[72144e]|0.3149,0.3149,[72144e]|0.2884,0.2884,[72144e]|0.2164,0.2164,[72144e]|0.1399,0.1399,[72144e]|0.2129,0.2129,[72144e]|0.2094,0.2094,[72144e]|0.1731,0.1731,[72144e]|0.1702,0.1702,[72144e]|0.1759,0.1759,[72144e]|0.1501,0.1501,[72144e]|0.2002,0.2002,[72144e]|0.247,0.247,[72144e]|0.2436,0.2436,[72144e]|0.1823,0.1823,[72144e]|0.2503,0.2503,[72144e]|0.1583,0.1583,[72144e]|0.1611,0.1611,[72144e]|0.2002,0.2002,[72144e]|0.2002,0.2002,[72144e]|0.1298,0.1298,[72144e]|0.1643,0.1643,[72144e]|0.1275,0.1275,[72144e]|0.107,0.107,[72144e]|0.087,0.087,[72144e]|0.087,0.087,[72144e]|0.1501,0.1501,[72144e]|0.1759,0.1759,[72144e]|0.2503,0.2503,[72144e]|0.2609,0.2609,[72144e]|0.2918,0.2918,[72144e]|0.2258,0.2258,[72144e]|0.2436,0.2436,[72144e]|0.1554,0.1554,[72144e]|0.1731,0.1731,[72144e]|0.0948,0.0948,[72144e]|0.1611,0.1611,[72144e]|0.1702,0.1702,[72144e]|0.2849,0.2849,[72144e]|0.2609,0.2609,[72144e]|0.2094,0.2094,[72144e]|0.1554,0.1554,[72144e]|0.1671,0.1671,[72144e]|0.1852,0.1852,[72144e]|0.2436,0.2436,[72144e]|0.2258,0.2258,[72144e]|0.3117,0.3117,[72144e]|0.3983,0.3983,[72144e]|0.4186,0.4186,[72144e]|0.3872,0.3872,[72144e]|0.374,0.374,[72144e]|0.3872,0.3872,[72144e]|0.2918,0.2918,[72144e]|0.391,0.391,[72144e]|0.2918,0.2918,[72144e]|0.384,0.384,[72144e]|0.2541,0.2541,[72144e]|0.3631,0.3631,[72144e]|0.3053,0.3053,[72144e]|0.2918,0.2918,[72144e]|0.2783,0.2783,[72144e]|0.2193,0.2193,[72144e]|0.2951,0.2951,[72144e]|0.3599,0.3599,[72144e]|0.3149,0.3149,[72144e]|0.2752,0.2752,[72144e]|0.2645,0.2645,[72144e]|0.2817,0.2817,[72144e]|0.2094,0.2094,[72144e]|0.1942,0.1942,[72144e]|0.1528,0.1528,[72144e]|0.1528,0.1528,[72144e]|0.1554,0.1554,[72144e]|0.1092,0.1092,[72144e]|0.1671,0.1671,[72144e]|0.1501,0.1501,[72144e]|0.2164,0.2164,[72144e]|0.2292,0.2292,[72144e]|0.3392,0.3392,[72144e]|0.3249,0.3249,[72144e]|0.2645,0.2645,[72144e]|0.2034,0.2034,[72144e]|0.2164,0.2164,[72144e]|0.3356,0.3356,[72144e]|0.3494,0.3494,[72144e]|0.3599,0.3599,[72144e]|0.494,0.494,[72144e]|0.494,0.494,[72144e]|0.4652,0.4652,[72144e]|0.4766,0.4766,[72144e]|0.4369,0.4369,[72144e]|0.3872,0.3872,[72144e]|0.3494,0.3494,[72144e]|0.3529,0.3529,[72144e]|0.2292,0.2292,[72144e]|0.2328,0.2328,[72144e]|0.2002,0.2002,[72144e]|0.1349,0.1349,[72144e]|0.1611,0.1611,[72144e]|0.1399,0.1399,[72144e]|0.0676,0.0676,[72144e]|0.078,0.078,[72144e]|0.1007,0.1007,[72144e]|0.1424,0.1424,[72144e]|0.0948,0.0948,[72144e]|0.0985,0.0985,[72144e]|0.0929,0.0929,[72144e]|0.0851,0.0851,[72144e]|0.0676,0.0676,[72144e]|0.0909,0.0909,[72144e]|0.1229,0.1229,[72144e]|0.1399,0.1399,[72144e]|0.1583,0.1583,[72144e]|0.1969,0.1969,[72144e]|0.2364,0.2364,[72144e]|0.2292,0.2292,[72144e]|0.3321,0.3321,[72144e]|0.3667,0.3667,[72144e]|0.3774,0.3774,[72144e]|0.4441,0.4441,[72144e]|0.3872,0.3872,[72144e]|0.384,0.384,[72144e]|0.5577,0.5577,[72144e]|0.5176,0.5176,[72144e]|0.6043,0.6043,[72144e]|0.5854,0.5854,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.8311,0.8311,[329440]|0.7912,0.7912,[329440]|0.7501,0.7501,[329440]|0.6255,0.6255,[329440]|0.5008,0.5008,[329440]|0.4825,0.4825,[329440]|0.4513,0.4513,[329440]|0.4078,0.4078,[329440]|0.3885,0.3885,[329440]|0.2786,0.2786,[329440]|0.1732,0.1732,[329440]|0.1921,0.1921,[329440]|0.2292,0.2292,[329440]|0.1635,0.1635,[329440]|0.2385,0.2385,[329440]|0.2041,0.2041,[329440]|0.138,0.138,[329440]|0.138,0.138,[329440]|0.1566,0.1566,[329440]|0.1698,0.1698,[329440]|0.1698,0.1698,[329440]|0.1698,0.1698,[329440]|0.138,0.138,[329440]|0.1566,0.1566,[329440]|0.1456,0.1456,[329440]|0.1266,0.1266,[329440]|0.0744,0.0744,[329440]|0.0744,0.0744,[329440]|0.0621,0.0621,[329440]|0.0965,0.0965,[329440]|0.1416,0.1416,[329440]|0.138,0.138,[329440]|0.1349,0.1349,[329440]|0.2041,0.2041,[329440]|0.138,0.138,[329440]|0.1667,0.1667,[329440]|0.1635,0.1635,[329440]|0.138,0.138,[329440]|0.1117,0.1117,[329440]|0.1635,0.1635,[329440]|0.1088,0.1088,[329440]|0.1041,0.1041,[329440]|0.0884,0.0884,[329440]|0.1266,0.1266,[329440]|0.1416,0.1416,[329440]|0.1018,0.1018,[329440]|0.1495,0.1495,[329440]|0.1732,0.1732,[329440]|0.1805,0.1805,[329440]|0.1805,0.1805,[329440]|0.2041,0.2041,[329440]|0.1566,0.1566,[329440]|0.1732,0.1732,[329440]|0.1117,0.1117,[329440]|0.1766,0.1766,[329440]|0.0991,0.0991,[329440]|0.1805,0.1805,[329440]|0.2292,0.2292,[329440]|0.2865,0.2865,[329440]|0.2292,0.2292,[329440]|0.2432,0.2432,[329440]|0.2041,0.2041,[329440]|0.2122,0.2122,[329440]|0.2432,0.2432,[329440]|0.3184,0.3184,[329440]|0.3535,0.3535,[329440]|0.3762,0.3762,[329440]|0.363,0.363,[329440]|0.3762,0.3762,[329440]|0.3717,0.3717,[329440]|0.3225,0.3225,[329440]|0.4078,0.4078,[329440]|0.3359,0.3359,[329440]|0.4458,0.4458,[329440]|0.3668,0.3668,[329440]|0.4879,0.4879,[329440]|0.3096,0.3096,[329440]|0.2865,0.2865,[329440]|0.2385,0.2385,[329440]|0.2865,0.2865,[329440]|0.3578,0.3578,[329440]|0.2865,0.2865,[329440]|0.3491,0.3491,[329440]|0.3359,0.3359,[329440]|0.208,0.208,[329440]|0.2167,0.2167,[329440]|0.1958,0.1958,[329440]|0.1635,0.1635,[329440]|0.1117,0.1117,[329440]|0.1088,0.1088,[329440]|0.1041,0.1041,[329440]|0.0858,0.0858,[329440]|0.1117,0.1117,[329440]|0.0643,0.0643,[329440]|0.1041,0.1041,[329440]|0.1041,0.1041,[329440]|0.2122,0.2122,[329440]|0.2292,0.2292,[329440]|0.2483,0.2483,[329440]|0.2333,0.2333,[329440]|0.1602,0.1602,[329440]|0.208,0.208,[329440]|0.2167,0.2167,[329440]|0.2209,0.2209,[329440]|0.3491,0.3491,[329440]|0.3717,0.3717,[329440]|0.3885,0.3885,[329440]|0.3806,0.3806,[329440]|0.3992,0.3992,[329440]|0.4116,0.4116,[329440]|0.3668,0.3668,[329440]|0.3263,0.3263,[329440]|0.2748,0.2748,[329440]|0.3225,0.3225,[329440]|0.2122,0.2122,[329440]|0.1635,0.1635,[329440]|0.1495,0.1495,[329440]|0.0991,0.0991,[329440]|0.1322,0.1322,[329440]|0.1292,0.1292,[329440]|0.1117,0.1117,[329440]|0.1667,0.1667,[329440]|0.1117,0.1117,[329440]|0.1018,0.1018,[329440]|0.0607,0.0607,[329440]|0.0723,0.0723,[329440]|0.0587,0.0587,[329440]|0.0643,0.0643,[329440]|0.0643,0.0643,[329440]|0.0771,0.0771,[329440]|0.1292,0.1292,[329440]|0.1766,0.1766,[329440]|0.1667,0.1667,[329440]|0.1667,0.1667,[329440]|0.2255,0.2255,[329440]|0.3225,0.3225,[329440]|0.3885,0.3885,[329440]|0.5008,0.5008,[329440]|0.5008,0.5008,[329440]|0.5667,0.5667,[329440]|0.7079,0.7079,[329440]|0.7342,0.7342,[329440]|0.835,0.835,[329440]|0.8746,0.8746,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+SEQUENCE_REF FER1_SOLLC
+LINE_GRAPH IUPredWS (Long) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.3286,0.3286,[72144e]|0.2094,0.2094,[72144e]|0.1528,0.1528,[72144e]|0.2258,0.2258,[72144e]|0.2609,0.2609,[72144e]|0.2752,0.2752,[72144e]|0.3356,0.3356,[72144e]|0.3249,0.3249,[72144e]|0.2918,0.2918,[72144e]|0.3149,0.3149,[72144e]|0.3321,0.3321,[72144e]|0.2884,0.2884,[72144e]|0.3087,0.3087,[72144e]|0.2849,0.2849,[72144e]|0.2849,0.2849,[72144e]|0.2849,0.2849,[72144e]|0.2951,0.2951,[72144e]|0.2364,0.2364,[72144e]|0.2575,0.2575,[72144e]|0.3426,0.3426,[72144e]|0.3149,0.3149,[72144e]|0.247,0.247,[72144e]|0.1643,0.1643,[72144e]|0.2436,0.2436,[72144e]|0.2399,0.2399,[72144e]|0.2034,0.2034,[72144e]|0.2002,0.2002,[72144e]|0.2064,0.2064,[72144e]|0.1823,0.1823,[72144e]|0.2094,0.2094,[72144e]|0.2609,0.2609,[72144e]|0.2575,0.2575,[72144e]|0.1942,0.1942,[72144e]|0.2645,0.2645,[72144e]|0.1759,0.1759,[72144e]|0.1791,0.1791,[72144e]|0.2193,0.2193,[72144e]|0.2193,0.2193,[72144e]|0.1476,0.1476,[72144e]|0.1852,0.1852,[72144e]|0.1424,0.1424,[72144e]|0.1206,0.1206,[72144e]|0.0985,0.0985,[72144e]|0.0985,0.0985,[72144e]|0.1671,0.1671,[72144e]|0.1942,0.1942,[72144e]|0.2817,0.2817,[72144e]|0.2918,0.2918,[72144e]|0.3215,0.3215,[72144e]|0.2575,0.2575,[72144e]|0.2752,0.2752,[72144e]|0.1823,0.1823,[72144e]|0.2034,0.2034,[72144e]|0.1206,0.1206,[72144e]|0.1969,0.1969,[72144e]|0.2034,0.2034,[72144e]|0.3182,0.3182,[72144e]|0.2951,0.2951,[72144e]|0.2436,0.2436,[72144e]|0.1852,0.1852,[72144e]|0.1969,0.1969,[72144e]|0.2193,0.2193,[72144e]|0.2817,0.2817,[72144e]|0.2645,0.2645,[72144e]|0.3494,0.3494,[72144e]|0.4369,0.4369,[72144e]|0.4541,0.4541,[72144e]|0.422,0.422,[72144e]|0.4017,0.4017,[72144e]|0.4186,0.4186,[72144e]|0.3215,0.3215,[72144e]|0.422,0.422,[72144e]|0.3215,0.3215,[72144e]|0.4119,0.4119,[72144e]|0.2884,0.2884,[72144e]|0.391,0.391,[72144e]|0.3321,0.3321,[72144e]|0.3182,0.3182,[72144e]|0.3053,0.3053,[72144e]|0.2541,0.2541,[72144e]|0.3286,0.3286,[72144e]|0.391,0.391,[72144e]|0.3529,0.3529,[72144e]|0.3117,0.3117,[72144e]|0.3019,0.3019,[72144e]|0.3182,0.3182,[72144e]|0.247,0.247,[72144e]|0.2292,0.2292,[72144e]|0.1852,0.1852,[72144e]|0.1852,0.1852,[72144e]|0.1823,0.1823,[72144e]|0.1298,0.1298,[72144e]|0.1942,0.1942,[72144e]|0.1759,0.1759,[72144e]|0.2436,0.2436,[72144e]|0.2609,0.2609,[72144e]|0.3631,0.3631,[72144e]|0.3667,0.3667,[72144e]|0.3087,0.3087,[72144e]|0.247,0.247,[72144e]|0.2609,0.2609,[72144e]|0.384,0.384,[72144e]|0.3983,0.3983,[72144e]|0.4087,0.4087,[72144e]|0.5419,0.5419,[72144e]|0.5419,0.5419,[72144e]|0.5139,0.5139,[72144e]|0.5211,0.5211,[72144e]|0.4831,0.4831,[72144e]|0.4292,0.4292,[72144e]|0.3948,0.3948,[72144e]|0.3983,0.3983,[72144e]|0.2884,0.2884,[72144e]|0.2884,0.2884,[72144e]|0.2541,0.2541,[72144e]|0.1791,0.1791,[72144e]|0.2094,0.2094,[72144e]|0.1823,0.1823,[72144e]|0.1823,0.1823,[72144e]|0.1881,0.1881,[72144e]|0.2224,0.2224,[72144e]|0.2884,0.2884,[72144e]|0.2164,0.2164,[72144e]|0.2164,0.2164,[72144e]|0.2064,0.2064,[72144e]|0.1942,0.1942,[72144e]|0.1643,0.1643,[72144e]|0.2064,0.2064,[72144e]|0.2541,0.2541,[72144e]|0.2783,0.2783,[72144e]|0.3019,0.3019,[72144e]|0.3494,0.3494,[72144e]|0.391,0.391,[72144e]|0.3807,0.3807,[72144e]|0.4864,0.4864,[72144e]|0.5342,0.5342,[72144e]|0.5533,0.5533,[72144e]|0.6576,0.6576,[72144e]|0.5901,0.5901,[72144e]|0.6043,0.6043,[72144e]|0.5951,0.5951,[72144e]|0.5493,0.5493,[72144e]|0.6427,0.6427,[72144e]|0.6227,0.6227,[72144e]|
+GRAPHLINE IUPredWS (Long) 0.5 Above 0.5 indicates disorder ff0000
+LINE_GRAPH IUPredWS (Short) <html>Protein Disorder with IUPredWS - raw scores<br/>Above 0.5 indicates disorder</html> 0.8391,0.8391,[329440]|0.8001,0.8001,[329440]|0.7573,0.7573,[329440]|0.6334,0.6334,[329440]|0.5173,0.5173,[329440]|0.5008,0.5008,[329440]|0.4703,0.4703,[329440]|0.4245,0.4245,[329440]|0.4116,0.4116,[329440]|0.3263,0.3263,[329440]|0.2167,0.2167,[329440]|0.2385,0.2385,[329440]|0.2786,0.2786,[329440]|0.2041,0.2041,[329440]|0.2865,0.2865,[329440]|0.2531,0.2531,[329440]|0.1805,0.1805,[329440]|0.1766,0.1766,[329440]|0.1958,0.1958,[329440]|0.2122,0.2122,[329440]|0.208,0.208,[329440]|0.2122,0.2122,[329440]|0.1766,0.1766,[329440]|0.1921,0.1921,[329440]|0.1844,0.1844,[329440]|0.1602,0.1602,[329440]|0.0991,0.0991,[329440]|0.1018,0.1018,[329440]|0.0858,0.0858,[329440]|0.1041,0.1041,[329440]|0.1566,0.1566,[329440]|0.1495,0.1495,[329440]|0.1495,0.1495,[329440]|0.2167,0.2167,[329440]|0.1495,0.1495,[329440]|0.1766,0.1766,[329440]|0.1732,0.1732,[329440]|0.1456,0.1456,[329440]|0.1205,0.1205,[329440]|0.1732,0.1732,[329440]|0.115,0.115,[329440]|0.1088,0.1088,[329440]|0.0935,0.0935,[329440]|0.1292,0.1292,[329440]|0.1456,0.1456,[329440]|0.1018,0.1018,[329440]|0.1532,0.1532,[329440]|0.1732,0.1732,[329440]|0.1878,0.1878,[329440]|0.1878,0.1878,[329440]|0.2122,0.2122,[329440]|0.1602,0.1602,[329440]|0.1766,0.1766,[329440]|0.1178,0.1178,[329440]|0.1844,0.1844,[329440]|0.1018,0.1018,[329440]|0.1844,0.1844,[329440]|0.2333,0.2333,[329440]|0.2913,0.2913,[329440]|0.2333,0.2333,[329440]|0.2483,0.2483,[329440]|0.208,0.208,[329440]|0.2167,0.2167,[329440]|0.2531,0.2531,[329440]|0.3263,0.3263,[329440]|0.3578,0.3578,[329440]|0.3806,0.3806,[329440]|0.3668,0.3668,[329440]|0.3762,0.3762,[329440]|0.3717,0.3717,[329440]|0.3225,0.3225,[329440]|0.4116,0.4116,[329440]|0.3399,0.3399,[329440]|0.4513,0.4513,[329440]|0.3717,0.3717,[329440]|0.4879,0.4879,[329440]|0.3146,0.3146,[329440]|0.2865,0.2865,[329440]|0.2385,0.2385,[329440]|0.2865,0.2865,[329440]|0.363,0.363,[329440]|0.2913,0.2913,[329440]|0.3535,0.3535,[329440]|0.3359,0.3359,[329440]|0.2122,0.2122,[329440]|0.2209,0.2209,[329440]|0.1998,0.1998,[329440]|0.1667,0.1667,[329440]|0.115,0.115,[329440]|0.115,0.115,[329440]|0.106,0.106,[329440]|0.0884,0.0884,[329440]|0.1205,0.1205,[329440]|0.0723,0.0723,[329440]|0.115,0.115,[329440]|0.115,0.115,[329440]|0.2292,0.2292,[329440]|0.2558,0.2558,[329440]|0.2786,0.2786,[329440]|0.2786,0.2786,[329440]|0.1958,0.1958,[329440]|0.2558,0.2558,[329440]|0.27,0.27,[329440]|0.2865,0.2865,[329440]|0.4149,0.4149,[329440]|0.442,0.442,[329440]|0.4651,0.4651,[329440]|0.46,0.46,[329440]|0.4781,0.4781,[329440]|0.4879,0.4879,[329440]|0.4513,0.4513,[329440]|0.4078,0.4078,[329440]|0.3491,0.3491,[329440]|0.3992,0.3992,[329440]|0.3146,0.3146,[329440]|0.2602,0.2602,[329440]|0.2385,0.2385,[329440]|0.1698,0.1698,[329440]|0.2167,0.2167,[329440]|0.1921,0.1921,[329440]|0.2748,0.2748,[329440]|0.3456,0.3456,[329440]|0.27,0.27,[329440]|0.2432,0.2432,[329440]|0.1667,0.1667,[329440]|0.1844,0.1844,[329440]|0.1635,0.1635,[329440]|0.1805,0.1805,[329440]|0.1844,0.1844,[329440]|0.2041,0.2041,[329440]|0.2913,0.2913,[329440]|0.3535,0.3535,[329440]|0.3399,0.3399,[329440]|0.3399,0.3399,[329440]|0.3806,0.3806,[329440]|0.4781,0.4781,[329440]|0.5374,0.5374,[329440]|0.6442,0.6442,[329440]|0.6442,0.6442,[329440]|0.7111,0.7111,[329440]|0.7458,0.7458,[329440]|0.7724,0.7724,[329440]|0.865,0.865,[329440]|0.9009,0.9009,[329440]|
+GRAPHLINE IUPredWS (Short) 0.5 Above 0.5 indicates disorder ff0000
+
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COLOUR IUPredWS (Long) 72144e
+COLOUR IUPredWS (Short) 329440
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF Q93XJ9_SOLTU
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF FER_CAPAA
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF FER_CAPAN
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF FER1_MESCR
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF FER1_SPIOL
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF FER1_PEA
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF Q7XA98_TRIPR
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF O80429_MAIZE
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF FER1_MAIZE
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF FER3_RAPSA
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF FER_BRANA
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF FER1_ARATH
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF Q93Z60_ARATH
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF FER2_ARATH
+COMBINE IUPredWS (Long) IUPredWS (Short)
+
+SEQUENCE_REF FER1_SOLLC
+# takes the current reference sequence and makes it the reference for the view
+VIEW_SETREF
+# nominal name for new hide columns command
+HIDE_INSERTIONS
<mapID target="calcs.alquality" url="html/calculations/quality.html"/>
<mapID target="calcs.alconserv" url="html/calculations/conservation.html"/>
<mapID target="calcs.alstrconsensus" url="html/calculations/structureconsensus.html"/>
- <mapID target="calcs.consensus" url="html/calculations/consensus.html"/>
+ <mapID target="calcs.consensus" url="html/calculations/consensus.html"/>
+ <mapID target="calcs.annotation" url="html/calculations/columnFilterByAnnotation.html"/>
<mapID target="nucleicAcids" url="html/na/index.html"/>
<tocitem text="Tree/PCA Input Data" target="recoverInputdata" />
<tocitem text="Pairwise Alignments" target="pairwise" />
<tocitem text="Remove Redundancy" target="redundancy" />
+ <tocitem text="Select Column by Annotation" target="calcs.annotation" />
</tocitem>
<tocitem text="Sequence Annotations" target="seqannots" expand="true">
<tocitem text="Annotation from Structure" target="xsspannotation" expand="false" />
--- /dev/null
+<html>
+<!--
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
+ * Copyright (C) 2014 The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ -->
+<head>
+<title>Filter Columns by Annotation</title>
+</head>
+
+<body>
+ <p>
+ <strong> Filter Columns by Annotation </strong>
+ </p>
+ <p>Jalview allows the columns of an alignment to be filtered using
+ any annotation rows added to that alignment.</p>
+ From "Select" menu
+ <strong>→</strong> "Select by Annotation..." to bring
+ up the Select by Annotation window. The filter options vary depending
+ on the type of annotation selected. If an annotation that has a numeric
+ values is selected, the threshold filter option is activated as seen in the
+ figure on the right below.
+ <br>
+ <br>
+
+ <div style="width: 48%; float: left; margin-left: 4%">
+ <img src="annotationColumnSelectionWithoutSM.gif">
+ </div>
+ <div style="width: 48%; float: right">
+ <img src="annotationColumnSelectionWithSM.gif">
+ </div>
+ <div> </div>
+
+ <ul>
+ <li>Select which annotation to base the filtering on using the
+ top-most selection box.</li>
+
+ <li><strong>Search Filter</strong>
+ <ul>
+ <li>When a text is entered in the textfield on the search
+ filter section, the "Display Label" and "Description"
+ checkboxes becomes selectable.</li>
+ <li>On selecting any of the checkboxes, a regular expresion
+ search (RegEx) is executed on the specified field of the current
+ annotation row selected, and the matching columns will be highlighted
+ in the alignment.</li>
+ </ul>
+ <li><strong>Structure Filter</strong>
+ <ul>
+ <li>Alignment columns can also be filtered by the type of
+ secondary structure present in a choosen annotation row.</li>
+ <li>This can be achieved by ticking the type of structure you
+ wish to filter by under the structures filter section.</li>
+ </ul>
+ <li><strong>Threshold Filter</strong>
+ <ul>
+ <li>This filter is only activated for annotation which contain
+ numeric values</li>
+ <li>Select whether to Filter the alignment above or below an
+ adjustable threshold with the selection box within the threshold
+ filter section.</li>
+ <li>Change the threshold value with the slider, or enter the
+ exact value in the text box.</li>
+ </ul>
+ <li><strong>Actions</strong>
+ <ul>
+ <li>The "Select" and "Hide" radio buttons
+ determines the action that will be carried out on the matching
+ columns in the alignment during the filtering process.</li>
+ <li>The default option is "Select" and this simply
+ enables column selection on the matching alignment column.</li>
+ <li>While the "Hide" option enables the matching columns to
+ be hidden automatically during the filtering process.</li>
+ <li>The "Ok" button applies the filter when clicked.</li>
+ <li>And finally, The "Cancel" button restores the alignment to its previous state before the filtering when clicked.
+ </ul></li>
+ </ul>
+
+</body>
+</html>
text file consisting of tab delimited records similar to the <a
href="featuresFormat.html">Sequence Features File</a>, and introduced
primarily for use with the Jalview applet.</p>
-<p>Alignment annotations files are imported into Jalview in the
-following ways:<br>
+
+<p><strong>Importing annotation files</strong><br/>
+Alignment annotations files are imported into Jalview in the
+following ways:<br/>
<ul>
<li>from the command line<strong><pre>
-annotations <<em>Annotations filename</em>></pre></strong></li>
menu of an alignment window.</li>
</ul>
</p>
-<p><h3><font face="Arial, Helvetica, sans-serif">Format of an Annotations File</font></h3>
-<p>The file consists of lines containing an instruction followed by
-tab delimited fields, and any lines starting with "#" are
-ignored. The first non-commented out line of a valid Annotations file
+<p>
+ <strong>Exporting annotation files</strong><br /> An annotation file
+ can be created for any alignment view from the "Export
+ Annotations ..." entry in the <strong>File</strong> menu of an
+ alignment window.
+</p>
+<p><strong>THE ANNOTATION FILE FORMAT</strong>
+<br/>An annotation file consists of lines containing an instruction followed by
+tab delimited fields. Any lines starting with "#" are considered comments, and
+ignored. The sections below describe the structure of an annotation file.
+</p><ul>
+<li><a href="#annheader">JALVIEW_ANNOTATION</a> mandatory header</li>
+<li><a href="#annrows">LINE_GRAPH, BAR_GRAPH and NO_GRAPH</a> to create annotation rows</li>
+<li><a href="#combine">COMBINE, COLOUR and GRAPHLINE</a> for thresholds and complex line graphs</li>
+<li><a href="#annrowprops">ROWPROPERTIES</a> control the display of individual annotation rows</li>
+<li><a href="#groupdefs">SEQUENCE_GROUP</a> to define groups of sequences for further annotation</li>
+<li><a href="#groupprops">PROPERTIES</a> to set visualisation properties for sequence groups</li>
+<li><a href="#seqgrprefs">SEQUENCE_REF and GROUP_REF</a> for attaching annotation to sequences and groups</li>
+ <li><a href="#refsandviews">VIEW_SETREF, VIEW_HIDECOLS and HIDE_INSERTIONS</a>
+ for defining a reference sequence on the alignment and hiding regions
+ based on gaps in a reference sequence</li>
+ </ul>
+ <p>
+ At the end of this document, you can also find notes on <a
+ href="#compatibility">compatibility</a> of annotation files across
+ different versions of Jalview. An <a href="#exampleann">example
+ annotation file</a> is also provided along with instructions on how to
+ import it to Jalview.
+ </p>
+ <hr/>
+<p><strong><em><a name="annheader">Header line</a></em></strong><br/>The first non-commented out line of a valid Annotations file
must begin with :<strong><pre>JALVIEW_ANNOTATION</pre></strong></p>
-<p>A row of annotation is added with a line like <strong><pre><em>GRAPH_TYPE</em>	<em>Label</em>	<em>Description</em> (optional)	<em>Values</em></pre></strong></p>
+<hr/>
+<p><strong><em><a name="annrows">LINE_GRAPH, BAR_GRAPH and NO_GRAPH</a></em></strong><br/>
+Labels, secondary structure, histograms and line graphs are added with a line like <strong><pre><em>GRAPH_TYPE</em>	<em>Label</em>	<em>Description</em> (optional)	<em>Values</em></pre></strong></p>
<p>
- The <em>GRAPH_TYPE</em> field, which appears first, defines the
+ Here, the <em>GRAPH_TYPE</em> field in the first column defines the
appearance of the annotation row when rendered by Jalview. The next
field is the row <em>label</em> for the annotation. This may be
followed by a <em>description</em> for the row, which is shown in a
tooltip when the user mouses over the annotation row's label. Since
- Jalview 2.7, the description field may also contain html in the same
- way as a <a href="featuresFile.html">sequence feature's</a> label,
- providing the html is enclosed in an <html/> tag.
+ Jalview 2.7, the description field may also contain HTML tags (in the same
+ way as a <a href="featuresFile.html">sequence feature's</a> label),
+ providing the text is enclosed in an <html/> tag.
- <ul><em>Please note: URL links embedded in HTML descriptions will
- be supported in a future release of Jalview</em>
+ <ul><em>Please note: URL links embedded in HTML descriptions are not yet supported.</em>
</ul>
</p>
<p>The final <em>Values</em>
field contains a series of "|" separated value fields. Each
value field is itself a comma separated list of fields of a particular
- type defined by the annotation row's GRAPH_TYPE. The allowed values of
- GRAPH_TYPE and the format of their respective value fields (with the
- trailing "<strong>|</strong>" symbol) are shown below:
+ type defined by the annotation row's <em>GRAPH_TYPE</em>. The allowed values of
+ <em>GRAPH_TYPE</em> and corresponding interpretation of each <em>Value</em> are shown below:
<ul>
- <li>BAR_GRAPH<br> Plots a histogram with labels below each
+ <li><strong>BAR_GRAPH</strong><br> Plots a histogram with labels below each
bar.<br> <em>number</em>,<em>text character</em>,<em>Tooltip
text</em>
</li>
- <li>LINE_GRAPH<br> Draws a line between values on the
+ <li><strong>LINE_GRAPH</strong><br> Draws a line between values on the
annotation row.<br> <em>number</em>
</li>
- <li>NO_GRAPH<br> For a row consisting of text labels and/or
- secondary structure symbols.<br> <em>{Secondary Structure
- Symbol}</em>,<em>text label</em>,<em>Tooltip text</em><br> Currently
- supported secondary structure structure symbols are <em>H</em> (for
- helix) and <em>E</em> (for strand)</li>
+ <li><strong>NO_GRAPH</strong><br>For a row consisting of text labels and/or
+ secondary structure symbols.<br><em>{Secondary Structure
+ Symbol}</em>,<em>text label</em>,<em>Tooltip text</em><br/><br/>The type of secondary structure symbol depends on the alignment being annotated being either Protein or RNA. <br/>For proteins, structure symbols are <em>H</em> (for
+ helix) and <em>E</em> (for strand)<br/><br/>For RNA, VIENNA, WUSS or extended notation can be used to specify positions that are paired (e.g. "(|(||)|)" or "|A|A|A|(|a|a|a|)")</li>
</ul>
Any or all value fields may be left empty, as well as the BAR_GRAPH's
text character field, and either or both of the text-label and secondary
structure symbol fields of the NO_GRAPH type annotation rows.</p>
<p>Color strings can be embedded in a value field by enclosing an RGB triplet in square brackets to colour that position in an annotation row.
</p>
-<p><h3><font face="Arial, Helvetica, sans-serif">SEQUENCE_REF and GROUP_REF</font></h3>
+<hr/>
+<p><strong><a name="combine">COMBINE, COLOUR and GRAPHLINE</a> for line graphs</font></strong><br/>
+<em>LINE_GRAPH</em> type annotations can be given a colour
+(specified as 24 bit RGB triplet in hexadecimal or comma separated
+values), combined onto the same vertical axis, and have ordinate lines
+(horizontal lines at a particular vertical axis value) using the
+following commands (respectively):
+<pre>COLOUR	<em>graph_name</em>	<em>colour</em>
+COMBINE	<em>graph_1_name</em>	<em>graph_2_name</em>
+GRAPHLINE	<em>graph_name</em>	<em>value</em>	<em>label</em>	<em>colour</em><strong><em>
+</em></strong></pre>
+</p>
+<hr/>
+<p><strong><a name="annrowprops">ROWPROPERTIES</a></strong><br/>
+The visual display properties for a set of annotation rows can be modified using the following tab-delimited line:</p>
+<pre>ROWPROPERTIES	<em>Row label</em>	<em>centrelabs=true( or false)</em>	<em>showalllabs=true(default is false)</em>	<em>scaletofit=true (default is false)</em></pre>
+<p>This sets the visual display properties according to the given values for all the annotation rows with labels matching <em>Row label</em>. The properties mostly affect the display of multi-character column labels, and are as follows:
+<ul><li><em>centrelabs</em> Centre each label on its column.</li>
+<li><em>showalllabs</em> Show every column label rather than only the first of a run of identical labels (setting this to true can have a drastic effect on secondary structure rows).</li>
+<li><em>scaletofit</em> Shrink each label's font size so that the label fits within the column. Useful when annotating an alignment with a specific column numbering system. (<em>Not available in Jalview applet due to AWT 1.1 limitations</em>)</li>
+</ul></p>
+<p><strong><a name="groupdefs">SEQUENCE_GROUP</a></strong><br/>
+Groups of sequences and column ranges can be defined using a tab delimited statement like:</p>
+<pre>SEQUENCE_GROUP	Group_Name	Group_Start	Group_End	<em>Sequences</em></pre>
+<p>The sequences can be defined by alignment index and a range of sequences can
+ be defined in a comma delimited field such as</p>
+<p>2-5,8-15,20,22</p>
+<p>Enter * to select all groups. </p>
+<p><strong>Note:</strong> If the alignment indices are not known, enter -1, followed by a tab and then a tab delimited list
+of sequence IDs. </p>
+<p>If a <a href="#seqgrprefs"><strong>SEQUENCE_REF</strong></a> has been defined, then <em>group_start</em> and <em>group_end</em> will be
+ relative to the sequence residue numbering, otherwise the <em>group_start</em> and <em>group_end</em>
+ will be alignment column indices. </p>
+<hr/>
+<p><strong><a name="groupprops">PROPERTIES</a></strong><br/>This statement allows various visualisation properties to be assigned to a named group. This takes a series of tab-delimited <em>key</em>=<em>value</em> pairs:</p>
+<pre>PROPERTIES	Group_name	tab_delimited_key_value_pairs
+</pre>
+<p>The currently supported set of sequence group key-value pairs that can be provided here are :</p>
+<table border="1">
+<tbody><tr><td width="50%">Key</td><td>Value</td></tr>
+<tr><td width="50%">description</td><td>Text - may include simple HTML tags</td></tr>
+<tr><td width="50%">colour</td><td>A string resolving to a valid Jalview colourscheme (e.g. Helix Propensity)</td></tr>
+<tr><td width="50%">pidThreshold</td><td>A number from 0-100 specifying the Percent Identity Threshold for colouring columns in the group or alignment</td></tr>
+<tr><td width="50%">consThreshold</td><td>A number from 0-100 specifying the degree of bleaching applied for conservation colouring</td></tr>
+<tr><td width="50%">outlineColour</td><td>Line colour used for outlining the group (default is red)</td></tr>
+<tr><td width="50%">displayBoxes</td><td>Boolean (default true) controlling display of shaded box for each alignment position</td></tr>
+<tr><td width="50%">displayText</td><td>Boolean (default true) controlling display of text for each alignment position</td></tr>
+<tr><td width="50%">colourText</td><td>Boolean (default false) specifying whether text should be shaded by applied colourscheme</td></tr>
+<tr><td width="50%">textCol1</td><td>Colour for text when shown on a light background</td></tr>
+<tr><td width="50%">textCol2</td><td>Colour for text when shown on a dark background</td></tr>
+<tr><td width="50%">textColThreshold</td><td>Number from 0-100 specifying switching threshold between light and dark background</td></tr>
+<tr><td width="50%">idColour</td><td>Colour for highlighting the Sequence ID labels for this group<br/>If <em>idColour</em> is given but <em>colour</em> is not, then idColor will also be used for the group background colour.</td></tr>
+<tr><td width="50%">showunconserved</td><td>Boolean (default false) indicating whether residues should only be shown that are different from current reference or consensus sequence</td></tr>
+<tr><td width="50%">hide</td><td>Boolean (default false) indicating whether the rows in this group should be marked as hidden.<br/><em>Note:</em> if the group is sequence associated (specified by SEQUENCE_REF), then all members will be hidden and marked as represented by the reference sequence.</td></tr>
+<!-- <tr><td width="50%">hidecols</td><td>Boolean (default false) indicating whether columns in this groushould be marked as hidden</td></tr> --></tbody>
+</table>
+
+<p><strong>Specifying colours in PROPERTIES key-value pairs</strong><br/>
+The <strong>colour</strong> property can take either a colour scheme name,
+ or a single colour specification (either a colour name like 'red' or an RGB
+ triplet like 'ff0066'). If a single colour is specified, then the group
+ will be coloured with that colour.</p>
+ <hr/>
+ <p><strong><a name="seqgrprefs">SEQUENCE_REF and GROUP_REF</a></strong><br/>
By
default, annotation is associated with the alignment as a whole.
However, it is also possible to have an annotation row associated with
Group association is turned off for subsequent annotation rows by:
<pre>GROUP_REF	<em>ALIGNMENT</em></pre>
</p>
-<h3><font face="Arial, Helvetica, sans-serif">LINE_GRAPH Grouping</font></h3>
-<p><em>LINE_GRAPH</em> type annotations can be given a colour
-(specified as 24 bit RGB triplet in hexadecimal or comma separated
-values), combined onto the same vertical axis, and have ordinate lines
-(horizontal lines at a particular vertical axis value) using the
-following commands (respectively):
-<pre>COLOUR	<em>graph_name</em>	<em>colour</em>
-COMBINE	<em>graph_1_name</em>	<em>graph_2_name</em>
-GRAPHLINE	<em>graph_name</em>	<em>value</em>	<em>label</em>	<em>colour</em><strong><em>
-</em></strong></pre>
-</p>
-<h3><font face="Arial, Helvetica, sans-serif">(Since Jalview 2.5) ROWPROPERTIES</font></h3>
-<p>The visual display properties for a set of annotation rows can be modified using the following tab-delimited line:</p>
-<pre>ROWPROPERTIES	<em>Row label</em>	<em>centrelabs=true( or false)</em>	<em>showalllabs=true(default is false)</em>	<em>scaletofit=true (default is false)</em></pre>
-<p>This sets the visual display properties according to the given values for all the annotation rows with labels matching <em>Row label</em>. The properties mostly affect the display of multi-character column labels, and are as follows:
-<ul><li><em>centrelabs</em> Centre each label on its column.</li>
-<li><em>showalllabs</em> Show every column label rather than only the first of a run of identical labels (setting this to true can have a drastic effect on secondary structure rows).</li>
-<li><em>scaletofit</em> Shrink each label's font size so that the label fits within the column. Useful when annotating an alignment with a specific column numbering system. (<em>Not available in Jalview applet due to AWT 1.1 limitations</em>)</li>
-</ul></p>
-<h3><font face="Arial, Helvetica, sans-serif">(Since Jalview 2.2.1) SEQUENCE_GROUP</font></h3>
-<p>Groups of sequences can be defined using the tab delimited line</p>
-<pre>SEQUENCE_GROUP Group_Name Group_Start Group_End <em>Sequences</em></pre>
-<p>The sequences can be defined by alignment index and a range of sequences can
- be defined in a comma delimited field such as</p>
-<p>2-5,8-15,20,22</p>
-<p>Enter * to select all groups. </p>
-<p><strong>Note:</strong> If the alignment indices are not known, enter -1, followed by a tab and then a tab delimited list
-specifying the sequence ids. </p>
-<p>If the SEQUENCE_REF has been defined, the group_start and group_end will be
- relative to the sequence residue numbering, otherwise the group_start and group_end
- will be the alignment column indices. </p>
-<p>The group can (optionally) be assigned various visualisation properties via
- another tab delimited line thus:</p>
-<pre>PROPERTIES Group_name tab_delimited_key_value_pairs
-</pre>
-<p>The key_value_pairs allow you to define a description and to colour the group
- in various ways. All, none or some of the following values could be used for
- a group:</p>
-<p>description=Text <br>
- colour=Helix Propensity<br>
- pidThreshold=0<br>
- consThreshold=0<br>
- outlineColour=red <br>
- displayBoxes=true<br>
- displayText=false<br>
- colourText=false<br>
- textCol1=black<br>
- textCol2=black<br>
- textColThreshold=0<br>
- idColour=ff3322<br>
- <!-- Not yet implemented in 2.5 release
- hide=false<br>
- hidecols=false<br> -->
- showunconserved=false</p>
-<ul><li><em>New Features in 2.4:</em><br>if the <strong>idColour</strong> property
-is given without specifying a colour scheme with the <strong>colour</strong>
-property, then the idColour will also be used to colour the sequence.</li>
-<li>the <strong>colour</strong> property can take either a colour scheme name,
- or a single colour specification (either a colour name like 'red' or an RGB
- triplet like 'ff0066'). If a single colour is specified, then the group
- will be coloured with that colour.</li>
- <!-- <li><em>New Features in 2.5</em></li>
- <li>hide and hidecols instruct jalview to hide the sequences or columns covered by the group.</li> -->
- <li>Sequence associated Groups<br>If a group is defined after a valid
- <em>SEQUENCE_REF</em> sequence reference statement, the sequence representative
- for the group will be set to the referenced sequence.<!-- <br><strong>Note:</strong> if the <em>hide</em>
- property is set then only the representative sequence for the group will be shown in the alignment.--></li>
- <li>The interpretation of the COMBINE statement in <em>Version 2.8.1</em> was refined
+<hr/>
+<p><strong><a name="refsandviews">VIEW_SETREF, VIEW_HIDECOL and HIDE_INSERTIONS</a></strong><br/>
+Since Jalview 2.9, the Annotations file has also supported the definition of views on the alignment, and definition of hidden regions.</p>
+<!-- <p>
+ <em>VIEW_DEF</em> allows the current view to be named according to the
+ first argument after the tab character. If a second argument is
+ provided, then a new view is created with the given name, and
+ properties.
+ </p> -->
+ <p>
+ <em>VIEW_SETREF</em> takes either a single sequence ID string, or a
+ numeric index (second argument), and attempts to assign a
+ corresponding sequence as the <a href="../features/refsequence.html">reference
+ sequence</a> for the alignment.
+ </p>
+ <em>VIEW_HIDECOLS</em> takes either a single argument consisting of a
+ comma separated series of integer pairs like
+ <em>3-4</em>. These integer pairs define columns (starting from the
+ left-hand column 0) that should be marked as hidden in the alignment
+ view.
+ </p>
+ <p>
+ <em>HIDE_INSERTIONS</em> takes a either a single sequence ID or a
+ numeric index, or no arguments. This command marks all gapped
+ positions in a specified sequence (either the one located by the
+ arguments, the current SEQUENCE_REF, or the reference sequence for the
+ view).
+ <hr/>
+<p><strong><a name="compatibility">COMPATIBILITY NOTES</a></strong><br/>
+ The interpretation of the COMBINE statement in <em>Version 2.8.1</em> was refined
so that only annotation line graphs with the given names ands the same
- <strong>SEQUENCE_REF</strong> and <strong>GROUP_REF</strong> scope are grouped.</li>
-</ul>
-<p> </p>
-<p>An example Annotation file is given below:
+ <strong>SEQUENCE_REF</strong> and <strong>GROUP_REF</strong> scope are grouped.</p>
+ <hr/>
+
+<p><strong><a name="exampleann">EXAMPLES</a></strong><br/>
+An example Annotation file is given below. Copy and paste the contents into a text file and load it onto the Jalview example protein alignment.</p>
<pre>#Comment lines follow the hash symbol
JALVIEW_ANNOTATION
SEQUENCE_REF	FER1_MESCR	5
PROPERTIES	Group_C	colour=Clustal
</pre>
</p>
-<p><em>Last updated for version 2.8.1</em></p>
</body>
</html>
action.by_id = by Id
action.by_length = by Length
action.by_group = by Group
+action.unmark_as_reference = Unmark as Reference
+action.set_as_reference = Set as Reference
action.remove = Remove
-action.remove_redundancy = Remove Redundancy
+action.remove_redundancy = Remove Redundancy...
action.pairwise_alignment = Pairwise Alignments...
action.by_rna_helixes = by RNA Helices
action.user_defined = User Defined...
label.view_full_application = View in Full Application
label.load_associated_tree = Load Associated Tree ...
label.load_features_annotations = Load Features/Annotations ...
-label.export_features = Export Features
-label.export_annotations = Export Annotations
+label.export_features = Export Features ...
+label.export_annotations = Export Annotations ...
label.jalview_copy = Copy (Jalview Only)
label.jalview_cut = Cut (Jalview Only)
label.to_upper_case = To Upper Case
label.use_modeller_output = Use Modeller Output
label.wrap_alignment = Wrap Alignment
label.right_align_ids = Right Align Ids
-label.sequence_name_italics = Seq Name Italics
+label.sequence_name_italics = Sequence Name Italics
label.open_overview = Open Overview
label.default_colour_scheme_for_alignment = Default Colour Scheme for alignment
label.annotation_shading_default = Annotation Shading Default
label.normalise_logo = Normalise Logo
label.no_colour_selection_in_scheme = Please, make a colour selection before to apply colour scheme
label.no_colour_selection_warn = Error saving colour scheme
+label.select_by_annotation = Select By Annotation
+action.select_by_annotation = Select by Annotation...
+label.threshold_filter = Threshold Filter
+action.hide = Hide
+action.select = Select
+label.alpha_helix = Alpha Helix
+label.beta_strand = Beta Strand
+label.turn = Turn
+label.select_all = Select All
+label.structures_filter = Structures Filter
+label.search_filter = Search Filter
+label.display_name = Display Label
+label.description = Description
StructureMapping[] mapping = ssm.getMapping(pdbentry.getFile());
boolean showFeatures = false;
- if (ap.av.getShowSequenceFeatures())
+ if (ap.av.isShowSequenceFeatures())
{
if (fr == null)
{
boolean seqColoursReady = false;
- jalview.gui.FeatureRenderer fr;
+ jalview.renderer.seqfeatures.FeatureRenderer fr;
Color backgroundColour = Color.black;
StructureMapping[] mapping = ssm.getMapping(pdbentry.getFile());
boolean showFeatures = false;
- if (ap.av.getShowSequenceFeatures())
+ if (ap.av.isShowSequenceFeatures())
{
if (fr == null)
{
int[][] cons2;
+ private String[] consSymbs;
+
/**
* Creates a new Conservation object.
*
{
consString.append('-');
}
-
+ consSymbs = new String[end-start+1];
for (int i = start; i <= end; i++)
{
gapcons = countConsNGaps(i);
totGaps = gapcons[1];
pgaps = ((float) totGaps * 100) / (float) sequences.length;
-
+ consSymbs[i-start]=new String();
+
if (percentageGaps > pgaps)
{
resultHash = total[i - start];
-
// Now find the verdict
count = 0;
enumeration = resultHash.keys();
{
type = (String) enumeration.nextElement();
result = (Integer) resultHash.get(type);
-
// Do we want to count +ve conservation or +ve and -ve cons.?
if (consflag)
{
if (result.intValue() == 1)
{
+ consSymbs[i-start] = type+" "+consSymbs[i-start];
count++;
}
}
{
if (result.intValue() != -1)
{
+ {
+ if (result.intValue()==0) {
+ consSymbs[i-start] = consSymbs[i-start]+ " !"+type;
+ } else {
+ consSymbs[i-start] = type+" "+consSymbs[i-start];
+ }
+ }
+
count++;
}
}
float vprop = value - min;
vprop /= max;
conservation.annotations[i] = new Annotation(String.valueOf(c),
- String.valueOf(value), ' ', value, new Color(minR
+ consSymbs[i-start], ' ', value, new Color(minR
+ (maxR * vprop), minG + (maxG * vprop), minB
+ (maxB * vprop)));
{
continue;
}
-
+// if invalid string used, then regex has no matched to/from
int sres = seq
.findPosition(resIndex
+ Integer.parseInt(spaces.elementAt(resIndex)
*/
package jalview.analysis;
-import java.util.*;
-
import jalview.api.analysis.ScoreModelI;
-import jalview.datamodel.*;
-import jalview.io.*;
-import jalview.schemes.*;
-import jalview.util.*;
+import jalview.datamodel.AlignmentView;
+import jalview.datamodel.BinaryNode;
+import jalview.datamodel.CigarArray;
+import jalview.datamodel.NodeTransformI;
+import jalview.datamodel.SeqCigar;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceI;
+import jalview.datamodel.SequenceNode;
+import jalview.io.NewickFile;
+import jalview.schemes.ResidueProperties;
+
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Vector;
/**
* DOCUMENT ME!
* DOCUMENT ME!
*/
public NJTree(SequenceI[] sequence, AlignmentView seqData, String type,
- String pwtype, int start, int end)
+ String pwtype, ScoreModelI sm, int start, int end)
{
this.sequence = sequence;
this.node = new Vector();
type = "AV";
}
- if (!(pwtype.equals("PID")))
+ if (sm == null && !(pwtype.equals("PID")))
{
if (ResidueProperties.getScoreMatrix(pwtype) == null)
{
noseqs = i++;
- distance = findDistances();
+ distance = findDistances(sm);
// System.err.println("Made distances");// dbg
makeLeaves();
// System.err.println("Made leaves");// dbg
for (int j = 0; j < seqs.length; j++)
{
- seqs[j] = (SequenceI) list.get(j);
+ seqs[j] = list.get(j);
}
seqmatcher = new SequenceIdMatcher(seqs);
*
* @return similarity matrix used to compute tree
*/
- public float[][] findDistances()
+ public float[][] findDistances(ScoreModelI _pwmatrix)
{
float[][] distance = new float[noseqs][noseqs];
-
- // Pairwise substitution score (with no gap penalties)
- ScoreModelI _pwmatrix = ResidueProperties.getScoreModel(pwtype);
if (_pwmatrix == null)
{
- _pwmatrix = ResidueProperties.getScoreMatrix("BLOSUM62");
+ // Resolve substitution model
+ _pwmatrix = ResidueProperties.getScoreModel(pwtype);
+ if (_pwmatrix == null)
+ {
+ _pwmatrix = ResidueProperties.getScoreMatrix("BLOSUM62");
+ }
}
distance = _pwmatrix.findDistances(seqData);
return distance;
{
System.out
.println("Leaf = " + ((SequenceI) node.element()).getName());
- System.out.println("Dist " + ((SequenceNode) node).dist);
+ System.out.println("Dist " + node.dist);
System.out.println("Boot " + node.getBootstrap());
}
else
{
- System.out.println("Dist " + ((SequenceNode) node).dist);
+ System.out.println("Dist " + node.dist);
printNode((SequenceNode) node.left());
printNode((SequenceNode) node.right());
}
if ((node.left() == null) && (node.right() == null))
{
- float dist = ((SequenceNode) node).dist;
+ float dist = node.dist;
if (dist > maxDistValue)
{
- maxdist = (SequenceNode) node;
+ maxdist = node;
maxDistValue = dist;
}
}
+ ((SequenceI) node.element()).getName());
}
- System.out.println(" dist = " + ((SequenceNode) node).dist + " "
- + ((SequenceNode) node).count + " "
- + ((SequenceNode) node).height);
+ System.out.println(" dist = " + node.dist + " "
+ + node.count + " "
+ + node.height);
}
/**
SequenceNode l = (SequenceNode) node.left();
SequenceNode r = (SequenceNode) node.right();
- ((SequenceNode) node).count = l.count + r.count;
- ((SequenceNode) node).ycount = (l.ycount + r.ycount) / 2;
+ node.count = l.count + r.count;
+ node.ycount = (l.ycount + r.ycount) / 2;
}
else
{
- ((SequenceNode) node).count = 1;
- ((SequenceNode) node).ycount = ycount++;
+ node.count = 1;
+ node.ycount = ycount++;
}
_lycount--;
}
{
for (Enumeration nodes = node.elements(); nodes.hasMoreElements(); nodeTransformI
.transform((BinaryNode) nodes.nextElement()))
+ {
;
+ }
}
}
// TODO: deal with ID collisions - SequenceI should be appended to list
// associated with this key.
names.put(new SeqIdName(seqs[i].getDisplayId(true)), seqs[i]);
+ SequenceI dbseq = seqs[i];
+ while (dbseq.getDatasetSequence()!=null)
+ {
+ dbseq = dbseq.getDatasetSequence();
+ }
// add in any interesting identifiers
- if (seqs[i].getDBRef() != null)
+ if (dbseq.getDBRef() != null)
{
- DBRefEntry dbr[] = seqs[i].getDBRef();
+ DBRefEntry dbr[] = dbseq.getDBRef();
SeqIdName sid = null;
for (int r = 0; r < dbr.length; r++)
{
--- /dev/null
+package jalview.analysis.scoremodels;
+
+import jalview.api.analysis.ScoreModelI;
+import jalview.api.analysis.ViewBasedAnalysisI;
+import jalview.datamodel.AlignmentView;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.util.Comparison;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Hashtable;
+import java.util.List;
+
+public class FeatureScoreModel implements ScoreModelI, ViewBasedAnalysisI
+{
+ jalview.api.FeatureRenderer fr;
+
+ @Override
+ public boolean configureFromAlignmentView(
+ jalview.api.AlignmentViewPanel view)
+ {
+ fr = view.cloneFeatureRenderer();
+ return true;
+ }
+
+ @Override
+ public float[][] findDistances(AlignmentView seqData)
+ {
+ int nofeats = 0;
+ List<String> dft = Arrays.asList(fr.getDisplayedFeatureTypes());
+
+ if (dft != null)
+ {
+ nofeats = dft.size();
+ }
+
+ SequenceI[] sequenceString = seqData.getVisibleAlignment(
+ Comparison.GapChars.charAt(0)).getSequencesArray();
+ int noseqs = sequenceString.length;
+ int cpwidth = seqData.getWidth();
+ float[][] distance = new float[noseqs][noseqs];
+ if (nofeats == 0)
+ {
+ for (float[] d : distance)
+ {
+ for (int i = 0; i < d.length; d[i++] = 0f)
+ {
+ ;
+ }
+ }
+ return distance;
+ }
+ float max = 0;
+ for (int cpos = 0; cpos < cpwidth; cpos++)
+ {
+ // get visible features at cpos under view's display settings and compare
+ // them
+ List<Hashtable<String, SequenceFeature>> sfap = new ArrayList<Hashtable<String, SequenceFeature>>();
+ for (int i = 0; i < noseqs; i++)
+ {
+ Hashtable<String, SequenceFeature> types = new Hashtable<String, SequenceFeature>();
+ List<SequenceFeature> sfs = fr.findFeaturesAtRes(sequenceString[i],
+ sequenceString[i].findPosition(cpos));
+ for (SequenceFeature sf : sfs)
+ {
+ types.put(sf.getType(), sf);
+ }
+ sfap.add(types);
+ }
+ for (int i = 0; i < (noseqs - 1); i++)
+ {
+ if (cpos == 0)
+ {
+ distance[i][i] = 0f;
+ }
+ for (int j = i + 1; j < noseqs; j++)
+ {
+ int sfcommon = 0;
+ // compare the two lists of features...
+ Hashtable<String, SequenceFeature> fi = sfap.get(i), fk, fj = sfap
+ .get(j);
+ if (fi.size() > fj.size())
+ {
+ fk = fj;
+ }
+ else
+ {
+ fk = fi;
+ fi = fj;
+ }
+ for (String k : fi.keySet())
+ {
+ SequenceFeature sfj = fk.get(k);
+ if (sfj != null)
+ {
+ sfcommon++;
+ }
+ }
+ distance[i][j] += (fi.size() + fk.size() - 2f * sfcommon);
+ distance[j][i] += distance[i][j];
+ }
+ }
+ }
+ for (int i = 0; i < noseqs; i++)
+ {
+ for (int j = i + 1; j < noseqs; j++)
+ {
+ distance[i][j] /= cpwidth;
+ distance[j][i] = distance[i][j];
+ }
+ }
+ return distance;
+ }
+
+ @Override
+ public String getName()
+ {
+ return "Sequence Feature Similarity";
+ }
+
+ @Override
+ public boolean isDNA()
+ {
+ return true;
+ }
+
+ @Override
+ public boolean isProtein()
+ {
+ return true;
+ }
+
+ public String toString()
+ {
+ return "Score between sequences based on hamming distance between binary vectors marking features displayed at each column";
+ }
+}
*/
package jalview.api;
+import jalview.commands.CommandI;
+
/**
* Interface implemented by gui implementations managing a Jalview Alignment
* View
*/
void setStatus(String string);
+ void addHistoryItem(CommandI command);
+
}
boolean markColumnsContainingFeatures(boolean invert,
boolean extendCurrent, boolean clearColumns, String featureType);
+ /**
+ * sort the alignment or current selection by average score over the given set of features
+ * @param typ list of feature names or null to use currently displayed features
+ */
+ void sortAlignmentByFeatureScore(String[] typ);
+
+ /**
+ * sort the alignment or current selection by distribution of the given set of features
+ * @param typ list of feature names or null to use currently displayed features
+ */
+ void sortAlignmentByFeatureDensity(String[] typ);
+
}
*/
package jalview.api;
-import java.awt.Color;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-
import jalview.analysis.Conservation;
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.SequenceI;
import jalview.schemes.ColourSchemeI;
+import java.awt.Color;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
/**
* @author jimp
*
*/
void updateGroupAnnotationSettings(boolean applyGlobalSettings,
boolean preserveNewGroupSettings);
+
+ /**
+ * @return true if a reference sequence is set and should be displayed
+ */
+ public boolean isDisplayReferenceSeq();
+
+ /**
+ * @return set the flag for displaying reference sequences when they are
+ * available
+ */
+ public void setDisplayReferenceSeq(boolean displayReferenceSeq);
+
+ /**
+ * @return true if colourschemes should render according to reference sequence
+ * rather than consensus if available
+ */
+ public boolean isColourByReferenceSeq();
+
+ /**
+ * @return true set flag for deciding if colourschemes should render according
+ * to reference sequence rather than consensus if available
+ */
+ public void setColourByReferenceSeq(boolean colourByReferenceSeq);
void setSequenceColour(SequenceI seq, Color col);
SequenceGroup getSelectionGroup();
+ /**
+ * get the currently selected sequence objects or all the sequences in the
+ * alignment. TODO: change to List<>
+ *
+ * @return array of references to sequence objects
+ */
SequenceI[] getSequenceSelection();
void clearSequenceColours();
+ /**
+ * This method returns the visible alignment as text, as seen on the GUI, ie
+ * if columns are hidden they will not be returned in the result. Use this for
+ * calculating trees, PCA, redundancy etc on views which contain hidden
+ * columns.
+ *
+ * @return String[]
+ */
CigarArray getViewAsCigars(boolean selectedRegionOnly);
+ /**
+ * return a compact representation of the current alignment selection to pass
+ * to an analysis function
+ *
+ * @param selectedOnly
+ * boolean true to just return the selected view
+ * @return AlignmentView
+ */
AlignmentView getAlignmentView(boolean selectedOnly);
+ /**
+ * return a compact representation of the current alignment selection to pass
+ * to an analysis function
+ *
+ * @param selectedOnly
+ * boolean true to just return the selected view
+ * @param markGroups
+ * boolean true to annotate the alignment view with groups on the
+ * alignment (and intersecting with selected region if selectedOnly
+ * is true)
+ * @return AlignmentView
+ */
AlignmentView getAlignmentView(boolean selectedOnly, boolean markGroups);
+ /**
+ * This method returns the visible alignment as text, as seen on the GUI, ie
+ * if columns are hidden they will not be returned in the result. Use this for
+ * calculating trees, PCA, redundancy etc on views which contain hidden
+ * columns.
+ *
+ * @return String[]
+ */
String[] getViewAsString(boolean selectedRegionOnly);
void setSelectionGroup(SequenceGroup sg);
List<AlignmentAnnotation> getVisibleAlignmentAnnotation(
boolean selectedOnly);
+ FeaturesDisplayedI getFeaturesDisplayed();
+
+ String getSequenceSetId();
+
+ boolean isShowSequenceFeatures();
+
+ void setShowSequenceFeatures(boolean b);
+
+ /**
+ *
+ * @param flag
+ * indicating if annotation panel shown below alignment
+ *
+ */
+ void setShowAnnotation(boolean b);
+
+ /**
+ * flag indicating if annotation panel shown below alignment
+ *
+ * @return
+ */
+ boolean isShowAnnotation();
+
+ boolean isRightAlignIds();
+
+ void setRightAlignIds(boolean rightAlignIds);
+
+ boolean areFeaturesDisplayed();
+
+ void setShowSequenceFeaturesHeight(boolean selected);
+
+ boolean isShowSequenceFeaturesHeight();
+
+ void setFeaturesDisplayed(FeaturesDisplayedI featuresDisplayedI);
+
+ void alignmentChanged(AlignmentViewPanel ap);
+
+ /**
+ * @return the padGaps
+ */
+ boolean isPadGaps();
+
+ /**
+ * @param padGaps
+ * the padGaps to set
+ */
+ void setPadGaps(boolean padGaps);
+
+ /**
+ * return visible region boundaries within given column range
+ *
+ * @param min
+ * first column (inclusive, from 0)
+ * @param max
+ * last column (exclusive)
+ * @return int[][] range of {start,end} visible positions TODO: change to list
+ * of int ranges
+ */
+ int[][] getVisibleRegionBoundaries(int min, int max);
+
+ /**
+ * This method returns an array of new SequenceI objects derived from the
+ * whole alignment or just the current selection with start and end points
+ * adjusted
+ *
+ * @note if you need references to the actual SequenceI objects in the
+ * alignment or currently selected then use getSequenceSelection()
+ * @return selection as new sequenceI objects
+ */
+ SequenceI[] getSelectionAsNewSequence();
+
+ void invertColumnSelection();
+
+ /**
+ * broadcast selection to any interested parties
+ */
+ void sendSelection();
+
+ /**
+ * calculate the row position for alignmentIndex if all hidden sequences were
+ * shown
+ *
+ * @param alignmentIndex
+ * @return adjusted row position
+ */
+ int adjustForHiddenSeqs(int alignmentIndex);
+
+ boolean hasHiddenRows();
+
}
*/
void adjustAnnotationHeight();
+ FeatureRenderer getFeatureRenderer();
+
+ FeatureRenderer cloneFeatureRenderer();
+
/**
*
* @return displayed name for the view
*/
package jalview.api;
+import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceI;
import java.awt.Color;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
/**
* Abstract feature renderer interface
void featuresAdded();
+ Object getFeatureStyle(String ft);
+
+ void setColour(String ft, Object ggc);
+
+ AlignViewportI getViewport();
+
+ FeaturesDisplayedI getFeaturesDisplayed();
+
+ Map<String,Object> getFeatureColours();
+
+ void findAllFeatures(boolean newMadeVisible);
+
+ Map<String,Object> getDisplayedFeatureCols();
+
+ List<String> getFeatureGroups();
+
+ List<String> getGroups(boolean visible);
+
+ void setGroupVisibility(List<String> toset, boolean visible);
+
+ void setGroupVisibility(String group, boolean visible);
+
+ List<SequenceFeature> findFeaturesAtRes(SequenceI sequence, int res);
+
+ boolean isTransparencyAvailable();
+
+ String[] getDisplayedFeatureTypes();
+
+ String[] getDisplayedFeatureGroups();
+
+ void setAllVisible(List<String> featureTypes);
+
+ void setVisible(String featureType);
+
}
--- /dev/null
+package jalview.api;
+
+public interface FeatureSettingsControllerI
+{
+
+}
--- /dev/null
+package jalview.api;
+
+public interface FeatureSettingsModelI
+{
+
+}
--- /dev/null
+package jalview.api;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+public interface FeaturesDisplayedI
+{
+
+ Iterator<String> getVisibleFeatures();
+
+ boolean isVisible(String featureType);
+
+ boolean areVisible(Collection<String> featureTypes);
+
+ void clear();
+
+ void setVisible(String featureType);
+
+ void setAllVisible(Collection<String> featureTypes);
+
+ boolean isRegistered(String type);
+
+ void setAllRegisteredVisible();
+
+ int getVisibleFeatureCount();
+
+ int getRegisterdFeaturesCount();
+
+}
--- /dev/null
+package jalview.api.analysis;
+
+import jalview.api.AlignViewportI;
+import jalview.api.AlignmentViewPanel;
+
+public interface ViewBasedAnalysisI
+{
+
+ /**
+ * Parameterise the analysis model using the current view
+ * @param view
+ * @return true if model is applicable and calculation should proceed
+ */
+
+ boolean configureFromAlignmentView(AlignmentViewPanel view);
+
+}
MenuItem selSeqDetails = new MenuItem(
MessageManager.getString("label.sequence_details") + "...");
+ MenuItem makeReferenceSeq = new MenuItem();
+
Sequence seq;
MenuItem revealAll = new MenuItem();
if (seq != null)
{
seqMenu.setLabel(seq.getName());
+ if (seq == ap.av.getAlignment().getSeqrep())
+ {
+ makeReferenceSeq.setLabel(MessageManager
+ .getString("action.unmark_as_reference"));// Unmark
+ // representative");
+ }
+ else
+ {
+ makeReferenceSeq.setLabel(MessageManager
+ .getString("action.set_as_reference")); // );
+ }
repGroup.setLabel(MessageManager.formatMessage(
"label.represent_group_with", new String[]
{ seq.getName() }));
{
editName();
}
+ else if (source == makeReferenceSeq)
+ {
+ makeReferenceSeq_actionPerformed();
+ }
else if (source == sequenceDetails)
{
showSequenceDetails();
features, true, ap))
{
ap.alignFrame.sequenceFeatures.setState(true);
- ap.av.showSequenceFeatures(true);
+ ap.av.setShowSequenceFeatures(true);;
ap.highlightSearchResults(null);
}
}
true,
true,
false,
- (ap.seqPanel.seqCanvas.fr != null) ? ap.seqPanel.seqCanvas.fr.minmax
+ (ap.seqPanel.seqCanvas.fr != null) ? ap.seqPanel.seqCanvas.fr.getMinMax()
: null);
contents.append("</p>");
}
toLower.addActionListener(this);
editMenu.add(toggleCase);
seqMenu.add(sequenceName);
+ seqMenu.add(makeReferenceSeq);
// seqMenu.add(sequenceDetails);
if (!ap.av.applet.useXtrnalSviewer)
repGroup.addActionListener(this);
revealAll.addActionListener(this);
revealSeq.addActionListener(this);
+ makeReferenceSeq.addActionListener(this);
}
void refresh()
getGroup().setDisplayText(showText.getState());
refresh();
}
+ public void makeReferenceSeq_actionPerformed()
+ {
+ if (!ap.av.getAlignment().hasSeqrep())
+ {
+ // initialise the display flags so the user sees something happen
+ ap.av.setDisplayReferenceSeq(true);
+ ap.av.setColourByReferenceSeq(true);
+ ap.av.getAlignment().setSeqrep(seq);
+ }
+ else
+ {
+ if (ap.av.getAlignment().getSeqrep() == seq)
+ {
+ ap.av.getAlignment().setSeqrep(null);
+ }
+ else
+ {
+ ap.av.getAlignment().setSeqrep(seq);
+ }
+ }
+ refresh();
+ }
public void showNonconserved_itemStateChanged()
{
import jalview.analysis.AlignmentSorter;
import jalview.api.AlignViewControllerGuiI;
import jalview.api.AlignViewControllerI;
+import jalview.api.FeatureRenderer;
import jalview.api.SequenceStructureBinding;
import jalview.bin.JalviewLite;
import jalview.commands.CommandI;
import java.io.IOException;
import java.net.URL;
import java.net.URLEncoder;
-import java.util.Enumeration;
+import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;
+import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;
{
featuresFile = new jalview.io.FeaturesFile(file, type)
.parse(viewport.getAlignment(), alignPanel.seqPanel.seqCanvas
- .getFeatureRenderer().featureColours, featureLinks,
+ .getFeatureRenderer().getFeatureColours(), featureLinks,
true, viewport.applet.getDefaultParameter(
"relaxedidmatch", false));
} catch (Exception ex)
}
if (autoenabledisplay)
{
- viewport.showSequenceFeatures = true;
+ viewport.setShowSequenceFeatures(true);
sequenceFeatures.setState(true);
}
+ if (alignPanel.seqPanel.seqCanvas.fr != null)
+ {
+ // update the min/max ranges where necessary
+ alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true);
+ }
if (viewport.featureSettings != null)
{
viewport.featureSettings.refreshTable();
}
else if (evt.getSource() == sequenceFeatures)
{
- viewport.showSequenceFeatures(sequenceFeatures.getState());
+ viewport.setShowSequenceFeatures(sequenceFeatures.getState());
alignPanel.seqPanel.seqCanvas.repaint();
}
else if (evt.getSource() == conservationMenuItem)
{
new AnnotationColourChooser(viewport, alignPanel);
}
+ else if (source == annotationColumnSelection)
+ {
+ new AnnotationColumnChooser(viewport, alignPanel);
+ }
else if (source == sortPairwiseMenuItem)
{
sortPairwiseMenuItem_actionPerformed();
public String outputAnnotations(boolean displayTextbox)
{
- String annotation = new AnnotationFile().printAnnotations(
- viewport.showAnnotation ? viewport.getAlignment()
- .getAlignmentAnnotation() : null, viewport
- .getAlignment().getGroups(), ((Alignment) viewport
- .getAlignment()).alignmentProperties);
+ String annotation = new AnnotationFile()
+ .printAnnotationsForView(viewport);
if (displayTextbox)
{
return annotation;
}
- private Hashtable getDisplayedFeatureCols()
+ private Map<String,Object> getDisplayedFeatureCols()
{
if (alignPanel.getFeatureRenderer() != null
- && viewport.featuresDisplayed != null)
+ && viewport.getFeaturesDisplayed()!= null)
{
- FeatureRenderer fr = alignPanel.getFeatureRenderer();
- Hashtable fcols = new Hashtable();
- Enumeration en = viewport.featuresDisplayed.keys();
- while (en.hasMoreElements())
- {
- Object col = en.nextElement();
- fcols.put(col, fr.featureColours.get(col));
- }
- return fcols;
+ return alignPanel.getFeatureRenderer().getDisplayedFeatureCols();
+
}
return null;
}
/**
* TODO: JAL-1104
*/
+ @Override
public void addHistoryItem(CommandI command)
{
if (command.getSize() > 0)
{
copiedHiddenColumns = new Vector();
int hiddenOffset = viewport.getSelectionGroup().getStartRes();
- for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
- .size(); i++)
+ for (int[] region : viewport.getColumnSelection().getHiddenColumns())
{
- int[] region = (int[]) viewport.getColumnSelection()
- .getHiddenColumns().elementAt(i);
copiedHiddenColumns.addElement(new int[]
{ region[0] - hiddenOffset, region[1] - hiddenOffset });
if (alignPanel != null
&& (fr = alignPanel.getFeatureRenderer()) != null)
{
- return fr.getGroups();
+ List gps = fr.getFeatureGroups();
+ int p=0;
+ String[] _gps = new String[gps.size()];
+ for (Object gp:gps)
+ {
+ _gps[p++] = gp.toString();
+ }
+ return _gps;
}
return null;
}
if (alignPanel != null
&& (fr = alignPanel.getFeatureRenderer()) != null)
{
- return fr.getGroups(visible);
+ List gps = fr.getGroups(visible);
+ int p=0;
+ String[] _gps = new String[gps.size()];
+ for (Object gp:gps)
+ {
+ _gps[p++] = gp.toString();
+ }
+ return _gps;
}
return null;
}
{
FeatureRenderer fr = null;
this.sequenceFeatures.setState(true);
- viewport.showSequenceFeatures(true);
+ viewport.setShowSequenceFeatures(true);
if (alignPanel != null
&& (fr = alignPanel.getFeatureRenderer()) != null)
{
- fr.setGroupState(groups, state);
+
+ fr.setGroupVisibility(Arrays.asList(groups), state);
alignPanel.seqPanel.seqCanvas.repaint();
if (alignPanel.overviewPanel != null)
{
annotationColour.setLabel(MessageManager
.getString("action.by_annotation"));
annotationColour.addActionListener(this);
+
+ annotationColumnSelection.setLabel("Select by Annotation");
+ annotationColumnSelection.addActionListener(this);
+
invertSequenceMenuItem.setLabel(MessageManager
.getString("action.invert_sequence_selection"));
invertColSel.setLabel(MessageManager
selectMenu.add(unGroup);
selectMenu.add(grpsFromSelection);
selectMenu.add(deleteGroups);
+ selectMenu.add(annotationColumnSelection);
}
MenuItem annotationColour = new MenuItem();
+ MenuItem annotationColumnSelection = new MenuItem();
+
MenuItem invertColSel = new MenuItem();
Menu menu1 = new Menu();
*/
package jalview.appletgui;
-import java.util.*;
-
-import java.awt.*;
-
-import jalview.analysis.*;
+import jalview.analysis.NJTree;
import jalview.api.AlignViewportI;
-import jalview.bin.*;
-import jalview.datamodel.*;
-import jalview.schemes.*;
+import jalview.bin.JalviewLite;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.schemes.ColourSchemeProperty;
+import jalview.schemes.UserColourScheme;
import jalview.structure.SelectionSource;
import jalview.structure.VamsasSource;
import jalview.viewmodel.AlignmentViewport;
+import java.awt.Font;
+import java.util.Stack;
+
public class AlignViewport extends AlignmentViewport implements
AlignViewportI, SelectionSource, VamsasSource
{
boolean renderGaps = true;
- boolean showSequenceFeatures = false;
-
boolean showAnnotation = true;
boolean upperCasebold = false;
boolean scaleRightWrapped = true;
- // The following vector holds the features which are
- // currently visible, in the correct order or rendering
- public Hashtable featuresDisplayed;
-
boolean showHiddenMarkers = true;
public jalview.bin.JalviewLite applet;
Stack redoList = new Stack();
+ private AnnotationColumnChooser annotationColumnSelectionState;
+
public void finalize()
{
applet = null;
}
- public void showSequenceFeatures(boolean b)
- {
- showSequenceFeatures = b;
- }
-
- public boolean getShowSequenceFeatures()
- {
- return showSequenceFeatures;
- }
-
/**
* get the consensus sequence as displayed under the PID consensus annotation
* row.
}
}
- @Override
- public boolean hasHiddenColumns()
- {
- return hasHiddenColumns;
- }
-
public boolean isNormaliseSequenceLogo()
{
return normaliseSequenceLogo;
return validCharWidth;
}
+ public AnnotationColumnChooser getAnnotationColumnSelectionState()
+ {
+ return annotationColumnSelectionState;
+ }
+
+ public void setAnnotationColumnSelectionState(
+ AnnotationColumnChooser annotationColumnSelectionState)
+ {
+ this.annotationColumnSelectionState = annotationColumnSelectionState;
+ }
+
}
{
return seqPanel.seqCanvas.sr;
}
-
- public FeatureRenderer getFeatureRenderer()
+ @Override
+ public jalview.api.FeatureRenderer getFeatureRenderer()
{
return seqPanel.seqCanvas.fr;
}
-
+ @Override
+ public jalview.api.FeatureRenderer cloneFeatureRenderer()
+ {
+ FeatureRenderer nfr = new FeatureRenderer(av);
+ nfr.transferSettings(seqPanel.seqCanvas.fr);
+ return nfr;
+ }
public void alignmentChanged()
{
av.alignmentChanged(this);
*/
package jalview.appletgui;
-import java.util.*;
-
-import java.awt.*;
-import java.awt.event.*;
-
-import jalview.datamodel.*;
-import jalview.schemes.*;
+import jalview.datamodel.SequenceGroup;
+import jalview.schemes.AnnotationColourGradient;
+import jalview.schemes.ColourSchemeI;
import jalview.util.MessageManager;
+import java.awt.BorderLayout;
+import java.awt.Button;
+import java.awt.Checkbox;
+import java.awt.Choice;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Panel;
+import java.awt.Scrollbar;
+import java.awt.TextField;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.AdjustmentEvent;
+import java.awt.event.AdjustmentListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.Hashtable;
+import java.util.Vector;
+
public class AnnotationColourChooser extends Panel implements
ActionListener, AdjustmentListener, ItemListener, MouseListener
{
{
String label = av.getAlignment().getAlignmentAnnotation()[i].label;
if (!list.contains(label))
+ {
list.addElement(label);
+ }
else
+ {
list.addElement(label + "_" + (index++));
+ }
}
for (int i = 0; i < list.size(); i++)
threshold.select(1);
break;
default:
- throw new Error(MessageManager.getString("error.implementation_error_dont_know_thereshold_annotationcolourgradient"));
+ throw new Error(
+ MessageManager
+ .getString("error.implementation_error_dont_know_thereshold_annotationcolourgradient"));
}
thresholdIsMin.setState(acg.thresholdIsMinMax);
thresholdValue.setText("" + acg.getAnnotationThreshold());
{
if (!adjusting)
{
- thresholdValue.setText(((float) slider.getValue() / 1000f) + "");
+ thresholdValue.setText((slider.getValue() / 1000f) + "");
if (currentColours.getState()
&& !(av.getGlobalColourScheme() instanceof AnnotationColourGradient))
{
changeColour();
}
- currentAnnotation.threshold.value = (float) slider.getValue() / 1000f;
+ currentAnnotation.threshold.value = slider.getValue() / 1000f;
ap.paintAlignment(false);
}
}
--- /dev/null
+package jalview.appletgui;
+
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.ColumnSelection;
+import jalview.gui.JvSwingUtils;
+import jalview.schemes.AnnotationColourGradient;
+import jalview.util.MessageManager;
+import jalview.viewmodel.annotationfilter.AnnotationFilterParameter;
+
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Checkbox;
+import java.awt.Choice;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Panel;
+import java.awt.TextField;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.AdjustmentEvent;
+import java.awt.event.AdjustmentListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.TextEvent;
+import java.awt.event.TextListener;
+import java.util.Iterator;
+import java.util.Vector;
+
+import javax.swing.JPanel;
+
+//import net.miginfocom.swing.MigLayout;
+
+public class AnnotationColumnChooser extends AnnotationRowFilter implements
+ ActionListener, AdjustmentListener, ItemListener, MouseListener
+{
+
+ private Choice annotations = new Choice();
+
+ private Panel actionPanel = new Panel();
+
+ private TitledPanel thresholdPanel = new TitledPanel();
+
+ private Panel switchableViewsPanel = new Panel(new CardLayout());
+
+ private CardLayout switchableViewsLayout = (CardLayout) (switchableViewsPanel
+ .getLayout());
+
+ private Panel noGraphFilterView = new Panel();
+
+ private Panel graphFilterView = new Panel();
+
+ private Panel annotationComboBoxPanel = new Panel();
+
+ private BorderLayout borderLayout1 = new BorderLayout();
+
+ private BorderLayout gBorderLayout = new BorderLayout();
+
+ private BorderLayout ngBorderLayout = new BorderLayout();
+
+ private Choice threshold = new Choice();
+
+ private StructureFilterPanel gStructureFilterPanel;
+
+ private StructureFilterPanel ngStructureFilterPanel;
+
+ private StructureFilterPanel currentStructureFilterPanel;
+
+ private SearchPanel currentSearchPanel;
+
+ private SearchPanel gSearchPanel;
+
+ private SearchPanel ngSearchPanel;
+
+ private FurtherActionPanel currentFurtherActionPanel;
+
+ private FurtherActionPanel gFurtherActionPanel;
+
+ private FurtherActionPanel ngFurtherActionPanel;
+
+ public static final int ACTION_OPTION_SELECT = 1;
+
+ public static int ACTION_OPTION_HIDE = 2;
+
+ public static String NO_GRAPH_VIEW = "0";
+
+ public static String GRAPH_VIEW = "1";
+
+ private int actionOption = ACTION_OPTION_SELECT;
+
+ private ColumnSelection oldColumnSelection;
+
+ public AnnotationColumnChooser()
+ {
+ try
+ {
+ jbInit();
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ public AnnotationColumnChooser(AlignViewport av, final AlignmentPanel ap)
+ {
+ super(av, ap);
+ frame = new Frame();
+ frame.add(this);
+ jalview.bin.JalviewLite.addFrame(frame,
+ MessageManager.getString("label.select_by_annotation"), 520,
+ 215);
+
+ slider.addAdjustmentListener(this);
+ slider.addMouseListener(this);
+
+ if (av.getAlignment().getAlignmentAnnotation() == null)
+ {
+ return;
+ }
+ setOldColumnSelection(av.getColumnSelection());
+ adjusting = true;
+ Vector list = new Vector();
+ int index = 1;
+ for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
+ {
+ String label = av.getAlignment().getAlignmentAnnotation()[i].label;
+ if (!list.contains(label))
+ {
+ list.addElement(label);
+ }
+ else
+ {
+ list.addElement(label + "_" + (index++));
+ }
+ }
+
+ for (int i = 0; i < list.size(); i++)
+ {
+ annotations.addItem(list.elementAt(i).toString());
+ }
+
+ populateThresholdComboBox(threshold);
+
+ // restore Object state from the previous session if one exists
+ if (av.getAnnotationColumnSelectionState() != null)
+ {
+ currentSearchPanel = av.getAnnotationColumnSelectionState()
+ .getCurrentSearchPanel();
+ currentStructureFilterPanel = av.getAnnotationColumnSelectionState()
+ .getCurrentStructureFilterPanel();
+ annotations.select(av.getAnnotationColumnSelectionState()
+ .getAnnotations().getSelectedIndex());
+ threshold.select(av.getAnnotationColumnSelectionState()
+ .getThreshold().getSelectedIndex());
+ actionOption = av.getAnnotationColumnSelectionState()
+ .getActionOption();
+ }
+
+ try
+ {
+ jbInit();
+ } catch (Exception ex)
+ {
+ }
+ adjusting = false;
+
+ updateView();
+ frame.invalidate();
+ frame.pack();
+ }
+
+ private void jbInit() throws Exception
+ {
+ ok.setLabel(MessageManager.getString("action.ok"));
+
+ cancel.setLabel(MessageManager.getString("action.cancel"));
+
+ thresholdValue.setEnabled(false);
+ thresholdValue.setColumns(7);
+
+ ok.addActionListener(this);
+ cancel.addActionListener(this);
+ annotations.addItemListener(this);
+ thresholdValue.addActionListener(this);
+ threshold.addItemListener(this);
+
+ slider.setBackground(Color.white);
+ slider.setEnabled(false);
+ slider.setPreferredSize(new Dimension(100, 32));
+
+ thresholdPanel.setBackground(Color.white);
+ thresholdPanel.setFont(JvSwingUtils.getLabelFont());
+ // thresholdPanel.setLayout(new MigLayout("", "[left][right]", "[][]"));
+
+ actionPanel.setBackground(Color.white);
+ actionPanel.setFont(JvSwingUtils.getLabelFont());
+
+ graphFilterView.setLayout(gBorderLayout);
+ graphFilterView.setBackground(Color.white);
+
+ noGraphFilterView.setLayout(ngBorderLayout);
+ noGraphFilterView.setBackground(Color.white);
+
+ annotationComboBoxPanel.setBackground(Color.white);
+ annotationComboBoxPanel.setFont(JvSwingUtils.getLabelFont());
+
+ gSearchPanel = new SearchPanel(this);
+ ngSearchPanel = new SearchPanel(this);
+ gFurtherActionPanel = new FurtherActionPanel(this);
+ ngFurtherActionPanel = new FurtherActionPanel(this);
+ gStructureFilterPanel = new StructureFilterPanel(this);
+ ngStructureFilterPanel = new StructureFilterPanel(this);
+
+ thresholdPanel.setTitle("Threshold Filter");
+ thresholdPanel.add(getThreshold());
+ thresholdPanel.add(slider);
+ thresholdPanel.add(thresholdValue);
+
+ actionPanel.add(ok);
+ actionPanel.add(cancel);
+
+ JPanel staticPanel = new JPanel();
+ staticPanel.setLayout(new BorderLayout());
+ staticPanel.setBackground(Color.white);
+
+ staticPanel.add(gSearchPanel, java.awt.BorderLayout.NORTH);
+ staticPanel.add(gStructureFilterPanel, java.awt.BorderLayout.SOUTH);
+
+ graphFilterView.add(staticPanel, java.awt.BorderLayout.NORTH);
+ graphFilterView.add(thresholdPanel, java.awt.BorderLayout.CENTER);
+ graphFilterView.add(gFurtherActionPanel, java.awt.BorderLayout.SOUTH);
+
+ noGraphFilterView.add(ngSearchPanel, java.awt.BorderLayout.PAGE_START);
+ noGraphFilterView.add(ngStructureFilterPanel,
+ java.awt.BorderLayout.CENTER);
+ noGraphFilterView.add(ngFurtherActionPanel,
+ java.awt.BorderLayout.CENTER);
+
+ annotationComboBoxPanel.add(getAnnotations());
+ switchableViewsPanel.add(noGraphFilterView,
+ AnnotationColumnChooser.NO_GRAPH_VIEW);
+ switchableViewsPanel.add(graphFilterView,
+ AnnotationColumnChooser.GRAPH_VIEW);
+
+ this.setLayout(borderLayout1);
+ this.add(annotationComboBoxPanel, java.awt.BorderLayout.PAGE_START);
+ this.add(switchableViewsPanel, java.awt.BorderLayout.CENTER);
+ this.add(actionPanel, java.awt.BorderLayout.SOUTH);
+
+ selectedAnnotationChanged();
+ this.validate();
+ }
+
+ @SuppressWarnings("unchecked")
+ public void reset()
+ {
+ if (this.getOldColumnSelection() != null)
+ {
+ av.getColumnSelection().clear();
+
+ if (av.getAnnotationColumnSelectionState() != null)
+ {
+ ColumnSelection oldSelection = av
+ .getAnnotationColumnSelectionState()
+ .getOldColumnSelection();
+ if (oldSelection != null && oldSelection.getHiddenColumns() != null
+ && !oldSelection.getHiddenColumns().isEmpty())
+ {
+ for (Iterator<int[]> itr = oldSelection.getHiddenColumns()
+ .iterator(); itr.hasNext();)
+ {
+ int positions[] = itr.next();
+ av.hideColumns(positions[0], positions[1]);
+ }
+ }
+ av.setColumnSelection(oldSelection);
+ }
+ ap.paintAlignment(true);
+ }
+
+ }
+
+ public void adjustmentValueChanged(AdjustmentEvent evt)
+ {
+ if (!adjusting)
+ {
+ thresholdValue.setText((slider.getValue() / 1000f) + "");
+ valueChanged(!sliderDragging);
+ }
+ }
+
+ protected void addSliderMouseListeners()
+ {
+
+ slider.addMouseListener(new MouseAdapter()
+ {
+ @Override
+ public void mousePressed(MouseEvent e)
+ {
+ sliderDragging = true;
+ super.mousePressed(e);
+ }
+
+ @Override
+ public void mouseDragged(MouseEvent e)
+ {
+ sliderDragging = true;
+ super.mouseDragged(e);
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent evt)
+ {
+ if (sliderDragging)
+ {
+ sliderDragging = false;
+ valueChanged(true);
+ }
+ ap.paintAlignment(true);
+ }
+ });
+ }
+
+ public void valueChanged(boolean updateAllAnnotation)
+ {
+ if (slider.isEnabled())
+ {
+ getCurrentAnnotation().threshold.value = slider.getValue() / 1000f;
+ updateView();
+ ap.paintAlignment(false);
+ }
+ }
+
+ public Choice getThreshold()
+ {
+ return threshold;
+ }
+
+ public void setThreshold(Choice threshold)
+ {
+ this.threshold = threshold;
+ }
+
+ public Choice getAnnotations()
+ {
+ return annotations;
+ }
+
+ public void setAnnotations(Choice annotations)
+ {
+ this.annotations = annotations;
+ }
+
+ @Override
+ public void updateView()
+ {
+ // Check if combobox is still adjusting
+ if (adjusting)
+ {
+ return;
+ }
+
+ AnnotationFilterParameter filterParams = new AnnotationFilterParameter();
+ setCurrentAnnotation(av.getAlignment().getAlignmentAnnotation()[getAnnotations()
+ .getSelectedIndex()]);
+
+ int selectedThresholdItem = getSelectedThresholdItem(getThreshold()
+ .getSelectedIndex());
+
+ slider.setEnabled(true);
+ thresholdValue.setEnabled(true);
+
+ if (selectedThresholdItem == AnnotationColourGradient.NO_THRESHOLD)
+ {
+ slider.setEnabled(false);
+ thresholdValue.setEnabled(false);
+ thresholdValue.setText("");
+ // build filter params
+ }
+ else if (selectedThresholdItem != AnnotationColourGradient.NO_THRESHOLD)
+ {
+ if (getCurrentAnnotation().threshold == null)
+ {
+ getCurrentAnnotation()
+ .setThreshold(
+ new jalview.datamodel.GraphLine(
+ (getCurrentAnnotation().graphMax - getCurrentAnnotation().graphMin) / 2f,
+ "Threshold", Color.black));
+ }
+
+ adjusting = true;
+ float range = getCurrentAnnotation().graphMax * 1000
+ - getCurrentAnnotation().graphMin * 1000;
+
+ slider.setMinimum((int) (getCurrentAnnotation().graphMin * 1000));
+ slider.setMaximum((int) (getCurrentAnnotation().graphMax * 1000));
+ slider.setValue((int) (getCurrentAnnotation().threshold.value * 1000));
+ thresholdValue.setText(getCurrentAnnotation().threshold.value + "");
+ // slider.setMajorTickSpacing((int) (range / 10f));
+ slider.setEnabled(true);
+ thresholdValue.setEnabled(true);
+ adjusting = false;
+
+ // build filter params
+ filterParams
+ .setThresholdType(AnnotationFilterParameter.ThresholdType.NO_THRESHOLD);
+ if (getCurrentAnnotation().graph != AlignmentAnnotation.NO_GRAPH)
+ {
+ filterParams
+ .setThresholdValue(getCurrentAnnotation().threshold.value);
+
+ if (selectedThresholdItem == AnnotationColourGradient.ABOVE_THRESHOLD)
+ {
+ filterParams
+ .setThresholdType(AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD);
+ }
+ else if (selectedThresholdItem == AnnotationColourGradient.BELOW_THRESHOLD)
+ {
+ filterParams
+ .setThresholdType(AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD);
+ }
+ }
+ }
+
+ if (currentStructureFilterPanel != null)
+ {
+ if (currentStructureFilterPanel.alphaHelix.getState())
+ {
+ filterParams.setFilterAlphaHelix(true);
+ }
+ if (currentStructureFilterPanel.betaStrand.getState())
+ {
+ filterParams.setFilterBetaSheet(true);
+ }
+ if (currentStructureFilterPanel.turn.getState())
+ {
+ filterParams.setFilterTurn(true);
+ }
+ }
+
+ if (currentSearchPanel != null)
+ {
+
+ if (!currentSearchPanel.searchBox.getText().isEmpty())
+ {
+ currentSearchPanel.description.setEnabled(true);
+ currentSearchPanel.displayName.setEnabled(true);
+ filterParams.setRegexString(currentSearchPanel.searchBox.getText());
+ if (currentSearchPanel.displayName.getState())
+ {
+ filterParams
+ .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DISPLAY_STRING);
+ }
+ if (currentSearchPanel.description.getState())
+ {
+ filterParams
+ .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DESCRIPTION);
+ }
+ }
+ else
+ {
+ currentSearchPanel.description.setEnabled(false);
+ currentSearchPanel.displayName.setEnabled(false);
+ }
+ }
+
+ av.getColumnSelection().filterAnnotations(
+ getCurrentAnnotation().annotations, filterParams);
+
+ av.showAllHiddenColumns();
+ if (getActionOption() == ACTION_OPTION_HIDE)
+ {
+ av.hideSelectedColumns();
+ }
+
+ filterParams = null;
+ av.setAnnotationColumnSelectionState(this);
+ ap.paintAlignment(true);
+ }
+
+ public ColumnSelection getOldColumnSelection()
+ {
+ return oldColumnSelection;
+ }
+
+ public void setOldColumnSelection(ColumnSelection currentColumnSelection)
+ {
+ if (currentColumnSelection != null)
+ {
+ this.oldColumnSelection = new ColumnSelection(currentColumnSelection);
+ }
+ }
+
+ public FurtherActionPanel getCurrentFutherActionPanel()
+ {
+ return currentFurtherActionPanel;
+ }
+
+ public void setCurrentFutherActionPanel(
+ FurtherActionPanel currentFutherActionPanel)
+ {
+ this.currentFurtherActionPanel = currentFutherActionPanel;
+ }
+
+ public SearchPanel getCurrentSearchPanel()
+ {
+ return currentSearchPanel;
+ }
+
+ public void setCurrentSearchPanel(SearchPanel currentSearchPanel)
+ {
+ this.currentSearchPanel = currentSearchPanel;
+ }
+
+ public int getActionOption()
+ {
+ return actionOption;
+ }
+
+ public void setActionOption(int actionOption)
+ {
+ this.actionOption = actionOption;
+ }
+
+ public StructureFilterPanel getCurrentStructureFilterPanel()
+ {
+ return currentStructureFilterPanel;
+ }
+
+ public void setCurrentStructureFilterPanel(
+ StructureFilterPanel currentStructureFilterPanel)
+ {
+ this.currentStructureFilterPanel = currentStructureFilterPanel;
+ }
+
+ @Override
+ public void itemStateChanged(ItemEvent e)
+ {
+ if (e.getSource() == annotations)
+ {
+ selectedAnnotationChanged();
+ }
+ else if (e.getSource() == threshold)
+ {
+ threshold_actionPerformed(null);
+ }
+ }
+
+ public void selectedAnnotationChanged()
+ {
+ String currentView = AnnotationColumnChooser.NO_GRAPH_VIEW;
+ if (av.getAlignment().getAlignmentAnnotation()[getAnnotations()
+ .getSelectedIndex()].graph != AlignmentAnnotation.NO_GRAPH)
+ {
+ currentView = AnnotationColumnChooser.GRAPH_VIEW;
+ }
+
+ gSearchPanel.syncState();
+ gFurtherActionPanel.syncState();
+ gStructureFilterPanel.syncState();
+
+ ngSearchPanel.syncState();
+ ngFurtherActionPanel.syncState();
+ ngStructureFilterPanel.syncState();
+
+ switchableViewsLayout.show(switchableViewsPanel, currentView);
+ updateView();
+ }
+
+ public class FurtherActionPanel extends Panel implements
+ ItemListener
+ {
+ private AnnotationColumnChooser aColChooser;
+
+ private Choice furtherAction = new Choice();
+
+ public FurtherActionPanel(AnnotationColumnChooser aColChooser)
+ {
+ this.aColChooser = aColChooser;
+ furtherAction.addItem("Select");
+ furtherAction.addItem("Hide");
+ furtherAction.addItemListener(this);
+ syncState();
+
+ // this.setTitle("Filter Actions");
+ // this.setFont(JvSwingUtils.getLabelFont());
+
+ this.add(furtherAction);
+ }
+
+ public void syncState()
+ {
+ if (aColChooser.getActionOption() == AnnotationColumnChooser.ACTION_OPTION_HIDE)
+ {
+ furtherAction.select("Hide");
+ }
+ else
+ {
+ furtherAction.select("Select");
+ }
+ }
+
+ @Override
+ public void itemStateChanged(ItemEvent e)
+ {
+ aColChooser.setCurrentFutherActionPanel(this);
+ if (furtherAction.getSelectedItem().equalsIgnoreCase("Select"))
+ {
+ setActionOption(ACTION_OPTION_SELECT);
+ updateView();
+ }
+ else
+ {
+ setActionOption(ACTION_OPTION_HIDE);
+ updateView();
+ }
+
+ }
+ }
+
+ public class StructureFilterPanel extends TitledPanel implements
+ ItemListener
+ {
+ private AnnotationColumnChooser aColChooser;
+
+ private Checkbox alphaHelix = new Checkbox();
+
+ private Checkbox betaStrand = new Checkbox();
+
+ private Checkbox turn = new Checkbox();
+
+ private Checkbox all = new Checkbox();
+
+ public StructureFilterPanel(AnnotationColumnChooser aColChooser)
+ {
+ this.aColChooser = aColChooser;
+
+ alphaHelix.setLabel(MessageManager.getString("label.alpha_helix"));
+ alphaHelix.setBackground(Color.white);
+
+ alphaHelix.addItemListener(this);
+
+ betaStrand.setLabel(MessageManager.getString("label.beta_strand"));
+ betaStrand.setBackground(Color.white);
+ betaStrand.addItemListener(this);
+
+ turn.setLabel(MessageManager.getString("label.turn"));
+ turn.setBackground(Color.white);
+ turn.addItemListener(this);
+
+ all.setLabel(MessageManager.getString("label.select_all"));
+ all.setBackground(Color.white);
+ all.addItemListener(this);
+
+ this.setBackground(Color.white);
+ this.setTitle("Structure Filter");
+ this.setFont(JvSwingUtils.getLabelFont());
+
+ this.add(all);
+ this.add(alphaHelix);
+ this.add(betaStrand);
+ this.add(turn);
+ }
+
+ public void alphaHelix_actionPerformed()
+ {
+ updateSelectAllState();
+ aColChooser.setCurrentStructureFilterPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void betaStrand_actionPerformed()
+ {
+ updateSelectAllState();
+ aColChooser.setCurrentStructureFilterPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void turn_actionPerformed()
+ {
+ updateSelectAllState();
+ aColChooser.setCurrentStructureFilterPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void all_actionPerformed()
+ {
+ if (all.getState())
+ {
+ alphaHelix.setState(true);
+ betaStrand.setState(true);
+ turn.setState(true);
+ }
+ else
+ {
+ alphaHelix.setState(false);
+ betaStrand.setState(false);
+ turn.setState(false);
+ }
+ aColChooser.setCurrentStructureFilterPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void updateSelectAllState()
+ {
+ if (alphaHelix.getState() && betaStrand.getState() && turn.getState())
+ {
+ all.setState(true);
+ }
+ else
+ {
+ all.setState(false);
+ }
+ }
+
+ public void syncState()
+ {
+ StructureFilterPanel sfp = aColChooser
+ .getCurrentStructureFilterPanel();
+ if (sfp != null)
+ {
+ alphaHelix.setState(sfp.alphaHelix.getState());
+ betaStrand.setState(sfp.betaStrand.getState());
+ turn.setState(sfp.turn.getState());
+ if (sfp.all.getState())
+ {
+ all.setState(true);
+ alphaHelix.setState(true);
+ betaStrand.setState(true);
+ turn.setState(true);
+ }
+ }
+
+ }
+
+ @Override
+ public void itemStateChanged(ItemEvent e)
+ {
+ if (e.getSource() == alphaHelix)
+ {
+ alphaHelix_actionPerformed();
+ }
+ else if (e.getSource() == betaStrand)
+ {
+ betaStrand_actionPerformed();
+ }
+ else if (e.getSource() == turn)
+ {
+ turn_actionPerformed();
+ }
+ else if (e.getSource() == all)
+ {
+ all_actionPerformed();
+ }
+ }
+ }
+
+ public class SearchPanel extends TitledPanel implements ItemListener
+ {
+ private AnnotationColumnChooser aColChooser;
+
+ private Checkbox displayName = new Checkbox();
+
+ private Checkbox description = new Checkbox();
+
+ private TextField searchBox = new TextField(10);
+
+ public SearchPanel(AnnotationColumnChooser aColChooser)
+ {
+
+ this.aColChooser = aColChooser;
+ searchBox.addTextListener(new TextListener()
+ {
+
+ @Override
+ public void textValueChanged(TextEvent e)
+ {
+ searchStringAction();
+
+ }
+
+ });
+
+ displayName.setLabel(MessageManager.getString("label.display_name"));
+ displayName.setEnabled(false);
+ displayName.addItemListener(this);
+
+ description.setLabel(MessageManager.getString("label.description"));
+ description.setEnabled(false);
+ description.addItemListener(this);
+ this.setTitle("Search Filter");
+ this.setFont(JvSwingUtils.getLabelFont());
+
+ syncState();
+ this.add(searchBox);
+ this.add(displayName);
+ this.add(description);
+ }
+
+ public void displayNameCheckboxAction()
+ {
+ aColChooser.setCurrentSearchPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void discriptionCheckboxAction()
+ {
+ aColChooser.setCurrentSearchPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void searchStringAction()
+ {
+ aColChooser.setCurrentSearchPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void syncState()
+ {
+ SearchPanel sp = aColChooser.getCurrentSearchPanel();
+ if (sp != null)
+ {
+ description.setEnabled(sp.description.isEnabled());
+ description.setState(sp.description.getState());
+
+ displayName.setEnabled(sp.displayName.isEnabled());
+ displayName.setState(sp.displayName.getState());
+
+ searchBox.setText(sp.searchBox.getText());
+ }
+ }
+
+ @Override
+ public void itemStateChanged(ItemEvent e)
+ {
+ if (e.getSource() == displayName)
+ {
+ displayNameCheckboxAction();
+ }
+ else if (e.getSource() == description)
+ {
+ discriptionCheckboxAction();
+ }
+
+ }
+ }
+
+ public void actionPerformed(ActionEvent evt)
+ {
+ if (evt.getSource() == thresholdValue)
+ {
+ try
+ {
+ float f = new Float(thresholdValue.getText()).floatValue();
+ slider.setValue((int) (f * 1000));
+ adjustmentValueChanged(null);
+ } catch (NumberFormatException ex)
+ {
+ }
+ }
+
+ else if (evt.getSource() == ok)
+ {
+ ok_actionPerformed(null);
+ }
+ else if (evt.getSource() == cancel)
+ {
+ cancel_actionPerformed(null);
+ }
+ else if (evt.getSource() == thresholdValue)
+ {
+ thresholdValue_actionPerformed(null);
+ }
+ else
+ {
+ updateView();
+ }
+ }
+
+ @Override
+ public void mouseClicked(MouseEvent e)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void mousePressed(MouseEvent e)
+ {
+ if (e.getSource() == slider)
+ {
+ updateView();
+ }
+
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e)
+ {
+ if (e.getSource() == slider)
+ {
+ updateView();
+ }
+ }
+
+ @Override
+ public void mouseEntered(MouseEvent e)
+ {
+ if (e.getSource() == slider)
+ {
+ updateView();
+ }
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e)
+ {
+ if (e.getSource() == slider)
+ {
+ updateView();
+ }
+ }
+
+}
*/
package jalview.appletgui;
-import java.util.*;
-import java.awt.*;
-import java.awt.event.*;
-
-import jalview.datamodel.*;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
import jalview.util.MessageManager;
import jalview.util.ParseHtmlBodyAndLinks;
+import java.awt.Checkbox;
+import java.awt.CheckboxMenuItem;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.FontMetrics;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.MenuItem;
+import java.awt.Panel;
+import java.awt.PopupMenu;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.util.Arrays;
+import java.util.Vector;
+
public class AnnotationLabels extends Panel implements ActionListener,
MouseListener, MouseMotionListener
{
return true;
}
else
+ {
return false;
+ }
}
if (av.hasHiddenColumns())
{
jalview.appletgui.AlignFrame.copiedHiddenColumns = new Vector();
- for (int i = 0; i < av.getColumnSelection().getHiddenColumns().size(); i++)
+ for (int[] region : av.getColumnSelection().getHiddenColumns())
{
- int[] region = (int[]) av.getColumnSelection().getHiddenColumns()
- .elementAt(i);
-
jalview.appletgui.AlignFrame.copiedHiddenColumns
.addElement(new int[]
{ region[0], region[1] });
--- /dev/null
+package jalview.appletgui;
+
+import jalview.schemes.AnnotationColourGradient;
+import jalview.util.MessageManager;
+
+import java.awt.Button;
+import java.awt.Checkbox;
+import java.awt.Choice;
+import java.awt.Frame;
+import java.awt.Panel;
+import java.awt.Scrollbar;
+import java.awt.TextField;
+import java.awt.event.ActionEvent;
+import java.util.Vector;
+
+
+
+@SuppressWarnings("serial")
+public abstract class AnnotationRowFilter extends Panel
+{
+ protected AlignViewport av;
+
+ protected AlignmentPanel ap;
+
+ protected int[] annmap;
+
+ protected boolean enableSeqAss = false;
+
+ private jalview.datamodel.AlignmentAnnotation currentAnnotation;
+
+ protected boolean adjusting = false;
+
+ protected Checkbox currentColours = new Checkbox();
+
+ protected Panel minColour = new Panel();
+
+ protected Panel maxColour = new Panel();
+
+ protected Checkbox seqAssociated = new Checkbox();
+
+ protected Checkbox thresholdIsMin = new Checkbox();
+
+ protected Scrollbar slider = new Scrollbar(Scrollbar.HORIZONTAL);
+
+ protected TextField thresholdValue = new TextField(20);
+
+ protected Frame frame;
+
+ protected Button ok = new Button();
+
+ protected Button cancel = new Button();
+
+ /**
+ * enabled if the user is dragging the slider - try to keep updates to a
+ * minimun
+ */
+ protected boolean sliderDragging = false;
+
+
+ public AnnotationRowFilter(AlignViewport av, final AlignmentPanel ap)
+ {
+ this.av = av;
+ this.ap = ap;
+ }
+
+ public AnnotationRowFilter()
+ {
+
+ }
+
+
+ public Vector getAnnotationItems(boolean isSeqAssociated)
+ {
+ Vector list = new Vector();
+ int index = 1;
+ int[] anmap = new int[av.getAlignment().getAlignmentAnnotation().length];
+ for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
+ {
+ if (av.getAlignment().getAlignmentAnnotation()[i].sequenceRef == null)
+ {
+ if (isSeqAssociated)
+ {
+ continue;
+ }
+ }
+ else
+ {
+ enableSeqAss = true;
+ }
+ String label = av.getAlignment().getAlignmentAnnotation()[i].label;
+ if (!list.contains(label))
+ {
+ anmap[list.size()] = i;
+ list.add(label);
+
+ }
+ else
+ {
+ if (!isSeqAssociated)
+ {
+ anmap[list.size()] = i;
+ list.add(label + "_" + (index++));
+ }
+ }
+ }
+ this.annmap = new int[list.size()];
+ System.arraycopy(anmap, 0, this.annmap, 0, this.annmap.length);
+ return list;
+ }
+
+ protected int getSelectedThresholdItem(int indexValue)
+ {
+ int selectedThresholdItem = -1;
+ if (indexValue == 1)
+ {
+ selectedThresholdItem = AnnotationColourGradient.ABOVE_THRESHOLD;
+ }
+ else if (indexValue == 2)
+ {
+ selectedThresholdItem = AnnotationColourGradient.BELOW_THRESHOLD;
+ }
+ return selectedThresholdItem;
+ }
+
+ public void modelChanged()
+ {
+ seqAssociated.setEnabled(enableSeqAss);
+ }
+
+ public void ok_actionPerformed(ActionEvent e)
+ {
+ updateView();
+ frame.setVisible(false);
+ }
+
+ public void cancel_actionPerformed(ActionEvent e)
+ {
+ reset();
+ ap.paintAlignment(true);
+ frame.setVisible(false);
+ }
+
+ public void thresholdCheck_actionPerformed(ActionEvent e)
+ {
+ updateView();
+ }
+
+ public void annotations_actionPerformed(ActionEvent e)
+ {
+ updateView();
+ }
+
+ public void threshold_actionPerformed(ActionEvent e)
+ {
+ updateView();
+ }
+
+ public void thresholdValue_actionPerformed(ActionEvent e)
+ {
+ try
+ {
+ float f = Float.parseFloat(thresholdValue.getText());
+ slider.setValue((int) (f * 1000));
+ updateView();
+ } catch (NumberFormatException ex)
+ {
+ }
+ }
+
+
+ protected void populateThresholdComboBox(Choice threshold)
+ {
+ threshold.addItem(MessageManager
+ .getString("label.threshold_feature_no_thereshold"));
+ threshold.addItem(MessageManager
+ .getString("label.threshold_feature_above_thereshold"));
+ threshold.addItem(MessageManager
+ .getString("label.threshold_feature_below_thereshold"));
+ }
+
+
+ public jalview.datamodel.AlignmentAnnotation getCurrentAnnotation()
+ {
+ return currentAnnotation;
+ }
+
+ public void setCurrentAnnotation(
+ jalview.datamodel.AlignmentAnnotation currentAnnotation)
+ {
+ this.currentAnnotation = currentAnnotation;
+ }
+
+ public abstract void valueChanged(boolean updateAllAnnotation);
+
+ public abstract void updateView();
+
+ public abstract void reset();
+}
\ No newline at end of file
else if (evt.getSource() == seqColour)
{
setEnabled(seqColour);
- jmb.colourBySequence(ap.av.getShowSequenceFeatures(), ap);
+ jmb.colourBySequence(ap.av.isShowSequenceFeatures(), ap);
}
else if (!allChainsSelected)
{
public void updateColours(Object source)
{
AlignmentPanel ap = (AlignmentPanel) source;
- jmb.colourBySequence(ap.av.getShowSequenceFeatures(), ap);
+ jmb.colourBySequence(ap.av.isShowSequenceFeatures(), ap);
}
public void updateTitleAndMenus()
return;
}
setChainMenuItems(jmb.chainNames);
- jmb.colourBySequence(ap.av.getShowSequenceFeatures(), ap);
+ jmb.colourBySequence(ap.av.isShowSequenceFeatures(), ap);
setTitle(jmb.getViewerTitle());
}
AlignmentViewPanel alignment)
{
AlignmentPanel ap = (AlignmentPanel) alignment;
- if (appletJmolBinding.ap.av.showSequenceFeatures)
+ if (appletJmolBinding.ap.av.isShowSequenceFeatures())
{
if (appletJmolBinding.fr == null)
{
public void updateColours(Object source)
{
AlignmentPanel ap = (AlignmentPanel) source;
- colourBySequence(ap.av.getShowSequenceFeatures(), ap);
+ colourBySequence(ap.av.isShowSequenceFeatures(), ap);
}
public void showUrl(String url)
*/
package jalview.appletgui;
-import java.awt.*;
-import java.awt.event.*;
-
-import jalview.datamodel.*;
-import jalview.io.*;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.Sequence;
+import jalview.io.AnnotationFile;
+import jalview.io.AppletFormatAdapter;
+import jalview.io.IdentifyFile;
+import jalview.io.TCoffeeScoreFile;
import jalview.schemes.TCoffeeColourScheme;
import jalview.util.MessageManager;
+import java.awt.BorderLayout;
+import java.awt.Button;
+import java.awt.Dialog;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Panel;
+import java.awt.TextArea;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
public class CutAndPasteTransfer extends Panel implements ActionListener,
MouseListener
{
pdb.setFile(text);
if (alignFrame.alignPanel.av.applet.jmolAvailable)
+ {
new jalview.appletgui.AppletJmol(pdb, new Sequence[]
{ seq }, null, alignFrame.alignPanel, AppletFormatAdapter.PASTE);
+ }
else
-
+ {
new MCview.AppletPDBViewer(pdb, new Sequence[]
{ seq }, null, alignFrame.alignPanel, AppletFormatAdapter.PASTE);
+ }
}
else if (treeImport)
}
if (tcf == null)
{
- if (new AnnotationFile().readAnnotationFile(
- alignFrame.viewport.getAlignment(), textarea.getText(),
+ if (new AnnotationFile().annotateAlignmentView(alignFrame.viewport,
+ textarea.getText(),
jalview.io.AppletFormatAdapter.PASTE))
{
alignFrame.alignPanel.fontChanged();
public FeatureRenderer getFeatureRenderer(AlignmentViewPanel alignment)
{
AlignmentPanel ap = (AlignmentPanel) alignment;
- if (ap.av.showSequenceFeatures)
+ if (ap.av.isShowSequenceFeatures())
{
return ap.getFeatureRenderer();
}
{
this.type = type;
fr = frenderer;
- float mm[] = ((float[][]) fr.minmax.get(type))[0];
+ float mm[] = ((float[][]) fr.getMinMax().get(type))[0];
min = mm[0];
max = mm[1];
- oldcs = fr.featureColours.get(type);
+ oldcs = fr.getFeatureColours().get(type);
if (oldcs instanceof GraduatedColor)
{
cs = new GraduatedColor((GraduatedColor) oldcs, min, max);
{
// cancel
reset();
- PaintRefresher.Refresh(this, fr.av.getSequenceSetId());
+ PaintRefresher.Refresh(this, fr.getViewport().getSequenceSetId());
frame.setVisible(false);
}
}
threshline.value = (float) slider.getValue() / 1000f;
cs.setThresh(threshline.value);
changeColour();
- PaintRefresher.Refresh(this, fr.av.getSequenceSetId());
+ PaintRefresher.Refresh(this, fr.getViewport().getSequenceSetId());
// ap.paintAlignment(false);
}
}
}
- fr.featureColours.put(type, acg);
+ fr.setColour(type, acg);
cs = acg;
- PaintRefresher.Refresh(this, fr.av.getSequenceSetId());
+ PaintRefresher.Refresh(this, fr.getViewport().getSequenceSetId());
// ap.paintAlignment(false);
}
void reset()
{
- fr.featureColours.put(type, oldcs);
- PaintRefresher.Refresh(this, fr.av.getSequenceSetId());
+ fr.setColour(type, oldcs);
+ PaintRefresher.Refresh(this, fr.getViewport().getSequenceSetId());
// ap.paintAlignment(true);
}
}
else
{
- PaintRefresher.Refresh(this, fr.av.getSequenceSetId());
+ PaintRefresher.Refresh(this, fr.getViewport().getSequenceSetId());
}
// ap.paintAlignment(true);
}
package jalview.appletgui;
import java.util.*;
-
import java.awt.*;
-
import java.awt.event.*;
import jalview.datamodel.*;
import jalview.schemes.AnnotationColourGradient;
import jalview.schemes.GraduatedColor;
import jalview.util.MessageManager;
+import jalview.viewmodel.seqfeatures.FeaturesDisplayed;
/**
* DOCUMENT ME!
* @author $author$
* @version $Revision$
*/
-public class FeatureRenderer implements jalview.api.FeatureRenderer
+public class FeatureRenderer extends jalview.renderer.seqfeatures.FeatureRenderer
{
- AlignViewport av;
-
- Hashtable featureColours = new Hashtable();
-
- // A higher level for grouping features of a
- // particular type
- Hashtable featureGroups = null;
// Holds web links for feature groups and feature types
// in the form label|link
Hashtable featureLinks = null;
- // This is actually an Integer held in the hashtable,
- // Retrieved using the key feature type
- Object currentColour;
-
- String[] renderOrder;
-
- FontMetrics fm;
-
- int charOffset;
-
- float transparency = 1f;
-
- TransparencySetter transparencySetter = null;
-
/**
* Creates a new FeatureRenderer object.
*
*/
public FeatureRenderer(AlignViewport av)
{
+ super();
this.av = av;
- if (!System.getProperty("java.version").startsWith("1.1"))
- {
- transparencySetter = new TransparencySetter();
- }
- }
-
- public void transferSettings(FeatureRenderer fr)
- {
- renderOrder = fr.renderOrder;
- featureGroups = fr.featureGroups;
- featureColours = fr.featureColours;
- transparency = fr.transparency;
- if (av != null && fr.av != null && fr.av != av)
- {
- if (fr.av.featuresDisplayed != null)
- {
- if (av.featuresDisplayed == null)
- {
- av.featuresDisplayed = new Hashtable();
- }
- else
- {
- av.featuresDisplayed.clear();
- }
- Enumeration en = fr.av.featuresDisplayed.keys();
- while (en.hasMoreElements())
- {
- av.featuresDisplayed.put(en.nextElement(), Boolean.TRUE);
- }
- }
- }
+ setTransparencyAvailable(!System.getProperty("java.version").startsWith("1.1"));
}
static String lastFeatureAdded;
}
ffile.parseDescriptionHTML(sf, false);
+ setVisible(lastFeatureAdded); // if user edited name then make sure new type is visible
}
if (deleteFeature)
{
ffile.parseDescriptionHTML(features[i], false);
}
- if (av.featuresDisplayed == null)
- {
- av.featuresDisplayed = new Hashtable();
- }
-
- if (featureGroups == null)
- {
- featureGroups = new Hashtable();
- }
-
col = colourPanel.getBackground();
// setColour(lastFeatureAdded, fcol);
if (lastFeatureGroupAdded != null)
{
- featureGroups.put(lastFeatureGroupAdded, new Boolean(true));
- }
- if (fcol instanceof Color)
- {
- setColour(lastFeatureAdded, fcol);
+ setGroupVisibility(lastFeatureGroupAdded, true);
}
- av.featuresDisplayed.put(lastFeatureAdded,
- getFeatureStyle(lastFeatureAdded));
-
- findAllFeatures();
-
- String[] tro = new String[renderOrder.length];
- tro[0] = renderOrder[renderOrder.length - 1];
- System.arraycopy(renderOrder, 0, tro, 1, renderOrder.length - 1);
- renderOrder = tro;
+ setColour(lastFeatureAdded, fcol);
+ setVisible(lastFeatureAdded);
+ findAllFeatures(false); // different to original applet behaviour ?
+ // findAllFeatures();
}
else
{
}
}
// refresh the alignment and the feature settings dialog
- if (av.featureSettings != null)
+ if (((jalview.appletgui.AlignViewport) av).featureSettings != null)
{
- av.featureSettings.refreshTable();
+ ((jalview.appletgui.AlignViewport) av).featureSettings.refreshTable();
}
// findAllFeatures();
return true;
}
-
- public Color findFeatureColour(Color initialCol, SequenceI seq, int i)
- {
- overview = true;
- if (!av.showSequenceFeatures)
- {
- return initialCol;
- }
-
- lastSeq = seq;
- sequenceFeatures = lastSeq.getSequenceFeatures();
- if (sequenceFeatures == null)
- {
- return initialCol;
- }
-
- sfSize = sequenceFeatures.length;
-
- if (jalview.util.Comparison.isGap(lastSeq.getCharAt(i)))
- {
- return Color.white;
- }
-
- currentColour = null;
-
- drawSequence(null, lastSeq, lastSeq.findPosition(i), -1, -1);
-
- if (currentColour == null)
- {
- return initialCol;
- }
-
- return new Color(((Integer) currentColour).intValue());
- }
-
- /**
- * This is used by the Molecule Viewer to get the accurate colour of the
- * rendered sequence
- */
- boolean overview = false;
-
- /**
- * DOCUMENT ME!
- *
- * @param g
- * DOCUMENT ME!
- * @param seq
- * DOCUMENT ME!
- * @param sg
- * DOCUMENT ME!
- * @param start
- * DOCUMENT ME!
- * @param end
- * DOCUMENT ME!
- * @param x1
- * DOCUMENT ME!
- * @param y1
- * DOCUMENT ME!
- * @param width
- * DOCUMENT ME!
- * @param height
- * DOCUMENT ME!
- */
- // String type;
- // SequenceFeature sf;
- SequenceI lastSeq;
-
- SequenceFeature[] sequenceFeatures;
-
- int sfSize, sfindex, spos, epos;
-
- synchronized public void drawSequence(Graphics g, SequenceI seq,
- int start, int end, int y1)
- {
- if (seq.getSequenceFeatures() == null
- || seq.getSequenceFeatures().length == 0)
- {
- return;
- }
-
- if (transparencySetter != null && g != null)
- {
- transparencySetter.setTransparency(g, transparency);
- }
-
- if (lastSeq == null || seq != lastSeq
- || sequenceFeatures != seq.getSequenceFeatures())
- {
- lastSeq = seq;
- sequenceFeatures = seq.getSequenceFeatures();
- sfSize = sequenceFeatures.length;
- }
-
- if (av.featuresDisplayed == null || renderOrder == null)
- {
- findAllFeatures();
- if (av.featuresDisplayed.size() < 1)
- {
- return;
- }
-
- sequenceFeatures = seq.getSequenceFeatures();
- sfSize = sequenceFeatures.length;
- }
- if (!overview)
- {
- spos = lastSeq.findPosition(start);
- epos = lastSeq.findPosition(end);
- if (g != null)
- {
- fm = g.getFontMetrics();
- }
- }
- String type;
- for (int renderIndex = 0; renderIndex < renderOrder.length; renderIndex++)
- {
- type = renderOrder[renderIndex];
- if (!av.featuresDisplayed.containsKey(type))
- {
- continue;
- }
-
- // loop through all features in sequence to find
- // current feature to render
- for (sfindex = 0; sfindex < sfSize; sfindex++)
- {
- if (!sequenceFeatures[sfindex].type.equals(type))
- {
- continue;
- }
-
- if (featureGroups != null
- && sequenceFeatures[sfindex].featureGroup != null
- && featureGroups
- .containsKey(sequenceFeatures[sfindex].featureGroup)
- && !((Boolean) featureGroups
- .get(sequenceFeatures[sfindex].featureGroup))
- .booleanValue())
- {
- continue;
- }
-
- if (!overview
- && (sequenceFeatures[sfindex].getBegin() > epos || sequenceFeatures[sfindex]
- .getEnd() < spos))
- {
- continue;
- }
-
- if (overview)
- {
- if (sequenceFeatures[sfindex].begin <= start
- && sequenceFeatures[sfindex].end >= start)
- {
- currentColour = new Integer(
- getColour(sequenceFeatures[sfindex]).getRGB());// av.featuresDisplayed
- // .get(sequenceFeatures[sfindex].type);
- }
-
- }
- else if (sequenceFeatures[sfindex].type.equals("disulfide bond"))
- {
-
- renderFeature(g, seq,
- seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
- seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
- getColour(sequenceFeatures[sfindex])
- // new Color(((Integer) av.featuresDisplayed
- // .get(sequenceFeatures[sfindex].type)).intValue())
- , start, end, y1);
- renderFeature(g, seq,
- seq.findIndex(sequenceFeatures[sfindex].end) - 1,
- seq.findIndex(sequenceFeatures[sfindex].end) - 1,
- getColour(sequenceFeatures[sfindex])
- // new Color(((Integer) av.featuresDisplayed
- // .get(sequenceFeatures[sfindex].type)).intValue())
- , start, end, y1);
-
- }
- else
- {
- if (showFeature(sequenceFeatures[sfindex]))
- {
- renderFeature(g, seq,
- seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
- seq.findIndex(sequenceFeatures[sfindex].end) - 1,
- getColour(sequenceFeatures[sfindex]), start, end, y1);
- }
- }
-
- }
- }
-
- if (transparencySetter != null && g != null)
- {
- transparencySetter.setTransparency(g, 1.0f);
- }
- }
-
- char s;
-
- int i;
-
- void renderFeature(Graphics g, SequenceI seq, int fstart, int fend,
- Color featureColour, int start, int end, int y1)
- {
-
- if (((fstart <= end) && (fend >= start)))
- {
- if (fstart < start)
- { // fix for if the feature we have starts before the sequence start,
- fstart = start; // but the feature end is still valid!!
- }
-
- if (fend >= end)
- {
- fend = end;
- }
-
- for (i = fstart; i <= fend; i++)
- {
- s = seq.getCharAt(i);
-
- if (jalview.util.Comparison.isGap(s))
- {
- continue;
- }
-
- g.setColor(featureColour);
-
- g.fillRect((i - start) * av.charWidth, y1, av.charWidth,
- av.charHeight);
-
- if (!av.validCharWidth)
- {
- continue;
- }
-
- g.setColor(Color.white);
- charOffset = (av.charWidth - fm.charWidth(s)) / 2;
- g.drawString(String.valueOf(s), charOffset
- + (av.charWidth * (i - start)), (y1 + av.charHeight)
- - av.charHeight / 5); // pady = height / 5;
-
- }
- }
- }
-
- Hashtable minmax = null;
-
- /**
- * Called when alignment in associated view has new/modified features to
- * discover and display.
- *
- */
- public void featuresAdded()
- {
- lastSeq = null;
- findAllFeatures();
- }
-
- /**
- * find all features on the alignment
- */
- void findAllFeatures()
- {
- jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme();
-
- av.featuresDisplayed = new Hashtable();
- Vector allfeatures = new Vector();
- minmax = new Hashtable();
- AlignmentI alignment = av.getAlignment();
- for (int i = 0; i < alignment.getHeight(); i++)
- {
- SequenceFeature[] features = alignment.getSequenceAt(i)
- .getSequenceFeatures();
-
- if (features == null)
- {
- continue;
- }
-
- int index = 0;
- while (index < features.length)
- {
- if (features[index].begin == 0 && features[index].end == 0)
- {
- index++;
- continue;
- }
- if (!av.featuresDisplayed.containsKey(features[index].getType()))
- {
- if (getColour(features[index].getType()) == null)
- {
- featureColours.put(features[index].getType(),
- ucs.createColourFromName(features[index].getType()));
- }
-
- av.featuresDisplayed.put(features[index].getType(), new Integer(
- getColour(features[index].getType()).getRGB()));
- allfeatures.addElement(features[index].getType());
- }
- if (features[index].score != Float.NaN)
- {
- int nonpos = features[index].getBegin() >= 1 ? 0 : 1;
- float[][] mm = (float[][]) minmax.get(features[index].getType());
- if (mm == null)
- {
- mm = new float[][]
- { null, null };
- minmax.put(features[index].getType(), mm);
- }
- if (mm[nonpos] == null)
- {
- mm[nonpos] = new float[]
- { features[index].score, features[index].score };
-
- }
- else
- {
- if (mm[nonpos][0] > features[index].score)
- {
- mm[nonpos][0] = features[index].score;
- }
- if (mm[nonpos][1] < features[index].score)
- {
- mm[nonpos][1] = features[index].score;
- }
- }
- }
-
- index++;
- }
- }
-
- renderOrder = new String[allfeatures.size()];
- Enumeration en = allfeatures.elements();
- int i = allfeatures.size() - 1;
- while (en.hasMoreElements())
- {
- renderOrder[i] = en.nextElement().toString();
- i--;
- }
- }
-
- /**
- * get a feature style object for the given type string. Creates a
- * java.awt.Color for a featureType with no existing colourscheme. TODO:
- * replace return type with object implementing standard abstract colour/style
- * interface
- *
- * @param featureType
- * @return java.awt.Color or GraduatedColor
- */
- public Object getFeatureStyle(String featureType)
- {
- Object fc = featureColours.get(featureType);
- if (fc == null)
- {
- jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme();
- Color col = ucs.createColourFromName(featureType);
- featureColours.put(featureType, fc = col);
- }
- return fc;
- }
-
- public Color getColour(String featureType)
- {
- Object fc = getFeatureStyle(featureType);
-
- if (fc instanceof Color)
- {
- return (Color) fc;
- }
- else
- {
- if (fc instanceof GraduatedColor)
- {
- return ((GraduatedColor) fc).getMaxColor();
- }
- }
- throw new Error(MessageManager.formatMessage("error.implementation_error_unrecognised_render_object_for_features_type", new String[]{fc.getClass().getCanonicalName(),featureType}));
- }
-
- /**
- *
- * @param sequenceFeature
- * @return true if feature is visible.
- */
- private boolean showFeature(SequenceFeature sequenceFeature)
- {
- Object fc = getFeatureStyle(sequenceFeature.type);
- if (fc instanceof GraduatedColor)
- {
- return ((GraduatedColor) fc).isColored(sequenceFeature);
- }
- else
- {
- return true;
- }
- }
-
- /**
- * implement graduated colouring for features with scores
- *
- * @param feature
- * @return render colour for the given feature
- */
- public Color getColour(SequenceFeature feature)
- {
- Object fc = getFeatureStyle(feature.getType());
- if (fc instanceof Color)
- {
- return (Color) fc;
- }
- else
- {
- if (fc instanceof GraduatedColor)
- {
- return ((GraduatedColor) fc).findColor(feature);
- }
- }
- throw new Error("Implementation Error: Unrecognised render object "
- + fc.getClass() + " for features of type " + feature.getType());
- }
-
- public void setColour(String featureType, Object col)
- {
- // overwrite
- // Color _col = (col instanceof Color) ? ((Color) col) : (col instanceof
- // GraduatedColor) ? ((GraduatedColor) col).getMaxColor() : null;
- // Object c = featureColours.get(featureType);
- // if (c == null || c instanceof Color || (c instanceof GraduatedColor &&
- // !((GraduatedColor)c).getMaxColor().equals(_col)))
- {
- featureColours.put(featureType, col);
- }
- }
-
- public void setFeaturePriority(Object[][] data)
- {
- // The feature table will display high priority
- // features at the top, but theses are the ones
- // we need to render last, so invert the data
- if (av.featuresDisplayed != null)
- {
- av.featuresDisplayed.clear();
- }
-
- /*
- * if (visibleNew) { if (av.featuresDisplayed != null) {
- * av.featuresDisplayed.clear(); } else { av.featuresDisplayed = new
- * Hashtable(); } } if (data == null) { return; }
- */
-
- renderOrder = new String[data.length];
-
- if (data.length > 0)
- {
- for (int i = 0; i < data.length; i++)
- {
- String type = data[i][0].toString();
- setColour(type, data[i][1]);
- if (((Boolean) data[i][2]).booleanValue())
- {
- av.featuresDisplayed.put(type, new Integer(getColour(type)
- .getRGB()));
- }
-
- renderOrder[data.length - i - 1] = type;
- }
- }
- }
-
- /**
- * @return a simple list of feature group names or null
- */
- public String[] getGroups()
- {
- buildGroupHash();
- if (featureGroups != null)
- {
- String[] gps = new String[featureGroups.size()];
- Enumeration gn = featureGroups.keys();
- int i = 0;
- while (gn.hasMoreElements())
- {
- gps[i++] = (String) gn.nextElement();
- }
- return gps;
- }
- return null;
- }
-
- /**
- * get visible or invisible groups
- *
- * @param visible
- * true to return visible groups, false to return hidden ones.
- * @return list of groups
- */
- public String[] getGroups(boolean visible)
- {
- buildGroupHash();
- if (featureGroups != null)
- {
- Vector gp = new Vector();
-
- Enumeration gn = featureGroups.keys();
- while (gn.hasMoreElements())
- {
- String nm = (String) gn.nextElement();
- Boolean state = (Boolean) featureGroups.get(nm);
- if (state.booleanValue() == visible)
- {
- gp.addElement(nm);
- }
- }
- String[] gps = new String[gp.size()];
- gp.copyInto(gps);
-
- int i = 0;
- while (gn.hasMoreElements())
- {
- gps[i++] = (String) gn.nextElement();
- }
- return gps;
- }
- return null;
- }
-
- /**
- * set all feature groups in toset to be visible or invisible
- *
- * @param toset
- * group names
- * @param visible
- * the state of the named groups to set
- */
- public void setGroupState(String[] toset, boolean visible)
- {
- buildGroupHash();
- if (toset != null && toset.length > 0 && featureGroups != null)
- {
- boolean rdrw = false;
- for (int i = 0; i < toset.length; i++)
- {
- Object st = featureGroups.get(toset[i]);
- featureGroups.put(toset[i], new Boolean(visible));
- if (st != null)
- {
- rdrw = rdrw || (visible != ((Boolean) st).booleanValue());
- }
- }
- if (rdrw)
- {
- if (this.av != null)
- if (this.av.featureSettings != null)
- {
- av.featureSettings.rebuildGroups();
- this.av.featureSettings.resetTable(true);
- }
- else
- {
- buildFeatureHash();
- }
- if (av != null)
- {
- av.alignmentChanged(null);
- }
- }
- }
- }
-
- ArrayList<String> hiddenGroups = new ArrayList<String>();
-
- /**
- * analyse alignment for groups and hash tables (used to be embedded in
- * FeatureSettings.setTableData)
- *
- * @return true if features are on the alignment
- */
- public boolean buildGroupHash()
- {
- boolean alignmentHasFeatures = false;
- if (featureGroups == null)
- {
- featureGroups = new Hashtable();
- }
- hiddenGroups = new ArrayList<String>();
- hiddenGroups.addAll(featureGroups.keySet());
- ArrayList allFeatures = new ArrayList();
- ArrayList allGroups = new ArrayList();
- SequenceFeature[] tmpfeatures;
- String group;
- AlignmentI alignment = av.getAlignment();
- for (int i = 0; i < alignment.getHeight(); i++)
- {
- if (alignment.getSequenceAt(i).getSequenceFeatures() == null)
- {
- continue;
- }
-
- alignmentHasFeatures = true;
-
- tmpfeatures = alignment.getSequenceAt(i).getSequenceFeatures();
- int index = 0;
- while (index < tmpfeatures.length)
- {
- if (tmpfeatures[index].getFeatureGroup() != null)
- {
- group = tmpfeatures[index].featureGroup;
- // Remove group from the hiddenGroup list
- hiddenGroups.remove(group);
- if (!allGroups.contains(group))
- {
- allGroups.add(group);
-
- boolean visible = true;
- if (featureGroups.containsKey(group))
- {
- visible = ((Boolean) featureGroups.get(group)).booleanValue();
- }
- else
- {
- featureGroups.put(group, new Boolean(visible));
- }
- }
- }
-
- if (!allFeatures.contains(tmpfeatures[index].getType()))
- {
- allFeatures.add(tmpfeatures[index].getType());
- }
- index++;
- }
- }
-
- return alignmentHasFeatures;
- }
-
- /**
- * rebuild the featuresDisplayed and renderorder list based on the
- * featureGroups hash and any existing display state and force a repaint if
- * necessary
- *
- * @return true if alignment has visible features
- */
- public boolean buildFeatureHash()
- {
- boolean alignmentHasFeatures = false;
- if (featureGroups == null)
- {
- alignmentHasFeatures = buildGroupHash();
- }
- if (!alignmentHasFeatures)
- return false;
- Hashtable fdisp = av.featuresDisplayed;
- Vector allFeatures = new Vector();
- SequenceFeature[] tmpfeatures;
- String group;
- AlignmentI alignment = av.getAlignment();
- for (int i = 0; i < alignment.getHeight(); i++)
- {
- if (alignment.getSequenceAt(i).getSequenceFeatures() == null)
- {
- continue;
- }
-
- alignmentHasFeatures = true;
-
- tmpfeatures = alignment.getSequenceAt(i).getSequenceFeatures();
- int index = 0;
- while (index < tmpfeatures.length)
- {
- boolean visible = true;
- if (tmpfeatures[index].getFeatureGroup() != null)
- {
- group = tmpfeatures[index].featureGroup;
- if (featureGroups.containsKey(group))
- {
- visible = ((Boolean) featureGroups.get(group)).booleanValue();
- }
- }
-
- if (visible && !allFeatures.contains(tmpfeatures[index].getType()))
- {
- allFeatures.addElement(tmpfeatures[index].getType());
- }
- index++;
- }
- }
- if (allFeatures.size() > 0)
- {
- String[] neworder = new String[allFeatures.size()];
- int p = neworder.length - 1;
- for (int i = renderOrder.length - 1; i >= 0; i--)
- {
- if (allFeatures.contains(renderOrder[i]))
- {
- neworder[p--] = renderOrder[i];
- allFeatures.removeElement(renderOrder[i]);
- }
- else
- {
- av.featuresDisplayed.remove(renderOrder[i]);
- }
- }
- for (int i = allFeatures.size() - 1; i > 0; i++)
- {
- Object e = allFeatures.elementAt(i);
- if (e != null)
- {
- neworder[p--] = (String) e;
- av.featuresDisplayed.put(e, getColour((String) e));
- }
- }
- renderOrder = neworder;
- return true;
- }
-
- return alignmentHasFeatures;
- }
-
- /**
- *
- * @return the displayed feature type as an array of strings
- */
- protected String[] getDisplayedFeatureTypes()
- {
- String[] typ = null;
- synchronized (renderOrder)
- {
- typ = new String[renderOrder.length];
- System.arraycopy(renderOrder, 0, typ, 0, typ.length);
- for (int i = 0; i < typ.length; i++)
- {
- if (av.featuresDisplayed.get(typ[i]) == null)
- {
- typ[i] = null;
- }
- }
- }
- return typ;
- }
-}
-
-class TransparencySetter
-{
- void setTransparency(Graphics g, float value)
- {
- Graphics2D g2 = (Graphics2D) g;
- g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
- value));
- }
}
package jalview.appletgui;
import java.util.*;
-
+import java.util.List;
import java.awt.*;
import java.awt.event.*;
ScrollPane scrollPane;
- boolean alignmentHasFeatures = false;
-
Image linkImage;
Scrollbar transparency;
fr = ap.seqPanel.seqCanvas.getFeatureRenderer();
transparency = new Scrollbar(Scrollbar.HORIZONTAL,
- 100 - (int) (fr.transparency * 100), 1, 1, 100);
+ 100 - (int) (fr.getTransparency() * 100), 1, 1, 100);
- if (fr.transparencySetter != null)
+ if (fr.isTransparencyAvailable())
{
transparency.addAdjustmentListener(this);
}
linkImage = java.awt.Toolkit.getDefaultToolkit().getImage(url);
}
- if (av.featuresDisplayed == null)
+ if (av.isShowSequenceFeatures() || !fr.hasRenderOrder())
{
- fr.findAllFeatures();
+ fr.findAllFeatures(true); // was default - now true to make all visible
}
setTableData();
this.setLayout(new BorderLayout());
scrollPane = new ScrollPane();
scrollPane.add(featurePanel);
- if (alignmentHasFeatures)
+ if (fr.getAllFeatureColours()!=null && fr.getAllFeatureColours().size()>0)
{
add(scrollPane, BorderLayout.CENTER);
}
Panel tPanel = new Panel(new BorderLayout());
- if (fr.transparencySetter != null)
+ if (fr.isTransparencyAvailable())
{
tPanel.add(transparency, BorderLayout.CENTER);
tPanel.add(new Label("Transparency"), BorderLayout.EAST);
{
groupPanel
.setLayout(new GridLayout(
- (fr.featureGroups.size() - fr.hiddenGroups.size()) / 4 + 1,
- 4));
+ (fr.getFeatureGroupsSize()) / 4 + 1,
+ 4)); // JBPNote - this was scaled on number of visible groups. seems broken
groupPanel.validate();
add(groupPanel, BorderLayout.NORTH);
public void actionPerformed(ActionEvent e)
{
- me.sortByScore(new String[]
+ me.ap.alignFrame.avc.sortAlignmentByFeatureScore(new String[]
{ type });
}
public void actionPerformed(ActionEvent e)
{
- me.sortByDens(new String[]
+ me.ap.alignFrame.avc.sortAlignmentByFeatureDensity(new String[]
{ type });
}
public void setTableData()
{
- alignmentHasFeatures = fr.buildGroupHash();
- if (alignmentHasFeatures)
+ if (fr.getAllFeatureColours()!=null && fr.getAllFeatureColours().size()>0)
{
rebuildGroups();
}
// TODO: JAL-964 - smoothly incorporate new group entries if panel already
// displayed and new groups present
- Enumeration gps = fr.featureGroups.keys();
- while (gps.hasMoreElements())
+ for (String group:(List<String>)fr.getFeatureGroups())
{
- String group = (String) gps.nextElement();
- Boolean vis = (Boolean) fr.featureGroups.get(group);
- Checkbox check = new MyCheckbox(group, vis.booleanValue(),
+ boolean vis = fr.checkGroupVisibility(group, false);
+ Checkbox check = new MyCheckbox(group, vis,
(fr.featureLinks != null && fr.featureLinks
.containsKey(group)));
check.addMouseListener(this);
check.setFont(new Font("Serif", Font.BOLD, 12));
- check.addItemListener(this);
- check.setVisible(fr.hiddenGroups.contains(group));
+ check.addItemListener(groupItemListener);
+ // note - visibility seems to correlate with displayed. ???wtf ??
+ check.setVisible(vis);
groupPanel.add(check);
}
if (rdrw)
groupPanel.validate();
}
}
-
// This routine adds and removes checkboxes depending on
// Group selection states
void resetTable(boolean groupsChanged)
{
group = tmpfeatures[index].featureGroup;
- if (group == null || fr.featureGroups.get(group) == null
- || ((Boolean) fr.featureGroups.get(group)).booleanValue())
+ if (group == null || fr.checkGroupVisibility(group, true))
{
type = tmpfeatures[index].getType();
if (!visibleChecks.contains(type))
}
}
- if (fr.renderOrder != null)
+ if (fr.getRenderOrder() != null)
{
// First add the checks in the previous render order,
// in case the window has been closed and reopened
- for (int ro = fr.renderOrder.length - 1; ro > -1; ro--)
+ List<String> rol = fr.getRenderOrder();
+ for (int ro = rol.size() - 1; ro > -1; ro--)
{
- String item = fr.renderOrder[ro];
+ String item = rol.get(ro);
if (!visibleChecks.contains(item))
{
if (addCheck)
{
boolean selected = false;
- if (groupsChanged || av.featuresDisplayed.containsKey(type))
+ if (groupsChanged || av.getFeaturesDisplayed().isVisible(type))
{
selected = true;
}
selectionChanged();
}
- public void itemStateChanged(ItemEvent evt)
- {
- if (evt != null)
- {
- // Is the source a top level featureGroup?
+ private ItemListener groupItemListener = new ItemListener() {
+ public void itemStateChanged(ItemEvent evt) {
Checkbox source = (Checkbox) evt.getSource();
- if (fr.featureGroups.containsKey(source.getLabel()))
+ fr.setGroupVisibility(source.getLabel(),
+ source.getState());
+ ap.seqPanel.seqCanvas.repaint();
+ if (ap.overviewPanel != null)
{
- fr.featureGroups.put(source.getLabel(),
- new Boolean(source.getState()));
- ap.seqPanel.seqCanvas.repaint();
- if (ap.overviewPanel != null)
- {
- ap.overviewPanel.updateOverviewImage();
- }
-
- resetTable(true);
- return;
+ ap.overviewPanel.updateOverviewImage();
}
- }
+ resetTable(true);
+ return;
+ };
+ };
+ public void itemStateChanged(ItemEvent evt)
+ {
selectionChanged();
}
MyCheckbox check = (MyCheckbox) evt.getSource();
if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) != 0)
{
- this.popupSort(check, fr.minmax, evt.getX(), evt.getY());
+ this.popupSort(check, fr.getMinMax(), evt.getX(), evt.getY());
}
if (fr.featureLinks != null && fr.featureLinks.containsKey(check.type))
{
public void adjustmentValueChanged(AdjustmentEvent evt)
{
- fr.transparency = ((float) (100 - transparency.getValue()) / 100f);
+ fr.setTransparency((float) (100 - transparency.getValue()) / 100f);
ap.seqPanel.seqCanvas.repaint();
}
}
}
- protected void sortByDens(String[] typ)
- {
- sortBy(typ, "Sort by Density", AlignmentSorter.FEATURE_DENSITY);
- }
-
- private String[] getDisplayedFeatureTypes()
- {
- String[] typ = null;
- if (fr != null)
- {
- synchronized (fr.renderOrder)
- {
- typ = new String[fr.renderOrder.length];
- System.arraycopy(fr.renderOrder, 0, typ, 0, typ.length);
- for (int i = 0; i < typ.length; i++)
- {
- if (av.featuresDisplayed.get(typ[i]) == null)
- {
- typ[i] = null;
- }
- }
- }
- }
- return typ;
- }
-
- protected void sortBy(String[] typ, String methodText, final String method)
- {
- if (typ == null)
- {
- typ = getDisplayedFeatureTypes();
- }
- String gps[] = null;
- gps = fr.getGroups(true);
- if (typ != null)
- {
- for (int i = 0; i < typ.length; i++)
- {
- System.err.println("Sorting on Types:" + typ[i]);
- }
- }
- if (gps != null)
- {
-
- for (int i = 0; i < gps.length; i++)
- {
- System.err.println("Sorting on groups:" + gps[i]);
- }
- }
- AlignmentPanel alignPanel = ap;
- AlignmentI al = alignPanel.av.getAlignment();
-
- int start, stop;
- SequenceGroup sg = alignPanel.av.getSelectionGroup();
- if (sg != null)
- {
- start = sg.getStartRes();
- stop = sg.getEndRes();
- }
- else
- {
- start = 0;
- stop = al.getWidth();
- }
- SequenceI[] oldOrder = al.getSequencesArray();
- AlignmentSorter.sortByFeature(typ, gps, start, stop, al, method);
- this.ap.alignFrame.addHistoryItem(new OrderCommand(methodText,
- oldOrder, alignPanel.av.getAlignment()));
- alignPanel.paintAlignment(true);
-
- }
-
- protected void sortByScore(String[] typ)
- {
- sortBy(typ, "Sort by Feature Score", AlignmentSorter.FEATURE_SCORE);
- }
-
}
features, true, ap))
{
ap.alignFrame.sequenceFeatures.setState(true);
- av.showSequenceFeatures(true);
+ av.setShowSequenceFeatures(true);
ap.highlightSearchResults(null);
}
}
SequenceI s = av.getAlignment().getSequenceAt(i);
gg.setFont(italic);
- if (av.hasHiddenRows())
+ if (av.isDisplayReferenceSeq() || av.hasHiddenRows())
{
setHiddenFont(s);
}
}
gg.setFont(italic);
// boolean isrep=false;
- if (av.hasHiddenRows())
+ if (av.isDisplayReferenceSeq() || av.hasHiddenRows())
{
// isrep =
setHiddenFont(seq);
Font bold = new Font(av.getFont().getName(), Font.BOLD, av.getFont()
.getSize());
- if (av.getHiddenRepSequences() != null
- && av.getHiddenRepSequences().containsKey(seq))
+ if (av.isHiddenRepSequence(seq))
{
gg.setFont(bold);
return true;
sr.renderGaps = false;
sr.forOverview = true;
fr = new FeatureRenderer(av);
- fr.overview = true;
// scale the initial size of overviewpanel to shape of alignment
float initialScale = (float) av.getAlignment().getWidth()
return;
}
- if (av.showSequenceFeatures)
+ if (av.isShowSequenceFeatures())
{
- fr.featureGroups = ap.seqPanel.seqCanvas.getFeatureRenderer().featureGroups;
- fr.featureColours = ap.seqPanel.seqCanvas.getFeatureRenderer().featureColours;
+ fr.transferSettings(ap.seqPanel.seqCanvas.fr);
}
resizing = true;
int alwidth = av.getAlignment().getWidth();
int alheight = av.getAlignment().getHeight();
- if (av.showSequenceFeatures)
+ if (av.isShowSequenceFeatures())
{
fr.transferSettings(ap.seqPanel.seqCanvas.getFeatureRenderer());
}
{
color = sr.getResidueBoxColour(seq, lastcol);
- if (av.showSequenceFeatures)
+ if (av.isShowSequenceFeatures())
{
color = fr.findFeatureColour(color, seq, lastcol);
}
*/
package jalview.appletgui;
-import java.awt.*;
-import java.awt.event.*;
-
-import jalview.datamodel.*;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.SequenceGroup;
import jalview.util.MessageManager;
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.MenuItem;
+import java.awt.Panel;
+import java.awt.PopupMenu;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+
public class ScalePanel extends Panel implements MouseMotionListener,
MouseListener
{
});
pop.add(item);
- if (av.getColumnSelection().getHiddenColumns().size() > 1)
+ if (av.getColumnSelection().hasManyHiddenColumns())
{
item = new MenuItem(MessageManager.getString("action.reveal_all"));
item.addActionListener(new ActionListener()
res = av.getColumnSelection().adjustForHiddenColumns(res);
reveal = null;
- for (int i = 0; i < av.getColumnSelection().getHiddenColumns().size(); i++)
+ for (int[] region : av.getColumnSelection().getHiddenColumns())
{
- int[] region = (int[]) av.getColumnSelection().getHiddenColumns()
- .elementAt(i);
if (res + 1 == region[0] || res - 1 == region[1])
{
reveal = region;
}
gg.drawLine(
- (int) (((i - startx - 1) * av.charWidth) + (av.charWidth / 2)),
+ ((i - startx - 1) * av.charWidth) + (av.charWidth / 2),
y + 2,
- (int) (((i - startx - 1) * av.charWidth) + (av.charWidth / 2)),
+ ((i - startx - 1) * av.charWidth) + (av.charWidth / 2),
y + (fm.getDescent() * 2));
}
else
{
gg.drawLine(
- (int) (((i - startx - 1) * av.charWidth) + (av.charWidth / 2)),
+ ((i - startx - 1) * av.charWidth) + (av.charWidth / 2),
y + fm.getDescent(),
- (int) (((i - startx - 1) * av.charWidth) + (av.charWidth / 2)),
+ ((i - startx - 1) * av.charWidth) + (av.charWidth / 2),
y + (fm.getDescent() * 2));
}
}
*/
package jalview.appletgui;
-import java.awt.*;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SearchResults;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
-import jalview.datamodel.*;
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.Panel;
public class SeqCanvas extends Panel
{
void drawPanel(Graphics g1, int startRes, int endRes, int startSeq,
int endSeq, int offset)
{
+
+
if (!av.hasHiddenColumns())
{
draw(g1, startRes, endRes, startSeq, endSeq, offset);
}
else
{
- java.util.Vector regions = av.getColumnSelection().getHiddenColumns();
int screenY = 0;
int blockStart = startRes;
int blockEnd = endRes;
- for (int i = 0; i < regions.size(); i++)
+ if (av.hasHiddenColumns())
{
- int[] region = (int[]) regions.elementAt(i);
- int hideStart = region[0];
- int hideEnd = region[1];
-
- if (hideStart <= blockStart)
+ for (int[] region : av.getColumnSelection().getHiddenColumns())
{
- blockStart += (hideEnd - hideStart) + 1;
- continue;
- }
+ int hideStart = region[0];
+ int hideEnd = region[1];
- blockEnd = hideStart - 1;
+ if (hideStart <= blockStart)
+ {
+ blockStart += (hideEnd - hideStart) + 1;
+ continue;
+ }
- g1.translate(screenY * av.charWidth, 0);
+ blockEnd = hideStart - 1;
- draw(g1, blockStart, blockEnd, startSeq, endSeq, offset);
+ g1.translate(screenY * av.charWidth, 0);
- if (av.getShowHiddenMarkers())
- {
- g1.setColor(Color.blue);
- g1.drawLine((blockEnd - blockStart + 1) * av.charWidth - 1,
- 0 + offset, (blockEnd - blockStart + 1) * av.charWidth
- - 1, (endSeq - startSeq) * av.charHeight + offset);
- }
+ draw(g1, blockStart, blockEnd, startSeq, endSeq, offset);
- g1.translate(-screenY * av.charWidth, 0);
- screenY += blockEnd - blockStart + 1;
- blockStart = hideEnd + 1;
- }
+ if (av.getShowHiddenMarkers())
+ {
+ g1.setColor(Color.blue);
+ g1.drawLine((blockEnd - blockStart + 1) * av.charWidth - 1,
+ 0 + offset, (blockEnd - blockStart + 1) * av.charWidth
+ - 1, (endSeq - startSeq) * av.charHeight
+ + offset);
+ }
+ g1.translate(-screenY * av.charWidth, 0);
+ screenY += blockEnd - blockStart + 1;
+ blockStart = hideEnd + 1;
+ }
+ }
if (screenY <= (endRes - startRes))
{
blockEnd = blockStart + (endRes - startRes) - screenY;
sr.drawSequence(nextSeq, av.getAlignment().findAllGroups(nextSeq),
startRes, endRes, offset + ((i - startSeq) * av.charHeight));
- if (av.showSequenceFeatures)
+ if (av.isShowSequenceFeatures())
{
fr.drawSequence(g, nextSeq, startRes, endRes, offset
+ ((i - startSeq) * av.charHeight));
if ((group == null) && (av.getAlignment().getGroups().size() > 0))
{
- group = (SequenceGroup) av.getAlignment().getGroups().get(0);
+ group = av.getAlignment().getGroups().get(0);
groupIndex = 0;
}
break;
}
- group = (SequenceGroup) av.getAlignment().getGroups()
+ group = av.getAlignment().getGroups()
.get(groupIndex);
} while (groupIndex < av.getAlignment().getGroups().size());
{
for (int i = 0; i < features.length; i++)
{
- if (av.featuresDisplayed == null
- || !av.featuresDisplayed.containsKey(features[i].getType()))
+ if (av.getFeaturesDisplayed() == null
+ || !av.getFeaturesDisplayed().isVisible(features[i].getType()))
{
continue;
}
if (features[i].featureGroup != null
- && seqCanvas.fr.featureGroups != null
- && seqCanvas.fr.featureGroups
- .containsKey(features[i].featureGroup)
- && !((Boolean) seqCanvas.fr.featureGroups
- .get(features[i].featureGroup)).booleanValue())
+ && !seqCanvas.fr.checkGroupVisibility(features[i].featureGroup,false))
{
continue;
}
}
char s = ' ';
-
+ boolean srep = av.isDisplayReferenceSeq();
for (int i = start; i <= end; i++)
{
graphics.setColor(Color.black);
}
if (currentSequenceGroup.getShowNonconserved())
{
- // cheat - use this if we have a consensus for each group: s =
- // getDisplayChar(currentSequenceGroup.getConsensus(), i, s, '.');
- s = getDisplayChar(av.getAlignmentConsensusAnnotation(), i, s,
+ s = getDisplayChar(srep, i, s,
'.');
}
}
}
if (av.getShowUnconserved())
{
- s = getDisplayChar(av.getAlignmentConsensusAnnotation(), i, s,
+ s = getDisplayChar(srep, i, s,
'.');
}
}
- private char getDisplayChar(AlignmentAnnotation consensus, int position,
+ private char getDisplayChar(final boolean usesrep, int position,
char s, char c)
{
- char conschar = consensus.annotations[position].displayCharacter
+ // TODO - use currentSequenceGroup rather than alignemnt
+ // currentSequenceGroup.getConsensus()
+ char conschar = (usesrep) ? av.getAlignment().getSeqrep().getCharAt(position) : av.getAlignmentConsensusAnnotation().annotations[position].displayCharacter
.charAt(0);
if (conschar != '-' && s == conschar)
{
--- /dev/null
+package jalview.appletgui;
+
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Label;
+import java.awt.Panel;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+public class TitledPanel extends Panel
+{
+
+ private String title;
+
+ private Insets insets = new Insets(10, 10, 10, 10);
+
+ public TitledPanel()
+ {
+ this("");
+ }
+
+ public TitledPanel(String title)
+ {
+ this.setTitle(title);
+ }
+
+ public Insets getInsets()
+ {
+ return insets;
+ }
+
+ public void paint(Graphics g)
+ {
+ super.paint(g);
+ g.setColor(getForeground());
+ g.drawRect(5, 5, getWidth() - 10, getHeight() - 10);
+ int width = g.getFontMetrics().stringWidth(getTitle());
+ g.setColor(getBackground());
+ g.fillRect(10, 0, width, 10);
+ g.setColor(getForeground());
+ g.drawString(getTitle(), 10, 10);
+ }
+
+ public static void main(String[] args)
+ {
+ Frame f = new Frame("TitledPanel Tester");
+
+ TitledPanel p = new TitledPanel("Title of Panel");
+ p.add(new Label("Label 1"));
+ p.add(new Label("Label 2"));
+ p.add(new Label("Label 3"));
+ f.add(p);
+
+ f.addWindowListener(new WindowAdapter()
+ {
+ public void windowClosing(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ });
+ f.setBounds(300, 300, 300, 300);
+ f.setVisible(true);
+ }
+
+ public String getTitle()
+ {
+ return title;
+ }
+
+ public void setTitle(String title)
+ {
+ this.title = title;
+ }
+}
\ No newline at end of file
*/
package jalview.appletgui;
-import java.awt.*;
-import java.awt.event.*;
-
-import jalview.analysis.*;
-import jalview.datamodel.*;
-import jalview.io.*;
+import jalview.analysis.NJTree;
+import jalview.api.analysis.ScoreModelI;
+import jalview.api.analysis.ViewBasedAnalysisI;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentView;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.SequenceI;
+import jalview.io.NewickFile;
+import jalview.schemes.ResidueProperties;
import jalview.util.MessageManager;
+import java.awt.BorderLayout;
+import java.awt.CheckboxMenuItem;
+import java.awt.Color;
+import java.awt.Menu;
+import java.awt.MenuBar;
+import java.awt.MenuItem;
+import java.awt.ScrollPane;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
public class TreePanel extends EmbmenuFrame implements ActionListener,
ItemListener
{
{
int start, end;
SequenceI[] seqs;
- boolean selview = (av.getSelectionGroup() != null)
- && (av.getSelectionGroup().getSize() > 1);
+ boolean selview = av.getSelectionGroup() != null
+ && av.getSelectionGroup().getSize() > 1;
AlignmentView seqStrings = av.getAlignmentView(selview);
if (!selview)
{
seqs = av.getSelectionGroup().getSequencesInOrder(
av.getAlignment());
}
-
- tree = new NJTree(seqs, seqStrings, type, pwtype, start, end);
+ ScoreModelI sm = ResidueProperties.getScoreModel(pwtype);
+ if (sm instanceof ViewBasedAnalysisI)
+ {
+ try
+ {
+ sm = sm.getClass().newInstance();
+ ((ViewBasedAnalysisI) sm)
+ .configureFromAlignmentView(treeCanvas.ap);
+ } catch (Exception q)
+ {
+ System.err.println("Couldn't create a scoremodel instance for "
+ + sm.getName());
+ q.printStackTrace();
+ }
+ tree = new NJTree(seqs, seqStrings, type, pwtype, sm, start, end);
+ }
+ else
+ {
+ tree = new NJTree(seqs, seqStrings, type, pwtype, null, start,
+ end);
+ }
}
tree.reCount(tree.getTopNode());
*/
public void loadAnnotationFrom(AlignFrame alf, String annotation)
{
- if (new AnnotationFile().readAnnotationFile(alf.getAlignViewport()
- .getAlignment(), annotation, AppletFormatAdapter.PASTE))
+ if (new AnnotationFile().annotateAlignmentView(alf.getAlignViewport(),
+ annotation, AppletFormatAdapter.PASTE))
{
alf.alignPanel.fontChanged();
alf.alignPanel.setScrollValues(0, 0);
param = applet.getParameter("showFeatureSettings");
if (param != null && param.equalsIgnoreCase("true"))
{
- newAlignFrame.viewport.showSequenceFeatures(true);
+ newAlignFrame.viewport.setShowSequenceFeatures(true);
new FeatureSettings(newAlignFrame.alignPanel);
}
{
param = setProtocolState(param);
- if (new AnnotationFile().readAnnotationFile(
- newAlignFrame.viewport.getAlignment(), param, protocol))
+ if (new AnnotationFile().annotateAlignmentView(
+ newAlignFrame.viewport, param, protocol))
{
newAlignFrame.alignPanel.fontChanged();
newAlignFrame.alignPanel.setScrollValues(0, 0);
*/
package jalview.controller;
-import java.awt.Color;
-import java.util.BitSet;
-import java.util.List;
-
+import jalview.analysis.AlignmentSorter;
import jalview.api.AlignViewControllerGuiI;
import jalview.api.AlignViewControllerI;
import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
+import jalview.api.FeatureRenderer;
+import jalview.commands.OrderCommand;
import jalview.datamodel.AlignmentI;
-import jalview.datamodel.AnnotatedCollectionI;
import jalview.datamodel.ColumnSelection;
import jalview.datamodel.SequenceCollectionI;
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceI;
import jalview.util.MessageManager;
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.List;
+
public class AlignViewController implements AlignViewControllerI
{
AlignViewportI viewport = null;
(int) (Math.random() * 255), (int) (Math.random() * 255));
col = col.brighter();
for (SequenceI sq : gps[g].getSequences(null))
+ {
viewport.setSequenceColour(sq, col);
+ }
}
return true;
}
return false;
}
}
+
+
+
+ @Override
+ public void sortAlignmentByFeatureDensity(String[] typ)
+ {
+ sortBy(typ, "Sort by Density", AlignmentSorter.FEATURE_DENSITY);
+ }
+
+ protected void sortBy(String[] typ, String methodText, final String method)
+ {
+ FeatureRenderer fr = alignPanel.getFeatureRenderer();
+ if (typ == null)
+ {
+ typ = fr==null ? null : fr.getDisplayedFeatureTypes();
+ }
+ String gps[] = null;
+ gps = fr==null ? null : fr.getDisplayedFeatureGroups();
+ if (typ != null)
+ {
+ ArrayList types = new ArrayList();
+ for (int i = 0; i < typ.length; i++)
+ {
+ if (typ[i] != null)
+ {
+ types.add(typ[i]);
+ }
+ typ = new String[types.size()];
+ types.toArray(typ);
+ }
+ }
+ if (gps != null)
+ {
+ ArrayList grps = new ArrayList();
+
+ for (int i = 0; i < gps.length; i++)
+ {
+ if (gps[i] != null)
+ {
+ grps.add(gps[i]);
+ }
+ }
+ gps = new String[grps.size()];
+ grps.toArray(gps);
+ }
+ AlignmentI al = viewport.getAlignment();
+
+ int start, stop;
+ SequenceGroup sg = viewport.getSelectionGroup();
+ if (sg != null)
+ {
+ start = sg.getStartRes();
+ stop = sg.getEndRes();
+ }
+ else
+ {
+ start = 0;
+ stop = al.getWidth();
+ }
+ SequenceI[] oldOrder = al.getSequencesArray();
+ AlignmentSorter.sortByFeature(typ, gps, start, stop, al, method);
+ avcg.addHistoryItem(new OrderCommand(methodText, oldOrder, viewport
+ .getAlignment()));
+ alignPanel.paintAlignment(true);
+
+ }
+
+ @Override
+ public void sortAlignmentByFeatureScore(String[] typ)
+ {
+ sortBy(typ, "Sort by Feature Score", AlignmentSorter.FEATURE_SCORE);
+ }
}
--- /dev/null
+package jalview.controller;
+
+import jalview.api.FeatureRenderer;
+import jalview.api.FeatureSettingsModelI;
+
+public class FeatureSettingsController implements jalview.api.FeatureSettingsControllerI
+{
+ FeatureSettingsControllerGuiI settingUI;
+ FeatureRenderer fr;
+ FeatureSettingsModelI fsettings;
+
+}
--- /dev/null
+package jalview.controller;
+
+public interface FeatureSettingsControllerGuiI
+{
+
+}
}
}
+
+ private SequenceI seqrep=null;
+
+ /**
+ *
+ * @return the representative sequence for this group
+ */
+ public SequenceI getSeqrep()
+ {
+ return seqrep;
+ }
+
+ /**
+ * set the representative sequence for this group. Note - this affects the
+ * interpretation of the Hidereps attribute.
+ *
+ * @param seqrep
+ * the seqrep to set (null means no sequence representative)
+ */
+ public void setSeqrep(SequenceI seqrep)
+ {
+ this.seqrep = seqrep;
+ }
+
+ /**
+ *
+ * @return true if group has a sequence representative
+ */
+ public boolean hasSeqrep()
+ {
+ return seqrep != null;
+ }
+
@Override
public int getEndRes()
{
*/
package jalview.datamodel;
-import java.util.Vector;
+import java.util.List;
public class CigarArray extends CigarBase
{
* internal constructor function - called by CigarArray(AlignmentI, ...);
*
* @param alignment
- * @param columnSelection
+ * @param list
* - vector of visible regions as returned from
* columnSelection.getHiddenColumns()
* @param selectionGroup
*/
private void constructFromAlignment(AlignmentI alignment,
- Vector columnSelection, SequenceGroup selectionGroup)
+ List<int[]> list, SequenceGroup selectionGroup)
{
int[] _startend = _calcStartEndBounds(alignment, selectionGroup);
int start = _startend[1], end = _startend[2];
// now construct the CigarArray operations
- if (columnSelection != null)
+ if (list != null)
{
int[] region;
int hideStart, hideEnd;
int last = start;
- for (int j = 0; last < end & j < columnSelection.size(); j++)
+ for (int j = 0; last < end & j < list.size(); j++)
{
- region = (int[]) columnSelection.elementAt(j);
+ region = list.get(j);
hideStart = region[0];
hideEnd = region[1];
// edit hidden regions to selection range
package jalview.datamodel;
import jalview.util.ShiftList;
+import jalview.viewmodel.annotationfilter.AnnotationFilterParameter;
+import jalview.viewmodel.annotationfilter.AnnotationFilterParameter.SearchableAnnotationField;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;
Vector selected = new Vector();
// Vector of int [] {startCol, endCol}
- Vector hiddenColumns;
+ Vector<int[]> hiddenColumns;
/**
* Add a column to the selection
int hSize = hiddenColumns.size();
for (int i = 0; i < hSize; i++)
{
- int[] region = (int[]) hiddenColumns.elementAt(i);
+ int[] region = hiddenColumns.elementAt(i);
if (region[0] > start && start + change > region[1])
{
deletedHiddenColumns.add(region);
{
for (int i = 0; i < hiddenColumns.size(); i++)
{
- int[] region = (int[]) hiddenColumns.elementAt(i);
+ int[] region = hiddenColumns.elementAt(i);
if (region[0] >= start)
{
region[0] -= change;
}
/**
- * This Method is used to return all the HiddenColumn regions less than the
- * given index.
- *
- * @param end
- * int
- * @return Vector
+ * This Method is used to return all the HiddenColumn regions
+ * @return empty list or List of hidden column intervals
*/
- public Vector getHiddenColumns()
+ public List<int[]> getHiddenColumns()
{
- return hiddenColumns;
+ return hiddenColumns == null ? Arrays.asList(new int[]
+ {}) : hiddenColumns;
}
/**
{
for (int i = 0; i < hiddenColumns.size(); i++)
{
- int[] region = (int[]) hiddenColumns.elementAt(i);
+ int[] region = hiddenColumns.elementAt(i);
if (result >= region[0])
{
result += region[1] - region[0] + 1;
int[] region;
do
{
- region = (int[]) hiddenColumns.elementAt(index++);
+ region = hiddenColumns.elementAt(index++);
if (hiddenColumn > region[1])
{
result -= region[1] + 1 - region[0];
int gaps = 0;
do
{
- int[] region = (int[]) hiddenColumns.elementAt(index);
+ int[] region = hiddenColumns.elementAt(index);
if (hiddenRegion == 0)
{
return region[0];
int index = 0;
do
{
- int[] region = (int[]) hiddenColumns.elementAt(index);
+ int[] region = hiddenColumns.elementAt(index);
if (alPos < region[0])
{
return region[0];
int index = hiddenColumns.size() - 1;
do
{
- int[] region = (int[]) hiddenColumns.elementAt(index);
+ int[] region = hiddenColumns.elementAt(index);
if (alPos > region[1])
{
return region[1];
for (int i = 0; i < hiddenColumns.size(); i++)
{
- int[] region = (int[]) hiddenColumns.elementAt(i);
+ int[] region = hiddenColumns.elementAt(i);
if (start <= region[1] && end >= region[0])
{
hiddenColumns.removeElementAt(i);
{
for (int i = 0; i < hiddenColumns.size(); i++)
{
- int[] region = (int[]) hiddenColumns.elementAt(i);
+ int[] region = hiddenColumns.elementAt(i);
for (int j = region[0]; j < region[1] + 1; j++)
{
addElement(j);
{
for (int i = 0; i < hiddenColumns.size(); i++)
{
- int[] region = (int[]) hiddenColumns.elementAt(i);
+ int[] region = hiddenColumns.elementAt(i);
if (res == region[0])
{
for (int j = region[0]; j < region[1] + 1; j++)
{
for (int i = 0; i < hiddenColumns.size(); i++)
{
- int[] region = (int[]) hiddenColumns.elementAt(i);
+ int[] region = hiddenColumns.elementAt(i);
if (column >= region[0] && column <= region[1])
{
return false;
for (int i = 0, j = copy.hiddenColumns.size(); i < j; i++)
{
int[] rh, cp;
- rh = (int[]) copy.hiddenColumns.elementAt(i);
+ rh = copy.hiddenColumns.elementAt(i);
if (rh != null)
{
cp = new int[rh.length];
for (i = 0; i < iSize; i++)
{
StringBuffer visibleSeq = new StringBuffer();
- Vector regions = getHiddenColumns();
+ List<int[]> regions = getHiddenColumns();
int blockStart = start, blockEnd = end;
int[] region;
for (int j = 0; j < regions.size(); j++)
{
- region = (int[]) regions.elementAt(j);
+ region = regions.get(j);
hideStart = region[0];
hideEnd = region[1];
if (hiddenColumns != null && hiddenColumns.size() > 0)
{
Vector visiblecontigs = new Vector();
- Vector regions = getHiddenColumns();
+ List<int[]> regions = getHiddenColumns();
int vstart = start;
int[] region;
for (int j = 0; vstart < end && j < regions.size(); j++)
{
- region = (int[]) regions.elementAt(j);
+ region = regions.get(j);
hideStart = region[0];
hideEnd = region[1];
// then mangle the alignmentAnnotation annotation array
Vector annels = new Vector();
Annotation[] els = null;
- Vector regions = getHiddenColumns();
+ List<int[]> regions = getHiddenColumns();
int blockStart = start, blockEnd = end;
int[] region;
int hideStart, hideEnd, w = 0;
for (int j = 0; j < regions.size(); j++)
{
- region = (int[]) regions.elementAt(j);
+ region = regions.get(j);
hideStart = region[0];
hideEnd = region[1];
}
}
}
+
+ /**
+ *
+ * @return true if there are columns marked
+ */
+ public boolean hasSelectedColumns()
+ {
+ return (selected != null && selected.size() > 0);
+ }
+
+ /**
+ *
+ * @return true if there are columns hidden
+ */
+ public boolean hasHiddenColumns()
+ {
+ return hiddenColumns != null && hiddenColumns.size() > 0;
+ }
+
+ /**
+ *
+ * @return true if there are more than one set of columns hidden
+ */
+ public boolean hasManyHiddenColumns()
+ {
+ return hiddenColumns != null && hiddenColumns.size() > 1;
+ }
+
+ /**
+ * mark the columns corresponding to gap characters as hidden in the column
+ * selection
+ *
+ * @param sr
+ */
+ public void hideInsertionsFor(SequenceI sr)
+ {
+ List<int[]> inserts = sr.getInsertions();
+ for (int[] r : inserts)
+ {
+ hideColumns(r[0], r[1]);
+ }
+ }
+
+ public boolean filterAnnotations(Annotation[] annotations,
+ AnnotationFilterParameter filterParams)
+ {
+ this.revealAllHiddenColumns();
+ this.clear();
+ int count = 0;
+ do
+ {
+ if (annotations[count] != null)
+ {
+
+ boolean itemMatched = false;
+
+ if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD
+ && annotations[count].value >= filterParams
+ .getThresholdValue())
+ {
+ itemMatched = true;
+ }
+ if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD
+ && annotations[count].value <= filterParams
+ .getThresholdValue())
+ {
+ itemMatched = true;
+ }
+
+ if (filterParams.isFilterAlphaHelix()
+ && annotations[count].secondaryStructure == 'H')
+ {
+ itemMatched = true;
+ }
+
+ if (filterParams.isFilterBetaSheet()
+ && annotations[count].secondaryStructure == 'E')
+ {
+ itemMatched = true;
+ }
+
+ if (filterParams.isFilterTurn()
+ && annotations[count].secondaryStructure == 'S')
+ {
+ itemMatched = true;
+ }
+
+ String regexSearchString = filterParams.getRegexString();
+ if (regexSearchString != null
+ && !filterParams.getRegexSearchFields().isEmpty())
+ {
+ List<SearchableAnnotationField> fields = filterParams
+ .getRegexSearchFields();
+ try
+ {
+ if (fields.contains(SearchableAnnotationField.DISPLAY_STRING)
+ && annotations[count].displayCharacter
+ .matches(regexSearchString))
+ {
+ itemMatched = true;
+ }
+ } catch (java.util.regex.PatternSyntaxException pse)
+ {
+ if (annotations[count].displayCharacter
+ .equals(regexSearchString))
+ {
+ itemMatched = true;
+ }
+ }
+ if (fields.contains(SearchableAnnotationField.DESCRIPTION)
+ && annotations[count].description != null
+ && annotations[count].description
+ .matches(regexSearchString))
+ {
+ itemMatched = true;
+ }
+ }
+
+ if (itemMatched)
+ {
+ this.addElement(count);
+ }
+ }
+ count++;
+ } while (count < annotations.length);
+ return false;
+ }
}
return map;
}
- /*
- * (non-Javadoc)
- *
- * @see jalview.datamodel.SequenceI#findPositionMap()
- */
+ @Override
public int[] findPositionMap()
{
int map[] = new int[sequence.length];
return map;
}
- /*
- * (non-Javadoc)
- *
- * @see jalview.datamodel.SequenceI#deleteChars(int, int)
- */
+ @Override
+ public List<int[]> getInsertions()
+ {
+ ArrayList<int[]> map = new ArrayList<int[]>();
+ int lastj = -1, j = 0;
+ int pos = start;
+ int seqlen = sequence.length;
+ while ((j < seqlen))
+ {
+ if (jalview.util.Comparison.isGap(sequence[j]))
+ {
+ if (lastj == -1)
+ {
+ lastj = j;
+ }
+ }
+ else
+ {
+ if (lastj != -1)
+ {
+ map.add(new int[]
+ { lastj, j - 1 });
+ lastj = -1;
+ }
+ }
+ j++;
+ }
+ if (lastj != -1)
+ {
+ map.add(new int[]
+ { lastj, j - 1 });
+ lastj = -1;
+ }
+ return map;
+ }
+
+ @Override
public void deleteChars(int i, int j)
{
int newstart = start, newend = end;
sequence = tmp;
}
- /**
- * DOCUMENT ME!
- *
- * @param i
- * DOCUMENT ME!
- * @param c
- * DOCUMENT ME!
- * @param chop
- * DOCUMENT ME!
- */
+ @Override
public void insertCharAt(int i, int length, char c)
{
char[] tmp = new char[sequence.length + length];
sequence = tmp;
}
+ @Override
public void insertCharAt(int i, char c)
{
insertCharAt(i, 1, c);
}
+ @Override
public String getVamsasId()
{
return vamsasId;
}
+ @Override
public void setVamsasId(String id)
{
vamsasId = id;
}
+ @Override
public void setDBRef(DBRefEntry[] dbref)
{
dbrefs = dbref;
}
+ @Override
public DBRefEntry[] getDBRef()
{
if (dbrefs == null && datasetSequence != null
return dbrefs;
}
+ @Override
public void addDBRef(DBRefEntry entry)
{
if (dbrefs == null)
dbrefs = temp;
}
+ @Override
public void setDatasetSequence(SequenceI seq)
{
datasetSequence = seq;
}
+ @Override
public SequenceI getDatasetSequence()
{
return datasetSequence;
}
- /**
- * Returns a new array containing this sequence's annotations, or null.
- */
+ @Override
public AlignmentAnnotation[] getAnnotation()
{
return annotation == null ? null : annotation
.toArray(new AlignmentAnnotation[annotation.size()]);
}
- /**
- * Returns true if this sequence has the given annotation (by object
- * identity).
- */
+
@Override
public boolean hasAnnotation(AlignmentAnnotation ann)
{
return annotation == null ? false : annotation.contains(ann);
}
- /**
- * Add the given annotation, if not already added, and set its sequence ref to
- * be this sequence. Does nothing if this sequence's annotations already
- * include this annotation (by identical object reference).
- */
+ @Override
public void addAlignmentAnnotation(AlignmentAnnotation annotation)
{
if (this.annotation == null)
return true;
}
- /*
- * (non-Javadoc)
- *
- * @see jalview.datamodel.SequenceI#deriveSequence()
- */
+ @Override
public SequenceI deriveSequence()
{
SequenceI seq = new Sequence(this);
}
}
- /*
- * (non-Javadoc)
- *
- * @see jalview.datamodel.SequenceI#getAnnotation(java.lang.String)
- */
+ @Override
public AlignmentAnnotation[] getAnnotation(String label)
{
if (annotation == null || annotation.size() == 0)
return anns;
}
+ @Override
public boolean updatePDBIds()
{
if (datasetSequence != null)
return false;
}
- /*
- * (non-Javadoc)
- *
- * @see
- * jalview.datamodel.SequenceI#transferAnnotation(jalview.datamodel.SequenceI,
- * jalview.datamodel.Mapping)
- */
+ @Override
public void transferAnnotation(SequenceI entry, Mapping mp)
{
if (datasetSequence != null)
return rna;
}
- /**
- * Returns a (possibly empty) list of any annotations that match on given
- * calcId (source) and label (type). Null values do not match.
- *
- * @param calcId
- * @param label
- */
@Override
public List<AlignmentAnnotation> getAlignmentAnnotations(String calcId,
String label)
List<SequenceI> getSequences(
Map<SequenceI, SequenceCollectionI> hiddenReps);
-
int getWidth();
+ /**
+ *
+ * @return true if getSeqrep doesn't return null
+ */
+ boolean hasSeqrep();
+ /**
+ * get the reference or representative sequence within this collection
+ * @return null or the current reference sequence
+ */
+ SequenceI getSeqrep();
+ /**
+ * set the reference or representative sequence for this collection.
+ * Reference is assumed to be present within the collection.
+ * @return
+ */
+ void setSeqrep(SequenceI refseq);
/**
* @return the first column included in this collection. Runs from 0<=i<N_cols
public SequenceI getDatasetSequence();
+ /**
+ * Returns a new array containing this sequence's annotations, or null.
+ */
public AlignmentAnnotation[] getAnnotation();
+ /**
+ * Returns true if this sequence has the given annotation (by object
+ * identity).
+ */
public boolean hasAnnotation(AlignmentAnnotation ann);
+ /**
+ * Add the given annotation, if not already added, and set its sequence ref to
+ * be this sequence. Does nothing if this sequence's annotations already
+ * include this annotation (by identical object reference).
+ */
public void addAlignmentAnnotation(AlignmentAnnotation annotation);
public void removeAlignmentAnnotation(AlignmentAnnotation annotation);
public AlignmentAnnotation[] getAnnotation(String label);
/**
- * Return a list of any annotations which match the given calcId (source) and
- * label (type). Null values do not match.
+ * Returns a (possibly empty) list of any annotations that match on given
+ * calcId (source) and label (type). Null values do not match.
*
* @param calcId
* @param label
- * @return
*/
public List<AlignmentAnnotation> getAlignmentAnnotations(String calcId,
String label);
*/
public void setRNA(RNA rna);
+ /**
+ *
+ * @return list of insertions (gap characters) in sequence
+ */
+ public List<int[]> getInsertions();
+
}
setColourSelected(ColourSchemeProperty.getColourName(av
.getGlobalColourScheme()));
- showSeqFeatures.setSelected(av.showSequenceFeatures);
+ showSeqFeatures.setSelected(av.isShowSequenceFeatures());
hiddenMarkers.setState(av.showHiddenMarkers);
applyToAllGroups.setState(av.getColourAppliesToAllGroups());
showNpFeatsMenuitem.setSelected(av.isShowNpFeats());
@Override
public void exportAnnotations_actionPerformed(ActionEvent e)
{
- new AnnotationExporter().exportAnnotations(alignPanel,
- viewport.isShowAnnotation() ? viewport.getAlignment()
- .getAlignmentAnnotation() : null, viewport
- .getAlignment().getGroups(), ((Alignment) viewport
- .getAlignment()).alignmentProperties);
+ new AnnotationExporter().exportAnnotations(alignPanel);
}
@Override
return;
}
- Vector hiddenColumns = null;
+ ArrayList<int[]> hiddenColumns = null;
if (viewport.hasHiddenColumns())
{
- hiddenColumns = new Vector();
+ hiddenColumns = new ArrayList<int[]>();
int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport
.getSelectionGroup().getEndRes();
- for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
- .size(); i++)
+ for (int[] region : viewport.getColumnSelection().getHiddenColumns())
{
- int[] region = (int[]) viewport.getColumnSelection()
- .getHiddenColumns().elementAt(i);
if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff)
{
- hiddenColumns.addElement(new int[]
+ hiddenColumns.add(new int[]
{ region[0] - hiddenOffset, region[1] - hiddenOffset });
}
}
if (Desktop.jalviewClipboard != null
&& Desktop.jalviewClipboard[2] != null)
{
- Vector hc = (Vector) Desktop.jalviewClipboard[2];
- for (int i = 0; i < hc.size(); i++)
+ List<int[]> hc = (List<int[]>) Desktop.jalviewClipboard[2];
+ for (int[] region : hc)
{
- int[] region = (int[]) hc.elementAt(i);
af.viewport.hideColumns(region[0], region[1]);
}
}
if (Desktop.jalviewClipboard != null
&& Desktop.jalviewClipboard[2] != null)
{
- Vector hc = (Vector) Desktop.jalviewClipboard[2];
- for (int i = 0; i < hc.size(); i++)
+ List<int[]> hc = (List<int[]>) Desktop.jalviewClipboard[2];
+ for (int region[] : hc)
{
- int[] region = (int[]) hc.elementAt(i);
af.viewport.hideColumns(region[0], region[1]);
}
}
{
viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight
.isSelected());
- if (viewport.getShowSequenceFeaturesHeight())
+ if (viewport.isShowSequenceFeaturesHeight())
{
// ensure we're actually displaying features
viewport.setShowSequenceFeatures(true);
}
@Override
+ public void annotationColumn_actionPerformed(ActionEvent e)
+ {
+ new AnnotationColumnChooser(viewport, alignPanel);
+ }
+
+ @Override
public void rnahelicesColour_actionPerformed(ActionEvent e)
{
new RNAHelicesColourChooser(viewport, alignPanel);
{
featuresFile = new FeaturesFile(file, type).parse(viewport
.getAlignment().getDataset(), alignPanel.getSeqPanel().seqCanvas
- .getFeatureRenderer().featureColours, false,
+ .getFeatureRenderer().getFeatureColours(), false,
jalview.bin.Cache.getDefault("RELAXEDSEQIDMATCHING", false));
} catch (Exception ex)
{
if (featuresFile)
{
- viewport.showSequenceFeatures = true;
+ viewport.setShowSequenceFeatures(true);
showSeqFeatures.setSelected(true);
if (alignPanel.getSeqPanel().seqCanvas.fr != null)
{
// try to parse as annotation.
boolean isAnnotation = (format == null || format
.equalsIgnoreCase("PFAM")) ? new AnnotationFile()
- .readAnnotationFile(viewport.getAlignment(), file, protocol)
+ .annotateAlignmentView(viewport, file, protocol)
: false;
if (!isAnnotation)
alignPanel.paintAlignment(true);
}
}
+ public void clearAlignmentSeqRep()
+ {
+ // TODO refactor alignmentseqrep to controller
+ if (viewport.getAlignment().hasSeqrep()) {
+ viewport.getAlignment().setSeqrep(null);
+ PaintRefresher.Refresh(this, viewport.getSequenceSetId());
+ alignPanel.updateAnnotation();
+ alignPanel.paintAlignment(true);
+ }
+ }
@Override
protected void createGroup_actionPerformed(ActionEvent e)
boolean renderGaps = true;
- boolean showSequenceFeatures = false;
-
- private boolean showAnnotation = true;
-
SequenceAnnotationOrder sortAnnotationsBy = null;
int charHeight;
boolean cursorMode = false;
- /**
- * Keys are the feature types which are currently visible. Note: Values are
- * not used!
- */
- private Hashtable featuresDisplayed = null;
-
boolean antiAlias = false;
Rectangle explodedPosition;
Color textColour2 = Color.white;
- private boolean rightAlignIds = false;
-
+ private AnnotationColumnChooser annotationColumnSelectionState;
/**
* Creates a new AlignViewport object.
*
setAlignment(al);
if (hiddenColumns != null)
{
- this.colSel = hiddenColumns;
- if (hiddenColumns.getHiddenColumns() != null
- && hiddenColumns.getHiddenColumns().size() > 0)
- {
- hasHiddenColumns = true;
- }
- else
- {
- hasHiddenColumns = false;
- }
+ colSel = hiddenColumns;
}
init();
}
setAlignment(al);
if (hiddenColumns != null)
{
- this.colSel = hiddenColumns;
- if (hiddenColumns.getHiddenColumns() != null
- && hiddenColumns.getHiddenColumns().size() > 0)
- {
- hasHiddenColumns = true;
- }
- else
- {
- hasHiddenColumns = false;
- }
+ colSel = hiddenColumns;
}
init();
}
}
/**
- * set the flag
- *
- * @param b
- * features are displayed if true
- */
- public void setShowSequenceFeatures(boolean b)
- {
- showSequenceFeatures = b;
- }
-
- public boolean getShowSequenceFeatures()
- {
- return showSequenceFeatures;
- }
-
- /**
* centre columnar annotation labels in displayed alignment annotation TODO:
* add to jalviewXML and annotation display settings
*/
*
* @return DOCUMENT ME!
*/
- public boolean getShowAnnotation()
- {
- return isShowAnnotation();
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param b
- * DOCUMENT ME!
- */
- public void setShowAnnotation(boolean b)
- {
- showAnnotation = b;
- }
-
- /**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
public boolean getScaleAboveWrapped()
{
return scaleAboveWrapped;
shownpfeats = show;
}
- /**
- *
- * @return true if view has hidden rows
- */
- public boolean hasHiddenRows()
- {
- return hasHiddenRows;
- }
-
- /**
- *
- * @return true if view has hidden columns
- */
- public boolean hasHiddenColumns()
- {
- return hasHiddenColumns;
- }
/**
* when set, view will scroll to show the highlighted position
return followSelection;
}
- boolean showSeqFeaturesHeight;
-
public void sendSelection()
{
jalview.structure.StructureSelectionManager
new ColumnSelection(getColumnSelection()), this);
}
- public void setShowSequenceFeaturesHeight(boolean selected)
- {
- showSeqFeaturesHeight = selected;
- }
-
- public boolean getShowSequenceFeaturesHeight()
- {
- return showSeqFeaturesHeight;
- }
-
/**
* return the alignPanel containing the given viewport. Use this to get the
* components currently handling the given viewport.
}
}
-
- public Hashtable getFeaturesDisplayed()
- {
- return featuresDisplayed;
- }
-
- public void setFeaturesDisplayed(Hashtable featuresDisplayed)
- {
- this.featuresDisplayed = featuresDisplayed;
- }
protected SequenceAnnotationOrder getSortAnnotationsBy()
{
return sortAnnotationsBy;
this.showAutocalculatedAbove = showAutocalculatedAbove;
}
- public boolean isShowAnnotation()
- {
- return showAnnotation;
- }
-
- public boolean isRightAlignIds()
+ public AnnotationColumnChooser getAnnotationColumnSelectionState()
{
- return rightAlignIds;
+ return annotationColumnSelectionState;
}
- public void setRightAlignIds(boolean rightAlignIds)
+ public void setAnnotationColumnSelectionState(
+ AnnotationColumnChooser currentAnnotationColumnSelectionState)
{
- this.rightAlignIds = rightAlignIds;
+ this.annotationColumnSelectionState = currentAnnotationColumnSelectionState;
}
}
setScrollValues(0, 0);
- setAnnotationVisible(av.getShowAnnotation());
+ setAnnotationVisible(av.isShowAnnotation());
hscroll.addAdjustmentListener(this);
vscroll.addAdjustmentListener(this);
getSeqPanel().seqCanvas.fastPaint(scrollX, scrollY);
getScalePanel().repaint();
- if (av.getShowAnnotation() && scrollX != 0)
+ if (av.isShowAnnotation() && scrollX != 0)
{
getAnnotationPanel().fastPaint(scrollX);
}
}
}
- else if (av.getShowAnnotation())
+ else if (av.isShowAnnotation())
{
height += getAnnotationPanel().adjustPanelHeight() + 3;
}
new OOMWarning(string, error, this);
}
- public FeatureRenderer cloneFeatureRenderer()
+ @Override
+ public jalview.api.FeatureRenderer cloneFeatureRenderer()
{
return new FeatureRenderer(this);
}
-
- public void updateFeatureRenderer(FeatureRenderer fr)
+ @Override
+ public jalview.api.FeatureRenderer getFeatureRenderer()
+ {
+ return seqPanel.seqCanvas.getFeatureRenderer();
+ }
+ public void updateFeatureRenderer(jalview.renderer.seqfeatures.FeatureRenderer fr)
{
fr.transferSettings(getSeqPanel().seqCanvas.getFeatureRenderer());
}
- public void updateFeatureRendererFrom(FeatureRenderer fr)
+ public void updateFeatureRendererFrom(jalview.api.FeatureRenderer fr)
{
if (getSeqPanel().seqCanvas.getFeatureRenderer() != null)
{
package jalview.gui;
import jalview.bin.Cache;
-import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.GraphLine;
import jalview.datamodel.SequenceGroup;
import jalview.schemes.AnnotationColourGradient;
import jalview.schemes.ColourSchemeI;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Hashtable;
-import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.JButton;
-import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JInternalFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
-import javax.swing.JSlider;
-import javax.swing.JTextField;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
import net.miginfocom.swing.MigLayout;
-public class AnnotationColourChooser extends JPanel
+@SuppressWarnings("serial")
+public class AnnotationColourChooser extends AnnotationRowFilter
{
- JInternalFrame frame;
-
- AlignViewport av;
-
- AlignmentPanel ap;
ColourSchemeI oldcs;
- Hashtable oldgroupColours;
-
- jalview.datamodel.AlignmentAnnotation currentAnnotation;
-
- boolean adjusting = false;
+ Hashtable<SequenceGroup, ColourSchemeI> oldgroupColours;
/**
* enabled if the user is dragging the slider - try to keep updates to a
* minimun
*/
- boolean sliderDragging = false;
+
+ JComboBox<String> annotations;
+
+ JButton defColours = new JButton();
+
+
+ JPanel jPanel1 = new JPanel();
+
+ JPanel jPanel2 = new JPanel();
+
+ BorderLayout borderLayout1 = new BorderLayout();
+
+ private JComboBox<String> threshold = new JComboBox<String>();
public AnnotationColourChooser(AlignViewport av, final AlignmentPanel ap)
{
+ super(av, ap);
oldcs = av.getGlobalColourScheme();
if (av.getAlignment().getGroups() != null)
{
- oldgroupColours = new Hashtable();
+ oldgroupColours = new Hashtable<SequenceGroup, ColourSchemeI>();
for (SequenceGroup sg : ap.av.getAlignment().getGroups())
{
if (sg.cs != null)
}
}
}
- this.av = av;
- this.ap = ap;
frame = new JInternalFrame();
frame.setContentPane(this);
frame.setLayer(JLayeredPane.PALETTE_LAYER);
MessageManager.getString("label.colour_by_annotation"), 520,
215);
- slider.addChangeListener(new ChangeListener()
- {
- @Override
- public void stateChanged(ChangeEvent evt)
- {
- if (!adjusting)
- {
- thresholdValue.setText((slider.getValue() / 1000f) + "");
- valueChanged(!sliderDragging);
- }
- }
- });
- slider.addMouseListener(new MouseAdapter()
- {
- @Override
- public void mousePressed(MouseEvent e)
- {
- sliderDragging = true;
- super.mousePressed(e);
- }
-
- @Override
- public void mouseDragged(MouseEvent e)
- {
- sliderDragging = true;
- super.mouseDragged(e);
- }
-
- @Override
- public void mouseReleased(MouseEvent evt)
- {
- if (sliderDragging)
- {
- sliderDragging = false;
- valueChanged(true);
- }
- ap.paintAlignment(true);
- }
- });
+ addSliderChangeListener();
+ addSliderMouseListeners();
if (av.getAlignment().getAlignmentAnnotation() == null)
{
seqAssociated.setSelected(acg.isSeqAssociated());
}
- annotations = new JComboBox(
+ annotations = new JComboBox<String>(
getAnnotationItems(seqAssociated.isSelected()));
- threshold.addItem(MessageManager
- .getString("label.threshold_feature_no_thereshold"));
- threshold.addItem(MessageManager
- .getString("label.threshold_feature_above_thereshold"));
- threshold.addItem(MessageManager
- .getString("label.threshold_feature_below_thereshold"));
+ populateThresholdComboBox(threshold);
if (oldcs instanceof AnnotationColourGradient)
{
switch (acg.getAboveThreshold())
{
case AnnotationColourGradient.NO_THRESHOLD:
- threshold.setSelectedIndex(0);
+ getThreshold().setSelectedIndex(0);
break;
case AnnotationColourGradient.ABOVE_THRESHOLD:
- threshold.setSelectedIndex(1);
+ getThreshold().setSelectedIndex(1);
break;
case AnnotationColourGradient.BELOW_THRESHOLD:
- threshold.setSelectedIndex(2);
+ getThreshold().setSelectedIndex(2);
break;
default:
throw new Error(MessageManager.getString("error.implementation_error_dont_know_about_thereshold_setting"));
} catch (Exception ex)
{
}
-
adjusting = false;
- changeColour();
+ updateView();
frame.invalidate();
frame.pack();
-
- }
-
- private Vector<String> getAnnotationItems(boolean isSeqAssociated)
- {
- Vector<String> list = new Vector<String>();
- int index = 1;
- int[] anmap = new int[av.getAlignment().getAlignmentAnnotation().length];
- boolean enableSeqAss = false;
- for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
- {
- if (av.getAlignment().getAlignmentAnnotation()[i].sequenceRef == null)
- {
- if (isSeqAssociated)
- {
- continue;
- }
- }
- else
- {
- enableSeqAss = true;
- }
- String label = av.getAlignment().getAlignmentAnnotation()[i].label;
- if (!list.contains(label))
- {
- anmap[list.size()] = i;
- list.add(label);
-
- }
- else
- {
- if (!isSeqAssociated)
- {
- anmap[list.size()] = i;
- list.add(label + "_" + (index++));
- }
- }
- }
- seqAssociated.setEnabled(enableSeqAss);
- this.annmap = new int[list.size()];
- System.arraycopy(anmap, 0, this.annmap, 0, this.annmap.length);
- return list;
- }
-
- private void setDefaultMinMax()
- {
- minColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN",
- Color.orange));
- maxColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX",
- Color.red));
}
public AnnotationColourChooser()
annotations_actionPerformed(e);
}
});
- threshold.addActionListener(new ActionListener()
+ getThreshold().addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
@Override
public void actionPerformed(ActionEvent arg0)
{
- seqAssociated_actionPerformed(arg0);
+ seqAssociated_actionPerformed(arg0, annotations, seqAssociated);
}
});
colpanel.add(minColour);
colpanel.add(maxColour);
jPanel2.add(colpanel, "wrap");
- jPanel2.add(threshold);
+ jPanel2.add(getThreshold());
jPanel2.add(defColours, "skip 1, wrap");
jPanel2.add(thresholdIsMin);
jPanel2.add(slider, "grow");
this.validate();
}
- protected void seqAssociated_actionPerformed(ActionEvent arg0)
- {
- adjusting = true;
- String cursel = (String) annotations.getSelectedItem();
- boolean isvalid = false, isseqs = seqAssociated.isSelected();
- this.annotations.removeAllItems();
- for (String anitem : getAnnotationItems(seqAssociated.isSelected()))
- {
- if (anitem.equals(cursel) || (isseqs && cursel.startsWith(anitem)))
- {
- isvalid = true;
- cursel = anitem;
- }
- this.annotations.addItem(anitem);
- }
- adjusting = false;
- if (isvalid)
- {
- this.annotations.setSelectedItem(cursel);
- }
- else
- {
- if (annotations.getItemCount() > 0)
- {
- annotations.setSelectedIndex(0);
- }
- }
- }
-
protected void resetColours_actionPerformed(ActionEvent arg0)
{
setDefaultMinMax();
- changeColour();
+ updateView();
}
- JComboBox annotations;
-
- int[] annmap;
-
- JPanel minColour = new JPanel();
-
- JPanel maxColour = new JPanel();
-
- JButton defColours = new JButton();
-
- JButton ok = new JButton();
-
- JButton cancel = new JButton();
-
- JPanel jPanel1 = new JPanel();
-
- JPanel jPanel2 = new JPanel();
-
- BorderLayout borderLayout1 = new BorderLayout();
-
- JComboBox threshold = new JComboBox();
-
- JSlider slider = new JSlider();
-
- JTextField thresholdValue = new JTextField(20);
-
- JCheckBox currentColours = new JCheckBox();
-
- JCheckBox thresholdIsMin = new JCheckBox();
-
- JCheckBox seqAssociated = new JCheckBox();
+ private void setDefaultMinMax()
+ {
+ minColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN",
+ Color.orange));
+ maxColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX",
+ Color.red));
+ }
public void minColour_actionPerformed()
{
minColour.setBackground(col);
}
minColour.repaint();
- changeColour();
+ updateView();
}
public void maxColour_actionPerformed()
maxColour.setBackground(col);
}
maxColour.repaint();
- changeColour();
+ updateView();
}
- void changeColour()
+ public void reset()
{
- // Check if combobox is still adjusting
- if (adjusting)
- {
- return;
- }
-
- currentAnnotation = av.getAlignment().getAlignmentAnnotation()[annmap[annotations
- .getSelectedIndex()]];
-
- int aboveThreshold = -1;
- if (threshold.getSelectedIndex() == 1)
- {
- aboveThreshold = AnnotationColourGradient.ABOVE_THRESHOLD;
- }
- else if (threshold.getSelectedIndex() == 2)
- {
- aboveThreshold = AnnotationColourGradient.BELOW_THRESHOLD;
- }
-
- slider.setEnabled(true);
- thresholdValue.setEnabled(true);
- thresholdIsMin.setEnabled(true);
-
- if (aboveThreshold == AnnotationColourGradient.NO_THRESHOLD)
- {
- slider.setEnabled(false);
- thresholdValue.setEnabled(false);
- thresholdValue.setText("");
- thresholdIsMin.setEnabled(false);
- }
- else if (aboveThreshold != AnnotationColourGradient.NO_THRESHOLD
- && currentAnnotation.threshold == null)
- {
- currentAnnotation
- .setThreshold(new jalview.datamodel.GraphLine(
- (currentAnnotation.graphMax - currentAnnotation.graphMin) / 2f,
- "Threshold", Color.black));
- }
-
- if (aboveThreshold != AnnotationColourGradient.NO_THRESHOLD)
- {
- adjusting = true;
- float range = currentAnnotation.graphMax * 1000
- - currentAnnotation.graphMin * 1000;
-
- slider.setMinimum((int) (currentAnnotation.graphMin * 1000));
- slider.setMaximum((int) (currentAnnotation.graphMax * 1000));
- slider.setValue((int) (currentAnnotation.threshold.value * 1000));
- thresholdValue.setText(currentAnnotation.threshold.value + "");
- slider.setMajorTickSpacing((int) (range / 10f));
- slider.setEnabled(true);
- thresholdValue.setEnabled(true);
- adjusting = false;
- }
-
- AnnotationColourGradient acg = null;
- if (currentColours.isSelected())
- {
- acg = new AnnotationColourGradient(currentAnnotation,
- av.getGlobalColourScheme(), aboveThreshold);
- }
- else
- {
- acg = new AnnotationColourGradient(currentAnnotation,
- minColour.getBackground(), maxColour.getBackground(),
- aboveThreshold);
- }
- acg.setSeqAssociated(seqAssociated.isSelected());
-
- if (currentAnnotation.graphMin == 0f
- && currentAnnotation.graphMax == 0f)
- {
- acg.setPredefinedColours(true);
- }
-
- acg.thresholdIsMinMax = thresholdIsMin.isSelected();
-
- av.setGlobalColourScheme(acg);
-
+ av.setGlobalColourScheme(oldcs);
if (av.getAlignment().getGroups() != null)
{
for (SequenceGroup sg : ap.av.getAlignment().getGroups())
{
- if (sg.cs == null)
- {
- continue;
- }
-
- if (currentColours.isSelected())
- {
- sg.cs = new AnnotationColourGradient(currentAnnotation, sg.cs,
- aboveThreshold);
- ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated
- .isSelected());
-
- }
- else
- {
- sg.cs = new AnnotationColourGradient(currentAnnotation,
- minColour.getBackground(), maxColour.getBackground(),
- aboveThreshold);
- ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated
- .isSelected());
- }
-
+ sg.cs = oldgroupColours.get(sg);
}
}
- ap.alignmentChanged();
- // ensure all associated views (overviews, structures, etc) are notified of
- // updated colours.
- ap.paintAlignment(true);
}
- public void ok_actionPerformed(ActionEvent e)
- {
- changeColour();
- try
- {
- frame.setClosed(true);
- } catch (Exception ex)
- {
- }
- }
-
- public void cancel_actionPerformed(ActionEvent e)
+ public void valueChanged(boolean updateAllAnnotation)
{
- reset();
- // ensure all original colouring is propagated to listeners.
- ap.paintAlignment(true);
- try
+ if (slider.isEnabled())
{
- frame.setClosed(true);
- } catch (Exception ex)
- {
- }
- }
-
- void reset()
- {
- av.setGlobalColourScheme(oldcs);
- if (av.getAlignment().getGroups() != null)
- {
-
- for (SequenceGroup sg : ap.av.getAlignment().getGroups())
+ if (currentColours.isSelected()
+ && !(av.getGlobalColourScheme() instanceof AnnotationColourGradient))
{
- sg.cs = (ColourSchemeI) oldgroupColours.get(sg);
+ updateView();
}
+ getCurrentAnnotation().threshold.value = slider.getValue() / 1000f;
+ propagateSeqAssociatedThreshold(updateAllAnnotation,
+ getCurrentAnnotation());
+ ap.paintAlignment(false);
}
}
- public void thresholdCheck_actionPerformed(ActionEvent e)
- {
- changeColour();
- }
-
- public void annotations_actionPerformed(ActionEvent e)
- {
- changeColour();
- }
-
- public void threshold_actionPerformed(ActionEvent e)
+ public JComboBox<String> getThreshold()
{
- changeColour();
+ return threshold;
}
- public void thresholdValue_actionPerformed(ActionEvent e)
+ public void setThreshold(JComboBox<String> threshold)
{
- try
- {
- float f = Float.parseFloat(thresholdValue.getText());
- slider.setValue((int) (f * 1000));
- } catch (NumberFormatException ex)
- {
- }
+ this.threshold = threshold;
}
- public void valueChanged(boolean updateAllAnnotation)
+ public void currentColours_actionPerformed(ActionEvent e)
{
- if (currentColours.isSelected()
- && !(av.getGlobalColourScheme() instanceof AnnotationColourGradient))
+ if (currentColours.isSelected())
{
- changeColour();
+ reset();
}
- currentAnnotation.threshold.value = slider.getValue() / 1000f;
- propagateSeqAssociatedThreshold(updateAllAnnotation);
- ap.paintAlignment(false);
+ maxColour.setEnabled(!currentColours.isSelected());
+ minColour.setEnabled(!currentColours.isSelected());
+ updateView();
}
- private void propagateSeqAssociatedThreshold(boolean allAnnotation)
+ @Override
+ public void updateView()
{
- if (currentAnnotation.sequenceRef == null
- || currentAnnotation.threshold == null)
+ // Check if combobox is still adjusting
+ if (adjusting)
{
return;
}
- // TODO: JAL-1327 only update visible annotation thresholds if allAnnotation
- // is false, since we only need to provide a quick visual indicator
- float thr = currentAnnotation.threshold.value;
- for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
+ setCurrentAnnotation(av.getAlignment().getAlignmentAnnotation()[annmap[annotations
+ .getSelectedIndex()]]);
+
+ int selectedThresholdItem = getSelectedThresholdItem(getThreshold()
+ .getSelectedIndex());
+
+ slider.setEnabled(true);
+ thresholdValue.setEnabled(true);
+ thresholdIsMin.setEnabled(true);
+
+ if (selectedThresholdItem == AnnotationColourGradient.NO_THRESHOLD)
{
- AlignmentAnnotation aa = av.getAlignment().getAlignmentAnnotation()[i];
- if (aa.label.equals(currentAnnotation.label)
- && (currentAnnotation.getCalcId() == null ? aa.getCalcId() == null
- : currentAnnotation.getCalcId()
- .equals(aa.getCalcId())))
- {
- if (aa.threshold == null)
- {
- aa.threshold = new GraphLine(currentAnnotation.threshold);
- }
- else
- {
- aa.threshold.value = thr;
- }
- }
+ slider.setEnabled(false);
+ thresholdValue.setEnabled(false);
+ thresholdValue.setText("");
+ thresholdIsMin.setEnabled(false);
}
- }
-
- public void currentColours_actionPerformed(ActionEvent e)
- {
- if (currentColours.isSelected())
+ else if (selectedThresholdItem != AnnotationColourGradient.NO_THRESHOLD
+ && getCurrentAnnotation().threshold == null)
{
- reset();
+ getCurrentAnnotation()
+ .setThreshold(new jalview.datamodel.GraphLine(
+ (getCurrentAnnotation().graphMax - getCurrentAnnotation().graphMin) / 2f,
+ "Threshold", Color.black));
}
- maxColour.setEnabled(!currentColours.isSelected());
- minColour.setEnabled(!currentColours.isSelected());
+ if (selectedThresholdItem != AnnotationColourGradient.NO_THRESHOLD)
+ {
+ adjusting = true;
+ float range = getCurrentAnnotation().graphMax * 1000
+ - getCurrentAnnotation().graphMin * 1000;
- changeColour();
- }
+ slider.setMinimum((int) (getCurrentAnnotation().graphMin * 1000));
+ slider.setMaximum((int) (getCurrentAnnotation().graphMax * 1000));
+ slider.setValue((int) (getCurrentAnnotation().threshold.value * 1000));
+ thresholdValue.setText(getCurrentAnnotation().threshold.value + "");
+ slider.setMajorTickSpacing((int) (range / 10f));
+ slider.setEnabled(true);
+ thresholdValue.setEnabled(true);
+ adjusting = false;
+ }
+ colorAlignmContaining(getCurrentAnnotation(), selectedThresholdItem);
- public void thresholdIsMin_actionPerformed(ActionEvent actionEvent)
- {
- changeColour();
+ ap.alignmentChanged();
+ // ensure all associated views (overviews, structures, etc) are notified of
+ // updated colours.
+ ap.paintAlignment(true);
}
}
--- /dev/null
+package jalview.gui;
+
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.ColumnSelection;
+import jalview.schemes.AnnotationColourGradient;
+import jalview.util.MessageManager;
+import jalview.viewmodel.annotationfilter.AnnotationFilterParameter;
+
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.util.Iterator;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JInternalFrame;
+import javax.swing.JLayeredPane;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JTextField;
+import javax.swing.border.TitledBorder;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+
+import net.miginfocom.swing.MigLayout;
+
+@SuppressWarnings("serial")
+public class AnnotationColumnChooser extends AnnotationRowFilter implements
+ ItemListener
+{
+
+ private JComboBox<String> annotations;
+
+ // private JButton ok = new JButton();
+ //
+ // private JButton cancel = new JButton();
+
+ private JPanel actionPanel = new JPanel();
+
+ private JPanel thresholdPanel = new JPanel();
+
+ private JPanel switchableViewsPanel = new JPanel(new CardLayout());
+
+ private CardLayout switchableViewsLayout = (CardLayout) (switchableViewsPanel
+ .getLayout());
+ private JPanel noGraphFilterView = new JPanel();
+
+ private JPanel graphFilterView = new JPanel();
+
+ private JPanel annotationComboBoxPanel = new JPanel();
+
+ private BorderLayout borderLayout1 = new BorderLayout();
+
+ private JComboBox<String> threshold = new JComboBox<String>();
+
+ private StructureFilterPanel gStructureFilterPanel;
+
+ private StructureFilterPanel ngStructureFilterPanel;
+
+ private StructureFilterPanel currentStructureFilterPanel;
+
+ private SearchPanel currentSearchPanel;
+
+ private SearchPanel gSearchPanel;
+
+ private SearchPanel ngSearchPanel;
+
+ private FurtherActionPanel currentFurtherActionPanel;
+
+ private FurtherActionPanel gFurtherActionPanel;
+
+ private FurtherActionPanel ngFurtherActionPanel;
+
+ public static final int ACTION_OPTION_SELECT = 1;
+
+ public static int ACTION_OPTION_HIDE = 2;
+
+ public static String NO_GRAPH_VIEW = "0";
+
+ public static String GRAPH_VIEW = "1";
+
+ private int actionOption = ACTION_OPTION_SELECT;
+
+ private ColumnSelection oldColumnSelection;
+
+ public AnnotationColumnChooser()
+ {
+ try
+ {
+ jbInit();
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ public AnnotationColumnChooser(AlignViewport av, final AlignmentPanel ap)
+ {
+ super(av, ap);
+ frame = new JInternalFrame();
+ frame.setContentPane(this);
+ frame.setLayer(JLayeredPane.PALETTE_LAYER);
+ Desktop.addInternalFrame(frame,
+ MessageManager.getString("label.select_by_annotation"), 520,
+ 215);
+
+ addSliderChangeListener();
+ addSliderMouseListeners();
+
+ if (av.getAlignment().getAlignmentAnnotation() == null)
+ {
+ return;
+ }
+ setOldColumnSelection(av.getColumnSelection());
+ adjusting = true;
+
+ setAnnotations(new JComboBox<String>(getAnnotationItems(false)));
+ populateThresholdComboBox(threshold);
+
+ // restore Object state from the previous session if one exists
+ if (av.getAnnotationColumnSelectionState() != null)
+ {
+ currentSearchPanel = av.getAnnotationColumnSelectionState()
+ .getCurrentSearchPanel();
+ currentStructureFilterPanel = av.getAnnotationColumnSelectionState()
+ .getCurrentStructureFilterPanel();
+ annotations.setSelectedIndex(av.getAnnotationColumnSelectionState()
+ .getAnnotations().getSelectedIndex());
+ threshold.setSelectedIndex(av.getAnnotationColumnSelectionState()
+ .getThreshold().getSelectedIndex());
+ actionOption = av.getAnnotationColumnSelectionState()
+ .getActionOption();
+ }
+
+ try
+ {
+ jbInit();
+ } catch (Exception ex)
+ {
+ }
+ adjusting = false;
+
+ updateView();
+ frame.invalidate();
+ frame.pack();
+ }
+
+ private void jbInit() throws Exception
+ {
+ ok.setOpaque(false);
+ ok.setText(MessageManager.getString("action.ok"));
+ ok.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ ok_actionPerformed(e);
+ }
+ });
+
+ cancel.setOpaque(false);
+ cancel.setText(MessageManager.getString("action.cancel"));
+ cancel.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ cancel_actionPerformed(e);
+ }
+ });
+
+ annotations.addItemListener(this);
+ threshold.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ threshold_actionPerformed(e);
+ }
+ });
+
+ thresholdValue.setEnabled(false);
+ thresholdValue.setColumns(7);
+ thresholdValue.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ thresholdValue_actionPerformed(e);
+ }
+ });
+
+ slider.setPaintLabels(false);
+ slider.setPaintTicks(true);
+ slider.setBackground(Color.white);
+ slider.setEnabled(false);
+ slider.setOpaque(false);
+ slider.setPreferredSize(new Dimension(100, 32));
+
+ thresholdPanel.setBorder(new TitledBorder(MessageManager
+ .getString("label.threshold_filter")));
+ thresholdPanel.setBackground(Color.white);
+ thresholdPanel.setFont(JvSwingUtils.getLabelFont());
+ thresholdPanel.setLayout(new MigLayout("", "[left][right]", "[][]"));
+
+ actionPanel.setBackground(Color.white);
+ actionPanel.setFont(JvSwingUtils.getLabelFont());
+
+ graphFilterView.setLayout(new MigLayout("", "[left][right]", "[][]"));
+ graphFilterView.setBackground(Color.white);
+
+ noGraphFilterView.setLayout(new MigLayout("", "[left][right]", "[][]"));
+ noGraphFilterView.setBackground(Color.white);
+
+ annotationComboBoxPanel.setBackground(Color.white);
+ annotationComboBoxPanel.setFont(JvSwingUtils.getLabelFont());
+
+ gSearchPanel = new SearchPanel(this);
+ ngSearchPanel = new SearchPanel(this);
+ gFurtherActionPanel = new FurtherActionPanel(this);
+ ngFurtherActionPanel = new FurtherActionPanel(this);
+ gStructureFilterPanel = new StructureFilterPanel(this);
+ ngStructureFilterPanel = new StructureFilterPanel(this);
+
+ thresholdPanel.add(getThreshold());
+ thresholdPanel.add(thresholdValue, "wrap");
+ thresholdPanel.add(slider, "grow, span, wrap");
+
+ actionPanel.add(ok);
+ actionPanel.add(cancel);
+
+ graphFilterView.add(gSearchPanel, "grow, span, wrap");
+ graphFilterView.add(gStructureFilterPanel, "grow, span, wrap");
+ graphFilterView.add(thresholdPanel, "grow, span, wrap");
+ graphFilterView.add(gFurtherActionPanel);
+
+ noGraphFilterView.add(ngSearchPanel, "grow, span, wrap");
+ noGraphFilterView.add(ngStructureFilterPanel, "grow, span, wrap");
+ noGraphFilterView.add(ngFurtherActionPanel);
+
+ annotationComboBoxPanel.add(getAnnotations());
+ switchableViewsPanel.add(noGraphFilterView,
+ AnnotationColumnChooser.NO_GRAPH_VIEW);
+ switchableViewsPanel.add(graphFilterView,
+ AnnotationColumnChooser.GRAPH_VIEW);
+
+ this.setLayout(borderLayout1);
+ this.add(annotationComboBoxPanel, java.awt.BorderLayout.PAGE_START);
+ this.add(switchableViewsPanel, java.awt.BorderLayout.CENTER);
+ this.add(actionPanel, java.awt.BorderLayout.SOUTH);
+
+ selectedAnnotationChanged();
+ this.validate();
+ }
+
+ @SuppressWarnings("unchecked")
+ public void reset()
+ {
+ if (this.getOldColumnSelection() != null)
+ {
+ av.getColumnSelection().clear();
+
+ if (av.getAnnotationColumnSelectionState() != null)
+ {
+ ColumnSelection oldSelection = av
+ .getAnnotationColumnSelectionState()
+ .getOldColumnSelection();
+ if (oldSelection != null && oldSelection.getHiddenColumns() != null
+ && !oldSelection.getHiddenColumns().isEmpty())
+ {
+ for (Iterator<int[]> itr = oldSelection.getHiddenColumns()
+ .iterator(); itr.hasNext();)
+ {
+ int positions[] = itr.next();
+ av.hideColumns(positions[0], positions[1]);
+ }
+ }
+ av.setColumnSelection(oldSelection);
+ }
+ ap.paintAlignment(true);
+ }
+
+ }
+
+ public void valueChanged(boolean updateAllAnnotation)
+ {
+ if (slider.isEnabled())
+ {
+ getCurrentAnnotation().threshold.value = slider.getValue() / 1000f;
+ updateView();
+ propagateSeqAssociatedThreshold(updateAllAnnotation,
+ getCurrentAnnotation());
+ ap.paintAlignment(false);
+ }
+ }
+
+ public JComboBox<String> getThreshold()
+ {
+ return threshold;
+ }
+
+ public void setThreshold(JComboBox<String> threshold)
+ {
+ this.threshold = threshold;
+ }
+
+ public JComboBox<String> getAnnotations()
+ {
+ return annotations;
+ }
+
+ public void setAnnotations(JComboBox<String> annotations)
+ {
+ this.annotations = annotations;
+ }
+
+ @Override
+ public void updateView()
+ {
+ // Check if combobox is still adjusting
+ if (adjusting)
+ {
+ return;
+ }
+
+ AnnotationFilterParameter filterParams = new AnnotationFilterParameter();
+
+ setCurrentAnnotation(av.getAlignment().getAlignmentAnnotation()[annmap[getAnnotations()
+ .getSelectedIndex()]]);
+
+ int selectedThresholdItem = getSelectedThresholdItem(getThreshold()
+ .getSelectedIndex());
+
+ slider.setEnabled(true);
+ thresholdValue.setEnabled(true);
+
+ if (selectedThresholdItem == AnnotationColourGradient.NO_THRESHOLD)
+ {
+ slider.setEnabled(false);
+ thresholdValue.setEnabled(false);
+ thresholdValue.setText("");
+ // build filter params
+ }
+ else if (selectedThresholdItem != AnnotationColourGradient.NO_THRESHOLD)
+ {
+ if (getCurrentAnnotation().threshold == null)
+ {
+ getCurrentAnnotation()
+ .setThreshold(
+ new jalview.datamodel.GraphLine(
+ (getCurrentAnnotation().graphMax - getCurrentAnnotation().graphMin) / 2f,
+ "Threshold", Color.black));
+ }
+
+ adjusting = true;
+ float range = getCurrentAnnotation().graphMax * 1000
+ - getCurrentAnnotation().graphMin * 1000;
+
+ slider.setMinimum((int) (getCurrentAnnotation().graphMin * 1000));
+ slider.setMaximum((int) (getCurrentAnnotation().graphMax * 1000));
+ slider.setValue((int) (getCurrentAnnotation().threshold.value * 1000));
+ thresholdValue.setText(getCurrentAnnotation().threshold.value + "");
+ slider.setMajorTickSpacing((int) (range / 10f));
+ slider.setEnabled(true);
+ thresholdValue.setEnabled(true);
+ adjusting = false;
+
+ // build filter params
+ filterParams
+ .setThresholdType(AnnotationFilterParameter.ThresholdType.NO_THRESHOLD);
+ if (getCurrentAnnotation().graph != AlignmentAnnotation.NO_GRAPH)
+ {
+ filterParams
+ .setThresholdValue(getCurrentAnnotation().threshold.value);
+
+ if (selectedThresholdItem == AnnotationColourGradient.ABOVE_THRESHOLD)
+ {
+ filterParams
+ .setThresholdType(AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD);
+ }
+ else if (selectedThresholdItem == AnnotationColourGradient.BELOW_THRESHOLD)
+ {
+ filterParams
+ .setThresholdType(AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD);
+ }
+ }
+ }
+
+ if (currentStructureFilterPanel != null)
+ {
+ if (currentStructureFilterPanel.alphaHelix.isSelected())
+ {
+ filterParams.setFilterAlphaHelix(true);
+ }
+ if (currentStructureFilterPanel.betaStrand.isSelected())
+ {
+ filterParams.setFilterBetaSheet(true);
+ }
+ if (currentStructureFilterPanel.turn.isSelected())
+ {
+ filterParams.setFilterTurn(true);
+ }
+ }
+
+ if (currentSearchPanel != null)
+ {
+
+ if (!currentSearchPanel.searchBox.getText().isEmpty())
+ {
+ currentSearchPanel.description.setEnabled(true);
+ currentSearchPanel.displayName.setEnabled(true);
+ filterParams.setRegexString(currentSearchPanel.searchBox.getText());
+ if (currentSearchPanel.displayName.isSelected())
+ {
+ filterParams
+ .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DISPLAY_STRING);
+ }
+ if (currentSearchPanel.description.isSelected())
+ {
+ filterParams
+ .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DESCRIPTION);
+ }
+ }
+ else
+ {
+ currentSearchPanel.description.setEnabled(false);
+ currentSearchPanel.displayName.setEnabled(false);
+ }
+ }
+
+ av.getColumnSelection().filterAnnotations(
+ getCurrentAnnotation().annotations, filterParams);
+
+ av.showAllHiddenColumns();
+ if (getActionOption() == ACTION_OPTION_HIDE)
+ {
+ av.hideSelectedColumns();
+ }
+
+ filterParams = null;
+ av.setAnnotationColumnSelectionState(this);
+ ap.paintAlignment(true);
+ }
+
+ public ColumnSelection getOldColumnSelection()
+ {
+ return oldColumnSelection;
+ }
+
+ public void setOldColumnSelection(ColumnSelection currentColumnSelection)
+ {
+ if (currentColumnSelection != null)
+ {
+ this.oldColumnSelection = new ColumnSelection(currentColumnSelection);
+ }
+ }
+
+ public FurtherActionPanel getCurrentFutherActionPanel()
+ {
+ return currentFurtherActionPanel;
+ }
+
+ public void setCurrentFutherActionPanel(
+ FurtherActionPanel currentFutherActionPanel)
+ {
+ this.currentFurtherActionPanel = currentFutherActionPanel;
+ }
+
+ public SearchPanel getCurrentSearchPanel()
+ {
+ return currentSearchPanel;
+ }
+
+ public void setCurrentSearchPanel(SearchPanel currentSearchPanel)
+ {
+ this.currentSearchPanel = currentSearchPanel;
+ }
+
+ public int getActionOption()
+ {
+ return actionOption;
+ }
+
+ public void setActionOption(int actionOption)
+ {
+ this.actionOption = actionOption;
+ }
+
+ public StructureFilterPanel getCurrentStructureFilterPanel()
+ {
+ return currentStructureFilterPanel;
+ }
+
+ public void setCurrentStructureFilterPanel(
+ StructureFilterPanel currentStructureFilterPanel)
+ {
+ this.currentStructureFilterPanel = currentStructureFilterPanel;
+ }
+
+ public void select_action(ActionEvent actionEvent)
+ {
+ JRadioButton radioButton = (JRadioButton) actionEvent.getSource();
+ if (radioButton.isSelected())
+ {
+ setActionOption(ACTION_OPTION_SELECT);
+ updateView();
+ }
+ }
+
+ public void hide_action(ActionEvent actionEvent)
+ {
+ JRadioButton radioButton = (JRadioButton) actionEvent.getSource();
+ if (radioButton.isSelected())
+ {
+ setActionOption(ACTION_OPTION_HIDE);
+ updateView();
+ }
+ }
+
+ @Override
+ public void itemStateChanged(ItemEvent e)
+ {
+ selectedAnnotationChanged();
+ }
+
+ public void selectedAnnotationChanged()
+ {
+ String currentView = AnnotationColumnChooser.NO_GRAPH_VIEW;
+ if (av.getAlignment().getAlignmentAnnotation()[annmap[getAnnotations()
+ .getSelectedIndex()]].graph != AlignmentAnnotation.NO_GRAPH)
+ {
+ currentView = AnnotationColumnChooser.GRAPH_VIEW;
+ }
+
+ gSearchPanel.syncState();
+ gFurtherActionPanel.syncState();
+ gStructureFilterPanel.syncState();
+
+ ngSearchPanel.syncState();
+ ngFurtherActionPanel.syncState();
+ ngStructureFilterPanel.syncState();
+
+ switchableViewsLayout.show(switchableViewsPanel, currentView);
+ updateView();
+ }
+
+
+ public class FurtherActionPanel extends JPanel
+ {
+ private AnnotationColumnChooser aColChooser;
+
+ private JRadioButton hideOption = new JRadioButton();
+
+ private JRadioButton selectOption = new JRadioButton();
+
+ private ButtonGroup optionsGroup = new ButtonGroup();
+
+ public FurtherActionPanel(AnnotationColumnChooser aColChooser)
+ {
+ this.aColChooser = aColChooser;
+ JvSwingUtils.jvInitComponent(selectOption, "action.select");
+ selectOption.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent actionEvent)
+ {
+ selectRadioAction(actionEvent);
+ }
+ });
+
+ JvSwingUtils.jvInitComponent(hideOption, "action.hide");
+ hideOption.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent actionEvent)
+ {
+ hideRadioAction(actionEvent);
+ }
+ });
+
+ optionsGroup.add(selectOption);
+ optionsGroup.add(hideOption);
+ optionsGroup.setSelected(selectOption.getModel(), true);
+
+ JvSwingUtils.jvInitComponent(this);
+ syncState();
+
+ this.add(selectOption);
+ this.add(hideOption);
+ }
+
+ public void selectRadioAction(ActionEvent actionEvent)
+ {
+ aColChooser.setCurrentFutherActionPanel(this);
+ aColChooser.select_action(actionEvent);
+ }
+
+ public void hideRadioAction(ActionEvent actionEvent)
+ {
+ aColChooser.setCurrentFutherActionPanel(this);
+ aColChooser.hide_action(actionEvent);
+ }
+
+ public void syncState()
+ {
+ if (aColChooser.getActionOption() == AnnotationColumnChooser.ACTION_OPTION_HIDE)
+ {
+ this.optionsGroup.setSelected(this.hideOption.getModel(),
+ true);
+ }
+ else
+ {
+ this.optionsGroup.setSelected(this.selectOption.getModel(), true);
+ }
+ }
+ }
+
+ public class StructureFilterPanel extends JPanel
+ {
+ private AnnotationColumnChooser aColChooser;
+
+ private JCheckBox alphaHelix = new JCheckBox();
+
+ private JCheckBox betaStrand = new JCheckBox();
+
+ private JCheckBox turn = new JCheckBox();
+
+ private JCheckBox all = new JCheckBox();
+
+ public StructureFilterPanel(AnnotationColumnChooser aColChooser)
+ {
+ this.aColChooser = aColChooser;
+
+ JvSwingUtils.jvInitComponent(alphaHelix, "label.alpha_helix");
+ alphaHelix.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent actionEvent)
+ {
+ alphaHelix_actionPerformed();
+ }
+ });
+
+ JvSwingUtils.jvInitComponent(betaStrand, "label.beta_strand");
+ betaStrand.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent actionEvent)
+ {
+ betaStrand_actionPerformed();
+ }
+ });
+
+ JvSwingUtils.jvInitComponent(turn, "label.turn");
+ turn.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent actionEvent)
+ {
+ turn_actionPerformed();
+ }
+ });
+
+ JvSwingUtils.jvInitComponent(all, "label.select_all");
+ all.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent actionEvent)
+ {
+ all_actionPerformed();
+ }
+ });
+
+ this.setBorder(new TitledBorder(MessageManager
+ .getString("label.structures_filter")));
+ JvSwingUtils.jvInitComponent(this);
+
+ this.add(all);
+ this.add(alphaHelix);
+ this.add(betaStrand);
+ this.add(turn);
+ }
+
+ public void alphaHelix_actionPerformed()
+ {
+ updateSelectAllState();
+ aColChooser.setCurrentStructureFilterPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void betaStrand_actionPerformed()
+ {
+ updateSelectAllState();
+ aColChooser.setCurrentStructureFilterPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void turn_actionPerformed()
+ {
+ updateSelectAllState();
+ aColChooser.setCurrentStructureFilterPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void all_actionPerformed()
+ {
+ if (all.isSelected())
+ {
+ alphaHelix.setSelected(true);
+ betaStrand.setSelected(true);
+ turn.setSelected(true);
+ }
+ else
+ {
+ alphaHelix.setSelected(false);
+ betaStrand.setSelected(false);
+ turn.setSelected(false);
+ }
+ aColChooser.setCurrentStructureFilterPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void updateSelectAllState()
+ {
+ if (alphaHelix.isSelected() && betaStrand.isSelected()
+ && turn.isSelected())
+ {
+ all.setSelected(true);
+ }
+ else
+ {
+ all.setSelected(false);
+ }
+ }
+
+ public void syncState()
+ {
+ StructureFilterPanel sfp = aColChooser
+ .getCurrentStructureFilterPanel();
+ if (sfp != null)
+ {
+ alphaHelix.setSelected(sfp.alphaHelix.isSelected());
+ betaStrand.setSelected(sfp.betaStrand.isSelected());
+ turn.setSelected(sfp.turn.isSelected());
+ if (sfp.all.isSelected())
+ {
+ all.setSelected(true);
+ alphaHelix.setSelected(true);
+ betaStrand.setSelected(true);
+ turn.setSelected(true);
+ }
+ }
+
+ }
+ }
+
+ public class SearchPanel extends JPanel
+ {
+ private AnnotationColumnChooser aColChooser;
+
+ private JCheckBox displayName = new JCheckBox();
+
+ private JCheckBox description = new JCheckBox();
+
+ private JTextField searchBox = new JTextField(10);
+
+ public SearchPanel(AnnotationColumnChooser aColChooser)
+ {
+
+ this.aColChooser = aColChooser;
+ JvSwingUtils.jvInitComponent(this);
+ this.setBorder(new TitledBorder(MessageManager
+ .getString("label.search_filter")));
+
+ JvSwingUtils.jvInitComponent(searchBox);
+ searchBox.getDocument().addDocumentListener(
+ new DocumentListener()
+ {
+ @Override
+ public void insertUpdate(DocumentEvent e)
+ {
+ searchStringAction();
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e)
+ {
+ searchStringAction();
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e)
+ {
+ searchStringAction();
+ }
+ });
+
+ JvSwingUtils.jvInitComponent(displayName, "label.display_name");
+ displayName.setEnabled(false);
+ displayName.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent actionEvent)
+ {
+ displayNameCheckboxAction();
+ }
+ });
+
+ JvSwingUtils.jvInitComponent(description, "label.description");
+ description.setEnabled(false);
+ description.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent actionEvent)
+ {
+ discriptionCheckboxAction();
+ }
+ });
+
+ syncState();
+ this.add(searchBox);
+ this.add(displayName);
+ this.add(description);
+ }
+
+ public void displayNameCheckboxAction()
+ {
+ aColChooser.setCurrentSearchPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void discriptionCheckboxAction()
+ {
+ aColChooser.setCurrentSearchPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void searchStringAction()
+ {
+ aColChooser.setCurrentSearchPanel(this);
+ aColChooser.updateView();
+ }
+
+ public void syncState()
+ {
+ SearchPanel sp = aColChooser.getCurrentSearchPanel();
+ if (sp != null)
+ {
+ description.setEnabled(sp.description.isEnabled());
+ description.setSelected(sp.description.isSelected());
+
+ displayName.setEnabled(sp.displayName.isEnabled());
+ displayName.setSelected(sp.displayName.isSelected());
+
+ searchBox.setText(sp.searchBox.getText());
+ }
+ }
+ }
+
+}
package jalview.gui;
import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.SequenceGroup;
import jalview.io.AnnotationFile;
import jalview.io.FeaturesFile;
import jalview.io.JalviewFileChooser;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
boolean features = true;
- AlignmentAnnotation[] annotations;
+ private AlignmentAnnotation[] annotations;
- List<SequenceGroup> sequenceGroups;
-
- Hashtable alignmentProperties;
+ private boolean wholeView;
public AnnotationExporter()
{
frame.setTitle(MessageManager.getString("label.export_features"));
}
- public void exportAnnotations(AlignmentPanel ap,
- AlignmentAnnotation[] annotations, List<SequenceGroup> list,
- Hashtable alProperties)
+ public void exportAnnotations(AlignmentPanel ap)
{
this.ap = ap;
+ annotations = ap.av.isShowAnnotation() ? null : ap.av.getAlignment()
+ .getAlignmentAnnotation();
+ wholeView = true;
+ startExportAnnotation();
+ }
+
+ public void exportAnnotations(AlignmentPanel alp,
+ AlignmentAnnotation[] toExport)
+ {
+ ap = alp;
+ annotations = toExport;
+ wholeView = false;
+ startExportAnnotation();
+ }
+
+ private void startExportAnnotation()
+ {
features = false;
GFFFormat.setVisible(false);
CSVFormat.setVisible(true);
- this.annotations = annotations;
- this.sequenceGroups = list;
- this.alignmentProperties = alProperties;
frame.setTitle(MessageManager.getString("label.export_annotations"));
}
if (value == JalviewFileChooser.APPROVE_OPTION)
{
- String text = MessageManager.getString("label.no_features_on_alignment");
- if (features)
- {
- if (GFFFormat.isSelected())
- {
- text = new FeaturesFile().printGFFFormat(ap.av.getAlignment()
- .getDataset().getSequencesArray(),
- getDisplayedFeatureCols(), true, ap.av.isShowNpFeats());// ap.av.featuresDisplayed//);
- }
- else
- {
- text = new FeaturesFile().printJalviewFormat(ap.av.getAlignment()
- .getDataset().getSequencesArray(),
- getDisplayedFeatureCols(), true, ap.av.isShowNpFeats()); // ap.av.featuresDisplayed);
- }
- }
- else
- {
- if (CSVFormat.isSelected())
- {
- text = new AnnotationFile().printCSVAnnotations(annotations);
- }
- else
- {
- text = new AnnotationFile().printAnnotations(annotations,
- sequenceGroups, alignmentProperties);
- }
- }
+ String text = getFileContents();
try
{
close_actionPerformed(null);
}
- public void toTextbox_actionPerformed(ActionEvent e)
+ private String getFileContents()
{
- String text = MessageManager.getString("label.no_features_on_alignment");
+ String text = MessageManager
+ .getString("label.no_features_on_alignment");
if (features)
{
if (GFFFormat.isSelected())
{
text = new FeaturesFile().printGFFFormat(ap.av.getAlignment()
- .getDataset().getSequencesArray(),
- getDisplayedFeatureCols(), true, ap.av.isShowNpFeats());
+ .getDataset().getSequencesArray(), ap.getFeatureRenderer()
+ .getDisplayedFeatureCols(), true, ap.av.isShowNpFeats());// ap.av.featuresDisplayed//);
}
else
{
text = new FeaturesFile().printJalviewFormat(ap.av.getAlignment()
- .getDataset().getSequencesArray(),
- getDisplayedFeatureCols(), true, ap.av.isShowNpFeats());
+ .getDataset().getSequencesArray(), ap.getFeatureRenderer()
+ .getDisplayedFeatureCols(), true, ap.av.isShowNpFeats()); // ap.av.featuresDisplayed);
}
}
- else if (!features)
+ else
{
if (CSVFormat.isSelected())
{
}
else
{
- text = new AnnotationFile().printAnnotations(annotations,
- sequenceGroups, alignmentProperties);
+ if (wholeView)
+ {
+ text = new AnnotationFile().printAnnotationsForView(ap.av);
+ }
+ else
+ {
+ text = new AnnotationFile().printAnnotations(annotations, null,
+ null);
+ }
}
}
-
+ return text;
+ }
+ public void toTextbox_actionPerformed(ActionEvent e)
+ {
CutAndPasteTransfer cap = new CutAndPasteTransfer();
+
try
{
+ String text = getFileContents();
cap.setText(text);
Desktop.addInternalFrame(
cap,
close_actionPerformed(null);
}
-
- private Hashtable getDisplayedFeatureCols()
- {
- Hashtable fcols = new Hashtable();
- if (ap.av.getFeaturesDisplayed() == null)
- {
- return fcols;
- }
-
- Enumeration en = ap.av.getFeaturesDisplayed().keys();
- FeatureRenderer fr = ap.getSeqPanel().seqCanvas.getFeatureRenderer(); // consider
- // higher
- // level
- // method ?
- while (en.hasMoreElements())
- {
- Object col = en.nextElement();
- fcols.put(col, fr.featureColours.get(col));
- }
- return fcols;
- }
-
public void close_actionPerformed(ActionEvent e)
{
try
JPanel jPanel3 = new JPanel();
FlowLayout flowLayout1 = new FlowLayout();
-
}
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
+import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Vector;
import java.util.regex.Pattern;
import javax.swing.JCheckBoxMenuItem;
{
new AnnotationExporter().exportAnnotations(ap,
new AlignmentAnnotation[]
- { aa[selectedRow] }, null, null);
+ { aa[selectedRow] });
}
else if (evt.getActionCommand().equals(COPYCONS_SEQ))
{
Toolkit.getDefaultToolkit().getSystemClipboard()
.setContents(new StringSelection(output), Desktop.instance);
- Vector hiddenColumns = null;
+ ArrayList<int[]> hiddenColumns = null;
if (av.hasHiddenColumns())
{
- hiddenColumns = new Vector();
- for (int i = 0; i < av.getColumnSelection().getHiddenColumns().size(); i++)
+ hiddenColumns = new ArrayList<int[]>();
+ for (int[] region : av.getColumnSelection().getHiddenColumns())
{
- int[] region = (int[]) av.getColumnSelection().getHiddenColumns()
- .elementAt(i);
-
- hiddenColumns.addElement(new int[]
+ hiddenColumns.add(new int[]
{ region[0], region[1] });
}
}
--- /dev/null
+package jalview.gui;
+
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.GraphLine;
+import jalview.datamodel.SequenceGroup;
+import jalview.schemes.AnnotationColourGradient;
+import jalview.util.MessageManager;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.Vector;
+
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JInternalFrame;
+import javax.swing.JPanel;
+import javax.swing.JSlider;
+import javax.swing.JTextField;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+@SuppressWarnings("serial")
+public abstract class AnnotationRowFilter extends JPanel
+{
+ protected AlignViewport av;
+
+ protected AlignmentPanel ap;
+
+ protected int[] annmap;
+
+ protected boolean enableSeqAss = false;
+
+ private jalview.datamodel.AlignmentAnnotation currentAnnotation;
+
+ protected boolean adjusting = false;
+
+ protected JCheckBox currentColours = new JCheckBox();
+
+ protected JPanel minColour = new JPanel();
+
+ protected JPanel maxColour = new JPanel();
+
+ protected JCheckBox seqAssociated = new JCheckBox();
+
+ protected JCheckBox thresholdIsMin = new JCheckBox();
+
+ protected JSlider slider = new JSlider();
+
+ protected JTextField thresholdValue = new JTextField(20);
+
+ protected JInternalFrame frame;
+
+ protected JButton ok = new JButton();
+
+ protected JButton cancel = new JButton();
+
+ /**
+ * enabled if the user is dragging the slider - try to keep updates to a
+ * minimun
+ */
+ protected boolean sliderDragging = false;
+
+ protected void addSliderChangeListener()
+ {
+
+ slider.addChangeListener(new ChangeListener()
+ {
+ @Override
+ public void stateChanged(ChangeEvent evt)
+ {
+ if (!adjusting)
+ {
+ thresholdValue.setText((slider.getValue() / 1000f) + "");
+ valueChanged(!sliderDragging);
+ }
+ }
+ });
+ }
+
+ protected void addSliderMouseListeners()
+ {
+
+ slider.addMouseListener(new MouseAdapter()
+ {
+ @Override
+ public void mousePressed(MouseEvent e)
+ {
+ sliderDragging = true;
+ super.mousePressed(e);
+ }
+
+ @Override
+ public void mouseDragged(MouseEvent e)
+ {
+ sliderDragging = true;
+ super.mouseDragged(e);
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent evt)
+ {
+ if (sliderDragging)
+ {
+ sliderDragging = false;
+ valueChanged(true);
+ }
+ ap.paintAlignment(true);
+ }
+ });
+ }
+
+
+ public AnnotationRowFilter(AlignViewport av, final AlignmentPanel ap)
+ {
+ this.av = av;
+ this.ap = ap;
+ }
+
+ public AnnotationRowFilter()
+ {
+
+ }
+
+ public Vector<String> getAnnotationItems(boolean isSeqAssociated)
+ {
+ Vector<String> list = new Vector<String>();
+ int index = 1;
+ int[] anmap = new int[av.getAlignment().getAlignmentAnnotation().length];
+ for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
+ {
+ if (av.getAlignment().getAlignmentAnnotation()[i].sequenceRef == null)
+ {
+ if (isSeqAssociated)
+ {
+ continue;
+ }
+ }
+ else
+ {
+ enableSeqAss = true;
+ }
+ String label = av.getAlignment().getAlignmentAnnotation()[i].label;
+ if (!list.contains(label))
+ {
+ anmap[list.size()] = i;
+ list.add(label);
+
+ }
+ else
+ {
+ if (!isSeqAssociated)
+ {
+ anmap[list.size()] = i;
+ list.add(label + "_" + (index++));
+ }
+ }
+ }
+ this.annmap = new int[list.size()];
+ System.arraycopy(anmap, 0, this.annmap, 0, this.annmap.length);
+ return list;
+ }
+
+ protected int getSelectedThresholdItem(int indexValue)
+ {
+ int selectedThresholdItem = -1;
+ if (indexValue == 1)
+ {
+ selectedThresholdItem = AnnotationColourGradient.ABOVE_THRESHOLD;
+ }
+ else if (indexValue == 2)
+ {
+ selectedThresholdItem = AnnotationColourGradient.BELOW_THRESHOLD;
+ }
+ return selectedThresholdItem;
+ }
+
+ public void modelChanged()
+ {
+ seqAssociated.setEnabled(enableSeqAss);
+ }
+
+ public void ok_actionPerformed(ActionEvent e)
+ {
+ updateView();
+ try
+ {
+ frame.setClosed(true);
+ } catch (Exception ex)
+ {
+ }
+ }
+
+ public void cancel_actionPerformed(ActionEvent e)
+ {
+ reset();
+ ap.paintAlignment(true);
+ try
+ {
+ frame.setClosed(true);
+ } catch (Exception ex)
+ {
+ }
+ }
+
+ public void thresholdCheck_actionPerformed(ActionEvent e)
+ {
+ updateView();
+ }
+
+ public void annotations_actionPerformed(ActionEvent e)
+ {
+ updateView();
+ }
+
+ public void threshold_actionPerformed(ActionEvent e)
+ {
+ updateView();
+ }
+
+ public void thresholdValue_actionPerformed(ActionEvent e)
+ {
+ try
+ {
+ float f = Float.parseFloat(thresholdValue.getText());
+ slider.setValue((int) (f * 1000));
+ updateView();
+ } catch (NumberFormatException ex)
+ {
+ }
+ }
+
+ public void thresholdIsMin_actionPerformed(ActionEvent actionEvent)
+ {
+ updateView();
+ }
+
+ protected void populateThresholdComboBox(JComboBox<String> threshold)
+ {
+ threshold.addItem(MessageManager
+ .getString("label.threshold_feature_no_thereshold"));
+ threshold.addItem(MessageManager
+ .getString("label.threshold_feature_above_thereshold"));
+ threshold.addItem(MessageManager
+ .getString("label.threshold_feature_below_thereshold"));
+ }
+
+ protected void seqAssociated_actionPerformed(ActionEvent arg0,
+ JComboBox<String> annotations, JCheckBox seqAssociated)
+ {
+ adjusting = true;
+ String cursel = (String) annotations.getSelectedItem();
+ boolean isvalid = false, isseqs = seqAssociated.isSelected();
+ annotations.removeAllItems();
+ for (String anitem : getAnnotationItems(seqAssociated.isSelected()))
+ {
+ if (anitem.equals(cursel) || (isseqs && cursel.startsWith(anitem)))
+ {
+ isvalid = true;
+ cursel = anitem;
+ }
+ annotations.addItem(anitem);
+ }
+ adjusting = false;
+ if (isvalid)
+ {
+ annotations.setSelectedItem(cursel);
+ }
+ else
+ {
+ if (annotations.getItemCount() > 0)
+ {
+ annotations.setSelectedIndex(0);
+ }
+ }
+ }
+
+ protected void propagateSeqAssociatedThreshold(boolean allAnnotation,
+ AlignmentAnnotation annotation)
+ {
+ if (annotation.sequenceRef == null || annotation.threshold == null)
+ {
+ return;
+ }
+
+ float thr = annotation.threshold.value;
+ for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
+ {
+ AlignmentAnnotation aa = av.getAlignment().getAlignmentAnnotation()[i];
+ if (aa.label.equals(annotation.label)
+ && (annotation.getCalcId() == null ? aa.getCalcId() == null
+ : annotation.getCalcId().equals(aa.getCalcId())))
+ {
+ if (aa.threshold == null)
+ {
+ aa.threshold = new GraphLine(annotation.threshold);
+ }
+ else
+ {
+ aa.threshold.value = thr;
+ }
+ }
+ }
+ }
+
+ protected boolean colorAlignmContaining(
+ AlignmentAnnotation currentAnnotation, int selectedThresholdItem)
+ {
+
+ AnnotationColourGradient acg = null;
+ if (currentColours.isSelected())
+ {
+ acg = new AnnotationColourGradient(currentAnnotation,
+ av.getGlobalColourScheme(), selectedThresholdItem);
+ }
+ else
+ {
+ acg = new AnnotationColourGradient(currentAnnotation,
+ minColour.getBackground(), maxColour.getBackground(),
+ selectedThresholdItem);
+ }
+ acg.setSeqAssociated(seqAssociated.isSelected());
+
+ if (currentAnnotation.graphMin == 0f
+ && currentAnnotation.graphMax == 0f)
+ {
+ acg.setPredefinedColours(true);
+ }
+
+ acg.thresholdIsMinMax = thresholdIsMin.isSelected();
+
+ av.setGlobalColourScheme(acg);
+
+ if (av.getAlignment().getGroups() != null)
+ {
+
+ for (SequenceGroup sg : ap.av.getAlignment().getGroups())
+ {
+ if (sg.cs == null)
+ {
+ continue;
+ }
+
+ if (currentColours.isSelected())
+ {
+ sg.cs = new AnnotationColourGradient(currentAnnotation, sg.cs,
+ selectedThresholdItem);
+ ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated
+ .isSelected());
+
+ }
+ else
+ {
+ sg.cs = new AnnotationColourGradient(currentAnnotation,
+ minColour.getBackground(), maxColour.getBackground(),
+ selectedThresholdItem);
+ ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated
+ .isSelected());
+ }
+
+ }
+ }
+ return false;
+ }
+
+
+ public jalview.datamodel.AlignmentAnnotation getCurrentAnnotation()
+ {
+ return currentAnnotation;
+ }
+
+ public void setCurrentAnnotation(
+ jalview.datamodel.AlignmentAnnotation currentAnnotation)
+ {
+ this.currentAnnotation = currentAnnotation;
+ }
+
+ public abstract void valueChanged(boolean updateAllAnnotation);
+
+ public abstract void updateView();
+
+ public abstract void reset();
+}
// Set the colour using the current view for the associated alignframe
for (AlignmentPanel ap : _colourwith)
{
- jmb.colourBySequence(ap.av.showSequenceFeatures, ap);
+ jmb.colourBySequence(ap.av.isShowSequenceFeatures(), ap);
}
}
}
{
AlignmentPanel ap = (alignment == null) ? appJmolWindow.getAlignmentPanel()
: (AlignmentPanel) alignment;
- if (ap.av.showSequenceFeatures)
+ if (ap.av.isShowSequenceFeatures())
{
if (fr == null)
{
- fr = ap.cloneFeatureRenderer();
+ fr = (jalview.gui.FeatureRenderer) ap.cloneFeatureRenderer();
}
else
{
}
if (!isLoadingFromArchive())
{
- colourBySequence(ap.av.getShowSequenceFeatures(), ap);
+ colourBySequence(ap.av.isShowSequenceFeatures(), ap);
}
}
// Set the colour using the current view for the associated alignframe
for (AlignmentPanel ap : _colourwith)
{
- jmb.colourBySequence(ap.av.showSequenceFeatures, ap);
+ jmb.colourBySequence(ap.av.isShowSequenceFeatures(), ap);
}
}
}
}
});
- float mm[] = ((float[][]) fr.minmax.get(type))[0];
+ float mm[] = ((float[][]) fr.getMinMax().get(type))[0];
min = mm[0];
max = mm[1];
- oldcs = fr.featureColours.get(type);
+ oldcs = fr.getFeatureColours().get(type);
if (oldcs instanceof GraduatedColor)
{
if (((GraduatedColor) oldcs).isAutoScale())
maxColour.setForeground(oldmaxColour);
minColour.setForeground(oldminColour);
}
- fr.featureColours.put(type, acg);
+ fr.setColour(type, acg);
cs = acg;
ap.paintAlignment(false);
}
void reset()
{
- fr.featureColours.put(type, oldcs);
+ fr.setColour(type, oldcs);
ap.paintAlignment(false);
cs = null;
}
*/
package jalview.gui;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.image.*;
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-
-import javax.swing.*;
-
-import jalview.datamodel.*;
+import jalview.datamodel.SearchResults;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
import jalview.schemes.GraduatedColor;
import jalview.util.MessageManager;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.JColorChooser;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSpinner;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.SwingConstants;
+
/**
* DOCUMENT ME!
*
* @author $author$
* @version $Revision$
*/
-public class FeatureRenderer implements jalview.api.FeatureRenderer
+public class FeatureRenderer extends jalview.renderer.seqfeatures.FeatureRenderer implements jalview.api.FeatureRenderer
{
- AlignmentPanel ap;
-
- AlignViewport av;
-
Color resBoxColour;
- /**
- * global transparency for feature
- */
- float transparency = 1.0f;
-
- FontMetrics fm;
-
- int charOffset;
-
- Map featureColours = new ConcurrentHashMap();
-
- // A higher level for grouping features of a
- // particular type
- Map featureGroups = new ConcurrentHashMap();
-
- // This is actually an Integer held in the hashtable,
- // Retrieved using the key feature type
- Object currentColour;
-
- String[] renderOrder;
-
- PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
-
- Vector allfeatures;
+ AlignmentPanel ap;
/**
* Creates a new FeatureRenderer object.
*/
public FeatureRenderer(AlignmentPanel ap)
{
+ super();
this.ap = ap;
this.av = ap.av;
if (ap != null && ap.getSeqPanel() != null && ap.getSeqPanel().seqCanvas != null
}
}
- public class FeatureRendererSettings implements Cloneable
- {
- String[] renderOrder;
-
- Map featureGroups;
-
- Map featureColours;
-
- float transparency;
-
- Map featureOrder;
-
- public FeatureRendererSettings(String[] renderOrder,
- Hashtable featureGroups, Hashtable featureColours,
- float transparency, Hashtable featureOrder)
- {
- super();
- this.renderOrder = renderOrder;
- this.featureGroups = featureGroups;
- this.featureColours = featureColours;
- this.transparency = transparency;
- this.featureOrder = featureOrder;
- }
-
- /**
- * create an independent instance of the feature renderer settings
- *
- * @param fr
- */
- public FeatureRendererSettings(FeatureRenderer fr)
- {
- renderOrder = null;
- featureGroups = new ConcurrentHashMap();
- featureColours = new ConcurrentHashMap();
- featureOrder = new ConcurrentHashMap();
- if (fr.renderOrder != null)
- {
- this.renderOrder = new String[fr.renderOrder.length];
- System.arraycopy(fr.renderOrder, 0, renderOrder, 0,
- fr.renderOrder.length);
- }
- if (fr.featureGroups != null)
- {
- this.featureGroups = new ConcurrentHashMap(fr.featureGroups);
- }
- if (fr.featureColours != null)
- {
- this.featureColours = new ConcurrentHashMap(fr.featureColours);
- }
- Iterator en = fr.featureColours.keySet().iterator();
- while (en.hasNext())
- {
- Object next = en.next();
- Object val = featureColours.get(next);
- if (val instanceof GraduatedColor)
- {
- featureColours
- .put(next, new GraduatedColor((GraduatedColor) val));
- }
- }
- this.transparency = fr.transparency;
- if (fr.featureOrder != null)
- {
- this.featureOrder = new ConcurrentHashMap(fr.featureOrder);
- }
- }
- }
-
- public FeatureRendererSettings getSettings()
- {
- return new FeatureRendererSettings(this);
- }
-
- public void transferSettings(FeatureRendererSettings fr)
- {
- this.renderOrder = fr.renderOrder;
- this.featureGroups = fr.featureGroups;
- this.featureColours = fr.featureColours;
- this.transparency = fr.transparency;
- this.featureOrder = fr.featureOrder;
- }
-
- /**
- * update from another feature renderer
- *
- * @param fr
- * settings to copy
- */
- public void transferSettings(FeatureRenderer fr)
- {
- FeatureRendererSettings frs = new FeatureRendererSettings(fr);
- this.renderOrder = frs.renderOrder;
- this.featureGroups = frs.featureGroups;
- this.featureColours = frs.featureColours;
- this.transparency = frs.transparency;
- this.featureOrder = frs.featureOrder;
- if (av != null && av != fr.av)
- {
- // copy over the displayed feature settings
- if (fr.av != null)
- {
- if (fr.av.getFeaturesDisplayed() != null)
- {
- // update display settings
- if (av.getFeaturesDisplayed() == null)
- {
- av.setFeaturesDisplayed(new Hashtable(fr.av.getFeaturesDisplayed()));
- }
- else
- {
- av.getFeaturesDisplayed().clear();
- Enumeration en = fr.av.getFeaturesDisplayed().keys();
- while (en.hasMoreElements())
- {
- av.getFeaturesDisplayed().put(en.nextElement(), Boolean.TRUE);
- }
-
- }
- }
- }
- }
- }
-
- BufferedImage offscreenImage;
-
- boolean offscreenRender = false;
-
- public Color findFeatureColour(Color initialCol, SequenceI seq, int res)
- {
- return new Color(findFeatureColour(initialCol.getRGB(), seq, res));
- }
-
- /**
- * This is used by the Molecule Viewer and Overview to get the accurate
- * colourof the rendered sequence
- */
- public synchronized int findFeatureColour(int initialCol, SequenceI seq,
- int column)
- {
- if (!av.showSequenceFeatures)
- {
- return initialCol;
- }
-
- if (seq != lastSeq)
- {
- lastSeq = seq;
- sequenceFeatures = lastSeq.getDatasetSequence().getSequenceFeatures();
- if (sequenceFeatures != null)
- {
- sfSize = sequenceFeatures.length;
- }
- }
-
- if (sequenceFeatures != lastSeq.getDatasetSequence()
- .getSequenceFeatures())
- {
- sequenceFeatures = lastSeq.getDatasetSequence().getSequenceFeatures();
- if (sequenceFeatures != null)
- {
- sfSize = sequenceFeatures.length;
- }
- }
-
- if (sequenceFeatures == null || sfSize == 0)
- {
- return initialCol;
- }
-
- if (jalview.util.Comparison.isGap(lastSeq.getCharAt(column)))
- {
- return Color.white.getRGB();
- }
-
- // Only bother making an offscreen image if transparency is applied
- if (transparency != 1.0f && offscreenImage == null)
- {
- offscreenImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
- }
-
- currentColour = null;
- // TODO: non-threadsafe - each rendering thread needs its own instance of
- // the feature renderer - or this should be synchronized.
- offscreenRender = true;
-
- if (offscreenImage != null)
- {
- offscreenImage.setRGB(0, 0, initialCol);
- drawSequence(offscreenImage.getGraphics(), lastSeq, column, column, 0);
-
- return offscreenImage.getRGB(0, 0);
- }
- else
- {
- drawSequence(null, lastSeq, lastSeq.findPosition(column), -1, -1);
-
- if (currentColour == null)
- {
- return initialCol;
- }
- else
- {
- return ((Integer) currentColour).intValue();
- }
- }
-
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param g
- * DOCUMENT ME!
- * @param seq
- * DOCUMENT ME!
- * @param sg
- * DOCUMENT ME!
- * @param start
- * DOCUMENT ME!
- * @param end
- * DOCUMENT ME!
- * @param x1
- * DOCUMENT ME!
- * @param y1
- * DOCUMENT ME!
- * @param width
- * DOCUMENT ME!
- * @param height
- * DOCUMENT ME!
- */
- // String type;
- // SequenceFeature sf;
- SequenceI lastSeq;
-
- SequenceFeature[] sequenceFeatures;
-
- int sfSize, sfindex, spos, epos;
-
- /**
- * show scores as heights
- */
- protected boolean varyHeight = false;
-
- synchronized public void drawSequence(Graphics g, SequenceI seq,
- int start, int end, int y1)
- {
-
- if (seq.getDatasetSequence().getSequenceFeatures() == null
- || seq.getDatasetSequence().getSequenceFeatures().length == 0)
- {
- return;
- }
-
- if (g != null)
- {
- fm = g.getFontMetrics();
- }
-
- if (av.getFeaturesDisplayed() == null || renderOrder == null
- || newFeatureAdded)
- {
- findAllFeatures();
- if (av.getFeaturesDisplayed().size() < 1)
- {
- return;
- }
-
- sequenceFeatures = seq.getDatasetSequence().getSequenceFeatures();
- }
-
- if (lastSeq == null
- || seq != lastSeq
- || seq.getDatasetSequence().getSequenceFeatures() != sequenceFeatures)
- {
- lastSeq = seq;
- sequenceFeatures = seq.getDatasetSequence().getSequenceFeatures();
- }
-
- if (transparency != 1 && g != null)
- {
- Graphics2D g2 = (Graphics2D) g;
- g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
- transparency));
- }
-
- if (!offscreenRender)
- {
- spos = lastSeq.findPosition(start);
- epos = lastSeq.findPosition(end);
- }
-
- sfSize = sequenceFeatures.length;
- String type;
- for (int renderIndex = 0; renderIndex < renderOrder.length; renderIndex++)
- {
- type = renderOrder[renderIndex];
-
- if (type == null || !av.getFeaturesDisplayed().containsKey(type))
- {
- continue;
- }
-
- // loop through all features in sequence to find
- // current feature to render
- for (sfindex = 0; sfindex < sfSize; sfindex++)
- {
- if (!sequenceFeatures[sfindex].type.equals(type))
- {
- continue;
- }
-
- if (featureGroups != null
- && sequenceFeatures[sfindex].featureGroup != null
- && sequenceFeatures[sfindex].featureGroup.length() != 0
- && featureGroups
- .containsKey(sequenceFeatures[sfindex].featureGroup)
- && !((Boolean) featureGroups
- .get(sequenceFeatures[sfindex].featureGroup))
- .booleanValue())
- {
- continue;
- }
-
- if (!offscreenRender
- && (sequenceFeatures[sfindex].getBegin() > epos || sequenceFeatures[sfindex]
- .getEnd() < spos))
- {
- continue;
- }
-
- if (offscreenRender && offscreenImage == null)
- {
- if (sequenceFeatures[sfindex].begin <= start
- && sequenceFeatures[sfindex].end >= start)
- {
- // this is passed out to the overview and other sequence renderers
- // (e.g. molecule viewer) to get displayed colour for rendered
- // sequence
- currentColour = new Integer(
- getColour(sequenceFeatures[sfindex]).getRGB());
- // used to be retreived from av.featuresDisplayed
- // currentColour = av.featuresDisplayed
- // .get(sequenceFeatures[sfindex].type);
-
- }
- }
- else if (sequenceFeatures[sfindex].type.equals("disulfide bond"))
- {
-
- renderFeature(g, seq,
- seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
- seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
- getColour(sequenceFeatures[sfindex])
- // new Color(((Integer) av.featuresDisplayed
- // .get(sequenceFeatures[sfindex].type)).intValue())
- , start, end, y1);
- renderFeature(g, seq,
- seq.findIndex(sequenceFeatures[sfindex].end) - 1,
- seq.findIndex(sequenceFeatures[sfindex].end) - 1,
- getColour(sequenceFeatures[sfindex])
- // new Color(((Integer) av.featuresDisplayed
- // .get(sequenceFeatures[sfindex].type)).intValue())
- , start, end, y1);
-
- }
- else if (showFeature(sequenceFeatures[sfindex]))
- {
- if (av.showSeqFeaturesHeight
- && sequenceFeatures[sfindex].score != Float.NaN)
- {
- renderScoreFeature(g, seq,
- seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
- seq.findIndex(sequenceFeatures[sfindex].end) - 1,
- getColour(sequenceFeatures[sfindex]), start, end, y1,
- normaliseScore(sequenceFeatures[sfindex]));
- }
- else
- {
- renderFeature(g, seq,
- seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
- seq.findIndex(sequenceFeatures[sfindex].end) - 1,
- getColour(sequenceFeatures[sfindex]), start, end, y1);
- }
- }
-
- }
-
- }
-
- if (transparency != 1.0f && g != null)
- {
- Graphics2D g2 = (Graphics2D) g;
- g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
- 1.0f));
- }
- }
-
- Hashtable minmax = new Hashtable();
-
- /**
- * normalise a score against the max/min bounds for the feature type.
- *
- * @param sequenceFeature
- * @return byte[] { signed, normalised signed (-127 to 127) or unsigned
- * (0-255) value.
- */
- private final byte[] normaliseScore(SequenceFeature sequenceFeature)
- {
- float[] mm = ((float[][]) minmax.get(sequenceFeature.type))[0];
- final byte[] r = new byte[]
- { 0, (byte) 255 };
- if (mm != null)
- {
- if (r[0] != 0 || mm[0] < 0.0)
- {
- r[0] = 1;
- r[1] = (byte) ((int) 128.0 + 127.0 * (sequenceFeature.score / mm[1]));
- }
- else
- {
- r[1] = (byte) ((int) 255.0 * (sequenceFeature.score / mm[1]));
- }
- }
- return r;
- }
-
- char s;
-
- int i;
-
- void renderFeature(Graphics g, SequenceI seq, int fstart, int fend,
- Color featureColour, int start, int end, int y1)
- {
-
- if (((fstart <= end) && (fend >= start)))
- {
- if (fstart < start)
- { // fix for if the feature we have starts before the sequence start,
- fstart = start; // but the feature end is still valid!!
- }
-
- if (fend >= end)
- {
- fend = end;
- }
- int pady = (y1 + av.charHeight) - av.charHeight / 5;
- for (i = fstart; i <= fend; i++)
- {
- s = seq.getCharAt(i);
-
- if (jalview.util.Comparison.isGap(s))
- {
- continue;
- }
-
- g.setColor(featureColour);
-
- g.fillRect((i - start) * av.charWidth, y1, av.charWidth,
- av.charHeight);
-
- if (offscreenRender || !av.validCharWidth)
- {
- continue;
- }
-
- g.setColor(Color.white);
- charOffset = (av.charWidth - fm.charWidth(s)) / 2;
- g.drawString(String.valueOf(s), charOffset
- + (av.charWidth * (i - start)), pady);
-
- }
- }
- }
-
- void renderScoreFeature(Graphics g, SequenceI seq, int fstart, int fend,
- Color featureColour, int start, int end, int y1, byte[] bs)
- {
-
- if (((fstart <= end) && (fend >= start)))
- {
- if (fstart < start)
- { // fix for if the feature we have starts before the sequence start,
- fstart = start; // but the feature end is still valid!!
- }
-
- if (fend >= end)
- {
- fend = end;
- }
- int pady = (y1 + av.charHeight) - av.charHeight / 5;
- int ystrt = 0, yend = av.charHeight;
- if (bs[0] != 0)
- {
- // signed - zero is always middle of residue line.
- if (bs[1] < 128)
- {
- yend = av.charHeight * (128 - bs[1]) / 512;
- ystrt = av.charHeight - yend / 2;
- }
- else
- {
- ystrt = av.charHeight / 2;
- yend = av.charHeight * (bs[1] - 128) / 512;
- }
- }
- else
- {
- yend = av.charHeight * bs[1] / 255;
- ystrt = av.charHeight - yend;
-
- }
- for (i = fstart; i <= fend; i++)
- {
- s = seq.getCharAt(i);
-
- if (jalview.util.Comparison.isGap(s))
- {
- continue;
- }
-
- g.setColor(featureColour);
- int x = (i - start) * av.charWidth;
- g.drawRect(x, y1, av.charWidth, av.charHeight);
- g.fillRect(x, y1 + ystrt, av.charWidth, yend);
-
- if (offscreenRender || !av.validCharWidth)
- {
- continue;
- }
-
- g.setColor(Color.black);
- charOffset = (av.charWidth - fm.charWidth(s)) / 2;
- g.drawString(String.valueOf(s), charOffset
- + (av.charWidth * (i - start)), pady);
-
- }
- }
- }
-
- boolean newFeatureAdded = false;
-
- /**
- * Called when alignment in associated view has new/modified features to
- * discover and display.
- *
- */
- public void featuresAdded()
- {
- lastSeq = null;
- findAllFeatures();
- }
-
- boolean findingFeatures = false;
-
- /**
- * search the alignment for all new features, give them a colour and display
- * them. Then fires a PropertyChangeEvent on the changeSupport object.
- *
- */
- void findAllFeatures()
- {
- synchronized (firing)
- {
- if (firing.equals(Boolean.FALSE))
- {
- firing = Boolean.TRUE;
- findAllFeatures(true); // add all new features as visible
- changeSupport.firePropertyChange("changeSupport", null, null);
- firing = Boolean.FALSE;
- }
- }
- }
-
- /**
- * Searches alignment for all features and updates colours
- *
- * @param newMadeVisible
- * if true newly added feature types will be rendered immediatly
- */
- synchronized void findAllFeatures(boolean newMadeVisible)
- {
- newFeatureAdded = false;
-
- if (findingFeatures)
- {
- newFeatureAdded = true;
- return;
- }
-
- findingFeatures = true;
-
- if (av.getFeaturesDisplayed() == null)
- {
- av.setFeaturesDisplayed(new Hashtable());
- }
-
- allfeatures = new Vector();
- Vector oldfeatures = new Vector();
- if (renderOrder != null)
- {
- for (int i = 0; i < renderOrder.length; i++)
- {
- if (renderOrder[i] != null)
- {
- oldfeatures.addElement(renderOrder[i]);
- }
- }
- }
- if (minmax == null)
- {
- minmax = new Hashtable();
- }
- AlignmentI alignment = av.getAlignment();
- for (int i = 0; i < alignment.getHeight(); i++)
- {
- SequenceFeature[] features = alignment.getSequenceAt(i)
- .getDatasetSequence().getSequenceFeatures();
-
- if (features == null)
- {
- continue;
- }
-
- int index = 0;
- while (index < features.length)
- {
- if (!av.getFeaturesDisplayed().containsKey(features[index].getType()))
- {
-
- if (featureGroups.containsKey(features[index].getType()))
- {
- boolean visible = ((Boolean) featureGroups
- .get(features[index].featureGroup)).booleanValue();
-
- if (!visible)
- {
- index++;
- continue;
- }
- }
-
- if (!(features[index].begin == 0 && features[index].end == 0))
- {
- // If beginning and end are 0, the feature is for the whole sequence
- // and we don't want to render the feature in the normal way
-
- if (newMadeVisible
- && !oldfeatures.contains(features[index].getType()))
- {
- // this is a new feature type on the alignment. Mark it for
- // display.
- av.getFeaturesDisplayed().put(features[index].getType(),
- new Integer(getColour(features[index].getType())
- .getRGB()));
- setOrder(features[index].getType(), 0);
- }
- }
- }
- if (!allfeatures.contains(features[index].getType()))
- {
- allfeatures.addElement(features[index].getType());
- }
- if (features[index].score != Float.NaN)
- {
- int nonpos = features[index].getBegin() >= 1 ? 0 : 1;
- float[][] mm = (float[][]) minmax.get(features[index].getType());
- if (mm == null)
- {
- mm = new float[][]
- { null, null };
- minmax.put(features[index].getType(), mm);
- }
- if (mm[nonpos] == null)
- {
- mm[nonpos] = new float[]
- { features[index].score, features[index].score };
-
- }
- else
- {
- if (mm[nonpos][0] > features[index].score)
- {
- mm[nonpos][0] = features[index].score;
- }
- if (mm[nonpos][1] < features[index].score)
- {
- mm[nonpos][1] = features[index].score;
- }
- }
- }
- index++;
- }
- }
- updateRenderOrder(allfeatures);
- findingFeatures = false;
- }
-
- protected Boolean firing = Boolean.FALSE;
-
- /**
- * replaces the current renderOrder with the unordered features in
- * allfeatures. The ordering of any types in both renderOrder and allfeatures
- * is preserved, and all new feature types are rendered on top of the existing
- * types, in the order given by getOrder or the order given in allFeatures.
- * Note. this operates directly on the featureOrder hash for efficiency. TODO:
- * eliminate the float storage for computing/recalling the persistent ordering
- * New Cability: updates min/max for colourscheme range if its dynamic
- *
- * @param allFeatures
- */
- private void updateRenderOrder(Vector allFeatures)
- {
- Vector allfeatures = new Vector(allFeatures);
- String[] oldRender = renderOrder;
- renderOrder = new String[allfeatures.size()];
- Object mmrange, fc = null;
- boolean initOrders = (featureOrder == null);
- int opos = 0;
- if (oldRender != null && oldRender.length > 0)
- {
- for (int j = 0; j < oldRender.length; j++)
- {
- if (oldRender[j] != null)
- {
- if (initOrders)
- {
- setOrder(oldRender[j], (1 - (1 + (float) j)
- / (float) oldRender.length));
- }
- if (allfeatures.contains(oldRender[j]))
- {
- renderOrder[opos++] = oldRender[j]; // existing features always
- // appear below new features
- allfeatures.removeElement(oldRender[j]);
- if (minmax != null)
- {
- mmrange = minmax.get(oldRender[j]);
- if (mmrange != null)
- {
- fc = featureColours.get(oldRender[j]);
- if (fc != null && fc instanceof GraduatedColor
- && ((GraduatedColor) fc).isAutoScale())
- {
- ((GraduatedColor) fc).updateBounds(
- ((float[][]) mmrange)[0][0],
- ((float[][]) mmrange)[0][1]);
- }
- }
- }
- }
- }
- }
- }
- if (allfeatures.size() == 0)
- {
- // no new features - leave order unchanged.
- return;
- }
- int i = allfeatures.size() - 1;
- int iSize = i;
- boolean sort = false;
- String[] newf = new String[allfeatures.size()];
- float[] sortOrder = new float[allfeatures.size()];
- Enumeration en = allfeatures.elements();
- // sort remaining elements
- while (en.hasMoreElements())
- {
- newf[i] = en.nextElement().toString();
- if (minmax != null)
- {
- // update from new features minmax if necessary
- mmrange = minmax.get(newf[i]);
- if (mmrange != null)
- {
- fc = featureColours.get(newf[i]);
- if (fc != null && fc instanceof GraduatedColor
- && ((GraduatedColor) fc).isAutoScale())
- {
- ((GraduatedColor) fc).updateBounds(((float[][]) mmrange)[0][0],
- ((float[][]) mmrange)[0][1]);
- }
- }
- }
- if (initOrders || !featureOrder.containsKey(newf[i]))
- {
- int denom = initOrders ? allfeatures.size() : featureOrder.size();
- // new unordered feature - compute persistent ordering at head of
- // existing features.
- setOrder(newf[i], i / (float) denom);
- }
- // set order from newly found feature from persisted ordering.
- sortOrder[i] = 2 - ((Float) featureOrder.get(newf[i])).floatValue();
- if (i < iSize)
- {
- // only sort if we need to
- sort = sort || sortOrder[i] > sortOrder[i + 1];
- }
- i--;
- }
- if (iSize > 1 && sort)
- {
- jalview.util.QuickSort.sort(sortOrder, newf);
- }
- sortOrder = null;
- System.arraycopy(newf, 0, renderOrder, opos, newf.length);
- }
-
- /**
- * get a feature style object for the given type string. Creates a
- * java.awt.Color for a featureType with no existing colourscheme. TODO:
- * replace return type with object implementing standard abstract colour/style
- * interface
- *
- * @param featureType
- * @return java.awt.Color or GraduatedColor
- */
- public Object getFeatureStyle(String featureType)
- {
- Object fc = featureColours.get(featureType);
- if (fc == null)
- {
- jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme();
- Color col = ucs.createColourFromName(featureType);
- featureColours.put(featureType, fc = col);
- }
- return fc;
- }
-
- /**
- * return a nominal colour for this feature
- *
- * @param featureType
- * @return standard color, or maximum colour for graduated colourscheme
- */
- public Color getColour(String featureType)
- {
- Object fc = getFeatureStyle(featureType);
-
- if (fc instanceof Color)
- {
- return (Color) fc;
- }
- else
- {
- if (fc instanceof GraduatedColor)
- {
- return ((GraduatedColor) fc).getMaxColor();
- }
- }
- throw new Error(MessageManager.formatMessage("error.implementation_error_unrecognised_render_object_for_features_type", new String[]{fc.getClass().toString(),featureType}));
- }
-
- /**
- * calculate the render colour for a specific feature using current feature
- * settings.
- *
- * @param feature
- * @return render colour for the given feature
- */
- public Color getColour(SequenceFeature feature)
- {
- Object fc = getFeatureStyle(feature.getType());
- if (fc instanceof Color)
- {
- return (Color) fc;
- }
- else
- {
- if (fc instanceof GraduatedColor)
- {
- return ((GraduatedColor) fc).findColor(feature);
- }
- }
- throw new Error(MessageManager.formatMessage("error.implementation_error_unrecognised_render_object_for_features_type", new String[]{fc.getClass().toString(),feature.getType()}));
- }
-
- private boolean showFeature(SequenceFeature sequenceFeature)
- {
- Object fc = getFeatureStyle(sequenceFeature.type);
- if (fc instanceof GraduatedColor)
- {
- return ((GraduatedColor) fc).isColored(sequenceFeature);
- }
- else
- {
- return true;
- }
- }
-
// // /////////////
// // Feature Editing Dialog
// // Will be refactored in next release.
lastDescriptionAdded = description.getText().replaceAll("\n", " ");
// TODO: determine if the null feature group is valid
if (lastFeatureGroupAdded.length() < 1)
+ {
lastFeatureGroupAdded = null;
+ }
}
if (!newFeatures)
sf.description = lastDescriptionAdded;
setColour(sf.type, fcol);
- av.getFeaturesDisplayed().put(sf.type, getColour(sf.type));
+ getFeaturesDisplayed().setVisible(sf.type);
try
{
for (int i = 0; i < sequences.length; i++)
{
features[i].type = lastFeatureAdded;
- if (lastFeatureGroupAdded != null)
- features[i].featureGroup = lastFeatureGroupAdded;
+ // fix for JAL-1538 - always set feature group here
+ features[i].featureGroup = lastFeatureGroupAdded;
features[i].description = lastDescriptionAdded;
sequences[i].addSequenceFeature(features[i]);
ffile.parseDescriptionHTML(features[i], false);
}
- if (av.getFeaturesDisplayed() == null)
- {
- av.setFeaturesDisplayed(new Hashtable());
- }
-
if (lastFeatureGroupAdded != null)
{
- if (featureGroups == null)
- featureGroups = new Hashtable();
- featureGroups.put(lastFeatureGroupAdded, new Boolean(true));
+ setGroupVisibility(lastFeatureGroupAdded, true);
}
setColour(lastFeatureAdded, fcol);
- av.getFeaturesDisplayed().put(lastFeatureAdded,
- getColour(lastFeatureAdded));
+ setVisible(lastFeatureAdded);
findAllFeatures(false);
return true;
}
+
/**
* update the amend feature button dependent on the given style
*
// colour.setForeground(colour.getBackground());
}
}
-
- public void setColour(String featureType, Object col)
- {
- // overwrite
- // Color _col = (col instanceof Color) ? ((Color) col) : (col instanceof
- // GraduatedColor) ? ((GraduatedColor) col).getMaxColor() : null;
- // Object c = featureColours.get(featureType);
- // if (c == null || c instanceof Color || (c instanceof GraduatedColor &&
- // !((GraduatedColor)c).getMaxColor().equals(_col)))
- {
- featureColours.put(featureType, col);
- }
- }
-
- public void setTransparency(float value)
- {
- transparency = value;
- }
-
- public float getTransparency()
- {
- return transparency;
- }
-
- /**
- * Replace current ordering with new ordering
- *
- * @param data
- * { String(Type), Colour(Type), Boolean(Displayed) }
- */
- public void setFeaturePriority(Object[][] data)
- {
- setFeaturePriority(data, true);
- }
-
- /**
- *
- * @param data
- * { String(Type), Colour(Type), Boolean(Displayed) }
- * @param visibleNew
- * when true current featureDisplay list will be cleared
- */
- public void setFeaturePriority(Object[][] data, boolean visibleNew)
- {
- if (visibleNew)
- {
- if (av.getFeaturesDisplayed() != null)
- {
- av.getFeaturesDisplayed().clear();
- }
- else
- {
- av.setFeaturesDisplayed(new Hashtable());
- }
- }
- if (data == null)
- {
- return;
- }
-
- // The feature table will display high priority
- // features at the top, but theses are the ones
- // we need to render last, so invert the data
- renderOrder = new String[data.length];
-
- if (data.length > 0)
- {
- for (int i = 0; i < data.length; i++)
- {
- String type = data[i][0].toString();
- setColour(type, data[i][1]); // todo : typesafety - feature color
- // interface object
- if (((Boolean) data[i][2]).booleanValue())
- {
- av.getFeaturesDisplayed().put(type, new Integer(getColour(type)
- .getRGB()));
- }
-
- renderOrder[data.length - i - 1] = type;
- }
- }
-
- }
-
- Map featureOrder = null;
-
- /**
- * analogous to colour - store a normalized ordering for all feature types in
- * this rendering context.
- *
- * @param type
- * Feature type string
- * @param position
- * normalized priority - 0 means always appears on top, 1 means
- * always last.
- */
- public float setOrder(String type, float position)
- {
- if (featureOrder == null)
- {
- featureOrder = new Hashtable();
- }
- featureOrder.put(type, new Float(position));
- return position;
- }
-
- /**
- * get the global priority (0 (top) to 1 (bottom))
- *
- * @param type
- * @return [0,1] or -1 for a type without a priority
- */
- public float getOrder(String type)
- {
- if (featureOrder != null)
- {
- if (featureOrder.containsKey(type))
- {
- return ((Float) featureOrder.get(type)).floatValue();
- }
- }
- return -1;
- }
-
- /**
- * @param listener
- * @see java.beans.PropertyChangeSupport#addPropertyChangeListener(java.beans.PropertyChangeListener)
- */
- public void addPropertyChangeListener(PropertyChangeListener listener)
- {
- changeSupport.addPropertyChangeListener(listener);
- }
-
- /**
- * @param listener
- * @see java.beans.PropertyChangeSupport#removePropertyChangeListener(java.beans.PropertyChangeListener)
- */
- public void removePropertyChangeListener(PropertyChangeListener listener)
- {
- changeSupport.removePropertyChangeListener(listener);
- }
}
*/
package jalview.gui;
-import jalview.analysis.AlignmentSorter;
import jalview.bin.Cache;
-import jalview.commands.OrderCommand;
-import jalview.datamodel.AlignmentI;
import jalview.datamodel.SequenceFeature;
-import jalview.datamodel.SequenceGroup;
import jalview.datamodel.SequenceI;
import jalview.gui.Help.HelpId;
import jalview.io.JalviewFileChooser;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
-import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
+import java.util.Set;
import java.util.Vector;
import javax.help.HelpSetException;
Object[][] originalData;
+ private float originalTransparency;
+
final JInternalFrame frame;
JScrollPane scrollPane = new JScrollPane();
{
this.af = af;
fr = af.getFeatureRenderer();
-
- transparency.setMaximum(100 - (int) (fr.transparency * 100));
+ // allow transparency to be recovered
+ transparency.setMaximum(100 - (int) ((originalTransparency=fr.getTransparency()) * 100));
try
{
if (SwingUtilities.isRightMouseButton(evt))
{
popupSort(selectedRow, (String) table.getValueAt(selectedRow, 0),
- table.getValueAt(selectedRow, 1), fr.minmax, evt.getX(),
- evt.getY());
+ table.getValueAt(selectedRow, 1), fr.getMinMax(),
+ evt.getX(), evt.getY());
}
else if (evt.getClickCount() == 2)
{
if (evt.isPopupTrigger())
{
popupSort(selectedRow, (String) table.getValueAt(selectedRow, 0),
- table.getValueAt(selectedRow, 1), fr.minmax, evt.getX(),
+ table.getValueAt(selectedRow, 1), fr.getMinMax(),
+ evt.getX(),
evt.getY());
}
}
dassourceBrowser = new DasSourceBrowser(this);
dasSettingsPane.add(dassourceBrowser, BorderLayout.CENTER);
- if (af.getViewport().getFeaturesDisplayed() == null
- || fr.renderOrder == null)
+ if (af.getViewport().isShowSequenceFeatures() || !fr.hasRenderOrder())
{
fr.findAllFeatures(true); // display everything!
}
public void actionPerformed(ActionEvent e)
{
- me.sortByScore(new String[]
+ me.af.avc.sortAlignmentByFeatureScore(new String[]
{ type });
}
public void actionPerformed(ActionEvent e)
{
- me.sortByDens(new String[]
+ me.af.avc.sortAlignmentByFeatureDensity(new String[]
{ type });
}
synchronized public void setTableData()
{
- if (fr.featureGroups == null)
- {
- fr.featureGroups = new Hashtable();
- }
Vector allFeatures = new Vector();
Vector allGroups = new Vector();
SequenceFeature[] tmpfeatures;
if (!allGroups.contains(group))
{
allGroups.addElement(group);
- if (group != null)
- {
- checkGroupState(group);
- }
+ checkGroupState(group);
}
}
}
/**
+ * Synchronise gui group list and check visibility of group
*
* @param group
- * @return true if group has been seen before and is already added to set.
+ * @return true if group is visible
*/
private boolean checkGroupState(String group)
{
- boolean visible;
- if (fr.featureGroups.containsKey(group))
- {
- visible = ((Boolean) fr.featureGroups.get(group)).booleanValue();
- }
- else
- {
- visible = true; // new group is always made visible
- }
+ boolean visible = fr.checkGroupVisibility(group, true);
if (groupPanel == null)
{
if (alreadyAdded)
{
- return true;
+ return visible;
}
-
- fr.featureGroups.put(group, new Boolean(visible));
final String grp = group;
final JCheckBox check = new JCheckBox(group, visible);
check.setFont(new Font("Serif", Font.BOLD, 12));
{
public void itemStateChanged(ItemEvent evt)
{
- fr.featureGroups.put(check.getText(),
- new Boolean(check.isSelected()));
+ fr.setGroupVisibility(check.getText(), check.isSelected());
af.alignPanel.getSeqPanel().seqCanvas.repaint();
if (af.alignPanel.overviewPanel != null)
{
}
});
groupPanel.add(check);
- return false;
+ return visible;
}
boolean resettingTable = false;
continue;
}
- if (group == null || fr.featureGroups.get(group) == null
- || ((Boolean) fr.featureGroups.get(group)).booleanValue())
+ if (group == null || checkGroupState(group))
{
- if (group != null)
- {
- checkGroupState(group);
- }
type = tmpfeatures[index].getType();
if (!visibleChecks.contains(type))
{
Object[][] data = new Object[fSize][3];
int dataIndex = 0;
- if (fr.renderOrder != null)
+ if (fr.hasRenderOrder())
{
if (!handlingUpdate)
- {
+ {
fr.findAllFeatures(groupChanged != null); // prod to update
+ // colourschemes. but don't
+ // affect display
+ // First add the checks in the previous render order,
+ // in case the window has been closed and reopened
}
- // colourschemes. but don't
- // affect display
- // First add the checks in the previous render order,
- // in case the window has been closed and reopened
- for (int ro = fr.renderOrder.length - 1; ro > -1; ro--)
+ List<String> frl = fr.getRenderOrder();
+ for (int ro = frl.size() - 1; ro > -1; ro--)
{
- type = fr.renderOrder[ro];
+ type = frl.get(ro);
if (!visibleChecks.contains(type))
{
data[dataIndex][0] = type;
data[dataIndex][1] = fr.getFeatureStyle(type);
- data[dataIndex][2] = new Boolean(
- af.getViewport().getFeaturesDisplayed().containsKey(type));
+ data[dataIndex][2] = new Boolean(af.getViewport()
+ .getFeaturesDisplayed().isVisible(type));
dataIndex++;
visibleChecks.removeElement(type);
}
if (data[dataIndex][1] == null)
{
// "Colour has been updated in another view!!"
- fr.renderOrder = null;
+ fr.clearRenderOrder();
return;
}
if (groupPanel != null)
{
- groupPanel.setLayout(new GridLayout(fr.featureGroups.size() / 4 + 1,
- 4));
+ groupPanel.setLayout(new GridLayout(
+ fr.getFeatureGroupsSize() / 4 + 1, 4));
groupPanel.validate();
bigPanel.add(groupPanel, BorderLayout.NORTH);
PrintWriter out = new PrintWriter(new OutputStreamWriter(
new FileOutputStream(choice), "UTF-8"));
- Iterator e = fr.featureColours.keySet().iterator();
- float[] sortOrder = new float[fr.featureColours.size()];
- String[] sortTypes = new String[fr.featureColours.size()];
+ Set fr_colours = fr.getAllFeatureColours();
+ Iterator e = fr_colours.iterator();
+ float[] sortOrder = new float[fr_colours.size()];
+ String[] sortTypes = new String[fr_colours.size()];
int i = 0;
while (e.hasNext())
{
{
public void actionPerformed(ActionEvent e)
{
- sortByScore(null);
+ af.avc.sortAlignmentByFeatureScore(null);
}
});
sortByDens.setFont(JvSwingUtils.getLabelFont());
{
public void actionPerformed(ActionEvent e)
{
- sortByDens(null);
+ af.avc.sortAlignmentByFeatureDensity(null);
+ }
+ });
+ help.setFont(JvSwingUtils.getLabelFont());
+ help.setText(MessageManager.getString("action.help"));
+ help.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ try
+ {
+ Help.showHelpWindow(HelpId.SequenceFeatureSettings);
+ } catch (HelpSetException e1)
+ {
+ e1.printStackTrace();
+ }
}
});
help.setFont(JvSwingUtils.getLabelFont());
{
public void actionPerformed(ActionEvent e)
{
+ fr.setTransparency(originalTransparency);
updateFeatureRenderer(originalData);
close();
}
settingsPane.add(buttonPanel, java.awt.BorderLayout.SOUTH);
}
- protected void sortByDens(String[] typ)
- {
- sortBy(typ, "Sort by Density", AlignmentSorter.FEATURE_DENSITY);
- }
-
- protected void sortBy(String[] typ, String methodText, final String method)
- {
- if (typ == null)
- {
- typ = getDisplayedFeatureTypes();
- }
- String gps[] = null;
- gps = getDisplayedFeatureGroups();
- if (typ != null)
- {
- ArrayList types = new ArrayList();
- for (int i = 0; i < typ.length; i++)
- {
- if (typ[i] != null)
- {
- types.add(typ[i]);
- }
- typ = new String[types.size()];
- types.toArray(typ);
- }
- }
- if (gps != null)
- {
- ArrayList grps = new ArrayList();
-
- for (int i = 0; i < gps.length; i++)
- {
- if (gps[i] != null)
- {
- grps.add(gps[i]);
- }
- }
- gps = new String[grps.size()];
- grps.toArray(gps);
- }
- AlignmentPanel alignPanel = af.alignPanel;
- AlignmentI al = alignPanel.av.getAlignment();
-
- int start, stop;
- SequenceGroup sg = alignPanel.av.getSelectionGroup();
- if (sg != null)
- {
- start = sg.getStartRes();
- stop = sg.getEndRes();
- }
- else
- {
- start = 0;
- stop = al.getWidth();
- }
- SequenceI[] oldOrder = al.getSequencesArray();
- AlignmentSorter.sortByFeature(typ, gps, start, stop, al, method);
- af.addHistoryItem(new OrderCommand(methodText, oldOrder, alignPanel.av
- .getAlignment()));
- alignPanel.paintAlignment(true);
-
- }
-
- protected void sortByScore(String[] typ)
- {
- sortBy(typ, "Sort by Feature Score", AlignmentSorter.FEATURE_SCORE);
- }
-
- private String[] getDisplayedFeatureTypes()
- {
- String[] typ = null;
- if (fr != null)
- {
- synchronized (fr.renderOrder)
- {
- typ = new String[fr.renderOrder.length];
- System.arraycopy(fr.renderOrder, 0, typ, 0, typ.length);
- for (int i = 0; i < typ.length; i++)
- {
- if (af.viewport.getFeaturesDisplayed().get(typ[i]) == null)
- {
- typ[i] = null;
- }
- }
- }
- }
- return typ;
- }
-
- private String[] getDisplayedFeatureGroups()
- {
- String[] gps = null;
- ArrayList<String> _gps = new ArrayList<String>();
- if (fr != null)
- {
-
- if (fr.featureGroups != null)
- {
- Iterator en = fr.featureGroups.keySet().iterator();
- int g = 0;
- boolean valid = false;
- while (en.hasNext())
- {
- String gp = (String) en.next();
- Boolean on = (Boolean) fr.featureGroups.get(gp);
- if (on != null && on.booleanValue())
- {
- valid = true;
- _gps.add(gp);
- }
- }
- if (!valid)
- {
- return null;
- }
- else
- {
- gps = new String[_gps.size()];
- _gps.toArray(gps);
- }
- }
- }
- return gps;
- }
-
public void fetchDAS_actionPerformed(ActionEvent e)
{
fetchDAS.setEnabled(false);
for (int i = starty; i < alheight; i++)
{
SequenceI s = av.getAlignment().getSequenceAt(i);
- if (av.hasHiddenRows())
+ if (av.isDisplayReferenceSeq() || av.hasHiddenRows())
{
setHiddenFont(s);
}
continue;
}
- if (av.hasHiddenRows())
+ if (av.isDisplayReferenceSeq() || av.hasHiddenRows())
{
setHiddenFont(sequence);
}
seqAnnotReport
.createSequenceAnnotationReport(tip, sequence,
av.isShowDbRefs(), av.isShowNpFeats(),
- sp.seqCanvas.fr.minmax);
+ sp.seqCanvas.fr.getMinMax());
setToolTipText("<html>" + sequence.getDisplayId(true) + " "
+ tip.toString() + "</html>");
}
import jalview.util.Platform;
import jalview.util.jarInputStreamProvider;
import jalview.viewmodel.AlignmentViewport;
+import jalview.viewmodel.seqfeatures.FeatureRendererSettings;
+import jalview.viewmodel.seqfeatures.FeaturesDisplayed;
import jalview.ws.jws2.Jws2Discoverer;
import jalview.ws.jws2.dm.AAConSettings;
import jalview.ws.jws2.jabaws2.Jws2Instance;
view.setFontSize(av.font.getSize());
view.setFontStyle(av.font.getStyle());
view.setRenderGaps(av.renderGaps);
- view.setShowAnnotation(av.getShowAnnotation());
+ view.setShowAnnotation(av.isShowAnnotation());
view.setShowBoxes(av.getShowBoxes());
view.setShowColourText(av.getColourText());
view.setShowFullId(av.getShowJVSuffix());
view.setRightAlignIds(av.isRightAlignIds());
- view.setShowSequenceFeatures(av.showSequenceFeatures);
+ view.setShowSequenceFeatures(av.isShowSequenceFeatures());
view.setShowText(av.getShowText());
view.setShowUnconserved(av.getShowUnconserved());
view.setWrapAlignment(av.getWrapAlignment());
{
jalview.schemabinding.version2.FeatureSettings fs = new jalview.schemabinding.version2.FeatureSettings();
- String[] renderOrder = ap.getSeqPanel().seqCanvas.getFeatureRenderer().renderOrder;
+ String[] renderOrder = ap.getSeqPanel().seqCanvas.getFeatureRenderer()
+ .getRenderOrder().toArray(new String[0]);
Vector settingsAdded = new Vector();
Object gstyle = null;
.getColour(renderOrder[ro]).getRGB());
}
- setting.setDisplay(av.getFeaturesDisplayed()
- .containsKey(renderOrder[ro]));
+ setting.setDisplay(av.getFeaturesDisplayed().isVisible(
+ renderOrder[ro]));
float rorder = ap.getSeqPanel().seqCanvas.getFeatureRenderer()
.getOrder(renderOrder[ro]);
if (rorder > -1)
}
// Make sure we save none displayed feature settings
- Iterator en = ap.getSeqPanel().seqCanvas.getFeatureRenderer().featureColours
- .keySet().iterator();
+ Iterator en = ap.getSeqPanel().seqCanvas.getFeatureRenderer()
+ .getFeatureColours().keySet().iterator();
while (en.hasNext())
{
String key = en.next().toString();
fs.addSetting(setting);
settingsAdded.addElement(key);
}
- en = ap.getSeqPanel().seqCanvas.getFeatureRenderer().featureGroups
- .keySet().iterator();
+ // is groups actually supposed to be a map here ?
+ en = ap.getSeqPanel().seqCanvas.getFeatureRenderer().getFeatureGroups()
+ .iterator();
Vector groupsAdded = new Vector();
while (en.hasNext())
{
Group g = new Group();
g.setName(grp);
g.setDisplay(((Boolean) ap.getSeqPanel().seqCanvas
- .getFeatureRenderer().featureGroups.get(grp))
+ .getFeatureRenderer().checkGroupVisibility(grp, false))
.booleanValue());
fs.addGroup(g);
groupsAdded.addElement(grp);
for (int c = 0; c < av.getColumnSelection().getHiddenColumns()
.size(); c++)
{
- int[] region = (int[]) av.getColumnSelection()
- .getHiddenColumns().elementAt(c);
+ int[] region = av.getColumnSelection()
+ .getHiddenColumns().get(c);
HiddenColumns hc = new HiddenColumns();
hc.setStart(region[0]);
hc.setEnd(region[1]);
an.addProperty(prop);
}
}
+
AnnotationElement ae;
if (aa[i].annotations != null)
{
af.viewport.setColourAppliesToAllGroups(true);
- if (view.getShowSequenceFeatures())
- {
- af.viewport.showSequenceFeatures = true;
- }
+ af.viewport.setShowSequenceFeatures(view.getShowSequenceFeatures());
+
if (view.hasCentreColumnLabels())
{
af.viewport.setCentreColumnLabels(view.getCentreColumnLabels());
// recover featre settings
if (jms.getFeatureSettings() != null)
{
- af.viewport.setFeaturesDisplayed(new Hashtable());
+ FeaturesDisplayed fdi;
+ af.viewport.setFeaturesDisplayed(fdi = new FeaturesDisplayed());
String[] renderOrder = new String[jms.getFeatureSettings()
.getSettingCount()];
+ Hashtable featureGroups = new Hashtable();
+ Hashtable featureColours = new Hashtable();
+ Hashtable featureOrder = new Hashtable();
+
for (int fs = 0; fs < jms.getFeatureSettings().getSettingCount(); fs++)
{
Setting setting = jms.getFeatureSettings().getSetting(fs);
gc.setColourByLabel(setting.getColourByLabel());
}
// and put in the feature colour table.
- af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer().setColour(
- setting.getType(), gc);
+ featureColours.put(setting.getType(), gc);
}
else
{
- af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer().setColour(
- setting.getType(),
+ featureColours.put(setting.getType(),
new java.awt.Color(setting.getColour()));
}
renderOrder[fs] = setting.getType();
if (setting.hasOrder())
{
- af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer().setOrder(
- setting.getType(), setting.getOrder());
+ featureOrder.put(setting.getType(), setting.getOrder());
}
else
{
- af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer().setOrder(
- setting.getType(),
- fs / jms.getFeatureSettings().getSettingCount());
+ featureOrder.put(setting.getType(), new Float(fs
+ / jms.getFeatureSettings().getSettingCount()));
}
if (setting.getDisplay())
{
- af.viewport.getFeaturesDisplayed().put(setting.getType(), new Integer(
- setting.getColour()));
+ fdi.setVisible(setting.getType());
}
}
- af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer().renderOrder = renderOrder;
- Hashtable fgtable;
- af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer().featureGroups = fgtable = new Hashtable();
+ Hashtable fgtable = new Hashtable();
for (int gs = 0; gs < jms.getFeatureSettings().getGroupCount(); gs++)
{
Group grp = jms.getFeatureSettings().getGroup(gs);
fgtable.put(grp.getName(), new Boolean(grp.getDisplay()));
}
+ // FeatureRendererSettings frs = new FeatureRendererSettings(renderOrder,
+ // fgtable, featureColours, jms.getFeatureSettings().hasTransparency() ?
+ // jms.getFeatureSettings().getTransparency() : 0.0, featureOrder);
+ FeatureRendererSettings frs = new FeatureRendererSettings(
+ renderOrder, fgtable, featureColours, 1.0f, featureOrder);
+ af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer()
+ .transferSettings(frs);
+
}
if (view.getHiddenColumnsCount() > 0)
{
skipList = skipList2;
}
-
}
import jalview.structure.StructureSelectionManager;
import jalview.util.MessageManager;
import jalview.util.jarInputStreamProvider;
+import jalview.viewmodel.seqfeatures.FeatureRendererSettings;
import java.io.InputStreamReader;
import java.util.Hashtable;
}
af.viewport.setColourAppliesToAllGroups(true);
- af.viewport.showSequenceFeatures = view.getShowSequenceFeatures();
+ af.viewport.setShowSequenceFeatures(view.getShowSequenceFeatures());
if (jms.getFeatureSettings() != null)
{
- af.viewport.setFeaturesDisplayed(new Hashtable());
+ Hashtable featuresDisplayed = new Hashtable();
+ Hashtable featureColours = new Hashtable();
String[] renderOrder = new String[jms.getFeatureSettings()
.getSettingCount()];
for (int fs = 0; fs < jms.getFeatureSettings().getSettingCount(); fs++)
{
Setting setting = jms.getFeatureSettings().getSetting(fs);
- af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer().setColour(
+ featureColours.put(
setting.getType(), new java.awt.Color(setting.getColour()));
renderOrder[fs] = setting.getType();
if (setting.getDisplay())
{
- af.viewport.getFeaturesDisplayed().put(setting.getType(), new Integer(
+ featuresDisplayed.put(setting.getType(), new Integer(
setting.getColour()));
}
}
- af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer().renderOrder = renderOrder;
+ FeatureRendererSettings frs = new FeatureRendererSettings(renderOrder, new Hashtable(), featureColours, 1.0f, null);
+ af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer().transferSettings(frs);
}
af.setMenusFromViewport(af.viewport);
{
AlignmentPanel ap = (alignment == null) ? cvf.getAlignmentPanel()
: (AlignmentPanel) alignment;
- if (ap.av.showSequenceFeatures)
+ if (ap.av.isShowSequenceFeatures())
{
if (fr == null)
{
- fr = ap.cloneFeatureRenderer();
+ fr = (jalview.gui.FeatureRenderer) ap.cloneFeatureRenderer();
}
else
{
}
if (!isLoadingFromArchive())
{
- colourBySequence(ap.av.getShowSequenceFeatures(), ap);
+ colourBySequence(ap.av.isShowSequenceFeatures(), ap);
}
}
*/
package jalview.gui;
+import jalview.util.MessageManager;
+
import java.awt.Color;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionListener;
+import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
}
}
+ public static void jvInitComponent(AbstractButton comp, String i18nString)
+ {
+ setColorAndFont(comp);
+ if (i18nString != null && !i18nString.isEmpty())
+ {
+ comp.setText(MessageManager.getString(i18nString));
+ }
+ }
+
+ public static void jvInitComponent(JComponent comp)
+ {
+ setColorAndFont(comp);
+ }
+
+ private static void setColorAndFont(JComponent comp)
+ {
+ comp.setBackground(Color.white);
+ comp.setFont(JvSwingUtils.getLabelFont());
+ }
+
}
// main visible SeqCanvas
SequenceRenderer sr;
- FeatureRenderer fr;
+ jalview.renderer.seqfeatures.FeatureRenderer fr;
/**
* Creates a new OverviewPanel object.
sr.renderGaps = false;
sr.forOverview = true;
fr = new FeatureRenderer(ap);
-
+
// scale the initial size of overviewpanel to shape of alignment
float initialScale = (float) av.getAlignment().getWidth()
/ (float) av.getAlignment().getHeight();
{
miniMe = null;
- if (av.showSequenceFeatures)
+ if (av.isShowSequenceFeatures())
{
fr.transferSettings(ap.getSeqPanel().seqCanvas.getFeatureRenderer());
}
{
color = sr.getResidueBoxColour(seq, lastcol).getRGB();
- if (av.showSequenceFeatures)
+ if (av.isShowSequenceFeatures())
{
color = fr.findFeatureColour(color, seq, lastcol);
}
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.Annotation;
+import jalview.datamodel.ColumnSelection;
import jalview.datamodel.DBRefEntry;
import jalview.datamodel.PDBEntry;
import jalview.datamodel.Sequence;
JMenuItem sequenceDetails = new JMenuItem();
JMenuItem sequenceSelDetails = new JMenuItem();
+
+ JMenuItem makeReferenceSeq = new JMenuItem();
JMenuItem chooseAnnotations = new JMenuItem();
JMenu groupLinksMenu;
+ JMenuItem hideInsertions = new JMenuItem();
+
/**
* Creates a new PopupMenu object.
*
if (seq != null)
{
sequenceMenu.setText(sequence.getName());
+ if (seq == ap.av.getAlignment().getSeqrep())
+ {
+ makeReferenceSeq.setText("Unmark representative");
+ } else {
+ makeReferenceSeq.setText("Mark as representative");
+ }
if (seq.getDatasetSequence().getPDBId() != null
&& seq.getDatasetSequence().getPDBId().size() > 0)
}
// structureMenu.remove(colStructureMenu);
}
-
if (ap.av.getAlignment().isNucleotide() == true)
{
AlignmentAnnotation[] aa = ap.av.getAlignment()
}
}
}
-
}
menuItem = new JMenuItem(
editSequence_actionPerformed(actionEvent);
}
});
+ makeReferenceSeq.setText(MessageManager
+ .getString("label.mark_as_representative"));
+ makeReferenceSeq.addActionListener(new ActionListener()
+ {
+
+ @Override
+ public void actionPerformed(ActionEvent actionEvent)
+ {
+ makeReferenceSeq_actionPerformed(actionEvent);
+
+ }
+ });
+ hideInsertions.setText(MessageManager.getString("label.hide_insertions"));
+ hideInsertions.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ hideInsertions_actionPerformed(e);
+ }
+ });
/*
* annotationMenuItem.setText("By Annotation");
* annotationMenuItem.addActionListener(new ActionListener() { public void
groupMenu.add(sequenceSelDetails);
add(groupMenu);
add(sequenceMenu);
- this.add(structureMenu);
+ add(structureMenu);
+ if (sequence!=null)
+ {
+ add(hideInsertions);
+ }
// annotations configuration panel suppressed for now
// groupMenu.add(chooseAnnotations);
groupMenu.add(jMenu1);
sequenceMenu.add(sequenceName);
sequenceMenu.add(sequenceDetails);
+ sequenceMenu.add(makeReferenceSeq);
colourMenu.add(textColour);
colourMenu.add(noColourmenuItem);
colourMenu.add(clustalColour);
refresh();
}
+ protected void makeReferenceSeq_actionPerformed(ActionEvent actionEvent)
+ {
+ if (!ap.av.getAlignment().hasSeqrep())
+ {
+ // initialise the display flags so the user sees something happen
+ ap.av.setDisplayReferenceSeq(true);
+ ap.av.setColourByReferenceSeq(true);
+ ap.av.getAlignment().setSeqrep(sequence);
+ }
+ else
+ {
+ if (ap.av.getAlignment().getSeqrep() == sequence)
+ {
+ ap.av.getAlignment().setSeqrep(null);
+ }
+ else
+ {
+ ap.av.getAlignment().setSeqrep(sequence);
+ }
+ }
+ refresh();
+ }
+
+ protected void hideInsertions_actionPerformed(ActionEvent actionEvent)
+ {
+ if (sequence != null)
+ {
+ ColumnSelection cs = ap.av.getColumnSelection();
+ if (cs == null)
+ {
+ cs = new ColumnSelection();
+ }
+ cs.hideInsertionsFor(sequence);
+ ap.av.setColumnSelection(cs);
+ }
+ refresh();
+ }
protected void sequenceSelectionDetails_actionPerformed()
{
createSequenceDetailsReport(ap.av.getSequenceSelection());
true,
true,
false,
- (ap.getSeqPanel().seqCanvas.fr != null) ? ap.getSeqPanel().seqCanvas.fr.minmax
+ (ap.getSeqPanel().seqCanvas.fr != null) ? ap
+ .getSeqPanel().seqCanvas.fr
+ .getMinMax()
: null);
contents.append("</p>");
}
*/
package jalview.gui;
-import java.awt.*;
-import java.awt.event.*;
-
-import javax.swing.*;
-
-import jalview.datamodel.*;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
import jalview.util.MessageManager;
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+
+import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.SwingUtilities;
+import javax.swing.ToolTipManager;
+
/**
* DOCUMENT ME!
*
});
pop.add(item);
- if (av.getColumnSelection().getHiddenColumns().size() > 1)
+ if (av.getColumnSelection().hasHiddenColumns())
{
item = new JMenuItem(
MessageManager.getString("action.reveal_all"));
res = av.getColumnSelection().adjustForHiddenColumns(res);
reveal = null;
- for (int i = 0; i < av.getColumnSelection().getHiddenColumns().size(); i++)
+ if (av.getColumnSelection().getHiddenColumns() != null)
{
- int[] region = (int[]) av.getColumnSelection().getHiddenColumns()
- .elementAt(i);
- if (res + 1 == region[0] || res - 1 == region[1])
+ for (int[] region : av.getColumnSelection().getHiddenColumns())
{
- reveal = region;
- ToolTipManager.sharedInstance().registerComponent(this);
- this.setToolTipText(MessageManager
- .getString("label.reveal_hidden_columns"));
- break;
- }
- else
- {
- this.setToolTipText(null);
+ if (res + 1 == region[0] || res - 1 == region[1])
+ {
+ reveal = region;
+ ToolTipManager.sharedInstance().registerComponent(this);
+ this.setToolTipText(MessageManager
+ .getString("label.reveal_hidden_columns"));
+ break;
+ }
+ else
+ {
+ this.setToolTipText(null);
+ }
}
-
}
-
repaint();
}
}
gg.drawLine(
- (int) (((i - startx - 1) * av.charWidth) + (av.charWidth / 2)),
+ ((i - startx - 1) * av.charWidth) + (av.charWidth / 2),
y + 2,
- (int) (((i - startx - 1) * av.charWidth) + (av.charWidth / 2)),
+ ((i - startx - 1) * av.charWidth) + (av.charWidth / 2),
y + (fm.getDescent() * 2));
}
else
{
gg.drawLine(
- (int) (((i - startx - 1) * av.charWidth) + (av.charWidth / 2)),
+ ((i - startx - 1) * av.charWidth) + (av.charWidth / 2),
y + fm.getDescent(),
- (int) (((i - startx - 1) * av.charWidth) + (av.charWidth / 2)),
+ ((i - startx - 1) * av.charWidth) + (av.charWidth / 2),
y + (fm.getDescent() * 2));
}
}
{
gg.setColor(Color.blue);
int res;
- if (av.getShowHiddenMarkers())
+ if (av.getShowHiddenMarkers()
+ && av.getColumnSelection().getHiddenColumns() != null)
{
for (int i = 0; i < av.getColumnSelection().getHiddenColumns()
.size(); i++)
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.image.BufferedImage;
+import java.util.List;
import javax.swing.JComponent;
}
else
{
- java.util.Vector regions = av.getColumnSelection().getHiddenColumns();
+ List<int[]> regions = av.getColumnSelection().getHiddenColumns();
int screenY = 0;
int blockStart = startRes;
for (int i = 0; regions != null && i < regions.size(); i++)
{
- int[] region = (int[]) regions.elementAt(i);
+ int[] region = regions.get(i);
int hideStart = region[0];
int hideEnd = region[1];
sr.drawSequence(nextSeq, av.getAlignment().findAllGroups(nextSeq),
startRes, endRes, offset + ((i - startSeq) * av.charHeight));
- if (av.showSequenceFeatures)
+ if (av.isShowSequenceFeatures())
{
fr.drawSequence(g, nextSeq, startRes, endRes, offset
+ ((i - startSeq) * av.charHeight));
return seq;
}
- SequenceFeature[] findFeaturesAtRes(SequenceI sequence, int res)
- {
- Vector tmp = new Vector();
- SequenceFeature[] features = sequence.getSequenceFeatures();
- if (features != null)
- {
- for (int i = 0; i < features.length; i++)
- {
- if (av.getFeaturesDisplayed() == null
- || !av.getFeaturesDisplayed().containsKey(
- features[i].getType()))
- {
- continue;
- }
-
- if (features[i].featureGroup != null
- && seqCanvas.fr.featureGroups != null
- && seqCanvas.fr.featureGroups
- .containsKey(features[i].featureGroup)
- && !((Boolean) seqCanvas.fr.featureGroups
- .get(features[i].featureGroup)).booleanValue())
- {
- continue;
- }
-
- if ((features[i].getBegin() <= res)
- && (features[i].getEnd() >= res))
- {
- tmp.addElement(features[i]);
- }
- }
- }
-
- features = new SequenceFeature[tmp.size()];
- tmp.copyInto(features);
-
- return features;
- }
-
void endEditing()
{
if (editCommand != null && editCommand.getSize() > 0)
}
// use aa to see if the mouse pointer is on a
- if (av.showSequenceFeatures)
+ if (av.isShowSequenceFeatures())
{
int rpos;
- SequenceFeature[] features = findFeaturesAtRes(
+ List<SequenceFeature> features = ap.getFeatureRenderer().findFeaturesAtRes(
sequence.getDatasetSequence(),
rpos = sequence.findPosition(res));
seqARep.appendFeatures(tooltipText, rpos, features,
- this.ap.getSeqPanel().seqCanvas.fr.minmax);
+ this.ap.getSeqPanel().seqCanvas.fr.getMinMax());
}
if (tooltipText.length() == 6) // <html></html>
{
av.setSelectionGroup(null);
}
- SequenceFeature[] features = findFeaturesAtRes(
+ List<SequenceFeature> features = seqCanvas.getFeatureRenderer().findFeaturesAtRes(
sequence.getDatasetSequence(),
sequence.findPosition(findRes(evt)));
- if (features != null && features.length > 0)
+ if (features != null && features.size()> 0)
{
SearchResults highlight = new SearchResults();
- highlight.addResult(sequence, features[0].getBegin(),
- features[0].getEnd());
+ highlight.addResult(sequence, features.get(0).getBegin(),
+ features.get(0).getEnd());
seqCanvas.highlightSearchResults(highlight);
}
- if (features != null && features.length > 0)
+ if (features != null && features.size()> 0)
{
seqCanvas.getFeatureRenderer().amendFeatures(new SequenceI[]
- { sequence }, features, false, ap);
+ { sequence }, features.toArray(new SequenceFeature[features.size()]), false, ap);
seqCanvas.highlightSearchResults(null);
}
if (javax.swing.SwingUtilities.isRightMouseButton(evt))
{
- SequenceFeature[] allFeatures = findFeaturesAtRes(
+ List<SequenceFeature> allFeatures = ap.getFeatureRenderer().findFeaturesAtRes(
sequence.getDatasetSequence(), sequence.findPosition(res));
Vector links = new Vector();
- for (int i = 0; i < allFeatures.length; i++)
+ for (SequenceFeature sf:allFeatures)
{
- if (allFeatures[i].links != null)
+ if (sf.links != null)
{
- for (int j = 0; j < allFeatures[i].links.size(); j++)
+ for (int j = 0; j < sf.links.size(); j++)
{
- links.addElement(allFeatures[i].links.elementAt(j));
+ links.addElement(sf.links.elementAt(j));
}
}
}
}
else
{
+ boolean srep = av.isDisplayReferenceSeq();
boolean getboxColour = false;
for (int i = start; i <= end; i++)
{
if (currentSequenceGroup.getShowNonconserved()) // todo optimize
{
// todo - use sequence group consensus
- s = getDisplayChar(av.getAlignmentConsensusAnnotation(), i, s,
+ s = getDisplayChar(srep, i, s,
'.');
}
}
if (av.getShowUnconserved())
{
- s = getDisplayChar(av.getAlignmentConsensusAnnotation(), i, s,
+ s = getDisplayChar(srep, i, s,
'.');
}
}
}
- private char getDisplayChar(AlignmentAnnotation consensus, int position,
+ private char getDisplayChar(final boolean usesrep, int position,
char s, char c)
{
- char conschar = consensus.annotations[position].displayCharacter
+ // TODO - use currentSequenceGroup rather than alignemnt
+ // currentSequenceGroup.getConsensus()
+ char conschar = (usesrep) ? av.getAlignment().getSeqrep().getCharAt(position) : av.getAlignmentConsensusAnnotation().annotations[position].displayCharacter
.charAt(0);
if (conschar != '-' && s == conschar)
{
*/
package jalview.gui;
-import java.beans.*;
-import java.io.*;
-import java.util.*;
-import java.util.List;
-
-import javax.imageio.*;
-
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.image.*;
-import javax.swing.*;
-
-import org.jibble.epsgraphics.*;
-import jalview.analysis.*;
+import jalview.analysis.AlignmentSorter;
+import jalview.analysis.NJTree;
+import jalview.api.analysis.ScoreModelI;
+import jalview.api.analysis.ViewBasedAnalysisI;
+import jalview.bin.Cache;
import jalview.commands.CommandI;
import jalview.commands.OrderCommand;
-import jalview.datamodel.*;
-import jalview.io.*;
-import jalview.jbgui.*;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.AlignmentView;
+import jalview.datamodel.BinaryNode;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.DBRefEntry;
+import jalview.datamodel.NodeTransformI;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.datamodel.SequenceNode;
+import jalview.io.JalviewFileChooser;
+import jalview.io.JalviewFileView;
+import jalview.io.NewickFile;
+import jalview.jbgui.GTreePanel;
+import jalview.schemes.ResidueProperties;
import jalview.util.MessageManager;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.image.BufferedImage;
+import java.beans.PropertyChangeEvent;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.imageio.ImageIO;
+import javax.swing.ButtonGroup;
+import javax.swing.JMenuItem;
+import javax.swing.JRadioButtonMenuItem;
+
+import org.jibble.epsgraphics.EpsGraphics2D;
+
/**
* DOCUMENT ME!
*
seqs = av.getSelectionGroup().getSequencesInOrder(
av.getAlignment());
}
-
- tree = new NJTree(seqs, seqStrings, type, pwtype, start, end);
+ ScoreModelI sm = ResidueProperties.getScoreModel(pwtype);
+ if (sm instanceof ViewBasedAnalysisI)
+ {
+ try
+ {
+ sm = sm.getClass().newInstance();
+ ((ViewBasedAnalysisI) sm)
+ .configureFromAlignmentView(treeCanvas.ap);
+ } catch (Exception q)
+ {
+ Cache.log.error("Couldn't create a scoremodel instance for "
+ + sm.getName());
+ }
+ tree = new NJTree(seqs, seqStrings, type, pwtype, sm, start, end);
+ }
+ else
+ {
+ tree = new NJTree(seqs, seqStrings, type, pwtype, null, start,
+ end);
+ }
showDistances(true);
}
*/
package jalview.io;
-import java.io.*;
-import java.net.*;
-import java.util.*;
-
-import jalview.analysis.*;
-import jalview.datamodel.*;
-import jalview.schemes.*;
+import jalview.analysis.Conservation;
+import jalview.api.AlignViewportI;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.GraphLine;
+import jalview.datamodel.HiddenSequences;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.schemes.ColourSchemeI;
+import jalview.schemes.ColourSchemeProperty;
+import jalview.schemes.ResidueProperties;
+import jalview.schemes.UserColourScheme;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.Vector;
public class AnnotationFile
{
}
/**
- * convenience method for pre-2.4 feature files which have no view, hidden
+ * convenience method for pre-2.9 annotation files which have no view, hidden
* columns or hidden row keywords.
*
* @param annotations
* @param list
* @param properties
- * @return feature file as a string.
+ * @return annotation file as a string.
*/
public String printAnnotations(AlignmentAnnotation[] annotations,
List<SequenceGroup> list, Hashtable properties)
{
- return printAnnotations(annotations, list, properties, null);
+ return printAnnotations(annotations, list, properties, null, null, null);
}
* @return annotation file
*/
public String printAnnotations(AlignmentAnnotation[] annotations,
- List<SequenceGroup> list, Hashtable properties, ViewDef[] views)
+ List<SequenceGroup> list, Hashtable properties,
+ ColumnSelection cs, AlignmentI al, ViewDef view)
{
- // TODO: resolve views issue : annotationFile could contain visible region,
- // or full data + hidden region specifications for a view.
+ if (view != null)
+ {
+ if (view.viewname != null)
+ {
+ text.append("VIEW_DEF\t" + view.viewname + "\n");
+ }
+ if (list == null)
+ {
+ list = view.visibleGroups;
+ }
+ if (cs == null)
+ {
+ cs = view.hiddencols;
+ }
+ if (al == null)
+ {
+ // add hidden rep sequences.
+ }
+ }
+ // first target - store and restore all settings for a view.
+ if (al != null && al.hasSeqrep())
+ {
+ text.append("VIEW_SETREF\t" + al.getSeqrep().getName() + "\n");
+ }
+ if (cs != null && cs.hasHiddenColumns())
+ {
+ text.append("VIEW_HIDECOLS\t");
+ List<int[]> hc = cs.getHiddenColumns();
+ boolean comma = false;
+ for (int[] r : hc)
+ {
+ if (!comma)
+ {
+ comma = true;
+ }
+ else
+ {
+ text.append(",");
+ }
+ text.append(r[0]);
+ text.append("-");
+ text.append(r[1]);
+ }
+ text.append("\n");
+ }
+ // TODO: allow efficient recovery of annotation data shown in several
+ // different views
if (annotations != null)
{
boolean oneColour = true;
}
if (row.hasScore())
+ {
text.append("\t" + row.score);
+ }
text.append(newline);
text.append(properties.get(key));
}
// TODO: output alignment visualization settings here if required
-
+ // iterate through one or more views, defining, marking columns and rows as visible/hidden, and emmitting view properties.
+ // View specific annotation is
}
return text.toString();
String refSeqId = null;
+ public boolean annotateAlignmentView(AlignViewportI viewport,
+ String file, String protocol)
+ {
+ ColumnSelection colSel = viewport.getColumnSelection();
+ if (colSel == null)
+ {
+ colSel = new ColumnSelection();
+ }
+ boolean rslt = readAnnotationFile(viewport.getAlignment(), colSel,
+ file, protocol);
+ if (rslt
+ && (colSel.hasSelectedColumns() || colSel.hasHiddenColumns()))
+ {
+ viewport.setColumnSelection(colSel);
+ }
+
+ return rslt;
+ }
public boolean readAnnotationFile(AlignmentI al, String file,
String protocol)
{
+ return readAnnotationFile(al, null, file, protocol);
+ }
+
+ public boolean readAnnotationFile(AlignmentI al, ColumnSelection colSel,
+ String file, String protocol)
+ {
BufferedReader in = null;
try
{
}
if (in != null)
{
- return parseAnnotationFrom(al, in);
+ return parseAnnotationFrom(al, colSel, in);
}
} catch (Exception ex)
private static String GRAPHLINE = "GRAPHLINE", COMBINE = "COMBINE";
- public boolean parseAnnotationFrom(AlignmentI al, BufferedReader in)
+ public boolean parseAnnotationFrom(AlignmentI al, ColumnSelection colSel,
+ BufferedReader in)
throws Exception
{
nlinesread = 0;
modified = true;
continue;
}
+ // else if (token.equalsIgnoreCase("VIEW_DEF"))
+ // {
+ // addOrSetView(al,st);
+ // modified = true;
+ // continue;
+ // }
+ else if (token.equalsIgnoreCase("VIEW_SETREF"))
+ {
+ if (refSeq != null)
+ {
+ al.setSeqrep(refSeq);
+ }
+ modified = true;
+ continue;
+ }
+ else if (token.equalsIgnoreCase("VIEW_HIDECOLS"))
+ {
+ if (st.hasMoreTokens())
+ {
+ if (colSel == null)
+ {
+ colSel = new ColumnSelection();
+ }
+ parseHideCols(colSel, st.nextToken());
+ }
+ modified = true;
+ continue;
+ }
+ else if (token.equalsIgnoreCase("HIDE_INSERTIONS"))
+ {
+ SequenceI sr = refSeq == null ? al.getSeqrep() : refSeq;
+ if (sr == null)
+ {
+ sr = al.getSequenceAt(0);
+ }
+ if (sr != null)
+ {
+ if (colSel == null)
+ {
+ System.err
+ .println("Cannot process HIDE_INSERTIONS without an alignment view: Ignoring line: "
+ + line);
+ }
+ else
+ {
+ // consider deferring this till after the file has been parsed ?
+ colSel.hideInsertionsFor(sr);
+ }
+ }
+ modified = true;
+ continue;
+ }
// Parse out the annotation row
graphStyle = AlignmentAnnotation.getGraphValueFromString(token);
{
description = line;
if (st.hasMoreTokens())
+ {
line = st.nextToken();
+ }
}
if (st.hasMoreTokens())
(StringTokenizer) _deferred_args[1], // st
(SequenceI) _deferred_args[2], // refSeq
(_deferred_args[3] == null) ? null : groupRefLookup
- .get((String) _deferred_args[3]) // the reference
+ .get(_deferred_args[3]) // the reference
// group, or null
);
}
(StringTokenizer) _combine_args[0], // st
(SequenceI) _combine_args[1], // refSeq
(_combine_args[2] == null) ? null : groupRefLookup
- .get((String) _combine_args[2]) // the reference group,
+ .get(_combine_args[2]) // the reference group,
// or null
);
}
return modified;
}
+ private void parseHideCols(ColumnSelection colSel, String nextToken)
+ {
+ StringTokenizer inval = new StringTokenizer(nextToken,",");
+ while (inval.hasMoreTokens())
+ {
+ String range = inval.nextToken().trim();
+ int from, to = range.indexOf("-");
+ if (to == -1)
+ {
+ from = to = Integer.parseInt(range);
+ if (from >= 0)
+ {
+ colSel.hideColumns(from, to);
+ }
+ }
+ else
+ {
+ from = Integer.parseInt(range.substring(0, to));
+ if (to < range.length() - 1)
+ {
+ to = Integer.parseInt(range.substring(to + 1));
+ }
+ else
+ {
+ to = from;
+ }
+ if (from > 0 && to >= from)
+ {
+ colSel.hideColumns(from, to);
+ }
+ }
+ }
+ }
+
private Object autoAnnotsKey(AlignmentAnnotation annotation,
SequenceI refSeq, String groupRef)
{
}
return sp.toString();
}
+
+ public String printAnnotationsForView(AlignViewportI viewport)
+ {
+ return printAnnotations(viewport.isShowAnnotation() ? viewport
+ .getAlignment().getAlignmentAnnotation() : null, viewport
+ .getAlignment().getGroups(), viewport.getAlignment()
+ .getProperties(), viewport.getColumnSelection(),
+ viewport.getAlignment(), null);
+ }
+
+ public String printAnnotationsForAlignment(AlignmentI al)
+ {
+ return printAnnotations(al.getAlignmentAnnotation(), al.getGroups(),
+ al.getProperties(), null, al, null);
+ }
}
* that are writable by the application.
*/
public static final String[] WRITABLE_EXTENSIONS = new String[]
- { "fa, fasta, mfa, fastq", "aln", "pfam", "msf", "pir", "blc", "amsa",
- "jvp", "sto,stk", "jar", PhylipFile.FILE_EXT };
+ { "fa, fasta, mfa, fastq", "aln", "pfam", "msf", "pir", "blc", "amsa",
+ "sto,stk", PhylipFile.FILE_EXT, "jvp" };
/**
* List of writable formats by the application. Order must correspond with the
* WRITABLE_EXTENSIONS list of formats.
*/
public static final String[] WRITABLE_FNAMES = new String[]
- { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "AMSA", "Jalview",
- "STH", "Jalview", PhylipFile.FILE_DESC };
+ { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "AMSA", "STH",
+ PhylipFile.FILE_DESC, "Jalview" };
/**
* List of readable format file extensions by application in order
package jalview.io;
+import jalview.api.FeaturesDisplayedI;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceI;
import jalview.schemes.ColourSchemeProperty;
import jalview.util.MessageManager;
+import java.awt.Color;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.util.ArrayList;
-import java.util.Hashtable;
import com.json.JSONException;
{
private AlignViewport av;
- private FeatureRenderer fr;
+ private jalview.api.FeatureRenderer fr;
private String globalColorScheme;
- private Hashtable displayedFeatures;
+ private FeaturesDisplayedI displayedFeatures;
private String jalviewVersion;
this.av = ap.av;
this.globalColorScheme = ColourSchemeProperty.getColourName(av
.getGlobalColourScheme());
- this.fr = new FeatureRenderer(ap);
- fr.transferSettings(fr1);
+ this.fr = ap.cloneFeatureRenderer();
displayedFeatures = av.getFeaturesDisplayed();
-
- exportJalviewAlignmentAsBioJsHtmlFile();
- }
+ }
}
private void exportJalviewAlignmentAsBioJsHtmlFile()
for (SequenceFeature sf : seqFeatures)
{
if (displayedFeatures != null
- && displayedFeatures.get(sf.getType()) != null)
+ && displayedFeatures.isVisible(sf.getType()))
{
+
+ // TODO: translate graduated/complex colourschemes to biojs model
String featureColour = jalview.util.Format.getHexString(fr
- .getColour(sf));
+ .findFeatureColour(Color.white, seq,
+ seq.findIndex(sf.getBegin())));
BioJsFeaturePojo bjsFeature = new BioJsFeaturePojo();
bjsFeature.setFillColor(featureColour);
bjsFeature.setXstart(seq.findIndex(sf.getBegin()) - 1);
* hash of feature types and colours
* @return features file contents
*/
- public String printJalviewFormat(SequenceI[] seqs, Hashtable visible)
+ public String printJalviewFormat(SequenceI[] seqs, Map<String,Object> visible)
{
return printJalviewFormat(seqs, visible, true, true);
}
* of group or type)
* @return features file contents
*/
- public String printJalviewFormat(SequenceI[] seqs, Hashtable visible,
+ public String printJalviewFormat(SequenceI[] seqs, Map visible,
boolean visOnly, boolean nonpos)
{
StringBuffer out = new StringBuffer();
// write feature colours only if we're given them and we are generating
// viewed features
// TODO: decide if feature links should also be written here ?
- Enumeration en = visible.keys();
+ Iterator en = visible.keySet().iterator();
String type, color;
- while (en.hasMoreElements())
+ while (en.hasNext())
{
- type = en.nextElement().toString();
+ type = en.next().toString();
if (visible.get(type) instanceof GraduatedColor)
{
* @param visible
* @return
*/
- public String printGFFFormat(SequenceI[] seqs, Hashtable visible)
+ public String printGFFFormat(SequenceI[] seqs, Map<String,Object> visible)
{
return printGFFFormat(seqs, visible, true, true);
}
- public String printGFFFormat(SequenceI[] seqs, Hashtable visible,
+ public String printGFFFormat(SequenceI[] seqs, Map<String,Object> visible,
boolean visOnly, boolean nonpos)
{
StringBuffer out = new StringBuffer();
import jalview.util.MessageManager;
-import java.io.*;
-import java.net.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.util.zip.GZIPInputStream;
/**
throw new Error(MessageManager.getString("error.implementation_error_null_fileparse"));
}
if (from == this)
+ {
return;
+ }
index = ++from.index;
inFile = from.inFile;
suffixSeparator = from.suffixSeparator;
{
warningMessage = "Failed to resolve as a GZ stream ("
+ x.getMessage() + ")";
- x.printStackTrace();
+ // x.printStackTrace();
}
;
}
{
checkURLSource(fileStr);
if (suffixSeparator == '#')
+ {
extractSuffix(fileStr); // URL lref is stored for later reference.
+ }
} catch (IOException e)
{
String suffixLess = extractSuffix(fileStr);
{
String suffixLess = extractSuffix(fileStr);
if (suffixLess != null)
+ {
is = getClass().getResourceAsStream("/" + suffixLess);
+ }
}
if (is != null)
{
public String nextLine() throws IOException
{
if (!error)
+ {
return dataIn.readLine();
+ }
throw new IOException(MessageManager.formatMessage("exception.invalid_source_stream", new String[]{errormessage}));
}
SequenceRenderer sr;
- FeatureRenderer fr;
+ jalview.renderer.seqfeatures.FeatureRenderer fr;
Color color;
import java.util.ArrayList;
import java.util.Hashtable;
+import java.util.List;
import java.util.Vector;
import jalview.datamodel.DBRefEntry;
* TODO refactor to Jalview 'utilities' somehow.
*/
public void appendFeatures(final StringBuffer tooltipText2, int rpos,
- SequenceFeature[] features)
+ List<SequenceFeature> features)
{
appendFeatures(tooltipText2, rpos, features, null);
}
public void appendFeatures(final StringBuffer tooltipText2, int rpos,
- SequenceFeature[] features, Hashtable minmax)
+ List<SequenceFeature> features, Hashtable minmax)
{
String tmpString;
if (features != null)
{
- for (int i = 0; i < features.length; i++)
+ for (SequenceFeature feature:features)
{
- if (features[i].getType().equals("disulfide bond"))
+ if (feature.getType().equals("disulfide bond"))
{
- if (features[i].getBegin() == rpos
- || features[i].getEnd() == rpos)
+ if (feature.getBegin() == rpos
+ || feature.getEnd() == rpos)
{
if (tooltipText2.length() > 6)
{
tooltipText2.append("<br>");
}
- tooltipText2.append("disulfide bond " + features[i].getBegin()
- + ":" + features[i].getEnd());
+ tooltipText2.append("disulfide bond " + feature.getBegin()
+ + ":" + feature.getEnd());
}
}
else
tooltipText2.append("<br>");
}
// TODO: remove this hack to display link only features
- boolean linkOnly = features[i].getValue("linkonly") != null;
+ boolean linkOnly = feature.getValue("linkonly") != null;
if (!linkOnly)
{
- tooltipText2.append(features[i].getType() + " ");
+ tooltipText2.append(feature.getType() + " ");
if (rpos != 0)
{
// we are marking a positional feature
- tooltipText2.append(features[i].begin);
+ tooltipText2.append(feature.begin);
}
- if (features[i].begin != features[i].end)
+ if (feature.begin != feature.end)
{
- tooltipText2.append(" " + features[i].end);
+ tooltipText2.append(" " + feature.end);
}
- if (features[i].getDescription() != null
- && !features[i].description.equals(features[i]
+ if (feature.getDescription() != null
+ && !feature.description.equals(feature
.getType()))
{
- tmpString = features[i].getDescription();
+ tmpString = feature.getDescription();
String tmp2up = tmpString.toUpperCase();
int startTag = tmp2up.indexOf("<HTML>");
if (startTag > -1)
}
}
// check score should be shown
- if (features[i].getScore() != Float.NaN)
+ if (feature.getScore() != Float.NaN)
{
float[][] rng = (minmax == null) ? null : ((float[][]) minmax
- .get(features[i].getType()));
+ .get(feature.getType()));
if (rng != null && rng[0] != null && rng[0][0] != rng[0][1])
{
- tooltipText2.append(" Score=" + features[i].getScore());
+ tooltipText2.append(" Score=" + feature.getScore());
}
}
- if (features[i].getValue("status") != null)
+ if (feature.getValue("status") != null)
{
- String status = features[i].getValue("status").toString();
+ String status = feature.getValue("status").toString();
if (status.length() > 0)
{
- tooltipText2.append("; (" + features[i].getValue("status")
+ tooltipText2.append("; (" + feature.getValue("status")
+ ")");
}
}
}
}
- if (features[i].links != null)
+ if (feature.links != null)
{
if (linkImageURL != null)
{
}
else
{
- for (String urlstring : (Vector<String>) features[i].links)
+ for (String urlstring : (Vector<String>) feature.links)
{
try
{
// ADD NON POSITIONAL SEQUENCE INFO
SequenceFeature[] features = ds.getSequenceFeatures();
- SequenceFeature[] tfeat = new SequenceFeature[1];
if (showNpFeats && features != null)
{
for (int i = 0; i < features.length; i++)
if (features[i].begin == 0 && features[i].end == 0)
{
int sz = -tip.length();
- tfeat[0] = features[i];
+ List<SequenceFeature> tfeat = new ArrayList<SequenceFeature>();
+ tfeat.add(features[i]);
appendFeatures(tip, 0, tfeat, minmax);
sz += tip.length();
maxWidth = Math.max(maxWidth, sz);
{
br = new BufferedReader(src.getReader());
}
+ // TODO: add columnSelection to context
if (new jalview.io.AnnotationFile().parseAnnotationFrom(
- context.getLastAlignment(), br))
+ context.getLastAlignment(), null, br))
{
context.updateSetModified(true);
}
SequenceRenderer sr = ((jalview.appletgui.AlignmentPanel) source)
.getSequenceRenderer();
FeatureRenderer fr = ((jalview.appletgui.AlignmentPanel) source).av
- .getShowSequenceFeatures() ? new jalview.appletgui.FeatureRenderer(
+ .isShowSequenceFeatures() ? new jalview.appletgui.FeatureRenderer(
((jalview.appletgui.AlignmentPanel) source).av) : null;
if (fr != null)
{
JMenuItem annotationColour = new JMenuItem();
+ JMenuItem annotationColumn = new JMenuItem();
+
protected JMenuItem rnahelicesColour = new JMenuItem();
JMenuItem associatedData = new JMenuItem();
}
});
+ annotationColumn.setText(MessageManager
+ .getString("action.select_by_annotation"));
+ annotationColumn.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ annotationColumn_actionPerformed(e);
+ }
+ });
+
rnahelicesColour.setText(MessageManager
.getString("action.by_rna_helixes"));
rnahelicesColour.addActionListener(new ActionListener()
selectMenu.add(unGroup);
selectMenu.add(grpsFromSelection);
selectMenu.add(deleteGroups);
+ selectMenu.add(annotationColumn);
calculateMenu.add(expandAlignment);
// TODO - determine if the listenToViewSelections button is needed : see bug
// JAL-574
}
+ public void annotationColumn_actionPerformed(ActionEvent e)
+ {
+
+ }
+
public void rnahelicesColour_actionPerformed(ActionEvent e)
{
--- /dev/null
+package jalview.renderer.seqfeatures;
+
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+
+public class FeatureRenderer extends
+ jalview.viewmodel.seqfeatures.FeatureRendererModel
+{
+
+ FontMetrics fm;
+
+ int charOffset;
+
+ boolean offscreenRender = false;
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param g
+ * DOCUMENT ME!
+ * @param seq
+ * DOCUMENT ME!
+ * @param sg
+ * DOCUMENT ME!
+ * @param start
+ * DOCUMENT ME!
+ * @param end
+ * DOCUMENT ME!
+ * @param x1
+ * DOCUMENT ME!
+ * @param y1
+ * DOCUMENT ME!
+ * @param width
+ * DOCUMENT ME!
+ * @param height
+ * DOCUMENT ME!
+ */
+ protected SequenceI lastSeq;
+
+ char s;
+
+ int i;
+
+ int av_charHeight, av_charWidth;
+
+ boolean av_validCharWidth, av_isShowSeqFeatureHeight;
+
+ protected void updateAvConfig()
+ {
+ av_charHeight = av.getCharHeight();
+ av_charWidth = av.getCharWidth();
+ av_validCharWidth = av.isValidCharWidth();
+ av_isShowSeqFeatureHeight = av.isShowSequenceFeaturesHeight();
+ }
+
+ void renderFeature(Graphics g, SequenceI seq, int fstart, int fend,
+ Color featureColour, int start, int end, int y1)
+ {
+ updateAvConfig();
+ if (((fstart <= end) && (fend >= start)))
+ {
+ if (fstart < start)
+ { // fix for if the feature we have starts before the sequence start,
+ fstart = start; // but the feature end is still valid!!
+ }
+
+ if (fend >= end)
+ {
+ fend = end;
+ }
+ int pady = (y1 + av_charHeight) - av_charHeight / 5;
+ for (i = fstart; i <= fend; i++)
+ {
+ s = seq.getCharAt(i);
+
+ if (jalview.util.Comparison.isGap(s))
+ {
+ continue;
+ }
+
+ g.setColor(featureColour);
+
+ g.fillRect((i - start) * av_charWidth, y1, av_charWidth,
+ av_charHeight);
+
+ if (offscreenRender || !av_validCharWidth)
+ {
+ continue;
+ }
+
+ g.setColor(Color.white);
+ charOffset = (av_charWidth - fm.charWidth(s)) / 2;
+ g.drawString(String.valueOf(s), charOffset
+ + (av_charWidth * (i - start)), pady);
+
+ }
+ }
+ }
+
+ void renderScoreFeature(Graphics g, SequenceI seq, int fstart, int fend,
+ Color featureColour, int start, int end, int y1, byte[] bs)
+ {
+ updateAvConfig();
+ if (((fstart <= end) && (fend >= start)))
+ {
+ if (fstart < start)
+ { // fix for if the feature we have starts before the sequence start,
+ fstart = start; // but the feature end is still valid!!
+ }
+
+ if (fend >= end)
+ {
+ fend = end;
+ }
+ int pady = (y1 + av_charHeight) - av_charHeight / 5;
+ int ystrt = 0, yend = av_charHeight;
+ if (bs[0] != 0)
+ {
+ // signed - zero is always middle of residue line.
+ if (bs[1] < 128)
+ {
+ yend = av_charHeight * (128 - bs[1]) / 512;
+ ystrt = av_charHeight - yend / 2;
+ }
+ else
+ {
+ ystrt = av_charHeight / 2;
+ yend = av_charHeight * (bs[1] - 128) / 512;
+ }
+ }
+ else
+ {
+ yend = av_charHeight * bs[1] / 255;
+ ystrt = av_charHeight - yend;
+
+ }
+ for (i = fstart; i <= fend; i++)
+ {
+ s = seq.getCharAt(i);
+
+ if (jalview.util.Comparison.isGap(s))
+ {
+ continue;
+ }
+
+ g.setColor(featureColour);
+ int x = (i - start) * av_charWidth;
+ g.drawRect(x, y1, av_charWidth, av_charHeight);
+ g.fillRect(x, y1 + ystrt, av_charWidth, yend);
+
+ if (offscreenRender || !av_validCharWidth)
+ {
+ continue;
+ }
+
+ g.setColor(Color.black);
+ charOffset = (av_charWidth - fm.charWidth(s)) / 2;
+ g.drawString(String.valueOf(s), charOffset
+ + (av_charWidth * (i - start)), pady);
+
+ }
+ }
+ }
+
+ BufferedImage offscreenImage;
+
+ public Color findFeatureColour(Color initialCol, SequenceI seq, int res)
+ {
+ return new Color(findFeatureColour(initialCol.getRGB(), seq, res));
+ }
+
+ /**
+ * This is used by the Molecule Viewer and Overview to get the accurate
+ * colourof the rendered sequence
+ */
+ public synchronized int findFeatureColour(int initialCol, final SequenceI seq,
+ int column)
+ {
+ if (!av.isShowSequenceFeatures())
+ {
+ return initialCol;
+ }
+
+ final SequenceI aseq = (seq.getDatasetSequence() != null) ? seq
+ .getDatasetSequence() : seq;
+ if (seq != lastSeq)
+ {
+ lastSeq = seq;
+ sequenceFeatures = aseq.getSequenceFeatures();
+ if (sequenceFeatures != null)
+ {
+ sfSize = sequenceFeatures.length;
+ }
+ }
+ else
+ {
+ if (sequenceFeatures != aseq.getSequenceFeatures())
+ {
+ sequenceFeatures = aseq.getSequenceFeatures();
+ if (sequenceFeatures != null)
+ {
+ sfSize = sequenceFeatures.length;
+ }
+ }
+ }
+
+ if (sequenceFeatures == null || sfSize == 0)
+ {
+ return initialCol;
+ }
+
+ if (jalview.util.Comparison.isGap(lastSeq.getCharAt(column)))
+ {
+ return Color.white.getRGB();
+ }
+
+ // Only bother making an offscreen image if transparency is applied
+ if (transparency != 1.0f && offscreenImage == null)
+ {
+ offscreenImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
+ }
+
+ currentColour = null;
+ // TODO: non-threadsafe - each rendering thread needs its own instance of
+ // the feature renderer - or this should be synchronized.
+ offscreenRender = true;
+
+ if (offscreenImage != null)
+ {
+ offscreenImage.setRGB(0, 0, initialCol);
+ drawSequence(offscreenImage.getGraphics(), lastSeq, column, column, 0);
+
+ return offscreenImage.getRGB(0, 0);
+ }
+ else
+ {
+ drawSequence(null, lastSeq, lastSeq.findPosition(column), -1, -1);
+
+ if (currentColour == null)
+ {
+ return initialCol;
+ }
+ else
+ {
+ return ((Integer) currentColour).intValue();
+ }
+ }
+
+ }
+
+ private volatile SequenceFeature[] sequenceFeatures;
+
+ int sfSize;
+
+ int sfindex;
+
+ int spos;
+
+ int epos;
+
+ public synchronized void drawSequence(Graphics g, final SequenceI seq,
+ int start, int end, int y1)
+ {
+ final SequenceI aseq = (seq.getDatasetSequence() != null) ? seq
+ .getDatasetSequence() : seq;
+ if (aseq.getSequenceFeatures() == null
+ || aseq.getSequenceFeatures().length == 0)
+ {
+ return;
+ }
+
+ if (g != null)
+ {
+ fm = g.getFontMetrics();
+ }
+
+ updateFeatures();
+
+ if (lastSeq == null || seq != lastSeq
+ || aseq.getSequenceFeatures() != sequenceFeatures)
+ {
+ lastSeq = seq;
+ sequenceFeatures = aseq.getSequenceFeatures();
+ }
+
+ if (transparency != 1 && g != null)
+ {
+ Graphics2D g2 = (Graphics2D) g;
+ g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
+ transparency));
+ }
+
+ if (!offscreenRender)
+ {
+ spos = lastSeq.findPosition(start);
+ epos = lastSeq.findPosition(end);
+ }
+
+ sfSize = sequenceFeatures.length;
+ String type;
+ for (int renderIndex = 0; renderIndex < renderOrder.length; renderIndex++)
+ {
+ type = renderOrder[renderIndex];
+
+ if (type == null || !showFeatureOfType(type))
+ {
+ continue;
+ }
+
+ // loop through all features in sequence to find
+ // current feature to render
+ for (sfindex = 0; sfindex < sfSize; sfindex++)
+ {
+ if (!sequenceFeatures[sfindex].type.equals(type))
+ {
+ continue;
+ }
+
+ if (featureGroups != null
+ && sequenceFeatures[sfindex].featureGroup != null
+ && sequenceFeatures[sfindex].featureGroup.length() != 0
+ && featureGroups
+ .containsKey(sequenceFeatures[sfindex].featureGroup)
+ && !featureGroups
+ .get(sequenceFeatures[sfindex].featureGroup)
+ .booleanValue())
+ {
+ continue;
+ }
+
+ if (!offscreenRender
+ && (sequenceFeatures[sfindex].getBegin() > epos || sequenceFeatures[sfindex]
+ .getEnd() < spos))
+ {
+ continue;
+ }
+
+ if (offscreenRender && offscreenImage == null)
+ {
+ if (sequenceFeatures[sfindex].begin <= start
+ && sequenceFeatures[sfindex].end >= start)
+ {
+ // this is passed out to the overview and other sequence renderers
+ // (e.g. molecule viewer) to get displayed colour for rendered
+ // sequence
+ currentColour = new Integer(
+ getColour(sequenceFeatures[sfindex]).getRGB());
+ // used to be retreived from av.featuresDisplayed
+ // currentColour = av.featuresDisplayed
+ // .get(sequenceFeatures[sfindex].type);
+
+ }
+ }
+ else if (sequenceFeatures[sfindex].type.equals("disulfide bond"))
+ {
+
+ renderFeature(g, seq,
+ seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
+ seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
+ getColour(sequenceFeatures[sfindex])
+ // new Color(((Integer) av.featuresDisplayed
+ // .get(sequenceFeatures[sfindex].type)).intValue())
+ , start, end, y1);
+ renderFeature(g, seq,
+ seq.findIndex(sequenceFeatures[sfindex].end) - 1,
+ seq.findIndex(sequenceFeatures[sfindex].end) - 1,
+ getColour(sequenceFeatures[sfindex])
+ // new Color(((Integer) av.featuresDisplayed
+ // .get(sequenceFeatures[sfindex].type)).intValue())
+ , start, end, y1);
+
+ }
+ else if (showFeature(sequenceFeatures[sfindex]))
+ {
+ if (av_isShowSeqFeatureHeight
+ && sequenceFeatures[sfindex].score != Float.NaN)
+ {
+ renderScoreFeature(g, seq,
+ seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
+ seq.findIndex(sequenceFeatures[sfindex].end) - 1,
+ getColour(sequenceFeatures[sfindex]), start, end, y1,
+ normaliseScore(sequenceFeatures[sfindex]));
+ }
+ else
+ {
+ renderFeature(g, seq,
+ seq.findIndex(sequenceFeatures[sfindex].begin) - 1,
+ seq.findIndex(sequenceFeatures[sfindex].end) - 1,
+ getColour(sequenceFeatures[sfindex]), start, end, y1);
+ }
+ }
+
+ }
+
+ }
+
+ if (transparency != 1.0f && g != null && transparencyAvailable)
+ {
+ Graphics2D g2 = (Graphics2D) g;
+ g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
+ 1.0f));
+ }
+ }
+
+ boolean transparencyAvailable = true;
+
+ protected void setTransparencyAvailable(boolean isTransparencyAvailable)
+ {
+ transparencyAvailable = isTransparencyAvailable;
+ }
+
+ @Override
+ public boolean isTransparencyAvailable()
+ {
+ return transparencyAvailable;
+ }
+
+ /**
+ * Called when alignment in associated view has new/modified features to
+ * discover and display.
+ *
+ */
+ public void featuresAdded()
+ {
+ lastSeq = null;
+ findAllFeatures();
+ }
+}
public Color findColour(char c, int j, SequenceI seq)
{
Color currentColour = Color.white;
- AlignmentAnnotation annotation = (seqAssociated ? seqannot.get(seq)
+ AlignmentAnnotation annotation = (seqAssociated && seqannot!=null ? seqannot.get(seq)
: this.annotation);
if (annotation == null)
{
*/
package jalview.schemes;
+import jalview.analysis.scoremodels.FeatureScoreModel;
import jalview.analysis.scoremodels.PIDScoreModel;
import jalview.api.analysis.ScoreModelI;
// scoreMatrices.put("Conservation EnhPos", new
// ScoreMatrix("Conservation EnhPos",propMatrixEpos,0));
scoreMatrices.put("PID", new PIDScoreModel());
+ scoreMatrices.put("Displayed Features", new FeatureScoreModel());
}
private ResidueProperties()
import jalview.api.AlignCalcManagerI;
import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
+import jalview.api.FeaturesDisplayedI;
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.AlignmentView;
public void setHiddenColumns(ColumnSelection colsel)
{
this.colSel = colsel;
- if (colSel.getHiddenColumns() != null)
- {
- hasHiddenColumns = true;
- }
}
@Override
return colSel;
}
+ @Override
public void setColumnSelection(ColumnSelection colSel)
{
this.colSel = colSel;
+ if (colSel != null)
+ {
+ updateHiddenColumns();
+ }
}
/**
this.hiddenRepSequences = hiddenRepSequences;
}
- protected boolean hasHiddenColumns = false;
+ @Override
+ public boolean hasHiddenColumns()
+ {
+ return colSel != null && colSel.hasHiddenColumns();
+ }
public void updateHiddenColumns()
{
- hasHiddenColumns = colSel.getHiddenColumns() != null;
+ // this method doesn't really do anything now. But - it could, since a
+ // column Selection could be in the process of modification
+ // hasHiddenColumns = colSel.hasHiddenColumns();
}
protected boolean hasHiddenRows = false;
+ @Override
public boolean hasHiddenRows()
{
return hasHiddenRows;
sequenceSetID = new String(newid);
}
+ @Override
public String getSequenceSetId()
{
if (sequenceSetID == null)
colSel.hideSelectedColumns();
setSelectionGroup(null);
- hasHiddenColumns = true;
}
public void hideColumns(int start, int end)
{
colSel.hideColumns(start, end);
}
-
- hasHiddenColumns = true;
}
public void showColumn(int col)
{
colSel.revealHiddenColumns(col);
- if (colSel.getHiddenColumns() == null)
- {
- hasHiddenColumns = false;
- }
+
}
public void showAllHiddenColumns()
{
colSel.revealAllHiddenColumns();
- hasHiddenColumns = false;
}
// common hide/show seq stuff
public boolean isHiddenRepSequence(SequenceI seq)
{
- return hiddenRepSequences != null
- && hiddenRepSequences.containsKey(seq);
+ return alignment.getSeqrep()==seq || (hiddenRepSequences != null
+ && hiddenRepSequences.containsKey(seq));
}
public SequenceGroup getRepresentedSequences(SequenceI seq)
: hiddenRepSequences.get(seq));
}
+ @Override
public int adjustForHiddenSeqs(int alignmentIndex)
{
return alignment.getHiddenSequences().adjustForHiddenSeqs(
alignmentIndex);
}
- // Selection manipulation
- /**
- * broadcast selection to any interested parties
- */
+ @Override
public abstract void sendSelection();
+ @Override
public void invertColumnSelection()
{
colSel.invertColumnSelection(0, alignment.getWidth());
}
- /**
- * This method returns an array of new SequenceI objects derived from the
- * whole alignment or just the current selection with start and end points
- * adjusted
- *
- * @note if you need references to the actual SequenceI objects in the
- * alignment or currently selected then use getSequenceSelection()
- * @return selection as new sequenceI objects
- */
+
+ @Override
public SequenceI[] getSelectionAsNewSequence()
{
SequenceI[] sequences;
return sequences;
}
- /**
- * get the currently selected sequence objects or all the sequences in the
- * alignment.
- *
- * @return array of references to sequence objects
- */
+
@Override
public SequenceI[] getSequenceSelection()
{
return sequences;
}
- /**
- * This method returns the visible alignment as text, as seen on the GUI, ie
- * if columns are hidden they will not be returned in the result. Use this for
- * calculating trees, PCA, redundancy etc on views which contain hidden
- * columns.
- *
- * @return String[]
- */
+
@Override
public jalview.datamodel.CigarArray getViewAsCigars(
boolean selectedRegionOnly)
{
- return new jalview.datamodel.CigarArray(alignment,
- (hasHiddenColumns ? colSel : null),
+ return new jalview.datamodel.CigarArray(alignment, colSel,
(selectedRegionOnly ? selectionGroup : null));
}
- /**
- * return a compact representation of the current alignment selection to pass
- * to an analysis function
- *
- * @param selectedOnly
- * boolean true to just return the selected view
- * @return AlignmentView
- */
+
@Override
public jalview.datamodel.AlignmentView getAlignmentView(
boolean selectedOnly)
return getAlignmentView(selectedOnly, false);
}
- /**
- * return a compact representation of the current alignment selection to pass
- * to an analysis function
- *
- * @param selectedOnly
- * boolean true to just return the selected view
- * @param markGroups
- * boolean true to annotate the alignment view with groups on the
- * alignment (and intersecting with selected region if selectedOnly
- * is true)
- * @return AlignmentView
- */
+
@Override
public jalview.datamodel.AlignmentView getAlignmentView(
boolean selectedOnly, boolean markGroups)
{
return new AlignmentView(alignment, colSel, selectionGroup,
- hasHiddenColumns, selectedOnly, markGroups);
+ colSel != null && colSel.hasHiddenColumns(), selectedOnly,
+ markGroups);
}
- /**
- * This method returns the visible alignment as text, as seen on the GUI, ie
- * if columns are hidden they will not be returned in the result. Use this for
- * calculating trees, PCA, redundancy etc on views which contain hidden
- * columns.
- *
- * @return String[]
- */
+
@Override
public String[] getViewAsString(boolean selectedRegionOnly)
{
}
selection = new String[iSize];
- if (hasHiddenColumns)
+ if (colSel != null && colSel.hasHiddenColumns())
{
selection = colSel.getVisibleSequenceStrings(start, end, seqs);
}
return selection;
}
- /**
- * return visible region boundaries within given column range
- *
- * @param min
- * first column (inclusive, from 0)
- * @param max
- * last column (exclusive)
- * @return int[][] range of {start,end} visible positions
- */
+
+ @Override
public int[][] getVisibleRegionBoundaries(int min, int max)
{
Vector regions = new Vector();
do
{
- if (hasHiddenColumns)
+ if (colSel != null && colSel.hasHiddenColumns())
{
if (start == 0)
{
regions.addElement(new int[]
{ start, end });
- if (hasHiddenColumns)
+ if (colSel != null && colSel.hasHiddenColumns())
{
start = colSel.adjustForHiddenColumns(end);
start = colSel.getHiddenBoundaryLeft(start) + 1;
return ala;
}
- /**
- * @return the padGaps
- */
+
+ @Override
public boolean isPadGaps()
{
return padGaps;
}
- /**
- * @param padGaps
- * the padGaps to set
- */
+
+ @Override
public void setPadGaps(boolean padGaps)
{
this.padGaps = padGaps;
*
* @param ap
*/
+ @Override
public void alignmentChanged(AlignmentViewPanel ap)
{
if (isPadGaps())
*
* @see jalview.api.AlignViewportI#calcPanelHeight()
*/
+ @Override
public int calcPanelHeight()
{
// setHeight of panels
}
oldrfs.clear();
}
+ /**
+ * show the reference sequence in the alignment view
+ */
+ private boolean displayReferenceSeq=false;
+ /**
+ * colour according to the reference sequence defined on the alignment
+ */
+ private boolean colourByReferenceSeq=false;
+
+ @Override
+ public boolean isDisplayReferenceSeq()
+ {
+ return alignment.hasSeqrep() && displayReferenceSeq;
+ }
+
+ @Override
+ public void setDisplayReferenceSeq(boolean displayReferenceSeq)
+ {
+ this.displayReferenceSeq = displayReferenceSeq;
+ }
+
+ public boolean isColourByReferenceSeq()
+ {
+ return alignment.hasSeqrep() && colourByReferenceSeq;
+ }
+
+ public void setColourByReferenceSeq(boolean colourByReferenceSeq)
+ {
+ this.colourByReferenceSeq = colourByReferenceSeq;
+ }
@Override
public Color getSequenceColour(SequenceI seq)
{
sequenceColours = null;
};
+
+ FeaturesDisplayedI featuresDisplayed = null;
+
+ @Override
+ public FeaturesDisplayedI getFeaturesDisplayed()
+ {
+ return featuresDisplayed;
+ }
+
+ @Override
+ public void setFeaturesDisplayed(FeaturesDisplayedI featuresDisplayedI)
+ {
+ featuresDisplayed = featuresDisplayedI;
+ }
+
+ @Override
+ public boolean areFeaturesDisplayed()
+ {
+ return featuresDisplayed != null && featuresDisplayed.getRegisterdFeaturesCount()>0;
+ }
+
+ /**
+ * display setting for showing/hiding sequence features on alignment view
+ */
+ boolean showSequenceFeatures = false;
+
+ /**
+ * set the flag
+ *
+ * @param b
+ * features are displayed if true
+ */
+ @Override
+ public void setShowSequenceFeatures(boolean b)
+ {
+ showSequenceFeatures = b;
+ }
+ @Override
+ public boolean isShowSequenceFeatures()
+ {
+ return showSequenceFeatures;
+ }
+
+ boolean showSeqFeaturesHeight;
+
+ @Override
+ public void setShowSequenceFeaturesHeight(boolean selected)
+ {
+ showSeqFeaturesHeight = selected;
+ }
+
+ @Override
+ public boolean isShowSequenceFeaturesHeight()
+ {
+ return showSeqFeaturesHeight;
+ }
+
+ private boolean showAnnotation = true;
+
+ private boolean rightAlignIds = false;
+
+
+ @Override
+ public void setShowAnnotation(boolean b)
+ {
+ showAnnotation = b;
+ }
+
+ @Override
+ public boolean isShowAnnotation()
+ {
+ return showAnnotation;
+ }
+
+ @Override
+ public boolean isRightAlignIds()
+ {
+ return rightAlignIds;
+ }
+
+ @Override
+ public void setRightAlignIds(boolean rightAlignIds)
+ {
+ this.rightAlignIds = rightAlignIds;
+ }
+
}
--- /dev/null
+package jalview.viewmodel.annotationfilter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AnnotationFilterParameter
+{
+ public enum ThresholdType
+ {
+ NO_THRESHOLD, BELOW_THRESHOLD, ABOVE_THRESHOLD;
+ }
+
+ public enum SearchableAnnotationField
+ {
+ DISPLAY_STRING, DESCRIPTION;
+ }
+ private ThresholdType thresholdType;
+
+ private float thresholdValue;
+
+ private boolean filterAlphaHelix = false;
+
+ private boolean filterBetaSheet = false;
+
+ private boolean filterTurn = false;
+
+ private String regexString;
+
+ private List<SearchableAnnotationField> regexSearchFields = new ArrayList<SearchableAnnotationField>();
+
+ public ThresholdType getThresholdType()
+ {
+ return thresholdType;
+ }
+
+ public void setThresholdType(ThresholdType thresholdType)
+ {
+ this.thresholdType = thresholdType;
+ }
+
+ public float getThresholdValue()
+ {
+ return thresholdValue;
+ }
+
+ public void setThresholdValue(float thresholdValue)
+ {
+ this.thresholdValue = thresholdValue;
+ }
+
+ public String getRegexString()
+ {
+ return regexString;
+ }
+
+ public void setRegexString(String regexString)
+ {
+ this.regexString = regexString;
+ }
+
+ public List<SearchableAnnotationField> getRegexSearchFields()
+ {
+ return regexSearchFields;
+ }
+
+ public void addRegexSearchField(SearchableAnnotationField regexSearchField)
+ {
+ this.regexSearchFields.add(regexSearchField);
+ }
+
+ public boolean isFilterAlphaHelix()
+ {
+ return filterAlphaHelix;
+ }
+
+ public void setFilterAlphaHelix(boolean alphaHelix)
+ {
+ this.filterAlphaHelix = alphaHelix;
+ }
+
+ public boolean isFilterBetaSheet()
+ {
+ return filterBetaSheet;
+ }
+
+ public void setFilterBetaSheet(boolean betaSheet)
+ {
+ this.filterBetaSheet = betaSheet;
+ }
+
+ public boolean isFilterTurn()
+ {
+ return filterTurn;
+ }
+
+ public void setFilterTurn(boolean turn)
+ {
+ this.filterTurn = turn;
+ }
+
+}
--- /dev/null
+package jalview.viewmodel.seqfeatures;
+
+import jalview.api.AlignViewportI;
+import jalview.api.FeaturesDisplayedI;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.renderer.seqfeatures.FeatureRenderer;
+import jalview.schemes.GraduatedColor;
+import jalview.viewmodel.AlignmentViewport;
+
+import java.awt.Color;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+public abstract class FeatureRendererModel implements
+ jalview.api.FeatureRenderer
+{
+
+ /**
+ * global transparency for feature
+ */
+ protected float transparency = 1.0f;
+
+ protected Map<String, Object> featureColours = new ConcurrentHashMap<String, Object>();
+
+ protected Map<String, Boolean> featureGroups = new ConcurrentHashMap<String, Boolean>();
+
+ protected Object currentColour;
+
+ protected String[] renderOrder;
+
+ protected PropertyChangeSupport changeSupport = new PropertyChangeSupport(
+ this);
+
+ protected AlignmentViewport av;
+
+ public AlignViewportI getViewport()
+ {
+ return av;
+ }
+
+ public FeatureRendererSettings getSettings()
+ {
+ return new FeatureRendererSettings(this);
+ }
+
+ public void transferSettings(FeatureRendererSettings fr)
+ {
+ this.renderOrder = fr.renderOrder;
+ this.featureGroups = fr.featureGroups;
+ this.featureColours = fr.featureColours;
+ this.transparency = fr.transparency;
+ this.featureOrder = fr.featureOrder;
+ }
+
+ /**
+ * update from another feature renderer
+ *
+ * @param fr
+ * settings to copy
+ */
+ public void transferSettings(jalview.api.FeatureRenderer _fr)
+ {
+ FeatureRenderer fr = (FeatureRenderer) _fr;
+ FeatureRendererSettings frs = new FeatureRendererSettings(fr);
+ this.renderOrder = frs.renderOrder;
+ this.featureGroups = frs.featureGroups;
+ this.featureColours = frs.featureColours;
+ this.transparency = frs.transparency;
+ this.featureOrder = frs.featureOrder;
+ if (av != null && av != fr.getViewport())
+ {
+ // copy over the displayed feature settings
+ if (_fr.getFeaturesDisplayed() != null)
+ {
+ FeaturesDisplayedI fd = getFeaturesDisplayed();
+ if (fd == null)
+ {
+ setFeaturesDisplayedFrom(_fr.getFeaturesDisplayed());
+ }
+ else
+ {
+ synchronized (fd)
+ {
+ fd.clear();
+ java.util.Iterator<String> fdisp = _fr.getFeaturesDisplayed()
+ .getVisibleFeatures();
+ while (fdisp.hasNext())
+ {
+ fd.setVisible(fdisp.next());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public void setFeaturesDisplayedFrom(FeaturesDisplayedI featuresDisplayed)
+ {
+ av.setFeaturesDisplayed(new FeaturesDisplayed(featuresDisplayed));
+ }
+
+ @Override
+ public void setVisible(String featureType)
+ {
+ FeaturesDisplayedI fdi = av.getFeaturesDisplayed();
+ if (fdi == null)
+ {
+ av.setFeaturesDisplayed(fdi = new FeaturesDisplayed());
+ }
+ if (!fdi.isRegistered(featureType))
+ {
+ pushFeatureType(Arrays.asList(new String[]
+ { featureType }));
+ }
+ fdi.setVisible(featureType);
+ }
+
+ @Override
+ public void setAllVisible(List<String> featureTypes)
+ {
+ FeaturesDisplayedI fdi = av.getFeaturesDisplayed();
+ if (fdi == null)
+ {
+ av.setFeaturesDisplayed(fdi = new FeaturesDisplayed());
+ }
+ List<String> nft = new ArrayList<String>();
+ for (String featureType : featureTypes)
+ {
+ if (!fdi.isRegistered(featureType))
+ {
+ nft.add(featureType);
+ }
+ }
+ if (nft.size() > 0)
+ {
+ pushFeatureType(nft);
+ }
+ fdi.setAllVisible(featureTypes);
+ }
+
+ /**
+ * push a set of new types onto the render order stack. Note - this is a
+ * direct mechanism rather than the one employed in updateRenderOrder
+ *
+ * @param types
+ */
+ private void pushFeatureType(List<String> types)
+ {
+
+ int ts = types.size();
+ String neworder[] = new String[(renderOrder == null ? 0
+ : renderOrder.length) + ts];
+ types.toArray(neworder);
+ if (renderOrder != null)
+ {
+ System.arraycopy(neworder,0,neworder,renderOrder.length,ts);
+ System.arraycopy(renderOrder, 0, neworder, 0, renderOrder.length);
+ }
+ renderOrder = neworder;
+ }
+
+ protected Hashtable minmax = new Hashtable();
+
+ public Hashtable getMinMax()
+ {
+ return minmax;
+ }
+
+ /**
+ * normalise a score against the max/min bounds for the feature type.
+ *
+ * @param sequenceFeature
+ * @return byte[] { signed, normalised signed (-127 to 127) or unsigned
+ * (0-255) value.
+ */
+ protected final byte[] normaliseScore(SequenceFeature sequenceFeature)
+ {
+ float[] mm = ((float[][]) minmax.get(sequenceFeature.type))[0];
+ final byte[] r = new byte[]
+ { 0, (byte) 255 };
+ if (mm != null)
+ {
+ if (r[0] != 0 || mm[0] < 0.0)
+ {
+ r[0] = 1;
+ r[1] = (byte) ((int) 128.0 + 127.0 * (sequenceFeature.score / mm[1]));
+ }
+ else
+ {
+ r[1] = (byte) ((int) 255.0 * (sequenceFeature.score / mm[1]));
+ }
+ }
+ return r;
+ }
+
+ boolean newFeatureAdded = false;
+
+ boolean findingFeatures = false;
+
+ protected boolean updateFeatures()
+ {
+ if (av.getFeaturesDisplayed() == null || renderOrder == null
+ || newFeatureAdded)
+ {
+ findAllFeatures();
+ if (av.getFeaturesDisplayed().getVisibleFeatureCount() < 1)
+ {
+ return false;
+ }
+ }
+ // TODO: decide if we should check for the visible feature count first
+ return true;
+ }
+
+ /**
+ * search the alignment for all new features, give them a colour and display
+ * them. Then fires a PropertyChangeEvent on the changeSupport object.
+ *
+ */
+ protected void findAllFeatures()
+ {
+ synchronized (firing)
+ {
+ if (firing.equals(Boolean.FALSE))
+ {
+ firing = Boolean.TRUE;
+ findAllFeatures(true); // add all new features as visible
+ changeSupport.firePropertyChange("changeSupport", null, null);
+ firing = Boolean.FALSE;
+ }
+ }
+ }
+
+ @Override
+ public List<SequenceFeature> findFeaturesAtRes(SequenceI sequence, int res)
+ {
+ ArrayList<SequenceFeature> tmp = new ArrayList<SequenceFeature>();
+ SequenceFeature[] features = sequence.getSequenceFeatures();
+
+ while (features == null && sequence.getDatasetSequence() != null)
+ {
+ sequence = sequence.getDatasetSequence();
+ features = sequence.getSequenceFeatures();
+ }
+
+ if (features != null)
+ {
+ for (int i = 0; i < features.length; i++)
+ {
+ if (!av.areFeaturesDisplayed()
+ || !av.getFeaturesDisplayed().isVisible(
+ features[i].getType()))
+ {
+ continue;
+ }
+
+ if (features[i].featureGroup != null
+ && featureGroups != null
+ && featureGroups.containsKey(features[i].featureGroup)
+ && !featureGroups.get(features[i].featureGroup)
+ .booleanValue())
+ {
+ continue;
+ }
+
+ if ((features[i].getBegin() <= res)
+ && (features[i].getEnd() >= res))
+ {
+ tmp.add(features[i]);
+ }
+ }
+ }
+ return tmp;
+ }
+
+ /**
+ * Searches alignment for all features and updates colours
+ *
+ * @param newMadeVisible
+ * if true newly added feature types will be rendered immediatly
+ * TODO: check to see if this method should actually be proxied so
+ * repaint events can be propagated by the renderer code
+ */
+ @Override
+ public synchronized void findAllFeatures(boolean newMadeVisible)
+ {
+ newFeatureAdded = false;
+
+ if (findingFeatures)
+ {
+ newFeatureAdded = true;
+ return;
+ }
+
+ findingFeatures = true;
+ if (av.getFeaturesDisplayed() == null)
+ {
+ av.setFeaturesDisplayed(new FeaturesDisplayed());
+ }
+ FeaturesDisplayedI featuresDisplayed = av.getFeaturesDisplayed();
+
+ ArrayList<String> allfeatures = new ArrayList<String>();
+ ArrayList<String> oldfeatures = new ArrayList<String>();
+ if (renderOrder != null)
+ {
+ for (int i = 0; i < renderOrder.length; i++)
+ {
+ if (renderOrder[i] != null)
+ {
+ oldfeatures.add(renderOrder[i]);
+ }
+ }
+ }
+ if (minmax == null)
+ {
+ minmax = new Hashtable();
+ }
+ AlignmentI alignment = av.getAlignment();
+ for (int i = 0; i < alignment.getHeight(); i++)
+ {
+ SequenceI asq = alignment.getSequenceAt(i);
+ SequenceI dasq = asq.getDatasetSequence();
+ SequenceFeature[] features = dasq != null ? dasq
+ .getSequenceFeatures() : asq.getSequenceFeatures();
+
+ if (features == null)
+ {
+ continue;
+ }
+
+ int index = 0;
+ while (index < features.length)
+ {
+ if (!featuresDisplayed.isRegistered(features[index].getType()))
+ {
+ String fgrp = features[index].getFeatureGroup();
+ if (fgrp != null)
+ {
+ Boolean groupDisplayed = featureGroups.get(fgrp);
+ if (groupDisplayed == null)
+ {
+ groupDisplayed = Boolean.valueOf(newMadeVisible);
+ featureGroups.put(fgrp, groupDisplayed);
+ }
+ if (!groupDisplayed.booleanValue())
+ {
+ index++;
+ continue;
+ }
+ }
+ if (!(features[index].begin == 0 && features[index].end == 0))
+ {
+ // If beginning and end are 0, the feature is for the whole sequence
+ // and we don't want to render the feature in the normal way
+
+ if (newMadeVisible
+ && !oldfeatures.contains(features[index].getType()))
+ {
+ // this is a new feature type on the alignment. Mark it for
+ // display.
+ featuresDisplayed.setVisible(features[index].getType());
+ setOrder(features[index].getType(), 0);
+ }
+ }
+ }
+ if (!allfeatures.contains(features[index].getType()))
+ {
+ allfeatures.add(features[index].getType());
+ }
+ if (features[index].score != Float.NaN)
+ {
+ int nonpos = features[index].getBegin() >= 1 ? 0 : 1;
+ float[][] mm = (float[][]) minmax.get(features[index].getType());
+ if (mm == null)
+ {
+ mm = new float[][]
+ { null, null };
+ minmax.put(features[index].getType(), mm);
+ }
+ if (mm[nonpos] == null)
+ {
+ mm[nonpos] = new float[]
+ { features[index].score, features[index].score };
+
+ }
+ else
+ {
+ if (mm[nonpos][0] > features[index].score)
+ {
+ mm[nonpos][0] = features[index].score;
+ }
+ if (mm[nonpos][1] < features[index].score)
+ {
+ mm[nonpos][1] = features[index].score;
+ }
+ }
+ }
+ index++;
+ }
+ }
+ updateRenderOrder(allfeatures);
+ findingFeatures = false;
+ }
+
+ protected Boolean firing = Boolean.FALSE;
+
+ /**
+ * replaces the current renderOrder with the unordered features in
+ * allfeatures. The ordering of any types in both renderOrder and allfeatures
+ * is preserved, and all new feature types are rendered on top of the existing
+ * types, in the order given by getOrder or the order given in allFeatures.
+ * Note. this operates directly on the featureOrder hash for efficiency. TODO:
+ * eliminate the float storage for computing/recalling the persistent ordering
+ * New Cability: updates min/max for colourscheme range if its dynamic
+ *
+ * @param allFeatures
+ */
+ private void updateRenderOrder(List<String> allFeatures)
+ {
+ List<String> allfeatures = new ArrayList<String>(allFeatures);
+ String[] oldRender = renderOrder;
+ renderOrder = new String[allfeatures.size()];
+ Object mmrange, fc = null;
+ boolean initOrders = (featureOrder == null);
+ int opos = 0;
+ if (oldRender != null && oldRender.length > 0)
+ {
+ for (int j = 0; j < oldRender.length; j++)
+ {
+ if (oldRender[j] != null)
+ {
+ if (initOrders)
+ {
+ setOrder(oldRender[j], (1 - (1 + (float) j)
+ / oldRender.length));
+ }
+ if (allfeatures.contains(oldRender[j]))
+ {
+ renderOrder[opos++] = oldRender[j]; // existing features always
+ // appear below new features
+ allfeatures.remove(oldRender[j]);
+ if (minmax != null)
+ {
+ mmrange = minmax.get(oldRender[j]);
+ if (mmrange != null)
+ {
+ fc = featureColours.get(oldRender[j]);
+ if (fc != null && fc instanceof GraduatedColor
+ && ((GraduatedColor) fc).isAutoScale())
+ {
+ ((GraduatedColor) fc).updateBounds(
+ ((float[][]) mmrange)[0][0],
+ ((float[][]) mmrange)[0][1]);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if (allfeatures.size() == 0)
+ {
+ // no new features - leave order unchanged.
+ return;
+ }
+ int i = allfeatures.size() - 1;
+ int iSize = i;
+ boolean sort = false;
+ String[] newf = new String[allfeatures.size()];
+ float[] sortOrder = new float[allfeatures.size()];
+ for (String newfeat : allfeatures)
+ {
+ newf[i] = newfeat;
+ if (minmax != null)
+ {
+ // update from new features minmax if necessary
+ mmrange = minmax.get(newf[i]);
+ if (mmrange != null)
+ {
+ fc = featureColours.get(newf[i]);
+ if (fc != null && fc instanceof GraduatedColor
+ && ((GraduatedColor) fc).isAutoScale())
+ {
+ ((GraduatedColor) fc).updateBounds(((float[][]) mmrange)[0][0],
+ ((float[][]) mmrange)[0][1]);
+ }
+ }
+ }
+ if (initOrders || !featureOrder.containsKey(newf[i]))
+ {
+ int denom = initOrders ? allfeatures.size() : featureOrder.size();
+ // new unordered feature - compute persistent ordering at head of
+ // existing features.
+ setOrder(newf[i], i / (float) denom);
+ }
+ // set order from newly found feature from persisted ordering.
+ sortOrder[i] = 2 - ((Float) featureOrder.get(newf[i])).floatValue();
+ if (i < iSize)
+ {
+ // only sort if we need to
+ sort = sort || sortOrder[i] > sortOrder[i + 1];
+ }
+ i--;
+ }
+ if (iSize > 1 && sort)
+ {
+ jalview.util.QuickSort.sort(sortOrder, newf);
+ }
+ sortOrder = null;
+ System.arraycopy(newf, 0, renderOrder, opos, newf.length);
+ }
+
+ /**
+ * get a feature style object for the given type string. Creates a
+ * java.awt.Color for a featureType with no existing colourscheme. TODO:
+ * replace return type with object implementing standard abstract colour/style
+ * interface
+ *
+ * @param featureType
+ * @return java.awt.Color or GraduatedColor
+ */
+ public Object getFeatureStyle(String featureType)
+ {
+ Object fc = featureColours.get(featureType);
+ if (fc == null)
+ {
+ jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme();
+ Color col = ucs.createColourFromName(featureType);
+ featureColours.put(featureType, fc = col);
+ }
+ return fc;
+ }
+
+ /**
+ * return a nominal colour for this feature
+ *
+ * @param featureType
+ * @return standard color, or maximum colour for graduated colourscheme
+ */
+ public Color getColour(String featureType)
+ {
+ Object fc = getFeatureStyle(featureType);
+
+ if (fc instanceof Color)
+ {
+ return (Color) fc;
+ }
+ else
+ {
+ if (fc instanceof GraduatedColor)
+ {
+ return ((GraduatedColor) fc).getMaxColor();
+ }
+ }
+ throw new Error("Implementation Error: Unrecognised render object "
+ + fc.getClass() + " for features of type " + featureType);
+ }
+
+ /**
+ * calculate the render colour for a specific feature using current feature
+ * settings.
+ *
+ * @param feature
+ * @return render colour for the given feature
+ */
+ public Color getColour(SequenceFeature feature)
+ {
+ Object fc = getFeatureStyle(feature.getType());
+ if (fc instanceof Color)
+ {
+ return (Color) fc;
+ }
+ else
+ {
+ if (fc instanceof GraduatedColor)
+ {
+ return ((GraduatedColor) fc).findColor(feature);
+ }
+ }
+ throw new Error("Implementation Error: Unrecognised render object "
+ + fc.getClass() + " for features of type " + feature.getType());
+ }
+
+ protected boolean showFeature(SequenceFeature sequenceFeature)
+ {
+ Object fc = getFeatureStyle(sequenceFeature.type);
+ if (fc instanceof GraduatedColor)
+ {
+ return ((GraduatedColor) fc).isColored(sequenceFeature);
+ }
+ else
+ {
+ return true;
+ }
+ }
+
+ protected boolean showFeatureOfType(String type)
+ {
+ return av.getFeaturesDisplayed().isVisible(type);
+ }
+
+ public void setColour(String featureType, Object col)
+ {
+ // overwrite
+ // Color _col = (col instanceof Color) ? ((Color) col) : (col instanceof
+ // GraduatedColor) ? ((GraduatedColor) col).getMaxColor() : null;
+ // Object c = featureColours.get(featureType);
+ // if (c == null || c instanceof Color || (c instanceof GraduatedColor &&
+ // !((GraduatedColor)c).getMaxColor().equals(_col)))
+ {
+ featureColours.put(featureType, col);
+ }
+ }
+
+ public void setTransparency(float value)
+ {
+ transparency = value;
+ }
+
+ public float getTransparency()
+ {
+ return transparency;
+ }
+
+ Map featureOrder = null;
+
+ /**
+ * analogous to colour - store a normalized ordering for all feature types in
+ * this rendering context.
+ *
+ * @param type
+ * Feature type string
+ * @param position
+ * normalized priority - 0 means always appears on top, 1 means
+ * always last.
+ */
+ public float setOrder(String type, float position)
+ {
+ if (featureOrder == null)
+ {
+ featureOrder = new Hashtable();
+ }
+ featureOrder.put(type, new Float(position));
+ return position;
+ }
+
+ /**
+ * get the global priority (0 (top) to 1 (bottom))
+ *
+ * @param type
+ * @return [0,1] or -1 for a type without a priority
+ */
+ public float getOrder(String type)
+ {
+ if (featureOrder != null)
+ {
+ if (featureOrder.containsKey(type))
+ {
+ return ((Float) featureOrder.get(type)).floatValue();
+ }
+ }
+ return -1;
+ }
+
+ @Override
+ public Map<String, Object> getFeatureColours()
+ {
+ return new ConcurrentHashMap<String, Object>(featureColours);
+ }
+
+ /**
+ * Replace current ordering with new ordering
+ *
+ * @param data
+ * { String(Type), Colour(Type), Boolean(Displayed) }
+ */
+ public void setFeaturePriority(Object[][] data)
+ {
+ setFeaturePriority(data, true);
+ }
+
+ /**
+ *
+ * @param data
+ * { String(Type), Colour(Type), Boolean(Displayed) }
+ * @param visibleNew
+ * when true current featureDisplay list will be cleared
+ */
+ public void setFeaturePriority(Object[][] data, boolean visibleNew)
+ {
+ FeaturesDisplayedI av_featuresdisplayed = null;
+ if (visibleNew)
+ {
+ if ((av_featuresdisplayed = av.getFeaturesDisplayed()) != null)
+ {
+ av.getFeaturesDisplayed().clear();
+ }
+ else
+ {
+ av.setFeaturesDisplayed(av_featuresdisplayed = new FeaturesDisplayed());
+ }
+ }
+ else
+ {
+ av_featuresdisplayed = av.getFeaturesDisplayed();
+ }
+ if (data == null)
+ {
+ return;
+ }
+ // The feature table will display high priority
+ // features at the top, but theses are the ones
+ // we need to render last, so invert the data
+ renderOrder = new String[data.length];
+
+ if (data.length > 0)
+ {
+ for (int i = 0; i < data.length; i++)
+ {
+ String type = data[i][0].toString();
+ setColour(type, data[i][1]); // todo : typesafety - feature color
+ // interface object
+ if (((Boolean) data[i][2]).booleanValue())
+ {
+ av_featuresdisplayed.setVisible(type);
+ }
+
+ renderOrder[data.length - i - 1] = type;
+ }
+ }
+
+ }
+
+ /**
+ * @param listener
+ * @see java.beans.PropertyChangeSupport#addPropertyChangeListener(java.beans.PropertyChangeListener)
+ */
+ public void addPropertyChangeListener(PropertyChangeListener listener)
+ {
+ changeSupport.addPropertyChangeListener(listener);
+ }
+
+ /**
+ * @param listener
+ * @see java.beans.PropertyChangeSupport#removePropertyChangeListener(java.beans.PropertyChangeListener)
+ */
+ public void removePropertyChangeListener(PropertyChangeListener listener)
+ {
+ changeSupport.removePropertyChangeListener(listener);
+ }
+
+ public Set getAllFeatureColours()
+ {
+ return featureColours.keySet();
+ }
+
+ public void clearRenderOrder()
+ {
+ renderOrder = null;
+ }
+
+ public boolean hasRenderOrder()
+ {
+ return renderOrder != null;
+ }
+
+ public List<String> getRenderOrder()
+ {
+ if (renderOrder == null)
+ {
+ return Arrays.asList(new String[]
+ {});
+ }
+ return Arrays.asList(renderOrder);
+ }
+
+ public int getFeatureGroupsSize()
+ {
+ return featureGroups != null ? 0 : featureGroups.size();
+ }
+
+ @Override
+ public List<String> getFeatureGroups()
+ {
+ // conflict between applet and desktop - featureGroups returns the map in
+ // the desktop featureRenderer
+ return (featureGroups == null) ? Arrays.asList(new String[0]) : Arrays
+ .asList(featureGroups.keySet().toArray(new String[0]));
+ }
+
+ public boolean checkGroupVisibility(String group, boolean newGroupsVisible)
+ {
+ if (featureGroups == null)
+ {
+ // then an exception happens next..
+ }
+ if (featureGroups.containsKey(group))
+ {
+ return featureGroups.get(group).booleanValue();
+ }
+ if (newGroupsVisible)
+ {
+ featureGroups.put(group, new Boolean(true));
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * get visible or invisible groups
+ *
+ * @param visible
+ * true to return visible groups, false to return hidden ones.
+ * @return list of groups
+ */
+ @Override
+ public List getGroups(boolean visible)
+ {
+ if (featureGroups != null)
+ {
+ ArrayList gp = new ArrayList();
+
+ for (Object grp : featureGroups.keySet())
+ {
+ Boolean state = featureGroups.get(grp);
+ if (state.booleanValue() == visible)
+ {
+ gp.add(grp);
+ }
+ }
+ return gp;
+ }
+ return null;
+ }
+
+ @Override
+ public void setGroupVisibility(String group, boolean visible)
+ {
+ featureGroups.put(group, new Boolean(visible));
+ }
+
+ @Override
+ public void setGroupVisibility(List<String> toset, boolean visible)
+ {
+ if (toset != null && toset.size() > 0 && featureGroups != null)
+ {
+ boolean rdrw = false;
+ for (String gst : toset)
+ {
+ Boolean st = featureGroups.get(gst);
+ featureGroups.put(gst, new Boolean(visible));
+ if (st != null)
+ {
+ rdrw = rdrw || (visible != st.booleanValue());
+ }
+ }
+ if (rdrw)
+ {
+ // set local flag indicating redraw needed ?
+ }
+ }
+ }
+
+ @Override
+ public Hashtable getDisplayedFeatureCols()
+ {
+ Hashtable fcols = new Hashtable();
+ if (getViewport().getFeaturesDisplayed() == null)
+ {
+ return fcols;
+ }
+ Iterator<String> en = getViewport().getFeaturesDisplayed()
+ .getVisibleFeatures();
+ while (en.hasNext())
+ {
+ String col = en.next();
+ fcols.put(col, getColour(col));
+ }
+ return fcols;
+ }
+
+ @Override
+ public FeaturesDisplayedI getFeaturesDisplayed()
+ {
+ return av.getFeaturesDisplayed();
+ }
+
+ @Override
+ public String[] getDisplayedFeatureTypes()
+ {
+ String[] typ = null;
+ typ = getRenderOrder().toArray(new String[0]);
+ FeaturesDisplayedI feature_disp = av.getFeaturesDisplayed();
+ if (feature_disp != null)
+ {
+ synchronized (feature_disp)
+ {
+ for (int i = 0; i < typ.length; i++)
+ {
+ if (!feature_disp.isVisible(typ[i]))
+ {
+ typ[i] = null;
+ }
+ }
+ }
+ }
+ return typ;
+ }
+
+ @Override
+ public String[] getDisplayedFeatureGroups()
+ {
+ String[] gps = null;
+ ArrayList<String> _gps = new ArrayList<String>();
+ Iterator en = getFeatureGroups().iterator();
+ int g = 0;
+ boolean valid = false;
+ while (en.hasNext())
+ {
+ String gp = (String) en.next();
+ if (checkGroupVisibility(gp, false))
+ {
+ valid = true;
+ _gps.add(gp);
+ }
+ if (!valid)
+ {
+ return null;
+ }
+ else
+ {
+ gps = new String[_gps.size()];
+ _gps.toArray(gps);
+ }
+ }
+ return gps;
+ }
+
+}
--- /dev/null
+package jalview.viewmodel.seqfeatures;
+
+import jalview.schemes.GraduatedColor;
+
+import java.util.Arrays;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class FeatureRendererSettings implements Cloneable
+{
+ String[] renderOrder;
+
+ Map featureGroups;
+
+ Map featureColours;
+
+ float transparency;
+
+ Map featureOrder;
+
+ public FeatureRendererSettings(String[] renderOrder,
+ Hashtable featureGroups, Hashtable featureColours,
+ float transparency, Hashtable featureOrder)
+ {
+ super();
+ this.renderOrder = Arrays.copyOf(renderOrder,renderOrder.length);
+ this.featureGroups = new ConcurrentHashMap(featureGroups);
+ this.featureColours = new ConcurrentHashMap(featureColours);
+ this.transparency = transparency;
+ this.featureOrder = new ConcurrentHashMap(featureOrder);
+ }
+
+ /**
+ * create an independent instance of the feature renderer settings
+ *
+ * @param fr
+ */
+ public FeatureRendererSettings(
+ jalview.viewmodel.seqfeatures.FeatureRendererModel fr)
+ {
+ renderOrder = null;
+ featureGroups = new ConcurrentHashMap();
+ featureColours = new ConcurrentHashMap();
+ featureOrder = new ConcurrentHashMap();
+ if (fr.renderOrder != null)
+ {
+ this.renderOrder = new String[fr.renderOrder.length];
+ System.arraycopy(fr.renderOrder, 0, renderOrder, 0,
+ fr.renderOrder.length);
+ }
+ if (fr.featureGroups != null)
+ {
+ this.featureGroups = new ConcurrentHashMap(fr.featureGroups);
+ }
+ if (fr.featureColours != null)
+ {
+ this.featureColours = new ConcurrentHashMap(fr.featureColours);
+ }
+ Iterator en = fr.featureColours.keySet().iterator();
+ while (en.hasNext())
+ {
+ Object next = en.next();
+ Object val = featureColours.get(next);
+ if (val instanceof GraduatedColor)
+ {
+ featureColours.put(next, new GraduatedColor((GraduatedColor) val));
+ }
+ }
+ this.transparency = fr.transparency;
+ if (fr.featureOrder != null)
+ {
+ this.featureOrder = new ConcurrentHashMap(fr.featureOrder);
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+package jalview.viewmodel.seqfeatures;
+
+import jalview.api.FeatureSettingsModelI;
+
+public class FeatureSettingsModel implements FeatureSettingsModelI
+{
+
+}
--- /dev/null
+package jalview.viewmodel.seqfeatures;
+
+import jalview.api.FeaturesDisplayedI;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+
+public class FeaturesDisplayed implements FeaturesDisplayedI
+{
+ private HashSet<String> featuresDisplayed = new HashSet<String>();
+
+ private HashSet<String> featuresRegistered = new HashSet<String>();
+
+ public FeaturesDisplayed(FeaturesDisplayedI featuresDisplayed2)
+ {
+ Iterator<String> fdisp = featuresDisplayed2.getVisibleFeatures();
+ String ftype;
+ while (fdisp.hasNext())
+ {
+ ftype = fdisp.next();
+ featuresDisplayed.add(ftype);
+ featuresRegistered.add(ftype);
+ }
+ }
+
+ public FeaturesDisplayed()
+ {
+ // TODO Auto-generated constructor stub
+ }
+
+ @Override
+ public Iterator<String> getVisibleFeatures()
+ {
+ return featuresDisplayed.iterator();
+ }
+
+ @Override
+ public boolean isVisible(String featureType)
+ {
+ return featuresDisplayed.contains(featureType);
+ }
+
+ @Override
+ public boolean areVisible(Collection featureTypes)
+ {
+ return featuresDisplayed.containsAll(featureTypes);
+ }
+
+ @Override
+ public void clear()
+ {
+ featuresDisplayed.clear();
+ featuresRegistered.clear();
+ }
+
+ @Override
+ public void setAllVisible(Collection makeVisible)
+ {
+ featuresDisplayed.addAll(makeVisible);
+ featuresRegistered.addAll(makeVisible);
+ }
+
+ @Override
+ public void setAllRegisteredVisible()
+ {
+ featuresDisplayed.addAll(featuresRegistered);
+ }
+
+ @Override
+ public void setVisible(String featureType)
+ {
+ featuresDisplayed.add(featureType);
+ featuresRegistered.add(featureType);
+ }
+
+ @Override
+ public boolean isRegistered(String type)
+ {
+ return featuresRegistered.contains(type);
+ }
+
+ @Override
+ public int getVisibleFeatureCount()
+ {
+ return featuresDisplayed.size();
+ }
+
+ @Override
+ public int getRegisterdFeaturesCount()
+ {
+ return featuresRegistered.size();
+ }
+}
import jalview.datamodel.SequenceI;
import jalview.gui.AlignFrame;
import jalview.gui.WebserviceInfo;
-import jalview.gui.FeatureRenderer.FeatureRendererSettings;
+import jalview.viewmodel.seqfeatures.FeatureRendererSettings;
import jalview.util.MessageManager;
public abstract class AWSThread extends Thread
{
if (dispFeatures)
{
- jalview.gui.FeatureRenderer fr = ((jalview.gui.AlignmentPanel) ap)
+ jalview.api.FeatureRenderer fr = ((jalview.gui.AlignmentPanel) ap)
.cloneFeatureRenderer();
for (String ft : fc.keySet())
{
if (format.equals(JVANNOT))
{
return new StringBody(
- new jalview.io.AnnotationFile().printAnnotations(
- al.getAlignmentAnnotation(), al.getGroups(),
- al.getProperties()));
+ new jalview.io.AnnotationFile()
+ .printAnnotationsForAlignment(al));
}
else
{
--- /dev/null
+package jalview.analysis.scoremodels;
+
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.gui.AlignFrame;
+import jalview.io.FileLoader;
+import jalview.io.FormatAdapter;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class FeatureScoreModelTest
+{
+ public static String alntestFile = "FER1_MESCR/72-76 DVYIL\nFER1_SPIOL/71-75 DVYIL\nFER3_RAPSA/21-25 DVYVL\nFER1_MAIZE/73-77 DVYIL\n";
+
+ int[] sf1 = new int[]
+ { 74, 74, 73, 73, 23, 23, -1, -1 };
+
+ int[] sf2 = new int[]
+ { -1, -1, 74, 75, -1, -1, 76, 77 };
+
+ int[] sf3 = new int[]
+ { -1, -1, -1, -1, -1, -1, 76, 77 };
+
+ @Test
+ public void testFeatureScoreModel() throws Exception
+ {
+ AlignFrame alf = new FileLoader(false).LoadFileWaitTillLoaded(alntestFile,
+ FormatAdapter.PASTE);
+ AlignmentI al = alf.getViewport().getAlignment();
+ Assert.assertEquals(4, al.getHeight());
+ Assert.assertEquals(5, al.getWidth());
+ for (int i = 0; i < 4; i++)
+ {
+ SequenceI ds = al.getSequenceAt(i).getDatasetSequence();
+ if (sf1[i * 2] > 0)
+ {
+ ds.addSequenceFeature(new SequenceFeature("sf1", "sf1", "sf1",
+ sf1[i * 2], sf1[i * 2 + 1], "sf1"));
+ }
+ if (sf2[i * 2] > 0)
+ {
+ ds.addSequenceFeature(new SequenceFeature("sf2", "sf2", "sf2",
+ sf2[i * 2], sf2[i * 2 + 1], "sf2"));
+ }
+ if (sf3[i * 2] > 0)
+ {
+ ds.addSequenceFeature(new SequenceFeature("sf3", "sf3", "sf3",
+ sf3[i * 2], sf3[i * 2 + 1], "sf3"));
+ }
+ }
+ alf.setShowSeqFeatures(true);
+ alf.getFeatureRenderer().setVisible("sf1");
+ alf.getFeatureRenderer().setVisible("sf2");
+ alf.getFeatureRenderer().setVisible("sf3");
+ alf.getFeatureRenderer().findAllFeatures(true);
+ Assert.assertEquals("Number of feature types", 3, alf
+ .getFeatureRenderer().getDisplayedFeatureTypes().length);
+ Assert.assertTrue(alf.getCurrentView().areFeaturesDisplayed());
+ FeatureScoreModel fsm = new FeatureScoreModel();
+ Assert.assertTrue(fsm.configureFromAlignmentView(alf.getCurrentView()
+ .getAlignPanel()));
+ alf.selectAllSequenceMenuItem_actionPerformed(null);
+ float[][] dm = fsm.findDistances(alf.getViewport().getAlignmentView(
+ true));
+ Assert.assertTrue("FER1_MESCR should be identical with RAPSA (2)",
+ dm[0][2] == 0f);
+ Assert.assertTrue(
+ "FER1_MESCR should be further from SPIOL (1) than it is from RAPSA (2)",
+ dm[0][1] > dm[0][2]);
+
+ }
+}
public class SequenceTest
{
- Sequence seq;
+ SequenceI seq;
@Before
public void setUp()
seq = new Sequence("FER1", "AKPNGVL");
}
@Test
+ public void testInsertGapsAndGapmaps()
+ {
+ SequenceI aseq = seq.deriveSequence();
+ aseq.insertCharAt(2, 3, '-');
+ aseq.insertCharAt(6, 3, '-');
+ assertEquals("Gap insertions not correct", "AK---P---NGVL",
+ aseq.getSequenceAsString());
+ List<int[]> gapInt = aseq.getInsertions();
+ assertEquals("Gap interval 1 start wrong", 2, gapInt.get(0)[0]);
+ assertEquals("Gap interval 1 end wrong", 4, gapInt.get(0)[1]);
+ assertEquals("Gap interval 2 start wrong", 6, gapInt.get(1)[0]);
+ assertEquals("Gap interval 2 end wrong", 8, gapInt.get(1)[1]);
+ }
+
+ @Test
public void testGetAnnotation()
{
// initial state returns null not an empty array
@Test
public void testAddAlignmentAnnotation()
{
- assertNull(seq.annotation);
+ assertNull(seq.getAnnotation());
final AlignmentAnnotation annotation = new AlignmentAnnotation("a",
"b", 2d);
assertNull(annotation.sequenceRef);
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import jalview.datamodel.AlignmentI;
+import jalview.datamodel.ColumnSelection;
+import jalview.io.AnnotationFile.ViewDef;
import java.io.File;
+import java.util.Hashtable;
import org.junit.Test;
"examples/uniref50.fa", "examples/testdata/uniref50_iupred.jva" },
{
"Test group only annotation file parsing results in parser indicating annotation was parsed",
- "examples/uniref50.fa", "examples/testdata/test_grpannot.jva" } };
+ "examples/uniref50.fa", "examples/testdata/test_grpannot.jva" },
+ { "Test hiding/showing of insertions on sequence_ref",
+ "examples/uniref50.fa", "examples/testdata/uniref50_seqref.jva" } };
@Test
public void exampleAnnotationFileIO() throws Exception
try
{
AlignmentI al = readAlignmentFile(f);
-
+ ColumnSelection cs = new ColumnSelection();
assertTrue(
"Test "
+ testname
+ "\nAlignment was not annotated - annotation file not imported.",
- new AnnotationFile().readAnnotationFile(al, af,
+ new AnnotationFile().readAnnotationFile(al, cs, af,
FormatAdapter.FILE));
+ AnnotationFile aff = new AnnotationFile();
+ ViewDef v = aff.new ViewDef(null, al.getHiddenSequences(), cs,
+ new Hashtable());
String anfileout = new AnnotationFile().printAnnotations(
al.getAlignmentAnnotation(), al.getGroups(),
- al.getProperties());
+ al.getProperties(), null, al, v);
assertTrue(
"Test "
+ testname
{
String generatedJson = bioJsHtmlOuput
.getJalviewAlignmentAsJsonString(al);
- assert (generatedJson
- .equalsIgnoreCase("{\"globalColorScheme\":\"zappo\",\"seqs\":[{\"id\":\"1\",\"start\":1,\"name\":\"name/1-26\",\"features\":[],\"seq\":\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\"end\":26}]}"));
+ org.junit.Assert
+ .assertEquals(
+ generatedJson.toLowerCase(),
+ "{\"globalColorScheme\":\"zappo\",\"seqs\":[{\"id\":\"1\",\"start\":1,\"name\":\"name/1-26\",\"features\":[],\"seq\":\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\"end\":26}]}"
+ .toLowerCase());
System.out.println("Output : " + generatedJson);
} catch (IOException e)
{
*/
package jalview.ws.jabaws;
-import static org.junit.Assert.*;
-
-import java.util.ArrayList;
-import java.util.List;
-
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.io.AnnotationFile;
import jalview.ws.jws2.Jws2Discoverer;
import jalview.ws.jws2.jabaws2.Jws2Instance;
+import java.util.ArrayList;
+import java.util.List;
+
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
{
String aligfileout = new FormatAdapter().formatSequences("PFAM",
al.getSequencesArray());
- String anfileout = new AnnotationFile().printAnnotations(
- al.getAlignmentAnnotation(), al.getGroups(),
- al.getProperties());
+ String anfileout = new AnnotationFile()
+ .printAnnotationsForAlignment(al);
assertTrue(
"Test "
+ testname
import jalview.ws.jws2.Jws2Discoverer;
import jalview.ws.jws2.SequenceAnnotationWSClient;
import jalview.ws.jws2.jabaws2.Jws2Instance;
-import jalview.ws.params.ArgumentI;
import jalview.ws.params.AutoCalcSetting;
import java.awt.Component;
System.out.println("State of jpredws: " + jpredws);
if (jpredws == null)
+ {
System.exit(0);
+ }
jalview.io.FileLoader fl = new jalview.io.FileLoader(false);
String aligfileout = new FormatAdapter().formatSequences("PFAM",
al.getSequencesArray());
- String anfileout = new AnnotationFile().printAnnotations(
- al.getAlignmentAnnotation(), al.getGroups(),
- al.getProperties());
+ String anfileout = new AnnotationFile()
+ .printAnnotationsForAlignment(al);
assertTrue(
"Test "
+ testname
*/
package jalview.ws.jabaws;
-import static org.junit.Assert.*;
-
-import java.awt.Component;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Vector;
-
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-
-import jalview.api.AlignCalcManagerI;
-import jalview.datamodel.AlignmentAnnotation;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import jalview.datamodel.AlignmentI;
-import jalview.datamodel.Annotation;
import jalview.gui.Jalview2XML;
import jalview.io.AnnotationFile;
import jalview.io.FormatAdapter;
import jalview.io.StockholmFileTest;
-import jalview.ws.jws2.AADisorderClient;
import jalview.ws.jws2.Jws2Discoverer;
import jalview.ws.jws2.RNAalifoldClient;
import jalview.ws.jws2.SequenceAnnotationWSClient;
-import jalview.ws.jws2.dm.JabaOption;
import jalview.ws.jws2.jabaws2.Jws2Instance;
import jalview.ws.params.AutoCalcSetting;
+import java.awt.Component;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
System.out.println("State of rnaalifoldws: " + rnaalifoldws);
if (rnaalifoldws == null)
+ {
System.exit(0);
+ }
jalview.io.FileLoader fl = new jalview.io.FileLoader(false);
String aligfileout = new FormatAdapter().formatSequences("PFAM",
al.getSequencesArray());
- String anfileout = new AnnotationFile().printAnnotations(
- al.getAlignmentAnnotation(), al.getGroups(),
- al.getProperties());
+ String anfileout = new AnnotationFile()
+ .printAnnotationsForAlignment(al);
assertTrue(
"Test "
+ testname