@weng-lab/genomebrowser-ui 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/.env.local +1 -1
  2. package/dist/TrackSelect/Folders/biosamples/data/human.json.d.ts +57141 -57141
  3. package/dist/TrackSelect/Folders/biosamples/data/mouse.json.d.ts +10394 -10394
  4. package/dist/TrackSelect/Folders/genes/data/human.json.d.ts +7 -7
  5. package/dist/TrackSelect/Folders/genes/data/mouse.json.d.ts +7 -7
  6. package/dist/genomebrowser-ui.es.js +14 -9
  7. package/dist/genomebrowser-ui.es.js.map +1 -1
  8. package/eslint.config.js +30 -30
  9. package/index.html +14 -14
  10. package/package.json +1 -1
  11. package/src/TrackSelect/DataGrid/DataGridWrapper.tsx +137 -137
  12. package/src/TrackSelect/DataGrid/DefaultGroupingCell.tsx +64 -64
  13. package/src/TrackSelect/Dialogs/ClearDialog.tsx +63 -63
  14. package/src/TrackSelect/Dialogs/LimitDialog.tsx +33 -33
  15. package/src/TrackSelect/Dialogs/ResetDialog.tsx +43 -43
  16. package/src/TrackSelect/FolderList/Breadcrumb.tsx +38 -38
  17. package/src/TrackSelect/FolderList/FolderCard.tsx +51 -51
  18. package/src/TrackSelect/FolderList/FolderList.tsx +47 -47
  19. package/src/TrackSelect/Folders/NEW.md +929 -929
  20. package/src/TrackSelect/Folders/biosamples/data/formatBiosamples.go +254 -254
  21. package/src/TrackSelect/Folders/biosamples/data/human.json +57141 -57141
  22. package/src/TrackSelect/Folders/biosamples/data/mouse.json +10394 -10394
  23. package/src/TrackSelect/Folders/biosamples/human.ts +17 -17
  24. package/src/TrackSelect/Folders/biosamples/mouse.ts +17 -17
  25. package/src/TrackSelect/Folders/biosamples/shared/AssayToggle.tsx +78 -78
  26. package/src/TrackSelect/Folders/biosamples/shared/BiosampleGroupingCell.tsx +146 -146
  27. package/src/TrackSelect/Folders/biosamples/shared/BiosampleTreeItem.tsx +15 -15
  28. package/src/TrackSelect/Folders/biosamples/shared/columns.tsx +165 -165
  29. package/src/TrackSelect/Folders/biosamples/shared/constants.tsx +116 -116
  30. package/src/TrackSelect/Folders/biosamples/shared/createFolder.ts +116 -116
  31. package/src/TrackSelect/Folders/biosamples/shared/treeBuilder.ts +224 -224
  32. package/src/TrackSelect/Folders/biosamples/shared/types.ts +48 -48
  33. package/src/TrackSelect/Folders/genes/data/human.json +7 -7
  34. package/src/TrackSelect/Folders/genes/data/mouse.json +7 -7
  35. package/src/TrackSelect/Folders/genes/human.ts +16 -16
  36. package/src/TrackSelect/Folders/genes/mouse.ts +16 -16
  37. package/src/TrackSelect/Folders/genes/shared/columns.tsx +42 -42
  38. package/src/TrackSelect/Folders/genes/shared/createFolder.ts +68 -68
  39. package/src/TrackSelect/Folders/genes/shared/treeBuilder.ts +45 -45
  40. package/src/TrackSelect/Folders/genes/shared/types.ts +29 -29
  41. package/src/TrackSelect/Folders/index.ts +30 -30
  42. package/src/TrackSelect/Folders/types.ts +106 -106
  43. package/src/TrackSelect/TrackSelect.tsx +11 -7
  44. package/src/TrackSelect/TreeView/CustomTreeItem.tsx +213 -214
  45. package/src/TrackSelect/TreeView/TreeViewWrapper.tsx +141 -145
  46. package/src/TrackSelect/store.ts +117 -117
  47. package/src/TrackSelect/types.ts +121 -121
  48. package/src/lib.ts +13 -13
  49. package/src/vite-env.d.ts +1 -1
  50. package/test/main.tsx +369 -369
  51. package/tsconfig.app.json +25 -25
  52. package/tsconfig.json +7 -7
  53. package/tsconfig.node.json +25 -25
  54. package/vite.config.ts +66 -66
@@ -1,254 +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
- }
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
+ }