{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from fastai.vision.all import *\nimport sys\nimport numpy as np\nnp.set_printoptions(threshold=np.inf)","metadata":{"execution":{"iopub.status.busy":"2021-08-31T01:59:17.853565Z","iopub.execute_input":"2021-08-31T01:59:17.853919Z","iopub.status.idle":"2021-08-31T01:59:17.859393Z","shell.execute_reply.started":"2021-08-31T01:59:17.853890Z","shell.execute_reply":"2021-08-31T01:59:17.858259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport os\nimport random\ndf = pd.read_csv('../input/rsna-miccai-brain-tumor-radiogenomic-classification/train_labels.csv', header=0, names=['id','true_value'], dtype=object)\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T01:59:17.861110Z","iopub.execute_input":"2021-08-31T01:59:17.861694Z","iopub.status.idle":"2021-08-31T01:59:17.879368Z","shell.execute_reply.started":"2021-08-31T01:59:17.861632Z","shell.execute_reply":"2021-08-31T01:59:17.878440Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2021-08-31T01:59:17.883191Z","iopub.execute_input":"2021-08-31T01:59:17.883447Z","iopub.status.idle":"2021-08-31T01:59:17.896142Z","shell.execute_reply.started":"2021-08-31T01:59:17.883421Z","shell.execute_reply":"2021-08-31T01:59:17.895220Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test = pd.DataFrame(columns=['id', 'value'])\ndf_test.id = os.listdir(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/\")","metadata":{"execution":{"iopub.status.busy":"2021-08-31T01:59:17.899417Z","iopub.execute_input":"2021-08-31T01:59:17.899685Z","iopub.status.idle":"2021-08-31T01:59:17.908728Z","shell.execute_reply.started":"2021-08-31T01:59:17.899653Z","shell.execute_reply":"2021-08-31T01:59:17.907825Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#https://stackoverflow.com/a/4836734/8245487\ndef natural_sort(l): \n    convert = lambda text: int(text) if text.isdigit() else text.lower()\n    alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]\n    return sorted(l, key=alphanum_key)","metadata":{"execution":{"iopub.status.busy":"2021-08-31T01:59:17.909911Z","iopub.execute_input":"2021-08-31T01:59:17.910275Z","iopub.status.idle":"2021-08-31T01:59:17.918760Z","shell.execute_reply.started":"2021-08-31T01:59:17.910238Z","shell.execute_reply":"2021-08-31T01:59:17.917960Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport pydicom\nimport pandas as pd\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\nfrom tqdm import tqdm\nimport binascii\nfrom PIL import Image\nfrom multiprocessing import Pool\n\n\nINPUT = '../input/rsna-miccai-brain-tumor-radiogenomic-classification'\n\ndef get_dicom_files(dataset, df):\n    for cur_id in df.id:\n        pred = get_dicom_files_helper(dataset, cur_id)\n        df.loc[df.id==cur_id,'value'] = pred\n\ndef get_dark_cells(data):\n    return np.sum((data > 60) & (data <= 230), axis=(0,1))\n\ndef get_very_bright_cells(data):\n    return np.sum((data > 230), axis=(0,1))\n\ndef get_live_cells(data):\n    return np.sum((data > 60), axis=(0,1))\n\n\ndef get_dicom_files_helper(dataset, cur_id):\n    root = '../input/rsna-miccai-brain-tumor-radiogenomic-classification/{}'.format(dataset)\n    for scan_type in ['FLAIR', 'T1w', 'T1wCE', 'T2w']:\n        cur_dir = os.path.join(root, cur_id, scan_type)\n        dicoms = os.listdir(cur_dir)\n        if len(dicoms) == 0:\n            print('Skipping {}'.format(cur_dir))\n            continue\n            \n        dicoms = natural_sort(dicoms)\n        clip = len(dicoms) // 3\n        upper_clip = len(dicoms)-clip\n        dicoms = dicoms[clip:upper_clip] #take middle 1/3\n        num_dicoms = len(dicoms)\n\n        possible_meth = 0 #per image type\n\n        for dicom in dicoms:\n            filepath = os.path.join(cur_dir, dicom)\n            data = process_dicom(filepath)\n            #print(data)\n            live_cells = get_live_cells(data)\n            if live_cells < 10:\n                continue\n            dark_cells = get_dark_cells(data)\n            bright_cells = live_cells - dark_cells\n            very_bright_cells = get_very_bright_cells(data)\n            not_very_bright_cells = live_cells - very_bright_cells \n            mostly_dark = (dark_cells/live_cells) > 0.5\n            if mostly_dark:\n                if (very_bright_cells/live_cells) > 0.20:\n                    possible_meth += 1\n            #mostly bright picture\n            elif (not_very_bright_cells/live_cells) > 0.20: \n                possible_meth += 1\n            \n            if possible_meth >= (num_dicoms * 0.05):\n                print('Its possible!')\n                return 1\n    \n    print('Nope!')\n    return 0\n        \n\ndef process_dicom(path):\n    dicom = pydicom.read_file(path)\n    data = apply_voi_lut(dicom.pixel_array, dicom)\n    if dicom.PhotometricInterpretation == \"MONOCHROME1\":\n        data = np.amax(data) - data\n    data = data - np.min(data)\n    data = data / np.max(data)\n    data = (data * 255).astype(np.uint8)\n    \n    return data\n\n\nget_dicom_files('train', df)\nget_dicom_files('test', df_test)\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T01:59:20.196355Z","iopub.execute_input":"2021-08-31T01:59:20.196706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.value.value_counts()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.true_value.value_counts()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df[df.value==0]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test.value.value_counts()","metadata":{"execution":{"iopub.status.busy":"2021-08-31T01:59:18.658040Z","iopub.status.idle":"2021-08-31T01:59:18.658694Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test.rename(columns={'id':'BraTS21ID','value':'MGMT_value'}).to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2021-08-31T01:59:18.660034Z","iopub.status.idle":"2021-08-31T01:59:18.660749Z"},"trusted":true},"execution_count":null,"outputs":[]}]}