Jak uzyskać listę wszystkich instancji SOP, które nie zostały pomyślnie pobrane podczas połączenia C-MOVE?

Dec 22 2020

Używam PyNetDicom do pobierania obrazów (C-MOVE) z serwera PACS. Zaimplementowałem SCU, który wysyła żądania C-MOVE do PACS i SCP, który odbiera żądania C-STORE.

Pobieram całe badania, czyli kilka tysięcy obrazów DICOM naraz. Z jakiegoś powodu nie otrzymuję niektórych z nich. Odpowiedzi, które otrzymuję z żądań C-MOVE, pokazują, ile obrazów zostało wysłanych pomyślnie, a ile nie powiodło się (a także ile jest w toku, a także wszelkie ostrzeżenia).

Chciałbym wiedzieć nie tylko, ile zawiodło, ale także które z nich się nie powiodły, co oznacza, że ​​chcę uzyskać listę UID nieudanych instancji SOP. To jest odpowiednia część mojego kodu:

# Not shown: Implementation of association (assoc) and making a dataset to query PACS (query_dataset)
responses = assoc.send_c_move(query_dataset, b'NAME_OF_STORAGE_SCP', StudyRootQueryRetrieveInformationModelMove)

for (status, identifier) in responses: 
    # This works
    remaining_operations = status.NumberOfRemainingOperations
    completed_operations = status.NumberOfCompletedOperations
    failed_operations = status.NumberOfFailedOperations
    warning_operations = status.NumberOfWarningOperations

    if identifier: 
        failed_UID_list = identifier.FailedSOPInstanceUIDList   # This does not work

To nie działa, identyfikator jest zawsze None , nawet gdy status.Statuspokazuje, że operacja się nie powiodła. Czy robię coś źle, czy też PACS, z którym się kojarzę, nie jest zgodny ze standardem DICOM?

Odpowiedzi

3 AmitJoshi Dec 22 2020 at 11:40

Nie ma możliwości uzyskania identyfikatora (SOP Instance UID) dla wystąpień zakończonych niepowodzeniem, gdy działasz jako C-MOVE SCU.

  1. Możesz albo zaangażować C-MOVE SCP, aby uzyskać szczegóły / logi osobno (poza DICOM).
  2. Jeśli awaria wystąpiła w twoim C-STORE SCP, sprawdź dzienniki lub szczegóły tam. Może to nie być pomocne, jeśli awaria wystąpiła w C-STORE SCU (innym systemie), należy je ponownie włączyć.

Niezupełnie rozwiązanie, ale możesz wykonać zapytanie na poziomie SERIES (C-FIND) przed C-MOVE i uzyskać z NumberOfSeriesRelatedInstanceswyprzedzeniem liczbę instancji ( ) do pobrania . Ale to tylko daje zliczenie; nie identyfikator. To samo dotyczy zapytania na poziomie BADANIA i PACJENTA.

Zobowiązanie dotyczące pamięci masowej może nie być przydatne w tym przypadku, ponieważ ponownie instancje nie istnieją w systemie; nie znasz identyfikatorów.

Za pomocą zapytania na poziomie OBRAZU (C-FIND) można przekazać UID wystąpienia serii i uzyskać listę instancji dla tej serii. Ale natknąłem się na kilka systemów, które również wymuszają UID instancji SOP. Jeśli inny system w Twoim przypadku to obsługuje, możesz wykonać następujące czynności:

  • Wykonaj krok po kroku zapytanie na poziomie PACJENTA, BADANIA, SERII i OBRAZU (C-FIND). Więcej informacji można znaleźć w tej odpowiedzi.
  • Przechowuj dane wyjściowe gdzieś (lista w pamięci, baza danych lub cokolwiek innego).
  • Wykonuj swoje zwykłe C-MOVE i porównaj otrzymane instancje z zapisaną listą. Czegokolwiek brakuje, to lista tego, czego szukasz.

Aby odpowiedzieć na Twój komentarz:

Brakowało mi Failed SOP Instance UID List (0008,0058)etykiety.

C.4.2.1.4.2 Struktura identyfikatora odpowiedzi
Lista UID nieudanej instancji SOP (0008,0058) określa listę UID instancji SOP podoperacji C-STORE, dla których ta operacja C-MOVE nie powiodła się. Identyfikator w odpowiedzi C-MOVE musi warunkowo zawierać listę UID UID wystąpienia błędnej procedury SOP (0008,0058) w oparciu o wartość statusu odpowiedzi C-MOVE. Jeżeli żadna z podoperacji C-STORE nie zakończyła się niepowodzeniem, lista UID UID nieudanej instancji SOP (0008,0058) jest nieobecna, a zatem żaden zestaw danych nie będzie wysyłany w odpowiedzi C-MOVE.
Odniesienie: DICOM PS3.4 2020e - Specyfikacje klas usług

Wygląda na to, że powinien wykonać twoją pracę. Ale szczerze mówiąc, nigdy nie natknąłem się (lub nie zauważyłem) C-MOVE SCP, który wysyła taką listę nieudanych instancji. Ze swojego kodu również nie otrzymujesz danych. Zalecam, aby na tym nie polegać.