code: def buildIVMmask(self ,chip, dqarr, scale):
          
          sci_chip = self._image[self.scienceExt,chip]
          ivmname = self.outputNames['ivmFile']
  
          if ivmname is not None:
              log.info("Applying user supplied IVM files for chip %s" % chip)
              #Parse the input file name to get the extension we are working on
              extn = "IVM,{}".format(chip)
  
              #Open the mask image for updating and the IVM image
              ivm =  fileutil.openImage(ivmname, mode='readonly', memmap=False)
              ivmfile = fileutil.getExtn(ivm, extn)
  
              # Multiply the IVM file by the input mask in place.
              ivmarr = ivmfile.data * dqarr
  
              ivm.close()
  
          else:
              log.info("Automatically creating IVM files for chip %s" % chip)
              # If no IVM files were provided by the user we will
              # need to automatically generate them based upon
              # instrument specific information.
  
              flat = self.getflat(chip)
              RN = self.getReadNoiseImage(chip)
              darkimg = self.getdarkimg(chip)
              skyimg = self.getskyimg(chip)
  
              #exptime = self.getexptimeimg(chip)
              #exptime = sci_chip._exptime
              #ivm = (flat*exptime)**2/(darkimg+(skyimg*flat)+RN**2)
              ivm = (flat)**2/(darkimg+(skyimg*flat)+RN**2)
  
             # Multiply the IVM file by the input mask in place.
              ivmarr = ivm * dqarr
  
          # Update 'wt_scl' parameter to match use of IVM file
          sci_chip._wtscl = pow(sci_chip._exptime,2)/pow(scale,4)
          #sci_chip._wtscl = 1.0/pow(scale,4)
  
          return ivmarr.astype(np.float32)
docs: Builds a weight mask from an input DQ array and either an IVM array
          provided by the user or a self-generated IVM array derived from the
          flat-field reference file associated with the input image.