@weng-lab/genomebrowser-ui 0.1.9 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/TrackSelect/Data/{modifiedHumanTracks.json.d.ts → humanBiosamples.json.d.ts} +40705 -20804
- package/dist/TrackSelect/Data/mouseBiosamples.json.d.ts +10346 -0
- package/dist/TrackSelect/DataGrid/GroupingCell.d.ts +2 -0
- package/dist/TrackSelect/DataGrid/dataGridHelpers.d.ts +25 -6
- package/dist/TrackSelect/TrackSelect.d.ts +4 -1
- package/dist/TrackSelect/TreeView/treeViewHelpers.d.ts +1 -1
- package/dist/TrackSelect/consts.d.ts +6 -17
- package/dist/TrackSelect/store.d.ts +2 -1
- package/dist/TrackSelect/types.d.ts +5 -0
- package/dist/genomebrowser-ui.es.js +1173 -951
- package/dist/genomebrowser-ui.es.js.map +1 -1
- package/dist/lib.d.ts +0 -2
- package/package.json +2 -2
- package/src/TrackSelect/Data/formatBiosamples.go +254 -0
- package/src/TrackSelect/Data/{modifiedHumanTracks.json → humanBiosamples.json} +40704 -20804
- package/src/TrackSelect/Data/mouseBiosamples.json +10343 -0
- package/src/TrackSelect/DataGrid/DataGridWrapper.tsx +13 -6
- package/src/TrackSelect/DataGrid/GroupingCell.tsx +144 -0
- package/src/TrackSelect/DataGrid/columns.tsx +7 -0
- package/src/TrackSelect/DataGrid/dataGridHelpers.tsx +64 -19
- package/src/TrackSelect/TrackSelect.tsx +86 -27
- package/src/TrackSelect/TreeView/TreeViewWrapper.tsx +1 -1
- package/src/TrackSelect/TreeView/treeViewHelpers.tsx +65 -17
- package/src/TrackSelect/consts.ts +30 -30
- package/src/TrackSelect/issues.md +404 -0
- package/src/TrackSelect/store.ts +16 -6
- package/src/TrackSelect/types.ts +8 -0
- package/src/lib.ts +0 -3
- package/test/main.tsx +399 -17
- package/dist/TrackSelect/treeViewHelpers.d.ts +0 -1
- package/src/TrackSelect/.claude/settings.local.json +0 -7
- package/src/TrackSelect/Data/humanTracks.json +0 -35711
- package/src/TrackSelect/Data/human_chromhmm_biosamples_with_all_urls.json +0 -35716
- package/src/TrackSelect/bug.md +0 -4
- package/src/TrackSelect/treeViewHelpers.tsx +0 -0
package/dist/lib.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { default as TrackSelect, TrackSelectProps } from './TrackSelect/TrackSelect';
|
|
2
2
|
import { createSelectionStore, SelectionStoreInstance } from './TrackSelect/store.ts';
|
|
3
|
-
import { rowById } from './TrackSelect/consts.ts';
|
|
4
3
|
import { RowInfo } from './TrackSelect/types.ts';
|
|
5
4
|
export { TrackSelect, TrackSelectProps };
|
|
6
5
|
export { createSelectionStore, SelectionStoreInstance };
|
|
7
|
-
export { rowById };
|
|
8
6
|
export { RowInfo };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weng-lab/genomebrowser-ui",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.10",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"publishConfig": {
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@mui/x-data-grid-premium": "^8.19.0",
|
|
23
23
|
"react": "^19.0.0",
|
|
24
24
|
"react-dom": "^19.0.0",
|
|
25
|
-
"@weng-lab/genomebrowser": "1.7.
|
|
25
|
+
"@weng-lab/genomebrowser": "1.7.3"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@eslint/js": "^9.34.0",
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"fmt"
|
|
6
|
+
"os"
|
|
7
|
+
"path"
|
|
8
|
+
"strings"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
type RNASeqTrack struct {
|
|
12
|
+
ID string `json:"id"`
|
|
13
|
+
Title string `json:"title"`
|
|
14
|
+
URL string `json:"url"`
|
|
15
|
+
RNASeqExperimentAccession string `json:"rnaseq_experiment_accession"`
|
|
16
|
+
RNASeqFileAccession string `json:"rnaseq_file_accession"`
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
type OldBiosample struct {
|
|
20
|
+
Name string `json:"name"`
|
|
21
|
+
Ontology string `json:"ontology"`
|
|
22
|
+
LifeStage string `json:"lifeStage"`
|
|
23
|
+
SampleType string `json:"sampleType"`
|
|
24
|
+
DisplayName string `json:"displayname"`
|
|
25
|
+
DNaseExperimentAccession *string `json:"dnase_experiment_accession"`
|
|
26
|
+
H3K4Me3ExperimentAccession *string `json:"h3k4me3_experiment_accession"`
|
|
27
|
+
H3K27AcExperimentAccession *string `json:"h3k27ac_experiment_accession"`
|
|
28
|
+
CTCFExperimentAccession *string `json:"ctcf_experiment_accession"`
|
|
29
|
+
ATACExperimentAccession *string `json:"atac_experiment_accession"`
|
|
30
|
+
DNaseFileAccession *string `json:"dnase_file_accession"`
|
|
31
|
+
H3K4Me3FileAccession *string `json:"h3k4me3_file_accession"`
|
|
32
|
+
H3K27AcFileAccession *string `json:"h3k27ac_file_accession"`
|
|
33
|
+
CTCFFileAccession *string `json:"ctcf_file_accession"`
|
|
34
|
+
ATACFileAccession *string `json:"atac_file_accession"`
|
|
35
|
+
DNaseSignalURL string `json:"dnase_signal_url,omitempty"`
|
|
36
|
+
H3K4Me3SignalURL string `json:"h3k4me3_signal_url,omitempty"`
|
|
37
|
+
H3K27AcSignalURL string `json:"h3k27ac_signal_url,omitempty"`
|
|
38
|
+
CTCFSignalURL string `json:"ctcf_signal_url,omitempty"`
|
|
39
|
+
ATACSignalURL string `json:"atac_signal_url,omitempty"`
|
|
40
|
+
ChromHMM string `json:"chromhmm,omitempty"`
|
|
41
|
+
ChromHMMURL string `json:"chromhmm_url,omitempty"`
|
|
42
|
+
RNASeqTracks []RNASeqTrack `json:"rna_seq_tracks"`
|
|
43
|
+
BigBedURL string `json:"bigbedurl,omitempty"`
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
type Assay struct {
|
|
47
|
+
ID string `json:"id"`
|
|
48
|
+
Assay string `json:"assay"`
|
|
49
|
+
URL string `json:"url"`
|
|
50
|
+
ExperimentAccession string `json:"experimentAccession"`
|
|
51
|
+
FileAccession string `json:"fileAccession"`
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
type NewBiosample struct {
|
|
55
|
+
Name string `json:"name"`
|
|
56
|
+
Ontology string `json:"ontology"`
|
|
57
|
+
LifeStage string `json:"lifeStage"`
|
|
58
|
+
SampleType string `json:"sampleType"`
|
|
59
|
+
DisplayName string `json:"displayname"`
|
|
60
|
+
Assays []Assay `json:"assays"`
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
func main() {
|
|
64
|
+
if len(os.Args) < 3 {
|
|
65
|
+
fmt.Println("Usage: go run format.go <input.json> <output.json>")
|
|
66
|
+
os.Exit(1)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
inputFile := os.Args[1]
|
|
70
|
+
outputFile := os.Args[2]
|
|
71
|
+
|
|
72
|
+
data, err := os.ReadFile(inputFile)
|
|
73
|
+
if err != nil {
|
|
74
|
+
fmt.Printf("Error reading input file: %v\n", err)
|
|
75
|
+
os.Exit(1)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
var inputWrapper struct {
|
|
79
|
+
Data struct {
|
|
80
|
+
CCREBiosampleQuery struct {
|
|
81
|
+
Biosamples []OldBiosample `json:"biosamples"`
|
|
82
|
+
} `json:"ccREBiosampleQuery"`
|
|
83
|
+
} `json:"data"`
|
|
84
|
+
}
|
|
85
|
+
if err := json.Unmarshal(data, &inputWrapper); err != nil {
|
|
86
|
+
fmt.Printf("Error parsing JSON: %v\n", err)
|
|
87
|
+
os.Exit(1)
|
|
88
|
+
}
|
|
89
|
+
oldSamples := inputWrapper.Data.CCREBiosampleQuery.Biosamples
|
|
90
|
+
|
|
91
|
+
var newSamples []NewBiosample
|
|
92
|
+
for _, old := range oldSamples {
|
|
93
|
+
newSample := NewBiosample{
|
|
94
|
+
Name: old.Name,
|
|
95
|
+
Ontology: old.Ontology,
|
|
96
|
+
LifeStage: old.LifeStage,
|
|
97
|
+
SampleType: old.SampleType,
|
|
98
|
+
DisplayName: old.DisplayName,
|
|
99
|
+
Assays: []Assay{},
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Add DNase assay if present
|
|
103
|
+
if old.DNaseFileAccession != nil {
|
|
104
|
+
url := old.DNaseSignalURL
|
|
105
|
+
if url == "" {
|
|
106
|
+
url = "https://downloads.wenglab.org/Registry-V4/" + *old.DNaseFileAccession + ".bigWig"
|
|
107
|
+
}
|
|
108
|
+
newSample.Assays = append(newSample.Assays, Assay{
|
|
109
|
+
ID: "dnase-" + *old.DNaseFileAccession,
|
|
110
|
+
Assay: "dnase",
|
|
111
|
+
URL: url,
|
|
112
|
+
ExperimentAccession: ptrToString(old.DNaseExperimentAccession),
|
|
113
|
+
FileAccession: *old.DNaseFileAccession,
|
|
114
|
+
})
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Add H3K4me3 assay if present
|
|
118
|
+
if old.H3K4Me3FileAccession != nil {
|
|
119
|
+
url := old.H3K4Me3SignalURL
|
|
120
|
+
if url == "" {
|
|
121
|
+
url = "https://downloads.wenglab.org/Registry-V4/" + *old.H3K4Me3FileAccession + ".bigWig"
|
|
122
|
+
}
|
|
123
|
+
newSample.Assays = append(newSample.Assays, Assay{
|
|
124
|
+
ID: "h3k4me3-" + *old.H3K4Me3FileAccession,
|
|
125
|
+
Assay: "h3k4me3",
|
|
126
|
+
URL: url,
|
|
127
|
+
ExperimentAccession: ptrToString(old.H3K4Me3ExperimentAccession),
|
|
128
|
+
FileAccession: *old.H3K4Me3FileAccession,
|
|
129
|
+
})
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Add H3K27ac assay if present
|
|
133
|
+
if old.H3K27AcFileAccession != nil {
|
|
134
|
+
url := old.H3K27AcSignalURL
|
|
135
|
+
if url == "" {
|
|
136
|
+
url = "https://downloads.wenglab.org/Registry-V4/" + *old.H3K27AcFileAccession + ".bigWig"
|
|
137
|
+
}
|
|
138
|
+
newSample.Assays = append(newSample.Assays, Assay{
|
|
139
|
+
ID: "h3k27ac-" + *old.H3K27AcFileAccession,
|
|
140
|
+
Assay: "h3k27ac",
|
|
141
|
+
URL: url,
|
|
142
|
+
ExperimentAccession: ptrToString(old.H3K27AcExperimentAccession),
|
|
143
|
+
FileAccession: *old.H3K27AcFileAccession,
|
|
144
|
+
})
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Add CTCF assay if present
|
|
148
|
+
if old.CTCFFileAccession != nil {
|
|
149
|
+
url := old.CTCFSignalURL
|
|
150
|
+
if url == "" {
|
|
151
|
+
url = "https://downloads.wenglab.org/Registry-V4/" + *old.CTCFFileAccession + ".bigWig"
|
|
152
|
+
}
|
|
153
|
+
newSample.Assays = append(newSample.Assays, Assay{
|
|
154
|
+
ID: "ctcf-" + *old.CTCFFileAccession,
|
|
155
|
+
Assay: "ctcf",
|
|
156
|
+
URL: url,
|
|
157
|
+
ExperimentAccession: ptrToString(old.CTCFExperimentAccession),
|
|
158
|
+
FileAccession: *old.CTCFFileAccession,
|
|
159
|
+
})
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Add ATAC assay if present
|
|
163
|
+
if old.ATACFileAccession != nil {
|
|
164
|
+
url := old.ATACSignalURL
|
|
165
|
+
if url == "" {
|
|
166
|
+
url = "https://downloads.wenglab.org/Registry-V4/" + *old.ATACFileAccession + ".bigWig"
|
|
167
|
+
}
|
|
168
|
+
newSample.Assays = append(newSample.Assays, Assay{
|
|
169
|
+
ID: "atac-" + *old.ATACFileAccession,
|
|
170
|
+
Assay: "atac",
|
|
171
|
+
URL: url,
|
|
172
|
+
ExperimentAccession: ptrToString(old.ATACExperimentAccession),
|
|
173
|
+
FileAccession: *old.ATACFileAccession,
|
|
174
|
+
})
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Add ChromHMM assay if present
|
|
178
|
+
if old.ChromHMMURL != "" {
|
|
179
|
+
chromhmmAccession := extractAccessionFromURL(old.ChromHMMURL)
|
|
180
|
+
newSample.Assays = append(newSample.Assays, Assay{
|
|
181
|
+
ID: "chromhmm-" + chromhmmAccession,
|
|
182
|
+
Assay: "chromhmm",
|
|
183
|
+
URL: old.ChromHMMURL,
|
|
184
|
+
FileAccession: chromhmmAccession,
|
|
185
|
+
})
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Add RNA-seq tracks
|
|
189
|
+
for _, rna := range old.RNASeqTracks {
|
|
190
|
+
url := rna.URL
|
|
191
|
+
if url == "" {
|
|
192
|
+
url = "https://downloads.wenglab.org/Registry-V4/" + rna.RNASeqFileAccession + ".bigWig"
|
|
193
|
+
}
|
|
194
|
+
newSample.Assays = append(newSample.Assays, Assay{
|
|
195
|
+
ID: "rnaseq-" + rna.RNASeqFileAccession,
|
|
196
|
+
Assay: "rnaseq",
|
|
197
|
+
URL: url,
|
|
198
|
+
ExperimentAccession: rna.RNASeqExperimentAccession,
|
|
199
|
+
FileAccession: rna.RNASeqFileAccession,
|
|
200
|
+
})
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Add cCRE bigBed as an assay
|
|
204
|
+
if old.BigBedURL != "" {
|
|
205
|
+
ccreAccession := extractAccessionFromURL(old.BigBedURL)
|
|
206
|
+
newSample.Assays = append(newSample.Assays, Assay{
|
|
207
|
+
ID: "ccre-" + ccreAccession,
|
|
208
|
+
Assay: "ccre",
|
|
209
|
+
URL: old.BigBedURL,
|
|
210
|
+
FileAccession: ccreAccession,
|
|
211
|
+
})
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
newSamples = append(newSamples, newSample)
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Wrap in object with "tracks" key to match expected format
|
|
218
|
+
wrapper := struct {
|
|
219
|
+
Tracks []NewBiosample `json:"tracks"`
|
|
220
|
+
}{
|
|
221
|
+
Tracks: newSamples,
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
output, err := json.MarshalIndent(wrapper, "", " ")
|
|
225
|
+
if err != nil {
|
|
226
|
+
fmt.Printf("Error marshaling JSON: %v\n", err)
|
|
227
|
+
os.Exit(1)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if err := os.WriteFile(outputFile, output, 0644); err != nil {
|
|
231
|
+
fmt.Printf("Error writing output file: %v\n", err)
|
|
232
|
+
os.Exit(1)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
fmt.Printf("Successfully converted %d biosamples to %s\n", len(newSamples), outputFile)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
func ptrToString(s *string) string {
|
|
239
|
+
if s == nil {
|
|
240
|
+
return ""
|
|
241
|
+
}
|
|
242
|
+
return *s
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// extractAccessionFromURL extracts the file accession from a URL
|
|
246
|
+
// e.g., "https://downloads.wenglab.org/Registry-V4/ENCFF170YYM.bigBed" -> "ENCFF170YYM"
|
|
247
|
+
// e.g., "https://downloads.wenglab.org/Registry-V4/ENCFF606INL_ENCFF501ILD.bigBed" -> "ENCFF606INL_ENCFF501ILD"
|
|
248
|
+
func extractAccessionFromURL(url string) string {
|
|
249
|
+
// Get the filename from the URL
|
|
250
|
+
filename := path.Base(url)
|
|
251
|
+
// Remove the extension
|
|
252
|
+
ext := path.Ext(filename)
|
|
253
|
+
return strings.TrimSuffix(filename, ext)
|
|
254
|
+
}
|