Jak uzyskać listę wszystkich instancji SOP, które nie zostały pomyślnie pobrane podczas połączenia C-MOVE?
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.Status
pokazuje, ż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
Nie ma możliwości uzyskania identyfikatora (SOP Instance UID) dla wystąpień zakończonych niepowodzeniem, gdy działasz jako C-MOVE SCU.
- Możesz albo zaangażować C-MOVE SCP, aby uzyskać szczegóły / logi osobno (poza DICOM).
- 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 NumberOfSeriesRelatedInstances
wyprzedzeniem 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ć.