44 #define MRCSIZE 1024 // Minimum size of the MRC header (when nsymbt = 0) 138 printf(
"DEBUG readMRC: Reading MRC file\n");
141 std::unique_ptr< MRChead > header(
new MRChead() );
145 if ( fread( header.get(),
MRCSIZE, 1, fimg ) < 1 )
152 fprintf(stderr,
"Warning: Swapping header byte order for 4-byte types\n");
162 size_t _xDim,_yDim,_zDim,_nDim;
171 axisOrder[1] = 4 - header->maps;
172 axisOrder[2] = 4 - header->mapr;
173 axisOrder[3] = 4 - header->mapc;
175 bool isVolStk = (header->ispg > 400);
180 if ( !isStack && (isVolStk || !filename.contains(
":")))
181 isStack = ((header->ispg == 0 || isVolStk ) && (header->nsymbt == 0));
189 _nDim = _zDim / header->mz;
199 _nDimSet = _nDim - start_img + 1;
201 _nDimSet =
std::min( start_img + batch_size - 1, _nDim ) - start_img + 1;
205 if ( start_img > _nDim )
217 switch ( header->mode )
250 replaceNsize = _nDim;
251 setDimensions(_xDim, _yDim, _zDim, _nDimSet);
254 offset =
MRCSIZE + header->nsymbt;
256 datasize_n = _xDim*_yDim*_zDim;
259 if ( header->mode > 2 && header->mode < 5 )
262 fseek(fimg, 0, SEEK_END);
263 if ( ftell(fimg) > offset + 0.8*datasize_n*
gettypesize(datatype) )
264 _xDim = (2 * (_xDim - 1));
265 if ( header->mx%2 == 1 )
267 setDimensions(_xDim, _yDim, _zDim, _nDim);
270 MDMainHeader.setValue(
MDL_MIN,(
double)header->amin);
271 MDMainHeader.setValue(
MDL_MAX,(
double)header->amax);
272 MDMainHeader.setValue(
MDL_AVG,(
double)header->amean);
273 MDMainHeader.setValue(
MDL_STDDEV,(
double)header->arms);
278 if ( header->mx && header->a!=0 && sampling == 1.0)
281 if ( header->my && header->b!=0 && sampling == 1.0)
284 if ( header->mz && header->c!=0 && sampling == 1.0)
293 const size_t imgStart =
IMG_INDEX(start_img);
294 const size_t imgEnd = start_img + _nDimSet - 1;
297 for (
size_t i = 0;
i < imgEnd-imgStart;
i++)
305 for (
size_t i = 0;
i < imgEnd - imgStart; ++
i )
307 MD[
i]->setValue(
MDL_SHIFT_X, (
double) -header->nxStart);
308 MD[
i]->setValue(
MDL_SHIFT_Y, (
double) -header->nyStart);
309 MD[
i]->setValue(
MDL_SHIFT_Z, (
double) -header->nzStart);
312 if (header->xOrigin != 0)
317 if (header->yOrigin !=0)
322 if (header->zOrigin != 0)
329 if ( dataMode <
DATA )
339 readData4bit(fimg, start_img, datatype, 0);
342 readData(fimg, start_img, datatype, 0);
357 printf(
"DEBUG readMRC: Reading MRC file\n");
363 return readMRC(select_img, 1, isStack);
456 if (!checkMmapT(wDType))
472 mdaBase->setMmap(
true);
476 mdaBase->coreAllocateReuse();
492 strncpy(header->
map,
"MAP ", 4);
496 machine_stamp = (
char *)(header->
machst);
499 machine_stamp[0] = 68;
500 machine_stamp[1] = 65;
504 machine_stamp[0] = machine_stamp[1] = 17;
511 size_t Xdim, Ydim, Zdim, Ndim;
512 getDimensions(Xdim, Ydim, Zdim, Ndim);
521 header->
mx = header->
nx = Xdim;
522 header->
my = header->
ny = Ydim;
523 header->
mz = header->
nz = Zdim;
529 header->
a = (float)(Xdim * sampling);
531 header->
b = (float)(Ydim * sampling);
533 header->
c = (float)(Zdim * sampling);
536 header->
nx = Xdim/2 + 1;
554 if (!MDMainHeader.empty())
556 #define SET_MAIN_HEADER_VALUE(field, label) MDMainHeader.getValueOrDefault(label, aux, 0.); header->field = (float)aux 564 #define SET_HEADER_SHIFT(field, label) MD[0]->getValueOrDefault(label, aux, 0.); header->field = -(int) round(aux) 568 #define SET_HEADER_ORIGIN(field, label1, label2) MD[0]->getValueOrDefault(label1, aux, 0.);MDMainHeader.getValueOrDefault(label2, aux2, 0.);\ 569 header->field = (float) (aux * aux2) 575 #define SET_HEADER_CELL_DIM(field, label1, dimSize) MDMainHeader.getValueOrDefault(label1, aux, 0.);\ 576 header->field = (float) (aux * dimSize) 594 size_t datasize, datasize_n;
595 datasize_n = Xdim*Ydim*Zdim;
601 printf(
"DEBUG rwMRC: Offset = %ld, Datasize_n = %ld\n", offset, datasize_n);
606 if (Ndim > 1 || filename.contains(
":mrcs"))
609 bool isVolStk = isStack && Zdim > 1;
610 size_t nDimHeader = Ndim;
618 imgStart = replaceNsize;
619 nDimHeader = replaceNsize + Ndim;
621 else if( mode ==
WRITE_REPLACE && select_img + Ndim - 1 > replaceNsize)
623 nDimHeader = select_img + Ndim - 1;
633 header->
nz = Zdim * nDimHeader;
638 header->
nz = nDimHeader;
642 header->
ispg = (Zdim>1)? 1:0;
649 if(!isStack || replaceNsize < nDimHeader)
653 fwrite( header,
MRCSIZE, 1, fimg );
658 fseek( fimg,offset + (datasize)*imgStart, SEEK_SET);
660 size_t imgEnd = (isStack)? Ndim : 1;
662 if (checkMmapT(wDType) && !mmapOnWrite && dataMode >=
DATA) {
663 writeData(fimg, 0, wDType, datasize_n * imgEnd, castMode);
665 for (
size_t i = 0;
i < imgEnd;
i++ )
668 if (dataMode >=
DATA)
670 if (mmapOnWrite && Ndim == 1)
672 mappedOffset = ftell(fimg);
673 mappedSize = mappedOffset + datasize;
674 fseek(fimg, datasize-1, SEEK_CUR);
678 writeData(fimg,
i*datasize_n, wDType, datasize_n, castMode);
681 fseek(fimg, datasize, SEEK_CUR);
void min(Image< double > &op1, const Image< double > &op2)
#define SET_MAIN_HEADER_VALUE(field, label)
int readMRC(size_t select_img, bool isStack=false)
bool IsLittleEndian(void)
#define REPORT_ERROR(nerr, ErrormMsg)
DataType datatypeRAW(String strDT)
void abs(Image< double > &op)
#define SET_HEADER_ORIGIN(field, label1, label2)
int writeMRC(size_t select_img, bool isStack=false, int mode=WRITE_OVERWRITE, const String &bitDepth="", CastWriteMode castMode=CW_CAST)
#define SET_HEADER_CELL_DIM(field, label1, dimSize)
int freeMemory(void *ptr, size_t memsize)
int readMRC(size_t select_img, bool isStack=false)
const size_t tiff_map_min_size
char * askMemory(size_t memsize)
static MDRowVec emptyHeaderVec()
void lock(int fileno=0)
Lock file.
#define SET_HEADER_SHIFT(field, label)
String formatString(const char *format,...)
#define IMG_INDEX(select_img)
fprintf(glob_prnt.io, "\)
size_t gettypesize(DataType type)
Returns memory size of datatype.