Como obter uma lista de todas as instâncias SOP que não foram recuperadas com êxito durante uma chamada C-MOVE?
Estou usando o PyNetDicom para baixar (C-MOVE) imagens de um servidor PACS. Implementei um SCU que envia solicitações C-MOVE ao PACS e um SCP que recebe as solicitações C-STORE.
Eu faço download de estudos inteiros, ou seja, alguns milhares de imagens DICOM por vez. Por algum motivo, não consigo receber alguns deles. As respostas que recebo das solicitações C-MOVE mostram quantas imagens foram enviadas com sucesso e quantas falharam (assim como quantas estão em andamento, além de quaisquer avisos).
Gostaria de saber não apenas quantos falharam, mas também quais falharam, o que significa que desejo obter a Lista de UIDs da instância SOP com falha. Esta é a parte relevante do meu código:
# 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
Isso não funciona, o identificador é sempre None
, mesmo quando status.Status
mostra que a operação falhou. Estou fazendo algo errado ou o PACS ao qual estou associando não é compatível com DICOM?
Respostas
Não há como obter o identificador (UID da instância SOP) para instâncias com falha quando você está atuando como C-MOVE SCU.
- Você pode ativar o C-MOVE SCP para obter os detalhes / registros separadamente (fora do DICOM).
- Se a falha foi em seu C-STORE SCP, verifique os logs ou detalhes lá. Isso pode não ser útil se a falha foi no C-STORE SCU (outro sistema), você precisa engatá-los novamente.
Não é exatamente uma solução, mas você pode fazer a consulta de nível SÉRIE (C-FIND) antes de C-MOVE e obter a contagem de instâncias ( NumberOfSeriesRelatedInstances
) a serem extraídas com antecedência. Mas isso só dá uma contagem; não o identificador. O mesmo é verdadeiro para a consulta de nível de ESTUDO e PACIENTE.
O compromisso de armazenamento pode não ser útil neste caso porque, novamente, não existem instâncias em seu sistema; você não conhece os identificadores.
Com a consulta de nível de IMAGEM (C-FIND), você pode passar o UID da instância da série e obter a lista de instâncias dessa série. Mas, eu encontrei alguns sistemas que também forçam o UID da instância SOP. Se outro sistema no seu caso suportar isso, você pode fazer o seguinte:
- Faça uma consulta de nível de PACIENTE, ESTUDO, SÉRIE e IMAGEM (C-FIND) passo a passo. Você pode consultar esta resposta para obter mais detalhes.
- Armazene a saída em algum lugar (lista na memória ou banco de dados ou qualquer outro).
- Faça seu C-MOVE normal e compare as instâncias recebidas com sua lista armazenada. O que está faltando é a lista do que você procura.
Para responder ao seu comentário:
Eu perdi a Failed SOP Instance UID List (0008,0058)
marca.
C.4.2.1.4.2 Estrutura do identificador de resposta
A lista de UIDs da instância SOP com falha (0008.0058) especifica uma lista de UIDs das instâncias SOP da suboperação C-STORE para as quais esta operação C-MOVE falhou. Um identificador em uma resposta C-MOVE deve conter condicionalmente a lista UID da instância SOP com falha (0008.0058) com base no valor de status de resposta C-MOVE. Se nenhuma suboperação C-STORE falhou, a lista de UIDs de instância SOP com falha (0008.0058) está ausente e, portanto, nenhum conjunto de dados deve ser enviado na resposta C-MOVE.
Referência: DICOM PS3.4 2020e - Especificações de classe de serviço
Parece que deve fazer o seu trabalho. Mas, francamente, nunca encontrei (ou não percebi) o C-MOVE SCP que envia essa lista de instâncias com falha. Do seu código, você também não está recebendo os dados. Vou recomendar não confiar nisso.