MidAtBest commited on
Commit
48b1d06
·
1 Parent(s): e9035bc

feat: remove radar plot and improve layout

Browse files
Files changed (4) hide show
  1. Dockerfile +1 -0
  2. data/bed_dataset.csv +322 -247
  3. data/bigwig_dataset.csv +0 -0
  4. src/streamlit_app.py +188 -90
Dockerfile CHANGED
@@ -1,5 +1,6 @@
1
  FROM python:3.13.5-slim
2
 
 
3
  WORKDIR /app
4
 
5
  RUN apt-get update && apt-get install -y \
 
1
  FROM python:3.13.5-slim
2
 
3
+
4
  WORKDIR /app
5
 
6
  RUN apt-get update && apt-get install -y \
data/bed_dataset.csv CHANGED
@@ -1,247 +1,322 @@
1
- MCC,model_name,species,datasets
2
- 0.334637850522995,NTv2 500M,cattle,intron
3
- 0.1238768473267555,BPNet arch. 6M,cattle,intron
4
- 0.383470207452774,Residual CNN 44M,cattle,intron
5
- 0.3828243613243103,HyenaDNA 7M,cattle,intron
6
- 0.4733810424804687,Caduceus 7M,cattle,intron
7
- 0.4315277338027954,Evo2 1B,cattle,intron
8
- 0.5455867648124695,NTv3 8M (pre),cattle,intron
9
- 0.5453664064407349,NTv3 100M (pre),cattle,intron
10
- 0.5628412365913391,NTv3 650M (pre),cattle,intron
11
- 0.5682631134986877,NTv3 650M (post),cattle,intron
12
- 0.3689357042312622,NTv2 500M,cattle,exon
13
- 0.3250860869884491,BPNet arch. 6M,cattle,exon
14
- 0.4674676060676574,Residual CNN 44M,cattle,exon
15
- 0.2207767516374588,HyenaDNA 7M,cattle,exon
16
- 0.4960922300815582,Caduceus 7M,cattle,exon
17
- 0.4969632029533386,Evo2 1B,cattle,exon
18
- 0.5432836413383484,NTv3 8M (pre),cattle,exon
19
- 0.5531933307647705,NTv3 100M (pre),cattle,exon
20
- 0.591151773929596,NTv3 650M (pre),cattle,exon
21
- 0.6253225207328796,NTv3 650M (post),cattle,exon
22
- 0.118808165192604,NTv2 500M,cattle,splice acceptor
23
- 0.4715546369552612,BPNet arch. 6M,cattle,splice acceptor
24
- 0.6620649099349976,Residual CNN 44M,cattle,splice acceptor
25
- 0.104436807334423,HyenaDNA 7M,cattle,splice acceptor
26
- 0.7064619660377502,Caduceus 7M,cattle,splice acceptor
27
- 0.2085049450397491,Evo2 1B,cattle,splice acceptor
28
- 0.7254849076271057,NTv3 8M (pre),cattle,splice acceptor
29
- 0.7404072880744934,NTv3 100M (pre),cattle,splice acceptor
30
- 0.7732946872711182,NTv3 650M (pre),cattle,splice acceptor
31
- 0.7679624557495117,NTv3 650M (post),cattle,splice acceptor
32
- 0.1412438601255417,NTv2 500M,cattle,start codon
33
- 0.1490814685821533,BPNet arch. 6M,cattle,start codon
34
- 0.3243320286273956,Residual CNN 44M,cattle,start codon
35
- 0.056509330868721,HyenaDNA 7M,cattle,start codon
36
- 0.3455557227134704,Caduceus 7M,cattle,start codon
37
- 0.1030694246292114,Evo2 1B,cattle,start codon
38
- 0.5275959968566895,NTv3 8M (pre),cattle,start codon
39
- 0.4962065815925598,NTv3 100M (pre),cattle,start codon
40
- 0.5591813921928406,NTv3 650M (pre),cattle,start codon
41
- 0.5492052435874939,NTv3 650M (post),cattle,start codon
42
- 0.5492052435874939,NTv2 500M,cattle,start codon
43
- 0.1015273928642273,BPNet arch. 6M,cattle,intron
44
- 0.3299930691719055,Residual CNN 44M,cattle,intron
45
- 0.3826011121273041,HyenaDNA 7M,cattle,intron
46
- 0.5564854741096497,Caduceus 7M,cattle,intron
47
- 0.5564854741096497,NTv2 500M,cattle,intron
48
- 0.323502242565155,BPNet arch. 6M,cattle,exon
49
- 0.519285261631012,Residual CNN 44M,cattle,exon
50
- 0.1038060635328292,HyenaDNA 7M,cattle,splice acceptor
51
- 0.1038060635328292,Caduceus 7M,cattle,splice acceptor
52
- 0.1038060635328292,NTv2 500M,cattle,splice acceptor
53
- 0.4435675740242004,BPNet arch. 6M,cattle,splice acceptor
54
- 0.6590774655342102,Residual CNN 44M,cattle,splice acceptor
55
- 0.1038060635328292,HyenaDNA 7M,cattle,splice acceptor
56
- 0.1038060635328292,Caduceus 7M,cattle,splice acceptor
57
- 0.1038060635328292,NTv2 500M,cattle,splice acceptor
58
- 0.0901669710874557,BPNet arch. 6M,cattle,start codon
59
- 0.3548502624034881,Residual CNN 44M,cattle,start codon
60
- 0.0545537285506725,HyenaDNA 7M,cattle,start codon
61
- 0.0545537285506725,Caduceus 7M,cattle,start codon
62
- 0.0639578104019165,BPNet arch. 6M,cattle,start codon
63
- 0.3266464471817016,Residual CNN 44M,cattle,intron
64
- 0.3266464471817016,HyenaDNA 7M,cattle,intron
65
- 0.3266464471817016,Caduceus 7M,cattle,intron
66
- 0.1383400112390518,BPNet arch. 6M,cattle,intron
67
- 0.4856111407279968,Residual CNN 44M,cattle,exon
68
- 0.4856111407279968,HyenaDNA 7M,cattle,exon
69
- 0.4856111407279968,Caduceus 7M,cattle,exon
70
- 0.4220209121704101,BPNet arch. 6M,cattle,splice acceptor
71
- 0.689546525478363,Residual CNN 44M,cattle,splice acceptor
72
- 0.689546525478363,HyenaDNA 7M,cattle,splice acceptor
73
- 0.689546525478363,Caduceus 7M,cattle,splice acceptor
74
- 0.0930091217160224,BPNet arch. 6M,cattle,start codon
75
- 0.423166275024414,Residual CNN 44M,cattle,start codon
76
- 0.423166275024414,HyenaDNA 7M,cattle,start codon
77
- 0.423166275024414,Caduceus 7M,cattle,start codon
78
- 0.4777896404266357,NTv2 500M,tomato,intron
79
- 0.3216900527477264,BPNet arch. 6M,tomato,intron
80
- 0.46840900182724,Residual CNN 44M,tomato,intron
81
- 0.5251263380050659,PlantCAD2 88M,tomato,intron
82
- 0.747674286365509,Evo2 1B,tomato,intron
83
- 0.6858112812042236,NTv3 8M (pre),tomato,intron
84
- 0.7038365006446838,NTv3 100M (pre),tomato,intron
85
- 0.7481895685195923,NTv3 650M (pre),tomato,intron
86
- 0.7458349466323853,NTv3 650M (post),tomato,intron
87
- 0.6147475838661194,NTv2 500M,tomato,exon
88
- 0.4551227986812591,BPNet arch. 6M,tomato,exon
89
- 0.5068296194076538,Residual CNN 44M,tomato,exon
90
- 0.7256030440330505,PlantCAD2 88M,tomato,exon
91
- 0.7006198763847351,Evo2 1B,tomato,exon
92
- 0.7537696361541748,NTv3 8M (pre),tomato,exon
93
- 0.7484462857246399,NTv3 100M (pre),tomato,exon
94
- 0.764011561870575,NTv3 650M (pre),tomato,exon
95
- 0.7750575542449951,NTv3 650M (post),tomato,exon
96
- 0.1691933125257492,NTv2 500M,tomato,splice acceptor
97
- 0.125656172633171,BPNet arch. 6M,tomato,splice acceptor
98
- 0.4359458982944488,Residual CNN 44M,tomato,splice acceptor
99
- 0.744257926940918,PlantCAD2 88M,tomato,splice acceptor
100
- 0.3791649639606476,Evo2 1B,tomato,splice acceptor
101
- 0.6623862385749817,NTv3 8M (pre),tomato,splice acceptor
102
- 0.6843105554580688,NTv3 100M (pre),tomato,splice acceptor
103
- 0.7641868591308594,NTv3 650M (pre),tomato,splice acceptor
104
- 0.7584431767463684,NTv3 650M (post),tomato,splice acceptor
105
- 0.132934883236885,NTv2 500M,tomato,start codon
106
- 0.0,BPNet arch. 6M,tomato,start codon
107
- 0.088478960096836,Residual CNN 44M,tomato,start codon
108
- 0.2019559442996978,PlantCAD2 88M,tomato,start codon
109
- 0.1622217148542404,Evo2 1B,tomato,start codon
110
- 0.2966536581516266,NTv3 8M (pre),tomato,start codon
111
- 0.3968957066535949,NTv3 100M (pre),tomato,start codon
112
- 0.4830105900764465,NTv3 650M (pre),tomato,start codon
113
- 0.5007501244544983,NTv3 650M (post),tomato,start codon
114
- 0.6770024299621582,NTv2 500M,tomato,intron
115
- 0.2927957773208618,BPNet arch. 6M,tomato,intron
116
- 0.1383400112390518,Residual CNN 44M,tomato,intron
117
- 0.1383400112390518,PlantCAD2 88M,tomato,intron
118
- 0.5751976370811462,NTv2 500M,tomato,exon
119
- 0.3057552278041839,BPNet arch. 6M,tomato,exon
120
- 0.168193981051445,NTv2 500M,tomato,splice acceptor
121
- 0.0,BPNet arch. 6M,tomato,splice acceptor
122
- 0.4833243191242218,Residual CNN 44M,tomato,splice acceptor
123
- 0.4833243191242218,PlantCAD2 88M,tomato,splice acceptor
124
- 0.1586925536394119,NTv2 500M,tomato,start codon
125
- 0.0,BPNet arch. 6M,tomato,start codon
126
- 0.1107296794652938,Residual CNN 44M,tomato,start codon
127
- 0.1107296794652938,PlantCAD2 88M,tomato,start codon
128
- 0.3502058088779449,BPNet arch. 6M,tomato,intron
129
- 0.5514466166496277,Residual CNN 44M,tomato,intron
130
- 0.5514466166496277,PlantCAD2 88M,tomato,intron
131
- 0.3020758032798767,BPNet arch. 6M,tomato,exon
132
- 0.4746756553649902,Residual CNN 44M,tomato,exon
133
- 0.4746756553649902,PlantCAD2 88M,tomato,exon
134
- 0.0,BPNet arch. 6M,tomato,splice acceptor
135
- 0.3391502797603607,Residual CNN 44M,tomato,splice acceptor
136
- 0.3391502797603607,PlantCAD2 88M,tomato,splice acceptor
137
- 0.0639578104019165,BPNet arch. 6M,tomato,start codon
138
- 0.0914037525653839,Residual CNN 44M,tomato,start codon
139
- 0.0914037525653839,PlantCAD2 88M,tomato,start codon
140
- 0.1995969861745834,NTv2 500M,human,intron
141
- 0.0296161584556102,BPNet arch. 6M,human,intron
142
- 0.2347834408283233,Residual CNN 44M,human,intron
143
- 0.33451908826828,HyenaDNA 7M,human,intron
144
- 0.4144788980484009,Caduceus 7M,human,intron
145
- 0.0,Evo2 1B,human,intron
146
- 0.4695742726325989,NTv3 8M (pre),human,intron
147
- 0.475054919719696,NTv3 100M (pre),human,intron
148
- 0.5504136681556702,NTv3 650M (pre),human,intron
149
- 0.5643875002861023,NTv3 650M (post),human,intron
150
- 0.1995969861745834,NTv2 500M,human,intron
151
- 0.2706590592861175,BPNet arch. 6M,human,exon
152
- 0.2678671479225158,Residual CNN 44M,human,exon
153
- 0.179698497056961,HyenaDNA 7M,human,exon
154
- 0.5098947286605835,Caduceus 7M,human,exon
155
- 0.4510694444179535,Evo2 1B,human,exon
156
- 0.6089931726455688,NTv3 8M (pre),human,exon
157
- 0.6492856740951538,NTv3 100M (pre),human,exon
158
- 0.6975767016410828,NTv3 650M (pre),human,exon
159
- 0.6822624206542969,NTv3 650M (post),human,exon
160
- 0.1493269056081771,NTv2 500M,human,splice acceptor
161
- 0.3807527124881744,BPNet arch. 6M,human,splice acceptor
162
- 0.6632664203643799,Residual CNN 44M,human,splice acceptor
163
- 0.1002769619226455,HyenaDNA 7M,human,splice acceptor
164
- 0.7357247471809387,Caduceus 7M,human,splice acceptor
165
- 0.1821079105138778,Evo2 1B,human,splice acceptor
166
- 0.7726271748542786,NTv3 8M (pre),human,splice acceptor
167
- 0.77947598695755,NTv3 100M (pre),human,splice acceptor
168
- 0.8028115034103394,NTv3 650M (pre),human,splice acceptor
169
- 0.7979229092597961,NTv3 650M (post),human,splice acceptor
170
- 0.139576569199562,NTv2 500M,human,start codon
171
- 0.1334401220083236,BPNet arch. 6M,human,start codon
172
- 0.3876807987689972,Residual CNN 44M,human,start codon
173
- 0.1003016158938407,HyenaDNA 7M,human,start codon
174
- 0.3958532512187958,Caduceus 7M,human,start codon
175
- 0.1399599611759185,Evo2 1B,human,start codon
176
- 0.540923535823822,NTv3 8M (pre),human,start codon
177
- 0.5464004278182983,NTv3 100M (pre),human,start codon
178
- 0.6803378462791443,NTv3 650M (pre),human,start codon
179
- 0.7310947179794312,NTv3 650M (post),human,start codon
180
- 0.7310947179794312,NTv2 500M,human,start codon
181
- 0.0172978900372982,BPNet arch. 6M,human,intron
182
- 0.2740728259086609,Residual CNN 44M,human,intron
183
- 0.3312098085880279,HyenaDNA 7M,human,intron
184
- 0.5108950138092041,Caduceus 7M,human,intron
185
- 0.5034915208816528,NTv3 8M (pre),human,intron
186
- 0.5154411792755127,NTv3 100M (pre),human,intron
187
- 0.5814740061759949,NTv3 650M (pre),human,intron
188
- 0.5920455455780029,NTv3 650M (post),human,intron
189
- 0.5920455455780029,NTv2 500M,human,intron
190
- 0.2252149283885955,BPNet arch. 6M,human,exon
191
- 0.4010578095912933,Residual CNN 44M,human,exon
192
- 0.1851459741592407,HyenaDNA 7M,human,exon
193
- 0.4599409103393554,Caduceus 7M,human,exon
194
- 0.5931490063667297,NTv3 8M (pre),human,exon
195
- 0.6058318018913269,NTv3 100M (pre),human,exon
196
- 0.6738048791885376,NTv3 650M (pre),human,exon
197
- 0.6738048791885376,NTv3 650M (post),human,exon
198
- 0.6738048791885376,NTv2 500M,human,exon
199
- 0.3751010596752167,BPNet arch. 6M,human,splice acceptor
200
- 0.681228756904602,Residual CNN 44M,human,splice acceptor
201
- 0.0252278540283441,HyenaDNA 7M,human,splice acceptor
202
- 0.7485092878341675,Caduceus 7M,human,splice acceptor
203
- 0.7772909998893738,NTv3 8M (pre),human,splice acceptor
204
- 0.794090747833252,NTv3 100M (pre),human,splice acceptor
205
- 0.8239933252334595,NTv3 650M (pre),human,splice acceptor
206
- 0.804115891456604,NTv3 650M (post),human,splice acceptor
207
- 0.804115891456604,NTv2 500M,human,splice acceptor
208
- 0.0,BPNet arch. 6M,human,start codon
209
- 0.3292546272277832,Residual CNN 44M,human,start codon
210
- 0.0647941380739212,HyenaDNA 7M,human,start codon
211
- 0.4505241215229034,Caduceus 7M,human,start codon
212
- 0.60422682762146,NTv3 8M (pre),human,start codon
213
- 0.6015576124191284,NTv3 100M (pre),human,start codon
214
- 0.6452956795692444,NTv3 650M (pre),human,start codon
215
- 0.6761345267295837,NTv3 650M (post),human,start codon
216
- 0.0185965970158576,BPNet arch. 6M,human,intron
217
- 0.2623045742511749,Residual CNN 44M,human,intron
218
- 0.2623045742511749,HyenaDNA 7M,human,intron
219
- 0.2623045742511749,Caduceus 7M,human,intron
220
- 0.4804849028587341,NTv3 8M (pre),human,intron
221
- 0.482195496559143,NTv3 100M (pre),human,intron
222
- 0.5425574779510498,NTv3 650M (pre),human,intron
223
- 0.5443048477172852,NTv3 650M (post),human,intron
224
- 0.2360571771860122,BPNet arch. 6M,human,exon
225
- 0.2360571771860122,Residual CNN 44M,human,exon
226
- 0.2360571771860122,HyenaDNA 7M,human,exon
227
- 0.2360571771860122,Caduceus 7M,human,exon
228
- 0.6339762210845947,NTv3 8M (pre),human,exon
229
- 0.6433913111686707,NTv3 100M (pre),human,exon
230
- 0.6518793702125549,NTv3 650M (pre),human,exon
231
- 0.6812491416931152,NTv3 650M (post),human,exon
232
- 0.3842235207557678,BPNet arch. 6M,human,splice acceptor
233
- 0.6810190081596375,Residual CNN 44M,human,splice acceptor
234
- 0.6810190081596375,HyenaDNA 7M,human,splice acceptor
235
- 0.6810190081596375,Caduceus 7M,human,splice acceptor
236
- 0.7796080708503723,NTv3 8M (pre),human,splice acceptor
237
- 0.7596970200538635,NTv3 100M (pre),human,splice acceptor
238
- 0.7915040850639343,NTv3 650M (pre),human,splice acceptor
239
- 0.7957100868225098,NTv3 650M (post),human,splice acceptor
240
- 0.1114460304379463,BPNet arch. 6M,human,start codon
241
- 0.3342535495758056,Residual CNN 44M,human,start codon
242
- 0.3342535495758056,HyenaDNA 7M,human,start codon
243
- 0.3342535495758056,Caduceus 7M,human,start codon
244
- 0.5167152881622314,NTv3 8M (pre),human,start codon
245
- 0.5340564250946045,NTv3 100M (pre),human,start codon
246
- 0.6148532032966614,NTv3 650M (pre),human,start codon
247
- 0.6582212448120117,NTv3 650M (post),human,start codon
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MCC,model_name,running_time_hours,species,datasets
2
+ 0.334637850522995,NTv2 500M,88.0,cattle,intron
3
+ 0.1238768473267555,BPNet arch. 6M,4.0,cattle,intron
4
+ 0.383470207452774,Residual CNN 44M,19.0,cattle,intron
5
+ 0.3828243613243103,HyenaDNA 7M,23.0,cattle,intron
6
+ 0.4733810424804687,Caduceus 7M,32.0,cattle,intron
7
+ 0.4315277338027954,Evo2 1B,43.0,cattle,intron
8
+ 0.5455867648124695,NTv3 8M (pre),1.0,cattle,intron
9
+ 0.5453664064407349,NTv3 100M (pre),2.0,cattle,intron
10
+ 0.5628412365913391,NTv3 650M (pre),5.0,cattle,intron
11
+ 0.5682631134986877,NTv3 650M (post),7.0,cattle,intron
12
+ 0.3689357042312622,NTv2 500M,87.0,cattle,exon
13
+ 0.3250860869884491,BPNet arch. 6M,4.0,cattle,exon
14
+ 0.4674676060676574,Residual CNN 44M,19.0,cattle,exon
15
+ 0.2207767516374588,HyenaDNA 7M,21.0,cattle,exon
16
+ 0.4960922300815582,Caduceus 7M,32.0,cattle,exon
17
+ 0.4969632029533386,Evo2 1B,44.0,cattle,exon
18
+ 0.5432836413383484,NTv3 8M (pre),1.0,cattle,exon
19
+ 0.5531933307647705,NTv3 100M (pre),2.0,cattle,exon
20
+ 0.591151773929596,NTv3 650M (pre),5.0,cattle,exon
21
+ 0.6253225207328796,NTv3 650M (post),7.0,cattle,exon
22
+ 0.118808165192604,NTv2 500M,86.0,cattle,splice acceptor
23
+ 0.4715546369552612,BPNet arch. 6M,4.0,cattle,splice acceptor
24
+ 0.6620649099349976,Residual CNN 44M,19.0,cattle,splice acceptor
25
+ 0.104436807334423,HyenaDNA 7M,22.0,cattle,splice acceptor
26
+ 0.7064619660377502,Caduceus 7M,30.0,cattle,splice acceptor
27
+ 0.2085049450397491,Evo2 1B,43.0,cattle,splice acceptor
28
+ 0.7254849076271057,NTv3 8M (pre),1.0,cattle,splice acceptor
29
+ 0.7404072880744934,NTv3 100M (pre),2.0,cattle,splice acceptor
30
+ 0.7732946872711182,NTv3 650M (pre),5.0,cattle,splice acceptor
31
+ 0.7679624557495117,NTv3 650M (post),7.0,cattle,splice acceptor
32
+ 0.1412438601255417,NTv2 500M,88.0,cattle,start codon
33
+ 0.1490814685821533,BPNet arch. 6M,4.0,cattle,start codon
34
+ 0.3243320286273956,Residual CNN 44M,19.0,cattle,start codon
35
+ 0.056509330868721,HyenaDNA 7M,23.0,cattle,start codon
36
+ 0.3455557227134704,Caduceus 7M,33.0,cattle,start codon
37
+ 0.1030694246292114,Evo2 1B,43.0,cattle,start codon
38
+ 0.5275959968566895,NTv3 8M (pre),1.0,cattle,start codon
39
+ 0.4962065815925598,NTv3 100M (pre),2.0,cattle,start codon
40
+ 0.5591813921928406,NTv3 650M (pre),5.0,cattle,start codon
41
+ 0.5492052435874939,NTv3 650M (post),7.0,cattle,start codon
42
+ 0.0383123345673084,NTv2 500M,90.0,cattle,intron
43
+ 0.1015273928642273,BPNet arch. 6M,7.0,cattle,intron
44
+ 0.3299930691719055,Residual CNN 44M,23.0,cattle,intron
45
+ 0.3826011121273041,HyenaDNA 7M,20.0,cattle,intron
46
+ 0.5564854741096497,Caduceus 7M,36.0,cattle,intron
47
+ 0.5645747780799866,NTv3 8M (pre),2.0,cattle,intron
48
+ 0.5765650272369385,NTv3 100M (pre),2.0,cattle,intron
49
+ 0.6140890121459961,NTv3 650M (pre),7.0,cattle,intron
50
+ 0.6709504723548889,NTv3 650M (post),10.0,cattle,intron
51
+ 0.3665516376495361,NTv2 500M,88.0,cattle,exon
52
+ 0.323502242565155,BPNet arch. 6M,7.0,cattle,exon
53
+ 0.519285261631012,Residual CNN 44M,23.0,cattle,exon
54
+ 0.1038060635328292,HyenaDNA 7M,21.0,cattle,splice acceptor
55
+ 0.5072187781333923,Caduceus 7M,39.0,cattle,exon
56
+ 0.593974232673645,NTv3 8M (pre),1.0,cattle,exon
57
+ 0.6014777421951294,NTv3 100M (pre),2.0,cattle,exon
58
+ 0.6433462500572205,NTv3 650M (pre),7.0,cattle,exon
59
+ 0.6648420095443726,NTv3 650M (post),9.0,cattle,exon
60
+ 0.0937248468399047,NTv2 500M,89.0,cattle,splice acceptor
61
+ 0.4435675740242004,BPNet arch. 6M,7.0,cattle,splice acceptor
62
+ 0.6590774655342102,Residual CNN 44M,23.0,cattle,splice acceptor
63
+ 0.1038060635328292,HyenaDNA 7M,21.0,cattle,splice acceptor
64
+ 0.6937510371208191,Caduceus 7M,38.0,cattle,splice acceptor
65
+ 0.7248824238777161,NTv3 8M (pre),1.0,cattle,splice acceptor
66
+ 0.7345820069313049,NTv3 100M (pre),2.0,cattle,splice acceptor
67
+ 0.7439091801643372,NTv3 650M (pre),7.0,cattle,splice acceptor
68
+ 0.758992075920105,NTv3 650M (post),9.0,cattle,splice acceptor
69
+ 0.1127461418509483,NTv2 500M,88.0,cattle,start codon
70
+ 0.0901669710874557,BPNet arch. 6M,7.0,cattle,start codon
71
+ 0.3548502624034881,Residual CNN 44M,23.0,cattle,start codon
72
+ 0.0545537285506725,HyenaDNA 7M,24.0,cattle,start codon
73
+ 0.4038819670677185,Caduceus 7M,38.0,cattle,start codon
74
+ 0.5045616030693054,NTv3 8M (pre),1.0,cattle,start codon
75
+ 0.4762806594371795,NTv3 100M (pre),3.0,cattle,start codon
76
+ 0.5610686540603638,NTv3 650M (pre),7.0,cattle,start codon
77
+ 0.5782408118247986,NTv3 650M (post),9.0,cattle,start codon
78
+ 0.1547228246927261,NTv2 500M,85.0,cattle,intron
79
+ 0.0639578104019165,BPNet arch. 6M,2.0,cattle,start codon
80
+ 0.3266464471817016,Residual CNN 44M,23.0,cattle,intron
81
+ 0.4240079522132873,HyenaDNA 7M,23.0,cattle,intron
82
+ 0.4552704095840454,Caduceus 7M,37.0,cattle,intron
83
+ 0.5063548684120178,NTv3 8M (pre),1.0,cattle,intron
84
+ 0.5619235038757324,NTv3 100M (pre),3.0,cattle,intron
85
+ 0.531277596950531,NTv3 650M (pre),7.0,cattle,intron
86
+ 0.6205132603645325,NTv3 650M (post),9.0,cattle,intron
87
+ 0.3413117229938507,NTv2 500M,87.0,cattle,exon
88
+ 0.1383400112390518,BPNet arch. 6M,6.0,cattle,intron
89
+ 0.4856111407279968,Residual CNN 44M,23.0,cattle,exon
90
+ 0.2246854901313781,HyenaDNA 7M,70.0,cattle,exon
91
+ 0.5370016098022461,Caduceus 7M,35.0,cattle,exon
92
+ 0.5721412897109985,NTv3 8M (pre),2.0,cattle,exon
93
+ 0.5819903612136841,NTv3 100M (pre),2.0,cattle,exon
94
+ 0.6183731555938721,NTv3 650M (pre),7.0,cattle,exon
95
+ 0.6233119964599609,NTv3 650M (post),9.0,cattle,exon
96
+ 0.4220209121704101,BPNet arch. 6M,7.0,cattle,splice acceptor
97
+ 0.689546525478363,Residual CNN 44M,23.0,cattle,splice acceptor
98
+ 0.1121769621968269,HyenaDNA 7M,69.0,cattle,splice acceptor
99
+ 0.7314619421958923,Caduceus 7M,37.0,cattle,splice acceptor
100
+ 0.74350905418396,NTv3 8M (pre),2.0,cattle,splice acceptor
101
+ 0.746654748916626,NTv3 100M (pre),2.0,cattle,splice acceptor
102
+ 0.7714020609855652,NTv3 650M (pre),7.0,cattle,splice acceptor
103
+ 0.7809271812438965,NTv3 650M (post),9.0,cattle,splice acceptor
104
+ 0.0930091217160224,BPNet arch. 6M,6.0,cattle,start codon
105
+ 0.423166275024414,Residual CNN 44M,23.0,cattle,start codon
106
+ 0.1253955662250518,HyenaDNA 7M,72.0,cattle,start codon
107
+ 0.33419930934906,Caduceus 7M,37.0,cattle,start codon
108
+ 0.4639334082603454,NTv3 8M (pre),1.0,cattle,start codon
109
+ 0.5102551579475403,NTv3 100M (pre),2.0,cattle,start codon
110
+ 0.5866840481758118,NTv3 650M (pre),7.0,cattle,start codon
111
+ 0.588148832321167,NTv3 650M (post),9.0,cattle,start codon
112
+ 0.4777896404266357,NTv2 500M,33.0,tomato,intron
113
+ 0.3216900527477264,BPNet arch. 6M,1.0,tomato,intron
114
+ 0.46840900182724,Residual CNN 44M,6.0,tomato,intron
115
+ 0.5251263380050659,PlantCAD2 88M,38.0,tomato,intron
116
+ 0.747674286365509,Evo2 1B,13.0,tomato,intron
117
+ 0.6858112812042236,NTv3 8M (pre),0.0,tomato,intron
118
+ 0.7038365006446838,NTv3 100M (pre),0.0,tomato,intron
119
+ 0.7481895685195923,NTv3 650M (pre),1.0,tomato,intron
120
+ 0.7458349466323853,NTv3 650M (post),2.0,tomato,intron
121
+ 0.6147475838661194,NTv2 500M,33.0,tomato,exon
122
+ 0.4551227986812591,BPNet arch. 6M,1.0,tomato,exon
123
+ 0.5068296194076538,Residual CNN 44M,6.0,tomato,exon
124
+ 0.7256030440330505,PlantCAD2 88M,37.0,tomato,exon
125
+ 0.7006198763847351,Evo2 1B,14.0,tomato,exon
126
+ 0.7537696361541748,NTv3 8M (pre),0.0,tomato,exon
127
+ 0.7484462857246399,NTv3 100M (pre),0.0,tomato,exon
128
+ 0.764011561870575,NTv3 650M (pre),1.0,tomato,exon
129
+ 0.7750575542449951,NTv3 650M (post),2.0,tomato,exon
130
+ 0.1691933125257492,NTv2 500M,33.0,tomato,splice acceptor
131
+ 0.125656172633171,BPNet arch. 6M,1.0,tomato,splice acceptor
132
+ 0.4359458982944488,Residual CNN 44M,6.0,tomato,splice acceptor
133
+ 0.744257926940918,PlantCAD2 88M,38.0,tomato,splice acceptor
134
+ 0.3791649639606476,Evo2 1B,13.0,tomato,splice acceptor
135
+ 0.6623862385749817,NTv3 8M (pre),0.0,tomato,splice acceptor
136
+ 0.6843105554580688,NTv3 100M (pre),0.0,tomato,splice acceptor
137
+ 0.7641868591308594,NTv3 650M (pre),1.0,tomato,splice acceptor
138
+ 0.7584431767463684,NTv3 650M (post),2.0,tomato,splice acceptor
139
+ 0.132934883236885,NTv2 500M,34.0,tomato,start codon
140
+ 0.0,BPNet arch. 6M,1.0,tomato,start codon
141
+ 0.088478960096836,Residual CNN 44M,6.0,tomato,start codon
142
+ 0.2019559442996978,PlantCAD2 88M,38.0,tomato,start codon
143
+ 0.1622217148542404,Evo2 1B,13.0,tomato,start codon
144
+ 0.2966536581516266,NTv3 8M (pre),0.0,tomato,start codon
145
+ 0.3968957066535949,NTv3 100M (pre),0.0,tomato,start codon
146
+ 0.4830105900764465,NTv3 650M (pre),1.0,tomato,start codon
147
+ 0.5007501244544983,NTv3 650M (post),2.0,tomato,start codon
148
+ 0.6770024299621582,NTv2 500M,33.0,tomato,intron
149
+ 0.2927957773208618,BPNet arch. 6M,2.0,tomato,intron
150
+ 0.1383400112390518,Residual CNN 44M,6.0,tomato,intron
151
+ 0.7252154350280762,PlantCAD2 88M,46.0,tomato,intron
152
+ 0.712181031703949,NTv3 8M (pre),1.0,tomato,intron
153
+ 0.7515084147453308,NTv3 100M (pre),1.0,tomato,intron
154
+ 0.7400797009468079,NTv3 650M (pre),3.0,tomato,intron
155
+ 0.7532288432121277,NTv3 650M (post),4.0,tomato,intron
156
+ 0.5751976370811462,NTv2 500M,33.0,tomato,exon
157
+ 0.3057552278041839,BPNet arch. 6M,3.0,tomato,exon
158
+ 0.7699167728424072,PlantCAD2 88M,50.0,tomato,exon
159
+ 0.748009443283081,NTv3 8M (pre),1.0,tomato,exon
160
+ 0.7629056572914124,NTv3 100M (pre),1.0,tomato,exon
161
+ 0.7755228877067566,NTv3 650M (pre),3.0,tomato,exon
162
+ 0.782516598701477,NTv3 650M (post),4.0,tomato,exon
163
+ 0.168193981051445,NTv2 500M,33.0,tomato,splice acceptor
164
+ 0.0,BPNet arch. 6M,2.0,tomato,splice acceptor
165
+ 0.4833243191242218,Residual CNN 44M,8.0,tomato,splice acceptor
166
+ 0.7335307598114014,PlantCAD2 88M,46.0,tomato,splice acceptor
167
+ 0.6908777952194214,NTv3 8M (pre),1.0,tomato,splice acceptor
168
+ 0.7348777055740356,NTv3 100M (pre),1.0,tomato,splice acceptor
169
+ 0.7484620809555054,NTv3 650M (pre),3.0,tomato,splice acceptor
170
+ 0.7539154291152954,NTv3 650M (post),4.0,tomato,splice acceptor
171
+ 0.1586925536394119,NTv2 500M,33.0,tomato,start codon
172
+ 0.0,BPNet arch. 6M,2.0,tomato,start codon
173
+ 0.1107296794652938,Residual CNN 44M,8.0,tomato,start codon
174
+ 0.3756755590438843,PlantCAD2 88M,48.0,tomato,start codon
175
+ 0.4113904237747192,NTv3 8M (pre),1.0,tomato,start codon
176
+ 0.4541433155536651,NTv3 100M (pre),1.0,tomato,start codon
177
+ 0.5002310872077942,NTv3 650M (pre),3.0,tomato,start codon
178
+ 0.5470007658004761,NTv3 650M (post),4.0,tomato,start codon
179
+ 0.6712294220924377,NTv2 500M,33.0,tomato,intron
180
+ 0.3502058088779449,BPNet arch. 6M,2.0,tomato,intron
181
+ 0.5514466166496277,Residual CNN 44M,8.0,tomato,intron
182
+ 0.722817599773407,PlantCAD2 88M,88.0,tomato,intron
183
+ 0.7013162970542908,NTv3 8M (pre),1.0,tomato,intron
184
+ 0.747364342212677,NTv3 100M (pre),1.0,tomato,intron
185
+ 0.752423107624054,NTv3 650M (pre),3.0,tomato,intron
186
+ 0.7750566005706787,NTv3 650M (post),4.0,tomato,intron
187
+ 0.6022632718086243,NTv2 500M,33.0,tomato,exon
188
+ 0.3020758032798767,BPNet arch. 6M,2.0,tomato,exon
189
+ 0.4746756553649902,Residual CNN 44M,8.0,tomato,exon
190
+ 0.7354215979576111,PlantCAD2 88M,45.0,tomato,exon
191
+ 0.7157281041145325,NTv3 8M (pre),1.0,tomato,exon
192
+ 0.7326820492744446,NTv3 100M (pre),1.0,tomato,exon
193
+ 0.7308483123779297,NTv3 650M (pre),3.0,tomato,exon
194
+ 0.7417197823524475,NTv3 650M (post),4.0,tomato,exon
195
+ 0.1558358669281005,NTv2 500M,33.0,tomato,splice acceptor
196
+ 0.0,BPNet arch. 6M,2.0,tomato,splice acceptor
197
+ 0.3391502797603607,Residual CNN 44M,8.0,tomato,splice acceptor
198
+ 0.7305923700332642,PlantCAD2 88M,85.0,tomato,splice acceptor
199
+ 0.6977006196975708,NTv3 8M (pre),1.0,tomato,splice acceptor
200
+ 0.6770275831222534,NTv3 100M (pre),1.0,tomato,splice acceptor
201
+ 0.6770390272140503,NTv3 650M (pre),3.0,tomato,splice acceptor
202
+ 0.7287323474884033,NTv3 650M (post),4.0,tomato,splice acceptor
203
+ 0.1887903958559036,NTv2 500M,33.0,tomato,start codon
204
+ 0.0639578104019165,BPNet arch. 6M,2.0,tomato,start codon
205
+ 0.0914037525653839,Residual CNN 44M,8.0,tomato,start codon
206
+ 0.4881043434143066,PlantCAD2 88M,88.0,tomato,start codon
207
+ 0.4309621453285217,NTv3 8M (pre),1.0,tomato,start codon
208
+ 0.4028272926807403,NTv3 100M (pre),1.0,tomato,start codon
209
+ 0.4060510396957397,NTv3 650M (pre),3.0,tomato,start codon
210
+ 0.472331553697586,NTv3 650M (post),4.0,tomato,start codon
211
+ 0.1995969861745834,NTv2 500M,72.0,human,intron
212
+ 0.0296161584556102,BPNet arch. 6M,3.0,human,intron
213
+ 0.2347834408283233,Residual CNN 44M,15.0,human,intron
214
+ 0.33451908826828,HyenaDNA 7M,17.0,human,intron
215
+ 0.4144788980484009,Caduceus 7M,27.0,human,intron
216
+ 0.0,Evo2 1B,34.0,human,intron
217
+ 0.4695742726325989,NTv3 8M (pre),1.0,human,intron
218
+ 0.475054919719696,NTv3 100M (pre),2.0,human,intron
219
+ 0.5504136681556702,NTv3 650M (pre),5.0,human,intron
220
+ 0.5643875002861023,NTv3 650M (post),6.0,human,intron
221
+ 0.1995969861745834,NTv2 500M,72.0,human,intron
222
+ 0.2706590592861175,BPNet arch. 6M,3.0,human,exon
223
+ 0.2678671479225158,Residual CNN 44M,15.0,human,exon
224
+ 0.179698497056961,HyenaDNA 7M,19.0,human,exon
225
+ 0.5098947286605835,Caduceus 7M,26.0,human,exon
226
+ 0.4510694444179535,Evo2 1B,34.0,human,exon
227
+ 0.6089931726455688,NTv3 8M (pre),1.0,human,exon
228
+ 0.6492856740951538,NTv3 100M (pre),2.0,human,exon
229
+ 0.6975767016410828,NTv3 650M (pre),5.0,human,exon
230
+ 0.6822624206542969,NTv3 650M (post),8.0,human,exon
231
+ 0.1493269056081771,NTv2 500M,73.0,human,splice acceptor
232
+ 0.3807527124881744,BPNet arch. 6M,3.0,human,splice acceptor
233
+ 0.6632664203643799,Residual CNN 44M,15.0,human,splice acceptor
234
+ 0.1002769619226455,HyenaDNA 7M,17.0,human,splice acceptor
235
+ 0.7357247471809387,Caduceus 7M,24.0,human,splice acceptor
236
+ 0.1821079105138778,Evo2 1B,34.0,human,splice acceptor
237
+ 0.7726271748542786,NTv3 8M (pre),1.0,human,splice acceptor
238
+ 0.77947598695755,NTv3 100M (pre),2.0,human,splice acceptor
239
+ 0.8028115034103394,NTv3 650M (pre),5.0,human,splice acceptor
240
+ 0.7979229092597961,NTv3 650M (post),7.0,human,splice acceptor
241
+ 0.139576569199562,NTv2 500M,73.0,human,start codon
242
+ 0.1334401220083236,BPNet arch. 6M,3.0,human,start codon
243
+ 0.3876807987689972,Residual CNN 44M,15.0,human,start codon
244
+ 0.1003016158938407,HyenaDNA 7M,18.0,human,start codon
245
+ 0.3958532512187958,Caduceus 7M,24.0,human,start codon
246
+ 0.1399599611759185,Evo2 1B,34.0,human,start codon
247
+ 0.540923535823822,NTv3 8M (pre),1.0,human,start codon
248
+ 0.5464004278182983,NTv3 100M (pre),2.0,human,start codon
249
+ 0.6803378462791443,NTv3 650M (pre),5.0,human,start codon
250
+ 0.7310947179794312,NTv3 650M (post),7.0,human,start codon
251
+ 0.0814515128731727,NTv2 500M,72.0,human,intron
252
+ 0.0172978900372982,BPNet arch. 6M,5.0,human,intron
253
+ 0.2740728259086609,Residual CNN 44M,19.0,human,intron
254
+ 0.3312098085880279,HyenaDNA 7M,21.0,human,intron
255
+ 0.5108950138092041,Caduceus 7M,33.0,human,intron
256
+ 0.5034915208816528,NTv3 8M (pre),1.0,human,intron
257
+ 0.5154411792755127,NTv3 100M (pre),2.0,human,intron
258
+ 0.5814740061759949,NTv3 650M (pre),6.0,human,intron
259
+ 0.5920455455780029,NTv3 650M (post),8.0,human,intron
260
+ 0.3505669236183166,NTv2 500M,72.0,human,exon
261
+ 0.2252149283885955,BPNet arch. 6M,5.0,human,exon
262
+ 0.4010578095912933,Residual CNN 44M,18.0,human,exon
263
+ 0.1851459741592407,HyenaDNA 7M,18.0,human,exon
264
+ 0.4599409103393554,Caduceus 7M,33.0,human,exon
265
+ 0.5931490063667297,NTv3 8M (pre),1.0,human,exon
266
+ 0.6058318018913269,NTv3 100M (pre),2.0,human,exon
267
+ 0.6738048791885376,NTv3 650M (pre),6.0,human,exon
268
+ 0.6738048791885376,NTv3 650M (post),6.0,human,exon
269
+ 0.1533636748790741,NTv2 500M,72.0,human,splice acceptor
270
+ 0.3751010596752167,BPNet arch. 6M,5.0,human,splice acceptor
271
+ 0.681228756904602,Residual CNN 44M,19.0,human,splice acceptor
272
+ 0.0252278540283441,HyenaDNA 7M,22.0,human,splice acceptor
273
+ 0.7485092878341675,Caduceus 7M,35.0,human,splice acceptor
274
+ 0.7772909998893738,NTv3 8M (pre),1.0,human,splice acceptor
275
+ 0.794090747833252,NTv3 100M (pre),2.0,human,splice acceptor
276
+ 0.8239933252334595,NTv3 650M (pre),6.0,human,splice acceptor
277
+ 0.804115891456604,NTv3 650M (post),8.0,human,splice acceptor
278
+ 0.0851806029677391,NTv2 500M,72.0,human,start codon
279
+ 0.0,BPNet arch. 6M,5.0,human,start codon
280
+ 0.3292546272277832,Residual CNN 44M,19.0,human,start codon
281
+ 0.0647941380739212,HyenaDNA 7M,20.0,human,start codon
282
+ 0.4505241215229034,Caduceus 7M,33.0,human,start codon
283
+ 0.60422682762146,NTv3 8M (pre),1.0,human,start codon
284
+ 0.6015576124191284,NTv3 100M (pre),2.0,human,start codon
285
+ 0.6452956795692444,NTv3 650M (pre),6.0,human,start codon
286
+ 0.6761345267295837,NTv3 650M (post),8.0,human,start codon
287
+ 0.0558800511062145,NTv2 500M,70.0,human,intron
288
+ 0.0185965970158576,BPNet arch. 6M,5.0,human,intron
289
+ 0.2623045742511749,Residual CNN 44M,18.0,human,intron
290
+ 0.3633092641830444,HyenaDNA 7M,68.0,human,intron
291
+ 0.4261827170848846,Caduceus 7M,29.0,human,intron
292
+ 0.4804849028587341,NTv3 8M (pre),1.0,human,intron
293
+ 0.482195496559143,NTv3 100M (pre),2.0,human,intron
294
+ 0.5425574779510498,NTv3 650M (pre),6.0,human,intron
295
+ 0.5443048477172852,NTv3 650M (post),8.0,human,intron
296
+ 0.3958893716335296,NTv2 500M,71.0,human,exon
297
+ 0.2360571771860122,BPNet arch. 6M,5.0,human,exon
298
+ 0.2360571771860122,Residual CNN 44M,5.0,human,exon
299
+ 0.1936572045087814,HyenaDNA 7M,68.0,human,exon
300
+ 0.5046994090080261,Caduceus 7M,29.0,human,exon
301
+ 0.6339762210845947,NTv3 8M (pre),1.0,human,exon
302
+ 0.6433913111686707,NTv3 100M (pre),2.0,human,exon
303
+ 0.6518793702125549,NTv3 650M (pre),6.0,human,exon
304
+ 0.6812491416931152,NTv3 650M (post),8.0,human,exon
305
+ 0.1248077526688575,NTv2 500M,70.0,human,splice acceptor
306
+ 0.3842235207557678,BPNet arch. 6M,5.0,human,splice acceptor
307
+ 0.6810190081596375,Residual CNN 44M,18.0,human,splice acceptor
308
+ 0.0527583621442317,HyenaDNA 7M,17.0,human,splice acceptor
309
+ 0.7072214484214783,Caduceus 7M,29.0,human,splice acceptor
310
+ 0.7796080708503723,NTv3 8M (pre),1.0,human,splice acceptor
311
+ 0.7596970200538635,NTv3 100M (pre),2.0,human,splice acceptor
312
+ 0.7915040850639343,NTv3 650M (pre),6.0,human,splice acceptor
313
+ 0.7957100868225098,NTv3 650M (post),8.0,human,splice acceptor
314
+ 0.1267423331737518,NTv2 500M,70.0,human,start codon
315
+ 0.1114460304379463,BPNet arch. 6M,5.0,human,start codon
316
+ 0.3342535495758056,Residual CNN 44M,18.0,human,start codon
317
+ 0.1215013489127159,HyenaDNA 7M,18.0,human,start codon
318
+ 0.4082835018634796,Caduceus 7M,29.0,human,start codon
319
+ 0.5167152881622314,NTv3 8M (pre),1.0,human,start codon
320
+ 0.5340564250946045,NTv3 100M (pre),2.0,human,start codon
321
+ 0.6148532032966614,NTv3 650M (pre),6.0,human,start codon
322
+ 0.6582212448120117,NTv3 650M (post),8.0,human,start codon
data/bigwig_dataset.csv CHANGED
The diff for this file is too large to render. See raw diff
 
src/streamlit_app.py CHANGED
@@ -6,6 +6,7 @@ import streamlit as st
6
  import plotly.express as px
7
  from plotly.subplots import make_subplots
8
  import plotly.graph_objects as go
 
9
 
10
  # ---------------------------------------------------------------------
11
  # Page config (must be the first Streamlit command)
@@ -68,6 +69,24 @@ MODEL_COLORS = {
68
  "Caduceus 7M": COLORS["purple_2"]
69
  }
70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  MODEL_NAMES = list(MODEL_COLORS.keys())
72
 
73
  PLANT_SPECIES = ["tomato", "rice", "maize", "arabidopsis"]
@@ -81,12 +100,25 @@ SPECIES_GROUPS = {
81
 
82
  _LAST_UPDATED = "Dec 10, 2025"
83
  _INTRO = """
84
- Benchmark across gene annotation and functionnal tracks.
85
-
86
- - **Pearson correlations (multi-assay)**: per-dataset scores across species and models.
87
- - **MCC (bed tracks)**: per-track MCC values across species and models.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
 
89
- These tasks measure the model's ability the generalize to unseen tracks, species and assay types.
90
  """
91
 
92
  HERE = os.path.dirname(os.path.abspath(__file__)) # /app/src
@@ -111,6 +143,9 @@ def load_raw_data():
111
 
112
  return pearson_df, mcc_df
113
 
 
 
 
114
 
115
  @st.cache_data
116
  def load_expanded_data():
@@ -129,6 +164,12 @@ def load_expanded_data():
129
  we average their Score.
130
  """
131
  pearson_df, mcc_df = load_raw_data()
 
 
 
 
 
 
132
 
133
  # --- Pearson correlations ---
134
  # Expect columns: species, assay_type, datasets, model_name, pearson correlation
@@ -143,10 +184,14 @@ def load_expanded_data():
143
  if "assay_type" in pearson_df.columns:
144
  pearson_group_cols.append("assay_type")
145
 
 
 
 
 
146
  pearson_df = (
147
  pearson_df
148
- .groupby(pearson_group_cols, as_index=False, dropna=False)["Score"]
149
- .mean()
150
  )
151
 
152
  # --- MCC (bed tracks) ---
@@ -160,10 +205,14 @@ def load_expanded_data():
160
 
161
  # Collapse duplicates with same (species, datasets, Model)
162
  mcc_group_cols = ["species", "datasets", "Model"]
 
 
 
 
163
  mcc_df = (
164
  mcc_df
165
- .groupby(mcc_group_cols, as_index=False, dropna=False)["Score"]
166
- .mean()
167
  )
168
 
169
  # Optional sanity checks
@@ -255,7 +304,7 @@ def build_leaderboard(
255
  )
256
 
257
  if df.empty:
258
- return pd.DataFrame(columns=["Model", "Num entries", "Mean score"])
259
 
260
  agg = (
261
  df.groupby("Model")["Score"]
@@ -269,15 +318,22 @@ def build_leaderboard(
269
  df.groupby("Model")["Score"].count().reindex(agg["Model"]).values
270
  )
271
 
 
 
 
 
272
  agg = agg.sort_values("Mean score", ascending=False).reset_index(drop=True)
273
- agg = agg[["Model", "Num entries", "Mean score"]]
274
-
 
 
275
  # Ensure the index starts with 1
276
  agg.index += 1
277
 
278
  return agg
279
 
280
 
 
281
  def build_bar_df(
282
  benchmark_name: str,
283
  selected_species: List[str],
@@ -587,6 +643,39 @@ def plot_radar(
587
  return fig
588
 
589
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
590
 
591
  # ---------------------------------------------------------------------
592
  # UI helpers
@@ -604,12 +693,9 @@ def sidebar_toggle(label: str, value: bool = False, key: str | None = None) -> b
604
  # Fallback for older Streamlit versions
605
  return st.sidebar.checkbox(label, value=value, key=key)
606
 
607
-
608
  # ---------------------------------------------------------------------
609
  # Streamlit UI
610
  # ---------------------------------------------------------------------
611
-
612
-
613
  def main():
614
  st.title("🧬 NTv3 Benchmark")
615
  st.markdown(_INTRO)
@@ -653,7 +739,6 @@ def main():
653
  if not available_species:
654
  st.sidebar.info(f"No {species_group.lower()} species available for this benchmark.")
655
 
656
-
657
  # Assay toggles (Pearson only), based on filtered species
658
  if cfg.get("has_assay_type", False):
659
  st.sidebar.subheader("Assay types")
@@ -673,7 +758,6 @@ def main():
673
  else:
674
  selected_assays = []
675
 
676
-
677
  # Bed track / dataset toggles (MCC only), based on species selection
678
  selected_datasets: List[str] = []
679
  if benchmark_name == "Genome Annotation":
@@ -707,8 +791,8 @@ def main():
707
  col1, col2 = st.columns([1, 1])
708
 
709
  with col1:
710
- st.subheader("🏅 Leaderboard (per model)")
711
- st.write("\n") # 👈 spacer to match plotly padding
712
  st.write("\n")
713
  st.write("\n")
714
  if leaderboard_df.empty:
@@ -716,7 +800,6 @@ def main():
716
  else:
717
  st.dataframe(leaderboard_df, use_container_width=True)
718
 
719
-
720
  with col2:
721
  st.subheader("📈 Mean score per model")
722
  if bar_df.empty:
@@ -724,7 +807,6 @@ def main():
724
  else:
725
  # Order models by performance (least -> most)
726
  bar_df = bar_df.sort_values("Mean score", ascending=True)
727
-
728
  model_order = bar_df["Model"].tolist()
729
 
730
  fig = px.bar(
@@ -733,30 +815,28 @@ def main():
733
  y="Mean score",
734
  color="Model",
735
  color_discrete_map=MODEL_COLORS,
736
- category_orders={"Model": model_order}, # enforce ordering on x
737
  )
738
  fig.update_layout(
739
  barmode="group",
740
- height=500,
741
  xaxis_title="",
742
- yaxis_title="Mean score",
743
  plot_bgcolor="rgba(0,0,0,0)",
744
  paper_bgcolor="rgba(0,0,0,0)",
745
  bargap=0.08,
746
  )
747
-
748
- # Hide x-axis model names (same style as the panels)
749
  fig.update_xaxes(showticklabels=False)
750
-
751
  st.plotly_chart(fig, use_container_width=True)
752
 
753
-
754
  # --- Breakdown plot: assay_type (Functional Tracks) OR datasets (Genome Annotation) ---
755
  breakdown_df = build_category_model_df(
756
  benchmark_name, selected_species, selected_assays, selected_models, selected_datasets
757
  )
758
 
759
- st.subheader("🧪 Mean score by assay type / dataset (all models)")
 
 
760
  if breakdown_df.empty:
761
  st.info("No data for the selected filters.")
762
  else:
@@ -767,30 +847,13 @@ def main():
767
  )
768
  st.plotly_chart(fig_breakdown, use_container_width=True)
769
 
770
- st.subheader("🕸️ Performance by assay type / dataset (radar)")
771
- radar_df = build_radar_df(
772
- benchmark_name,
773
- selected_species,
774
- selected_assays,
775
- selected_models,
776
- selected_datasets,
777
- )
778
-
779
- if radar_df.empty:
780
- st.info("No data for the selected filters.")
781
- else:
782
- fig_radar = plot_radar(
783
- radar_df,
784
- metric_label=cfg["metric_label"],
785
- )
786
- st.plotly_chart(fig_radar, use_container_width=True)
787
-
788
- st.subheader("⚖️ Model comparison")
789
-
790
  left, right = st.columns([1, 1], gap="large")
791
 
792
  with left:
793
- st.markdown("#### Head-to-head (per track)")
794
 
795
  model_picker_options = selected_models if selected_models else _ALL_MODELS
796
  default_a = model_picker_options[0] if model_picker_options else _ALL_MODELS[0]
@@ -839,7 +902,6 @@ def main():
839
  if c in scatter_df.columns:
840
  hover_cols.append(c)
841
 
842
- # Model A on Y, Model B on X
843
  fig_scatter = px.scatter(
844
  scatter_df,
845
  x="Model B",
@@ -848,7 +910,6 @@ def main():
848
  hover_data=hover_cols,
849
  )
850
 
851
- # Red diagonal y=x
852
  fig_scatter.add_shape(
853
  type="line",
854
  x0=axis_range[0], y0=axis_range[0],
@@ -857,7 +918,6 @@ def main():
857
  line=dict(color="red", dash="dot", width=2),
858
  )
859
 
860
- # Square + identical scale/ticks (works even with use_container_width=True)
861
  fig_scatter.update_layout(
862
  height=550,
863
  margin=dict(l=60, r=20, t=20, b=60),
@@ -871,7 +931,7 @@ def main():
871
  title=f"{model_a} — {cfg['metric_label']}",
872
  range=axis_range,
873
  dtick=tick_step,
874
- scaleanchor="x", # lock y to x
875
  scaleratio=1,
876
  constrain="domain",
877
  ),
@@ -882,9 +942,9 @@ def main():
882
  st.plotly_chart(fig_scatter, use_container_width=True)
883
 
884
  with right:
885
- st.markdown("#### All models (distribution across tracks)")
886
 
887
- violin_df = build_violin_df(
888
  benchmark_name,
889
  selected_species,
890
  selected_assays,
@@ -892,49 +952,87 @@ def main():
892
  selected_datasets,
893
  )
894
 
895
- if violin_df.empty:
896
- st.info("No data for the selected filters.")
897
  else:
898
- # Order models by median performance (least -> most)
899
- model_order = (
900
- violin_df
901
- .groupby("Model")["Score"]
902
- .median()
903
- .sort_values(ascending=True)
904
- .index
905
- .tolist()
906
- )
907
-
908
- fig_violin = px.violin(
909
- violin_df,
910
- x="Model",
911
- y="Score",
912
- color="Model",
913
- color_discrete_map=MODEL_COLORS,
914
- box=True, # keep inner boxplot
915
- points=False, # 👈 remove all dots
916
- category_orders={"Model": model_order}, # 👈 enforce ordering
917
  )
918
-
919
- fig_violin.update_layout(
920
- height=650,
921
- xaxis_title="",
922
- yaxis_title=cfg["metric_label"],
 
 
 
 
 
923
  plot_bgcolor="rgba(0,0,0,0)",
924
  paper_bgcolor="rgba(0,0,0,0)",
925
- showlegend=False,
926
  )
927
-
928
- fig_violin.update_traces(
929
- box_visible=True,
930
- meanline_visible=False,
931
  )
 
932
 
933
- # Optional: hide model names if you prefer a cleaner look
934
- # fig_violin.update_xaxes(showticklabels=False)
 
 
935
 
936
- st.plotly_chart(fig_violin, use_container_width=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
937
 
 
938
 
939
 
940
  if __name__ == "__main__":
 
6
  import plotly.express as px
7
  from plotly.subplots import make_subplots
8
  import plotly.graph_objects as go
9
+ import numpy as np
10
 
11
  # ---------------------------------------------------------------------
12
  # Page config (must be the first Streamlit command)
 
69
  "Caduceus 7M": COLORS["purple_2"]
70
  }
71
 
72
+ MODEL_TRAINING_STATUS = {
73
+ "NTv3 650M (post)": "POST",
74
+ "NTv3 650M (pre)": "PRE",
75
+ "NTv3 100M (pre)": "PRE",
76
+ "NTv3 8M (pre)": "PRE",
77
+ "Residual CNN 44M": "SCRATCH",
78
+ "Caduceus 7M": "PRE",
79
+ "Evo2 1B": "PRE",
80
+ "NTv2 500M": "PRE",
81
+ "BPNet arch. 6M": "SCRATCH",
82
+ "PlantCAD2 88M": "PRE",
83
+ }
84
+
85
+ MODEL_GPU_MULTIPLIER = {
86
+ "Evo2 1B": 8, # trained on 8 GPUs
87
+ }
88
+
89
+
90
  MODEL_NAMES = list(MODEL_COLORS.keys())
91
 
92
  PLANT_SPECIES = ["tomato", "rice", "maize", "arabidopsis"]
 
100
 
101
  _LAST_UPDATED = "Dec 10, 2025"
102
  _INTRO = """
103
+ The **NTv3 Benchmark** is a curated benchmark of 106 long-range genomic datasets
104
+ designed to evaluate models under realistic 32 kb input, single-base-pair output settings.
105
+ The dataset spans two complementary task families: genome annotation (exon, intron, splice acceptor, start codon)
106
+ and functional-regulatory prediction, which includes diverse experimental tracks such as chromatin accessibility,
107
+ histone modifications, transcription initiation (PRO-cap), RNA binding (eCLIP), gene expression (RNA-seq),
108
+ and translation (Ribo-seq).
109
+
110
+ Data are drawn from a phylogenetically diverse set of species, including organisms seen during post-training
111
+ (human, chicken, Arabidopsis, rice, maize) and entirely unseen species (cattle, tomato), with careful curation
112
+ to avoid data leakage. This design allows the dataset to probe long-range sequence-to-function mapping,
113
+ cross-species generalization, and transfer across heterogeneous regulatory modalities,
114
+ including assays not present in prior multispecies training corpora. By standardizing sequence length,
115
+ resolution, and evaluation metrics across all tracks, \brandbenchmark provides a controlled dataset
116
+ for comparing representation quality across genomic foundation models.
117
+
118
+ The metrics used are:
119
+ - **Pearson correlations (multi-assay)**: per-dataset scores across species and models for functional tracks.
120
+ - **MCC (bed tracks)**: per-track MCC values across species and models for gene annotation tracks.
121
 
 
122
  """
123
 
124
  HERE = os.path.dirname(os.path.abspath(__file__)) # /app/src
 
143
 
144
  return pearson_df, mcc_df
145
 
146
+ def _normalize_training_hours(df: pd.DataFrame) -> pd.DataFrame:
147
+ return df.rename(columns={"running_time_hours": "GPU hours"})
148
+
149
 
150
  @st.cache_data
151
  def load_expanded_data():
 
164
  we average their Score.
165
  """
166
  pearson_df, mcc_df = load_raw_data()
167
+ pearson_df = _normalize_training_hours(pearson_df)
168
+ mcc_df = _normalize_training_hours(mcc_df)
169
+
170
+ if "track_name_clean" in pearson_df.columns:
171
+ pearson_df = pearson_df.drop(columns=["datasets"], errors="ignore")
172
+ pearson_df = pearson_df.rename(columns={"track_name_clean": "datasets"})
173
 
174
  # --- Pearson correlations ---
175
  # Expect columns: species, assay_type, datasets, model_name, pearson correlation
 
184
  if "assay_type" in pearson_df.columns:
185
  pearson_group_cols.append("assay_type")
186
 
187
+ agg_cols = {"Score": "mean"}
188
+ if "GPU hours" in pearson_df.columns:
189
+ agg_cols["GPU hours"] = "mean"
190
+
191
  pearson_df = (
192
  pearson_df
193
+ .groupby(pearson_group_cols, as_index=False, dropna=False)
194
+ .agg(agg_cols)
195
  )
196
 
197
  # --- MCC (bed tracks) ---
 
205
 
206
  # Collapse duplicates with same (species, datasets, Model)
207
  mcc_group_cols = ["species", "datasets", "Model"]
208
+ agg_cols = {"Score": "mean"}
209
+ if "GPU hours" in mcc_df.columns:
210
+ agg_cols["GPU hours"] = "mean"
211
+
212
  mcc_df = (
213
  mcc_df
214
+ .groupby(mcc_group_cols, as_index=False, dropna=False)
215
+ .agg(agg_cols)
216
  )
217
 
218
  # Optional sanity checks
 
304
  )
305
 
306
  if df.empty:
307
+ return pd.DataFrame(columns=["Model", "Model Type", "Num entries", "Mean score"])
308
 
309
  agg = (
310
  df.groupby("Model")["Score"]
 
318
  df.groupby("Model")["Score"].count().reindex(agg["Model"]).values
319
  )
320
 
321
+ # 👇 Add training regime column
322
+ agg["Training"] = agg["Model"].map(MODEL_TRAINING_STATUS).fillna("UNKNOWN")
323
+
324
+ # Sort by performance
325
  agg = agg.sort_values("Mean score", ascending=False).reset_index(drop=True)
326
+
327
+ # Column order
328
+ agg = agg[["Model", "Training", "Num entries", "Mean score"]]
329
+
330
  # Ensure the index starts with 1
331
  agg.index += 1
332
 
333
  return agg
334
 
335
 
336
+
337
  def build_bar_df(
338
  benchmark_name: str,
339
  selected_species: List[str],
 
643
  return fig
644
 
645
 
646
+ def build_convergence_df(
647
+ benchmark_name: str,
648
+ selected_species: List[str],
649
+ selected_assays: List[str],
650
+ selected_models: List[str],
651
+ selected_datasets: List[str],
652
+ ) -> pd.DataFrame:
653
+ df = filter_base_df(
654
+ benchmark_name,
655
+ selected_species,
656
+ selected_assays,
657
+ selected_models,
658
+ selected_datasets,
659
+ )
660
+
661
+ if df.empty or "GPU hours" not in df.columns:
662
+ return pd.DataFrame(columns=["Model", "GPU hours", "Performance"])
663
+
664
+ out = (
665
+ df.groupby("Model", as_index=False)
666
+ .agg({"Score": "mean", "GPU hours": "mean"})
667
+ .rename(columns={"Score": "Performance"})
668
+ )
669
+
670
+ # Apply per-model multiplier (default 1)
671
+ out["GPU multiplier"] = out["Model"].map(MODEL_GPU_MULTIPLIER).fillna(1).astype(float)
672
+ out["GPU hours"] = out["GPU hours"] * out["GPU multiplier"]
673
+
674
+ out = out.dropna(subset=["GPU hours", "Performance"])
675
+ out["Performance"] = out["Performance"].round(3)
676
+ out["GPU hours"] = out["GPU hours"].round(1)
677
+
678
+ return out
679
 
680
  # ---------------------------------------------------------------------
681
  # UI helpers
 
693
  # Fallback for older Streamlit versions
694
  return st.sidebar.checkbox(label, value=value, key=key)
695
 
 
696
  # ---------------------------------------------------------------------
697
  # Streamlit UI
698
  # ---------------------------------------------------------------------
 
 
699
  def main():
700
  st.title("🧬 NTv3 Benchmark")
701
  st.markdown(_INTRO)
 
739
  if not available_species:
740
  st.sidebar.info(f"No {species_group.lower()} species available for this benchmark.")
741
 
 
742
  # Assay toggles (Pearson only), based on filtered species
743
  if cfg.get("has_assay_type", False):
744
  st.sidebar.subheader("Assay types")
 
758
  else:
759
  selected_assays = []
760
 
 
761
  # Bed track / dataset toggles (MCC only), based on species selection
762
  selected_datasets: List[str] = []
763
  if benchmark_name == "Genome Annotation":
 
791
  col1, col2 = st.columns([1, 1])
792
 
793
  with col1:
794
+ st.subheader("🏅 Leaderboard")
795
+ st.write("\n") # spacer to match plotly padding
796
  st.write("\n")
797
  st.write("\n")
798
  if leaderboard_df.empty:
 
800
  else:
801
  st.dataframe(leaderboard_df, use_container_width=True)
802
 
 
803
  with col2:
804
  st.subheader("📈 Mean score per model")
805
  if bar_df.empty:
 
807
  else:
808
  # Order models by performance (least -> most)
809
  bar_df = bar_df.sort_values("Mean score", ascending=True)
 
810
  model_order = bar_df["Model"].tolist()
811
 
812
  fig = px.bar(
 
815
  y="Mean score",
816
  color="Model",
817
  color_discrete_map=MODEL_COLORS,
818
+ category_orders={"Model": model_order},
819
  )
820
  fig.update_layout(
821
  barmode="group",
822
+ height=480,
823
  xaxis_title="",
824
+ yaxis_title=cfg["metric_label"],
825
  plot_bgcolor="rgba(0,0,0,0)",
826
  paper_bgcolor="rgba(0,0,0,0)",
827
  bargap=0.08,
828
  )
 
 
829
  fig.update_xaxes(showticklabels=False)
 
830
  st.plotly_chart(fig, use_container_width=True)
831
 
 
832
  # --- Breakdown plot: assay_type (Functional Tracks) OR datasets (Genome Annotation) ---
833
  breakdown_df = build_category_model_df(
834
  benchmark_name, selected_species, selected_assays, selected_models, selected_datasets
835
  )
836
 
837
+ type_of_data = "assay type" if benchmark_name == "Functional Tracks" else "gene annotation"
838
+
839
+ st.subheader(f"🧪 Mean score by {type_of_data}")
840
  if breakdown_df.empty:
841
  st.info("No data for the selected filters.")
842
  else:
 
847
  )
848
  st.plotly_chart(fig_breakdown, use_container_width=True)
849
 
850
+ # ------------------------------------------------------------------
851
+ # Model comparison: Head-to-head (left) + Convergence (right)
852
+ # ------------------------------------------------------------------
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
853
  left, right = st.columns([1, 1], gap="large")
854
 
855
  with left:
856
+ st.markdown("#### ⚖️ Head-to-head (per track)")
857
 
858
  model_picker_options = selected_models if selected_models else _ALL_MODELS
859
  default_a = model_picker_options[0] if model_picker_options else _ALL_MODELS[0]
 
902
  if c in scatter_df.columns:
903
  hover_cols.append(c)
904
 
 
905
  fig_scatter = px.scatter(
906
  scatter_df,
907
  x="Model B",
 
910
  hover_data=hover_cols,
911
  )
912
 
 
913
  fig_scatter.add_shape(
914
  type="line",
915
  x0=axis_range[0], y0=axis_range[0],
 
918
  line=dict(color="red", dash="dot", width=2),
919
  )
920
 
 
921
  fig_scatter.update_layout(
922
  height=550,
923
  margin=dict(l=60, r=20, t=20, b=60),
 
931
  title=f"{model_a} — {cfg['metric_label']}",
932
  range=axis_range,
933
  dtick=tick_step,
934
+ scaleanchor="x",
935
  scaleratio=1,
936
  constrain="domain",
937
  ),
 
942
  st.plotly_chart(fig_scatter, use_container_width=True)
943
 
944
  with right:
945
+ st.markdown("#### ⏱️ Time to convergence")
946
 
947
+ conv_df = build_convergence_df(
948
  benchmark_name,
949
  selected_species,
950
  selected_assays,
 
952
  selected_datasets,
953
  )
954
 
955
+ if conv_df.empty:
956
+ st.info("No training-time data found for the selected filters (missing 'GPU hours').")
957
  else:
958
+ fig_conv = px.scatter(
959
+ conv_df,
960
+ x="GPU hours",
961
+ y="Performance",
962
+ text="Model",
963
+ hover_data=["Model", "GPU hours", "Performance"],
 
 
 
 
 
 
 
 
 
 
 
 
 
964
  )
965
+ fig_conv.update_traces(textposition="top center")
966
+ fig_conv.update_layout(
967
+ height=630, # match left panel height
968
+ xaxis=dict(
969
+ title="GPU hours",
970
+ type="log", # 👈 log scale
971
+ ),
972
+ yaxis=dict(
973
+ title=cfg["metric_label"],
974
+ ),
975
  plot_bgcolor="rgba(0,0,0,0)",
976
  paper_bgcolor="rgba(0,0,0,0)",
 
977
  )
978
+ fig_conv.update_xaxes(
979
+ type="log",
980
+ range=[0, np.log10(conv_df["GPU hours"].max())], # log10(1) = 0
981
+ title="GPU hours (log scale)",
982
  )
983
+ st.plotly_chart(fig_conv, use_container_width=True)
984
 
985
+ # ------------------------------------------------------------------
986
+ # Violin (full width, below)
987
+ # ------------------------------------------------------------------
988
+ st.subheader("🎻 Performance comparaison across tracks")
989
 
990
+ violin_df = build_violin_df(
991
+ benchmark_name,
992
+ selected_species,
993
+ selected_assays,
994
+ selected_models,
995
+ selected_datasets,
996
+ )
997
+
998
+ if violin_df.empty:
999
+ st.info("No data for the selected filters.")
1000
+ else:
1001
+ model_order = (
1002
+ violin_df
1003
+ .groupby("Model")["Score"]
1004
+ .median()
1005
+ .sort_values(ascending=True)
1006
+ .index
1007
+ .tolist()
1008
+ )
1009
+
1010
+ fig_violin = px.violin(
1011
+ violin_df,
1012
+ x="Model",
1013
+ y="Score",
1014
+ color="Model",
1015
+ color_discrete_map=MODEL_COLORS,
1016
+ box=True,
1017
+ points=False,
1018
+ category_orders={"Model": model_order},
1019
+ )
1020
+
1021
+ fig_violin.update_layout(
1022
+ height=650,
1023
+ xaxis_title="",
1024
+ yaxis_title=cfg["metric_label"],
1025
+ plot_bgcolor="rgba(0,0,0,0)",
1026
+ paper_bgcolor="rgba(0,0,0,0)",
1027
+ showlegend=False,
1028
+ )
1029
+
1030
+ fig_violin.update_traces(
1031
+ box_visible=True,
1032
+ meanline_visible=False,
1033
+ )
1034
 
1035
+ st.plotly_chart(fig_violin, use_container_width=True)
1036
 
1037
 
1038
  if __name__ == "__main__":