본문 바로가기
Project/Molecular dynamics and Biology

8. 부록(2)[The elasticity of alpha-helix, pi-helix]

by sonpang 2021. 11. 8.
반응형

MATLAB

[그림 1] 좌표성분 분리
[그림 2] readdcd를 통해 산출한 frame에 따른 좌표(여기서 세로는 frame이고 가로는 각각 Alphacarbon의 x,y,z좌표이다. 세로:50000,가로:90(30*3)-30은 생성시킨 alanin수와 동일하다. )
[그림 3] Execl파일을 이용한 그래프(상단의 그래프 3개는 각각 1번째 Alphacarbon의 xyz좌표이다 하단의 그래프 3개는 1번째가 아닌 임의의 Alphacarbon의 xyz좌표이다-이 그래프를 통해 각 좌표 변동의 유사성을 관찰할 수 있었다.)

 

 

Code

xyz = readdcd('C.dcd' , 1: 303); 
 dcd 파일에서 프레임 번호마다 첫 번째 원자부터 마지막 303번째 원자까지의 x좌표, y좌표, z좌표를 xyz에 저장한다.
atomlist = 5:10:305;
xyz2 = readdcd('C.dcd,',atomlist);
 dcd 파일에서 프레임 번호마다 첫번째 alpha-Carbon 부터 마지막 alpha Carbon까지의 x좌표, y좌표, z좌표를 xyz2에 저장한다.
alanin_x = xyz2(:, 1:3:end);
alanin_y = xyz2(:, 2:3:end);
alanin_z = xyz2(:, 3:3:end);
 xyz2에서 alpha Carbon 들의 x좌표, y좌표, z좌표를 각각 alanin_x, alanin_y, alanin_x에 저장한다.

%a=1;
%while a<=30
%    while b<=3
%        centerX=centerX+alanin_x(a,b);
%        centerY=centerY+alanin_x(a,b);
%        centerZ=centerZ+alanin_x(a,b);
%    end
%    centerX=centerX/3;
%    centerY=centerX/3;
%    centerZ=centerX/3;
%    a=a+1;
%end
 각 슬라이스의 무게중심의 x 좌표, y좌표, z좌표를 각각 centerX, centerY, centerZ에 저장할려고 했으나 프레임 번호를 고려하지 않아 오류가 생겨 밑에 새로 썼다.
frame=5000;
slice=7;
 
centerX=zeros(frame,slice);
centerY=zeros(frame,slice);
centerZ=zeros(frame,slice);
 
a=1;
b=1;
 
center=zeros(frame,slice,3);
 
while a<=frame
    while b<=slice
        %if rem(b,4)~=0
        centerX(a,b)=alanin_x(a,b*4-3)+alanin_x(a,b*4-2)+alanin_x(a,b*4-1);
        centerY(a,b)=alanin_y(a,b*4-3)+alanin_y(a,b*4-2)+alanin_y(a,b*4-1);
        centerZ(a,b)=alanin_z(a,b*4-3)+alanin_z(a,b*4-2)+alanin_z(a,b*4-1);
        %end
        centerX(a,b)=centerX(a,b)/3;
        centerY(a,b)=centerY(a,b)/3;
        centerZ(a,b)=centerZ(a,b)/3;
프레임 5000까지 각 프레임에 대한 각 슬라이스의 각 꼭지점의 x좌표,y좌표,z좌표 값의 합을 구한다.
        center(a,b,:)=[centerX(a,b),centerY(a,b),centerZ(a,b)];    
각 슬라이스의 X, Y, Z좌표 각각의 합을 각각 3으로 나누어 X, Y, Z좌표의 질량 중심을 구한 뒤 하나의 이차원 행렬에 저장한다.
        b=b+1;
    end
    a=a+1;
    b=1;
end

 
a=1;
b=1;
 
centerVecterX=zeros(frame,slice-1);
centerVecterY=zeros(frame,slice-1);
centerVecterZ=zeros(frame,slice-1);
 
centerDistance=zeros(frame,slice-1);
centerVectorTotal=zeros(frame,slice-1,3);

while a<=frame
    while b<=slice-1
        centerVectorX(a,b)=centerX(a,b+1)-centerX(a,b);
        centerVectorY(a,b)=centerY(a,b+1)-centerY(a,b);
        centerVectorZ(a,b)=centerZ(a,b+1)-centerZ(a,b);
        centerVectorTotal(a,b,:)=[centerVectorX(a,b),centerVectorY(a,b),centerVectorZ(a,b)];
        centerDistance(a,b)=norm(centerVectorTotal(a,b));
        b=b+1;
    end
 각각의 X, Y, Z 좌표의 센터에서 그 이전의 X, Y, Z좌표의 센터를 빼어 각각의 센터 벡터를 구한다. 그 다음 각각의 센터벡터를 하나의 이차원 행렬에 저장한 뒤 norm 시켜 각각의 X, Y, Z좌표의 센터벡터를 단위가 1인 벡터로 변환한다.
   b=1;
    a=a+1;
end
deltaS=zeros(frame,1);
distanceSum=0;
 
for m=1:frame
    for n=1:(slice-2)
        distanceSum=distanceSum+centerDistance(m,n);
    end
    deltaS(m,1)=distanceSum/(slice-1);
    distanceSum=0;
end
 
%deltaS=mean(deltaS);

sliceVector=zeros(frame,slice-1,3);
e3=zeros(frame,slice-1,3);
 
for m=1:frame
    for n=1:(slice-1)
        sliceVector(m,n,:)=center(m,n+1,:)-center(m,n,:);
        %e3(m,n,:)=sliceVector(m,n,:)/norm(sliceVector(m,n,:));
        e3(m,n,:)=sliceVector(m,n,:)/norm(sliceVector(m,n));
    end
end

ePrimeX=zeros(frame,slice);
ePrimeY=zeros(frame,slice);
ePrimeZ=zeros(frame,slice);
ePrimeVectorX=zeros(frame,slice);
ePrimeVectorY=zeros(frame,slice);
ePrimeVectorZ=zeros(frame,slice);
ePrime=zeros(frame,slice,3);
ePrimeVectorTotal=zeros(frame,slice,3);

for m=1:frame
    for n=1:slice
        a=4*n-3;
        ePrimeX(m,n)=(alanin_x(m,a)-alanin_x(m,a+2))/2;
        ePrimeY(m,n)=(alanin_y(m,a)-alanin_y(m,a+2))/2;
        ePrimeZ(m,n)=(alanin_z(m,a)-alanin_z(m,a+2))/2;
        ePrimeVectorX(m,n)=ePrimeX(m,n)-centerX(m,n,1);
        ePrimeVectorY(m,n)=ePrimeY(m,n)-centerY(m,n,1);
        ePrimeVectorZ(m,n)=ePrimeZ(m,n)-centerZ(m,n,1);
        ePrime(m,n,:)=[ePrimeX(m,n),ePrimeY(m,n),ePrimeZ(m,n)];
        ePrimeVectorTotal(m,n,:)=[ePrimeVectorX(m,n),ePrimeVectorY(m,n),ePrimeVectorZ(m,n)];
    end
end

프레임에 다하여 각 슬라이스의 꼭지점을 이루는 알파카본 중 1번과 3번의 중심을 구한다.

%ePrimeTotalX=zeros(frame,slice);
%ePrimeTotalY=zeros(frame,slice);
%ePrimeTotalZ=zeros(frame,slice);
%a=1;
%b=1;
%while a<=frame
%    while b<=slice        
%    end
%end

e1Vector=zeros(frame,slice-1,3);
e2Vector=zeros(frame,slice-1,3);
e3Vector=zeros(frame,slice-1,3);
e1VectorCross=zeros(frame,slice-1,3);
e2VectorCross=zeros(frame,slice-1,3);
e1Vector0=zeros(frame,slice-1,3);
e2Vector0=zeros(frame,slice-1,3);
e3Vector0=zeros(frame,slice-1,3);
 
for m=1:frame
    for n=1:(slice-1)
        %CenterVectorTotal
        %ePrimeVectorTotal
        %e2VectorCross(m,n,:)=cross(centerVectorTotal(m,n,:), ePrimeVectorTotal(m,n,:));
        %e1VectorCross(m,n,:)=cross(e2VectorCross(m,n,:),centerVectorTotal(m,n,:));
        %{
        e2VectorCross(m,n)=cross(centerVectorTotal(m,n), ePrimeVectorTotal(m,n));
        e1VectorCross(m,n)=cross(e2VectorCross(m,n),centerVectorTotal(m,n));
        e2Vector0(m,n)=e2VectorCross(m,n)/norm(e2VectorCross(m,n));
        e1Vector0(m,n)=e1VectorCross(m,n)/norm(e1VectorCross(m,n));
        e3Vector0(m,n)=centerVectorTotal(m,n)/norm(centerVectorTotal(m,n))
        e1Vector(m,n,1)=e1Vector0(m,n,1);
        e1Vector(m,n,2)=e1Vector0(m,n,2);
        e1Vector(m,n,3)=e1Vector0(m,n,3);
        e2Vector(m,n,1)=e2Vector0(m,n,1);
        e2Vector(m,n,2)=e2Vector0(m,n,2);
        e2Vector(m,n,3)=e2Vector0(m,n,3);
        e3Vector(m,n,1)=e3Vector0(m,n,1);
        e3Vector(m,n,2)=e3Vector0(m,n,2);
        e3Vector(m,n,3)=e3Vector0(m,n,3);
        %}
      앞에서 구한 e1VectorCross, e2VectorCross,e3VectorCross를 단위 벡터 처리 해준다.
        
        centerVectorTotal0=[centerVectorX(m,n),centerVectorY(m,n),centerVectorZ(m,n)];
        ePrimeVectorTotal0=[ePrimeVectorX(m,n),ePrimeVectorY(m,n),ePrimeVectorZ(m,n)];
        e2VectorCrossAns=cross(centerVectorTotal0, ePrimeVectorTotal0);
        e1VectorCrossAns=cross(e2VectorCrossAns, centerVectorTotal0);
        %크기가 1인 벡터로 조정
        e1VectorNorm=e1VectorCrossAns/norm(e1VectorCrossAns);
        e2VectorNorm=e2VectorCrossAns/norm(e2VectorCrossAns);
        e3VectorNorm=centerVectorTotal0/norm(centerVectorTotal0);
앞에서 구한 CenterVectorTotal, e1VectorCrossAns, e2VectorCrossAns를 크기가 1인 단위벡터로 처리한다.
        e1Vector(m,n,1)=e1VectorNorm(1);
        e1Vector(m,n,2)=e1VectorNorm(2);
        e1Vector(m,n,3)=e1VectorNorm(3);
        e2Vector(m,n,1)=e2VectorNorm(1);
        e2Vector(m,n,2)=e2VectorNorm(2);
        e2Vector(m,n,3)=e2VectorNorm(3);
        e3Vector(m,n,1)=e3VectorNorm(1);
        e3Vector(m,n,2)=e3VectorNorm(2);
        e3Vector(m,n,3)=e3VectorNorm(3);  
        
    end
end
    단위 벡터 처리한 벡터에서 x,y,z의 값을 추출하여 따로 저장한다 
 
U=zeros(frame,slice-2,3,3);
 
for m=1:frame
    for n=1:(slice-2)
        %c=1
        %for c<=3
        %    d=1
        %    for d<=3
        %        U(a,b,c,d)=dot(ecVector(a,b+1,:),edVector(a,b,:));
        %    end
        %end
        %변수이름에 변수사용 저장법 O 변수를 불러올때 변수 사용?
        U(m,n,1,1)=dot(e1Vector(m,n+1,:),e1Vector(m,n,:));
        U(m,n,2,1)=dot(e2Vector(m,n+1,:),e1Vector(m,n,:));
        U(m,n,3,1)=dot(e3Vector(m,n+1,:),e1Vector(m,n,:));
        U(m,n,1,2)=dot(e1Vector(m,n+1,:),e2Vector(m,n,:));
        U(m,n,2,2)=dot(e2Vector(m,n+1,:),e2Vector(m,n,:));
        U(m,n,3,2)=dot(e3Vector(m,n+1,:),e2Vector(m,n,:));
        U(m,n,1,3)=dot(e1Vector(m,n+1,:),e3Vector(m,n,:));
        U(m,n,2,3)=dot(e2Vector(m,n+1,:),e3Vector(m,n,:));
        U(m,n,3,3)=dot(e3Vector(m,n+1,:),e3Vector(m,n,:));
    end
end
 e1, e2, e3 벡터 세가지 중 (한개 벡터 중복 내적도 계산) 벡터를  2개씩 묶어서 선택한 2개의 벡터끼리 각각 내적하여 U값을 구한다. 
%UfrmaeOne=zeros(1,,,)
UframeOne=U(1,:,:,:);
 
smallU=zeros(3,3);
smallOmega=zeros(frame,slice-2,3,3);
 
 
for m=1:frame
    for n=1:(slice-2)
        smallU(:,:)=U(m,n,:,:);
        %smallOmega(m,n,:,:)=(-logm(abs(smallU))/deltaS(m,1));
        %In logm (line 50)
        %In son (line 198) 
        smallOmega(m,n,:,:)=(-logm(smallU))/deltaS(m,1);
        %smallOmega(m,n,:,:)=smallU;
    end
end
 이때 U=e^오메가*델타S라는 식에 따라 각 프레임에 대한 오메가 값을 구하기 위하여 앞에서 구한 U를 로그 처리한 후 델타S로 나누어준다.
omega1=zeros(frame,slice-2);
omega2=zeros(frame,slice-2);
omega3=zeros(frame,slice-2);
 
for m=1:frame
    for n=1:(slice-2)
        omega1(m,n)=smallOmega(m,n,2,3);
        omega2(m,n)=smallOmega(m,n,3,1);
        omega3(m,n)=smallOmega(m,n,1,2);
    end
end
 우리에게 필요한 값인 (2,3), (3,1),(1,2)번째 오메가 값을 추출한다.
%subplot(2,2,1)
%histogram(omega1)
%subplot(2,2,2)
%histogram(omega2)
%subplot(2,2,3)
%histogram(omega3)
 
%plot3(center(:,:,1))
%plot3(center(:,:,2))
%plot3(center(:,:,3))
 
% 
%   for x = 1:10
%       disp(x)
%   end
 
subplot(4,3,1)
histogram(omega1(:,1))
subplot(4,3,2)
histogram(omega2(:,1))
subplot(4,3,3)
histogram(omega3(:,1))
 
%정규화작업과 alpha값 구하기
막대의 X간격을 설정한다. 이때 미리 히스토그램으로 본 omega의 수치들을 확인 한 후 정한다.(omega1, omega2의 경우 0의 중심으로) 좌우대칭이 된다. omega3의 경우 helix가 나선구조이므로 0이 아닌 -값을 중심으로 좌우대칭이 된다.
omega1DeltaLeft=-1.00;
omega1DeltaRight=1.00;
omega2DeltaLeft=-1.00;
omega2DeltaRight=1.00;
omega3DeltaLeft=-1.50;
omega3DeltaRight=0.50;
deltaX1Size=(omega1DeltaRight-omega1DeltaLeft)/2000;
deltaX2Size=(omega2DeltaRight-omega2DeltaLeft)/2000;
deltaX3Size=(omega3DeltaRight-omega3DeltaLeft)/2000;
 
count1=zeros(slice-2,2000);
count2=zeros(slice-2,2000);
count3=zeros(slice-2,2000);
 
각 슬라이스별로 오메가 값 붙포를 히스토그램으로 나타낸다.(히스토그램으로 나타낸다는 것을  count변수를 활용한다. )
for m=1:frame
    for n=1:slice-2
        for c=1:2000
            if ((omega1DeltaLeft+c*deltaX1Size)<=omega1(m,n)) && (omega1(m,n)<(omega1DeltaLeft+(c+1)*deltaX1Size))
                count1(n,c)=count1(n,c)+1;
            end
            if ((omega2DeltaLeft+c*deltaX2Size)<=omega2(m,n)) && (omega2(m,n)<(omega2DeltaLeft+(c+1)*deltaX2Size))
                count2(n,c)=count2(n,c)+1;
            end
            if ((omega3DeltaLeft+c*deltaX3Size)<=omega3(m,n)) && (omega3(m,n)<(omega3DeltaLeft+(c+1)*deltaX3Size))
                count3(n,c)=count3(n,c)+1;
            end
        end
    end
end
 
maxcount1=zeros(slice-2,1);
maxcount2=zeros(slice-2,1);
maxcount3=zeros(slice-2,1);
 
takecount1=zeros(slice-2,2000);
takecount2=zeros(slice-2,2000);
takecount3=zeros(slice-2,2000);
 
for n=1:slice-2
    for c=1:2000
        maxcount1=max(count1(n,:));
        maxcount2=max(count2(n,:));
        maxcount3=max(count3(n,:));
        if count1(n,c)>=maxcount1(n,c)/10
            takecount1(n,c)=takecount1(n,c)+1;
        end
        if count2(n,c)>=maxcount2(n,c)/10
            takecount2(n,c)=takecount2(n,c)+1;
        end
        if count3(n,c)>=maxcount3(n,c)/10
            takecount3(n,c)=takecount3(n,c)+1;
        end
    end
end
 

            
sum1=zeros(slice-2,1);
sum2=zeros(slice-2,1);
sum3=zeros(slice-2,1);
temp1=0;
temp2=0;
temp3=0;
 
for n=1:slice-2
    for o=1:2000ㄱ
        temp1=count1(n,o)*deltaX1Size;
        temp2=count2(n,o)*deltaX2Size;
        temp3=count3(n,o)*deltaX3Size;
        sum1(n,1)=sum1(n,1)+temp1;
        sum2(n,1)=sum2(n,1)+temp2;
        sum3(n,1)=sum3(n,1)+temp3;
    end
end
 
count1Norm=zeros(slice,2000);
count2Norm=zeros(slice,2000);
count3Norm=zeros(slice,2000);
for m=1:slice-2
    count1Norm(m,:)=count1(m,:)/sum1(m,1);
    count2Norm(m,:)=count2(m,:)/sum2(m,1);
    count3Norm(m,:)=count3(m,:)/sum3(m,1);
end
 
%{
subplot(4,3,4)
plot(count1Norm)
subplot(4,3,5)
plot(count2Norm)
subplot(4,3,6)
plot(count3Norm)
 
subplot(4,3,7)
histogram(count1Norm)
subplot(4,3,8)
histogram(count2Norm)
subplot(4,3,9)
histogram(count3Norm)
%}
위에서 구한 값들을 figure 화면 위에 그래프를 그린다.
반응형

댓글