42 #define SPIDERSIZE 1024 // Minimum size of the SPIDER header (variable) 148 printf(
"DEBUG readSPIDER: Reading Spider file, start_img = %lu, batch_size = %lu\n", start_img, batch_size);
153 std::unique_ptr<SPIDERhead> header(
new SPIDERhead() );
154 if ( fread( header.get(),
SPIDERSIZE, 1, fimg ) != 1 )
156 ". Error message: %s", filename.c_str() ,strerror(errno)));
159 if ( (swap = (( fabs(header->nslice) >
SWAPTRIG ) || ( fabs(header->iform) > 1000 ) ||
160 ( fabs(header->nslice) < 1 ))) )
163 if(header->labbyt != header->labrec*header->lenbyt)
166 offset = (size_t) header->labbyt;
169 MDMainHeader.setValue(
MDL_MIN,(
double)header->fmin);
170 MDMainHeader.setValue(
MDL_MAX,(
double)header->fmax);
171 MDMainHeader.setValue(
MDL_AVG,(
double)header->av);
172 MDMainHeader.setValue(
MDL_STDDEV,(
double)header->sig);
178 bool isStack = ( header->istack > 0 );
179 int _xDim,_yDim,_zDim;
180 size_t _nDim, _nDimSet;
181 _xDim = (int) header->nsam;
182 _yDim = (
int) header->nrow;
183 _zDim = (int) header->nslice;
184 _nDim = (isStack)? (size_t)(header->maxim) : 1;
186 if (_xDim < 1 || _yDim < 1 || _zDim < 1 || _nDim < 1)
189 replaceNsize = _nDim;
202 _nDimSet = _nDim - start_img + 1;
204 _nDimSet =
std::min( start_img + batch_size - 1, _nDim ) - start_img + 1;
207 setDimensions(_xDim, _yDim, _zDim, _nDimSet);
210 const size_t header_size = offset;
214 if ( start_img > _nDim )
224 const size_t datasize_n = _xDim*_yDim*_zDim;
225 const size_t image_size = header_size + datasize_n*
sizeof(float);
226 const size_t pad = (size_t) header->labbyt;
227 const size_t imgStart =
IMG_INDEX(start_img);
228 const size_t imgEnd = start_img + _nDimSet - 1;
230 size_t img_seek = header_size + imgStart * image_size;
233 for (
size_t i = 0;
i < imgEnd-imgStart;
i++)
240 for (
size_t n = 0,
i = imgStart;
i < imgEnd; ++
i, ++
n, img_seek += image_size )
242 if (fseek( fimg, img_seek, SEEK_SET ) != 0)
249 if ( fread( header.get(),
SPIDERSIZE, 1, fimg ) != 1 )
256 daux = (double)header->xoff;
258 daux = (double)header->yoff;
260 daux = (double)header->zoff;
262 daux = (double)header->phi;
264 daux = (double)header->theta;
266 daux = (double)header->gamma;
268 daux = (double)header->weight;
270 bool baux = (header->flip == 1);
272 daux = (double) header->scale;
283 std::cerr<<
"DEBUG readSPIDER: header_size = "<<header_size<<
" image_size = "<<image_size<<std::endl;
284 std::cerr<<
"DEBUG readSPIDER: select_img= "<<select_img<<
" n= "<<Ndim<<
" pad = "<<pad<<std::endl;
287 readData(fimg, start_img, datatype, pad );
297 printf(
"DEBUG readSPIDER: Reading Spider file\n");
325 printf(
"DEBUG writeSPIDER: Writing Spider file\n");
326 printf(
"DEBUG writeSPIDER: File %s\n", filename.c_str());
336 if (!checkMmapT(wDType))
352 mdaBase->setMmap(
true);
356 mdaBase->coreAllocateReuse();
365 size_t Xdim, Ydim, Zdim, Ndim;
366 getDimensions(Xdim, Ydim, Zdim, Ndim);
368 size_t datasize, datasize_n;
369 datasize_n = (size_t)Xdim*Ydim*Zdim;
378 offset = (size_t) labbyt;
395 size_t xstore = (size_t)(Xdim * 0.5 + 1);
396 header->
nsam = 2*xstore;
401 printf(
"DEBUG writeSPIDER: Size: %g %g %g %d %g\n",
425 if (!MDMainHeader.empty())
427 #define SET_MAIN_HEADER_VALUE(field, label, aux) MDMainHeader.getValueOrDefault(label, aux, 0.); header->field = (float)aux 435 if (Ndim == 1 && mode !=
WRITE_APPEND && !isStack && !MD.empty())
439 #define SET_HEADER_VALUE(field, label, aux) MD[0]->getValueOrDefault((label), (aux), 0.); header->field = (float)(aux) 472 printf(
"DEBUG writeSPIDER: Date and time: %s %s\n", header->
cdat, header->
ctim);
473 printf(
"DEBUG writeSPIDER: Text label: %s\n", header->
ctit);
474 printf(
"DEBUG writeSPIDER: Header size: %g\n", header->
labbyt);
475 printf(
"DEBUG writeSPIDER: Header records and record length: %g %g\n", header->
labrec, header->
lenbyt);
476 printf(
"DEBUG writeSPIDER: Data size: %ld\n", datasize);
477 printf(
"DEBUG writeSPIDER: Data offset: %ld\n", offset);
478 printf(
"DEBUG writeSPIDER: File %s\n", filename.c_str());
483 bool writeMainHeaderReplace =
false;
484 header->
maxim = replaceNsize;
486 size_t newNsize = imgStart + Ndim;
495 writeMainHeaderReplace =
true;
496 header->
maxim += Ndim;
498 else if(newNsize > replaceNsize)
500 writeMainHeaderReplace =
true;
501 header->
maxim = newNsize;
509 writeMainHeaderReplace=
true;
519 writeMainHeaderReplace ||
520 newNsize > replaceNsize)
524 fwrite( header, offset, 1, fimg );
528 if ( Ndim == 1 && !isStack)
530 if (dataMode >=
DATA)
534 mappedOffset = ftell(fimg);
535 mappedSize = mappedOffset + datasize;
536 fseek(fimg, datasize-1, SEEK_CUR);
540 writeData(fimg, 0, wDType, datasize_n,
CW_CAST);
545 fseek( fimg,offset + (offset+datasize)*imgStart, SEEK_SET);
548 auto it = MD.begin();
550 for (
size_t i = 0;
i < Ndim; ++it, ++
i)
574 fwrite( header, offset, 1, fimg );
575 if (dataMode >=
DATA)
577 if (mmapOnWrite && Ndim == 1)
579 mappedOffset = ftell(fimg);
580 mappedSize = mappedOffset + datasize;
581 fseek(fimg, datasize-1, SEEK_CUR);
585 writeData(fimg,
i*datasize_n, wDType, datasize_n,
CW_CAST);
588 fseek(fimg, datasize, SEEK_CUR);
void min(Image< double > &op1, const Image< double > &op2)
#define SET_HEADER_VALUE(field, label, aux)
__host__ __device__ float2 floor(const float2 v)
#define REPORT_ERROR(nerr, ErrormMsg)
int readSPIDER(size_t select_img)
int readSPIDER(size_t select_img)
Input/Output general error.
if(fabs(c[*nmax+ *nmax *c_dim1])==0.e0)
int freeMemory(void *ptr, size_t memsize)
const size_t tiff_map_min_size
char * askMemory(size_t memsize)
Couldn't read from file.
static MDRowVec emptyHeaderVec()
int writeSPIDER(size_t select_img=ALL_IMAGES, bool isStack=false, int mode=WRITE_OVERWRITE)
#define SET_MAIN_HEADER_VALUE(field, label, aux)
void lock(int fileno=0)
Lock file.
String formatString(const char *format,...)
#define IMG_INDEX(select_img)
size_t gettypesize(DataType type)
Returns memory size of datatype.