class_docstr: Class for basic Ecat PET header
  
  Sub-parts of standard Ecat File
  
  * main header
  * matrix list
    which lists the information for each frame collected (can have 1 to many
    frames)
  * subheaders specific to each frame with possibly-variable sized data
    blocks
  
  This just reads the main Ecat Header, it does not load the data or read the
  mlist or any sub headers
class_docstr_tok: ["Class","for","basic","Ecat","PET","header","Sub-parts","of","standard","Ecat","File","*","main","header","*","matrix","list","which","lists","the","information","for","each","frame","collected","(","can","have","1","to","many","frames",")","*","subheaders","specific","to","each","frame","with","possibly-variable","sized","data","blocks","This","just","reads","the","main","Ecat","Header",",","it","does","not","load","the","data","or","read","the","mlist","or","any","sub","headers"]
docstr: Return header data for empty header with given endianness
docstr_tok: ["Return","header","data","for","empty","header","with","given","endianness"]
code: def default_structarr(klass, endianness=None):
      """Return header data for empty header with given endianness"""
      hdr_data = super().default_structarr(endianness)
      hdr_data["magic_number"] = "MATRIX72"
      hdr_data["sw_version"] = 74
      hdr_data["num_frames"] = 0
      hdr_data["file_type"] = 0  # Unknown
      hdr_data["ecat_calibration_factor"] = 1.0  # scale factor
      return hdr_data
  
imports: import warnings
  from numbers import Integral
  import numpy
  from .arraywriters import make_array_writer
  from .fileslice import canonical_slicers, predict_shape, slice2outax
  from .spatialimages import SpatialHeader, SpatialImage
  from .volumeutils import array_from_file, make_dt_codes, native_code, swapped_code
  from .wrapstruct import WrapStruct
label_desc: Use image node_id 3 for calling the EcatHeader obj's underlying member method code with example usage: obj.default_structarr(klass, endianness) and returns: hdr_data