Commit a302c2d1a82dd6bc9090cf886be443cec4a84022
1 parent
e5314ee9
Exists in
master
and in
6 other branches
ENH: Replaced the way it reads some data, changed of vtkgdcm to gdcm reader DICOM tags.
Showing
1 changed file
with
154 additions
and
98 deletions
Show diff stats
invesalius/reader/dicom.py
@@ -104,10 +104,12 @@ class Parser(): | @@ -104,10 +104,12 @@ class Parser(): | ||
104 | DICOM standard tag (0x0008,0x0022) was used. | 104 | DICOM standard tag (0x0008,0x0022) was used. |
105 | """ | 105 | """ |
106 | # TODO: internationalize data | 106 | # TODO: internationalize data |
107 | - date = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
108 | - .GetAcquisitionDate() | ||
109 | - if (date) and (date != ''): | ||
110 | - return self.__format_date(date) | 107 | + tag = gdcm.Tag(0x0008, 0x0022) |
108 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
109 | + if ds.FindDataElement(tag): | ||
110 | + date = ds.GetDataElement(tag).GetValue() | ||
111 | + if (date) and (date != ''): | ||
112 | + return self.__format_date(str(date)) | ||
111 | return "" | 113 | return "" |
112 | 114 | ||
113 | def GetAcquisitionNumber(self): | 115 | def GetAcquisitionNumber(self): |
@@ -151,10 +153,12 @@ class Parser(): | @@ -151,10 +153,12 @@ class Parser(): | ||
151 | 153 | ||
152 | DICOM standard tag (0x0008,0x0032) was used. | 154 | DICOM standard tag (0x0008,0x0032) was used. |
153 | """ | 155 | """ |
154 | - time = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
155 | - .GetAcquisitionTime() | ||
156 | - if (time) and (time != 'None'): | ||
157 | - return self.__format_time(time) | 156 | + tag = gdcm.Tag(0x0008, 0x0032) |
157 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
158 | + if ds.FindDataElement(tag): | ||
159 | + data = ds.GetDataElement(tag).GetValue() | ||
160 | + if (data) and (data != ''): | ||
161 | + return self.__format_time(str(data)) | ||
158 | return "" | 162 | return "" |
159 | 163 | ||
160 | def GetPatientAdmittingDiagnosis(self): | 164 | def GetPatientAdmittingDiagnosis(self): |
@@ -164,7 +168,6 @@ class Parser(): | @@ -164,7 +168,6 @@ class Parser(): | ||
164 | 168 | ||
165 | DICOM standard tag (0x0008,0x1080) was used. | 169 | DICOM standard tag (0x0008,0x1080) was used. |
166 | """ | 170 | """ |
167 | - | ||
168 | tag = gdcm.Tag(0x0008, 0x1080) | 171 | tag = gdcm.Tag(0x0008, 0x1080) |
169 | sf = gdcm.StringFilter() | 172 | sf = gdcm.StringFilter() |
170 | sf.SetFile(self.gdcm_reader.GetFile()) | 173 | sf.SetFile(self.gdcm_reader.GetFile()) |
@@ -1063,14 +1066,15 @@ class Parser(): | @@ -1063,14 +1066,15 @@ class Parser(): | ||
1063 | DICOM standard tag (0x0010,0x0030) was used. | 1066 | DICOM standard tag (0x0010,0x0030) was used. |
1064 | """ | 1067 | """ |
1065 | # TODO: internationalize data | 1068 | # TODO: internationalize data |
1066 | - date = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1067 | - .GetPatientBirthDate() | ||
1068 | - if (date) and (date!='None'): | ||
1069 | - self.__format_date(date) | 1069 | + tag = gdcm.Tag(0x0010, 0x0030) |
1070 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1071 | + if ds.FindDataElement(tag): | ||
1072 | + data = ds.GetDataElement(tag).GetValue() | ||
1073 | + if (data) and (data != 'None'): | ||
1074 | + return self.__format_date(str(data)) | ||
1070 | return "" | 1075 | return "" |
1071 | 1076 | ||
1072 | 1077 | ||
1073 | - | ||
1074 | def GetStudyID(self): | 1078 | def GetStudyID(self): |
1075 | """ | 1079 | """ |
1076 | Return string containing the Study ID. | 1080 | Return string containing the Study ID. |
@@ -1078,13 +1082,14 @@ class Parser(): | @@ -1078,13 +1082,14 @@ class Parser(): | ||
1078 | 1082 | ||
1079 | DICOM standard tag (0x0020,0x0010) was used. | 1083 | DICOM standard tag (0x0020,0x0010) was used. |
1080 | """ | 1084 | """ |
1081 | - | ||
1082 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1083 | - .GetStudyID() | ||
1084 | - if (data): | ||
1085 | - return data | 1085 | + tag = gdcm.Tag(0x0020, 0x0010) |
1086 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1087 | + if ds.FindDataElement(tag): | ||
1088 | + data = ds.GetDataElement(tag).GetValue() | ||
1089 | + if (data): | ||
1090 | + return str(data) | ||
1086 | return "" | 1091 | return "" |
1087 | - | 1092 | + |
1088 | def GetAcquisitionGantryTilt(self): | 1093 | def GetAcquisitionGantryTilt(self): |
1089 | """ | 1094 | """ |
1090 | Return floating point containing nominal angle of | 1095 | Return floating point containing nominal angle of |
@@ -1093,10 +1098,14 @@ class Parser(): | @@ -1093,10 +1098,14 @@ class Parser(): | ||
1093 | 1098 | ||
1094 | DICOM standard tag (0x0018,0x1120) was used. | 1099 | DICOM standard tag (0x0018,0x1120) was used. |
1095 | """ | 1100 | """ |
1096 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1097 | - .GetGantryTilt() | ||
1098 | - if (data): | ||
1099 | - return float(data) | 1101 | + tag = gdcm.Tag(0x0018, 0x1120) |
1102 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1103 | + if ds.FindDataElement(tag): | ||
1104 | + data = ds.GetDataElement(tag).GetValue() | ||
1105 | + | ||
1106 | + if (data): | ||
1107 | + return float(str(data)) | ||
1108 | + | ||
1100 | return 0.0 | 1109 | return 0.0 |
1101 | 1110 | ||
1102 | def GetPatientGender(self): | 1111 | def GetPatientGender(self): |
@@ -1109,10 +1118,13 @@ class Parser(): | @@ -1109,10 +1118,13 @@ class Parser(): | ||
1109 | 1118 | ||
1110 | DICOM standard tag (0x0010,0x0040) was used. | 1119 | DICOM standard tag (0x0010,0x0040) was used. |
1111 | """ | 1120 | """ |
1112 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1113 | - .GetPatientSex() | ||
1114 | - if (data): | ||
1115 | - return data | 1121 | + tag = gdcm.Tag(0x0010, 0x0040) |
1122 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1123 | + if ds.FindDataElement(tag): | ||
1124 | + data = ds.GetDataElement(tag).GetValue() | ||
1125 | + | ||
1126 | + if (data): | ||
1127 | + return str(data) | ||
1116 | return "" | 1128 | return "" |
1117 | 1129 | ||
1118 | def GetPatientAge(self): | 1130 | def GetPatientAge(self): |
@@ -1123,14 +1135,17 @@ class Parser(): | @@ -1123,14 +1135,17 @@ class Parser(): | ||
1123 | 1135 | ||
1124 | DICOM standard tag (0x0010, 0x1010) was used. | 1136 | DICOM standard tag (0x0010, 0x1010) was used. |
1125 | """ | 1137 | """ |
1126 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1127 | - .GetPatientAge() | ||
1128 | - if (data): | ||
1129 | - age = (data.split('Y')[0]) | ||
1130 | - try: | ||
1131 | - return int(age) | ||
1132 | - except ValueError: | ||
1133 | - return age | 1138 | + tag = gdcm.Tag(0x0010, 0x1010) |
1139 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1140 | + if ds.FindDataElement(tag): | ||
1141 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1142 | + | ||
1143 | + if (data): | ||
1144 | + age = (data.split('Y')[0]) | ||
1145 | + try: | ||
1146 | + return int(age) | ||
1147 | + except ValueError: | ||
1148 | + return age | ||
1134 | return "" | 1149 | return "" |
1135 | 1150 | ||
1136 | def GetPatientName(self): | 1151 | def GetPatientName(self): |
@@ -1140,14 +1155,16 @@ class Parser(): | @@ -1140,14 +1155,16 @@ class Parser(): | ||
1140 | 1155 | ||
1141 | DICOM standard tag (0x0010,0x0010) was used. | 1156 | DICOM standard tag (0x0010,0x0010) was used. |
1142 | """ | 1157 | """ |
1143 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1144 | - .GetPatientName() | 1158 | + tag = gdcm.Tag(0x0010, 0x0010) |
1159 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1160 | + if ds.FindDataElement(tag): | ||
1161 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1145 | 1162 | ||
1146 | - if (data): | ||
1147 | - name = data.strip() | ||
1148 | - encoding = self.GetEncoding() | ||
1149 | - # Returns a unicode decoded in the own dicom encoding | ||
1150 | - return name.decode(encoding) | 1163 | + if (data): |
1164 | + name = data.strip() | ||
1165 | + encoding = self.GetEncoding() | ||
1166 | + # Returns a unicode decoded in the own dicom encoding | ||
1167 | + return name.decode(encoding) | ||
1151 | return "" | 1168 | return "" |
1152 | 1169 | ||
1153 | def GetPatientID(self): | 1170 | def GetPatientID(self): |
@@ -1158,12 +1175,15 @@ class Parser(): | @@ -1158,12 +1175,15 @@ class Parser(): | ||
1158 | 1175 | ||
1159 | DICOM standard tag (0x0010,0x0020) was used. | 1176 | DICOM standard tag (0x0010,0x0020) was used. |
1160 | """ | 1177 | """ |
1161 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1162 | - .GetPatientID() | ||
1163 | - if (data): | ||
1164 | - encoding = self.GetEncoding() | ||
1165 | - # Returns a unicode decoded in the own dicom encoding | ||
1166 | - return data.decode(encoding) | 1178 | + tag = gdcm.Tag(0x0010, 0x0020) |
1179 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1180 | + if ds.FindDataElement(tag): | ||
1181 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1182 | + | ||
1183 | + if (data): | ||
1184 | + encoding = self.GetEncoding() | ||
1185 | + # Returns a unicode decoded in the own dicom encoding | ||
1186 | + return data.decode(encoding) | ||
1167 | return "" | 1187 | return "" |
1168 | 1188 | ||
1169 | 1189 | ||
@@ -1212,10 +1232,13 @@ class Parser(): | @@ -1212,10 +1232,13 @@ class Parser(): | ||
1212 | 1232 | ||
1213 | DICOM standard tag (0x0018,0x1151) was used. | 1233 | DICOM standard tag (0x0018,0x1151) was used. |
1214 | """ | 1234 | """ |
1215 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1216 | - .GetXRayTubeCurrent() | ||
1217 | - if (data): | ||
1218 | - return data | 1235 | + tag = gdcm.Tag(0x0018, 0x1151) |
1236 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1237 | + if ds.FindDataElement(tag): | ||
1238 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1239 | + | ||
1240 | + if (data): | ||
1241 | + return data | ||
1219 | return "" | 1242 | return "" |
1220 | 1243 | ||
1221 | def GetExposureTime(self): | 1244 | def GetExposureTime(self): |
@@ -1226,10 +1249,13 @@ class Parser(): | @@ -1226,10 +1249,13 @@ class Parser(): | ||
1226 | 1249 | ||
1227 | DICOM standard tag (0x0018, 0x1152) was used. | 1250 | DICOM standard tag (0x0018, 0x1152) was used. |
1228 | """ | 1251 | """ |
1229 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1230 | - .GetExposureTime() | ||
1231 | - if (data): | ||
1232 | - return float(data) | 1252 | + tag = gdcm.Tag(0x0018, 0x1152) |
1253 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1254 | + if ds.FindDataElement(tag): | ||
1255 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1256 | + | ||
1257 | + if (data): | ||
1258 | + return float(data) | ||
1233 | return "" | 1259 | return "" |
1234 | 1260 | ||
1235 | def GetEquipmentKVP(self): | 1261 | def GetEquipmentKVP(self): |
@@ -1240,10 +1266,13 @@ class Parser(): | @@ -1240,10 +1266,13 @@ class Parser(): | ||
1240 | 1266 | ||
1241 | DICOM standard tag (0x0018,0x0060) was used. | 1267 | DICOM standard tag (0x0018,0x0060) was used. |
1242 | """ | 1268 | """ |
1243 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1244 | - .GetKVP() | ||
1245 | - if (data): | ||
1246 | - return float(data) | 1269 | + tag = gdcm.Tag(0x0018, 0x0060) |
1270 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1271 | + if ds.FindDataElement(tag): | ||
1272 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1273 | + | ||
1274 | + if (data): | ||
1275 | + return float(data) | ||
1247 | return "" | 1276 | return "" |
1248 | 1277 | ||
1249 | def GetImageThickness(self): | 1278 | def GetImageThickness(self): |
@@ -1254,10 +1283,13 @@ class Parser(): | @@ -1254,10 +1283,13 @@ class Parser(): | ||
1254 | 1283 | ||
1255 | DICOM standard tag (0x0018,0x0050) was used. | 1284 | DICOM standard tag (0x0018,0x0050) was used. |
1256 | """ | 1285 | """ |
1257 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1258 | - .GetSliceThickness() | ||
1259 | - if (data): | ||
1260 | - return float(data) | 1286 | + tag = gdcm.Tag(0x0018, 0x1050) |
1287 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1288 | + if ds.FindDataElement(tag): | ||
1289 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1290 | + | ||
1291 | + if (data): | ||
1292 | + return float(data) | ||
1261 | return 0 | 1293 | return 0 |
1262 | 1294 | ||
1263 | def GetImageConvolutionKernel(self): | 1295 | def GetImageConvolutionKernel(self): |
@@ -1270,10 +1302,13 @@ class Parser(): | @@ -1270,10 +1302,13 @@ class Parser(): | ||
1270 | 1302 | ||
1271 | DICOM standard tag (0x0018,0x1210) was used. | 1303 | DICOM standard tag (0x0018,0x1210) was used. |
1272 | """ | 1304 | """ |
1273 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1274 | - .GetConvolutionKernel() | ||
1275 | - if (data): | ||
1276 | - return data | 1305 | + tag = gdcm.Tag(0x0018, 0x1210) |
1306 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1307 | + if ds.FindDataElement(tag): | ||
1308 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1309 | + | ||
1310 | + if (data): | ||
1311 | + return data | ||
1277 | return "" | 1312 | return "" |
1278 | 1313 | ||
1279 | def GetEquipmentInstitutionName(self): | 1314 | def GetEquipmentInstitutionName(self): |
@@ -1284,10 +1319,13 @@ class Parser(): | @@ -1284,10 +1319,13 @@ class Parser(): | ||
1284 | 1319 | ||
1285 | DICOM standard tag (0x0008,0x0080) was used. | 1320 | DICOM standard tag (0x0008,0x0080) was used. |
1286 | """ | 1321 | """ |
1287 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1288 | - .GetInstitutionName() | ||
1289 | - if (data): | ||
1290 | - return data | 1322 | + tag = gdcm.Tag(0x0008, 0x0080) |
1323 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1324 | + if ds.FindDataElement(tag): | ||
1325 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1326 | + | ||
1327 | + if (data): | ||
1328 | + return data | ||
1291 | return "" | 1329 | return "" |
1292 | 1330 | ||
1293 | def GetStationName(self): | 1331 | def GetStationName(self): |
@@ -1298,10 +1336,13 @@ class Parser(): | @@ -1298,10 +1336,13 @@ class Parser(): | ||
1298 | 1336 | ||
1299 | DICOM standard tag (0x0008, 0x1010) was used. | 1337 | DICOM standard tag (0x0008, 0x1010) was used. |
1300 | """ | 1338 | """ |
1301 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1302 | - .GetStationName() | ||
1303 | - if (data): | ||
1304 | - return data | 1339 | + tag = gdcm.Tag(0x0008, 0x1010) |
1340 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1341 | + if ds.FindDataElement(tag): | ||
1342 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1343 | + | ||
1344 | + if (data): | ||
1345 | + return data | ||
1305 | return "" | 1346 | return "" |
1306 | 1347 | ||
1307 | def GetManufacturerModelName(self): | 1348 | def GetManufacturerModelName(self): |
@@ -1312,10 +1353,13 @@ class Parser(): | @@ -1312,10 +1353,13 @@ class Parser(): | ||
1312 | 1353 | ||
1313 | DICOM standard tag (0x0008,0x1090) was used. | 1354 | DICOM standard tag (0x0008,0x1090) was used. |
1314 | """ | 1355 | """ |
1315 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1316 | - .GetManufacturerModelName() | ||
1317 | - if (data): | ||
1318 | - return data | 1356 | + tag = gdcm.Tag(0x0008, 0x1090) |
1357 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1358 | + if ds.FindDataElement(tag): | ||
1359 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1360 | + | ||
1361 | + if (data): | ||
1362 | + return data | ||
1319 | return "" | 1363 | return "" |
1320 | 1364 | ||
1321 | def GetEquipmentManufacturer(self): | 1365 | def GetEquipmentManufacturer(self): |
@@ -1325,10 +1369,13 @@ class Parser(): | @@ -1325,10 +1369,13 @@ class Parser(): | ||
1325 | 1369 | ||
1326 | DICOM standard tag (0x0008, 0x1010) was used. | 1370 | DICOM standard tag (0x0008, 0x1010) was used. |
1327 | """ | 1371 | """ |
1328 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1329 | - .GetManufacturer() | ||
1330 | - if (data): | ||
1331 | - return data | 1372 | + tag = gdcm.Tag(0x0008, 0x1010) |
1373 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1374 | + if ds.FindDataElement(tag): | ||
1375 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1376 | + | ||
1377 | + if (data): | ||
1378 | + return data | ||
1332 | return "" | 1379 | return "" |
1333 | 1380 | ||
1334 | def GetAcquisitionModality(self): | 1381 | def GetAcquisitionModality(self): |
@@ -1340,10 +1387,13 @@ class Parser(): | @@ -1340,10 +1387,13 @@ class Parser(): | ||
1340 | 1387 | ||
1341 | DICOM standard tag (0x0008,0x0060) was used. | 1388 | DICOM standard tag (0x0008,0x0060) was used. |
1342 | """ | 1389 | """ |
1343 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1344 | - .GetModality() | ||
1345 | - if (data): | ||
1346 | - return data | 1390 | + tag = gdcm.Tag(0x0008, 0x0060) |
1391 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1392 | + if ds.FindDataElement(tag): | ||
1393 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1394 | + | ||
1395 | + if (data): | ||
1396 | + return data | ||
1347 | return "" | 1397 | return "" |
1348 | 1398 | ||
1349 | 1399 | ||
@@ -1354,10 +1404,13 @@ class Parser(): | @@ -1354,10 +1404,13 @@ class Parser(): | ||
1354 | 1404 | ||
1355 | DICOM standard tag (0x0020,0x0013) was used. | 1405 | DICOM standard tag (0x0020,0x0013) was used. |
1356 | """ | 1406 | """ |
1357 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1358 | - .GetImageNumber() | ||
1359 | - if (data): | ||
1360 | - return int(data) | 1407 | + tag = gdcm.Tag(0x0020, 0x0013) |
1408 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1409 | + if ds.FindDataElement(tag): | ||
1410 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1411 | + | ||
1412 | + if (data): | ||
1413 | + return int(data) | ||
1361 | return "" | 1414 | return "" |
1362 | 1415 | ||
1363 | def GetStudyDescription(self): | 1416 | def GetStudyDescription(self): |
@@ -1367,11 +1420,14 @@ class Parser(): | @@ -1367,11 +1420,14 @@ class Parser(): | ||
1367 | 1420 | ||
1368 | DICOM standard tag (0x0008,0x1030) was used. | 1421 | DICOM standard tag (0x0008,0x1030) was used. |
1369 | """ | 1422 | """ |
1370 | - data = self.vtkgdcm_reader.GetMedicalImageProperties()\ | ||
1371 | - .GetStudyDescription() | ||
1372 | - if (data): | ||
1373 | - encoding = self.GetEncoding() | ||
1374 | - return data.decode(encoding) | 1423 | + tag = gdcm.Tag(0x0008, 0x1030) |
1424 | + ds = self.gdcm_reader.GetFile().GetDataSet() | ||
1425 | + if ds.FindDataElement(tag): | ||
1426 | + data = str(ds.GetDataElement(tag).GetValue()) | ||
1427 | + | ||
1428 | + if (data): | ||
1429 | + encoding = self.GetEncoding() | ||
1430 | + return data.decode(encoding) | ||
1375 | return "" | 1431 | return "" |
1376 | 1432 | ||
1377 | def GetStudyAdmittingDiagnosis(self): | 1433 | def GetStudyAdmittingDiagnosis(self): |