def gen_enantio_and_correlate(xcc, symbols, masses=None, fconnect=1.3, pp=False): # generate list of masses if masses is None: masses = fncs.symbols2masses(symbols) # xcc1: center and reorient xcc1 = center_and_orient(xcc, None, None, masses)[0] # xcc2: xcc for enantiomer xcc2 = generate_enantio(xcc1) xcc2 = center_and_orient(xcc2, None, None, masses)[0] # correlate enantiomer dcorr = correlate_enantio(xcc1, xcc2, symbols, fconnect=fconnect, pp=pp) # non-assigned? if get_not_assigned(dcorr) != 0: return None # Generate xcc for enantiomer try: xcc_enantio = [0.0 for ii in range(len(xcc))] for node2, node1 in dcorr.items(): xcc_enantio[3 * node1:3 * node1 + 3] = xcc2[3 * node2:3 * node2 + 3] return xcc_enantio except: return None
def correlate(symbols_t,xcc_t,symbols_0,xcc_0,fconnect=1.3): ''' reference geometry: symbols_0,xcc_0 target geometry: symbols_t,xcc_t ''' # prepare reference geometry masses_0 = fncs.symbols2masses(symbols_0) xcc_0 = center_and_orient(xcc_0,None,None,masses_0)[0] # prepare target geometry masses_t = fncs.symbols2masses(symbols_t) xcc_t = center_and_orient(xcc_t,None,None,masses_t)[0] # correlate enantiomer dcorr = correlate_xccs(xcc_t,symbols_t,xcc_0,symbols_0,fconnect=fconnect,pp=False) # non-assigned? if get_num_of_not_assigned(dcorr) != 0: return None # Re-order xcc_t symbols,xcc = reorder_xcc(symbols_t,xcc_t,dcorr) return symbols,xcc
def setup(self, mu=1.0 / AMU, projgrad=False): self._mu = mu # derivated magnitudes (again, in case sth was modified) # for example, when set from gts and masses are added latter self.genderivates() # shift to center of mass and reorientate molecule idata = (self._xcc, self._gcc, self._Fcc, self._masses) self._xcc, self._gcc, self._Fcc = fncs.center_and_orient(*idata) # symmetry self.calc_pgroup(force=False) # Generate mass-scaled arrays self._xms = fncs.cc2ms_x(self._xcc, self._masses, self._mu) self._gms = fncs.cc2ms_g(self._gcc, self._masses, self._mu) self._Fms = fncs.cc2ms_F(self._Fcc, self._masses, self._mu) #-------------# # Atomic case # #-------------# if self._natoms == 1: self._nvdof = 0 self._linear = False #self._xms = list(self._xcc) #self._gms = list(self._gcc) #self._Fms = list(self._Fcc) self._ccfreqs = [] self._ccFevals = [] self._ccFevecs = [] #----------------# # Molecular case # #----------------# else: # Calculate inertia self._itensor = fncs.get_itensor_matrix(self._xcc, self._masses) self._imoms, self._rotTs, self._rtype, self._linear = \ fncs.get_itensor_evals(self._itensor) # Vibrational degrees of freedom if self._linear: self._nvdof = 3 * self._natoms - 5 else: self._nvdof = 3 * self._natoms - 6 # calculate frequencies if self._Fcc is None: return if len(self._Fcc) == 0: return if self._ccfreqs is not None: return v0 = self._gms if projgrad else None data = fncs.calc_ccfreqs(self._Fcc, self._masses, self._xcc, self._mu, v0=v0) self._ccfreqs, self._ccFevals, self._ccFevecs = data # Scale frequencies self._ccfreqs = fncs.scale_freqs(self._ccfreqs, self._fscal)