本家様 https://grigoriefflab.umassmed.edu/ctf_estimation_ctffind_ctftilt

RockyLinux8で使ってみる
提供されているバイナリーバージョンの「ctffind-4.1.14-linux64.tar.gz」はREL7系(CentOS7)ではうまく動く.
しかしRHEL8系のRockyLinux8では実行すると下記のようにcore dumpして終わる.

Segmentation fault (core dumped)

動かいないみたい。
っで、ソースコードを入手して、コンパイルしてみる。

ソース展開、コンパイル

コンパイルに必要なライブラリをインストールします。

[root@c ~]# dnf --enablerepo=epel install wxBase3-devel wxGTK3-devel fftw-devel libtiff-devel libjpeg-turbo-devel

本家様からソースコードをダウンロードして展開します

[root@c ~]# cd /apps/src
[root@c src]# gzip -cd ctffind-4.1.14.tar.gz | tar xf -
[root@c src]# cd ctffind-4.1.14

ここで
https://grigoriefflab.umassmed.edu/comment/1696#comment-1696にある調整を加えます
具体的には下記のようにプログラムコードを修正します

--- ctffind-4.1.14/src/programs/ctffind/ctffind.cpp.orig        2020-05-09 02:28:31.000000000 +0900
+++ ctffind-4.1.14/src/programs/ctffind/ctffind.cpp     2021-11-09 13:08:47.351398779 +0900
@@ -267,11 +267,11 @@
 float FindRotationalAlignmentBetweenTwoStacksOfImages(Image *self, Image *other_image, int number_of_images, float search_half_range, float search_step_size, float minimum_radius, float maximum_radius);
 void ComputeImagesWithNumberOfExtremaAndCTFValues(CTF *ctf, Image *number_of_extrema, Image *ctf_values);
 int ReturnSpectrumBinNumber(int number_of_bins, float number_of_extrema_profile[], Image *number_of_extrema, long address, Image *ctf_values, float ctf_values_profile[]);
-bool ComputeRotationalAverageOfPowerSpectrum( Image *spectrum, CTF *ctf, Image *number_of_extrema, Image *ctf_values, int number_of_bins, double spatial_frequency[], double average[], double average_fit[], double average_renormalized[], float number_of_extrema_profile[], float ctf_values_profile[]);
+void ComputeRotationalAverageOfPowerSpectrum( Image *spectrum, CTF *ctf, Image *number_of_extrema, Image *ctf_values, int number_of_bins, double spatial_frequency[], double average[], double average_fit[], double average_renormalized[], float number_of_extrema_profile[], float ctf_values_profile[]);
 void ComputeEquiPhaseAverageOfPowerSpectrum( Image *spectrum, CTF *ctf, Curve *epa_pre_max, Curve *epa_post_max);
 void OverlayCTF( Image *spectrum, CTF *ctf, Image *number_of_extrema, Image *ctf_values, int number_of_bins_in_1d_spectra, double spatial_frequency[], double rotational_average_astig[], float number_of_extrema_profile[], float ctf_values_profile[], Curve *equiphase_average_pre_max, Curve *equiphase_average_post_max);
 void ComputeFRCBetween1DSpectrumAndFit( int number_of_bins, double average[], double fit[], float number_of_extrema_profile[], double frc[], double frc_sigma[], int first_fit_bin);
-bool RescaleSpectrumAndRotationalAverage( Image *spectrum, Image *number_of_extrema, Image *ctf_values, int number_of_bins, double spatial_frequency[], double average[], double average_fit[], float number_of_extrema_profile[], float ctf_values_profile[], int last_bin_without_aliasing, int last_bin_with_good_fit );
+void RescaleSpectrumAndRotationalAverage( Image *spectrum, Image *number_of_extrema, Image *ctf_values, int number_of_bins, double spatial_frequency[], double average[], double average_fit[], float number_of_extrema_profile[], float ctf_values_profile[], int last_bin_without_aliasing, int last_bin_with_good_fit );
 void Renormalize1DSpectrumForFRC( int number_of_bins, double average[], double fit[], float number_of_extrema_profile[]);
 float ReturnAzimuthToUseFor1DPlots(CTF *ctf);
 
@@ -2419,7 +2419,7 @@
 
 // Rescale the spectrum and its 1D rotational avereage so that the peaks and troughs are at 0.0 and 1.0. The location of peaks and troughs are worked out
 // by parsing the suppilied 1D average_fit array
-bool RescaleSpectrumAndRotationalAverage( Image *spectrum, Image *number_of_extrema, Image *ctf_values, int number_of_bins, double spatial_frequency[], double average[], double average_fit[], float number_of_extrema_profile[], float ctf_values_profile[], int last_bin_without_aliasing, int last_bin_with_good_fit )
+void RescaleSpectrumAndRotationalAverage( Image *spectrum, Image *number_of_extrema, Image *ctf_values, int number_of_bins, double spatial_frequency[], double average[], double average_fit[], float number_of_extrema_profile[], float ctf_values_profile[], int last_bin_without_aliasing, int last_bin_with_good_fit )
 {
        MyDebugAssertTrue(spectrum->is_in_memory, "Spectrum memory not allocated");
        MyDebugAssertTrue(number_of_bins > 1,"Bad number of bins: %i\n",number_of_bins);
@@ -2762,7 +2762,7 @@
 }
 
 //
-bool ComputeRotationalAverageOfPowerSpectrum( Image *spectrum, CTF *ctf, Image *number_of_extrema, Image *ctf_values, int number_of_bins, double spatial_frequency[], double average[], double average_fit[], double average_rank[], float number_of_extrema_profile[], float ctf_values_profile[])
+void ComputeRotationalAverageOfPowerSpectrum( Image *spectrum, CTF *ctf, Image *number_of_extrema, Image *ctf_values, int number_of_bins, double spatial_frequency[], double average[], double average_fit[], double average_rank[], float number_of_extrema_profile[], float ctf_values_profile[])
 {
        MyDebugAssertTrue(spectrum->is_in_memory, "Spectrum memory not allocated");
        MyDebugAssertTrue(number_of_extrema->is_in_memory,"Number of extrema image not allocated");

そうして

[root@c ctffind-4.1.14]# ./configure --prefix=/apps/ctffind-4.1.14
[root@c ctffind-4.1.14]# make; make install

使う

大抵は relion からコールされて使うのが常なのであんまりそのままでは使わない。
けど、こんな感じでインターラクティヴに使うものです。
(ヒアドキュメントみたいな実行方法もあるけど)

[root@c ~]# /apps/ctffind-4.1.14/bin/ctffind
 
 
        **   Welcome to Ctffind   **
 
            Version : 4.1.14
           Compiled : Nov  9 2021
               Mode : Interactive
 
Input image file name [input.mrc]                  :

トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2021-11-25 (木) 16:24:43 (57d)