35 #include "utils/half.hpp" 67 size_t y0,
size_t x0,
size_t yF,
size_t xF)
76 size_t sizeToCopy=
XSIZE(Ismall)*
sizeof(T);
77 for (
int y=y0;
y<=
yF;
y++)
90 ostrm <<
"NULL MultidimArray\n";
94 for (
size_t l = 0; l <
NSIZE(v); l++)
97 ostrm <<
"Image No. " << l << std::endl;
101 ostrm <<
"Slice No. " <<
k << std::endl;
165 if (! op1.sameShape(op2) || op1.data==NULL || op2.data == NULL)
191 const size_t unroll=4;
193 for (
size_t n=0;
n<
nmax;
n+=unroll)
226 const size_t unroll=4;
228 for (
size_t n=0;
n<
nmax;
n+=unroll)
273 double d00, d10, d11, d01, *ref;
274 if ((x0 >= j0) && (x1 <= jF) && (y0 >= i0) && (y1 <= iF))
285 bool outX0,outX1,outY0,outY1;
286 outX0 = (x0 < j0) || (x0 > jF);
287 outX1 = (x1 < j0) || (x1 > jF);
288 outY0 = (y0 < i0) || (y0 > iF);
289 outY1 = (y1 < i0) || (y1 > iF);
363 sincos(*ptr, ptrS++,ptrC++);
368 double &p0,
double &p1,
double &p2)
375 double m11=0, m12=0, m13=0, m21=0, m22=0, m23=0, m31=0, m32=0, m33=0;
376 double b1=0, b2=0, b3=0;
425 int SplineDegree)
const 427 int SplineDegree_1 = SplineDegree - 1;
434 int l1 = (int)ceil(x - SplineDegree_1);
435 int l2 = l1 + SplineDegree;
437 int m1 = (int)ceil(y - SplineDegree_1);
438 int m2 = m1 + SplineDegree;
440 int n1 = (int)ceil(z - SplineDegree_1);
441 int n2 = n1 + SplineDegree;
445 int Xdim=(int)
XSIZE(*
this);
446 int Ydim=(int)
YSIZE(*
this);
447 int Zdim=(int)
ZSIZE(*
this);
448 for (
int nn = n1;
nn <= n2;
nn++)
450 int equivalent_nn=
nn;
454 equivalent_nn=2*Zdim-
nn-1;
456 for (
int m = m1;
m <= m2;
m++)
462 equivalent_m=2*Ydim-
m-1;
464 for (
int l = l1; l <= l2; l++)
466 double xminusl = x - (double) l;
471 equivalent_l=2*Xdim-l-1;
473 equivalent_nn,equivalent_m,equivalent_l);
474 switch (SplineDegree)
504 double yminusm = y - (double) m;
505 switch (SplineDegree)
535 double zminusn = z - (double) nn;
536 switch (SplineDegree)
543 zyxsum += yxsum * aux;
572 int SplineDegree_1 = SplineDegree - 1;
578 int l1 = (int)ceil(x - SplineDegree_1);
579 int l2 = l1 + SplineDegree;
580 int m1 = (int)ceil(y - SplineDegree_1);
581 int m2 = m1 + SplineDegree;
583 double columns = 0.0;
585 int Ydim=(int)
YSIZE(*
this);
586 int Xdim=(int)
XSIZE(*
this);
587 for (
int m = m1;
m <= m2;
m++)
593 equivalent_m=2*Ydim-
m-1;
595 for (
int l = l1; l <= l2; l++)
597 double xminusl = x - (double) l;
602 equivalent_l=2*Xdim-l-1;
604 switch (SplineDegree)
641 double yminusm = y - (double) m;
642 switch (SplineDegree)
650 columns += rows * aux;
691 int l1 = (int)ceil(x - 2);
693 int m1 = (int)ceil(y - 2);
696 double columns = 0.0;
698 int Ydim=(int)
YSIZE(*
this);
699 int Xdim=(int)
XSIZE(*
this);
704 for (
int m = m1;
m <= m2;
m++)
710 equivalent_m=2*Ydim-
m-1;
714 for (
int l = l1; l <= l2; l++)
720 double xminusl = x - (double) l;
728 equivalent_l=2*Xdim-l-1;
731 equivalent_l_Array[
index] = equivalent_l;
733 aux_Array[
index] = aux;
738 equivalent_l = equivalent_l_Array[
index];
739 aux = aux_Array[
index];
744 double Coeff = ref[equivalent_l];
751 double yminusm = y - (double) m;
753 columns += rows * aux;
762 int SplineDegree_1 = SplineDegree - 1;
767 int l1 = (int)ceil(x - SplineDegree_1);
768 int l2 = l1 + SplineDegree;
769 int Xdim=(int)
XSIZE(*
this);
771 for (
int l = l1; l <= l2; l++)
773 double xminusl = x - (double) l;
778 equivalent_l=2*Xdim-l-1;
781 switch (SplineDegree)
827 *ptr =
static_cast< T
>(
rnd_unif(op1, op2));
830 *ptr =
static_cast< T
>(
rnd_gaus(op1, op2));
844 if (mode ==
"uniform")
846 *ptr +=
static_cast< T
>(
rnd_unif(op1, op2));
847 else if (mode ==
"gaussian")
849 *ptr +=
static_cast< T
>(
rnd_gaus(op1, op2));
850 else if (mode ==
"student")
855 formatString(
"AddNoise: Mode not supported (%s)", mode.c_str()));
862 FILE* fMap = tmpfile();
863 int Fd = fileno(fMap);
865 if ((lseek(Fd, nzyxDim*
sizeof(T)-1, SEEK_SET) == -1) || (::
write(Fd,
"",1) == -1))
870 if ( (_data = (T*) mmap(0,nzyxDim*
sizeof(T), PROT_READ | PROT_WRITE, MAP_SHARED, Fd, 0)) == (
void*) MAP_FAILED )
912 std::vector<double> randValues;
914 for(
int i=0;
i<Npix;
i++)
919 std::sort(randValues.begin(),randValues.end());
921 double m = randValues[(size_t)(minPerc*Npix)];
922 double M = randValues[(size_t)(maxPerc*Npix)];
927 *ptr = 2/(M-
m)*(*ptr-m)-1;
937 const char * fnStr = fn_tmp.c_str();
940 std::ofstream fh_gplot;
941 fh_gplot.open(
formatString(
"PPP%s.gpl", fnStr).c_str());
944 formatString(
"vector::showWithGnuPlot: Cannot open PPP%s.gpl for output", fnStr));
945 fh_gplot <<
"set xlabel \"" + xlabel +
"\"\n";
946 fh_gplot <<
"plot \"PPP" + fn_tmp +
".txt\" title \"" + title +
948 fh_gplot <<
"pause 300 \"\"\n";
950 if (0 != system(
formatString(
"(gnuplot PPP%s.gpl; rm PPP%s.txt PPP%s.gpl) &", fnStr, fnStr, fnStr).c_str()) ) {
964 if (0 != system(
formatString(
"xmipp_edit -i %s -remove &", nam.c_str()).c_str())) {
973 out.open(fn.c_str(), std::ios::out);
976 formatString(
"MultidimArray::write: File %s cannot be opened for output", fn.c_str()));
999 if (Xdim <= 0 || Ydim <= 0 || Zdim <= 0 || Ndim <= 0)
1014 yxdim = Ydim * Xdim;
1023 size_t YXdim=(size_t)Ydim*Xdim;
1024 size_t ZYXdim=YXdim*Zdim;
1025 size_t NZYXdim=ZYXdim*Ndim;
1033 new_mFd =
mmapFile(new_data, NZYXdim);
1035 new_data =
new T [NZYXdim];
1037 memset(new_data,0,NZYXdim*
sizeof(T));
1039 catch (std::bad_alloc &)
1044 resize(Ndim, Zdim, Ydim, Xdim, copy);
1049 std::ostringstream sstream;
1050 sstream <<
"Allocate: No space left to allocate ";
1051 sstream << (NZYXdim *
sizeof(T)/1024/1024/1024) ;
1063 const auto xCopyBytes = xCopy*
sizeof(T);
1065 for (
size_t l = 0; l < nCopy; ++l)
1066 for (
size_t k = 0;
k < zCopy; ++
k)
1067 for (
size_t i = 0;
i < yCopy; ++
i)
1069 new_data + l*ZYXdim +
k*YXdim +
i*Xdim,
1084 yxdim = Ydim * Xdim;
1091 template<
typename T>
1098 template<
typename T>
1101 std::vector<double> bgI;
1113 if (bgI.size() % 2 != 0)
1114 median = bgI[bgI.size() / 2];
1116 median = (bgI[(bgI.size() - 1) / 2] + bgI[bgI.size() / 2]) / 2.0;
1119 template<
typename T>
1130 if (
ABS(*ptr - oldv) <= accuracy)
void planeFit(const MultidimArray< double > &z, const MultidimArray< double > &x, const MultidimArray< double > &y, double &p0, double &p1, double &p2)
T interpolatedElementBSpline1D(double x, int SplineDegree=3) const
void min(Image< double > &op1, const Image< double > &op2)
#define A2D_ELEM(v, i, j)
double Bspline05(double Argument)
void coreDeallocate() noexcept
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
Case or algorithm not implemented yet.
__host__ __device__ float2 floor(const float2 v)
double rnd_student_t(double nu)
#define REPORT_ERROR(nerr, ErrormMsg)
T interpolatedElementBSpline2D_Degree3(double x, double y) const
void sort(MultidimArray< T > &result) const
void initRandom(double op1, double op2, RandomMode mode=RND_UNIFORM)
void resizeNoCopy(const MultidimArray< T1 > &v)
FILE * mmapFile(T *&_data, size_t nzyxDim) const
Couldn't write to file.
There is not enough memory for allocation.
T interpolatedElementBSpline3D(double x, double y, double z, int SplineDegree=3) const
#define DIRECT_A2D_ELEM(v, i, j)
#define MULTIDIM_ARRAY(v)
void inv(Matrix2D< T > &result) const
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY_ptr(v, n, ptr)
Input/Output general error.
Incorrect MultidimArray size.
bool operator==(const MultidimArray< std::complex< double > > &op1, const MultidimArray< std::complex< double > > &op2)
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 median(MultidimArray< T > &x, MultidimArray< T > &y, T &m)
double Bspline04(double Argument)
void resizeNoCopy(int Ydim, int Xdim)
T interpolatedElement2D(double x, double y, T outside_value=(T) 0) const
#define A3D_ELEM(V, k, i, j)
Map addressing of file has failed.
#define DIRECT_A1D_ELEM(v, i)
#define checkDimension(dim)
void addNoise(double op1, double op2, const String &mode="uniform", double df=3.) const
void computeMedian_within_binary_mask(const MultidimArray< int > &mask, double &median) const
std::ostream & operator<<(std::ostream &ostrm, const MultidimArray< std::complex< double > > &v)
void getSliceAsMatrix(size_t k, Matrix2D< T > &m) const
#define XMIPP_EQUAL_ACCURACY
void indexx(int n, double arrin[], int indx[])
void write(const FileName &fn) const
T * adaptForNumericalRecipes1D() const
MultidimArray< T > & operator=(const MultidimArray< T > &op1)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
void sincos(const MultidimArray< double > &x, MultidimArray< double > &s, MultidimArray< double > &c)
double Bspline07(double Argument)
void showWithGnuPlot(const String &xlabel, const String &title)
#define DIRECT_MULTIDIM_ELEM(v, n)
double Bspline08(double Argument)
void randomSubstitute(T oldv, T avgv, T sigv, double accuracy=XMIPP_EQUAL_ACCURACY, MultidimArray< int > *mask=NULL)
void window2D(const MultidimArray< T > &Ibig, MultidimArray< T > &Ismall, size_t y0, size_t x0, size_t yF, size_t xF)
void sort(struct DCEL_T *dcel)
#define DIRECT_A3D_ELEM(v, k, i, j)
T interpolatedElementBSpline2D(double x, double y, int SplineDegree=3) const
double Bspline02(double Argument)
void typeCast(const Matrix1D< T1 > &v1, Matrix1D< T2 > &v2)
String formatString(const char *format,...)
void selfNormalizeInterval(double minPerc=0.25, double maxPerc=0.75, int Npix=1000)
double Bspline09(double Argument)
void copy(Matrix2D< T > &op1) const
#define LIN_INTERP(a, l, h)
double Bspline06(double Argument)
Incorrect value received.
#define MATRIX2D_ARRAY(m)
void indexSort(MultidimArray< int > &indx) const
void initRandom(int length)