You can subscribe to this list here.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
(2) |
Dec
(1) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
|
Feb
|
Mar
(2) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(2) |
Oct
|
Nov
(1) |
Dec
(1) |
2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2005 |
Jan
(3) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
(1) |
Sep
|
Oct
(2) |
Nov
|
Dec
|
2008 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2023 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: rida <ri...@cy...> - 2023-02-13 10:31:18
|
Hello, I've been using Medcon CLI to convert our TEP dynamic image from dicom to ecat. For static images it works fine, but for dynamic images it saying DICOM is not appropriate for dynamic data - for example, it will convert a set of dynamic images into a static image, and lose all the time information. Have you any solution for this problem? Thanks in advance. Best regards, Hanan |
From: Chris B. <cwb...@uc...> - 2008-08-13 19:54:38
|
Dear xmedcon community, This is my first e-mail to the list, so I apologize if this is not the correct forum for my inquiry. I am trying to use XMedCon to convert images from a Siemens 3T Trio scanner (DICOM 3.0 format) to the NIFTI-1 format. Our sequence requires a slice gap of approximately 14 % (~0.42 mm spacing for 3.0 mm slices). When converting from DICOM 3.0 to ANALZYZE, the slice gap information is successfully translated (i.e. slices are 3.42 mm thick). However, when converting to the NIFTI-1 format, the slice gap information is lost (i.e. slices are 3.0 mm thick). I've tried different versions of XMedCon (including 0.10.4) and nifticlib (including 1.0.0). I built all installations from source. Additionally, I tried including the "-gap" option in my call to XMedCon. The entire command is below: ./medcon -fh -fv -gap -c nifti -f /home/user/0067.dcm -o test_nii_gap -fmosaic=64x64x34 -noprefix During my search, I discovered that the NIFTI header does not have a field for slice gaps and this must therefore be rolled over into the slice thickness parameter. It appears that this is either not happening or I have made a mistake somewhere in my call to XMedCon. Has anyone else encountered this problem? Any feedback would be greatly appreciated. Cheers, -Chris |
From: <eri...@ug...> - 2005-10-04 19:34:30
|
Hello, On Tue, 4 Oct 2005 pab...@ls... wrote: > Hi, > Continuing my work with your library, Great. > I found two bugs which could be > interesting for you: > > - I have seen that sdata field isn't well initialized in MdcCopyID. In > line 656 of m-structs.c sdata field is initialized if the source isn't > NULL, but if it is NULL the sdata dest field isn't initialized. This > causes a segmentation fault when we try to free it. > We do expect the use of InitXY() at first (re)use of an XY struct, just to have one location for proper initialisation. What you propose makes it bullet proof. We'll look for more such cases (like fi->comment) and fix those too. > - By the other hand, when I try to configure a program that uses the > AM_PATH_XMEDCON macro I get this error: > > *** Could not run XMEDCON test program, checking why... > *** The test program compiled, but did not run. This usually means > *** that the run-time linker is not finding XMEDCON or finding the wrong > *** version of XMEDCON. If it is not finding XMEDCON, you'll need to set > your > *** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point > *** to the installed location Also, make sure you have run ldconfig if that > *** is required on your system > *** > *** If you have an old version installed, it is best to remove it, although > *** you may also be able to get things to work by modifying LD_LIBRARY_PATH > > > The config.log file have these lines: > > > configure:20727: g++ -o conftest -Wall conftest.cc > -L/home/pasku/proyecto/install//lib -lmdc -L/usr/lib -lglib >&5 > conftest.cc: In function 'char* my_strdup(char*)': > conftest.cc:41: error: invalid conversion from 'void*' to 'char*' > conftest.cc: In function 'int main()': > conftest.cc:72: warning: format '%d' expects type 'int', but argument 2 > has type 'double' > conftest.cc:72: warning: format '%d' expects type 'int', but argument 3 > has type 'double' > conftest.cc:72: warning: format '%d' expects type 'int', but argument 4 > has type 'double' > > > I have corrected this error making a explicit cast in the line 75 of > xmedcon.m4: > > new_str = (char *) malloc ((strlen (str) + 1) * sizeof(char)); > Thanks. If it fixes your problem, it is fine for me. > > I hope these topics are useful for you. > Sure. A quick release is looming ... > Greetings, > Pasku > Greetings, -eNlf- |
From: <pab...@ls...> - 2005-10-04 15:18:07
|
Hi, Continuing my work with your library, I found two bugs which could be interesting for you:=20 =20 - I have seen that sdata field isn't well initialized in MdcCopyID. In line 656 of m-structs.c sdata field is initialized if the source isn't NULL, but if it is NULL the sdata dest field isn't initialized. This causes a segmentation fault when we try to free it.=20 - By the other hand, when I try to configure a program that uses the AM_PATH_XMEDCON macro I get this error: *** Could not run XMEDCON test program, checking why... *** The test program compiled, but did not run. This usually means *** that the run-time linker is not finding XMEDCON or finding the wrong *** version of XMEDCON. If it is not finding XMEDCON, you'll need to set your *** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point *** to the installed location Also, make sure you have run ldconfig if tha= t *** is required on your system *** *** If you have an old version installed, it is best to remove it, although *** you may also be able to get things to work by modifying LD_LIBRARY_PATH The config.log file have these lines: configure:20727: g++ -o conftest -Wall conftest.cc=20 -L/home/pasku/proyecto/install//lib -lmdc -L/usr/lib -lglib >&5 conftest.cc: In function 'char* my_strdup(char*)': conftest.cc:41: error: invalid conversion from 'void*' to 'char*' conftest.cc: In function 'int main()': conftest.cc:72: warning: format '%d' expects type 'int', but argument 2 has type 'double' conftest.cc:72: warning: format '%d' expects type 'int', but argument 3 has type 'double' conftest.cc:72: warning: format '%d' expects type 'int', but argument 4 has type 'double' I have corrected this error making a explicit cast in the line 75 of xmedcon.m4: =20 new_str =3D (char *) malloc ((strlen (str) + 1) * sizeof(char)); I hope these topics are useful for you. Greetings, Pasku |
From: <eri...@ug...> - 2005-08-01 23:24:27
|
Hi, As mentioned before, this bug is now closed. Thanks, -eNlf- |
From: <pab...@ls...> - 2005-07-20 09:53:30
|
Hello, Sorry if this message is repeated. I sent it few days ago, and I don't see it in the list archive, so I suscribed to the list and send it again.=20 First of all, sorry for my english.=20 I'm using xmedcon as a library to load/save medical images. One of the functions that I'm using is MdcCopyFI, to copy images that will be modified. Freeing this new image with MdcCleanUpFI causes a segmentation fault. I've been looking for the cause of the problem and have seen that in MdcCopyID neither copy nor initializes the plugb field of the struct IMG_DATA, and in MdcFreeIDs is tried to free this field causing the segmentation fault. Finally I want to thank you all your great work. I think xmedcon is a good program/library an save me a lot of work.=20 Thanks,=20 Pascual Abellan |
From: Alban G. <Alb...@ir...> - 2005-01-13 10:18:57
|
Hello -eNlf-, Thanks so much for your help, I've cleaned my code and it seems to work now (there is no shift and I can use MdcCleanUpFI() & MdcFreeID() without seg faults). for the type of ptr[][][], typeXmedcon is the same, there is a part of "mapping" that initialize typeXmedcon. I've got one more question : When I'm writting an Analyze image, I've the Z size of voxels initialized to 0. I've done something wrong ? when I print the FI, the Z size seems to be right. thank you again and have a good day alban here is my new code: if (debug) cout << "partie dynamique de l'image\n"; int taillePix = MdcType2Bytes(typeXmedcon); int tailleIm = (fi.dim[1])*(fi.dim[2])*taillePix; IMG_DATA *tabDynImages = new IMG_DATA[nbz]; for (int k=0 ; k< nbz ; k ++){ MdcInitID(&tabDynImages[k]); tabDynImages[k].width = nbx; tabDynImages[k].height = nby; tabDynImages[k].type = fi.type; tabDynImages[k].bits = fi.bits; tabDynImages[k].buf = MdcGetImgBuffer(tailleIm); cout << "&tabDynImages[k].buf : " << &(tabDynImages[k].buf); } if (debug) cout << "mise a jours du pointeur de la structure FILE_INFO\n"; fi.image = tabDynImages; if (debug) cout << "allocation effectuee\n" ; for (int k=0 ; k< nbz ; k++){ for (int j=0 ; j < nby ; j++){ for (int i=0 ; i < nbx ; i++){ //etaler la dynamique si on est avec un autre type que double //pendant de "copie_image" au niveau d'un pixel double pix = (double) ptr[k][j][i]; // recuperation du pixel MdcPutDoublePixel(& tabDynImages[k].buf[(j*nby + i)*taillePix] , pix, typeXmedcon); // copie de la valeur du pixel if (debug) cout << (unsigned int) ptr[k][j][i] << "::" << pix << " "; } if (debug) cout << endl; } } MdcWriteFile(&fi,format,-1,NULL); if (debug) cout << "ecriture disque\n" ; // liberation memoire MdcFreeIDs(&fi); if (debug) cout << "MdcFreeIDs(&fi);\n"; MdcCleanUpFI(&fi); if (debug) cout << "MdcCleanUpFI(&fi);\n"; if (debug) MdcPrintFI(&fi); MdcFinish(); en...@li... wrote: >Hi, > >On Tue, 11 Jan 2005, Alban Gaignard wrote: > > > >> Hello, >>I'm using xmedcon as a library to import/export medical images in the >>specific format of the lab, >>and I'm observing a strange behavior : >>when I write an image, i can observe a shift with slices : >>ex with a 3 slices image : >>slice2 of the data loaded -> slice 1 of anaylze or dicom image >>slice3 -> slice2 >>slice1modified with a black part -> slice3 >> >> >>I've checked the correctness of the data loaded, and the problem is >>independant of the number of slices >>it seems to be linked to the bounts of the slices array. >>could someone help me ? >>thanks >> >> >> > >It is not easy to debug a small code fragment. And it is actually not the >purpose of this list; but just to help you, here we go: > > > >>here is a part of the source : >>--------------------------------------------------------------------- >> if (debug) cout << "partie dynamique de l'image\n"; >> int taillePix = MdcType2Bytes(typeXmedcon); >> int tailleIm = (fi.dim[1])*(fi.dim[2])*taillePix; >> IMG_DATA tabDynImages[nbz]; >> >> // allocation de l'image (toutes les couches) >> buffer = MdcGetImgBuffer(tailleIm*(nbz)); >> >> for (int k=0; k < nbz ; k++){ >> MdcInitID(&tabDynImages[k]); >> tabDynImages[k].width = nbx; >> tabDynImages[k].height = nby; >> tabDynImages[k].type = fi.type; >> tabDynImages[k].bits = fi.bits; >> >> for (int j=0 ; j < nby ; j++){ >> for (int i=0 ; i < nbx ; i++){ >> double pix = (double) ptr[k][j][i]; // recuperation du pixel >> >> > >BAD #1: not to do with your error but it is crucial to point out: > > Using ptr[k][j][i] looks like it has a *fixed* type; namely the moment > you declared that pointer, no? While in contrast typeXmedcon allows for > *any* pixel type. Once both don't match, you 'll be in deep trouble. > > > >> MdcPutDoublePixel(buffer, pix, typeXmedcon); // copie de la valeur >>du pixel >> buffer+=taillePix; >> >> > >NOTE: remember the increments > > > >> } >> } >> >> > > >QUESTION: buffer now points to? (then see BAD #2) > > > > >> if (debug) cout << "carac image : \n" ; >> if (debug) cout << "\t nbx : " << nbx << "\t nby : " << nby << "\t >>type : " << fi.type << "\t bits : " << fi.bits << endl; >> if (debug) cout << >>"---------------------------------------------------\n"; >> tabDynImages[k].buf = buffer; >> >> > >BAD #2: here you create your shift problem, namely: > > tabDynImages[0].buf will point to the next slice, because you > incremented "buffer" by one slice already in the previous inner > for-loops. Same goes for the next .buf pointers. And do you know > where the last one points to? Indeed, just outside your allocated > memory buffer. Your OS is too friendly, it should core dump. > >BAD #3: has nothing to do with your error but it is crucial to point out: > > the IMG_DATA structs want a buffer allocated for each. If you ever > use MdcCleanUpFI() or MdcFreeID() they will try to free() some > partially "overlapping" memory locations. This is plain horror. > >SOLUTION: > > So it is better to allocate "buffer" for each slice and link it to > tabDynImages[k].buf just before the inner for-loops. This fixes both > your shift problem while MdcFreeID() will safely free its own buf. > > > >> } >> >> if (debug) cout << "mise a jours du pointeur de la structure FILE_INFO\n"; >> fi.image = tabDynImages; >> >> if (debug) MdcPrintFI(&fi); >> MdcWriteFile(&fi,format,-1,NULL); >> >> >> >> > > >Good luck, > > >-eNlf- > > > > > -- Alban Gaignard Projet VISAGES email : Alb...@ir... tel : +33 (0) 2 99 84 72 62 _______________________________ http://www.irisa.fr/visages IRISA-INRIA, Campus de Beaulieu, 35042 Rennes cedex, France Tél: +33 (0) 2 99 84 71 00, Fax: +33 (0) 2 99 84 71 71 |
From: <en...@li...> - 2005-01-11 22:33:56
|
Hi, On Tue, 11 Jan 2005, Alban Gaignard wrote: > Hello, > I'm using xmedcon as a library to import/export medical images in the > specific format of the lab, > and I'm observing a strange behavior : > when I write an image, i can observe a shift with slices : > ex with a 3 slices image : > slice2 of the data loaded -> slice 1 of anaylze or dicom image > slice3 -> slice2 > slice1modified with a black part -> slice3 > > > I've checked the correctness of the data loaded, and the problem is > independant of the number of slices > it seems to be linked to the bounts of the slices array. > could someone help me ? > thanks > It is not easy to debug a small code fragment. And it is actually not the purpose of this list; but just to help you, here we go: > > > here is a part of the source : > --------------------------------------------------------------------- > if (debug) cout << "partie dynamique de l'image\n"; > int taillePix = MdcType2Bytes(typeXmedcon); > int tailleIm = (fi.dim[1])*(fi.dim[2])*taillePix; > IMG_DATA tabDynImages[nbz]; > > // allocation de l'image (toutes les couches) > buffer = MdcGetImgBuffer(tailleIm*(nbz)); > > for (int k=0; k < nbz ; k++){ > MdcInitID(&tabDynImages[k]); > tabDynImages[k].width = nbx; > tabDynImages[k].height = nby; > tabDynImages[k].type = fi.type; > tabDynImages[k].bits = fi.bits; > > for (int j=0 ; j < nby ; j++){ > for (int i=0 ; i < nbx ; i++){ > double pix = (double) ptr[k][j][i]; // recuperation du pixel BAD #1: not to do with your error but it is crucial to point out: Using ptr[k][j][i] looks like it has a *fixed* type; namely the moment you declared that pointer, no? While in contrast typeXmedcon allows for *any* pixel type. Once both don't match, you 'll be in deep trouble. > MdcPutDoublePixel(buffer, pix, typeXmedcon); // copie de la valeur > du pixel > buffer+=taillePix; NOTE: remember the increments > } > } QUESTION: buffer now points to? (then see BAD #2) > if (debug) cout << "carac image : \n" ; > if (debug) cout << "\t nbx : " << nbx << "\t nby : " << nby << "\t > type : " << fi.type << "\t bits : " << fi.bits << endl; > if (debug) cout << > "---------------------------------------------------\n"; > tabDynImages[k].buf = buffer; BAD #2: here you create your shift problem, namely: tabDynImages[0].buf will point to the next slice, because you incremented "buffer" by one slice already in the previous inner for-loops. Same goes for the next .buf pointers. And do you know where the last one points to? Indeed, just outside your allocated memory buffer. Your OS is too friendly, it should core dump. BAD #3: has nothing to do with your error but it is crucial to point out: the IMG_DATA structs want a buffer allocated for each. If you ever use MdcCleanUpFI() or MdcFreeID() they will try to free() some partially "overlapping" memory locations. This is plain horror. SOLUTION: So it is better to allocate "buffer" for each slice and link it to tabDynImages[k].buf just before the inner for-loops. This fixes both your shift problem while MdcFreeID() will safely free its own buf. > } > > if (debug) cout << "mise a jours du pointeur de la structure FILE_INFO\n"; > fi.image = tabDynImages; > > if (debug) MdcPrintFI(&fi); > MdcWriteFile(&fi,format,-1,NULL); > > Good luck, -eNlf- |
From: Alban G. <Alb...@ir...> - 2005-01-11 11:54:52
|
Hello, I'm using xmedcon as a library to import/export medical images in the specific format of the lab, and I'm observing a strange behavior : when I write an image, i can observe a shift with slices : ex with a 3 slices image : slice2 of the data loaded -> slice 1 of anaylze or dicom image slice3 -> slice2 slice1modified with a black part -> slice3 I've checked the correctness of the data loaded, and the problem is independant of the number of slices it seems to be linked to the bounts of the slices array. could someone help me ? thanks here is a part of the source : --------------------------------------------------------------------- if (debug) cout << "partie dynamique de l'image\n"; int taillePix = MdcType2Bytes(typeXmedcon); int tailleIm = (fi.dim[1])*(fi.dim[2])*taillePix; IMG_DATA tabDynImages[nbz]; // allocation de l'image (toutes les couches) buffer = MdcGetImgBuffer(tailleIm*(nbz)); for (int k=0; k < nbz ; k++){ MdcInitID(&tabDynImages[k]); tabDynImages[k].width = nbx; tabDynImages[k].height = nby; tabDynImages[k].type = fi.type; tabDynImages[k].bits = fi.bits; for (int j=0 ; j < nby ; j++){ for (int i=0 ; i < nbx ; i++){ double pix = (double) ptr[k][j][i]; // recuperation du pixel MdcPutDoublePixel(buffer, pix, typeXmedcon); // copie de la valeur du pixel buffer+=taillePix; } } if (debug) cout << "carac image : \n" ; if (debug) cout << "\t nbx : " << nbx << "\t nby : " << nby << "\t type : " << fi.type << "\t bits : " << fi.bits << endl; if (debug) cout << "---------------------------------------------------\n"; tabDynImages[k].buf = buffer; } if (debug) cout << "mise a jours du pointeur de la structure FILE_INFO\n"; fi.image = tabDynImages; if (debug) MdcPrintFI(&fi); MdcWriteFile(&fi,format,-1,NULL); -- Alban Gaignard Projet VISAGES email : Alb...@ir... tel : +33 (0) 2 99 84 72 62 _______________________________ http://www.irisa.fr/visages IRISA-INRIA, Campus de Beaulieu, 35042 Rennes cedex, France Tél: +33 (0) 2 99 84 71 00, Fax: +33 (0) 2 99 84 71 71 |
From: Mathieu M. <mma...@ny...> - 2004-08-18 02:24:59
|
Hello, I tried to compile the ljpg on MacOSX, and I got a few errors. The attached patch fixes thoses errors enjoy Mathieu |
From: Andy L. <lo...@uc...> - 2002-12-06 21:16:11
|
Hey Erik, I was wondering if you've considered switching to using glib's message logging capacities instead of your own (MdcPrntWarn, XMdcDisplayWarn, etc.). It's described at: http://developer.gnome.org/doc/API/glib/glib-message-logging.html This would, for instance, allow you to change the following 8 lines of code: #if XSUPPORTED if (XMDC_MEDCON) { XMdcDisplayErr("CONC Uninterpretable line:\t%s",line); } else #endif { MdcPrntWarn("CONC Uninterpretable line:\t%s",line); } To a single line of code: g_warning("CONC Uninterpretable line:\t%s",line); You then set the log handler using g_log_set_handler to either a function that prints the warning out to the console, or prints the warning in a popup dialog box. (If you don't set a handler, glib's default handler is used, which prints it out to console). A nice side effect of this is that anyone who links to libmdc can redirect warning messages. Handy if you're writing a gui app, and you want the libmdc warnings to popup.... take care, Andy |
From: Andy L. <lo...@uc...> - 2002-11-28 04:08:21
|
Hey Erik, I've got xmedcon 0.8.7 installed at the moment, and I've (just) noticed a header file from the package which is screwing up some compilations of other programs. "io.h" is also a system header file (both /usr/include/asm/io.h and /usr/include/sys/io.h). I'm probably running into this bug because I've got my header file search list in the wrong order somewhere... and because I install xmedcon in /usr/local, but it might still be wise to tack on the usual "m". Actually, does this header file even need to be installed? (X)MedCon has a couple of header files with common names that get installed into the include directory. depend.h jpeg.h proto.h Do these really need to be installed? Incidently, why does xmedcon package its own jpeg library? I'm sure there's a reason... take care, Andy |
From: Andy L. <lo...@uc...> - 2002-09-17 02:16:30
|
Hey Erik, Another patch of concorde file format additions for you. Nothing important in this one, just more relatively useless header entries. Andy |
From: Andy L. <lo...@uc...> - 2002-09-17 01:08:41
|
Hey Erik, Small patch for the imtkconv program in xmedcon-extra. This allows imtkconv to handle imtek .vol files that are the result of merging multiple bed positions. Don't bother releasing a new version of xmedcon-extra, as I'm most likely the only person in the world who currently needs this, and my stuff's already patched. take care, Andy |
From: Roland M. R. <Rut...@gm...> - 2002-03-27 18:13:01
|
Hi, I debianized xmedcon. Since this is my first package I am looking for feedback. My final goal is to get this package into the next debian version. I already contacted the maintainer of debian-med (medical packages in debian) You find my stuff here: http://neuro.psychologie.uni-oldenburg.de/debian/dists/unstable/main/ or put deb http://neuro.psychologie.uni-oldenburg.de/debian unstable main deb-src http://neuro.psychologie.uni-oldenburg.de/debian unstable main in /etc/apt/sources.list Greetings, RM Rutschmann -- -------------------------------------------- Roland Marcus Rutschmann <Rut...@gm...> -------------------------------------------- |
From: Andy L. <lo...@uc...> - 2001-12-12 02:21:10
|
Hey Erik, Your rug.whatever email bounced, so I'm gonna try the devel list :) Got another patch for you. This one adds support for reading in ImTek MicroCAT image files. This format is much simpler then the Concorde file format (and much more brain dead). There's a phantom study for testing at: http://legoland.mednet.ucla.edu/~loening/files/5_o_TLD2_z0_z255.vol It's 64 MB, so watch out (256x256x256xfloat). Besides adding ImTek support, the patch also does two addition things. 1- adds "-lm" (in Makefile.am) so as to link in the math library for medcon. This is needed for tan() (in m-imtk.c) and finite() (in m-algori.c) functions. 2- In m-algori.c, I added checks for finite numbers when calculating max/min values in MdcPixelFiddle for types FLT32 and FLT64. hope you enjoy the patch :) Andy ---------------------------------------------------- diff -urN xmedcon/configure.in xmedcon-imtek/configure.in --- xmedcon/configure.in Sun Dec 2 16:00:17 2001 +++ xmedcon-imtek/configure.in Mon Dec 10 19:10:16 2001 @@ -132,6 +132,28 @@ ) AC_MSG_RESULT([${mdc_cv_include_anlz}]) +dnl Format ImTek microCAT +MDC_MESSAGE([Format ImTek microCAT enabled? ]) +AC_ARG_ENABLE(imtk, +[ + --enable-imtk enable ImTek microCAT format (default). + --disable-imtk disable ImTek microCAT format. ], +[ + case "$enableval" in + no) + AC_CACHE_VAL(mdc_cv_include_imtk,mdc_cv_include_imtk=no) + ENABLE_IMTK=0 + ;; + *) + AC_CACHE_VAL(mdc_cv_include_imtk,mdc_cv_include_imtk=yes) + ENABLE_IMTK=1 + ;; + esac ], + AC_CACHE_VAL(mdc_cv_include_imtk,mdc_cv_include_imtk=yes) + ENABLE_IMTK=1 +) +AC_MSG_RESULT([${mdc_cv_include_imtk}]) + dnl Format Concorde microPET MDC_MESSAGE([Format Concorde uPET enabled? ]) AC_ARG_ENABLE(conc, @@ -310,6 +332,7 @@ AM_CONDITIONAL(DO_GIF, test x$mdc_cv_include_gif = xyes) AM_CONDITIONAL(DO_INW, test x$mdc_cv_include_inw = xyes) AM_CONDITIONAL(DO_ANLZ, test x$mdc_cv_include_anlz = xyes) +AM_CONDITIONAL(DO_IMTK, test x$mdc_cv_include_imtk = xyes) AM_CONDITIONAL(DO_CONC, test x$mdc_cv_include_conc = xyes) AM_CONDITIONAL(DO_ECAT, test x$mdc_cv_include_ecat = xyes) AM_CONDITIONAL(DO_INTF, test x$mdc_cv_include_intf = xyes) @@ -331,6 +354,7 @@ AC_SUBST(ENABLE_GIF) AC_SUBST(ENABLE_INW) AC_SUBST(ENABLE_ANLZ) +AC_SUBST(ENABLE_IMTK) AC_SUBST(ENABLE_CONC) AC_SUBST(ENABLE_ECAT) AC_SUBST(ENABLE_INTF) @@ -338,6 +362,7 @@ AC_SUBST(mdc_cv_include_gif) AC_SUBST(mdc_cv_include_acr) AC_SUBST(mdc_cv_include_inw) +AC_SUBST(mdc_cv_include_imtk) AC_SUBST(mdc_cv_include_conc) AC_SUBST(mdc_cv_include_ecat) AC_SUBST(mdc_cv_include_intf) diff -urN xmedcon/source/Makefile.am xmedcon-imtek/source/Makefile.am --- xmedcon/source/Makefile.am Sun Dec 2 16:02:55 2001 +++ xmedcon-imtek/source/Makefile.am Tue Dec 11 17:10:59 2001 @@ -22,7 +22,7 @@ bin_PROGRAMS = medcon $(XMEDCON) medcon_SOURCES = medcon.c -medcon_LDADD = libmdc.la +medcon_LDADD = libmdc.la -lm xmedcon_SOURCES = \ xcolmap.c \ @@ -102,6 +102,7 @@ m-conc.c \ m-ecat64.c \ m-matrix.c \ + m-imtk.c \ m-intf.c \ m-dicm.c @@ -123,6 +124,9 @@ if DO_ECAT ECAT_OBJ = m-ecat64.lo m-matrix.lo endif +if DO_IMTK +IMTK_OBJ = m-imtk.lo +endif if DO_INTF INTF_OBJ = m-intf.lo endif @@ -140,6 +144,7 @@ $(ANLZ_OBJ) \ $(CONC_OBJ) \ $(ECAT_OBJ) \ + $(IMTK_OBJ) \ $(INTF_OBJ) \ $(DICM_OBJ) @@ -200,6 +205,7 @@ m-conc.h \ m-ecat64.h \ m-matrix.h \ + m-imtk.h \ m-intf.h \ m-dicm.h diff -urN xmedcon/source/m-algori.c xmedcon-imtek/source/m-algori.c --- xmedcon/source/m-algori.c Tue Aug 21 13:16:58 2001 +++ xmedcon-imtek/source/m-algori.c Tue Dec 11 17:29:04 2001 @@ -560,12 +560,13 @@ MdcSwapBytes((Uint8 *)pix, 4); if (j == 0) fi->glmin = fi->glmax = (double) pix[0]; - min = max = pix[0]; + if (finite(pix[0])) min = max = pix[0]; + else min = max = 0.0; /* give up */ for (i=1, pix+=1; i<n; i++, pix++) { MdcSwapBytes((Uint8 *)pix, 4); if (!MDC_NEGATIVE && (*pix < 0.)) *pix = 0.; - maxmin(*pix, max, min); + if (finite(*pix)) maxmin(*pix, max, min); } id->max = (double)max; id->min = (double)min; @@ -580,11 +581,13 @@ MdcSwapBytes((Uint8 *)pix, 8); if (j == 0 ) fi->glmin = fi->glmax = (double) pix[0]; - min = max = pix[0]; + if (finite(pix[0])) min = max = pix[0]; + else min = max = 0.0; /* give up */ + for (i=1, pix+=1; i<n; i++, pix++) { MdcSwapBytes((Uint8 *)pix, 8); if (!MDC_NEGATIVE && (*pix < 0.)) *pix = 0.; - maxmin(*pix, max, min); + if (finite(*pix)) maxmin(*pix, max, min); } id->max = max; id->min = min; diff -urN xmedcon/source/m-conc.c xmedcon-imtek/source/m-conc.c --- xmedcon/source/m-conc.c Tue Dec 4 16:32:50 2001 +++ xmedcon-imtek/source/m-conc.c Tue Dec 11 17:40:03 2001 @@ -232,7 +232,6 @@ }; #define MDC_INPUT_STRING_SIZE 512 -#define MDC_MAX_NUM_GARBAGE_LINES 3 /**************************************************************************** internal functions diff -urN xmedcon/source/m-config.h.in xmedcon-imtek/source/m-config.h.in --- xmedcon/source/m-config.h.in Sun Dec 2 15:34:01 2001 +++ xmedcon-imtek/source/m-config.h.in Mon Dec 10 19:49:12 2001 @@ -45,6 +45,7 @@ #define MDC_INCLUDE_GIF @ENABLE_GIF@ #define MDC_INCLUDE_INW @ENABLE_INW@ #define MDC_INCLUDE_ANLZ @ENABLE_ANLZ@ +#define MDC_INCLUDE_IMTK @ENABLE_IMTK@ #define MDC_INCLUDE_CONC @ENABLE_CONC@ #define MDC_INCLUDE_ECAT @ENABLE_ECAT@ #define MDC_INCLUDE_INTF @ENABLE_INTF@ diff -urN xmedcon/source/m-defs.h xmedcon-imtek/source/m-defs.h --- xmedcon/source/m-defs.h Sun Dec 2 15:39:18 2001 +++ xmedcon-imtek/source/m-defs.h Tue Dec 11 15:39:25 2001 @@ -137,6 +137,7 @@ #define MDC_MAX_PATH 256 #define MDC_MAX_LIST 256 +#define MDC_MAX_NUM_GARBAGE_LINES 3 #define MDC_YES MDC_ONE #define MDC_NO MDC_ZERO @@ -172,11 +173,12 @@ #define MDC_FRMT_INW 5 #define MDC_FRMT_CONC 6 #define MDC_FRMT_ECAT 7 -#define MDC_FRMT_INTF 8 -#define MDC_FRMT_ANLZ 9 -#define MDC_FRMT_DICM 10 +#define MDC_FRMT_IMTK 8 +#define MDC_FRMT_INTF 9 +#define MDC_FRMT_ANLZ 10 +#define MDC_FRMT_DICM 11 -#define MDC_MAX_FRMTS 11 /* total+1 conversion formats supported */ +#define MDC_MAX_FRMTS 12 /* total+1 conversion formats supported */ /* acquisition types */ /* InterFile and DICOM */ #define MDC_ACQUISITION_UNKNOWN MDC_ZERO /* unknown = static */ diff -urN xmedcon/source/m-files.c xmedcon-imtek/source/m-files.c --- xmedcon/source/m-files.c Sun Dec 2 15:44:03 2001 +++ xmedcon-imtek/source/m-files.c Mon Dec 10 19:55:52 2001 @@ -174,6 +174,9 @@ #if MDC_INCLUDE_ECAT case MDC_FRMT_ECAT: msg=MdcReadECAT(fi); break; #endif +#if MDC_INCLUDE_IMTK + case MDC_FRMT_IMTK: msg=MdcReadIMTK(fi); break; +#endif #if MDC_INCLUDE_INTF case MDC_FRMT_INTF: msg=MdcReadINTF(fi); break; #endif @@ -302,6 +305,9 @@ #if MDC_INCLUDE_ECAT case MDC_FRMT_ECAT : msg=MdcWriteECAT(fi); break; #endif +#if MDC_INCLUDE_IMTK + case MDC_FRMT_IMTK : msg=MdcWriteIMTK(fi); break; +#endif #if MDC_INCLUDE_INTF case MDC_FRMT_INTF : msg=MdcWriteINTF(fi); break; #endif @@ -476,6 +482,9 @@ #if MDC_INCLUDE_ECAT case MDC_FRMT_ECAT: format = MdcCheckECAT(fi); break; #endif +#if MDC_INCLUDE_IMTK + case MDC_FRMT_IMTK: format = MdcCheckIMTK(fi); break; +#endif #if MDC_INCLUDE_DICM case MDC_FRMT_DICM: format = MdcCheckDICM(fi); break; #endif @@ -899,6 +908,9 @@ #endif #if MDC_INCLUDE_ECAT case MDC_FRMT_ECAT : MdcNewName(dest,src,FrmtExt[MDC_FRMT_ECAT]); break; +#endif +#if MDC_INCLUDE_IMTK + case MDC_FRMT_IMTK : MdcNewName(dest,src,FrmtExt[MDC_FRMT_IMTK]); break; #endif #if MDC_INCLUDE_INTF case MDC_FRMT_INTF : MdcNewName(dest,src,FrmtExt[MDC_FRMT_INTF]); break; diff -urN xmedcon/source/m-getopt.c xmedcon-imtek/source/m-getopt.c --- xmedcon/source/m-getopt.c Sun Dec 2 15:46:57 2001 +++ xmedcon-imtek/source/m-getopt.c Tue Dec 11 17:43:02 2001 @@ -102,6 +102,11 @@ FrmtString[MDC_FRMT_ECAT], FrmtExt[MDC_FRMT_ECAT]); #endif +#if MDC_INCLUDE_IMTK + MdcPrntScrn(" \"imtk\" = %s (.%s)\n", + FrmtString[MDC_FRMT_IMTK], + FrmtExt[MDC_FRMT_IMTK]); +#endif #if MDC_INCLUDE_ANLZ MdcPrntScrn(" \"anlz\" = %s (.%s)+(.img)\n", FrmtString[MDC_FRMT_ANLZ], @@ -128,7 +133,7 @@ MdcPrntScrn(" -big write file in big endian\n"); MdcPrntScrn(" -little write file in little endian\n"); MdcPrntScrn("\n"); - MdcPrntScrn("====>> Fallback Read Format: [-fb-none|-fb-anlz|-fb-conc|-fb-ecat|fb-dicom]\n"); + MdcPrntScrn("====>> Fallback Read Format: [-fb-none|-fb-anlz|-fb-conc|-fb-ecat|-fb-imtk|fb-dicom]\n"); MdcPrntScrn("\n"); MdcPrntScrn(" -fb-none fallback disabled\n"); #if MDC_INCLUDE_ANLZ @@ -146,6 +151,11 @@ #else MdcPrntScrn(" -fb-ecat (*unused*)\n"); #endif +#if MDC_INCLUDE_IMTK + MdcPrntScrn(" -fb-imtk fallback on ImTek microCAT\n"); +#else + MdcPrntScrn(" -fb-imtk (*unused*)\n"); +#endif #if MDC_INCLUDE_DICM MdcPrntScrn(" -fb-dicom fallback on DICOM 3.0\n"); #else @@ -453,6 +463,10 @@ }else if ( strcasecmp(argv[a],"-byframe") == 0 ) { MDC_ECAT_SORT = MDC_BYFRAME; continue; #endif +#if MDC_INCLUDE_IMTK + }else if ( strcasecmp(argv[a],"-fb-imtk") == 0 ) { + MDC_FALLBACK_FRMT = MDC_FRMT_IMTK; continue; +#endif #if MDC_INCLUDE_DICM }else if ( strcasecmp(argv[a],"-fb-dicom") == 0 ) { MDC_FALLBACK_FRMT = MDC_FRMT_DICM; continue; @@ -557,6 +571,11 @@ convs[MDC_FRMT_ECAT]+=1; total[MDC_CONVS]+=1; }else #endif +#if MDC_INCLUDE_IMTK + if ( strcasecmp(argv[a],"imtk") == 0 ) { + convs[MDC_FRMT_IMTK]+=1; total[MDC_CONVS]+=1; + }else +#endif #if MDC_INCLUDE_INTF if ( strcasecmp(argv[a],"intf") == 0 ) { convs[MDC_FRMT_INTF]+=1; total[MDC_CONVS]+=1; @@ -623,6 +642,11 @@ DO_STDIN = MDC_YES; MDC_FRMT_INPUT = MDC_FRMT_ECAT; }else #endif +#if MDC_INCLUDE_IMTK + if ( strcasecmp(argv[a],"imtk") == 0) { + DO_STDIN = MDC_YES; MDC_FRMT_INPUT = MDC_FRMT_IMTK; + }else +#endif #if MDC_INCLUDE_INTF if ( strcasecmp(argv[a],"intf") == 0) { DO_STDIN = MDC_YES; MDC_FRMT_INPUT = MDC_FRMT_INTF; @@ -781,6 +805,8 @@ MdcPrntMesg("Read fallback format Concorde/uPET"); break; case MDC_FRMT_ECAT: MdcPrntMesg("Read fallback format ECAT 6.4"); break; + case MDC_FRMT_IMTK: + MdcPrntMesg("Read fallback format ImTek/uCAT"); break; } if (MDC_FILE_STDIN == MDC_YES) diff -urN xmedcon/source/m-global.c xmedcon-imtek/source/m-global.c --- xmedcon/source/m-global.c Sun Dec 2 15:50:50 2001 +++ xmedcon-imtek/source/m-global.c Mon Dec 10 19:56:39 2001 @@ -72,6 +72,7 @@ "INW (RUG) ", /* MDC_FRMT_INW */ "Concorde/uPET", /* MDC_FRMT_CONC */ "Ecat/Matrix ", /* MDC_FRMT_ECAT */ + "ImTek/uCAT ", /* MDC_FRMT_IMTK */ "InterFile ", /* MDC_FRMT_INTF */ "Analyze ", /* MDC_FRMT_ANLZ */ "DICOM " /* MDC_FRMT_DICM */ @@ -87,6 +88,7 @@ "im", /* MDC_FRMT_INW */ "hdr", /* MDC_FRMT_CONC */ "img", /* MDC_FRMT_ECAT */ + "vol", /* MDC_FRMT_IMTK */ "h33", /* MDC_FRMT_INTF */ "hdr", /* MDC_FRMT_ANLZ */ "dcm" /* MDC_FRMT_DICM */ @@ -142,6 +144,8 @@ Int8 MDC_FALLBACK_FRMT = MDC_FRMT_ECAT; #elif MDC_INCLUDE_ANLZ Int8 MDC_FALLBACK_FRMT = MDC_FRMT_ANLZ; +#elif MDC_INCLUDE_IMTK +Int8 MDC_FALLBACK_FRMT = MDC_FRMT_IMTK; #elif MDC_INCLUDE_CONC Int8 MDC_FALLBACK_FRMT = MDC_FRMT_CONC; #else diff -urN xmedcon/source/m-imtk.c xmedcon-imtek/source/m-imtk.c --- xmedcon/source/m-imtk.c Wed Dec 31 16:00:00 1969 +++ xmedcon-imtek/source/m-imtk.c Tue Dec 11 17:33:07 2001 @@ -0,0 +1,424 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * filename: m-imtk.c * + * * + * UTIL C-source: Medical Image Conversion Utility * + * * + * purpose : Read and Write ImTek microCAT format files * + * * + * project : (X)MedCon by Erik Nolf * + * * + * Functions : MdcCheckIMTK() - Check for ImTek format * + * MdcReadIMTK() - Read ImTek file * + * MdcWriteIMTK() - Write ImTek file * + * * + * * + * Author : Andy Loening * + * * + * Credits : * + * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/* $Id: m-imtk.c,v 1.2 2001/12/05 00:32:50 enlf Exp $ + */ + +/* + Copyright (C) 1997-2001 by Erik Nolf + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 59 Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/**************************************************************************** + H E A D E R S +****************************************************************************/ + +#include "medcon.h" + +/**************************************************************************** + G L O B A L D E F I N E S +****************************************************************************/ + +#define MDC_IMTK_VER_STR_SIZE 9 +#define MDC_IMTK_VER_STR "!FR_0.0!" +#define MDC_IMTK_INFO_STR_SIZE 500 +#define MDC_IMTK_DELIMITER_START "?" +#define MDC_IMTK_DELIMITER_MIDDLE "=" + +char * MdcImtkFilterNames[MDC_IMTK_NUM_FILTERS] = { + "Shepp-Logan", + "Ram-Lak" +}; + +char * MdcImtkHdrValueNames[MDC_IMTK_NUM_HDR_VALUES] = { + "VOL_X_SZ", + "VOL_Y_SZ", + "VOL_Z_SZ", + "CATFILE", + "LOGFILE", + "STEP", + "SCALE_FACTOR", + "d", + "D", + "DET_PITCH", + "CONE_ANGLE", + "VERBOSE", + "FIRST_PROJ", + "IGNORE_PIX", + "LAST_PROJ", + "FIX_PROJS", + "FILTER_SZ", + "FILTER_TYPE", + "SHORT_SCAN", + "YOFFSET" +}; + +/**************************************************************************** + internal functions +****************************************************************************/ + +static MdcImtkHdrValue imtk_get_hdr_value(char * token) { + + MdcImtkHdrValue hdr_value = MDC_IMTK_HDR_UNKNOWN; + MdcImtkHdrValue i_value; + char token_match[MDC_IMTK_INFO_STR_SIZE]; + int length; + int short_value; + + if (strstr(token, MDC_IMTK_DELIMITER_MIDDLE) == NULL) short_value = MDC_YES; + else short_value = MDC_NO; + for (i_value = 0; i_value < MDC_IMTK_NUM_HDR_VALUES; i_value++) { + if (short_value == MDC_YES) + length = snprintf(token_match, MDC_IMTK_INFO_STR_SIZE, "%s", + MdcImtkHdrValueNames[i_value]); + else + length = snprintf(token_match, MDC_IMTK_INFO_STR_SIZE, "%s%s", + MdcImtkHdrValueNames[i_value], + MDC_IMTK_DELIMITER_MIDDLE); + if (strncmp(token, token_match, length) == 0) { + hdr_value = i_value; + i_value = MDC_IMTK_NUM_HDR_VALUES; + } + } + + return hdr_value; +} + +static Int32 imtk_get_int(char * line) { + int return_int; + int return_code; + + line = strstr(line, MDC_IMTK_DELIMITER_MIDDLE); + line += strlen(MDC_IMTK_DELIMITER_MIDDLE); /* skip over delimiter */ + if (line == NULL) return -1; + + return_code = sscanf(line, "%d", &return_int); + if ((return_code == EOF) || (return_code <= 0)) return_int = -1; + + return return_int; +} + +static float imtk_get_float(char * line) { + float return_float; + int return_code; + + line = strstr(line, MDC_IMTK_DELIMITER_MIDDLE); + line += strlen(MDC_IMTK_DELIMITER_MIDDLE); /* skip over delimiter */ + if (line == NULL) return -1; + + return_code = sscanf(line, "%f", &return_float); + if ((return_code == EOF) || (return_code <= 0)) return_float = 0.0; + + return return_float; +} + +static char * imtk_get_string(char * line) { + char * return_string; + size_t copy_length; + int return_code; + + line = strstr(line, MDC_IMTK_DELIMITER_MIDDLE); + line += strlen(MDC_IMTK_DELIMITER_MIDDLE); /* skip over delimiter */ + return_code = sscanf(line, "%*s%n", ©_length); + if (return_code == EOF) + return_string = NULL; + else { + return_string = malloc(copy_length + 1); + if (return_string != NULL) { + strncpy(return_string,line,copy_length); + return_string[copy_length]='\0'; + } + } + + return return_string; +} + + +/**************************************************************************** + F U N C T I O N S +****************************************************************************/ +int MdcCheckIMTK(FILEINFO *fi) +{ + char ver_str[MDC_IMTK_VER_STR_SIZE]; + int FORMAT=MDC_FRMT_NONE; + + if (fread(&ver_str,1,MDC_IMTK_VER_STR_SIZE,fi->ifp) != MDC_IMTK_VER_STR_SIZE) + return(MDC_BAD_READ); + + MDC_FILE_ENDIAN = MDC_LITTLE_ENDIAN; + if (strcmp(ver_str, MDC_IMTK_VER_STR) == 0) + FORMAT=MDC_FRMT_IMTK; + + return(FORMAT); +} + + +char *MdcReadIMTK(FILEINFO *fi) +{ + FILE *fp=fi->ifp; + IMG_DATA * plane; + float temp_float; + double fov, src2center=0.0, src2dector=0.0, cone_angle=0.0; + Int32 temp_int; + char info_str[MDC_IMTK_INFO_STR_SIZE]; + char token_str[MDC_IMTK_INFO_STR_SIZE]; + char * info_str_p; + char * temp_string; + char * name; + MdcImtkHdrValue hdr_value; + Int32 xdim=0, ydim=0, zdim=0; + int conversion; + int num_garbage_lines=0; + int i_plane; + size_t bytes; + +#if XSUPPORTED + if (XMDC_MEDCON) XMdcBeginProgressBar("Reading ImTek/microCAT:"); +#endif + if (MDC_VERBOSE) MdcPrntMesg("IMTK Reading <%s> ...",fi->ifname); + + + fseek(fp, MDC_IMTK_VER_STR_SIZE, SEEK_CUR); /* skip the file version */ + + fread(&temp_int, sizeof(Int32), 1, fp); /* don't know what these 4 bytes are for */ + + if (fread(&info_str,1,MDC_IMTK_INFO_STR_SIZE,fp) != MDC_IMTK_INFO_STR_SIZE) + return("IMTK Bad header string read"); + + fread(&temp_int, sizeof(Int32), 1, fp); /* don't know what these 4 bytes are for */ + fread(&temp_int, sizeof(Int32), 1, fp); /* don't know what these 4 bytes are for */ + fread(&temp_int, sizeof(Int32), 1, fp); /* don't know what these 4 bytes are for */ + + /* interpret the information string */ + info_str_p = info_str; + while (info_str_p != NULL) { + info_str_p = strstr(info_str_p, MDC_IMTK_DELIMITER_START); + + if (info_str_p != NULL) info_str_p += 1; /* skip delimiter */ + if (info_str_p != NULL) { + conversion = sscanf(info_str_p, "%s", token_str); + if (conversion > 0) { + hdr_value = imtk_get_hdr_value(token_str); + switch(hdr_value) { + case MDC_IMTK_HDR_VOL_X_SZ: + xdim = imtk_get_int(token_str); + if (MDC_INFO) MdcPrntScrn("X dim:\t\t\t%d\n",xdim); + break; + case MDC_IMTK_HDR_VOL_Y_SZ: + ydim = imtk_get_int(token_str); + if (MDC_INFO) MdcPrntScrn("Y dim:\t\t\t%d\n",ydim); + break; + case MDC_IMTK_HDR_VOL_Z_SZ: + zdim = imtk_get_int(token_str); + if (MDC_INFO) MdcPrntScrn("Z dim:\t\t\t%d\n",zdim); + break; + case MDC_IMTK_HDR_CATFILE: + temp_string = imtk_get_string(token_str); + if (MDC_INFO) MdcPrntScrn("CAT file:\t\t%s\n",temp_string); + name = rindex(temp_string, '\\'); /* assume dos */ + if (name == NULL) name = rindex(temp_string, '/'); /* maybe it's unix? */ + if (name == NULL) name = temp_string; /* give up */ + MdcStringCopy(fi->study_name, name, MDC_MAXSTR); + free(temp_string); + break; + case MDC_IMTK_HDR_LOGFILE: + temp_string = imtk_get_string(token_str); + if (MDC_INFO) MdcPrntScrn("Log file:\t\t%s\n",temp_string); + free(temp_string); + break; + case MDC_IMTK_HDR_STEP: + temp_int = imtk_get_int(token_str); + if (MDC_INFO) MdcPrntScrn("Step:\t\t\t%d\n",temp_int); + break; + case MDC_IMTK_HDR_SCALE_FACTOR: + temp_int = imtk_get_int(token_str); + if (MDC_INFO) MdcPrntScrn("Scale factor:\t\t%d\n",temp_int); + break; + case MDC_IMTK_HDR_d: + src2center = imtk_get_float(token_str); + if (MDC_INFO) MdcPrntScrn("Source to center:\t%5.3f mm\n",src2center); + break; + case MDC_IMTK_HDR_D: + src2dector = imtk_get_float(token_str); + if (MDC_INFO) MdcPrntScrn("Source to detector:\t%5.3f mm\n",src2dector); + break; + case MDC_IMTK_HDR_DET_PITCH: + temp_float = imtk_get_float(token_str); + if (MDC_INFO) MdcPrntScrn("Detector pixel size:\t%5.3f mm\n",temp_float); + break; + case MDC_IMTK_HDR_CONE_ANGLE: + cone_angle = imtk_get_float(token_str); + if (MDC_INFO) MdcPrntScrn("Cone beam angle:\t%5.3f degrees\n",cone_angle); + cone_angle = M_PI*cone_angle/180.0; + break; + case MDC_IMTK_HDR_VERBOSE: + if (MDC_INFO) MdcPrntScrn("Verbose mode\n"); + break; + case MDC_IMTK_HDR_FIRST_PROJ: + temp_int = imtk_get_int(token_str); + if (MDC_INFO) MdcPrntScrn("First projection:\t%d\n",temp_int); + break; + case MDC_IMTK_HDR_IGNORE_PIX: + temp_int = imtk_get_int(token_str); + if (MDC_INFO) MdcPrntScrn("# edge pixels ignored:\t%d\n",temp_int); + break; + case MDC_IMTK_HDR_LAST_PROJ: + temp_int = imtk_get_int(token_str); + if (MDC_INFO) MdcPrntScrn("Last projection:\t%d\n",temp_int); + break; + case MDC_IMTK_HDR_FIX_PROJS: + if (MDC_INFO) MdcPrntScrn("Fix projections is on\n"); + break; + case MDC_IMTK_HDR_FILTER_SZ: + temp_int = imtk_get_int(token_str); + if (MDC_INFO) MdcPrntScrn("Filter size:\t\t%d\n",temp_int); + break; + case MDC_IMTK_HDR_FILTER_TYPE: + { + MdcImtkFilter filter_type; + filter_type = imtk_get_int(token_str); + if (MDC_INFO) MdcPrntScrn("Filter type:\t\t%s\n",MdcImtkFilterNames[filter_type]); + MdcStringCopy(fi->filter_type, MdcImtkFilterNames[filter_type], MDC_MAXSTR); + } + break; + case MDC_IMTK_HDR_SHORT_SCAN: + if (MDC_INFO) MdcPrntScrn("Short Scan\n"); + break; + case MDC_IMTK_HDR_YOFFSET: + temp_float = imtk_get_float(token_str); + if (MDC_INFO) MdcPrntScrn("Bed Offset:\t\t%5.3f\n",temp_float); + break; + case MDC_IMTK_HDR_UNKNOWN: + default: +#if XSUPPORTED + if (XMDC_MEDCON) { + XMdcDisplayErr("IMTK Uninterpretable token %s",token_str); + }else +#endif + { + MdcPrntWarn("IMTK Uninterpretable token %s",token_str); + } + + num_garbage_lines++; + if (num_garbage_lines > MDC_MAX_NUM_GARBAGE_LINES) + return("IMTK To much garbage, File reading halted"); + break; + } + } + } + } + + /* Note the field of view cylinder's diameter is the same as the cylinder's length */ + fov = src2center*tan(cone_angle); + if (MDC_INFO) MdcPrntScrn("Field of View:\t\t%5.3f mm\n",fov); + + fi->pixdim[0] = fi->dim[0]=3; + fi->dim[1]=xdim; + fi->dim[2]=ydim; + fi->dim[3]=zdim; + fi->dim[4] = fi->dim[5] = fi->dim[6] = fi->dim[7] = 1; + fi->number = fi->dim[7]*fi->dim[6]*fi->dim[5]*fi->dim[4]*fi->dim[3]; + fi->pixdim[1] = fov / ((double) fi->dim[1]); + if (MDC_INFO) MdcPrntScrn("Voxel X dim:\t\t%5.3f mm\n",fi->pixdim[1]); + fi->pixdim[2] = fov / ((double) fi->dim[2]); + if (MDC_INFO) MdcPrntScrn("Voxel Y dim:\t\t%5.3f mm\n",fi->pixdim[2]); + fi->pixdim[3] = fov / ((double) fi->dim[3]); + if (MDC_INFO) MdcPrntScrn("Voxel Z dim:\t\t%5.3f mm\n",fi->pixdim[3]); + fi->pixdim[4]=1000.0; /* put in a valid unit for time */ + fi->truncated = MDC_NO; + if (fi->number == 0) return("IMTK No valid images found"); + fi->acquisition_type = MDC_ACQUISITION_TOMO; + fi->reconstructed = MDC_YES; + fi->endian=MDC_FILE_ENDIAN= MDC_LITTLE_ENDIAN; + fi->type = FLT32; + fi->bits = MdcType2Bits(fi->type); + /* how does one figure out the pixel dimensions? */ + + + if (!MdcGetStructID(fi)) return("IMTK Bad malloc IMG_DATA structs"); + + /* read each of the planes */ + for (i_plane = 0; i_plane < fi->dim[3]; i_plane++) { + +#if XSUPPORTED + if (XMDC_MEDCON) { + pvalue += 1./(float)fi->dim[3]; + XMdcUpdateProgressBar(NULL); + } +#endif + + plane = &fi->image[i_plane]; + strcpy(plane->image_mod, "CT"); + plane->width = fi->dim[1]; + plane->height = fi->dim[2]; + plane->bits = fi->bits; + plane->type = fi->type; + plane->pixel_xsize = fi->pixdim[1]; + plane->pixel_ysize = fi->pixdim[2]; + plane->slice_width = fi->pixdim[3]; + plane->frame_start = 0.0; + plane->frame_duration = fi->pixdim[4]; + bytes = plane->width*plane->height*MdcType2Bytes(plane->type); + plane->buf = MdcGetImgBuffer(bytes); + if (fread(plane->buf,1,bytes,fp) != bytes) { + fi->truncated=MDC_YES; + return("IMTK Truncated file read"); + } + } + + return NULL; +} + +char *MdcWriteIMTK(FILEINFO *fi) +{ + if (MDC_FILE_STDOUT == MDC_YES) + return("IMTK Writing to stdout unsupported for this format"); + + MDC_WRITE_ENDIAN = MDC_LITTLE_ENDIAN; /* always (Intel) */ + + if (XMDC_MEDCON == MDC_NO) + MdcDefaultName(fi,MDC_FRMT_IMTK,fi->ofname,fi->ifname); + +#if XSUPPORTED + if (XMDC_MEDCON) XMdcBeginProgressBar("Writing ImTek/microCAT:"); +#endif + + if (MDC_VERBOSE) MdcPrntMesg("Imtek/microCAT Writing <%s> ...",fi->ofname); + + if (MdcFileExists(fi->ofname)) { + return("IMTK File exists!!"); + } + + return("IMTK Writing not yet supported"); + + /* return NULL; */ +} + diff -urN xmedcon/source/m-imtk.h xmedcon-imtek/source/m-imtk.h --- xmedcon/source/m-imtk.h Wed Dec 31 16:00:00 1969 +++ xmedcon-imtek/source/m-imtk.h Tue Dec 11 16:46:14 2001 @@ -0,0 +1,87 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * filename: m-imtk.h * + * * + * UTIL C-source: Medical Image Conversion Utility * + * * + * purpose : m-imtk.c header file * + * * + * project : (X)MedCon by Erik Nolf * + * * + * Author : Andy Loening * + * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/* $Id: m-imtk.h,v 1.1 2001/12/02 23:30:48 enlf Exp $ + */ + +/* + Copyright (C) 1997-2001 by Erik Nolf + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 59 Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef __M_IMTK_H__ +#define __M_IMTK_H__ + +/**************************************************************************** + H E A D E R S +****************************************************************************/ + + + +/**************************************************************************** + D E F I N E S +****************************************************************************/ + +typedef enum { + MDC_IMTK_FILTER_SHEPP_LOGAN, + MDC_IMTK_FILTER_RAM_LAK, + MDC_IMTK_NUM_FILTERS +} MdcImtkFilter; + +typedef enum { + MDC_IMTK_HDR_VOL_X_SZ, + MDC_IMTK_HDR_VOL_Y_SZ, + MDC_IMTK_HDR_VOL_Z_SZ, + MDC_IMTK_HDR_CATFILE, + MDC_IMTK_HDR_LOGFILE, + MDC_IMTK_HDR_STEP, + MDC_IMTK_HDR_SCALE_FACTOR, + MDC_IMTK_HDR_d, + MDC_IMTK_HDR_D, + MDC_IMTK_HDR_DET_PITCH, + MDC_IMTK_HDR_CONE_ANGLE, + MDC_IMTK_HDR_VERBOSE, + MDC_IMTK_HDR_FIRST_PROJ, + MDC_IMTK_HDR_IGNORE_PIX, + MDC_IMTK_HDR_LAST_PROJ, + MDC_IMTK_HDR_FIX_PROJS, + MDC_IMTK_HDR_FILTER_SZ, + MDC_IMTK_HDR_FILTER_TYPE, + MDC_IMTK_HDR_SHORT_SCAN, + MDC_IMTK_HDR_YOFFSET, + MDC_IMTK_NUM_HDR_VALUES, + MDC_IMTK_HDR_UNKNOWN, +} MdcImtkHdrValue; + + +/**************************************************************************** + F U N C T I O N S +****************************************************************************/ + +int MdcCheckIMTK(FILEINFO *fi); +char *MdcReadIMTK(FILEINFO *fi); +char *MdcWriteIMTK(FILEINFO *fi); + +#endif + diff -urN xmedcon/source/medcon.h xmedcon-imtek/source/medcon.h --- xmedcon/source/medcon.h Sun Dec 2 15:51:39 2001 +++ xmedcon-imtek/source/medcon.h Mon Dec 10 19:56:03 2001 @@ -106,6 +106,9 @@ #if MDC_INCLUDE_ECAT #include "m-ecat64.h" #endif +#if MDC_INCLUDE_IMTK + #include "m-imtk.h" +#endif #if MDC_INCLUDE_ANLZ #include "m-anlz.h" #endif diff -urN xmedcon/source/xdefs.h xmedcon-imtek/source/xdefs.h --- xmedcon/source/xdefs.h Sun Dec 2 15:54:12 2001 +++ xmedcon-imtek/source/xdefs.h Mon Dec 10 19:56:53 2001 @@ -104,6 +104,7 @@ GtkWidget *FallbackANLZ; GtkWidget *FallbackCONC; GtkWidget *FallbackECAT; + GtkWidget *FallbackIMTK; GtkWidget *FallbackDICM; GtkWidget *NameAlias; GtkWidget *NameNoPrefix; diff -urN xmedcon/source/xfilesel.c xmedcon-imtek/source/xfilesel.c --- xmedcon/source/xfilesel.c Sun Dec 2 15:54:46 2001 +++ xmedcon-imtek/source/xfilesel.c Mon Dec 10 19:57:57 2001 @@ -260,6 +260,22 @@ gtk_menu_append(GTK_MENU(menu),menuitem); gtk_widget_show(menuitem); #endif +#if MDC_INCLUDE_IMTK + if (LOOK && (format == MDC_FRMT_IMTK)) { + XMDC_WRITE_FRMT = MDC_FRMT_IMTK; LOOK = MDC_NO; selected = item; + } + format_to_use[MDC_FRMT_IMTK]=MDC_FRMT_IMTK; + mitem_nr[MDC_FRMT_IMTK] = item++; + + menuitem = gtk_menu_item_new_with_label(FrmtString[MDC_FRMT_IMTK]); + + gtk_signal_connect( GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(XMdcFileSelSaveCallbackFormatMenu), + &format_to_use[MDC_FRMT_IMTK]); + + gtk_menu_append(GTK_MENU(menu),menuitem); + gtk_widget_show(menuitem); +#endif #if MDC_INCLUDE_INTF if (LOOK && (format == MDC_FRMT_INTF)) { XMDC_WRITE_FRMT = MDC_FRMT_INTF; LOOK = MDC_NO; selected = item; diff -urN xmedcon/source/xmnuftry.c xmedcon-imtek/source/xmnuftry.c --- xmedcon/source/xmnuftry.c Sun Dec 2 15:55:51 2001 +++ xmedcon-imtek/source/xmnuftry.c Mon Dec 10 19:57:57 2001 @@ -65,6 +65,9 @@ #if MDC_INCLUDE_ECAT {"/File/Save As/Ecat", NULL, XMdcFileSelSave, MDC_FRMT_ECAT, NULL}, #endif +#if MDC_INCLUDE_IMTK + {"/File/Save As/ImTek", NULL, XMdcFileSelSave, MDC_FRMT_IMTK, NULL}, +#endif #if MDC_INCLUDE_GIF {"/File/Save As/Gif89a", NULL, XMdcFileSelSave, MDC_FRMT_GIF, NULL}, #endif diff -urN xmedcon/source/xoptions.c xmedcon-imtek/source/xoptions.c --- xmedcon/source/xoptions.c Sun Dec 2 15:54:12 2001 +++ xmedcon-imtek/source/xoptions.c Mon Dec 10 19:57:55 2001 @@ -159,6 +159,8 @@ MDC_FALLBACK_FRMT=MDC_FRMT_CONC; }else if (GTK_TOGGLE_BUTTON(sOptionsMedCon.FallbackECAT)->active) { MDC_FALLBACK_FRMT=MDC_FRMT_ECAT; + }else if (GTK_TOGGLE_BUTTON(sOptionsMedCon.FallbackIMTK)->active) { + MDC_FALLBACK_FRMT=MDC_FRMT_IMTK; } /* File Names */ @@ -206,6 +208,8 @@ MDC_SKIP_PREVIEW=MDC_NO; } + /* ImTek microCAT */ + /* Concorde microPET */ /* Ecat / Matrix */ @@ -546,6 +550,17 @@ gtk_widget_show(button); sOptionsMedCon.FallbackECAT = button; #if ! MDC_INCLUDE_ECAT + gtk_widget_set_sensitive(button,FALSE); +#endif + + group = gtk_radio_button_group(GTK_RADIO_BUTTON(button)); + button = gtk_radio_button_new_with_label(group,"ImTek/uCAT"); + gtk_box_pack_start(GTK_BOX(box3),button,TRUE,TRUE,0); + if (MDC_FALLBACK_FRMT == MDC_FRMT_IMTK) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),TRUE); + gtk_widget_show(button); + sOptionsMedCon.FallbackIMTK = button; +#if ! MDC_INCLUDE_IMTK gtk_widget_set_sensitive(button,FALSE); #endif |
From: <eri...@ru...> - 2001-11-19 18:04:13
|
Hi, Sorry for the double reply. Should have answered this on the mailinglist's first thread ;-). Greetings, Erik ---------- Forwarded message ---------- Date: Mon, 19 Nov 2001 17:13:05 +0100 (CET) From: eri...@ru... To: Mario Schubert <Mar...@ph...> Subject: Re: [xmedcon-devel] Comparing two 2D pictures On Mon, 19 Nov 2001, Mario Schubert wrote: > Hello, > > i have a problem to solve. I have two different DICOM pictures, one from > measurement and one from simulation. These two should be overlayed, > scaled and positioned properly (by hand) and the a difference shuld be > calculated from these two. > > Searching through the net I found thos Open-source tool, which might be > prepared for such additions. Does somebody know a tool (free or > shareware) which solves my problem or is it possible to extend xmedcom > to this functionality. > Hi, (X)MedCon only pretends to be an image convertor, nothing more. What image processing concerns you better look at other tools such as MRIcro or AMIDE. Useful links can be found on http://xmedcon.sf.net/links Good luck, Erik |
From: Mario S. <Mar...@ph...> - 2001-11-19 13:40:27
|
Hello, i have a problem to solve. I have two different DICOM pictures, one from measurement and one from simulation. These two should be overlayed, scaled and positioned properly (by hand) and the a difference shuld be calculated from these two. Searching through the net I found thos Open-source tool, which might be prepared for such additions. Does somebody know a tool (free or shareware) which solves my problem or is it possible to extend xmedcom to this functionality. Thank you in advance for your help. Ciao, Mario Schubert --------------------------------------------- Beschleunigerlabor der TU und LMU Mario Schubert EMail: mar...@ph... Phone: (+49 89)289 14283 FAX: (+49 89)289 14280 Am Coulombwall 6, D-85748 Garching, Germany |
From: <eri...@ru...> - 2001-10-02 21:04:52
|
Hi, The (X)MedCon developers list is now open for use. Greetings, -eNlf- |