CBCT Catphan 503 "Unable to locate phantom" Elekta XVI issue

Hello,

We have been enjoying the introduction of pylinac (2.3.2) with QATrack (0.3.0.14) and are using it for XVI QA with a catphan 503. All has been going well until we had an error with analysing a LFOV image the other day (“unable to locate phantom”). It was also imaged with a MFOV preset in the exact same position, but that scan analysed fine.

Would someone be able to take a look please? The only difference I can see is that the LFOV image has poorer image quality, likely due to a panel misalignment giving the “space invaders” artifact on the line pairs. But previous images like that have also analysed fine.

MFOV (works): https://drive.google.com/file/d/17jH3J5I29aVlVPOTKdvYQWXe2DKARLJw/view?usp=sharing
LFOV (doesn’t work): https://drive.google.com/file/d/14xqAOeJzSCx9HAh7KxuYZL9W-tIgcVuN/view?usp=sharing

Many thanks,
Dan

Hi there, Dan,

I too am not able to analyze your LFOV image. Judging from the LFOV image itself I think you should have LFOV fixed.

The artifacts should be related to the lateral error in XVI’s isocenter calibration. Once this is fixed, the image will improve. I sometimes get similar results, you can check it here: https://synergyqatips.readthedocs.io/en/latest/xvi.html

But in any case I too sometimes cannot get the analysis to work. These are the settings that I use for acquisition and reconstruction, perhaps they will help you. From experience I can say that sometimes just rescanning with slightly different settings will also work.

[LFOV Catphan]
kV=120
NominalmAPerFrame=20
NominalmsPerFrame=20
kVCollimator=L20
kVFilter=F1
UsekVGainFilter=F1
StartAngle=-180
StartAcqAngle=-180
StopAcqAngle=180
GantrySpeed=180
Direction=CW
Frames=660
DefaultReconstructionPreset=Catphan503 Rec
ReconstructInline=Yes
Registration=No
ProjectionImageDimensionU=1024
ProjectionImageDimensionV=1024

[Catphan503 Rec]

PresetDescription=Catphan503
ReconstructionVoxelSize=0.5
ReconstructionDimensionX=540
ReconstructionDimensionY=520
ReconstructionDimensionZ=540
ReconstructionOffsetX=0
ReconstructionOffsetY=0
ReconstructionOffsetZ=0
ReconstructionFilter=Wiener
NumberOfReconstructionFilterParameters=2
ReconstructionFilterParameter1=.05
ReconstructionFilterParameter2=90
Interpolation=Partial2
ScatterCorrection=Uniform
NumberOfScatterCorrectionParameters=1
ScatterCorrectionParameter1=0.24
ReconstructionDataType=float
PreFilter=None
ProjectionDownSizeFactor=2

I usually export with 4 slice averaging (2 mm slice thickness).

Denis

Just one note more. Perhaps in your case you could simply try increasing the reconstruction FOV, without lower the resolution of the phantom.

Hi Denis,

Thank you for taking the time to look at it for me. I’ve run through probably about 40 or so images with identical setup and parameters (across all of S,M and LFOV) and this is the first to have failed. I don’t really want to change anything as I now have fresh baselines and changing parameters might affect that. I was really hoping to understand what it is about the image that has made the analysis fail.

I agree that LFOV image quality needs fixing, we have only recently started to use it, and this machine is about to have an XVI upgrade so I’m sure the Elekta engineer will correct it. Our experience is that lateral panel position optimisation fixes this issue. Thank you for sharing your knowledge, though!

I had wondered whether to try version 3.0 on the failing image… which version did you use, out of interest?

Best wishes,
Dan

Hi Dan,

I understand, you can’t just change the baseline.

I am still using version 2.3.2. I did some fiddling with pylinac code to try to see where the analysis fails. It seems that the spatial resolution slice (line pair) is the culprit. If you restrict the analysis to 404 and 486 modules you can get at least a partial results:

from pylinac import CatPhan503
from pylinac.ct import CTP486
cbct_folder = r"./"
class PartialCatPhan504(CatPhan503):
modules = {
CTP486: {‘offset’: -65}
}
cbct = PartialCatPhan504(cbct_folder)
cbct.analyze()

cbct.results()
cbct.plot_analyzed_image()

You can overload your CTP528 class and change some variables to see if you can catch the 528 module. For example, num_slices and offset:

from pylinac import CatPhan503
from pylinac.ct import CTP486, CTP528

cbct_folder = r"./"

class PartialCatPhan504(CatPhan503):
CTP528.num_slices = 1
modules = {
CTP486: {‘offset’: -65},
CTP528: {‘offset’: -35}
}

cbct = PartialCatPhan504(cbct_folder)
cbct.analyze()
cbct.results()
cbct.plot_analyzed_image()

Denis

Hi Denis,

Thanks for your efforts, I had come to the same conclusion that it was the MTF module causing the issue. I would guess that if the image quality is improved, the line pairs will look more like they should and not cause an issue.

Thanks for demonstrating how to do partial analysis like that! I would not have figured that out myself very easily.

Dan