Exemple #1
0
void EMHeader::generate_common_header(DensityHeader &header) {
  header.Objectpixelsize_ = Objectpixelsize;
  header.update_map_dimensions(nx, ny, nz);
  header.magic = magic;
  header.set_data_type(type);
  for (short i = 0; i < DensityHeader::COMMENT_FIELD_SINGLE_SIZE; i++) {
    header.comments[0][i] = comment[i];
  }

  header.voltage = voltage;
  header.Cs = Cs;
  header.Aperture = Aperture;
  header.Magnification = Magnification;
  header.Postmagnification = Postmagnification;
  header.Exposuretime = Exposuretime;
  header.Microscope = Microscope;
  header.Pixelsize = Pixelsize;
  header.CCDArea = CCDArea;
  header.Defocus = Defocus;
  header.Astigmatism = Astigmatism;
  header.AstigmatismAngle = AstigmatismAngle;
  header.FocusIncrement = FocusIncrement;
  header.CountsPerElectron = CountsPerElectron;
  header.Intensity = Intensity;
  header.EnergySlitwidth = EnergySlitwidth;
  header.EnergyOffset = EnergyOffset;
  header.Tiltangle = Tiltangle;
  header.Tiltaxis = Tiltaxis;
  header.MarkerX = MarkerX;
  MarkerY = header.MarkerY;
  header.lswap = lswap;
}
Exemple #2
0
IMPEM_BEGIN_INTERNAL_NAMESPACE

EMHeader::EMHeader(const DensityHeader &header) {
  nx = header.get_nx();
  ny = header.get_ny();
  nz = header.get_nz();
  magic = header.magic;
  type = header.get_data_type();
  for (short i = 0; i < DensityHeader::COMMENT_FIELD_SINGLE_SIZE; i++) {
    comment[i] = header.comments[0][i];
  }
  voltage = header.voltage;
  Cs = header.Cs;
  Aperture = header.Aperture;
  Magnification = header.Magnification;
  Postmagnification = header.Postmagnification;
  Exposuretime = header.Exposuretime;
  Objectpixelsize = header.get_spacing();
  Microscope = header.Microscope;
  Pixelsize = header.Pixelsize;
  CCDArea = header.CCDArea;
  Defocus = header.Defocus;
  Astigmatism = header.Astigmatism;
  AstigmatismAngle = header.AstigmatismAngle;
  FocusIncrement = header.FocusIncrement;
  CountsPerElectron = header.CountsPerElectron;
  Intensity = header.Intensity;
  EnergySlitwidth = header.EnergySlitwidth;
  EnergyOffset = header.EnergyOffset;
  Tiltangle = header.Tiltangle;
  Tiltaxis = header.Tiltaxis;
  MarkerX = header.MarkerX;
  MarkerY = header.MarkerY;
  lswap = header.lswap;
}
IMPEM_BEGIN_INTERNAL_NAMESPACE

void MRCHeader::FromDensityHeader(const DensityHeader &h)
{
  std::string empty;

  nz=h.get_nz();   ny=h.get_ny();  nx=h.get_nx(); // map size
  // mode
  if(h.get_data_type()==0) // data type not initialized
    mode = 2;
     if(h.get_data_type()==1)
    mode=0; // 8-bits
     else if(h.get_data_type()==2)
    mode=1;// 16-bits
     else if(h.get_data_type()==5)
    mode=2;// 32-bits

  // number of first columns in map (default = 0)
  nxstart=h.nxstart ; nystart=h.nystart ; nzstart=h.nzstart;

  mx=h.mx ; my=h.my ; mz=h.mz; // Number of intervals along each dimension
  xlen=h.xlen ; ylen=h.ylen ; zlen=h.zlen; // Cell dimensions (angstroms)
  alpha=h.alpha ; beta=h.beta ; gamma=h.gamma; // Cell angles (degrees)
  /* Axes corresponding to columns (mapc), rows (mapr) and sections (maps)
     (1,2,3 for x,y,z) */
  mapc=h.mapc;
  mapr=h.mapr;
  maps=h.maps;
  /* Minimum, maximum and mean density value */
  dmin=h.dmin;
  dmax=h.dmax;
  dmean=h.dmean;
  ispg=h.ispg; // Sapce group number 0 or 1 (default 0)
  nsymbt=h.nsymbt; // Number of bytes used for symmetry data (0 or 80)
  // extra space used for anything - 0 by default
  for(int i=0;i<IMP_MRC_USER;i++)
    user[i]=h.user[i];
  strcpy(map,"MAP\0"); // character string 'MAP ' to identify file type
  // Origin used for transforms
  xorigin=h.get_xorigin() ; yorigin=h.get_yorigin() ; zorigin=h.get_zorigin();
  // machine stamp (0x11110000 bigendian, 0x44440000 little)
  machinestamp=h.machinestamp;
  rms=h.rms; // RMS deviation of map from mean density
  nlabl=h.nlabl; // Number of labels being used
  // Copy comments
  for(int i=0;i<nlabl;i++)
    strcpy(labels[i],h.comments[i]);
  // Fill empty coments with null character
  const char *c="\0";
  empty.resize(IMP_MRC_LABEL_SIZE,*c);
  for(int i=nlabl;i<IMP_MRC_NUM_LABELS;i++)
    strcpy(labels[i],empty.c_str());
}
//! Function to transfer the (compatible) information content from DensityHeader
//! to ImageHeader
void  DensityHeader_to_ImageHeader(const DensityHeader& dh,ImageHeader& h) {
  // map size
  h.set_number_of_slices(dh.get_nz());
  h.set_number_of_rows(dh.get_ny());
  h.set_number_of_columns(dh.get_nx());
  // mode
  switch (dh.get_data_type()) {
  case 1:
    h.set_image_type(ImageHeader::VOL_BYTE);
    break;
  case 2:
    h.set_image_type(ImageHeader::VOL_INT);
    break;
  case 5:
    h.set_image_type(ImageHeader::VOL_IMPEM);
    break;
  }
  // Reversed image?
  if(algebra::get_is_big_endian()) {
    h.set_reversed(dh.lswap!=1);
  } else {
    h.set_reversed(dh.lswap==1);
  }
  // Origins and pixel size
  h.set_origin(algebra::Vector3D(dh.get_xorigin(),
                                 dh.get_yorigin(),
                                 dh.get_zorigin()) );
  h.set_object_pixel_size(dh.get_spacing());
  // Statistical values. There is no field in DensityHeader to guarantee that
  // they are computed or correct, so they are ignored
  h.set_fImami(0.);
  h.set_fFmax(0.);
  h.set_fFmin(0.);
  h.set_fAv(0.);
  h.set_fSig(0.);
  // These fields don't have an equivalent in DensityHeader
  h.set_Scale(1.);
  h.set_fAngle1(0.);
  h.set_Weight(1.);
  h.set_Flip(0.);
  h.set_fNrec(0.);
  h.set_fNlabel(0.);
  h.set_fIhist(0.);
  h.set_fLabrec(0.);
  h.set_fIangle(0.);
  h.set_fLabbyt(0.);
  h.set_fLenbyt(0.);
  h.set_fFlag(0.); // Ignore all the Euler angles for the Spider Image
  // Set time and date
  h.set_date();
  h.set_time();
}
IMPEM_BEGIN_NAMESPACE

void MRCReaderWriter::read(const char *fn_in, float **data, DensityHeader &head)
{
  // Read file
  filename.assign(fn_in);
  read(data);
  // Translate header to DensityHeader
  header.ToDensityHeader(head);
  head.Objectpixelsize_ = (float)head.xlen/head.get_nx();
}
void MRCHeader::ToDensityHeader(DensityHeader &h)
{
  std::string empty;
  h.update_map_dimensions(nx,ny,nz);
  h.update_cell_dimensions();
  // mode
  if(mode==0)
    h.set_data_type(1);
  else if(mode==1)
    h.set_data_type(2);
  else if(mode==2)
    h.set_data_type(5);
  // number of first columns in map (default = 0)
  h.nxstart=nxstart ; h.nystart=nystart ; h.nzstart=nzstart;
  h.mx=mx ; h.my=my ; h.mz=mz; // Number of intervals along each dimension
  h.xlen=xlen;h.ylen=ylen;h.zlen=zlen;//Cell dimentions(amgstroms)
  h.alpha=alpha ; h.beta=beta ; h.gamma=gamma; // Cell angles (degrees)
  /* Axes corresponding to columns (mapc), rows (mapr) and sections (maps)
     (1,2,3 for x,y,z) */
  h.mapc=mapc;
  h.mapr=mapr;
  h.maps=maps;
  /* Minimum, maximum and mean density value */
  h.dmin=dmin;
  h.dmax=dmax;
  h.dmean=dmean;
  h.ispg=ispg; // Sapce group number 0 or 1 (default 0)
  h.nsymbt=nsymbt; // Number of bytes used for symmetry data (0 or 80)
  // extra space used for anything - 0 by default
  for(int i=0;i<IMP_MRC_USER;i++)
    h.user[i]=user[i];
  strcpy(h.map,"MAP\0"); // character string 'MAP ' to identify file type
  // Origin used for transforms
  h.set_xorigin(xorigin) ; h.set_yorigin(yorigin) ; h.set_zorigin(zorigin);
  // machine stamp (0x11110000 bigendian, 0x44440000 little)
  h.machinestamp=machinestamp;
  h.rms=rms; // RMS deviation of map from mean density
  h.nlabl=nlabl; // Number of labels being used
  // Copy comments
  for(int i=0;i<h.nlabl;i++) {
    //to make sure there is not memory leak
    std::string temp;
    temp.copy(labels[i],DensityHeader::COMMENT_FIELD_SINGLE_SIZE,0);
    strcpy(h.comments[i],temp.c_str());
  }
  // Fill empty coments with null character
  const char *c="\0";
  empty.resize(IMP_MRC_LABEL_SIZE,*c);
  for(int i=h.nlabl;i<IMP_MRC_NUM_LABELS;i++)
    strcpy(h.comments[i],empty.c_str());
}
DensityHeader create_density_header(const algebra::BoundingBoxD<3> &bb,
                                    float spacing) {
  DensityHeader header;
  algebra::Vector3D origin=bb.get_corner(0);
  algebra::Vector3D top=bb.get_corner(1);
  header.set_xorigin(origin[0]);
  header.set_yorigin(origin[1]);
  header.set_zorigin(origin[2]);
  header.Objectpixelsize_=spacing;
  //calculate the extent of the map
  int extent[3];
  for(int i=0;i<3;i++) {
    extent[i]=ceil((top[i]-origin[i])/spacing);
  }
  header.update_map_dimensions(extent[0],extent[1],extent[2]);
  header.compute_xyz_top(true);
  return header;
}
IMPEM_BEGIN_NAMESPACE

//! Function to transfer the (compatible) information content from ImageHeader
//! to DensityHeader
void ImageHeader_to_DensityHeader(const ImageHeader &h, DensityHeader &dh) {
  std::string empty;
  // map size and voxel size
  dh.update_map_dimensions(static_cast<int>(h.get_number_of_columns()),
                           static_cast<int>(h.get_number_of_rows()),
                           static_cast<int>(h.get_number_of_slices()));
  dh.Objectpixelsize_ = h.get_object_pixel_size();
  // mode
  switch ((int)h.get_fIform()) {
    case ImageHeader::IMG_BYTE:
      dh.set_data_type(1);
      break;
    case ImageHeader::IMG_IMPEM:
      dh.set_data_type(5);
      break;
    case ImageHeader::IMG_INT:
      dh.set_data_type(2);
      break;
    case ImageHeader::VOL_BYTE:
      dh.set_data_type(1);
      break;
    case ImageHeader::VOL_IMPEM:
      dh.set_data_type(5);
      break;
    case ImageHeader::VOL_INT:
      dh.set_data_type(2);
      break;
  }
  // number of first columns in map (default = 0)
  dh.nxstart = 0;
  dh.nystart = 0;
  dh.nzstart = 0;
  // Number of intervals along each dimension. In DensityHeader it is assumed
  // to be equal to the size of the map
  dh.mx = dh.get_nx();
  dh.my = dh.get_ny();
  dh.mz = dh.get_nz();
  // Cell angles (degrees)
  // Spider format does not have these fields. Filed with default (90 deg)
  dh.alpha = 90.;
  dh.beta = 90.;
  dh.gamma = 90.;
  /* Axes corresponding to columns (mapc), rows (mapr) and slices (maps)
     They are given the default values (1,2,3 for x,y,z) */
  dh.mapc = 1;
  dh.mapr = 2;
  dh.maps = 3;
  // Statistical values: Minimum, maximum, mean, standard deviation
  // Only set them if computed
  if ((int)h.get_fImami() == 1) {
    dh.dmin = h.get_fFmin();
    dh.dmax = h.get_fFmax();
    dh.dmean = h.get_fAv();
    dh.rms = h.get_fSig();
  } else {
    dh.dmin = 0;
    dh.dmax = 0;
    dh.dmean = 0;
    dh.rms = 0;
  }
  dh.ispg = 0;    // Sapce group number 0 or 1 (default 0)
  dh.nsymbt = 0;  // Number of bytes used for symmetry data (0 or 80, default 0)
  std::strcpy(dh.map, "MAP\0");  // string 'MAP ' to identify file type
  // Origin used for transforms
  algebra::Vector3D origin = h.get_origin();
  dh.set_xorigin(origin[0]);
  dh.set_yorigin(origin[1]);
  dh.set_zorigin(origin[2]);
  /* CCP4 convention machine stamp: 0x11110000 for big endian, or
    0x44440000 for little endian */
  unsigned char *ch;
  ch = (unsigned char *)&dh.machinestamp;
  if (algebra::get_is_big_endian()) {
    ch[0] = ch[1] = 0x11;
    ch[2] = ch[3] = 0;
  } else {
    ch[0] = ch[1] = 0x44;
    ch[2] = ch[3] = 0;
  }
  // Number of labels being used (default, 0)
  dh.nlabl = 0;
  // Reversed image or not
  if (h.get_reversed() == true) {
    if (algebra::get_is_big_endian()) {
      dh.lswap = 0;
    } else {
      dh.lswap = 1;
    }
  } else {
    if (algebra::get_is_big_endian()) {
      dh.lswap = 1;
    } else {
      dh.lswap = 0;
    }
  }
}