Canon 4DCT TimeMIP Import into Pinnacle

59 views
Skip to first unread message

Jason Searle

unread,
Oct 18, 2023, 10:15:16 AM10/18/23
to pinnacle3-users
Hi,

I'd be interested in hearing from anyone who has successfully imported TimeMIP datasets into Pinnacle from a Toshiba or Canon CT scanner?

At the moment the data imports with the table positions offset from the positions of the associated 4D phase datasets.

Kind Regards,

Jason

Claudia Widmaier-Mohr und Dr. Peter Mohr

unread,
Oct 19, 2023, 12:42:56 PM10/19/23
to 'Jason Searle' via pinnacle3-users
Hi Jason,

as I have not seen any reply to your question, I share some thoughts and earlier experience with Toshiba/Canon CT scanners.

In our hospital I had two possibilities to import CT scans into Pinnacle:
a) directly: from the scanner to Pinnacle
b) indirectly, two steps: from the scanner to the PACS and from the PACS to Pinnacle
The resulting Pinnacle image sets were offset in the patient craniocaudal direction. The reason for the difference was
related to two different coordinate spaces (I don't remember the precise names, the problem was around 2008 after
installation of the CT scanners; the two names were something like "DICOM" and "DICOM-local").

It seems to me that your problem is similar. Maybe, my above thoughts help to identify the problem or to find a
workaround. Furthermore, it is not too complicated to modify the Pinnacle "ImageSet" files by hand - at least for
testing whether the 4D data sets can be used in Pinnacle. If you need support for this manual editing, let me know.

Best regards,
Peter Mohr

--

---------------------------------------------------------------
| Dr. Peter Mohr
| Medizinphysikexperte
| Klingenäcker 28
| D-74523 Schwäbisch Hall
| phone : +49-7907-9435954 / fax : +49-7907-9435953
| email : Peter.Mo...@gmail.com
---------------------------------------------------------------
> --
> --
> You received this message because you are subscribed to the Google
> Groups "pinnacle3-users" group.
> To post to this group, send email to pinnacl...@googlegroups.com
> To subscribe to this group, send email to
> pinnacle3-us...@googlegroups.com
> To unsubscribe from this group, send email to
> pinnacle3-use...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/pinnacle3-users?hl=en <http://groups.google.com/group/pinnacle3-users?hl=en>
>
> ---
> You received this message because you are subscribed to the Google Groups "pinnacle3-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to
> pinnacle3-use...@googlegroups.com <mailto:pinnacle3-use...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/pinnacle3-users/e68e8fd8-a75b-49b4-8447-bcafa34a5787n%40googlegroups.com
> <https://groups.google.com/d/msgid/pinnacle3-users/e68e8fd8-a75b-49b4-8447-bcafa34a5787n%40googlegroups.com?utm_medium=email&utm_source=footer>.

Robert Ross

unread,
Nov 2, 2023, 9:51:06 AM11/2/23
to pinnacle3-users
Hi Jason

I can do this with Pinnacle 16.2.1 and our Canon Aquilion LB.  I had to write software to alter the MIP with some additional tags.  Interestingly, our MIPs would not import at all without this intervention.  The Pinnacle dicom conformance statement does tell you which tags are required, but I found a bit of trial and error was needed.  Basically, I take the position data from the phase 0% series and use it to add the position to the MIP data.

In Python, using pydicom and a reading a MIPS CT dicom object called ct:

#add the phase0 coordinate value corresponding to the InstanceNumber key in the phase0_dict
  ct.add_new([0x0020, 0x00032],'DS',phase0_dict[ct.InstanceNumber])
#add a whole bunch of required tags
                       ct[0x0008, 0x0016].value='1.2.840.10008.5.1.4.1.1.2' #CT Image Storage SOP, for Intensity Projection Image Datasets Only
                      try:
                            ct.add_new([0x0018, 0x0050],'DS','3.0')#(0018,0050) DS Slice Thickness
                            slice_thickness = True
                        except:
                            slice_thickness = False
    #add kvp
                        try:
                            ct.add_new([0x0018, 0x0060],'DS','120')#(0018,0060) DS KVP
                            kvp = True
                        except:
                            kvp = False
                           
    #add frame of reference UID, should match primary image set (dummy value for now)
                        try:
                            ct.add_new([0x0020, 0x0052],'UI','1.2.392.200036.9116.2.6.1.1236.3294381536.1627371182.292774')#(0020,0052) UI Frame of Reference UID
                            frame_of_ref_uid = True
   
                        except:
                            frame_of_ref_uid = False
   
    #add tags required as VNAP (vnap, value not always present) in the 'Presence of Module' category of the dicom conformance statement
    ##position reference indicator, table 64
                        try:
                            ct.add_new([0x0020, 0x1040],'LO', '')#(0020,1040) LO Position Reference Indicator
                            position_ref_indicator = True
                        except:
                            position_ref_indicator = False
    #add tags required as ANAP (attribute present in specified condition, value must be present if attribute exists) in the 'Presence of Module' category of the dicom conformance statement
    ##note the specified condition is not known, but the 'examine dicom issues' option in Pinnacle lists the first problematic tag
    ##patient position, table 63 - note that I'm making an assumption about HFS, it's not in the file anywhere in this format, but could be worked out from ImageOrientationPatient
                        try:
                            ct.add_new([0x0018, 0x5100],'CS' ,'HFS')#(0018,5100) CS Patient Position
                            patient_position = True
                        except:
                            patient_position = False
    #from section 8.5.3, table 200
   
    #private creator codes
  
                        try:
                            ct.add_new([0x00F1, 0x0010],'LO','ELSCINT1')    
                            s00f10010 = True
                        except:
                            s00f10010 = False
    #couch id
                        try:
                            ct.add_new([0x00E1, 0x1042],'LO','Couch')  
                            couch_id = True
                        except:
                            couch_id = False
    #gating, specifies intensity projection type as MIP, MinIP or AIP
                        try:
                            ct.add_new([0x01F1, 0x1039],'LO','AIP')
                            gating_code = True
                        except:
                            gating_code = False
    #add in a dummy acquisition number.  This is Type 2 (non essential) but throws a warning when importing to Aria
    #and we don't want people to ignore warnings.
                        try:
                            ct.add_new([0x0020, 0x0012],'IS','1') # 2023-03-09
                            acquisition_number = True
                        except:
                            acquisition_number = False


There's a bit more complexity to it - you need to get the corresponding position from the phase 0% slices etc, but happy to discuss further.

Kind regards
Robert
Reply all
Reply to author
Forward
0 new messages