4

物理学、特に医学物理学では、ガンマ指数は 2 つの粒子検出器からのデータを比較するための基準です。より抽象的に言えば、ガンマ インデックスは 2 つの 2D 配列 (array1 と array2 としましょう) を取り、array1 の各要素を array2 の空間的に近い要素と比較します。

分析セクションでガンマ指数を使用している何百もの学術論文があります。これらの論文は、ガンマ インデックスの計算に使用するツール/ライブラリについて言及していないようです。作成者が独自のガンマ インデックス計算を実装している可能性があります (それほど難しくありません)。ただし、ガンマ インデックスを計算するためのライブラリ/拡張機能/ツールがあると推測しています。

RまたはPythonで使用するガンマインデックスライブラリを提案できる人はいますか? (Python や R の既製品がなければ、他の言語でも問題ありません。)

4

3 に答える 3

4

少し遅いかもしれませんが、私の貢献:

https://gist.github.com/janpipek/334c2533b87cd75c3f59

Pythonで書かれています。solvePuzzles の答えと比較して、メソッドは任意の次元の行列を受け入れます (それらが同じである場合)。各ポイントのガンマ インデックスを計算する方法 (少し長い) と、dta 基準を満たさないポイントを自動的に除外する最適化されたバージョンの 2 つの方法が含まれています。

遅刻者の参考になれば幸いです。

于 2014-09-25T17:45:00.440 に答える
1

編集[2019]:

改善された 1D、2D、および 3D ガンマ決定がpymedphysライブラリ内で利用できるようになりました。これは、 https://doi.org/10.1118/1.2721657で説明されている実装に基づいています。使用するには、次の手順を実行します。

pip install numpy scipy pymedphys==0.16.3 pydicom==1.3.0

次に、使用例は次のようになります。

import pydicom
import pymedphys

reference_filepath = pymedphys.data_path("original_dose_beam_4.dcm")
evaluation_filepath = pymedphys.data_path("logfile_dose_beam_4.dcm")

reference = pydicom.read_file(str(reference_filepath), force=True)
evaluation = pydicom.read_file(str(evaluation_filepath), force=True)

axes_reference, dose_reference = pymedphys.dicom.zyx_and_dose_from_dataset(reference)
axes_evaluation, dose_evaluation = pymedphys.dicom.zyx_and_dose_from_dataset(evaluation)

gamma_options = {
    'dose_percent_threshold': 1,  # This is a bit overkill here at 1%/1mm
    'distance_mm_threshold': 1,
    'lower_percent_dose_cutoff': 20,
    'interp_fraction': 10,  # Should be 10 or more, see the paper referenced above
    'max_gamma': 2,
    'random_subset': None,  # Can be used to get quick pass rates
    'local_gamma': True,  # Change to false for global gamma
    'ram_available': 2**29  # 1/2 GB
}

gamma = pymedphys.gamma(
    axes_reference, dose_reference, 
    axes_evaluation, dose_evaluation, 
    **gamma_options)

古い答え:

図書館がありますnpgamma。を使用してpypiからダウンロードできますpip install npgamma

例については、 readmeを参照してください。

基本的な使用方法は次のとおりです。

from npgamma import calc_gamma

...

gamma = calc_gamma(
    coords_reference, dose_reference,
    coords_evaluation, dose_evaluation,
    distance_threshold, dose_threshold)

ここcoords_referenceで、 とcoords_evalutionは、3D では (y, x, z)、2D では (y, x) として定義されます。

重要なことに、このメソッドは参照ポイント間をユーザー定義のステップ サイズ (デフォルトは距離しきい値の 1/10) まで補間します。

于 2015-10-06T20:17:17.413 に答える
0

この論文の付録 A で、2D ガンマ インデックスの基本的な MATLAB 実装を見つけました。

論文から次のコードをコピーして貼り付け、読みやすくするためにいくつかの簡略化を行いました。私は作者と話し、私のバージョンのコード (下記) が正しいことを確認しました。最近、私はこのコードを医学物理学研究の分析部分で使用しています。

入力A1A2は 2D 配列です (実際には、線量マップまたはフルエンス マップです)。A1参考データとし、評価A2中のデータです。典型的な 2%、2mm の許容基準を使用する場合、一致までの距離を としてDTA=2mm設定し、線量閾値dosed=0.02を 2% に設定します。

この単純な実装では、配列インデックスの間隔が 1mm 刻みであると想定しています。データが 1mm 刻みを使用していない場合は、それdosedに応じて値をスケーリングします (たとえば、A1A2が 0.5mm 刻みの場合は、 を使用DTA=4して 2mm 基準を取得します)。

出力 はG、ガンマ値の 2D 配列です。

function G = gamma2d (A1, A2, DTA, dosed)
    size1=size (A1) ;
    size2=size (A2) ;
    dosed = dosed *  max(A1 ( : ) ) ; %scale dosed as a percent of the maximum dose

    G=zeros ( size1 ) ; %this will be the output
    Ga=zeros ( size1 ) ;
    if size1 == size2
        for i = 1 : size1( 1 )
            for j = 1 : size1( 2 )
                for k = 1 : size1( 1 )
                    for l = 1 : size1( 2 )
                        r2 = ( i - k )^2 + (j - l) ^2 ; %distance (radius) squared
                        d2 = ( A1( i , j ) - A2( k , l ) )^2 ; %difference squared
                        Ga( k , l ) = sqrt(r2 / (DTA^2) + d2/ dosed ^ 2);
                    end
                end
                G( i , j )=min(min(Ga)) ;
            end
        end
    else
        fprintf=('matrices A1 and A2 are do not share the same dimensions! \n')
    end
end

数学表記でガンマ インデックスの説明を確認するには、このブログ投稿を参照することをお勧めします。

于 2012-07-24T20:42:54.670 に答える