예제 #1
0
파일: nims.py 프로젝트: arokem/nims
 def from_mrfile(cls, mrfile, nims_path, archived=True):
     series_uid = nimsutil.pack_dicom_uid(mrfile.series_uid)
     dataset = (cls.query.join(Epoch)
             .filter(Epoch.uid == series_uid)
             .filter(Epoch.acq == mrfile.acq_no)
             .filter(cls.filetype == mrfile.filetype)
             .first())
     if not dataset:
         alt_dataset = (cls.query.join(Epoch)
                 .filter(Epoch.uid == series_uid)
                 .filter(Epoch.acq == mrfile.acq_no)
                 .filter(cls.kind == u'primary')
                 .first())
         if not alt_dataset:
             kind = u'primary'
         elif alt_dataset.priority < mrfile.priority:
             kind = u'primary'
             alt_dataset.kind = u'secondary'
         else:
             kind = u'secondary'
         epoch = Epoch.from_mrfile(mrfile)
         dataset = cls(
                 container=epoch,
                 priority = mrfile.priority,
                 filetype=mrfile.filetype,
                 compressed=mrfile.compressed,
                 kind=kind,
                 label=cls.default_labels[mrfile.filetype],
                 archived=archived,
                 )
         transaction.commit()
         DBSession.add(dataset)
         nimsutil.make_joined_path(nims_path, dataset.relpath)
     return dataset
예제 #2
0
파일: nims.py 프로젝트: dhivsrin/nims
 def from_mrfile(cls, mrfile):
     uid = nimsutil.pack_dicom_uid(mrfile.exam_uid)
     session = cls.query.filter_by(uid=uid).first()
     if not session:
         subject = Subject.from_mrfile(mrfile)
         # If we trusted the scan operator to carefully enter their uid in the
         # 'operator' field, then we could make create=True. Or we could add some
         # fancy code to fuzzily infer their intent, perhaps even ldap-ing the uid
         # central authority and/or querying the schedule database. But for now,
         # just let the operator be None if the user isn't already in the system.
         operator = User.by_uid(unicode(mrfile.operator), create=False)
         session = Session(uid=uid, exam=int(mrfile.exam_no) if isinstance(mrfile.exam_no, (unicode, int)) else 0, subject=subject, operator=operator)
     return session
예제 #3
0
파일: nims.py 프로젝트: francopestilli/nims
 def get_metadata(filename):
     try:
         pf = nimsutil.pfile.PFile(filename)
     except nimsutil.pfile.PFileError:
         md = None
     else:
         md = Metadata()
         md.datatype = u"GE PFile"
         md.exam_no = pf.exam_no
         md.series_no = pf.series_no
         md.acq_no = pf.acq_no
         md.exam_uid = nimsutil.pack_dicom_uid(pf.exam_uid)
         md.series_uid = nimsutil.pack_dicom_uid(pf.series_uid)
         md.psd_name = unicode(pf.psd_name)
         md.physio_flag = pf.physio_flag
         md.series_desc = nimsutil.clean_string(pf.series_desc)
         md.timestamp = pf.timestamp
         md.duration = pf.duration
         all_groups = [rg.id for rg in ResearchGroup.query.all()]
         md.subj_code, md.subj_fn, md.subj_ln, md.subj_dob = nimsutil.parse_subject(pf.patient_name, pf.patient_dob)
         md.group_name, md.exp_name = nimsutil.parse_patient_id(pf.patient_id, ResearchGroup.get_all_ids())
     return md
예제 #4
0
파일: nims.py 프로젝트: francopestilli/nims
 def get_metadata(filename):
     try:
         dcm = nimsutil.dicomutil.DicomFile(filename)
     except nimsutil.dicomutil.DicomError:
         md = None
     else:
         md = Metadata()
         md.datatype = u"Dicom Files"
         md.exam_no = dcm.exam_no
         md.series_no = dcm.series_no
         md.acq_no = dcm.acq_no
         md.exam_uid = nimsutil.pack_dicom_uid(dcm.exam_uid)
         md.series_uid = nimsutil.pack_dicom_uid(dcm.series_uid)
         md.psd_name = unicode(dcm.psd_name)
         md.physio_flag = dcm.physio_flag
         md.series_desc = nimsutil.clean_string(dcm.series_desc)
         md.timestamp = dcm.timestamp
         md.duration = dcm.duration
         md.subj_code, md.subj_fn, md.subj_ln, md.subj_dob = nimsutil.parse_subject(
             dcm.patient_name, dcm.patient_dob
         )
         md.group_name, md.exp_name = nimsutil.parse_patient_id(dcm.patient_id, ResearchGroup.get_all_ids())
     return md
예제 #5
0
파일: nims.py 프로젝트: dhivsrin/nims
 def from_mrfile(cls, mrfile):
     uid = nimsutil.pack_dicom_uid(mrfile.series_uid)
     epoch = cls.query.filter_by(uid=uid).filter_by(acq=mrfile.acq_no).first()
     if not epoch:
         session = Session.from_mrfile(mrfile)
         if session.timestamp is None or (mrfile.timestamp is not None and session.timestamp > mrfile.timestamp):
             session.timestamp = mrfile.timestamp
         epoch = cls(
                 session = session,
                 timestamp = mrfile.timestamp,
                 duration = datetime.timedelta(0, mrfile.duration or 0),
                 prescribed_duration = datetime.timedelta(0, mrfile.prescribed_duration or 0),
                 uid = uid,
                 series = mrfile.series_no,
                 acq = mrfile.acq_no,
                 description = nimsutil.clean_string(mrfile.series_desc),
                 psd = unicode(mrfile.psd_name),
                 physio_recorded = True,
                 tr = mrfile.tr,
                 te = mrfile.te,
                 ti = mrfile.ti,
                 flip_angle = mrfile.flip_angle,
                 pixel_bandwidth = mrfile.pixel_bandwidth,
                 num_slices = mrfile.num_slices,
                 num_timepoints = mrfile.num_timepoints or 1,
                 num_averages = mrfile.num_averages,
                 num_echos = mrfile.num_echos,
                 receive_coil_name = unicode(mrfile.receive_coil_name),
                 num_receivers = mrfile.num_receivers,
                 protocol_name = unicode(mrfile.protocol_name),
                 scanner_name = unicode(mrfile.scanner_name),
                 size_x = mrfile.size[0],
                 size_y = mrfile.size[1],
                 fov = unicode(str(mrfile.fov)),
                 mm_per_vox = unicode(str(mrfile.mm_per_vox)),
                 scan_type = unicode(mrfile.scan_type),
                 num_bands = mrfile.num_bands,
                 effective_echo_spacing = mrfile.effective_echo_spacing,
                 phase_encode_undersample = mrfile.phase_encode_undersample,
                 slice_encode_undersample = mrfile.slice_encode_undersample,
                 acquisition_matrix = unicode(str(mrfile.acquisition_matrix)),
                 num_mux_cal_cycle = mrfile.num_mux_cal_cycle if mrfile.filetype == u'pfile' else None,    # hack for pfile
                 qa_status = u'pending',
                 # to unpack fov, mm_per_vox, and acquisition_matrix: np.fromstring(str(mm)[1:-1],sep=',')
                 )
     return epoch
예제 #6
0
파일: nims.py 프로젝트: dhivsrin/nims
 def from_mrfile(cls, mrfile, nims_path, archived=True):
     series_uid = nimsutil.pack_dicom_uid(mrfile.series_uid)
     dataset = (cls.query.join(Epoch)
             .filter(Epoch.uid == series_uid)
             .filter(Epoch.acq == mrfile.acq_no)
             .filter(cls.filetype == mrfile.filetype)
             .first())
     if not dataset:
         alt_dataset = (cls.query.join(Epoch)
                 .filter(Epoch.uid == series_uid)
                 .filter(Epoch.acq == mrfile.acq_no)
                 .filter(cls.kind == u'primary')
                 .first())
         if not alt_dataset:
             kind = u'primary'
         elif alt_dataset.priority < mrfile.priority:
             kind = u'primary'
             alt_dataset.kind = u'secondary'
             alt_dataset.container.qa_status = u'rerun'
         else:
             kind = u'secondary'
         epoch = Epoch.from_mrfile(mrfile)
         dataset = cls(
                 container=epoch,
                 priority = mrfile.priority,
                 filetype=mrfile.filetype,
                 compressed=mrfile.compressed,
                 kind=kind,
                 label=cls.default_labels[mrfile.filetype],
                 archived=archived,
                 qa_status=u'pending',
                 )
         transaction.commit()
         DBSession.add(dataset)
         nimsutil.make_joined_path(nims_path, dataset.relpath)
     return dataset