docs: def get_B_factors(self, force = False):
          '''This reads in all ATOM lines and compute the mean and standard deviation of each
             residue's B-factors. It returns a table of the mean and standard deviation per
             residue as well as the mean and standard deviation over all residues with each
             residue having equal weighting.
  
             Whether the atom is occupied or not is not taken into account.'''
  
          # Read in the list of bfactors for each ATOM line.
          if (not self.bfactors) or (force == True):
              bfactors = {}
              old_chain_residue_id = None
              for line in self.lines:
                  if line[0:4] == "ATOM":
                      chain_residue_id = line[21:27]
                      if chain_residue_id != old_chain_residue_id:
                          bfactors[chain_residue_id] = []
                          old_chain_residue_id = chain_residue_id
                      bfactors[chain_residue_id].append(float(line[60:66]))
  
              # Compute the mean and standard deviation for the list of B-factors of each residue
              B_factor_per_residue = {}
              mean_per_residue = []
              for chain_residue_id, bfactor_list in bfactors.iteritems():
                  mean, stddev, variance = get_mean_and_standard_deviation(bfactor_list)
                  B_factor_per_residue[chain_residue_id] = dict(mean = mean, stddev = stddev)
                  mean_per_residue.append(mean)
              total_average, total_standard_deviation, variance = get_mean_and_standard_deviation(mean_per_residue)
  
              self.bfactors =  dict(
                  Overall     =  dict(mean = total_average, stddev = total_standard_deviation),
                  PerResidue  =  B_factor_per_residue,
              )
          return self.bfactors