38 addUsageLine(
"Calculate Fourier Shell Occupancy - FSO curve - via directional FSC measurements.");
44 addUsageLine(
"Reference: J.L. Vilas, H.D. Tagare, XXXXX (2021)");
46 addUsageLine(
"+ The Fourier Shell Occupancy Curve can be obtained from a set of directional FSC (see below).");
47 addUsageLine(
"+ To do that, two half maps are used to determine the Global FSC at threshold 0.143. Then, the ratio between the number");
48 addUsageLine(
"+ of directions with resolution higher (better) than the Global resolution and the total number of measured directions is");
49 addUsageLine(
"+ calculated at different frequencies (resolutions). Note that this ratio is between 0 (resolution of all directions is worse than the global FSC)");
50 addUsageLine(
"+ resolution than the global FSC) and 1 (all directions present better resolution than the FSC) at a given resolution.");
51 addUsageLine(
"+ In the particular case, FSO curve takes the value of 0.5 (FSO=0.5), then half of the directions are better, and.");
52 addUsageLine(
"+ the other half are worse than the FSC, this situation occurs at the resoltuion of the map. It means the FSO = 0.5 at the ");
53 addUsageLine(
"+ FSC resolution. A map is isotropic if all directional resolution are similar, and anisotropic is there are significant resolution values along");
54 addUsageLine(
"+ different directions. Thus, when the FSO presents a sharp cliff, a step-like function, the map will be isotropic.");
55 addUsageLine(
"+ In contrast, when the OFSC shows a slope the map will be anisotropic. The lesser slope the higher resolution isotropy.");
57 addUsageLine(
"+* Directional Fourier Shell Correlation (dFSC)",
true);
58 addUsageLine(
"+ This program estimates the directional FSC between two half maps along all posible directions on the projection sphere.");
59 addUsageLine(
"+ The directionality is measured by means of conical-like filters in Fourier Space. To avoid possible Gibbs effects ");
60 addUsageLine(
"+ the filters are gaussian functions with their respective maxima along the filtering direction. A set of 321 directions ");
61 addUsageLine(
"+ is used to cover the projection sphere, computing for each direction the directional FSC at 0.143 between the two half maps.");
62 addUsageLine(
"+ The result is a set of 321 FSC curves (321 is the number of analyzed directions, densely covering the projection sphere).");
63 addUsageLine(
"+ The 3DFSC is then obtained from all curves by interpolation. Note that as well as it occurs with global FSC, the directional FSC is mask dependent.");
65 addUsageLine(
"+* Resolution Distribution and 3DFSC",
true);
66 addUsageLine(
"+ The directional-FSC, dFSC is estimated along 321 directions on the projection sphere. For each direction the corresponding");
67 addUsageLine(
"+ resolution is determined. Thus, it is possible to determine the resolution distribution on the projection sphere.");
68 addUsageLine(
"+ This distribution is saved in the output metadata named resolutionDistribution.xmd. Also by means of all dFSC, the 3DFSC");
69 addUsageLine(
"+ is calculated and saved as 3dFSC.mrc, which gives an idea about the information distributionin Fourier Space.");
77 addParamsLine(
" [-o <output_folder=\"\">] : Folder where the results will be stored.");
79 addParamsLine(
" [--sampling <Ts=1>] : (Optical) Pixel size (Angstrom). If it is not provided by default will be 1 A/px.");
80 addParamsLine(
" [--mask <input_file=\"\">] : (Optional) Smooth mask to remove noise. If it is not provided, the computation will be carried out without mask.");
82 addParamsLine(
" [--anglecone <ang_con=17>] : (Optional) Angle Cone (angle between the axis and the generatrix) for estimating the directional FSC");
83 addParamsLine(
" [--threshold <thrs=0.143>] : (Optional) Threshold for the FSC/directionalFSC estimation ");
85 addParamsLine(
" [--threedfsc_filter] : (Optional) Put this flag to estimate the 3DFSC, and apply it as low pass filter to obtain a directionally filtered map. It mean to apply an anisotropic filter.");
87 addParamsLine(
" [--threads <Nthreads=1>] : (Optional) Number of threads to be used");
89 addExampleLine(
"Resolution of two half maps half1.mrc and half2.mrc with a sampling rate of 2 A/px",
false);
90 addExampleLine(
"xmipp_resolution_fso --half1 half1.mrc --half2 half2.mrc --sampling_rate 2 ");
91 addExampleLine(
"Resolution of two half maps half1.mrc and half2.mrc with a sampling rate of 2 A/px and a mask mask.mrc",
false);
92 addExampleLine(
"xmipp_resolution_fso --half1 half1.mrc --half2 half2.mrc --mask mask.mrc --sampling_rate 2 ");
105 do_3dfsc_filter =
checkParam(
"--threedfsc_filter");
111 void ProgFSO::defineFrequencies(
const MultidimArray< std::complex<double> > &mapfftV,
125 for(
size_t k=1;
k<
ZSIZE(mapfftV); ++
k){
131 for(
size_t k=1;
k<
YSIZE(mapfftV); ++
k){
137 for(
size_t k=1;
k<
XSIZE(mapfftV); ++
k){
146 xvoldim =
XSIZE(inputVol);
147 yvoldim =
YSIZE(inputVol);
148 zvoldim =
ZSIZE(inputVol);
152 double uz, uy, ux, uz2, uz2y2;
159 for(
size_t k=0;
k<
ZSIZE(mapfftV); ++
k)
163 for(
size_t i=0;
i<
YSIZE(mapfftV); ++
i)
168 for(
size_t j=0;
j<
XSIZE(mapfftV); ++
j)
171 ux =
sqrt(uz2y2 + ux*ux);
175 idx = (int)
round(ux * xvoldim);
181 if ((
j == 0) && (uy<0))
188 if ((
i == 0) && (
j == 0) && (uz<0))
209 void ProgFSO::arrangeFSC_and_fscGlobal(
double sampling_rate,
230 absz1_vec = real_z1z2;
231 absz2_vec = real_z1z2;
253 auto ZdimFT1=(int)
ZSIZE(FT1);
254 auto YdimFT1=(int)
YSIZE(FT1);
255 auto XdimFT1=(int)
XSIZE(FT1);
266 for (
int k=0;
k<ZdimFT1;
k++)
269 for (
int i=0;
i<YdimFT1;
i++)
272 for (
int j=0;
j<XdimFT1;
j++)
288 auto idx = (int)
round(f * xvoldim);
304 std::complex<double> &z1 =
dAkij(FT1,
k,
i,
j);
305 std::complex<double> &z2 =
dAkij(FT2,
k,
i,
j);
307 double absz1 =
abs(z1);
308 double absz2 =
abs(z2);
314 dAi(num,idx) += real(
conj(z1) * z2);
315 dAi(den1,idx) += absz1*absz1;
316 dAi(den2,idx) += absz2*absz2;
332 dAi(freq,
i) = (float)
i / (xvoldim * sampling_rate);
343 mdRes.
write(fnOut+
"/GlobalFSC.xmd");
346 fscInterpolation(freq, frc);
357 double ff =
dAi(frc,
i);
358 if ( (ff<=thrs) && (
i>2) )
360 double y2, y1, x2, x1, slope, ny;
365 slope = (y2 - y1)/(x2 - x1);
368 double fscResolution;
369 fscResolution = (thrs - ny)/slope;
370 std::cout <<
"Resolution " << 1/fscResolution << std::endl;
380 double &thrs,
double &resol, std::vector<
Matrix2D<double>> &freqMat,
size_t dirnum)
399 std::vector<long> vecidx;
400 vecidx.reserve(real_z1z2.
nzyxdim);
402 std::vector<double> weightFSC3D;
403 weightFSC3D.reserve(real_z1z2.
nzyxdim);
407 float x_dir, y_dir, z_dir, cosAngle, aux;
408 x_dir = sinf(tilt)*cosf(rot);
409 y_dir = sinf(tilt)*sinf(rot);
419 cosAngle = (float) cos(ang_con);
425 aux = (4.0/((cosAngle -1)*(cosAngle -1)));
436 float cosine = fabs(x_dir*ux + y_dir*uy + z_dir*uz);
439 if (cosine >= cosAngle)
443 cosine = expf( -((cosine -1)*(cosine -1))*aux);
447 weightFSC3D.push_back(cosine);
471 if (
dAi(fsc,
i)>=thrs)
473 freqMat[
i] = freqMat[
i] + T;
480 if (flagRes && (
i>2) && (
dAi(fsc,
i)<=thrs))
483 double ff = (float)
i / (xvoldim * sampling);
495 size_t sizevec = vecidx.size();
496 for (
size_t kk = 0; kk< sizevec; ++kk)
498 double w = weightFSC3D[kk];
510 double ProgFSO::incompleteGammaFunction(
double &
x)
527 VEC_ELEM(incompgamma,1) =0.00017212f;
528 VEC_ELEM(incompgamma,2) =0.0036598f;
912 MAT_ELEM(angles, 0, 10) = 108.000000f;
MAT_ELEM(angles, 1, 10) = 47.576224f;
913 MAT_ELEM(angles, 0, 11) = 108.000000f;
MAT_ELEM(angles, 1, 11) = 63.434965f;
914 MAT_ELEM(angles, 0, 12) = 134.494295f;
MAT_ELEM(angles, 1, 12) = -76.558393f;
915 MAT_ELEM(angles, 0, 13) = 126.000000f;
MAT_ELEM(angles, 1, 13) = 90.000000f;
916 MAT_ELEM(angles, 0, 14) = 117.505705f;
MAT_ELEM(angles, 1, 14) = 76.558393f;
917 MAT_ELEM(angles, 0, 15) = 144.000000f;
MAT_ELEM(angles, 1, 15) = -15.858741f;
918 MAT_ELEM(angles, 0, 16) = 144.000000f;
MAT_ELEM(angles, 1, 16) = -31.717482f;
919 MAT_ELEM(angles, 0, 17) = 144.000000f;
MAT_ELEM(angles, 1, 17) = -47.576224f;
920 MAT_ELEM(angles, 0, 18) = 144.000000f;
MAT_ELEM(angles, 1, 18) = -63.434965f;
921 MAT_ELEM(angles, 0, 19) = 170.494295f;
MAT_ELEM(angles, 1, 19) = 76.558393f;
922 MAT_ELEM(angles, 0, 20) = 162.000000f;
MAT_ELEM(angles, 1, 20) = 90.000000f;
923 MAT_ELEM(angles, 0, 21) = 153.505705f;
MAT_ELEM(angles, 1, 21) = -76.558393f;
924 MAT_ELEM(angles, 0, 22) = 72.000000f;
MAT_ELEM(angles, 1, 22) = -15.858741f;
925 MAT_ELEM(angles, 0, 23) = 72.000000f;
MAT_ELEM(angles, 1, 23) = -31.717482f;
926 MAT_ELEM(angles, 0, 24) = 72.000000f;
MAT_ELEM(angles, 1, 24) = -47.576224f;
927 MAT_ELEM(angles, 0, 25) = 72.000000f;
MAT_ELEM(angles, 1, 25) = -63.434965f;
930 MAT_ELEM(angles, 0, 28) = 81.505705f;
MAT_ELEM(angles, 1, 28) = -76.558393f;
951 MAT_ELEM(angles, 0, 49) = 144.000000f;
MAT_ELEM(angles, 1, 49) = 26.565058f;
952 MAT_ELEM(angles, 0, 50) = 131.188979f;
MAT_ELEM(angles, 1, 50) = 42.234673f;
953 MAT_ELEM(angles, 0, 51) = 156.811021f;
MAT_ELEM(angles, 1, 51) = 42.234673f;
954 MAT_ELEM(angles, 0, 52) = 125.533003f;
MAT_ELEM(angles, 1, 52) = 59.620797f;
955 MAT_ELEM(angles, 0, 53) = 144.000000f;
MAT_ELEM(angles, 1, 53) = 58.282544f;
956 MAT_ELEM(angles, 0, 54) = 162.466996f;
MAT_ELEM(angles, 1, 54) = 59.620797f;
957 MAT_ELEM(angles, 0, 55) = 144.000000f;
MAT_ELEM(angles, 1, 55) = 90.000000f;
958 MAT_ELEM(angles, 0, 56) = 135.132791f;
MAT_ELEM(angles, 1, 56) = 75.219088f;
959 MAT_ELEM(angles, 0, 57) = 152.867209f;
MAT_ELEM(angles, 1, 57) = 75.219088f;
960 MAT_ELEM(angles, 0, 58) = 180.000000f;
MAT_ELEM(angles, 1, 58) = -26.565058f;
961 MAT_ELEM(angles, 0, 59) = 167.188979f;
MAT_ELEM(angles, 1, 59) = -42.234673f;
962 MAT_ELEM(angles, 0, 60) = 180.000000f;
MAT_ELEM(angles, 1, 60) = -58.282544f;
963 MAT_ELEM(angles, 0, 61) = 161.533003f;
MAT_ELEM(angles, 1, 61) = -59.620797f;
964 MAT_ELEM(angles, 0, 62) = 171.132791f;
MAT_ELEM(angles, 1, 62) = -75.219088f;
965 MAT_ELEM(angles, 0, 63) = 108.000000f;
MAT_ELEM(angles, 1, 63) = -26.565058f;
966 MAT_ELEM(angles, 0, 64) = 120.811021f;
MAT_ELEM(angles, 1, 64) = -42.234673f;
967 MAT_ELEM(angles, 0, 65) = 95.188979f;
MAT_ELEM(angles, 1, 65) = -42.234673f;
968 MAT_ELEM(angles, 0, 66) = 126.466996f;
MAT_ELEM(angles, 1, 66) = -59.620797f;
969 MAT_ELEM(angles, 0, 67) = 108.000000f;
MAT_ELEM(angles, 1, 67) = -58.282544f;
970 MAT_ELEM(angles, 0, 68) = 89.533003f;
MAT_ELEM(angles, 1, 68) = -59.620797f;
971 MAT_ELEM(angles, 0, 69) = 108.000000f;
MAT_ELEM(angles, 1, 69) = 90.000000f;
972 MAT_ELEM(angles, 0, 70) = 116.867209f;
MAT_ELEM(angles, 1, 70) = -75.219088f;
973 MAT_ELEM(angles, 0, 71) = 99.132791f;
MAT_ELEM(angles, 1, 71) = -75.219088f;
974 MAT_ELEM(angles, 0, 72) = 36.000000f;
MAT_ELEM(angles, 1, 72) = -26.565058f;
975 MAT_ELEM(angles, 0, 73) = 48.811021f;
MAT_ELEM(angles, 1, 73) = -42.234673f;
976 MAT_ELEM(angles, 0, 74) = 23.188979f;
MAT_ELEM(angles, 1, 74) = -42.234673f;
977 MAT_ELEM(angles, 0, 75) = 54.466996f;
MAT_ELEM(angles, 1, 75) = -59.620797f;
978 MAT_ELEM(angles, 0, 76) = 36.000000f;
MAT_ELEM(angles, 1, 76) = -58.282544f;
979 MAT_ELEM(angles, 0, 77) = 17.533003f;
MAT_ELEM(angles, 1, 77) = -59.620797f;
981 MAT_ELEM(angles, 0, 79) = 44.867209f;
MAT_ELEM(angles, 1, 79) = -75.219088f;
982 MAT_ELEM(angles, 0, 80) = 27.132791f;
MAT_ELEM(angles, 1, 80) = -75.219088f;
1004 std::cout <<
"Reading data..." << std::endl;
1006 imgHalf1.
read(fnhalf1);
1007 imgHalf2.
read(fnhalf2);
1035 void ProgFSO::saveAnisotropyToMetadata(
MetaDataVec &mdAnisotropy,
1049 mdAnisotropy.
addRow(row);
1052 mdAnisotropy.
write(fnOut+
"/fso.xmd");
1056 void ProgFSO::directionalFilter(
MultidimArray<std::complex<double>> &FThalf1,
1061 imgHalf1.
read(fnhalf1);
1062 imgHalf2.
read(fnhalf2);
1064 auto &half1 = imgHalf1();
1065 auto &half2 = imgHalf2();
1084 void ProgFSO::directionalFilterHalves(
MultidimArray<std::complex<double>> &FThalf1,
1088 imgHalf1.
read(fnhalf1);
1089 imgHalf2.
read(fnhalf2);
1091 auto &half1 = imgHalf1();
1092 auto &half2 = imgHalf2();
1188 saveImg.
write(fnOut+
"/filteredHalfMap1.mrc");
1189 saveImg() = filteredMap2;
1190 saveImg.
write(fnOut+
"/filteredHalfMap2.mrc");
1197 const size_t Nrot = 360;
1198 const size_t Ntilt = 91;
1205 const float cosAngle = cosf(ang_con);
1206 const float aux = 4.0/((cosAngle -1)*(cosAngle -1));
1211 float rotmatrix =
i*
PI/180.0;
1212 float cr = cosf(rotmatrix);
1213 float sr = sinf(rotmatrix);
1217 float tiltmatrix =
j*
PI/180.0;
1219 float st = sinf(tiltmatrix);
1222 float zz = cosf(tiltmatrix);
1228 for (
size_t k = 0;
k<angles.
mdimx;
k++)
1235 float x_dir = sinf(tilt)*cosf(rot);
1236 float y_dir = sinf(tilt)*sinf(rot);
1237 float z_dir = cosf(tilt);
1240 float cosine = fabs(x_dir*xx + y_dir*yy + z_dir*zz);
1241 if (cosine>=cosAngle)
1243 cosine = expf( -((cosine -1)*(cosine -1))*aux );
1244 w += cosine*(
dAi(resDirFSC,
k) );
1265 int m1sizeX,
int m1sizeY,
int m1sizeZ)
1275 double *ptrSource=
nullptr;
1276 double *ptrDest=
nullptr;
1283 *ptrDest=*ptrSource;
1288 (m1sizeZ-
k)%m1sizeZ,
1289 (m1sizeY-
i)%m1sizeY,
1291 *ptrDest=*ptrSource;
1298 int m1sizeX,
int m1sizeY,
int m1sizeZ)
1301 getCompleteFourier(fourierHalf, fullMap, m1sizeX, m1sizeY, m1sizeZ);
1304 saveImg() = fullMap;
1305 saveImg.
write(fnMap);
1311 std::cout <<
"Starting ... " << std::endl << std::endl;
1317 prepareData(half1, half2);
1322 transformer2.setThreadsNumber(Nthreads);
1325 transformer2.FourierTransform(half2, FT2,
false);
1329 defineFrequencies(FT1, phalf1);
1337 arrangeFSC_and_fscGlobal(sampling, thrs, freq);
1343 generateDirections(angles,
true);
1344 ang_con = ang_con*
PI/180.0;
1352 std::vector<MultidimArray<float>> threeD_FSCs(Nthreads);
1353 std::vector<MultidimArray<float>> normalizationMaps(Nthreads);
1354 std::vector<MultidimArray<float>> aniParams(Nthreads);
1355 for (
auto & ma : threeD_FSCs) {
1356 ma.initZeros(real_z1z2);
1358 for (
auto & ma : normalizationMaps) {
1359 ma.initZeros(real_z1z2);
1361 for (
auto & ma : aniParams) {
1362 ma.initZeros(xvoldim/2+1);
1369 std::vector<std::vector<Matrix2D<double>>> isotropyMatrices;
1375 for (
auto & im : isotropyMatrices)
1382 threadPool.
resize(Nthreads);
1383 auto futures = std::vector<std::future<void>>();
1384 futures.reserve(angles.
mdimx);
1386 for (
size_t k = 0;
k<angles.
mdimx;
k++)
1388 futures.emplace_back(threadPool.
push(
1389 [
k,
this, &resDirFSC, &threeD_FSCs, &normalizationMaps, &aniParams, &isotropyMatrices](
int thrId){
1390 float rot = MAT_ELEM(angles, 0, k);
1391 float tilt = MAT_ELEM(angles, 1, k);
1393 double resInterp = -1;
1394 MultidimArray<float> fsc;
1396 auto &threeD_FSC = threeD_FSCs.at(thrId);
1397 auto &normalizationMap = normalizationMaps.at(thrId);
1398 auto &freqMat = isotropyMatrices.at(thrId);
1400 fscDir_fast(fsc, rot, tilt, threeD_FSC, normalizationMap, thrs, resInterp, freqMat, k);
1402 printf (
"Direction %zu/%zu -> %.2f A \n", k, angles.mdimx, resInterp);
1404 dAi(resDirFSC, k) = resInterp;
1407 anistropyParameter(fsc, aniParams.at(thrId), thrs);
1412 for (
auto &
f : futures) {
1416 std::cout <<
"----- Directional resolution estimated -----" << std::endl << std::endl;
1417 std::cout <<
"Preparing results ..." << std::endl;
1420 for (
size_t i = 1;
i < aniParams.size(); ++
i) {
1421 aniParams.at(0) += aniParams.at(
i);
1428 for (
size_t j = 1;
j<Nthreads; ++
j)
1430 isotropyMatrices.at(0)[
i] += isotropyMatrices.at(
j)[
i];
1432 isotropyMatrices.at(0)[
i] /= aniParams.at(0)[
i];
1436 auto &aniParam = aniParams.at(0);
1443 if (aniParams.at(0)[
i] >0)
1450 T = isotropyMatrices.at(0)[
i];
1454 dAi(isotropyMatrix,
i) = 0.5*pdim*(pdim+2)*(2*aniParams.at(0)[
i])*(trT2 - 1./pdim);
1468 aniParams.at(0) /= (double) angles.
mdimx;
1469 for (
size_t k = 0;
k<5;
k++)
1472 saveAnisotropyToMetadata(mdani, freq, aniParams.at(0), isotropyMatrix);
1477 fn = fnOut+
"/Resolution_Distribution.xmd";
1479 resolutionDistribution(resDirFSC, fn);
1483 if (do_3dfsc_filter)
1494 for (
size_t i = 1;
i < Nthreads; ++
i) {
1495 threeD_FSCs.at(0) += threeD_FSCs.at(
i);
1496 normalizationMaps.at(0) += normalizationMaps.at(
i);
1498 auto &threeD_FSC = threeD_FSCs.at(0);
1499 auto &normalizationMap = normalizationMaps.at(0);
1504 if (std::isnan(value))
1523 auxVal =
YSIZE(d3_FSCMap)/2;
1526 for(
size_t i=(auxVal+1);
i<
YSIZE(d3_FSCMap); ++
i)
1528 for(
size_t k=0;
k<
ZSIZE(d3_FSCMap); ++
k)
1535 for(
size_t k=0;
k<
ZSIZE(d3_FSCMap); ++
k)
1544 img.
write(
"threeD_FSC.mrc");
1553 directionalFilterHalves(FT1, d3_aniFilter);
1556 fn = fnOut+
"/3dFSC.mrc";
1557 createFullFourier(d3_FSCMap, fn, xvoldim, yvoldim, zvoldim);
1562 std::cout <<
"-------------Finished-------------" << std::endl;
void min(Image< double > &op1, const Image< double > &op2)
alglib::complex conj(const alglib::complex &z)
double getDoubleParam(const char *param, int arg=0)
void resizeNoCopy(const MultidimArray< T1 > &v)
auto push(F &&f, Rest &&... rest) -> std::future< decltype(f(0, rest...))>
void sqrt(Image< double > &op)
void setValue(const MDObject &object) override
void write(const FileName &name="", size_t select_img=ALL_IMAGES, bool isStack=false, int mode=WRITE_OVERWRITE, CastWriteMode castMode=CW_CAST, int _swapWrite=0)
void abs(Image< double > &op)
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(V)
void resize(int nThreads)
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
void addSeeAlsoLine(const char *seeAlso)
#define MAT_ELEM(m, i, j)
void CenterFFT(MultidimArray< T > &v, bool forward)
const char * getParam(const char *param, int arg=0)
void max(Image< double > &op1, const Image< double > &op2)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
#define dAkij(V, k, i, j)
#define DIRECT_MULTIDIM_ELEM(v, n)
void addExampleLine(const char *example, bool verbatim=true)
#define DIRECT_A3D_ELEM(v, k, i, j)
__device__ float FFT_IDX2DIGFREQ(int idx, int size)
#define FOR_ALL_ELEMENTS_IN_ARRAY1D(v)
void realGaussianFilter(MultidimArray< double > &img, double sigma)
bool checkParam(const char *param)
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
void addUsageLine(const char *line, bool verbatim=false)
void initZeros(const MultidimArray< T1 > &op)
int getIntParam(const char *param, int arg=0)
void addParamsLine(const String &line)