åæ
äžè¬çãªç解ã®ããã«ã蚺æã»ã³ã¿ãŒã«ãããPACSã·ã¹ãã ã®åœ¹å²ãèæ ®ããŠãã ããã 蚺æã»ã³ã¿ãŒã«ã¯ãMRIãCTã¹ãã£ããŒãè¶ é³æ³¢ã¹ããŒã·ã§ã³ãŸãã¯ECGããã€ã¹ïŒDICOMãããã³ã«ã«é¢ããŠãããã®ããã€ã¹ã®ãããããModalityãšåŒã³ãŸãïŒããã³èšºæãœãããŠã§ã¢ïŒ OsiriXãå»åž«ã«ãã£ãŠäœ¿çšãããŸããïŒã®èšºæè£ çœ®ããããŸãã ãã¢ã°ã©ãã§ç»åãåä¿¡ãããã蚺æã¹ããŒã·ã§ã³ã«éä¿¡ããå¿ èŠããããŸãã æããã«ãããã«ã¯ãæå±€æ®åœ±è£ 眮ãè¶ é³æ³¢ã¹ããŒã·ã§ã³ãECGããã€ã¹ããç»åãåéããããããæ€çŽ¢ããŠãããã¯ãŒã¯çµç±ã§ç»åãéä¿¡ã§ãããäœããã®çµ±åãªã³ã¯ãå¿ èŠã§ãã ãã®ãããªãªã³ã¯ã¯PACSãµãŒããŒã§ãïŒ
æããã«ãå€æ§ãªå»çæ©åšã®çžäºäœçšã«ã¯åäžã®ãããã³ã«ãå¿ èŠã§ãã ãããŠããŸãã«ãã®ãããªãããã³ã«ã¯DICOM ïŒ å»åŠã«ãããããžã¿ã«ã€ã¡ãŒãžã³ã°ããã³éä¿¡ ïŒã§ãããéå»20幎ã«ããã£ãŠå€§å¹ ã«æ¹åãããå»çæ©åšãäžè¬çãªæ å ±ã·ã¹ãã ã«ç°¡åã«çµ±åã§ããããã«ãªããŸããã å»çæ©åšã®ã»ãŒãã¹ãŠã®ã¡ãŒã«ãŒããã®ãããã³ã«ã«åŸã£ãŠããŸãã ãããã£ãŠãDICOMãããã³ã«ã®ãµããŒãã¯ãPACSãµãŒããŒã®åœç¶ã®èŠä»¶ã§ããã ã¯ã©ã¹ã¿ã§åäœå¯èœãªãã«ãã¹ã¬ããã®é«è² è·PACSãå®è£ ããããšã決å®ãããŸããã ãµãŒããŒã¯C ++ã§éçºãããC ++ã§èšè¿°ãããDICOMãããã³ã«ãæäœããã®ã«æãé©åãªã©ã€ãã©ãªã§ãã-DCMTKãä»æ¥äœ¿çšãããŸãã ã ãã®ã©ã€ãã©ãªã®ãããã§ãè² è·ã®é«ãPACSââã·ã¹ãã ãè¿ éã«å®è£ ããããšãå¯èœã«ãªããŸããã
ããŒã¿ããŒã¹ãèšèšããŸã
PACSã·ã¹ãã ã®ããŒã¿ããŒã¹ã䜿çšãããšãä¿åãããç»åã«é¢ããæ å ±ãä¿åããããããæ€çŽ¢ã§ããŸãã ãŸããç»åã¯ãããã¯ãŒã¯ãä»ããŠéä¿¡ã§ããå¿ èŠããããããã䜿çšããŠç»åã«é¢ããã¡ã¿æ å ±ïŒç»åå ã®äººç©ãäœæãããã¯ãªããã¯ãç 究ãè¡ã£ã人ç©ãªã©ïŒãå¿ èŠã§ãã ãããã®ç®çã®ããã«ãDICOMãããã³ã«ã¯ç¹å¥ãª4ã¬ãã«ã®ããŒã¿ã¢ãã«ãæäŸããŸã ãããã«ã€ããŠã¯ããã§ç°¡åã«åŠã¶ããšãã§ããŸã ã å¯èœãªãã¹ãŠã®ãã¡ã€ã«å±æ§ã®å®å šãªãªã¹ãã¯ãå ¬åŒã®ãããã³ã«Webãµã€ã[1]ã«ãããŸãã ç°ãªãããã€ã¹ããååŸããç»åã§ã¯ããããã®å±æ§ã®ãªã¹ãã¯ç°ãªããŸãããããã¯å®å šã«æ£åžžã§ãã ãã ãããŠãããŒãµã«ã€ã¡ãŒãžæ€çŽ¢ããµããŒãããããã«ãäžéšã®å±æ§ã¯å¿ é ã®ãŸãŸã§ãã ãããã®ããã€ãããããŸã-æ£è åãæ£è IDãæ£è ã®èªçæ¥ãã¢ããªãã£ã¿ã€ãïŒCTãMRIãè¶ é³æ³¢ãªã©ïŒãç 究æ¥ïŒç 究ã®æ¥ä»ïŒãªã©ãå«ãåèš10ããããŸããå®è·µã瀺ãããã«ãããŒã¿ããŒã¹å ã®ãããã¯äžèŠã§ãã
ç»åã®ã¡ã¿æ å ±ã«å€æ°ã®ãªãã·ã§ã³ãã©ã¡ãŒã¿ãååšããããšã¯ãDICOMãããã³ã«ã®æ¬ ç¹ã®1ã€ã§ãã äžéšã®ããã€ã¹ã¯ããã€ãã®ãã©ã¡ãŒã¿ãŒãèšå®ããä»ã®ããã€ã¹ã¯ããã€ãèšå®ããŸãã ãããã£ãŠãæ€çŽ¢ã®ããã«ããŒã¿ããŒã¹ã§ãããããµããŒãããããšã¯ç¡æå³ã§ãã ãã®çµæãããã€ãã®ãªãã·ã§ã³ã«åãçµã¿ããã®DBãªãã·ã§ã³ã決å®ããŸããã
ã芧ã®ãšãããããŒã¿ããŒã¹ã¹ããŒãã¯DICOMãã¡ã€ã«ã®ãã«ãã¬ãã«æ§é ã«å¯Ÿå¿ããŠããŸãã 1人ã®æ£è ã¯å€ãã®æ®µéããšãããšãã§ããŸãïŒç 究ãèªãïŒã ç 究ã¯ãç 究ãããã³ã«ã§å®çŸ©ãããäžé£ã®ã·ãªãŒãºã§ãã ã·ãªãŒãºã«ã¯å€ãã®ç»åãä¿åãããŠããŸãã
PACSã·ã¹ãã ã®äž»ãªæ©èœ
æšæºPACSã·ã¹ãã ã®äž»ãªæ©èœïŒãµãŒãã¹ïŒã«ã€ããŠç°¡åã«èããŠã¿ãŸããããã»ãšãã©ãã¹ãŠã®æ©èœã«ã€ããŠã¯æ¢ã«èª¬æããŸããã ã¯ãŒã¯ã¹ããŒã·ã§ã³ãšPACSã·ã¹ãã éã®çžäºäœçšã¯ã¯ã©ã€ã¢ã³ããµãŒããŒã§ããããããã¹ãŠã®æäœã¯ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®2ã€ã®ããŒãžã§ã³ã§ãå®è£ ãããŸãã DCMTKã«ã¯äž¡æ¹ã®ãªãã·ã§ã³ãå®è£ ãããŠããŸãã PACSã¯ãµãŒããŒåŽãå®è£ ããŸãã
æäœã®æ¥é èŸãC-ãã¯ã³ã³ããžãããæå³ããŸããããã¯ãæäœãäžå¯æ¬ ã§èªçµŠèªè¶³ã§ãããä»ã®æäœãåç §ããã«å®è¡ãããããšãæå³ããŸãã æ¥é èŸããN-ãã®æäœïŒN-CREATEãN-SETãN-GETãªã©ïŒããããŸããããã¯ãããäžè¬çãªæäœã®äžéšãšããŠå®è¡ãããŸãïŒã¹ããŒã¿ã¹ã®èšå®ãã¹ã¿ãã£ã®éå§ã«é¢ããéç¥ãªã©ïŒã ãããã®æäœã¯ããã®èšäºã«ã¯é¢ä¿ãããŸããã
C-ECHO-ãããã¯ãŒã¯äžã®ã¯ã©ã€ã¢ã³ãã®å¯çšæ§ã確èªã§ããã³ãã³ãã Windowsã®pingã³ãã³ãã«äŒŒãŠããŸãã ã³ãã³ãã®å®è£ ã¯éåžžã«ç°¡åã§ã-ã¹ããŒã¿ã¹STATUS_Successã§å¿çãéä¿¡ããã ãã§ãïŒ
DIMSE_sendEchoResponse(assoc, presID, request, STATUS_Success, NULL)
ããã§ãassocã¯ã¯ã©ã€ã¢ã³ãã«ãã£ãŠç¢ºç«ãããæ¥ç¶ã§ãããrequestã¯çä¿¡èŠæ±ã§ãã
C-STORE -PACSãµãŒããŒã«DCM圢åŒã§ç»åãä¿åã§ããã³ãã³ãã
ãããè¡ãã³ãŒãã¯æ¬¡ã®ãšããã§ãã
OFCondition storeSCP() { T_DIMSE_C_StoreRQ* req = &m_msg->msg.CStoreRQ; DcmDataset* dset = 0x0; OFCondition cond = DIMSE_storeProvider(m_assoc, m_presID, req, NULL, OFTrue, &dset,storeSCPCallback, 0x0, DIMSE_BLOCKING, 0); if (cond.bad()) Log::error("C-STORE provider failed. Text: %s", cond.text()); return cond; } void storeSCPCallback( void* /*callbackData*/, T_DIMSE_StoreProgress *progress, T_DIMSE_C_StoreRQ* /*request*/, char * /*imageFileName*/, DcmDataset **imageDataSet, T_DIMSE_C_StoreRSP* response, DcmDataset **statusDetail) { if (progress->state == DIMSE_StoreEnd) { if ((imageDataSet != NULL) && (*imageDataSet != NULL)) { DcmFileFormat dcmff(*imageDataSet); // some error if (!commandStore(&dcmff)) response->DimseStatus = STATUS_STORE_Refused_OutOfResources; delete *imageDataSet; *imageDataSet = 0x0; } } delete *statusDetail; *statusDetail = 0x0; } bool ServerCoreImpl::commandStore(DcmFileFormat* file) { // // 1. , () PATIENT, STUDY, SERIES, OBJECT. // 2. , // 3. , ( // ) // true, , false }
ã³ãŒã«ããã¯storeSCPCallbackã¯ããã¡ã€ã«ããšã§ã¯ãªãããã±ãŒãžããšã«ããªã¬ãŒãããŸãã
progress->state == DIMSE_StoreEnd
æ¡ä»¶ã¯ããã¡ã€ã«ã®ããŠã³ããŒããå®äºããããšã瀺ãããã¡ã€ã«ãä¿åã§ããŸãã ãã®ã³ãã³ããå®è£ ããéã®å¯äžã®å°é£ã¯ããã¡ã€ã«ãä¿åãããšãã«ãã£ã¬ã¯ããªæ§é ãéžæããããšã§ãã OBJECTSããŒãã«ã«ãã¡ã€ã«ãã¹ãä¿åããªãããã«ãæ®ãã®ããŒã¿ããèšç®ããŸãã 次ã®ãã£ã¬ã¯ããªæ§é ã«æ±ºããŸããïŒPATH_K_STORAGE / STUDY.DATEïŒYEARïŒ/STUDY.DATEïŒMONTHïŒ/STUDY.DATEïŒDAYïŒ/STUDY.TIMEïŒHOURïŒ/PATIENT.PIDïŒfirst letterïŒ/ PATIENT.PID/STUDY .UID / {images}ã ãã®éå±€æ§é ã«ããããµããã©ã«ããŒã®æ°ãæå°éã«æããããšãã§ãããããã¿ã€ã ã©ã°ãªãã§ãã®ãã£ã¬ã¯ããªæ§é ãæäœã§ããŸãã
ãŸããOBJECTããŒãã«ã«ã¯éåžžã«éäžçã«ããŒã¿ãå ¥åããããšèšãããã§ãã MRIãã¢ã°ã©ãã«é¢ãã1ã€ã®ç 究ã¯å¹³å20åéç¶ãããã®éããã¢ã°ã©ãã¯100ã300æã®ç»åãCTãã¢ã°ã©ã500ã700æã®ç»åãçæããŸãã 1æ¥ãããã®åèšç»åæ°ã¯ã1440/20 * 500 = 1æ¥ããã36000ç»åã«éããŸãã 蚺æã»ã³ã¿ãŒã§ã¯ãæŒå€ãåããæå±€æ®åœ±ã®äœæ¥ã«å®è³ªçã«äžæã¯ãããŸããã ãããã£ãŠãOBJECTããŒãã«ã«ã¯ã§ããã ãå°ãªãããŒã¿ãæ ŒçŽããå¿ èŠããããŸãã
C-MOVE -PACSããã¯ãŒã¯ã¹ããŒã·ã§ã³ãŸãã¯èšºæã¹ããŒã·ã§ã³ã«ç»åã転éã§ããã³ãã³ãã ãã®ã³ãã³ãã¯ãåŒã³åºãå ã®ã¹ããŒã·ã§ã³ïŒãœãŒã¹ïŒããPACSã«éä¿¡ãããã€ã¡ãŒãžãã¢ããããŒãããã¹ããŒã·ã§ã³ïŒå®å ïŒã瀺ããŸãã ç¹å®ã®å Žåãsource = destinationã®å Žåããã¡ã€ã«ã¯åã«ããŠã³ããŒããããŸãã
C-MOVEã³ãã³ãã¯ãã€ã¡ãŒãžã®ããŠã³ããŒãã®ã¿ãèš±å¯ããC-GETã³ãã³ããããæ±çšæ§ããããŸãã C-MOVEã¯ãã€ã¡ãŒãžã ãã§ãªããä»ã®ã€ã¡ãŒãžãããŠã³ããŒãã§ããŸãã ãã®ã³ãã³ãã¯ãç»åãã¢ããããŒãããã¹ããŒã·ã§ã³ã®AETitleã瀺ããŸãã AETitleã¯ã¯ã©ã€ã¢ã³ãã®ååã§ãéåžžã¯å€§æåã§ãïŒCLIENT_SCUãªã©ïŒã dicom-listenerïŒãµãŒããŒïŒã®èµ·åæã«ã€ã³ã¹ããŒã«ãããŸãã
ã€ãŸããPACSãµãŒããŒã«å¯ŸããŠC-MOVEã³ãã³ããåæåããã¯ã©ã€ã¢ã³ãã¯mini-PACSãèµ·åããå¿ èŠããããŸããããã«ãããC-STOREã³ãã³ãã®ã¿ãåä¿¡ã§ããŸãã ãããŠãPACSãµãŒããŒã¯ãC-MOVEã³ãã³ãã䜿çšããŠãã¯ã©ã€ã¢ã³ããšã®æ°ããæ¥ç¶ã確ç«ããã¹ãã¬ãŒãžããç»åãååŸããC-STOREã³ãã³ãã®ã¯ã©ã€ã¢ã³ãããŒãžã§ã³ã®äžéšã«å¯ŸããŠã¯ã©ã€ã¢ã³ãã«å®è¡ããå¿ èŠããããŸãã ã¡ãªã¿ã«ãC-MOVEã³ãã³ãã®ã¿ããæ°ããæ¥ç¶ã確ç«ããããšã§å§çž®ç»åïŒJPEGïŒãšéå§çž®ç»åã®äž¡æ¹ã転éã§ããŸãã
ãã ããC-GETããŒã ã¯ãæ°ããæ¥ç¶ã確ç«ããããšãªãããããã£ãŠã¯ã©ã€ã¢ã³ãåŽã§ãµãŒããŒãäžããå¿ èŠãªããã€ã¡ãŒãžãããŠã³ããŒãã§ããŸãã ãã®å ŽåãPACSã¯ãC-GETã³ãã³ãã«ãã£ãŠç¢ºç«ãããæ¥ç¶ãä»ããŠã®ã¿ãC-STOREã³ãã³ãã®ã¯ã©ã€ã¢ã³ãããŒãžã§ã³ãå®è¡ããŸãã
C-FIND-ããŸããŸãªã¬ãã«ã§ç»åãæ€çŽ¢ã§ããã³ãã³ãã ã€ãŸããå®éã«ã¯4ã€ã®ã¿ã€ãã®C-FINDã³ãã³ãããããŸããæ£è ã¬ãã«ãç 究ã¬ãã«ãã·ãªãŒãºã¬ãã«ãããã³ç»åã¬ãã«ã®C-FINDã§ãã
void HandlerFind::findSCPCallback ( /* in */ void* callbackData, OFBool cancelled, T_DIMSE_C_FindRQ* request, DcmDataset* requestIdentifiers, int responseCount, /* out */ T_DIMSE_C_FindRSP *response, DcmDataset** responseDataSet, DcmDataset** statusDetail) { // if (cancelled) { strcpy(response->AffectedSOPClassUID, request->AffectedSOPClassUID); response->MessageIDBeingRespondedTo = request->MessageID; response->DimseStatus = STATUS_FIND_Cancel_MatchingTerminatedDueToCancelRequest; response->DataSetType = DIMSE_DATASET_NULL; return; } if (responseCount == 1) { // // . // requestIdentifiers // } /* responseDataSet */ if (/* */) { strcpy(response->AffectedSOPClassUID, request->AffectedSOPClassUID); response->MessageIDBeingRespondedTo = request->MessageID; response->DimseStatus = STATUS_Success; response->DataSetType = DIMSE_DATASET_NULL; return; } } OFCondition HandlerFind::find() { OFCondition cond = EC_Normal; T_DIMSE_C_FindRQ *req = &m_msg->msg.CFindRQ; FindCallbackData cdata; cond = DIMSE_findProvider(m_assoc, m_presID, req, findSCPCallback, &cdata, DIMSE_BLOCKING, 0); if (cond.bad()) Log::loggerDicom.error("C-FIND provider failed. Text: %s", cond.text()); return cond; }
ã€ãŸããã³ãŒã«ããã¯ã§ãå¿çãªããžã§ã¯ã-å¿çãã©ã¡ãŒã¿ãŒãšresponseDataSet-èŠã€ããå¿ èŠãããæ£è /ã¹ããŒãž/ã·ãªãŒãº/ç»åã«é¢ããæ å ±ãèšå ¥ããå¿ èŠããããŸãã DCMTKã®DIMSE_findProviderïŒïŒé¢æ°ã¯ãããããã¯ã©ã€ã¢ã³ãã«éãè¿ããŸãã
C-FINDããŒã ã¯ãã¯ã©ã€ã¢ã³ããããŸãã«ãäžè¬çãªæ€çŽ¢æ¡ä»¶ãæå®ããå¯èœæ§ããããã¯ã©ã€ã¢ã³ãã倧éã®æ å ±ãæäŸããå¿ èŠããããããå±éºã§ãã ããšãã°ãæšå¹Žã®ãã¹ãŠã®ã¹ããŒãžããªã¯ãšã¹ãã§ããŸãã æåã«ãã¹ãŠã®ããŒã¿ããµãŒããŒã«ã¢ããããŒãããããšãããšããµãŒããŒããã³ã°ããå¯èœæ§ãé«ããªããŸãã ãããã£ãŠã倧éã®ãªã¯ãšã¹ããè¡ãããšã¯ã§ããŸãããã³ãŒã«ããã¯ãããªã¬ãŒããããšããŒã¿ãããŒãããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãã€ãã¬ãŒã¿ã®åœ¢åŒã§ããŒã¿ããŒã¹ã¯ãšãªãå®è£ ããã³ãŒã«ããã¯ãããªã¬ãŒããããšãã«nextïŒïŒãåŒã³åºããŠã次ã®ãªããžã§ã¯ããååŸããå¿ èŠããããŸãã ããã«ãæ€çŽ¢ã¯ã³ãŒã«ããã¯ã®å°çæã«ã®ã¿ãã£ã³ã»ã«ã§ãããããPACSã§ã®æ€çŽ¢ãããŒã¿ããŒã¹ããã®ãµã³ãã«ã§ãã°ãããã³ã°ããã¯ã©ã€ã¢ã³ãããªã¯ãšã¹ãããã£ã³ã»ã«ããå Žåãã¯ã©ã€ã¢ã³ãã§åå¿ã¯çºçããŸããã ããã¯ãæ£è ãšã¹ããŒãžã®æ€çŽ¢ã«é¢é£ããŠããŸãã ã·ãªãŒãºã¬ãã«ã®æ€çŽ¢ã§ã¯ã15ãè¶ ããã·ãªãŒãºãå«ãã¹ããŒãžã«ééããããšããªããããããã¯ç¡é¢ä¿ã§ãã åæ§ã«ãç»åã¬ãã«ã§ã®æ€çŽ¢-1000ãè¶ ããç»åãå«ãã·ãªãŒãºã«ã€ããŠã¯ãå®éã«ã¯èŠãŠããŸããã
èŠçŽãã
ããã§ãPACSã·ã¹ãã ã®äž»ãªæ©èœãšã蚺æã»ã³ã¿ãŒã®å šäœçãªæ§é ã«ããããã®åœ¹å²ãæ€èšããŸããã å»çç£æ¥çšPACSã·ã¹ãã ã®å®è£ ã®å®çšçåŽé¢ãšããŸããŸãªåŽé¢ã匷調ãããŠããŸãã ãã ããPACSã·ã¹ãã ã¯éåžžããã®æ©èœã«éå®ãããŸããã ãŸããPACSã·ã¹ãã ã®æ©èœã«å«ãŸããWADOãµãŒãã¹ïŒDICOMãªããžã§ã¯ããžã®Webã¢ã¯ã»ã¹ïŒããã³äœæ¥ã¿ã¹ã¯ã管çããããã®ãµãŒãã¹ïŒã¢ããªãã£ã¯ãŒã¯ãªã¹ãïŒããããŸãã ãã®èšäºã圹ã«ç«ã¡ãå€ãã®æéãç¯çŽã§ããããšãé¡ã£ãŠããŸãã
åç §è³æ
1.ãã¹ãŠã®DICOMã¿ã°ã®ãªã¹ãïŒhttp://medical.nema.org/Dicom/2011/11_06pu.pdfã8ããŒãžïŒã
2. DICOMãããã³ã«ã®å ¬åŒããŒãž-medical.nema.org/standard.html
3.ãã·ã¢èªã®PACSã·ã¹ãã ã«ã€ããŠ-ru.wikipedia.org/wiki/PACS
4.ãã·ã¢èªã®DICOMã«ã€ããŠ-ru.wikipedia.org/wiki/DICOM