介紹如何使用 CTP 的 ID 對照表功能,依據事先定義的 ID 轉換清單,將 DICOM 影像中的含有 PHI 資訊的 ID 資料轉為匿名化或假名化的 ID 識別碼。
CTP Lookup Table 格式
CTP 的對照表(lookup table)功能可以讓 DICOM Anonymizer 在進行去識別化處理時,依據使用者定義的對照表將病人的 PHI 資料(例如 PatientID
)轉換為匿名化或假名化的 ID 識別碼,以便連結同病人的其他類型資料。
CTP 對照表的格式為一行一筆資料,格式如下:
類型/原始ID=去識別ID
由於 CTP 對照表可以同時存放多種類型的 ID 對照表,所以在每一筆資料的開頭必須指定資料的類型,類型的命名可以是任何文字(但不能是冒號、等號或空白),DICOM Anonymizer 會依據類型連進行 ID 轉換。
若遇到事先已經轉換好的 ID,也可以在對應表中使用以下格式來設定:
..已去識別ID=
以下是一個簡單的 CTP 對照表範例,包含了 PatientID
的對照資訊(ptid
是自訂的類別,代表用於 PatientID
的轉換):
#LookupTable.properties #Mon Oct 25 09:19:57 CST 2021 ptid/8989193730=ABC001 ptid/9189822998=ABC002 ..9894340694=
依據這張對應表,DICOM Anonymizer 會進行以下轉換:
ptid
類型的8989193730
轉換為ABC001
。ptid
類型的9189822998
轉換為ABC002
。9894340694
維持不變。
以下我們將示範如何將這張對應表應用在 CTP 的 DICOM Anonymizer 去識別化流程中。
DICOM Anonymizer 使用對照表
DICOM Anonymizer 可以搭配以下幾種方式,依據 CTP 對照表進行 ID 轉換。
@lookup
函數
如果在一個專案中,不是所有的資料或影像都由 CTP 統一處理,只有一部分的 DICOM 影像使用 CTP Anonymizer 做去識別化,這種情況下通常在處理所有資料的去識別化之前,會先建立一張整體的去識別化 ID 對照表,所有的資料都根據這張表來進行去識別化,統一去識別化後的 ID 編碼,以利串接不同的資料。
在這樣的情況下,就適合使用 CTP Anonymizer 的 @lookup
函數,依據 ID 對應表來轉換 DICOM 影像中的 ID,其語法如下:
@lookup(ElementName,KeyType)
其中 ElementName
為 DICOM 標籤名稱,而 KeyType
則為對照表中的資料類型,此函數會根據 ElementName
的內容,依據對應表中 KeyType
類型的對應進行資料轉換,如果遇到對應表中查不到的值,則該 DICOM 影像就會隔離出來,存放在隔離目錄中。
若要依據上面的對照表範例,轉換 PatientID
的資料,可以這樣寫:
@lookup(PatientID,ptid)
若這個函數用於 PatientID
本身,則可以用 this
的寫法(代表目前的 DICOM 標籤):
@lookup(this,ptid)
@lookup
函數還有另外一種形式的語法:
@lookup(ElementName,KeyType,action)
這種形式多了一個 action
參數,可用來定義在對應表中查不到值的時候,預設的處理方式,可用的選項有:
remove
:移除 DICOM 標籤。keep
:保留 DICOM 標籤內容,不更動。empty
:清除 DICOM 標籤內容。skip
:跳過去識別化步驟。default
:以預設值取代,若使用此參數,則必須在第四個參數指定預設值。ignore
:以正規表示法處理,若使用此參數,則必須在第四個參數指定正規表示法。
更詳細的說明可以參考 DICOM Anonymizer 的說明。
@integer
函數
如果專案中所有的資料與影像都統一由 CTP 來處理去識別化,這種狀況就可以考慮使用 @integer
函數對所有資料的 ID 自動重新編碼,而不需要另外預先建立 ID 對照表。
@integer
函數可以自動依序產生 ID 編號,其使用方式如下:
@integer(ElementName,KeyType,width)
其中 ElementName
為 DICOM 標籤名稱,而 KeyType
則為資料類型,而 width
則是產生編號的位數。
假設若想產生 001
、002
、003
這樣的 ID 編號作為去識別化的 PatientID
,可以這樣寫:
@integer(this,ptid,3)
這裡的 KeyType
跟 @lookup
中的 KeyType
作用有些差異,此處的以 KeyType
區隔資料類型的用意在於讓不同資料在產生 ID 編號時不會互相干擾。舉例來說,若 PatientID
採用 @integer(this,ptid,3)
產生 001
、002
、003
這樣的編號,而 PatientName
則可採用 @integer(this,ptname,3)
同樣產生 001
、002
、003
這樣的編號,兩邊的編號就可以完全獨立,不會因為互相干擾產生錯誤。
@hashptid
函數
@hashptid
函數可以透過 MD5 雜湊的方式,將原始 ID 轉換為去識別化的 ID,其語法如下:
@hashptid(siteID,ElementName,maxCharsOutput)
其中 siteID
是機構或地點的 ID,ElementName
為 DICOM 標籤名稱,@hashptid
函數會依據這兩個資訊計算出 MD5 雜湊碼,轉為 10 進位的數字之後,輸出長度在 maxCharsOutput
以內的數字。
若要以 @hashptid
依據指令稿定義的 SITEID
與目前的 DICOM 標籤內容,產生長度不超過 16
的雜湊碼,則可以這樣寫:
@hashptid(@SITEID,this,16)
根據 DICOM 規範 PatientID
的長度不可以超過 64
,所以如果要以 @hashptid
產生去識別化的 PatientID
,maxCharsOutput
最大只能設為 64
。
IDMap
如果影像資料在透過 CTP 進行去識別化之後,需要保留原始 ID 與去識別化 ID 的對照表,可以在 Dicom Anonymizer 之前加入一個 IDMap
處理步驟,將原始 ID 與去識別化 ID 的對照表儲存下來,詳細說明請參考 IDMap 的說明文件。