On 24 November 2011 13:01, Kris Thielemans <kris.f.thielem...@gmail.com> wrote: >> -----Original Message----- >> From: carandr...@gmail.com [mailto:carandr...@gmail.com] On Behalf Of >> Carnë Draug >> Sent: 24 November 2011 12:42 >> To: Andy Buckle >> Cc: Kris Thielemans; octave-dev@lists.sourceforge.net >> Subject: Re: [OctDev] experimental dicom support: changing code for >> multiple elements and byteorder etc >> >> On 24 November 2011 09:34, Andy Buckle <andybuc...@gmail.com> wrote: >> > On 23 November 2011 23:05, Kris Thielemans >> <kris.f.thielem...@gmail.com> wrote: >> >> Hi >> >> >> >> I'm modifying octave-forge/extra/dicom/src/dicominfo.cpp to handle >> data >> >> which are arrays, i.e. VM>1. I realize that not many people will know >> DICOM, >> >> let alone GDCM, but I'd appreciate any feedback in any case. (There's >> some >> >> generic octave questions at the end) >> >> >> >> Also, it would be good if someone could test the current dicominfo on >> >> systems with different byteorders. I suspect that it'll only work when > the >> >> byteorder of the dicom file is the same as the one of the machine > you're >> >> running it on. >> >> >> >> I had a look at gdcm example code and it seems to me that we cannot >> really >> >> use memcpy to get from the dicom raw data to octave data. This >> presumably >> >> wouldn't work when byteswapping is needed (or other "transfer >> syntax"). In >> >> any case, I wouldn't know if memcpy would work with arrays (I'm not > sure >> if >> >> it's guaranteed by DICOM that the subsequent members are stored >> >> consecutively, although it's very likely of course). In an attempt to > handle >> >> this (and avoid horrible code repetition) I came up with the following >> >> modification for element2value() in dicominfo.cpp: >> >> >> >> ------------------ current code ------------------- >> >> if (vr & gdcm::VR::US) {// unsigned short >> >> uint16_t usval ; >> >> memcpy(&usval, elem->GetByteValue()->GetPointer(), 2); >> >> *ov=usval; >> >> if(chatty) octave_stdout << '[' << usval << "]\n"; >> >> } else ... >> >> // almost repeated for lots of VRs and types >> >> return DICOM_OK; >> >> -------------------- new code ----------------- >> >> if (vr & gdcm::VR::US) {// unsigned short >> >> return element2intvalueHelper<gdcm::VR::US>(ov, elem, chatty); >> >> } else ... >> >> // repeated for lots of VRs >> >> >> >> ---------------------- new function definition (in dicominfo.cpp) >> >> --------------------- >> >> template <gdcm::VR::VRType vrtype> >> >> int element2intvalueHelper(octave_value *ov, const gdcm::DataElement >> * elem, >> >> const int chatty) { >> >> if( !elem->IsEmpty() ) { >> >> // find type that corresponds to this VR >> >> typedef typename gdcm::VRToType<vrtype >::Type actual_type; >> >> gdcm::Element<vrtype,gdcm::VM::VM1_n> el; >> >> el.Set( elem->GetValue() ); >> >> intNDArray<octave_int<actual_type> > val(dim_vector >> (el.GetLength(),1)); >> >> for (unsigned i=0; i<el.GetLength(); ++i) >> >> val(i) = el.GetValue(i); >> >> *ov=val; >> >> if(chatty) octave_stdout << '[' << val << "]\n"; >> >> return DICOM_OK; >> >> } >> >> else >> >> { >> >> return DICOM_NOTHING_ASSIGNED; >> >> } >> >> } >> >> > ------------------------------------------------------------------------- >> >> >> >> This seems to work. It might be somewhat inefficient though, as we're >> >> creating a temporary array, copying to an octave_value, and then > getting >> rid >> >> of it. I'm not sure how to avoid this, or even if it's an issue. >> >> Also, it's annoying that I need to have 2 separate code sets for ints > and >> >> floats (as I need intNDArray<octave_int<short> > etc because of missing >> >> constructors in octave_value). >> >> >> >> Any suggestions for improvements? >> >> >> >> Thanks >> >> >> >> Kris Thielemans >> >> Algorithms and Software Consulting Ltd >> >> Honorary Lecturer at Imperial College London >> > >> > It's really nice to see someone else working on the dicom package. >> > >> > Have you timed it on your system? How much slower is it? >> > >> > It did occur to me that memcpy may cause problems. Do you have a >> > system where it does? I have used it on a few and it always works. I >> > guess having someone with different types of mac to have a try might >> > be useful. >> > >> > Do you have write acces to sf.net svn? If not please can this be >> > granted. Carnë, is that your remit now? >> > >> > Driver issues with my linux system are still consuming my spare time, >> > so I have not actually tried your code yet. I would not actually >> > commit this yet unless; >> > - The timed performance degradation is tiny, or, >> > - We have confirmation of our suspicion that it does cause a problem >> > on some systems. >> > >> > -- >> > /* andy buckle */ >> >> Hi Kris >> >> do you have any experience with svn? If so, I can give you write >> access to the repo as requested by Andy. You'll need a sourceforge >> account for that (you can use openID such as your google account to >> create one). >> >> Carnë > > Hi > I have used CVS a lot. SVN is a bit newer to me, but I guess I'll manage. My > SF account is krthie. Thanks! > > Kris
Done. You should write access now to the repo now. You can checkout the whole repo with svn co https://octave.svn.sourceforge.net/svnroot/octave/trunk/octave-forge or just the dicom package with svn co https://octave.svn.sourceforge.net/svnroot/octave/trunk/octave-forge/extra/dicom Carnë ------------------------------------------------------------------------------ All the data continuously generated in your IT infrastructure contains a definitive record of customers, application performance, security threats, fraudulent activity, and more. Splunk takes this data and makes sense of it. IT sense. And common sense. http://p.sf.net/sfu/splunk-novd2d _______________________________________________ Octave-dev mailing list Octave-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/octave-dev