private static boolean isRetrieveRsp(DicomObject cmd) { int cmdField = cmd.getInt(Tag.CommandField); return cmdField == CommandUtils.C_MOVE_RSP || cmdField == CommandUtils.C_GET_RSP; }
public DicomObject makePatientDirectoryRecord(DicomObject dcmobj) { DicomObject rec = makeRecord(DirectoryRecordType.PATIENT, patientKeys, dcmobj); if (!rec.contains(Tag.PatientName)) { rec.putNull(Tag.PatientName, VR.PN); } if (!rec.containsValue(Tag.PatientID)) { rec.putString(Tag.PatientID, VR.LO, dcmobj .getString(Tag.StudyInstanceUID)); } return rec; }
public String getPrivateCreator(int tag) { if( ds1.contains(tag) ) return ds1.getPrivateCreator(tag); return ds2.getPrivateCreator(tag); }
public SpecificCharacterSet getSpecificCharacterSet() { if( ds1.contains(Tag.SpecificCharacterSet) ) return ds1.getSpecificCharacterSet(); return ds2.getSpecificCharacterSet(); }
public static DicomObject mkNActionRQ(int msgId, String cuid, String iuid, int actionTypeID, DicomObject data) { DicomObject rq = mkRQ(msgId, N_ACTION_RQ, data == null ? NO_DATASET : withDatasetType); rq.putString(Tag.RequestedSOPClassUID, VR.UI, cuid); rq.putString(Tag.RequestedSOPInstanceUID, VR.UI, iuid); rq.putInt(Tag.ActionTypeID, VR.US, actionTypeID); return rq; }
minMax = calcMinMax(mLut); } else { slope = mObj.getFloat(Tag.RescaleSlope, 1.f); intercept = mObj.getFloat(Tag.RescaleIntercept, 0.f); int minPixel = img.getInt(Tag.SmallestImagePixelValue); int maxPixel = img.getInt(Tag.LargestImagePixelValue); if(img.containsValue(Tag.SmallestImagePixelValue) && img.containsValue(Tag.LargestImagePixelValue) && minPixel != maxPixel ) { minMax = new int[] { minPixel, maxPixel }; } else if (raster == null || !(raster.getSampleModel() instanceof ComponentSampleModel) ) { log.debug("Using min/max possible values to compute WL range, as we don't have data buffer to use."); int stored = img.getInt(Tag.BitsStored); boolean signed = img.getInt(Tag.PixelRepresentation) == 1; if (stored == 16) { String rescaleType = mObj.getString(Tag.RescaleType); if ("HU".equalsIgnoreCase(rescaleType)) { stored = 12;
public void anonymize(DicomObject ds) { String newPid = updateId(ds,Tag.PatientID,salt); ds.putString(Tag.IssuerOfPatientID,null,"Anon"); long lastId = decodeLong(newPid,0); long firstId = decodeLong(newPid,1); String last = lastNames[(int) (lastId % lastNames.length)]; String sex = ds.getString(Tag.PatientSex); boolean isFemale = "F".equalsIgnoreCase(sex); first = maleFirstNames[(int) (firstId % maleFirstNames.length)]; ds.putString(Tag.PatientName,VR.PN, last+"^"+first+"^anonymous"); Calendar cal = Calendar.getInstance(); int duration = 1+(int) (decodeLong(newPid,1) % 35600); cal.add(Calendar.DAY_OF_YEAR, -duration); ds.putDate(Tag.PatientBirthDate, VR.DA, cal.getTime()); String newStudyUID = updateUID(ds,Tag.StudyInstanceUID,salt); cal.add(Calendar.DAY_OF_YEAR, (int) (decodeLong(newStudyUID,0) % duration)); ds.putDate(Tag.StudyDate, VR.DA, cal.getTime()); ds.remove(Tag.OtherPatientIDs); ds.remove(Tag.OtherPatientIDsSequence); if( ds.contains(Tag.MediaStorageSOPInstanceUID) ) updateUID(ds,Tag.MediaStorageSOPInstanceUID,salt); updateId(ds,Tag.AccessionNumber,salt); updateId(ds,Tag.StudyID,salt);
/** Update an ID field - handles Patient ID, Accession#, StudyID etc */ public static String updateId(DicomObject ds, int tag, long deident) { String orig = ds.getString(tag); if( orig==null ) orig = Integer.toHexString(tag); String v = SHA1(orig+deident); v = v.substring(0,14).replace('+','_'); ds.putString(tag,null, v); return v; }
private String getBaseName(DicomObject d) { String result = "UNKNOWN.dcm"; String sopInstanceUID = d.getString(Tag.SOPInstanceUID); return sopInstanceUID + ".dcm"; }
@Override public DicomElement get(int tag, VR vr) { return filter(tag) ? attrs.get(tag, vr) : null; }
if (!this.mwl.contains(Tag.SpecificCharacterSet)) this.mwl.putNull(Tag.SpecificCharacterSet, VR.CS); this.rsp.putInt(Tag.Status, VR.US, mwl.containsAll(keys) ? Status.Pending : Status.PendingWarning); return true; this.rsp.putInt(Tag.Status, VR.US, Status.Success); this.rsp.putInt(Tag.Status, VR.US, Status.Cancel);
@Override public boolean next() throws IOException, InterruptedException { /** Sucess */ this.rsp.putInt(Tag.Status, VR.US, Status.Success); /** Clean pointers */ this.current = null; return true ; }
VR vr = attr.vr(); if (!TagUtils.isPrivateDataElement(tag) || (!resolveDestinationPrivateTags && TagUtils.isPrivateCreatorDataElement(tag))) dest.add(attr); else if (!TagUtils.isPrivateCreatorDataElement(tag)) { int destTag = resolveDestinationPrivateTags ? dest.resolveTag(tag, getPrivateCreator(tag), true) : tag; if (attr.hasItems()) { DicomElement t; if (vr == VR.SQ) { t = dest.putSequence(destTag, n); for (int i = 0; i < n; i++) { DicomObject srcItem = attr.getDicomObject(i); BasicDicomObject item = new BasicDicomObject( srcItem.size()); item.setParent(dest); srcItem.copyTo(item, resolveDestinationPrivateTags); t.addDicomObject(item); t = dest.putFragments(destTag, vr, attr.bigEndian(), n); for (int i = 0; i < n; i++) { t.addFragment(attr.getFragment(i)); dest.putBytes(destTag, vr, attr.getBytes(), attr.bigEndian());
private boolean purge(DicomObject rec, int[] purged) throws IOException { boolean purge = !rec.containsValue(Tag.ReferencedFileID); for (DicomObject child = readRecord( rec.getInt(Tag.OffsetOfReferencedLowerLevelDirectoryEntity)); child != null; child = readRecord(child.getInt(Tag.OffsetOfTheNextDirectoryRecord))) { if (child.getInt(Tag.RecordInUseFlag) != INACTIVE) { purge = purge(child, purged) && purge; } } if (purge) { deleteRecord(rec); purged[0]++; } return purge; } }
private static byte[] decodePaletteColorLut(int size, DicomObject ds, int descTag, int dataTag, int segmTag) { int[] desc = ds.getInts(descTag); if (desc == null) { throw new IllegalArgumentException("Missing LUT Descriptor!"); byte[] data = ds.getBytes(dataTag); short[] segm = ds.getShorts(segmTag); if (segm == null) { throw new IllegalArgumentException("Missing LUT Data!"); if (data.length != len) { if( data.length == 2*len ) { short[] data16 = ds.getShorts(dataTag); if( data16!=null ) { data = new byte[len]; throwLutLengthMismatch(data.length, len); int hibyte = ds.bigEndian() ? 0 : 1; for (int i = 0; i < len; i++) { out[i + off] = data[(i << 1) + hibyte];
static int[] calcMinMax(DicomObject lut) { int[] desc = lut.getInts(Tag.LUTDescriptor); byte[] data = lut.getBytes(Tag.LUTData); if (desc == null) { throw new IllegalArgumentException("Missing LUT Descriptor!"); int hibyte = lut.bigEndian() ? 0 : 1; int lobyte = 1 - hibyte; for (int i = 0, j = 0; i < len; i++, j++, j++) {
/** * This updates the metadata with relevant information from the image, such * as the size etc. * * @param metadata * @param image */ public void updateDicomHeader(DicomStreamMetaData metadata, BufferedImage image) { DicomObject dobj = metadata.getDicomObject(); // Assume that if it has bits stored, then everything else is // correct.... if (dobj.containsValue(Tag.BitsStored)) return; int numSamples = image.getColorModel().getNumComponents(); if (numSamples == 4) numSamples = 3; dobj.putInt(Tag.SamplesPerPixel, VR.US, numSamples); int bits = image.getColorModel().getComponentSize(0); int allocated = 8; if (bits > 8) allocated = 16; dobj.putInt(Tag.BitsStored, VR.US, bits); dobj.putInt(Tag.BitsAllocated, VR.US, allocated); dobj.putInt(Tag.Columns, VR.US, image.getWidth()); dobj.putInt(Tag.Rows, VR.US, image.getHeight()); }