[Dcmlib] Serie Helper

Mathieu Malaterre mathieu.malaterre at kitware.com
Fri Oct 14 17:37:32 CEST 2005


[Sorry french only]

C'est ce que j'avais commence avec mes 'AddRestriction'...

Mise en situation:
Je suis un utilisateur, j'ai 10000 images DICOM et je dois visualier Mr. 
X, le jour de son exam IRM, le 01/01/1997.
Qu'est ce que je fais:
Je cree un SerieHelper dans mon script python

 >> s = SerieHelper
 >> s.SetDirectory( 'bla' )
 >> s.Execute()

-> gdcm ne doit pas seg faulter mais me dire: 'Sorry I can't find a 
coherent serie for you'

Je continue:

#group elem serait mieux mais je me souvient pas des tag par coeur
 >> s.AddRestriction( 'Patient Name', 'Mr X')
 >> s.AddRestriction( 'Modality',  'MRI')
 >> s.AddRestriction( 'Date',  '01.01.1997')
 >> s.Execute()

-> gdcm est content a a peu construire une serie coherente...

------------------------------------------------------------------

Le vrai probleme c'est de refaire les cas d'utilisation de SerieHelper. 
Ca a ete fais a la base pour Maracas, pour reconstruire un volume. C'est 
pas prevu pour etre le couteau suisse des images series.

2 cents,
Mathieu
Ps: Tu as pu voir que tout est fais par chaine de caractere, donc python 
devrait etre content.

Jean-Pierre Roux wrote:
> Salut, Mathieu .
> 
> --> English translation will follow.
> Sorry.
> JPRx
> 
> Il va falloir qu'on se penche *serieusement* sur le pb du SerieHelper, 
> maintenant qu'on a un peu d'experience.
> 
> Actuellement, on passe au constructeur, des noms de fichiers, et/ou des 
> gdcm::File *, et il fabrique a la volée autant de std::vector qu'il y a 
> de "Series Instance UID" différents.
> Ces std::vector sont rangés dans une std::map (nommée -on s'en tape- :  
> CoherentFileListmap CoherentFileListHT;)
> qui a pour clé le "Series Instance UID".
> On accede a chacun de ces std::vector (dont le typedef est 
> gdcm::FileList), par :
> FileList *GetFirstCoherentFileList();
> FileList *GetNextCoherentFileList();
> 
> C'est a l'utilisateur de decider, en fonction de ce qu'il sait de ses 
> données, de demander le tri des "CoherentFileList" dont il a besoin.
> Par defaut, le tri est fait sur la Position; s'il y a des ex aequo (ou 
> que la Position n'est pas trouvee), on trie sur ImageNumber, si pas 
> trouvé, sur le filename -pourquoi pas ?-
> 
> -->Si l'utilisateur en sait plus que nous sur son critere de tri (par 
> exemple, et n'importe quoi : tri sur le 'TimeTrigger'), il positionne un 
> pointeur sur sa propre fonction de comparaison.
> Ca marche tres bien, mais ca a l'air de chagriner Benoit, pour des 
> problèmes d'utilisation en Python.
> Si on se lance dans trucs du genre 'functor', l'utilsation de gdcm par 
> un utilisateur 'non Itk' ne va pas gagner en clarté, non?
> 
> --> On a vu , qu'en fait, ces "ensembles de gdcm::File* de meme Series 
> Instance UID" ne sont pas si 'coherents' que ca, puis qu'ils peuvent 
> avoir des orientations, ou des positions differentes, et que, dans ce 
> cas, ca peut ne pas convenir *du tout* à l'utilisateur.
> Je propose que, dans la prochaine release de gdcm, on les renome,  
> "SingleSerieUIDFileSet", ou qq chose comme ça, et qu'on ajoute des 
> methodes qui permettraient de ventiler ces "SingleSerieUIDFileSet" en de 
> vraies "CoherentFileSet" (meme taille image/taille pixel, meme 
> Orientation, ou meme taille image/taille pixel, meme Position, ou 
> ventillation sur ce que l'utilisateur souhaite : il nous passe un 
> pointeur sur sa fonction de "test d'egalite".
> (voir remarque précendente  : Python pb)
> 
> --> Si, pour des raisons qui ne concernent que lui, l'utisateur -qui 
> sait ce qu'il fait- recupere des images où bon lui semble, qu'il se fait 
> un std::vector de gdcm::File*, et qu'il lance le tri de ce std::vector, 
> ca marchera -legitimement- tres bien, mais il lui faudra avoir instancié 
> un gdcm::SerieHelper pour avoir acces a la methode de tri 
> SerieHelper::OrderFileList().
> Ma question :
> Cette methode dit-elle rester dans la classe SerieHelper, ou bien 
> doit-elle porter sur une nouvelle classe  "ensemble de gdcm::File*" 
> (name it as you like).
> 
> --> For application reasons of their own, some users wish to 'order' , 
> using  OrderFileList() method -or the next one-, not a
> std::vector(<gdcm::File*>)             - typedefed, right now as 
> gdcm::FileList -
> but a
> gdcm::DicomDirSerie                    - that's, right now, a 
> std::list(<gdcm::DicomDirImage *>) -
> 
> gdcm::File inherits from gdcm::Document
> DicomDirImage inherits from gdcm::SQItem
> Both gdcm::Document and gdcm::SQItem inherits from gdcm::DocEntrySet.
> All the low level methods to access the gdcm::DocEntries to perform the 
> comparison operations are available at the gdcm::DocEntrySet level(no pb 
> till here), the iterators work the same way for both std::vector and 
> std::list
> but the 'Added Value Methods', say : GetImageOrientationPatient, 
> GetXOrigin, GetYOrigin, GetZOrigin are only defined for gdcm;;File (they 
> are meaningless for, say a gdcm::DicomDir, or any kind of gdcm::SQItem), 
> but there are fully meaningfull (?) for a gdcm::DicomDirImage.
> It would be silly to nove theses methods up to gdcm::DocEntrySet.
> Using template method hang at  *application* compile time
> 
> What do we do ?
> 
> JP
> 
> 
> 
> 
> 
> _______________________________________________
> Dcmlib mailing list
> Dcmlib at creatis.insa-lyon.fr
> http://www.creatis.insa-lyon.fr/mailman/listinfo/dcmlib
> 




More information about the Dcmlib mailing list