Exemple #1
0
class Snap_Shot(object):
    """
        Class defining a snap shot of the trajectory
        instance variables: Time_step, Mol_List, Box_Dim, Rg_Dist, E2E_Dist, RDF_Dist
    """
    def __init__(self, Time_Step, Mol_List, Box_Dim, Atom_List, N):
        self.Time_Step = Time_Step
        self.Mol_List = Mol_List
        self.Box_Dim = Box_Dim
        self.num_Mols = len(Mol_List)
        self.Atom_List = Atom_List
        self.DistanceMatrix = DistanceMatrix()
        self.DistanceMatrix.setPeriodicBound(Box_Dim)
        self.numCarbon = 5680.
        boxx, boxy, boxz = Box_Dim
        return
    
    def showDistanceDistribution(self):
        self.DistanceMatrix.showDistanceDistribution()

    def pairCorrelation_Hist(self, numbins=200):
        # print "Calculating Snapshot Distance Matrix"
        for Mol in self.Mol_List:
            self.DistanceMatrix.addPoint(Mol.COM())
        # print "Finished placing atoms...Calculating Distance Distribution"
        self.DistanceMatrix.calculateDistanceDistribution()
        # print "returning pyplot"
        n, bins = self.DistanceMatrix.pyplotDistanceDistribution(numbins = 200)
        print "n is: "
        print n
        print bins
        return n, bins

    def Compute_COM(self):
        """
            Compute the centers of mass of all the polymer chains
            """
        for Mol in self.Mol_List:
            Mass_Weighted_Sum = np.zeros(3,dtype=float)
            for Atom in Mol.Atom_List:
                Atom.unwrapped_position = Atom.position + np.multiply(self.Box_Dim, Atom.image_flags)
                Mass_Weighted_Sum += Polymer.Mass[Atom.Type]*Atom.unwrapped_position
            Mol.COM = Mass_Weighted_Sum/Mol.MW
        return

    def Compute_Tangent_Correlation(self):
        TangentCorrelation = []
        for Mol in self.Mol_List:
            MolTangentCorrelation = []
            RelevantAtoms = [Atom for Atom in Mol.Atom_List.tolist() if ((Atom.Mass > 2.) and (Atom.Mass < 196))]
            # print "mass of second atom is: " + str(Mol.Atom_List[1].Mass)
            initialvector = RelevantAtoms[1].position-RelevantAtoms[0].position
            initialvector /= np.linalg.norm(initialvector)
            lastpos = RelevantAtoms[0].position
            for Atom in RelevantAtoms[1:]:
                # print "adding new pos: " + str(Atom.position)
                newpos = Atom.position
                newvector = newpos-lastpos
                newvector /= np.linalg.norm(newvector)
                # print "tangent correlation is: " + str(self.Tangent_Correlation(latestpos[0],latestpos[1],newpos))
                MolTangentCorrelation.append(np.dot(initialvector,newvector))
                lastpos =newpos
            # print "Mol Tangent Correlation: " + str(np.asarray(MolTangentCorrelation)) + " with mass"
            TangentCorrelation.append(np.asarray(MolTangentCorrelation))
        TangentCorrelation = np.asarray(TangentCorrelation) 
        # print "TangentCorrelation is: " + str(TangentCorrelation)
        TangentCorrelation = np.mean(TangentCorrelation, axis = 0)
        # print "TangentCorrelation is: " + str(TangentCorrelation)
        return TangentCorrelation

    def carbonDensity_Hist(self, numbins = 200):
        Z_pos = []
        Z_max = []
        theta = []
        N = 0
        for Mol in self.Mol_List:
            mol_z = []
            for Atom in Mol.Atom_List:
                if Atom.Mass == 12.011:
                    # print "found Carbon"
                    N += 1
                    Z_pos.append(Atom.position[2])
                    mol_z.append(Atom.position[2])
            try:
                Z_max.append(np.asarray(mol_z).max())
            except:
                continue
        # Z_max_av = np.asarray(Z_max).mean()
        # Z_max_std = np.asarray(Z_max).std()
        n, bins = np.histogram(Z_pos, bins= numbins, range=(0.07,0.3))
        return n/self.numCarbon, bins*100-7.6
        # return Zn, Zbins, Z_max_av, Z_max_std

    def get_net_dipole(self, molclass, molName):
        # partial_charges = OPLS.get_partial_charges(molclass, molName)
        partial_charges = [(0,.32), (0,-.64)]
        print partial_charges
        net_dipole = np.zeros(3)
        # print pc
        # splicing out gold surface
        for mol in self.Mol_List:
            for atom in mol.Atom_List:
                if atom.Element == "Au":
                    continue
                else:
                    partial_charge = partial_charges[atom.Type-1][1]
                    # print atom.position
                    # print partial_charge
                    dipole_moment = partial_charge*atom.position
                    # print dipole_moment
                    net_dipole = net_dipole+dipole_moment
                    mol.dipoleMoment = mol.dipoleMoment+dipole_moment
        print "Net dipole is: ..." + str(net_dipole)
        # return net_dipole
        # for mol in self.Mol_List[:-1]:
        #     if (np.dot(mol.dipoleMoment,net_dipole)/(np.linalg.norm(mol.dipoleMoment)*np.linalg.norm(net_dipole)) < -.9):
        #         print "alert!"
        #         print mol.dipoleMoment
        #         for atom in mol.Atom_List:
        #             print atom.Element, str(atom.position)
        #         # print net_dipole
        #         break
        plt.hist([np.dot(mol.dipoleMoment,net_dipole)/(np.linalg.norm(mol.dipoleMoment)*np.linalg.norm(net_dipole)) for mol in self.Mol_List[:-1]], bins=100)
        print os.getcwd()
        plt.savefig(molclass+"_"+molName+"_dipoleDistribution.png")
        print "saved!"
        plt.clf()
        return net_dipole