@weng-lab/genomebrowser-ui 0.1.8 → 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.
Files changed (35) hide show
  1. package/dist/TrackSelect/Data/{modifiedHumanTracks.json.d.ts → humanBiosamples.json.d.ts} +40705 -20804
  2. package/dist/TrackSelect/Data/mouseBiosamples.json.d.ts +10346 -0
  3. package/dist/TrackSelect/DataGrid/GroupingCell.d.ts +2 -0
  4. package/dist/TrackSelect/DataGrid/dataGridHelpers.d.ts +25 -6
  5. package/dist/TrackSelect/TrackSelect.d.ts +4 -1
  6. package/dist/TrackSelect/TreeView/treeViewHelpers.d.ts +1 -1
  7. package/dist/TrackSelect/consts.d.ts +6 -17
  8. package/dist/TrackSelect/store.d.ts +2 -1
  9. package/dist/TrackSelect/types.d.ts +5 -0
  10. package/dist/genomebrowser-ui.es.js +1173 -950
  11. package/dist/genomebrowser-ui.es.js.map +1 -1
  12. package/dist/lib.d.ts +2 -0
  13. package/package.json +2 -2
  14. package/src/TrackSelect/Data/formatBiosamples.go +254 -0
  15. package/src/TrackSelect/Data/{modifiedHumanTracks.json → humanBiosamples.json} +40704 -20804
  16. package/src/TrackSelect/Data/mouseBiosamples.json +10343 -0
  17. package/src/TrackSelect/DataGrid/DataGridWrapper.tsx +13 -6
  18. package/src/TrackSelect/DataGrid/GroupingCell.tsx +144 -0
  19. package/src/TrackSelect/DataGrid/columns.tsx +7 -0
  20. package/src/TrackSelect/DataGrid/dataGridHelpers.tsx +64 -19
  21. package/src/TrackSelect/TrackSelect.tsx +86 -27
  22. package/src/TrackSelect/TreeView/TreeViewWrapper.tsx +1 -1
  23. package/src/TrackSelect/TreeView/treeViewHelpers.tsx +65 -17
  24. package/src/TrackSelect/consts.ts +30 -30
  25. package/src/TrackSelect/issues.md +404 -0
  26. package/src/TrackSelect/store.ts +16 -6
  27. package/src/TrackSelect/types.ts +8 -0
  28. package/src/lib.ts +3 -0
  29. package/test/main.tsx +419 -4
  30. package/dist/TrackSelect/treeViewHelpers.d.ts +0 -1
  31. package/src/TrackSelect/.claude/settings.local.json +0 -7
  32. package/src/TrackSelect/Data/humanTracks.json +0 -35711
  33. package/src/TrackSelect/Data/human_chromhmm_biosamples_with_all_urls.json +0 -35716
  34. package/src/TrackSelect/bug.md +0 -4
  35. package/src/TrackSelect/treeViewHelpers.tsx +0 -0
package/dist/lib.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import { default as TrackSelect, TrackSelectProps } from './TrackSelect/TrackSelect';
2
2
  import { createSelectionStore, SelectionStoreInstance } from './TrackSelect/store.ts';
3
+ import { RowInfo } from './TrackSelect/types.ts';
3
4
  export { TrackSelect, TrackSelectProps };
4
5
  export { createSelectionStore, SelectionStoreInstance };
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.8",
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.2-beta.4"
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
+ }