bulkprocess

package
v0.0.0-...-66a4754 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 10, 2022 License: BSD-3-Clause Imports: 36 Imported by: 1

README

Downloading UKBB bulk data (cardiac MRI)

In brief, see this instruction page. However, these instructions are out of date (give the wrong argument order, etc). See updated instructions below.

Prepare permissions

  1. Make sure that you have created a .ukbkey file containing the application ID on line 1 and the private key on line 2 (directly downloadable as an attachment from the email that you received from the UKBB). This file should not be readable by anyone without proper UKBB permissions, so consider setting this to be user-readable only.

Download data

  1. Download the encrypted file (ukb21481.enc) and decrypt it to the encoded file (ukb21481.enc_ukb) by running ukbunpack ukb21481.enc
  2. Extract any non-bulk data to TSV, e.g.: ukbconv ukb21481.enc_ukb txt
  3. Extract the list of all samples with the field of interest.
  • Attempt #1: 20208 is Heart MRI Long Axis ukbconv ukb21481.enc_ukb bulk -s20208
  • Atttempt #2: Try to get all MRI fields at once. ukbconv ukb21481.enc_ukb bulk -ifields.list
  1. Inspect: wc -l ukb21481.bulk and you can see that there is one entry per person per field for whom this data exists
  2. You cannot download more than 1,000 samples' bulk files at a time. So, iteratively do it:
    • For now, just take 50
      • head -n 50 ukb21481.bulk > heart.50
      • ukbfetch -bheart.50 (Note: no space between -b and heart.50)
    • There is also the downloader.exe tool that I created but it may be worse.
    • Try splitting and iterating. (This should be done in its own folder since the split files have no prefix nor suffix). NOTE: This is slower than the downloader.exe approach.
      • split -l 1000 ukb21481.bulk
      • /bin/ls ./ | xargs -I {} ukbfetch -b{}
    • When downloading, don't duplicate prior work:
      • comm -23 newfile.bulk oldfile.bulk > new-samples-only.bulk
      • This shows lines only present in the left file but not the right file. Useful if you have the bulk file from previous downloads.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var SiemensDelimiter = []byte{0x4d, 00, 00, 00}

SiemensDelimiter is defined and used, but we don't actually need to be aware of it to parse correctly

View Source
var SiemensDelimiter2 = []byte{0xcd, 00, 00, 00}

SiemensDelimiter2 is defined and used, but we don't actually need to be aware of it to parse correctly

Functions

func ApplyNoWindowScaling

func ApplyNoWindowScaling(intensity int) uint16

func ApplyOfficialWindowScaling

func ApplyOfficialWindowScaling(storedValue int, rescaleSlope, rescaleIntercept, windowWidth, windowCenter float64, bitsAllocated uint16) uint16

See 'Grayscale Image Display' under https://dgobbi.github.io/vtk-dicom/doc/api/image_display.html . In addition, we also scale the output so that it is appropriate for producing a 16-bit grayscale image. E.g., if the native dicom is 8-bit, we still rescale the output here for a 16-bit format. In the future, could produce 8-bit files where possible, in which case this function would need to be changed.

func ApplyPythonicWindowScaling

func ApplyPythonicWindowScaling(intensity, maxIntensity int) uint16

func CardiacMRIZipIterator

func CardiacMRIZipIterator(zipPath string, processOne func(DicomOutput) error) (err error)

func DecodeImageFromReader

func DecodeImageFromReader(f io.Reader) (image.Image, error)

DecodeImageFromReader decodes a reader containing PNG, GIF, BMP, or JPEG-formatted data and returns a single-frame image.

func DicomToOverlayImage

func DicomToOverlayImage(dicomReader io.Reader, opts DicomOverlayOpts) ([]image.Image, error)

DicomToOverlayImage takes in a dicom file (as a reader), a blank image, and options, and updates the image according to those options.

func DicomToTagMap

func DicomToTagMap(dicomReader io.Reader) (map[dicomtag.Tag][]interface{}, error)

DicomToTagMap takes in a dicom file (in bytes), emits a map of tags

func ExtractDicomFromGoogleStorage

func ExtractDicomFromGoogleStorage(zipPath, dicomName string, includeOverlay bool, storageClient *storage.Client) (image.Image, error)

ExtractDicomFromGoogleStorage fetches a dicom from within a zipped file in Google Storage and returns it as a native go image.Image, optionally with the overlay displayed on top.

func ExtractDicomFromLocalFile

func ExtractDicomFromLocalFile(zipPath, dicomName string, includeOverlay bool) (image.Image, error)

ExtractDicomFromLocalFile constructs a native go Image type from the dicom image with the given name in the given zip file. Now just wraps the GoogleStorage variant, since it has the capability of loading local files as well as remote ones.

func ExtractDicomFromReader

func ExtractDicomFromReader(dicomReader io.Reader, nReaderBytes int64, includeOverlay bool) (image.Image, error)

ExtractDicomFromReader operates on a reader that contains one DICOM.

func ExtractDicomFromReaderFuncOp

func ExtractDicomFromReaderFuncOp(dicomReader io.Reader, nReaderBytes int64, options ...func(*ExtractDicomOptions)) (image.Image, error)

func ExtractDicomFromZipReader

func ExtractDicomFromZipReader(rc *zip.Reader, dicomName string, includeOverlay bool) (image.Image, error)

ExtractDicomFromZipReader consumes a zip reader of the UK Biobank format, finds the dicom of the desired name, and returns that image, with or without the overlay (if any is present) based on includeOverlay.

func ExtractImageFromGoogleStorage

func ExtractImageFromGoogleStorage(dicomName, suffix, folderPath string, storageClient *storage.Client) (image.Image, error)

ExtractImageFromGoogleStorage is now just a deprecated wrapper around MaybeExtractImageFromGoogleStorage and may be removed in the future.

func ExtractImageFromLocalFile

func ExtractImageFromLocalFile(dicomName, suffix, folderPath string) (image.Image, error)

ExtractImageFromLocalFile pulls an image with the specified suffix (derived from the DICOM name) from a local folder. Now just a wrapper.

func ExtractImageFromTarGzMaybeFromGoogleStorage

func ExtractImageFromTarGzMaybeFromGoogleStorage(tarGz, imageFilename string, client *storage.Client) (image.Image, error)

ExtractImageFromTarGzMaybeFromGoogleStorage is now a thin wrapper over ExtractImagesFromTarGzMaybeFromGoogleStorage.

func ExtractImageFromTarReader

func ExtractImageFromTarReader(tarReader *tar.Reader, imageFilename string) (image.Image, error)

ExtractImageFromTarReader consumes a .tar reader, loops over all files until it finds the image with the specified name, and returns that image. This is now a thin wrapper over ExtractImagesFromTarReader.

func ExtractImagesFromTarGzMaybeFromGoogleStorage

func ExtractImagesFromTarGzMaybeFromGoogleStorage(tarGz string, imageFilenames map[string]struct{}, client *storage.Client) (map[string]image.Image, error)

ExtractImagesFromTarGzMaybeFromGoogleStorage looks for tarGz (a fully qualified path to a .tar.gz file, which may optionally be a Google Storage path). If that succeeds, it then looks for imageFilenames within the ungzipped untarred file and processes them into image.Image files, which it returns in a map with the same names as the input map.

func ExtractImagesFromTarReader

func ExtractImagesFromTarReader(tarReader *tar.Reader, imageFilenames map[string]struct{}) (map[string]image.Image, error)

ExtractImagesFromTarReader consumes a .tar reader, loops over all files until it finds all images with the specified names, and returns those images in a named map. If it fails to find all requested files, it still returns the files it found, but also returns an error.

func FetchGIFComponents

func FetchGIFComponents(pngs []string, storageClient *storage.Client) ([]image.Image, error)

func FetchImagesFromZIP

func FetchImagesFromZIP(zipPath string, includeOverlay bool, storageClient *storage.Client) (map[string]image.Image, error)

FetchImagesFromZIP is a deprecated shortcut to FetchNamedImagesFromZIP with an empty list of images, which will return all images from a zip file.

func FetchNamedImagesFromZIP

func FetchNamedImagesFromZIP(zipPath string, includeOverlay bool, storageClient *storage.Client, acceptedFiles []string) (map[string]image.Image, error)

FetchNamedImagesFromZIP fetches images from DICOM files within a Zip file. The Zip file may be local or on Google Storage (if path begins with gs://). The images are returned in a map, keyed to the DICOM name: map[dicom_name]image. If a non-nil slice of filenames is passed, then only filenames that appear in this slice will be processed and returned.

func ImageGrid

func ImageGrid(dicomNames []string, imageMap map[string]image.Image, series string, seriesAlignment []string, imagesInCardiacCycle, Ncols int) ([]string, map[string]image.Image, error)

ImageGrid is a hack that converts a SAX stack (structured as all 50 timepoints for series 1, all 50 timepoints for series 2, etc) into a grid that simultaneously shows each series side-by-side. It highlights the active series based on a seriesAlignment slice that is paired 1:1 with the dicomNames slice. A more elegant approach would look at the series names instead of making assumptions.

func ListFromGoogleStorage

func ListFromGoogleStorage(path string, client *storage.Client) ([]string, error)

func MakeOneGIF

func MakeOneGIF(sortedImages []image.Image, delay int, withTransparency bool) (*gif.GIF, error)

MakeOneGIF creates an animated gif from an ordered slice of images. The delay between frames is in hundredths of a second. The color quantizer is built from *all* input images, and the quantized palette is shared across all of the output frames.

func MakeOneGIFFromMap

func MakeOneGIFFromMap(dicomNames []string, imgMap map[string]image.Image, delay int, withTransparency bool) (*gif.GIF, error)

MakeOneGIFFromMap creates an animated gif from an ordered list of image names along with a map of the respective images.

func MakeOneGIFFromPaths

func MakeOneGIFFromPaths(pngs []string, delay int, withTransparency bool, storageClient *storage.Client) (*gif.GIF, error)

MakeOneGIFFromPaths creates an animated gif from an ordered slice of paths to image files - which may be local or hosted in an accessible Google Storage location. (The string for each png should be a fully specified path.)

func MaybeExtractImageFromGoogleStorage

func MaybeExtractImageFromGoogleStorage(imagePath string, storageClient *storage.Client) (image.Image, error)

MaybeExtractImageFromGoogleStorage pulls an image from a (possibly remote) folder

func OptIncludeOverlay

func OptIncludeOverlay() func(o *ExtractDicomOptions)

func OptWindowScalingOfficial

func OptWindowScalingOfficial() func(o *ExtractDicomOptions)

func OptWindowScalingPythonic

func OptWindowScalingPythonic() func(o *ExtractDicomOptions)

func OptWindowScalingRaw

func OptWindowScalingRaw() func(o *ExtractDicomOptions)

func SafelyDicomParse

func SafelyDicomParse(p dicom.Parser, opts dicom.ParseOptions) (parsedData *element.DataSet, err error)

SafelyDicomParse consumes panics emitted by the dicom library, which are inappropriate and must be captured in order to turn them into recoverable errors.

Types

type DicomMeta

type DicomMeta struct {
	Date               string
	AcquisitionTime    string
	HasOverlay         bool
	OverlayFraction    float64
	OverlayRows        int
	OverlayCols        int
	Rows               int
	Cols               int
	InstanceNumber     string
	PatientX           float64
	PatientY           float64
	PatientZ           float64
	PixelHeightMM      float64
	PixelWidthMM       float64
	SliceThicknessMM   float64
	SeriesDescription  string
	SeriesNumber       string
	AcquisitionNumber  string
	DeviceSerialNumber string
	SoftwareVersions   string
	StationName        string
	EchoTime           string
	NominalInterval    string
	SliceLocation      string
	TriggerTime        string
	ProtocolName       string
}

DicomMeta holds a small subset of the available metadata which we consider to be useful from dicom images.

func DicomToMetadata

func DicomToMetadata(dicomReader io.Reader) (*DicomMeta, error)

Takes in a dicom file (in bytes), emit meta-information

type DicomOutput

type DicomOutput struct {
	SampleID  string
	ZipFile   string
	FieldID   string
	Instance  string
	Index     string
	Filename  string
	DicomMeta DicomMeta
}

func (DicomOutput) ParsedDate

func (d DicomOutput) ParsedDate() (time.Time, error)

type DicomOverlayOpts

type DicomOverlayOpts struct {
	TopLeft struct {
		X int
		Y int
	}
	BottomRight struct {
		X int
		Y int
	}
}

DicomMeta holds a small subset of the available metadata which we consider to be useful from dicom images.

func (DicomOverlayOpts) Subset

func (d DicomOverlayOpts) Subset() bool

type EKG12Lead

type EKG12Lead struct {
	XMLName             xml.Name `xml:"CardiologyXML"`
	Text                string   `xml:",chardata"`
	ObservationType     string   `xml:"ObservationType"`
	ObservationDateTime struct {
		Text   string `xml:",chardata"`
		Hour   string `xml:"Hour"`
		Minute string `xml:"Minute"`
		Second string `xml:"Second"`
		Day    string `xml:"Day"`
		Month  string `xml:"Month"`
		Year   string `xml:"Year"`
	} `xml:"ObservationDateTime"`
	UID struct {
		Text          string `xml:",chardata"`
		DICOMStudyUID string `xml:"DICOMStudyUID"`
	} `xml:"UID"`
	ClinicalInfo struct {
		Text           string `xml:",chardata"`
		ReasonForStudy string `xml:"ReasonForStudy"`
		Technician     struct {
			Text       string `xml:",chardata"`
			FamilyName string `xml:"FamilyName"`
			GivenName  string `xml:"GivenName"`
			PersonID   string `xml:"PersonID"`
		} `xml:"Technician"`
		ObservationComment string `xml:"ObservationComment"`
		DeviceInfo         struct {
			Text        string `xml:",chardata"`
			Desc        string `xml:"Desc"`
			SoftwareVer string `xml:"SoftwareVer"`
			AnalysisVer string `xml:"AnalysisVer"`
		} `xml:"DeviceInfo"`
	} `xml:"ClinicalInfo"`
	PatientVisit struct {
		Text                    string `xml:",chardata"`
		PatientClass            string `xml:"PatientClass"`
		AssignedPatientLocation struct {
			Text           string `xml:",chardata"`
			Facility       string `xml:"Facility"`
			LocationNumber string `xml:"LocationNumber"`
			LocationName   string `xml:"LocationName"`
		} `xml:"AssignedPatientLocation"`
		PatientRoom      string `xml:"PatientRoom"`
		AdmissionType    string `xml:"AdmissionType"`
		OrderingProvider struct {
			Text       string `xml:",chardata"`
			FamilyName string `xml:"FamilyName"`
			GivenName  string `xml:"GivenName"`
			PersonID   string `xml:"PersonID"`
		} `xml:"OrderingProvider"`
		AttendingDoctor struct {
			Text       string `xml:",chardata"`
			FamilyName string `xml:"FamilyName"`
			GivenName  string `xml:"GivenName"`
			PersonID   string `xml:"PersonID"`
		} `xml:"AttendingDoctor"`
		ReferringDoctor struct {
			Text       string `xml:",chardata"`
			FamilyName string `xml:"FamilyName"`
			GivenName  string `xml:"GivenName"`
			PersonID   string `xml:"PersonID"`
		} `xml:"ReferringDoctor"`
		ServicingFacility struct {
			Text    string `xml:",chardata"`
			Name    string `xml:"Name"`
			Address struct {
				Text    string `xml:",chardata"`
				Street1 string `xml:"Street1"`
				City    string `xml:"City"`
			} `xml:"Address"`
		} `xml:"ServicingFacility"`
		SysBP struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"SysBP"`
		DiaBP struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"DiaBP"`
		MedicalHistory struct {
			Text               string `xml:",chardata"`
			MedicalHistoryText string `xml:"MedicalHistoryText"`
		} `xml:"MedicalHistory"`
		OrderNumber string `xml:"OrderNumber"`
		Medications struct {
			Text   string `xml:",chardata"`
			Drug   string `xml:"Drug"`
			Dosage string `xml:"Dosage"`
		} `xml:"Medications"`
		ExtraQuestions struct {
			Text  string `xml:",chardata"`
			Label []struct {
				Text string `xml:",chardata"`
				Type string `xml:"Type,attr"`
			} `xml:"Label"`
			Content []string `xml:"Content"`
		} `xml:"ExtraQuestions"`
	} `xml:"PatientVisit"`
	PatientInfo struct {
		Text string `xml:",chardata"`
		PID  string `xml:"PID"`
		Name struct {
			Text       string `xml:",chardata"`
			FamilyName string `xml:"FamilyName"`
			GivenName  string `xml:"GivenName"`
		} `xml:"Name"`
		Age struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Age"`
		BirthDateTime struct {
			Text  string `xml:",chardata"`
			Day   string `xml:"Day"`
			Month string `xml:"Month"`
			Year  string `xml:"Year"`
		} `xml:"BirthDateTime"`
		Gender string `xml:"Gender"`
		Race   string `xml:"Race"`
		Height struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Height"`
		Weight struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Weight"`
		PaceMaker string `xml:"PaceMaker"`
	} `xml:"PatientInfo"`
	FilterSetting struct {
		Text        string `xml:",chardata"`
		CubicSpline string `xml:"CubicSpline"`
		Filter50Hz  string `xml:"Filter50Hz"`
		Filter60Hz  string `xml:"Filter60Hz"`
		LowPass     struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"LowPass"`
		HighPass struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"HighPass"`
	} `xml:"FilterSetting"`
	DeviceType     string `xml:"Device-Type"`
	Interpretation struct {
		Text      string `xml:",chardata"`
		Diagnosis struct {
			Text          string   `xml:",chardata"`
			DiagnosisText []string `xml:"DiagnosisText"`
		} `xml:"Diagnosis"`
		Conclusion struct {
			Text           string   `xml:",chardata"`
			ConclusionText []string `xml:"ConclusionText"`
		} `xml:"Conclusion"`
	} `xml:"Interpretation"`
	RestingECGMeasurements struct {
		Text             string `xml:",chardata"`
		DiagnosisVersion string `xml:"DiagnosisVersion"`
		VentricularRate  struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"VentricularRate"`
		PQInterval struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"PQInterval"`
		PDuration struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"PDuration"`
		QRSDuration struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"QRSDuration"`
		QTInterval struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"QTInterval"`
		QTCInterval struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"QTCInterval"`
		RRInterval struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"RRInterval"`
		PPInterval struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"PPInterval"`
		SokolovLVHIndex struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"SokolovLVHIndex"`
		PAxis struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"PAxis"`
		RAxis struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"RAxis"`
		TAxis struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"TAxis"`
		QTDispersion struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"QTDispersion"`
		QTDispersionBazett struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"QTDispersionBazett"`
		QRSNum           string `xml:"QRSNum"`
		MeasurementTable struct {
			Text      string `xml:",chardata"`
			Creation  string `xml:"Creation,attr"`
			LeadOrder string `xml:"LeadOrder"`
			QDuration struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"QDuration"`
			RDuration struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"RDuration"`
			SDuration struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"SDuration"`
			RpDuration struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"RpDuration"`
			PAmplitude struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"PAmplitude"`
			QAmplitude struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"QAmplitude"`
			RAmplitude struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"RAmplitude"`
			SAmplitude struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"SAmplitude"`
			R1Amplitude struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"R1Amplitude"`
			S1Amplitude struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"S1Amplitude"`
			JAmplitude struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"JAmplitude"`
			JXAmplitude struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"JXAmplitude"`
			TAmplitude struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"TAmplitude"`
			JXSlope struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"JXSlope"`
			R1Duration struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"R1Duration"`
			P1Amplitude struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"P1Amplitude"`
			JXEAmplitude struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"JXEAmplitude"`
			T1Amplitude struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"T1Amplitude"`
		} `xml:"MeasurementTable"`
		POnset struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"POnset"`
		POffset struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"POffset"`
		QOnset struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"QOnset"`
		QOffset struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"QOffset"`
		TOffset struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"TOffset"`
		MedianSamples struct {
			Text          string `xml:",chardata"`
			NumberOfLeads string `xml:"NumberOfLeads"`
			SampleRate    struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"SampleRate"`
			ChannelSampleCountTotal string `xml:"ChannelSampleCountTotal"`
			Resolution              struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"Resolution"`
			FirstValid struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"FirstValid"`
			LastValid struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"LastValid"`
			WaveformData []struct {
				Text string `xml:",chardata"`
				Lead string `xml:"lead,attr"`
			} `xml:"WaveformData"`
		} `xml:"MedianSamples"`
	} `xml:"RestingECGMeasurements"`
	VectorLoops struct {
		Text       string `xml:",chardata"`
		Creation   string `xml:"Creation,attr"`
		Resolution struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Resolution"`
		ChannelSampleCountTotal string `xml:"ChannelSampleCountTotal"`
		POnset                  struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"POnset"`
		POffset struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"POffset"`
		QOnset struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"QOnset"`
		QOffset struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"QOffset"`
		TOffset struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"TOffset"`
		Frontal []struct {
			Text string `xml:",chardata"`
			Lead string `xml:"Lead,attr"`
		} `xml:"Frontal"`
		Horizontal []struct {
			Text string `xml:",chardata"`
			Lead string `xml:"Lead,attr"`
		} `xml:"Horizontal"`
		Sagittal []struct {
			Text string `xml:",chardata"`
			Lead string `xml:"Lead,attr"`
		} `xml:"Sagittal"`
	} `xml:"VectorLoops"`
	StripData struct {
		Text          string `xml:",chardata"`
		NumberOfLeads string `xml:"NumberOfLeads"`
		SampleRate    struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"SampleRate"`
		ChannelSampleCountTotal string `xml:"ChannelSampleCountTotal"`
		Resolution              struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Resolution"`
		WaveformData []struct {
			Text string `xml:",chardata"`
			Lead string `xml:"lead,attr"`
		} `xml:"WaveformData"`
		ArrhythmiaResults struct {
			Text string `xml:",chardata"`
			Time []struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"Time"`
			BeatClass []string `xml:"BeatClass"`
		} `xml:"ArrhythmiaResults"`
	} `xml:"StripData"`
	FullDisclosure struct {
		Text             string `xml:",chardata"`
		NumberOfChannels string `xml:"NumberOfChannels"`
		SampleRate       struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"SampleRate"`
		Resolution struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Resolution"`
		LeadOrder          string `xml:"LeadOrder"`
		FullDisclosureData struct {
			Text             string `xml:",chardata"`
			SampleCountTotal string `xml:"SampleCountTotal"`
		} `xml:"FullDisclosureData"`
		EventList struct {
			Text  string   `xml:",chardata"`
			Event []string `xml:"Event"`
			Time  []struct {
				Text   string `xml:",chardata"`
				Minute string `xml:"Minute"`
				Second string `xml:"Second"`
			} `xml:"Time"`
		} `xml:"EventList"`
		ArrhythmiaResults struct {
			Text string `xml:",chardata"`
			QRS  string `xml:"QRS"`
		} `xml:"ArrhythmiaResults"`
	} `xml:"FullDisclosure"`
	Export string `xml:"Export"`
	CSWeb  struct {
		Text string `xml:",chardata"`
		A    struct {
			Text string `xml:",chardata"`
			Href string `xml:"href,attr"`
		} `xml:"a"`
	} `xml:"CSWeb"`
}

EKG12Lead was generated 2019-10-19 15:07:45 by james on Skylake.

type EKGExercise

type EKGExercise struct {
	XMLName             xml.Name `xml:"CardiologyXML"`
	Text                string   `xml:",chardata"`
	ObservationType     string   `xml:"ObservationType"`
	ObservationDateTime struct {
		Text   string `xml:",chardata"`
		Hour   string `xml:"Hour"`
		Minute string `xml:"Minute"`
		Second string `xml:"Second"`
		Day    string `xml:"Day"`
		Month  string `xml:"Month"`
		Year   string `xml:"Year"`
	} `xml:"ObservationDateTime"`
	ObservationEndDateTime struct {
		Text   string `xml:",chardata"`
		Hour   string `xml:"Hour"`
		Minute string `xml:"Minute"`
		Second string `xml:"Second"`
		Day    string `xml:"Day"`
		Month  string `xml:"Month"`
		Year   string `xml:"Year"`
	} `xml:"ObservationEndDateTime"`
	ClinicalInfo struct {
		Text       string `xml:",chardata"`
		DeviceInfo struct {
			Text        string `xml:",chardata"`
			Desc        string `xml:"Desc"`
			SoftwareVer string `xml:"SoftwareVer"`
			AnalysisVer string `xml:"AnalysisVer"`
		} `xml:"DeviceInfo"`
	} `xml:"ClinicalInfo"`
	PatientVisit struct {
		Text                    string `xml:",chardata"`
		PatientClass            string `xml:"PatientClass"`
		AssignedPatientLocation struct {
			Text           string `xml:",chardata"`
			Facility       string `xml:"Facility"`
			LocationNumber string `xml:"LocationNumber"`
		} `xml:"AssignedPatientLocation"`
		AdmissionType     string `xml:"AdmissionType"`
		ServicingFacility string `xml:"ServicingFacility"`
	} `xml:"PatientVisit"`
	PatientInfo struct {
		Text string `xml:",chardata"`
		PID  string `xml:"PID"`
		Name struct {
			Text       string `xml:",chardata"`
			FamilyName string `xml:"FamilyName"`
			GivenName  string `xml:"GivenName"`
		} `xml:"Name"`
		Age struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Age"`
		BirthDateTime struct {
			Text  string `xml:",chardata"`
			Day   string `xml:"Day"`
			Month string `xml:"Month"`
			Year  string `xml:"Year"`
		} `xml:"BirthDateTime"`
		Gender string `xml:"Gender"`
		Race   string `xml:"Race"`
		Height struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Height"`
		Weight struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Weight"`
		PaceMaker string `xml:"PaceMaker"`
	} `xml:"PatientInfo"`
	Medications          string `xml:"Medications"`
	ExerciseMeasurements struct {
		Text        string `xml:",chardata"`
		MaxWorkload struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"MaxWorkload"`
		ExercisePhaseTime struct {
			Text   string `xml:",chardata"`
			Minute string `xml:"Minute"`
			Second string `xml:"Second"`
		} `xml:"ExercisePhaseTime"`
		MaxHeartRate    string `xml:"MaxHeartRate"`
		MaxPredictedHR  string `xml:"MaxPredictedHR"`
		TargetHeartRate struct {
			Text     string `xml:",chardata"`
			Achieved string `xml:"achieved,attr"`
		} `xml:"TargetHeartRate"`
		PercentAchievedMaxPredicted string `xml:"PercentAchievedMaxPredicted"`
		PeakPercentMaxPredicted     string `xml:"PeakPercentMaxPredicted"`
		TargetHRFormula             string `xml:"TargetHRFormula"`
		TargetLoad                  struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"TargetLoad"`
		STHRSlope struct {
			Text          string `xml:",chardata"`
			STHRSlopeLead []struct {
				Text        string `xml:",chardata"`
				Lead        string `xml:"lead,attr"`
				Maxslope    string `xml:"maxslope,attr"`
				Slope       string `xml:"Slope"`
				Intercept   string `xml:"Intercept"`
				Correlation string `xml:"Correlation"`
				NumPoints   string `xml:"NumPoints"`
			} `xml:"STHRSlopeLead"`
		} `xml:"STHRSlope"`
		RestingStats struct {
			Text    string `xml:",chardata"`
			RestHR  string `xml:"RestHR"`
			RestVES string `xml:"RestVES"`
			RestST  struct {
				Text         string `xml:",chardata"`
				Measurements []struct {
					Text        string `xml:",chardata"`
					Lead        string `xml:"lead,attr"`
					STAmplitude struct {
						Text  string `xml:",chardata"`
						Units string `xml:"units,attr"`
					} `xml:"STAmplitude"`
					STSlope struct {
						Text  string `xml:",chardata"`
						Units string `xml:"units,attr"`
					} `xml:"STSlope"`
				} `xml:"Measurements"`
			} `xml:"RestST"`
		} `xml:"RestingStats"`
		PeakExStats struct {
			Text       string `xml:",chardata"`
			PeakExHR   string `xml:"PeakExHR"`
			PeakExMets string `xml:"PeakExMets"`
			PeakExVES  string `xml:"PeakExVES"`
			PeakExST   struct {
				Text         string `xml:",chardata"`
				Measurements []struct {
					Text        string `xml:",chardata"`
					Lead        string `xml:"lead,attr"`
					STAmplitude struct {
						Text  string `xml:",chardata"`
						Units string `xml:"units,attr"`
					} `xml:"STAmplitude"`
					STSlope struct {
						Text  string `xml:",chardata"`
						Units string `xml:"units,attr"`
					} `xml:"STSlope"`
				} `xml:"Measurements"`
			} `xml:"PeakExST"`
		} `xml:"PeakExStats"`
		MaxSTStats struct {
			Text           string `xml:",chardata"`
			MaxSTAmplitude struct {
				Text  string `xml:",chardata"`
				Lead  string `xml:"lead,attr"`
				Units string `xml:"units,attr"`
			} `xml:"MaxSTAmplitude"`
			MaxSTTime struct {
				Text   string `xml:",chardata"`
				Minute string `xml:"Minute"`
				Second string `xml:"Second"`
			} `xml:"MaxSTTime"`
			MaxSTHR   string `xml:"MaxSTHR"`
			MaxSTMets string `xml:"MaxSTMets"`
			MaxSTVES  string `xml:"MaxSTVES"`
			MaxST     struct {
				Text         string `xml:",chardata"`
				Measurements []struct {
					Text        string `xml:",chardata"`
					Lead        string `xml:"lead,attr"`
					STAmplitude struct {
						Text  string `xml:",chardata"`
						Units string `xml:"units,attr"`
					} `xml:"STAmplitude"`
					STSlope struct {
						Text  string `xml:",chardata"`
						Units string `xml:"units,attr"`
					} `xml:"STSlope"`
				} `xml:"Measurements"`
			} `xml:"MaxST"`
		} `xml:"MaxSTStats"`
	} `xml:"ExerciseMeasurements"`
	Interpretation string `xml:"Interpretation"`
	Protocol       struct {
		Text   string `xml:",chardata"`
		Device string `xml:"Device"`
		Phase  []struct {
			Text          string `xml:",chardata"`
			Ramping       string `xml:"ramping,attr"`
			ProtocolName  string `xml:"ProtocolName"`
			PhaseName     string `xml:"PhaseName"`
			PhaseDuration struct {
				Text   string `xml:",chardata"`
				Minute string `xml:"Minute"`
				Second string `xml:"Second"`
			} `xml:"PhaseDuration"`
			Stage []struct {
				Text          string `xml:",chardata"`
				Idx           string `xml:"idx,attr"`
				StageName     string `xml:"StageName"`
				StageDuration struct {
					Text   string `xml:",chardata"`
					Minute string `xml:"Minute"`
					Second string `xml:"Second"`
				} `xml:"StageDuration"`
			} `xml:"Stage"`
		} `xml:"Phase"`
	} `xml:"Protocol"`
	TrendData struct {
		Text            string `xml:",chardata"`
		NumberOfEntries string `xml:"NumberOfEntries"`
		TrendEntry      []struct {
			Text      string `xml:",chardata"`
			Idx       string `xml:"Idx,attr"`
			EntryTime struct {
				Text   string `xml:",chardata"`
				Minute string `xml:"Minute"`
				Second string `xml:"Second"`
			} `xml:"EntryTime"`
			HeartRate        string `xml:"HeartRate"`
			Mets             string `xml:"Mets"`
			VECount          string `xml:"VECount"`
			PaceCount        string `xml:"PaceCount"`
			Artifact         string `xml:"Artifact"`
			LeadMeasurements []struct {
				Text            string `xml:",chardata"`
				Lead            string `xml:"lead,attr"`
				JPointAmplitude struct {
					Text  string `xml:",chardata"`
					Units string `xml:"units,attr"`
				} `xml:"JPointAmplitude"`
				STAmplitude20ms struct {
					Text  string `xml:",chardata"`
					Units string `xml:"units,attr"`
				} `xml:"STAmplitude20ms"`
				STAmplitude struct {
					Text  string `xml:",chardata"`
					Units string `xml:"units,attr"`
				} `xml:"STAmplitude"`
				RAmplitude struct {
					Text  string `xml:",chardata"`
					Units string `xml:"units,attr"`
				} `xml:"RAmplitude"`
				R1Amplitude struct {
					Text  string `xml:",chardata"`
					Units string `xml:"units,attr"`
				} `xml:"R1Amplitude"`
				STSlope struct {
					Text  string `xml:",chardata"`
					Units string `xml:"units,attr"`
				} `xml:"STSlope"`
				STIntegral string `xml:"STIntegral"`
				STIndex    string `xml:"STIndex"`
			} `xml:"LeadMeasurements"`
			Load struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"Load"`
			Grade struct {
				Text  string `xml:",chardata"`
				Units string `xml:"units,attr"`
			} `xml:"Grade"`
			PhaseTime struct {
				Text   string `xml:",chardata"`
				Minute string `xml:"Minute"`
				Second string `xml:"Second"`
			} `xml:"PhaseTime"`
			PhaseName string `xml:"PhaseName"`
			StageTime struct {
				Text   string `xml:",chardata"`
				Minute string `xml:"Minute"`
				Second string `xml:"Second"`
			} `xml:"StageTime"`
			StageNumber string `xml:"StageNumber"`
			StageName   string `xml:"StageName"`
		} `xml:"TrendEntry"`
	} `xml:"TrendData"`
	MedianData struct {
		Text       string `xml:",chardata"`
		SampleRate struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"SampleRate"`
		Resolution struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Resolution"`
		Median []struct {
			Text string `xml:",chardata"`
			Idx  string `xml:"Idx,attr"`
			Time struct {
				Text   string `xml:",chardata"`
				Minute string `xml:"Minute"`
				Second string `xml:"Second"`
			} `xml:"Time"`
			IPoint       string `xml:"I-Point"`
			JPoint       string `xml:"J-Point"`
			JXPoint      string `xml:"JX-Point"`
			PPoint       string `xml:"P-Point"`
			PEPoint      string `xml:"PE-Point"`
			QPoint       string `xml:"Q-Point"`
			TPoint       string `xml:"T-Point"`
			WaveformData []struct {
				Text     string `xml:",chardata"`
				Lead     string `xml:"lead,attr"`
				StartIdx string `xml:"startIdx,attr"`
			} `xml:"WaveformData"`
		} `xml:"Median"`
	} `xml:"MedianData"`
	TWACycleData struct {
		Text       string `xml:",chardata"`
		SampleRate struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"SampleRate"`
		Resolution struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Resolution"`
	} `xml:"TWACycleData"`
	StripData struct {
		Text       string `xml:",chardata"`
		SampleRate struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"SampleRate"`
		Resolution struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Resolution"`
		Strip struct {
			Text string `xml:",chardata"`
			Idx  string `xml:"idx,attr"`
			Time struct {
				Text   string `xml:",chardata"`
				Minute string `xml:"Minute"`
				Second string `xml:"Second"`
			} `xml:"Time"`
			WaveformData []struct {
				Text string `xml:",chardata"`
				Lead string `xml:"lead,attr"`
			} `xml:"WaveformData"`
		} `xml:"Strip"`
	} `xml:"StripData"`
	ArrhythmiaData struct {
		Text       string `xml:",chardata"`
		SampleRate struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"SampleRate"`
		Resolution struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Resolution"`
	} `xml:"ArrhythmiaData"`
	FullDisclosure struct {
		Text      string `xml:",chardata"`
		StartTime struct {
			Text   string `xml:",chardata"`
			Minute string `xml:"Minute"`
			Second string `xml:"Second"`
		} `xml:"StartTime"`
		NumberOfChannels string `xml:"NumberOfChannels"`
		SampleRate       struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"SampleRate"`
		Resolution struct {
			Text  string `xml:",chardata"`
			Units string `xml:"units,attr"`
		} `xml:"Resolution"`
		LeadOrder          string `xml:"LeadOrder"`
		FullDisclosureData string `xml:"FullDisclosureData"`
	} `xml:"FullDisclosure"`
}

EKGExercise was generated 2019-10-19 15:07:26 by james on Skylake.

type ExtractDicomOptions

type ExtractDicomOptions struct {
	IncludeOverlay bool
	WindowScaling  string
}

type FieldID

type FieldID string
const (
	AorticDistensibility FieldID = "20210"
	BloodFlow            FieldID = "20213"
	CineTagging          FieldID = "20211"
	SHMOLLI              FieldID = "20214"
	LVOT                 FieldID = "20212"
	LAX                  FieldID = "20208"
	Scout                FieldID = "20207"
	SAX                  FieldID = "20209"
)

type GSReaderAtCloser deprecated

type GSReaderAtCloser = genomisc.GSReaderAtCloser

Deprecated: Use github.com/carbocation/genomisc.GSReaderAtCloser instead

type ReaderAtCloser deprecated

type ReaderAtCloser = genomisc.ReaderAtCloser

Deprecated: Use github.com/carbocation/genomisc.ReaderAtCloser instead

func MaybeOpenFromGoogleStorage

func MaybeOpenFromGoogleStorage(path string, client *storage.Client) (ReaderAtCloser, int64, error)

type SiemensChunk

type SiemensChunk struct {
	Name           string
	VM             uint32
	VR             string
	SyngoDT        uint32
	Subelements    uint32
	SubElementData []string
	Order          int
}

func ReadChunk

func ReadChunk(bread *bytes.Reader, offset int64) (SiemensChunk, int64)

ReadChunk reads a named element and any subelements from the Siemens header.

type SiemensHeader

type SiemensHeader struct {
	NElements int
	Elements  map[string]SiemensChunk
}

func ParseSiemensHeader

func ParseSiemensHeader(v interface{}) (SiemensHeader, error)

ParseSiemensHeader consumes the element corresponding to the Siemens header and parses it fully.

func (SiemensHeader) Slice

func (s SiemensHeader) Slice() []SiemensChunk

func (SiemensHeader) String

func (s SiemensHeader) String() string

type VENC

type VENC struct {
	FlowVenc   float64
	BitsStored float64
}

VENC is a struct containing the values necessary for converting a pixel intensity to a velocity for that pixel

func NewVENC

func NewVENC(FlowVenc string, BitsStored uint16) (VENC, error)

NewVENC consumes the raw string values for FlowVenc and BitsStored, returning a VENC object that is ready to be used for calculating pixel velocities

func (VENC) PixelIntensityToVelocity

func (v VENC) PixelIntensityToVelocity(pixelIntensity float64) (velocity float64)

PixelIntensityToVelocity converts a pixel intensity (from DICOM format) into a value that ranges from -flowvenc to +flowvenc.

type ZipMetadata

type ZipMetadata struct {
	SampleID string
	FieldID  string
	Instance string
	Index    string
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL