Index in position 2 exceeds array bounds

I am trying to find the centre of mass of (sidechain of) tyrosine residues in a protein. I extracted the coordinates and then found the mass of the atoms in the following code. But while trying to find the X coordinate of centre of mass, I had this error show up
% Starting from pdb file
uxc = getpdb('1UXC');
No_of_residues = uxc.Sequence.NumOfResidues
No_of_residues = 65
isTYR = ({uxc.Model.Atom.resName} == "TYR");
uxcTYR = uxc.Model.Atom(isTYR) % Extracts particulars of only TYR
uxcTYR = 1×63 struct array with fields:
AtomSerNo AtomName altLoc resName chainID resSeq iCode X Y Z occupancy tempFactor segID element charge AtomNameStruct
%Extracting sidechain coordinates:
uxcTYRt = struct2table(uxcTYR)
uxcTYRt = 63×16 table
AtomSerNo AtomName altLoc resName chainID resSeq iCode X Y Z occupancy tempFactor segID element charge AtomNameStruct _________ ________ __________ _______ _______ ______ __________ ______ ______ ______ _________ __________ ________ _______ ______ ______________ 277 {'N' } {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 0.363 -2.991 -2.5 1 4.78 {' '} {'N'} {' '} 1×1 struct 278 {'CA' } {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 0.582 -4.369 -1.965 1 4.8 {' '} {'C'} {' '} 1×1 struct 279 {'C' } {0×0 char} {'TYR'} {'A'} 19 {0×0 char} -0.04 -4.407 -0.575 1 2.45 {' '} {'C'} {' '} 1×1 struct 280 {'O' } {0×0 char} {'TYR'} {'A'} 19 {0×0 char} -0.797 -5.299 -0.238 1 2.8 {' '} {'O'} {' '} 1×1 struct 281 {'CB' } {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 2.085 -4.607 -1.81 1 5.31 {' '} {'C'} {' '} 1×1 struct 282 {'CG' } {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 2.817 -4.625 -3.14 1 4.9 {' '} {'C'} {' '} 1×1 struct 283 {'CD1'} {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 2.135 -4.505 -4.363 1 4.99 {' '} {'C'} {' '} 1×1 struct 284 {'CD2'} {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 4.208 -4.767 -3.146 1 5.42 {' '} {'C'} {' '} 1×1 struct 285 {'CE1'} {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 2.83 -4.527 -5.574 1 2.66 {' '} {'C'} {' '} 1×1 struct 286 {'CE2'} {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 4.906 -4.789 -4.358 1 2.93 {' '} {'C'} {' '} 1×1 struct 287 {'CZ' } {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 4.22 -4.669 -5.574 1 2.4 {' '} {'C'} {' '} 1×1 struct 288 {'OH' } {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 4.906 -4.693 -6.77 1 2.22 {' '} {'O'} {' '} 1×1 struct 289 {'H' } {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 1.161 -2.485 -2.762 1 0 {' '} {'H'} {' '} 1×1 struct 290 {'HA' } {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 0.151 -5.119 -2.608 1 0 {' '} {'H'} {' '} 1×1 struct 291 {'HB2'} {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 2.49 -3.839 -1.168 1 0 {' '} {'H'} {' '} 1×1 struct 292 {'HB3'} {0×0 char} {'TYR'} {'A'} 19 {0×0 char} 2.211 -5.547 -1.313 1 0 {' '} {'H'} {' '} 1×1 struct
atomName=string(uxcTYRt.AtomName); %converting the column AtomName to string array;
REQtyr=uxcTYRt(ismember(atomName,[ "CB","CG","CD1","CD2","CE1","CE2","CZ","OH","HB2","HB3","HD1","HD2","HE1","HE2"]),["AtomName" "resSeq" "X" "Y" "Z"])
REQtyr = 42×5 table
AtomName resSeq X Y Z ________ ______ _____ ______ ______ {'CB' } 19 2.085 -4.607 -1.81 {'CG' } 19 2.817 -4.625 -3.14 {'CD1'} 19 2.135 -4.505 -4.363 {'CD2'} 19 4.208 -4.767 -3.146 {'CE1'} 19 2.83 -4.527 -5.574 {'CE2'} 19 4.906 -4.789 -4.358 {'CZ' } 19 4.22 -4.669 -5.574 {'OH' } 19 4.906 -4.693 -6.77 {'HB2'} 19 2.49 -3.839 -1.168 {'HB3'} 19 2.211 -5.547 -1.313 {'HD1'} 19 1.061 -4.394 -4.371 {'HD2'} 19 4.743 -4.861 -2.212 {'HE1'} 19 2.29 -4.432 -6.505 {'HE2'} 19 5.979 -4.898 -4.354 {'CB' } 28 4.35 -8.133 -3.978 {'CG' } 28 2.99 -8.068 -4.646
Atom_mass = ["CB", 12.01;"CG", 12.01; "CD1",12.01; "CD2",12.01;"CE1", 12.01;"CE2", 12.01; "CZ", 12.01; "OH", 17.006; "HB2", 1.007; "HB3", 1.007; "HD1", 1.007;"HD2", 1.007; "HE1", 1.007; "HE2", 1.007];
DICTAtom_mass = dictionary(Atom_mass(:,1), Atom_mass(:,2));
sizeTyr = size(REQtyr);
numTyr = sizeTyr(1)/14; %number of tyrosine residues
resSeq = REQtyr.resSeq;
sizeresSeq = size(resSeq);
eresSeq = sizeresSeq(1);
% To extract XYZ coordinates of only the tyrosine residues.
uniq = unique(resSeq)
uniq = 3×1
19 28 47
for i = uniq(1,1):uniq(end,end)
Tyro1{i} = table2cell(REQtyr(ismember(resSeq,i),["AtomName","X","Y","Z"]));
Tyro{i} = table2struct(REQtyr(ismember(resSeq,i),["AtomName","X","Y","Z"]));
Tyroc{i} = [Tyro{i}.X;Tyro{i}.Y;Tyro{i}.Z];
Tyrocd{i} = Tyroc{i}';
end
% Finding out the mass of each and every atom in the sidechain of the
% tyrosine residue
for i = uniq(1,1):uniq(end,end)
Tyromas{i} = str2double(DICTAtom_mass(Tyro1{i}(:,1)));
Tyromass{i} = [Tyromas{i}];
end
%X coordinate:
for i= uniq(1,1):uniq(end,end)
TyrocdX{i} = (Tyromass{i}'*Tyrocd{i}(:,1))/sum(Tyromass{i})
end
TyrocdX = 1×19 cell array
{0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {[3.5566]}
Index in position 2 exceeds array bounds.

 Réponse acceptée

David Hill
David Hill le 16 Mar 2023
for i = 1:numel(uniq)
Tyro1{i} = table2cell(REQtyr(ismember(resSeq,uniq(i)),["AtomName","X","Y","Z"]));
Tyro{i} = table2struct(REQtyr(ismember(resSeq,uniq(i)),["AtomName","X","Y","Z"]));
Tyroc{i} = [Tyro{i}.X;Tyro{i}.Y;Tyro{i}.Z];
Tyrocd{i} = Tyroc{i}';
end
% Finding out the mass of each and every atom in the sidechain of the
% tyrosine residue
for i = 1:numel(uniq)
Tyromas{i} = str2double(DICTAtom_mass(Tyro1{i}(:,1)));
Tyromass{i} = [Tyromas{i}];
end
%X coordinate:
for i= 1:numel(uniq)
TyrocdX{i} = (Tyromass{i}'*Tyrocd{i}(:,1))/sum(Tyromass{i})
end

4 commentaires

Masha
Masha le 16 Mar 2023
Hello Mr. Hill. Thank you for the response. In your code the value of i goes from 1 to 3. The value of i in my code corresponds to the residue number of tyrosine [19,28,47] So that I would know at the end, for "which" tyrosines i calculated the centre of mass for.
is there a way to fix this?
Or like map the index of i to the residue number of tyrosine?
Masha
Masha le 16 Mar 2023
Modifié(e) : Masha le 16 Mar 2023
I chose i values to be 19,28,47 (values of uniq) so it would extract the coordinates that correspond to those values (of residue number) from Tyro{i} using ismember.
So choosing 1,2,3 (1:numel(uniq)) would give me wrong results.
ismember(resSeq,uniq(i))
Masha
Masha le 16 Mar 2023
Thank you so much!

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Genomics and Next Generation Sequencing dans Centre d'aide et File Exchange

Produits

Version

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by