Ejemplo n.º 1
0
    def pull_and_send(self,
                      items: Iterable,
                      source: Orthanc,
                      domain: str,
                      dest: Orthanc,
                      anonymize=False):
        def mkq(d: Dixel):
            return {"StudyInstanceUID": d.tags["StudyInstanceUID"]}

        for d in items:

            sham_oid = ShamDixel.sham_oid(d)
            logging.debug(sham_oid)
            if dest.exists(sham_oid):
                logging.debug("SKIPPING {}".format(d.tags["PatientName"]))
                continue

            if not source.exists(d):
                source.rfind(mkq(d),
                             domain,
                             level=DicomLevel.STUDIES,
                             retrieve=True)
            else:
                logging.debug("SKIPPING PULL for {}".format(
                    d.tags["PatientName"]))

            replacement_map = ShamDixel.orthanc_sham_map(d)
            anon_id = source.anonymize(d, replacement_map=replacement_map)

            source.psend(anon_id, dest)
            source.delete(anon_id)
            source.delete(d)
Ejemplo n.º 2
0
def test_shams():

    tags = {
        "PatientName": "FOOABC^BAR^Z",
        "PatientBirthDate": "20000101",
        "StudyDate": "20180102",
        "StudyTime": "120001",
        "AccessionNumber": "12345678"
    }

    expected_meta = {
        'ShamID': 'NTE3OTYH32XNES3LPNKR2U6CVOCZXDIL',
        'ShamName': 'NADERMAN^TRACY^E',
        'ShamBirthDate': "19991009",
        'ShamStudyDateTime': datetime.datetime(2017, 10, 10, 12, 15, 3)
    }

    d = ShamDixel(tags=tags)
    logging.debug(d)

    assert (expected_meta.items() <= d.meta.items())

    assert (d.meta["ShamName"] == "NADERMAN^TRACY^E")
    assert (d.ShamStudyDate() == "20171010")
    assert (
        d.meta["ShamAccessionNumber"] == "25d55ad283aa400af464c76d713c07ad")

    logging.debug(d.orthanc_sham_map())

    expected_replacement_map = \
        {'Replace': {'PatientName': 'NADERMAN^TRACY^E', 'PatientID': 'NTE3OTYH32XNES3LPNKR2U6CVOCZXDIL',
                     'PatientBirthDate': '19991009', 'AccessionNumber': '25d55ad283aa400af464c76d713c07ad',
                     'StudyInstanceUID': '1.2.826.0.1.3680043.10.43.62.716180617702.336145899646',
                     'StudyDate': '20171010', 'StudyTime': '121503'}, 'Keep': ['PatientSex', 'StudyDescription'],
         'Force': True}

    assert (d.orthanc_sham_map() == expected_replacement_map)

    c = Dixel(tags=tags)
    e = ShamDixel.from_dixel(c)
    assert (d.meta["ShamName"] == e.meta["ShamName"])

    f = ShamDixel.from_dixel(c, salt="FOO")
    logging.debug(f.meta["ShamName"])
    assert (d.meta["ShamName"] != f.meta["ShamName"])
Ejemplo n.º 3
0
    def pull_and_save(self,
                      items: Iterable,
                      source: Orthanc,
                      domain: str,
                      dest: DcmDir,
                      anonymize=False):
        def mkq(d: Dixel):
            return {"StudyInstanceUID": d.tags["StudyInstanceUID"]}

        for d in items:

            working_level = DicomLevel.STUDIES

            if anonymize:

                if working_level == DicomLevel.SERIES:
                    d_fn = "{}-{}.zip".format(
                        d.meta["ShamAccessionNumber"][0:6],
                        d.meta["ShamSeriesDescription"])
                else:
                    d_fn = "{}.zip".format(d.meta["ShamAccessionNumber"][0:16])

            else:

                if working_level == DicomLevel.SERIES:
                    d_fn = "{}-{}-{}.zip".format(
                        d.tags["PatientName"][0:6],
                        d.tags["AccessionNumber"][0:8],
                        d.tags["SeriesDescription"])
                else:
                    d_fn = "{}-{}.zip".format(d.tags["PatientName"][0:6],
                                              d.tags["AccessionNumber"][0:8])

            if dest.exists(d_fn):
                logging.debug("SKIPPING {}".format(d.tags["PatientName"]))
                continue

            if not source.exists(d):
                source.rfind(mkq(d),
                             domain,
                             level=working_level,
                             retrieve=True)
            else:
                logging.debug("SKIPPING PULL for {}".format(
                    d.tags["PatientName"]))

            if anonymize:
                try:
                    replacement_map = ShamDixel.orthanc_sham_map(d)

                    anon_id = source.anonymize(d,
                                               replacement_map=replacement_map)

                    e = source.get(anon_id,
                                   level=working_level,
                                   view=DixelView.FILE)
                    e.meta["FileName"] = d_fn
                    logging.debug(e)

                    dest.put(e)
                    source.delete(e)

                except (HTTPError, GatewayConnectionError) as e:
                    logging.error("Failed to anonymize dixel")
                    logging.error(e)
                    with open("errors.txt", "a+") as f:
                        f.write(d.tags["AccessionNumber"] + "\n")

            else:
                d = source.get(d, level=working_level, view=DixelView.FILE)
                dest.put(d)

            try:
                source.delete(d)
            except GatewayConnectionError as e:
                logging.error("Failed to delete dixel")
                logging.error(e)
Ejemplo n.º 4
0
import logging
from diana.dixel import ShamDixel
from diana.apis import get_service

services_path = "my_services.yml"
oid = "802d6dcb-baf06419-375e594c-yyyyyyyy-xxxxxxxx"

logging.basicConfig(level=logging.DEBUG)

source = get_service(services_path, "internal", True)
dest = get_service(services_path, "external", True)

# q = {
#     "PatientName": patient_name
# }
#
# result = source.find(q)
# for oid in result:

d = source.get(oid)
dd = ShamDixel.from_dixel(d)
map = ShamDixel.orthanc_sham_map(dd)
e = source.anonymize(d, replacement_map=map)

source.psend(e, dest)
source.delete(e)