cciausu97 commited on
Commit
c58e071
·
verified ·
1 Parent(s): e54db1d

update app.py -- added random sampling by BodyPartExamined

Browse files

added random sampling by BodyPartExamined

BodyPartExamined is as of now defined in a static manner, due to large variability in orientation and dcm2niix behaviour, in the future use idc_index to retrieve all lists and incorporate sanity checks.

Files changed (1) hide show
  1. app.py +68 -8
app.py CHANGED
@@ -7,6 +7,7 @@ import glob
7
  import shutil
8
  import dcm2niix
9
  import subprocess
 
10
 
11
  from model.data_process.demo_data_process import process_ct_gt
12
  import numpy as np
@@ -42,19 +43,46 @@ def download_idc_data_serieUID(serieUID_lst, output_folder):
42
  "-f", "IDC_%i", "-g", "y", sample_dcm_dir])
43
  return glob.glob(os.path.join(output_folder, "*nii/*.nii.gz"))
44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  #############################################
46
  st.session_state.option = None
47
 
48
  if 'idc_data' not in st.session_state:
49
- case_list = download_idc_data_serieUID(serieUID_lst=["1.3.6.1.4.1.14519.5.2.1.8421.4008.125612661111422710051062993644",
50
- "1.3.6.1.4.1.14519.5.2.1.3344.4008.552105302448832783460360105045",
51
- "1.3.6.1.4.1.14519.5.2.1.3344.4008.217290429362492484143666931850",
52
- "1.3.6.1.4.1.14519.5.2.1.3344.4008.315023636447426194723399171147",
53
- "1.3.6.1.4.1.14519.5.2.1.3344.4008.307374355712319704057189924161"],
54
- output_folder="model/asset/idc_samples")
 
55
  st.session_state.idc_data = True
56
  else:
57
  case_list = glob.glob("model/asset/idc_samples/*nii/*.nii.gz")
 
 
 
 
 
 
 
 
 
58
  if 'idc_serieUID_sample' not in st.session_state:
59
  st.session_state.idc_serieUID_sample = None
60
  # init session_state
@@ -110,11 +138,13 @@ def reset_demo_case():
110
  st.session_state.data_item = None
111
  st.session_state.idc_serieUID_sample = None
112
  st.session_state.reset_demo_case = True
 
113
  clear_prompts()
114
 
115
  def clear_file():
116
  st.session_state.option = None
117
  st.session_state.idc_serieUID_sample = None
 
118
  process_ct_gt.clear()
119
  reset_demo_case()
120
  clear_prompts()
@@ -135,7 +165,9 @@ with arxive_col:
135
  # modify demo case here
136
  demo_type = st.radio(
137
  "Demo case source",
138
- ["Select an IDC demo case from tcga_lihc collection", "Filter by DICOM SerieUID"],
 
 
139
  on_change=clear_file
140
  )
141
 
@@ -146,7 +178,7 @@ if demo_type=="Select an IDC demo case from tcga_lihc collection":
146
  index=None,
147
  placeholder="Select a demo case...",
148
  on_change=reset_demo_case)
149
- else:
150
  with st.form("Filter by DICOM SerieUID"):
151
  uploaded_serieUID = st.text_input("Enter a DICOM SeriesInstanceUID", value=None)
152
  submitted = st.form_submit_button("Submit", on_click=clear_prompts)
@@ -156,6 +188,34 @@ else:
156
  uploaded_file = st.session_state.idc_serieUID_sample
157
  else:
158
  uploaded_file = st.session_state.idc_serieUID_sample
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
159
 
160
  st.session_state.option = uploaded_file
161
 
 
7
  import shutil
8
  import dcm2niix
9
  import subprocess
10
+ import random
11
 
12
  from model.data_process.demo_data_process import process_ct_gt
13
  import numpy as np
 
43
  "-f", "IDC_%i", "-g", "y", sample_dcm_dir])
44
  return glob.glob(os.path.join(output_folder, "*nii/*.nii.gz"))
45
 
46
+
47
+ def get_random_sample_idc_from_bodypart(bodypart_selected):
48
+ client = index.IDCClient()
49
+ # body_parts = client.index[(client.index['Modality'].isin(['CT']))&(idc_client.index['instanceCount']> '100')]['BodyPartExamined'].unique()
50
+ matching_series_list = client.index[client.index['Modality'].isin(["CT"]) \
51
+ & (client.index['BodyPartExamined'] == bodypart_selected) & \
52
+ (client.index['instanceCount']> '100')]['SeriesInstanceUID'].values
53
+ # select random series from the list
54
+ random_series_uid = random.choice(matching_series_list)
55
+ random_series_viewer_url = client.get_viewer_URL(random_series_uid)
56
+ return random_series_uid, random_series_viewer_url
57
+
58
+ def retrieve_idc_index_body_parts():
59
+ idc_client = index.IDCClient()
60
+ body_parts = idc_client.index[(idc_client.index['Modality'].isin(['CT']))&(idc_client.index['instanceCount']< '150')]['BodyPartExamined'].unique()
61
+ return body_parts
62
+
63
  #############################################
64
  st.session_state.option = None
65
 
66
  if 'idc_data' not in st.session_state:
67
+ # case_list = download_idc_data_serieUID(serieUID_lst=["1.3.6.1.4.1.14519.5.2.1.8421.4008.125612661111422710051062993644",
68
+ # "1.3.6.1.4.1.14519.5.2.1.3344.4008.552105302448832783460360105045",
69
+ # "1.3.6.1.4.1.14519.5.2.1.3344.4008.217290429362492484143666931850",
70
+ # "1.3.6.1.4.1.14519.5.2.1.3344.4008.315023636447426194723399171147",
71
+ # "1.3.6.1.4.1.14519.5.2.1.3344.4008.307374355712319704057189924161"],
72
+ # output_folder="model/asset/idc_samples")
73
+ case_list = []
74
  st.session_state.idc_data = True
75
  else:
76
  case_list = glob.glob("model/asset/idc_samples/*nii/*.nii.gz")
77
+ # if 'idc_index_body_part' not in st.session_state:
78
+ # body_part_list = retrieve_idc_index_body_parts()
79
+ # st.session_state.idc_index_body_part = True
80
+ # else:
81
+ # body_part_list = [""]
82
+ # if 'init_idc_client' not in st.session_state:
83
+ # st.session_state.idc_client = index.IDCClient()
84
+ # if 'idc_bodypart_selected' not in st.session_state:
85
+ # st.session_state.idc_bodypart_selected = False
86
  if 'idc_serieUID_sample' not in st.session_state:
87
  st.session_state.idc_serieUID_sample = None
88
  # init session_state
 
138
  st.session_state.data_item = None
139
  st.session_state.idc_serieUID_sample = None
140
  st.session_state.reset_demo_case = True
141
+ st.session_state.idc_bodypart_selected = False
142
  clear_prompts()
143
 
144
  def clear_file():
145
  st.session_state.option = None
146
  st.session_state.idc_serieUID_sample = None
147
+ st.session_state.idc_bodypart_selected = False
148
  process_ct_gt.clear()
149
  reset_demo_case()
150
  clear_prompts()
 
165
  # modify demo case here
166
  demo_type = st.radio(
167
  "Demo case source",
168
+ ["Select an IDC demo case from tcga_lihc collection",
169
+ "Filter by DICOM SeriesInstanceUID",
170
+ "Random sampling based on BodyPartExamined"],
171
  on_change=clear_file
172
  )
173
 
 
178
  index=None,
179
  placeholder="Select a demo case...",
180
  on_change=reset_demo_case)
181
+ elif demo_type=="Filter by DICOM SeriesInstanceUID":
182
  with st.form("Filter by DICOM SerieUID"):
183
  uploaded_serieUID = st.text_input("Enter a DICOM SeriesInstanceUID", value=None)
184
  submitted = st.form_submit_button("Submit", on_click=clear_prompts)
 
188
  uploaded_file = st.session_state.idc_serieUID_sample
189
  else:
190
  uploaded_file = st.session_state.idc_serieUID_sample
191
+ else:#elif demo_type == "Random sampling based on BodyPartExamined":
192
+ with st.form("Filter by DICOM BodyPartExamined Tag") as form_body_part:
193
+ # body_part_list = retrieve_idc_index_body_parts()
194
+ body_part_selected = st.selectbox(
195
+ "Select a bodypart to randomly sample a CT scan from",
196
+ ["ABDOMEN", "LUNG", "LIVER",
197
+ "PELVIS"],
198
+ index=None,
199
+ placeholder="Select a bodypart to pick a SeriesInstanceUID from...")
200
+ submitted = st.form_submit_button("Submit", on_click=reset_demo_case)
201
+ #if st.session_state.reset_demo_case == True and body_part_selected is not None:# and st.session_state.idc_bodypart_selected == False and
202
+ if submitted:
203
+ serieUID, ohif_link = get_random_sample_idc_from_bodypart(body_part_selected)
204
+ for i in range(0,5):
205
+ if os.path.exists("model/asset/idc_serieUID_random_sample"):
206
+ shutil.rmtree("model/asset/idc_serieUID_random_sample")
207
+ st.session_state.idc_serieUID_sample = download_idc_data_serieUID([str(serieUID)], "model/asset/idc_serieUID_random_sample")[0]
208
+ path_file = glob.glob(f"model/asset/idc_serieUID_random_sample/ddl_series0_nii/*.nii.gz")
209
+ if path_file and len(path_file) == 1:
210
+ break
211
+ else:
212
+ print("serieUID NOT FILLING BASIC REQs --> MORE THAN 1 NII FILE OR NO NII FILE")
213
+ # st.write(f"SeriesInstanceUID randomly sampled from chosen BodyPartExamined : {random_series_uid}")
214
+ # st.write(f"OHIF URL of selected sample : {random_series_viewer_url}")
215
+ # st.session_state.idc_bodypart_selected = True
216
+ uploaded_file = st.session_state.idc_serieUID_sample
217
+ else:
218
+ uploaded_file = st.session_state.idc_serieUID_sample
219
 
220
  st.session_state.option = uploaded_file
221