def IsotropicFitSegmentOutlierRejection(chain, frag_id1, frag_id2): segment = chain[frag_id1:frag_id2] atoms = list(segment.iter_all_atoms()) orig_num_atoms = len(atoms) rejected = 0 while True: tls_analyzer = tlsmdmodule.TLSModelAnalyzer() xlist = atom_selection.chain_to_xmlrpc_list(iter(atoms)) tls_analyzer.set_xmlrpc_chain(xlist) tlsdict = tls_analyzer.isotropic_fit_segment(frag_id1, frag_id2) IT, IL, IS, IOrigin = tls_calcs.isotlsdict2tensors(tlsdict) num_atoms = 0 msd_sum = 0.0 atm_deltab = [] for atm, uiso in TLS.iter_itls_uiso(iter(atoms), IT, IL, IS, IOrigin): num_atoms += 1 deltab = atm.temp_factor - (Constants.U2B * uiso) msd_sum += deltab**2 atm_deltab.append((deltab, atm)) sigma = math.sqrt((msd_sum / num_atoms)) sigma2 = 2.0 * sigma outliers = 0 for deltab, atm in atm_deltab: if abs(deltab) > sigma2: atoms.remove(atm) outliers += 1 rejected += outliers if outliers == 0 or (num_atoms - outliers) < 10: console.stdoutln("SEGMENT %s-%s %d->%d" % (frag_id1, frag_id2, orig_num_atoms, orig_num_atoms - rejected)) return IT, IL, IS, IOrigin
def fit_tls_parameters(self, chain): """Use the non-linear TLS model to calculate tensor values. """ tls_group = self.tls_group ## anisotropic model tlsdict = chain.tls_analyzer.constrained_anisotropic_fit(self.segment_ranges) T, L, S, origin = tls_calcs.tlsdict2tensors(tlsdict) tls_group.T = T tls_group.L = L tls_group.S = S tls_group.origin = origin ## isotropic model itlsdict = chain.tls_analyzer.constrained_isotropic_fit(self.segment_ranges) IT, IL, IS, IOrigin = tls_calcs.isotlsdict2tensors(itlsdict) tls_group.itls_T = IT tls_group.itls_L = IL tls_group.itls_S = IS assert numpy.allclose(tls_group.origin, IOrigin)
def IsotropicFitSegmentOutlierRejection(chain, frag_id1, frag_id2): segment = chain[frag_id1:frag_id2] atoms = list(segment.iter_all_atoms()) orig_num_atoms = len(atoms) rejected = 0 while True: tls_analyzer = tlsmdmodule.TLSModelAnalyzer() xlist = atom_selection.chain_to_xmlrpc_list(iter(atoms)) tls_analyzer.set_xmlrpc_chain(xlist) tlsdict = tls_analyzer.isotropic_fit_segment(frag_id1, frag_id2) IT, IL, IS, IOrigin = tls_calcs.isotlsdict2tensors(tlsdict) num_atoms = 0 msd_sum = 0.0 atm_deltab = [] for atm, uiso in TLS.iter_itls_uiso(iter(atoms), IT, IL, IS, IOrigin): num_atoms += 1; deltab = atm.temp_factor - (Constants.U2B * uiso) msd_sum += deltab**2 atm_deltab.append((deltab, atm)) sigma = math.sqrt((msd_sum / num_atoms)) sigma2 = 2.0 * sigma outliers = 0 for deltab, atm in atm_deltab: if abs(deltab) > sigma2: atoms.remove(atm) outliers += 1 rejected += outliers if outliers == 0 or (num_atoms - outliers) < 10: console.stdoutln("SEGMENT %s-%s %d->%d" % ( frag_id1, frag_id2, orig_num_atoms, orig_num_atoms - rejected)) return IT, IL, IS, IOrigin