58 #define RCTIC(label) (EERtimer.tic(label)) 59 #define RCTOC(label) (EERtimer.toc(label)) 62 int TIMING_READ_EER = EERtimer.setNew(
"read EER");
63 int TIMING_BUILD_INDEX = EERtimer.setNew(
"build index");
64 int TIMING_UNPACK_RLE = EERtimer.setNew(
"unpack RLE");
65 int TIMING_RENDER_ELECTRONS = EERtimer.setNew(
"render electrons");
81 std::vector<long long> frame_starts, frame_sizes;
84 static const char EER_FOOTER_OK[];
85 static const char EER_FOOTER_ERR[];
86 static const int EER_IMAGE_WIDTH, EER_IMAGE_HEIGHT, EER_IMAGE_PIXELS;
87 static const unsigned int EER_LEN_FOOTER;
88 static const uint16_t TIFF_COMPRESSION_EER8bit, TIFF_COMPRESSION_EER7bit;
92 int preread_start, preread_end;
95 void readLegacy(FILE *fh)
98 RCTIC(TIMING_READ_EER);
99 buf = (
unsigned char*)malloc(file_size);
102 if (fread(buf,
sizeof(
char), file_size, fh) != file_size)
104 RCTOC(TIMING_READ_EER);
107 RCTIC(TIMING_BUILD_INDEX);
108 long long pos = file_size;
111 pos -= EER_LEN_FOOTER;
112 if (strncmp(EER_FOOTER_OK, (
char*)buf + pos, EER_LEN_FOOTER) == 0)
115 long long frame_size = *(
long long*)(buf + pos) *
sizeof(
long long);
117 frame_starts.push_back(pos);
118 frame_sizes.push_back(frame_size);
120 printf(
"Frame: LAST-%5d Start at: %08d Frame size: %lld\n", frame_starts.size(), pos, frame_size);
128 std::reverse(frame_starts.begin(), frame_starts.end());
129 std::reverse(frame_sizes.begin(), frame_sizes.end());
130 RCTOC(TIMING_BUILD_INDEX);
132 nframes = frame_starts.size();
136 void lazyReadFrames()
138 #pragma omp critical(EERRenderer_lazyReadFrames) 142 TIFF *ftiff = TIFFOpen(fn_movie.c_str(),
"r");
144 frame_starts.resize(nframes, 0);
145 frame_sizes.resize(nframes, 0);
146 buf = (
unsigned char*)malloc(file_size);
152 for (
int frame = 0; frame < nframes; frame++)
154 if ((preread_start > 0 && frame < preread_start) ||
155 (preread_end > 0 && frame > preread_end))
158 TIFFSetDirectory(ftiff, frame);
159 const int nstrips = TIFFNumberOfStrips(ftiff);
160 frame_starts[frame] = pos;
162 for (
int strip = 0; strip < nstrips; strip++)
164 const int strip_size = TIFFRawStripSize(ftiff, strip);
165 if (pos + strip_size >= file_size)
168 TIFFReadRawStrip(ftiff, strip, buf + pos, strip_size);
170 frame_sizes[frame] += strip_size;
173 printf(
"EER in TIFF: Read frame %d from %s, nstrips = %d, current pos in buffer = %lld / %lld\n", frame, fn_movie.c_str(), nstrips, pos, file_size);
184 template <
typename T>
185 void render16K(
MultidimArray<T> &image, std::vector<unsigned int> &positions, std::vector<unsigned char> &symbols,
int n_electrons)
187 for (
int i = 0;
i < n_electrons;
i++)
189 int x = ((positions[
i] & 4095) << 2) | (symbols[
i] & 3);
190 int y = ((positions[
i] >> 12) << 2) | ((symbols[
i] & 12) >> 2);
195 template <
typename T>
196 void render8K(
MultidimArray<T> &image, std::vector<unsigned int> &positions, std::vector<unsigned char> &symbols,
int n_electrons)
198 for (
int i = 0;
i < n_electrons;
i++)
200 int x = ((positions[
i] & 4095) << 1) | ((symbols[
i] & 2) >> 1);
201 int y = ((positions[
i] >> 12) << 1) | ((symbols[
i] & 8) >> 3);
206 template <
typename T>
207 void render4K(
MultidimArray<T> &image, std::vector<unsigned int> &positions, std::vector<unsigned char> &symbols,
int n_electrons)
209 for (
int i = 0;
i < n_electrons;
i++)
211 int x = positions[
i] & 4095;
212 int y = positions[
i] >> 12;
217 static TIFFErrorHandler prevTIFFWarningHandler;
252 if (strcmp(
"Unknown field with tag %d (0x%x) encountered", fmt) == 0)
255 if (prevTIFFWarningHandler != NULL)
256 prevTIFFWarningHandler(module, fmt, ap);
261 if (prevTIFFWarningHandler == NULL)
270 prevTIFFWarningHandler = prev;
282 preread_start = start - 1;
283 preread_end = end - 1;
291 if (eer_upsampling == 1 || eer_upsampling == 2 || eer_upsampling == 3)
292 this->eer_upsampling = eer_upsampling;
295 std::cerr <<
"EERRenderer::read: eer_upsampling = " << eer_upsampling << std::endl;
299 fn_movie = _fn_movie;
302 FILE *fh = fopen(fn_movie.c_str(),
"r");
306 fseek(fh, 0, SEEK_END);
307 file_size = ftell(fh);
308 fseek(fh, 0, SEEK_SET);
313 TIFF *ftiff = TIFFOpen(fn_movie.c_str(),
"r");
327 uint16_t compression = 0;
328 TIFFGetField(ftiff, TIFFTAG_IMAGEWIDTH, &width);
329 TIFFGetField(ftiff, TIFFTAG_IMAGELENGTH, &height);
330 TIFFGetField(ftiff, TIFFTAG_COMPRESSION, &compression);
333 printf(
"EER in TIFF: %s size = %ld, width = %d, height = %d, compression = %d\n", fn_movie.c_str(), file_size, width, height, compression);
338 if (compression == EERRenderer::TIFF_COMPRESSION_EER8bit)
340 else if (compression == EERRenderer::TIFF_COMPRESSION_EER7bit)
345 if (width != EER_IMAGE_WIDTH || height != EER_IMAGE_HEIGHT)
349 nframes = TIFFNumberOfDirectories(ftiff);
352 printf(
"EER in TIFF: %s nframes = %d\n", fn_movie.c_str(), nframes);
373 return EER_IMAGE_WIDTH << (eer_upsampling - 1);
381 return EER_IMAGE_HEIGHT << (eer_upsampling - 1);
388 template <
typename T>
396 if (frame_start < 0 || frame_start >=
getNFrames() ||
397 frame_end < frame_start || frame_end >=
getNFrames())
399 std::cerr <<
"EERRenderer::renderFrames(frame_start = " << frame_start <<
", frame_end = " << frame_end <<
"), NFrames = " <<
getNFrames() << std::endl;
403 long long total_n_electron = 0;
405 std::vector<unsigned int> positions;
406 std::vector<unsigned char> symbols;
409 for (
int iframe = frame_start; iframe <= frame_end; iframe++)
411 RCTIC(TIMING_UNPACK_RLE);
412 if ((preread_start > 0 && iframe < preread_start) ||
413 (preread_end > 0 && iframe > preread_end))
415 std::cerr <<
"EERRenderer::renderFrames(frame_start = " << frame_start + 1 <<
", frame_end = " << frame_end + 1<<
"), NFrames = " <<
getNFrames() <<
" preread_start = " << preread_start + 1 <<
" prered_end = " << preread_end + 1<< std::endl;
419 long long pos = frame_starts[iframe];
420 unsigned int n_pix = 0, n_electron = 0;
421 const int max_electrons = frame_sizes[iframe] * 2;
422 if (positions.size() < max_electrons)
424 positions.resize(max_electrons);
425 symbols.resize(max_electrons);
430 unsigned int bit_pos = 0;
440 long long first_byte = pos + (bit_pos >> 3);
441 const unsigned int bit_offset_in_first_byte = bit_pos & 7;
442 const unsigned int chunk = (*(
unsigned int*)(buf + first_byte)) >> bit_offset_in_first_byte;
444 p = (
unsigned char)(chunk & 127);
447 if (n_pix >= EER_IMAGE_PIXELS)
break;
448 if (p == 127)
continue;
450 s = (
unsigned char)((chunk >> 7) & 15) ^ 0x0A;
452 positions[n_electron] = n_pix;
453 symbols[n_electron] = s;
457 p = (
unsigned char)((chunk >> 11) & 127);
460 if (n_pix >= EER_IMAGE_PIXELS)
break;
461 if (p == 127)
continue;
463 s = (
unsigned char)((chunk >> 18) & 15) ^ 0x0A;
465 positions[n_electron] = n_pix;
466 symbols[n_electron] = s;
476 unsigned char p1, p2, s1, s2;
478 const long long pos_limit = frame_starts[iframe] + frame_sizes[iframe];
480 while (pos < pos_limit)
484 s1 = (buf[pos + 1] & 0x0F) ^ 0x0A;
486 p2 = (buf[pos + 1] >> 4) | (buf[pos + 2] << 4);
487 s2 = (buf[pos + 2] >> 4) ^ 0x0A;
491 if (n_pix >= EER_IMAGE_PIXELS)
break;
494 positions[n_electron] = n_pix;
495 symbols[n_electron] = s1;
501 if (n_pix >= EER_IMAGE_PIXELS)
break;
504 positions[n_electron] = n_pix;
505 symbols[n_electron] = s2;
509 #ifdef DEBUG_EER_DETAIL 510 printf(
"%d: %u %u, %u %u %d\n", pos, p1, s1, p2, s2, n_pix);
516 if (n_pix != EER_IMAGE_PIXELS)
518 std::cerr <<
"WARNING: The number of pixels is not right in " + fn_movie +
" frame " +
integerToString(iframe + 1) +
". Probably this frame is corrupted. This frame is skipped." << std::endl;
522 RCTOC(TIMING_UNPACK_RLE);
524 RCTIC(TIMING_RENDER_ELECTRONS);
525 if (eer_upsampling == 3)
526 render16K(image, positions, symbols, n_electron);
527 else if (eer_upsampling == 2)
528 render8K(image, positions, symbols, n_electron);
529 else if (eer_upsampling == 1)
530 render4K(image, positions, symbols, n_electron);
533 RCTOC(TIMING_RENDER_ELECTRONS);
535 total_n_electron += n_electron;
537 printf(
"Decoded %lld electrons / %d pixels from frame %5d.\n", n_electron, n_pix, iframe);
541 printf(
"Decoded %lld electrons in total.\n", total_n_electron);
545 EERtimer.printTimes(
false);
548 return total_n_electron;
554 return (ext ==
"eer" || ext ==
"ecc");
558 const char EERRenderer::EER_FOOTER_OK[] =
"ThermoFisherECComprOK000";
559 const char EERRenderer::EER_FOOTER_ERR[] =
"ThermoFisherECComprERR00";
560 const int EERRenderer::EER_IMAGE_WIDTH = 4096;
561 const int EERRenderer::EER_IMAGE_HEIGHT = 4096;
562 const int EERRenderer::EER_IMAGE_PIXELS = EERRenderer::EER_IMAGE_WIDTH * EERRenderer::EER_IMAGE_HEIGHT;
563 const unsigned int EERRenderer::EER_LEN_FOOTER = 24;
564 const uint16_t EERRenderer::TIFF_COMPRESSION_EER8bit = 65000;
565 const uint16_t EERRenderer::TIFF_COMPRESSION_EER7bit = 65001;
567 TIFFErrorHandler EERRenderer::prevTIFFWarningHandler = NULL;
573 size_t found = filename.find_first_of(
"#");
574 FileName infolist = filename.substr(found + 1);
575 filename = filename.substr(0, found);
581 ". Not enough header arguments.");
583 const int fractioning = std::atoi(info[0].c_str());
588 if (select_img > fractioning) {
592 int _xDim,_yDim,_zDim;
596 _xDim = _yDim = 4096;
598 else if (info[1] ==
"8K")
600 _xDim = _yDim = 8192;
607 setDimensions(_xDim, _yDim, _zDim, _nDim);
608 mdaBase->coreAllocateReuse();
610 if(info[2] ==
"uint8")
612 else if (info[2] ==
"uint16")
624 if( dataMode <
DATA )
628 renderer.
read(hFile->fileName, upsampling);
631 const auto step = renderer.
getNFrames() / fractioning;
632 const auto first = (select_img-1)*step;
633 const auto last =
first + step - 1;
static bool isEER(const FileName &fn_movie)
Case or algorithm not implemented yet.
static void silenceTIFFWarnings()
long long renderFrames(int frame_start, int frame_end, MultidimArray< T > &image)
#define REPORT_ERROR(nerr, ErrormMsg)
EERRenderer(const EERRenderer &)
void setFramesOfInterest(int start, int end)
There is not enough memory for allocation.
#define DIRECT_A2D_ELEM(v, i, j)
#define MULTIDIM_ARRAY(v)
String integerToString(int I, int _width, char fill_with)
std::vector< String > StringVector
String getExtension() const
int splitString(const String &input, const String &delimiter, StringVector &results, bool includeEmpties)
static void TIFFWarningHandler(const char *module, const char *fmt, va_list ap)
EERRenderer & operator=(const EERRenderer &)
void read(const FileName &_fn_movie, int eer_upsampling)
int readEER(size_t select_img)
static MDRowVec emptyHeaderVec()
FileName toLowercase() const
std::string to_string(bond_type bondType)
void initZeros(const MultidimArray< T1 > &op)
Some logical error in the pipeline.