Files
matlab-python/Tilt/schemaSP.m

1020 lines
38 KiB
Matlab
Executable File

% Funzione che ricostrusice i segmenti di pertinenza e la profondità dello
% spostamento relativo.
% Aggiornato il 18 Marzo 2021
function [SpeTL,PsTL,SpeTLHR,PsTLHR,SpeTLH,PsTLH,SpeTLHRH,PsTLHRH,SpeIPL,PsIPL,Inverti,...
SpeIPLHR,PsIPLHR,SpeHD,PsHD,SpeHDVR,PsHDVR] = schemaSP(yesTL,yesTLHR,yesTLH,yesTLHRH,yesTLHR3D,yesTLHR3DH,...
yesIPL,yesIPLHR,yesIPLHR3D,yesHD,yesHDVR,NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkHR3D,...
NodoTiltLinkH,NodoTiltLinkHRH,NodoTiltLinkHR3DH,NodoInPlaceLink,NodoInPlaceLinkHR,...
NodoInPlaceLinkHR3D,NodoTiltLinkHD,NodoTiltLinkHDVR,Anchor_real,...
rTL,rTLH,rTLHR,rTLHRH,rIPL,rIPLHR,rHD,rHDVR,catena,IDcentralina,DTcatena,FileName)
% Apro file di testo
fileID = fopen(FileName,'a');
fmt = '%s \r';
text = 'schemaSP function started';
fprintf(fileID,fmt,text);
Shift = Anchor_real;
Nodi = [cell2mat(catena(:,3)) cell2mat(catena(:,2))+Shift cell2mat(catena(:,1))];
% if Anchor_real == 0
% Last_Node = 0;
% else
% [r,~] = size(Nodi);
% % Cerco l'ancora
% for i = 1:r
% if Nodi(i,3) == 9
% break
% end
% end
% Last_Node = Anchor_real - Nodi(i,2) + 0.5;
% Nodi(:,2) = Nodi(:,2) + Last_Node;
% end
%% Tilt Link V
if yesTL == 1
% Definizione dei segmenti di pertinenza dei singoli accelerometri
% SpeTL = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo)
% PsTL = Profondità dello spostamento
NodiTL = -1*cell2mat(NodoTiltLink(:,2:3));
NodiTL(:,2) = NodiTL(:,2) + Shift;
% Costruisco il segmento di pertinenza
spe0 = 0; % segmento di pertinenza dell'ancora
if rTL > 1
spe1 = Nodi(1,2)-((NodiTL(1,2) + NodiTL(2,2))/2); % segmento di pertinenza del primo nodo
else
spe1 = 1;
end
if rTL>2
spe2 = zeros(rTL-2,1);
for i = 2:(rTL-1)
media1 = (abs(NodiTL(i,2)) + abs(NodiTL(i-1,2)))/2;
media2 = (abs(NodiTL(i,2)) + abs(NodiTL(i+1,2)))/2;
spe2(i-1,1) = media1 - media2;
end
else
spe2 = [];
end
if rTL > 1
spelast = (NodiTL(rTL-1,2)+NodiTL(rTL,2))/2; % segmento di pertinenza del nodo superficiale
SpeTL = [spe0; spe1; spe2; spelast];
else
SpeTL = [spe0; spe1];
end
% Calcolo la profondità dello spostamento relativo
ps0 = (-1)*Nodi(1,2); % profondità dell'ancora
ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo TL è data da
% ancora + segmento di pertinenza del primo nodo
ps2 = zeros(rTL-1,1);
for j = 2:rTL
if j == 2
psj = ps1 + SpeTL(j+1,1);
% la profondità a cui il nodo j di tipo Tilt Link rileva lo spostamento è data dalla
% somma fra il suo segmento di pertinenza e la profondità a cui rileva lo spostamento
% il nodo precedente
psPrec = psj;
% mi serve come appoggio per il calcolo della profondità dello spostamento del nodo successivo
else
psj = psPrec + SpeTL(j+1,1);
psPrec = psj;
end
ps2(j-1,1) = psj;
end
PsTL = [ps0; ps1; ps2];
text = 'Segments of relevance and calculation points of Tilt Link V defined correctly';
fprintf(fileID,fmt,text);
else
% Non ci sono nodi Tilt Link
SpeTL = [];
PsTL = [];
end
%% Tilt Link HD V
if yesHD == 1
% Definizione dei segmenti di pertinenza dei singoli accelerometri
% SpeTL = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo)
% PsTL = Profondità dello spostamento
NodiTLHD = -1*cell2mat(NodoTiltLinkHD(:,2:3));
NodiTLHD(:,2) = NodiTLHD(:,2) + Shift;
% Costruisco il segmento di pertinenza
spe0 = 0; % segmento di pertinenza dell'ancora
if rHD > 1
spe1 = Nodi(1,2)-((NodiTLHD(1,2) + NodiTLHD(2,2))/2); % segmento di pertinenza del primo nodo
else
spe1 = 1;
end
if rHD>2
spe2 = zeros(rHD-2,1);
for i = 2:(rHD-1)
media1 = (abs(NodiTLHD(i,2)) + abs(NodiTLHD(i-1,2)))/2;
media2 = (abs(NodiTLHD(i,2)) + abs(NodiTLHD(i+1,2)))/2;
spe2(i-1,1) = media1 - media2;
end
else
spe2 = [];
end
if rHD > 1
spelast = (NodiTLHD(rHD-1,2)+NodiTLHD(rHD,2))/2; % segmento di pertinenza del nodo superficiale
SpeHD = [spe0; spe1; spe2; spelast];
else
SpeHD = [spe0; spe1];
end
% Calcolo la profondità dello spostamento relativo
ps0 = (-1)*Nodi(1,2); % profondità dell'ancora
ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo TL è data da
% ancora + segmento di pertinenza del primo nodo
ps2 = zeros(rHD-1,1);
for j = 2:rHD
if j == 2
if SpeHD(j+1,1) <= 1
psj = ps1 + SpeHD(j+1,1);
else
psj = cell2mat(NodoTiltLinkHD(j,3))+0.5+Shift;
end
% la profondità a cui il nodo j di tipo Tilt Link rileva lo spostamento è data dalla
% somma fra il suo segmento di pertinenza e la profondità a cui rileva lo spostamento
% il nodo precedente
psPrec = psj;
% mi serve come appoggio per il calcolo della profondità dello spostamento del nodo successivo
else
if SpeHD(j+1,1) <= 1
psj = psPrec + SpeHD(j+1,1);
else
psj = cell2mat(NodoTiltLinkHD(j,3))+0.5+Shift;
end
psPrec = psj;
end
ps2(j-1,1) = psj;
end
PsHD = [ps0; ps1; ps2];
text = 'Segments of relevance and calculation points of Tilt Link HD V defined correctly';
fprintf(fileID,fmt,text);
for i = 2:rHD+1
if SpeHD(i) > 1
SpeHD(i) = 1;
end
end
else
% Non ci sono nodi Tilt Link
SpeHD = [];
PsHD = [];
end
%% Tilt Link HD VR
if yesHDVR == 1
% Definizione dei segmenti di pertinenza dei singoli accelerometri
% SpeTL = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo)
% PsTL = Profondità dello spostamento
NodiTLHDVR = -1*cell2mat(NodoTiltLinkHDVR(:,2:3));
NodiTLHDVR(:,2) = NodiTLHDVR(:,2) + Shift;
% Costruisco il segmento di pertinenza
spe0 = 0; % segmento di pertinenza dell'ancora
if rHDVR > 1
spe1 = Nodi(1,2)-((NodiTLHDVR(1,2) + NodiTLHDVR(2,2))/2); % segmento di pertinenza del primo nodo
else
spe1 = 1;
end
if rHDVR>2
spe2 = zeros(rHDVR-2,1);
for i = 2:(rHDVR-1)
media1 = (abs(NodiTLHDVR(i,2)) + abs(NodiTLHDVR(i-1,2)))/2;
media2 = (abs(NodiTLHDVR(i,2)) + abs(NodiTLHDVR(i+1,2)))/2;
spe2(i-1,1) = media1 - media2;
end
else
spe2 = [];
end
if rHDVR > 1
spelast = (NodiTLHDVR(rHDVR-1,2)+NodiTLHDVR(rHDVR,2))/2; % segmento di pertinenza del nodo superficiale
SpeHDVR = [spe0; spe1; spe2; spelast];
else
SpeHDVR = [spe0; spe1];
end
% Calcolo la profondità dello spostamento relativo
ps0 = (-1)*Nodi(1,2); % profondità dell'ancora
ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo TL è data da
% ancora + segmento di pertinenza del primo nodo
ps2 = zeros(rHDVR-1,1);
for j = 2:rHDVR
if j == 2
if SpeHDVR(j+1,1) <= 1
psj = ps1 + SpeHDVR(j+1,1);
else
psj = cell2mat(NodoTiltLinkHDVR(j,3))+0.5+Shift;
end
% la profondità a cui il nodo j di tipo Tilt Link rileva lo spostamento è data dalla
% somma fra il suo segmento di pertinenza e la profondità a cui rileva lo spostamento
% il nodo precedente
psPrec = psj;
% mi serve come appoggio per il calcolo della profondità dello spostamento del nodo successivo
else
if SpeHDVR(j+1,1) <= 1
psj = psPrec + SpeHDVR(j+1,1);
else
psj = cell2mat(NodoTiltLinkHDVR(j,3))+0.5+Shift;
end
psPrec = psj;
end
ps2(j-1,1) = psj;
end
PsHDVR = [ps0; ps1; ps2];
text = 'Segments of relevance and calculation points of Tilt Link HD VR defined correctly';
fprintf(fileID,fmt,text);
for i = 2:rHDVR+1
if SpeHDVR(i) > 1
SpeHDVR(i) = 1;
end
end
else
% Non ci sono nodi Tilt Link VR
SpeHDVR = [];
PsHDVR = [];
end
%% Tilt Link HR V
if yesTLHR == 1
% Definizione dei segmenti di pertinenza delle ampolle
% PsTLHR = Profondità dello spostamento
NodiTLHR = -1*cell2mat(NodoTiltLinkHR(:,2:3));
NodiTLHR(:,2) = NodiTLHR(:,2) + Shift;
% Costruisco il segmento di pertinenza
spe0 = 0; % segmento di pertinenza dell'ancora
if rTLHR == 1 % c'è una sola ampolla
SpeTLHR = [0; 0.5]; % lo impongo di default
else
spe1 = Nodi(1,2)-((NodiTLHR(1,2) + NodiTLHR(2,2))/2); % segmento di pertinenza del primo nodo
if rTLHR>2
spe2 = zeros(rTLHR-2,1);
for i = 2:(rTLHR-1)
media1 = (abs(NodiTLHR(i,2)) + abs(NodiTLHR(i-1,2)))/2;
media2 = (abs(NodiTLHR(i,2)) + abs(NodiTLHR(i+1,2)))/2;
spei = media1 - media2;
spe2(i-1,1) = spei;
end
else
spe2 = [];
end
spelast = (NodiTLHR(rTLHR-1,2)+NodiTLHR(rTLHR,2))/2; % segmento di pertinenza del nodo superficiale
SpeTLHR = [spe0; spe1; spe2; spelast];
end
% Calcolo la profondità dello spostamento relativo
ps0 = (-1)*Nodi(1,2); % profondità dell'ancora
if rTLHR == 1 % c'è una sola ampolla
PsTLHR = [ps0; -1*NodiTLHR(1,2)];
else
ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo TLHR è data
% da ancora + segmento di pertinenza del primo nodo
ps2 = zeros(rTLHR-1,1);
for j = 2:rTLHR
if j == 2
psj = ps1 + SpeTLHR(j+1,1);
% la profondità a cui il nodo j di tipo Tilt Link HR rileva lo
% spostamento è data dalla somma fra il suo segmento di
% pertinenza e la profondità a cui rileva lo spostamento
% il nodo precedente
psPrec = psj; % mi serve come appoggio per il calcolo della
% profondità dello spostamento del nodo successivo
else
psj = psPrec + SpeTLHR(j+1,1);
psPrec = psj;
end
ps2(j-1,1) = psj;
end
PsTLHR = [ps0; ps1; ps2];
end
if yesTL == 1 % Se ci sono Tilt Link, il segmento di pertinenza
% dell'ampolla lo scrivo considerando i nodi Tilt Link sopra e
% sotto (se sono presenti)
salta = zeros(rTLHR,1);
esco = 0; % entra o meno nel ciclo successivo
if yesTLHR3D == 1
[dim,~] = size(NodoTiltLinkHR3D);
if rTLHR == dim % vuol dire che tutti i nodi sono dopppi
esco = 1; % non entro nel ciclo successivo
end
end
if esco == 0
NodiTLdown = zeros(rTLHR,1);
NodiTLup = zeros(rTLHR,1);
ProfTLHR = zeros(rTLHR*3,1);
for i = 1:rTLHR
prof = NodiTLHR(i,2);
% cerco il nodo sotto all'Ampolla
B = NodiTL(:,2) > prof; % uso > perchè il segno della profondità è +
A = NodiTL(B,2);
if i == 1 % guardo se il primo nodo è Ampolla o Mems
C = isempty(A);
if C == 1 % il primo nodo è Ampolla
salta(i) = 1;
else
salta(i) = 0;
end
end
NodoTLdown = A(end); % nodo Tilt Link sotto all'Ampolla
% cerco il nodo dopo l'Ampolla
B = NodiTL(:,2) < prof;
A = NodiTL(B,2);
CC = isempty(A);
if C == 1 % Manca il nodo Sotto
salta(i) = 1;
else
if CC == 1 % ovvero se Tilt Link e Tilt Link HR sono nello
% stesso nodo doppio, ignoro il passaggio (manca
% il nodo sopra)
salta(i) = 1;
else
salta(i) = 0;
NodoTLup = A(1);
NodiTLdown(i,1) = NodoTLdown;
NodiTLup(i,1) = NodoTLup; % Nodo Tilt Link sopra all'ampolla
end
end
end
spe0 = 0; % segmento di pertinenza dell'ancora
if salta(1) == 1
spe1 = Nodi(1,2)-NodiTLHR(1,2); % segmento di pertinenza del primo nodo
ii = 2;
else
spe1 = Nodi(1,2)-NodiTLdown(1,1); % segmento di pertinenza del
% primo nodo. N.B.: Per funzionare correttamente, il primo nodo
% dopo l'ancora deve per forza essere un Tilt Link!
ii = 1;
end
spe2 = zeros(rTLHR,1);
for i = ii:rTLHR
spei = (NodiTLdown(i,1)-NodiTLup(i,1))/2;
spe2(i,1) = spei;
end
SpeTLHR = [spe0; spe1; spe2];
% Calcolo profondità dello spostamento relativo
m = 1;
for i = 1:rTLHR
if salta(i) == 1
if i == 1 % considero l'ancora
a = (Nodi(i,2)+NodiTLHR(i,2))/2;
ProfTLHR = PsTLHR;
else
a = (NodiTLHR(i-1,2)+NodiTLHR(i,2))/2;
end
if i == rTLHR % ultimo nodo
if salta(i) == 1
b = NodiTLHR(i,2);
c = NodiTLHR(i,2)+0.25;
else
b = (NodiTLHR(i,2)+NodiTLup(i))/2;
c = NodiTLup(i)-(NodiTLHR(i,2)-NodiTLup(i))/2;
end
else
if salta(i+1) == 1
b = (NodiTLHR(i,2)+NodiTLHR(i+1,2))/2;
c = (NodiTLHR(i+1,2)-(NodiTLHR(i,2)-NodiTLHR(i+1,2)))/2;
else
b = (NodiTLHR(i,2)+NodiTLup(i))/2;
c = NodiTLup(i)-(NodiTLHR(i,2)-NodiTLup(i))/2;
end
end
else
a = (NodiTLdown(i)+NodiTLHR(i,2))/2;
b = (NodiTLHR(i,2)+NodiTLup(i))/2;
c = (NodiTLup(i)-(NodiTLHR(i,2)-NodiTLup(i))/2);
end
ProfTLHR(m,1) = a;
ProfTLHR(m+1,1) = b;
ProfTLHR(m+2,1) = c;
m = m+3;
end
end
end
text = 'Segments of relevance and calculation points of Tilt Link HR V defined correctly';
fprintf(fileID,fmt,text);
else
% Non ci sono nodi Tilt Link HR
PsTLHR = [];
SpeTLHR = [];
end
%% Tilt Link HR3D
% % CONTROLLA E CORREGGI. lA CORREZIONE FATTA QUI VA PURE SU TL E HR
if yesTLHR3D == 1
NodoTLHR3D = zeros(rTL,1);
t = 1;
for i=1:rTL
for j=1:rTLHR
if NodiTL(i,2)==NodiTLHR(j,2)
NodoTLHR3D(t,1)=NodiTL(i,2);
SpeTLHR(j+1,1) = SpeTL(i+1,1);
PsTLHR(j+1,1) = PsTL(i+1,1);
% il segmento di pertinenza dell'ampolla è identico al SP del corrispondente Tilt Link V
t=t+1;
end
end
end
end
%% Tilt Link H
if yesTLH == 1
% Definizione dei segmenti di pertinenza dei singoli accelerometri
% SpeTLH = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo)
% PsTLH = Posizione dello spostamento
Nodi_H = Nodi;
NodiTLH = cell2mat(NodoTiltLinkH(:,2:3));
% Costruisco il segmento di pertinenza
spe0 = 0; % segmento di pertinenza dell'ancora
spe1 = -1*(Nodi_H(1,2)-((NodiTLH(1,2) + NodiTLH(2,2))/2)); % segmento di pertinenza del primo nodo, lo considero +
if rTLH>2
spe2 = zeros(rTLH-2,1);
for i = 2:(rTLH-1)
media1 = (abs(NodiTLH(i,2)) + abs(NodiTLH(i-1,2)))/2;
media2 = (abs(NodiTLH(i,2)) + abs(NodiTLH(i+1,2)))/2;
spei = media1 - media2;
spe2(i-1,1) = -1*(spei); % li considero positivi
end
else
spe2 = [];
end
% segmento di pertinenza dell'ultimo nodo, lo considero centrando il
% nodo rispetto al nodo sotto e a un ipotetico nodo sopra equidistante
spelast = (NodiTLH(end,2)+(NodiTLH(end,2)-NodiTLH(rTLH-1,2))/2-((NodiTLH(rTLH-1,2)+NodiTLH(rTLH,2)))/2);
SpeTLH = [spe0; spe1; spe2; spelast]; % raccolgo i segmenti di pertinenza
% Calcolo la posizione dello spostamento relativo
ps0 = Nodi_H(1,2); % posizione dell'ancora
if spe1 <= 1
ps1 = Nodi_H(1,2)+spe1; % la posizione del primo nodo TLH è data da
else
ps1 = cell2mat(NodoTiltLinkH(1,3))+0.5;
end
% ancora + segmento di pertinenza del primo nodo
ps2 = zeros(rTLH-1,1);
for j = 2:rTLH
if j == 2
if SpeTLH(j+1,1) <= 1
psj = ps1 + SpeTLH(j+1,1);
else
psj = cell2mat(NodoTiltLinkH(j,3))+0.5;
end
% la posizione a cui il nodo j di tipo Tilt Link H rileva lo spostamento è data dalla
% somma fra il suo segmento di pertinenza e la posizione a cui rileva lo spostamento
% il nodo precedente
psPrec = psj;
% mi serve come appoggio per il calcolo della posizione dello spostamento del nodo successivo
else
if SpeTLH(j+1,1) <= 1
psj = psPrec + SpeTLH(j+1,1);
else
psj = cell2mat(NodoTiltLinkH(j,3))+0.5;
end
psPrec = psj;
end
ps2(j-1,1) = psj;
end
PsTLH = [ps0; ps1; ps2];
text = 'Segments of relevance and calculation points of Tilt Link H defined correctly';
fprintf(fileID,fmt,text);
for i = 2:rTLH+1
if SpeTLH(i) > 1
SpeTLH(i) = 1;
end
end
else
% Non ci sono nodi Tilt Link H
SpeTLH = [];
PsTLH = [];
end
%% Tilt Link HR H
if yesTLHRH == 1
% Definizione dei segmenti di pertinenza delle ampolle
% PsTLHRH = posizione dello spostamento
Nodi_HRH = Nodi;
NodiTLHRH = cell2mat(NodoTiltLinkHRH(:,2:3));
% Costruisco il segmento di pertinenza
spe0 = 0; % segmento di pertinenza dell'ancora
spe1 = -1*(Nodi_HRH(1,2)-((NodiTLHRH(1,2)+NodiTLHRH(2,2))/2)); % segmento di pertinenza del primo nodo
spe2 = zeros(rTLHRH-2,1);
if rTLHRH>2
for i = 2:(rTLHRH-1)
media1 = (abs(NodiTLHRH(i,2)) + abs(NodiTLHRH(i-1,2)))/2;
media2 = (abs(NodiTLHRH(i,2)) + abs(NodiTLHRH(i+1,2)))/2;
spei = media1 - media2;
spe2(i-1,1) = -1*(spei); % li considero positivi
end
else
spe2 = [];
end
% segmento di pertinenza dell'ultimo nodo, lo considero centrando il
% nodo rispetto al nodo sotto e a un ipotetico nodo sopra equidistante
spelast = (NodiTLHRH(end,2)+(NodiTLHRH(end,2)-NodiTLHRH(rTLH-1,2))/2-((NodiTLHRH(rTLH-1,2)+NodiTLHRH(rTLH,2)))/2);
% raccolgo i segmenti di pertinenza
SpeTLHRH = [spe0; spe1; spe2; spelast];
% Calcolo la posizione dello spostamento relativo
ps0 = Nodi_HRH(1,2); % posizione dell'ancora
if spe1 <= 1
ps1 = Nodi_HRH(1,2)+spe1; % la posizione del primo nodo TLHRH è data da ancora + segmento di pertinenza del primo nodo
else
ps1 = cell2mat(NodoTiltLinkHRH(1,3))+0.5;
end
ps2 = zeros(rTLHRH-1,1);
for j = 2:rTLHRH
if j == 2
if SpeTLHRH(j+1,1) <= 1
psj = ps1 + SpeTLHRH(j+1,1);
else
psj = cell2mat(NodoTiltLinkHRH(j,3))+0.5;
end
% la posizione a cui il nodo j di tipo Tilt Link HR H rileva lo
% spostamento è data dalla somma fra il suo segmento di
% pertinenza e la posizione a cui rileva lo spostamento
% il nodo precedente
psPrec = psj; % mi serve come appoggio per il calcolo della
% posizione dello spostamento del nodo successivo
else
if SpeTLHRH(j+1,1) <= 1
psj = psPrec + SpeTLHRH(j+1,1);
else
psj = cell2mat(NodoTiltLinkHRH(j,3))+0.5;
end
psPrec = psj;
end
ps2(j-1,1) = psj;
end
PsTLHRH = [ps0; ps1; ps2];
for i = 2:rTLHRH+1
if SpeTLHRH(i) > 1
SpeTLHRH(i) = 1;
end
end
if yesTLH == 1 % Se ci sono Tilt Link H, il segmento di pertinenza
% dell'ampolla lo scrivo considerando i nodi Tilt Link H prima e
% dopo (se sono presenti), a meno che questi non siano Tilt Link
% HR3D H
salta = zeros(rTLHRH,1);
esco = 0; % entra o meno nel ciclo successivo
if yesTLHR3DH == 1
[dim,~] = size(NodoTiltLinkHR3DH);
if rTLHRH == dim % vuol dire che tutti i nodi sono dopppi
esco = 1; % esco dal ciclo successivo
end
end
if esco == 0
NodiTLHdown = zeros(rTLHRH,1);
NodiTLHup = zeros(rTLHRH,1);
ProfTLHRH = zeros(rTLHRH*3,1);
for i = 1:rTLHRH
prof = NodiTLHRH(i,2);
% cerco il nodo prima dell'Ampolla
B = NodiTLH(:,2) < prof;
A = NodiTLH(B,2);
if i == 1 % guardo se il primo nodo è Ampolla o Tilt Link
C = isempty(A);
if C == 1 % il primo nodo è Ampolla
salta(i) = 1;
else
salta(i) = 0;
end
end
NodoTLHdown = A(end); % nodo Tilt Link H prima dell'Ampolla
% cerco il nodo dopo l'Ampolla
B = NodiTLH(:,2) > prof;
A = NodiTLH(B,2);
CC = isempty(A);
if C == 1 % Manca il nodo dopo
salta(i) = 1;
else
if CC == 1 % ovvero se Tilt Link e Tilt Link HR sono nello
% stesso nodo doppio, ignoro il passaggio (manca
% il nodo sopra)
salta(i) = 1;
else
salta(i) = 0;
NodoTLHup = A(1);
NodiTLHdown(i,1) = NodoTLHdown;
NodiTLHup(i,1) = NodoTLHup; % Nodo Tilt Link H dopo l'ampolla
end
end
end
spe0 = 0; % segmento di pertinenza dell'ancora
if salta(1) == 1
spe1 = Nodi(1,2)-NodiTLHRH(1,2); % segmento di pertinenza del primo nodo
ii = 2;
else
spe1 = Nodi(1,2)-NodiTLHdown(1,1); % segmento di pertinenza del
% primo nodo. N.B.: Per funzionare correttamente, il primo nodo
% dopo l'ancora deve per forza essere un Tilt Link H!
ii = 1;
end
spe2 = zeros(rTLHRH,1);
for i = ii:rTLHRH
spei = (NodiTLHdown(i,1)-NodiTLHup(i,1))/2;
spe2(i,1) = spei;
end
SpeTLHRH = [spe0; spe1; spe2];
% Calcolo posizione dello spostamento relativo
m = 1;
for i = 1:rTLHRH
if salta(i) == 1
if i == 1 % considero l'ancora
a = -1*((Nodi_HRH(i,2)+NodiTLHRH(i,2))/2);
ProfTLHRH = PsTLHRH;
else
a = -1*((NodiTLHRH(i-1,2)+NodiTLHRH(i,2))/2);
end
if i == rTLHRH % ultimo nodo
if salta(i) == 1
b = -1*(NodiTLHRH(i,2));
c = -1*(NodiTLHRH(i,2)+0.25);
else
b = -1*((NodiTLHRH(i,2)+NodiTLHup(i))/2);
c = -1*(NodiTLHup(i)-(NodiTLHRH(i,2)-NodiTLHup(i))/2);
end
else
if salta(i+1) == 1
b = -1*((NodiTLHRH(i,2)+NodiTLHRH(i+1,2))/2);
c = -1*(NodiTLHRH(i+1,2)-(NodiTLHRH(i,2)-NodiTLHRH(i+1,2))/2);
else
b = -1*((NodiTLHRH(i,2)+NodiTLHup(i))/2);
c = -1*(NodiTLHup(i)-(NodiTLHRH(i,2)-NodiTLHup(i))/2);
end
end
else
a = -1*((NodiTLHdown(i)+NodiTLHRH(i,2))/2);
b = -1*((NodiTLHRH(i,2)+NodiTLHup(i))/2);
c = -1*(NodiTLHup(i)-(NodiTLHRH(i,2)-NodiTLHup(i))/2);
end
ProfTLHRH(m,1) = a;
ProfTLHRH(m+1,1) = b;
ProfTLHRH(m+2,1) = c;
m = m+3;
end
end
text = 'Segments of relevance and calculation points of Tilt Link HR H defined correctly';
fprintf(fileID,fmt,text);
end
else
% Non ci sono nodi Tilt Link HR H
PsTLHRH = [];
SpeTLHRH = [];
end
%% Tilt Link HR3D H
if yesTLHR3DH == 1
NodoTLHR3DH = zeros(rTLH,1);
t = 1;
for i=1:rTLH
for j=1:rTLHRH
if NodiTLH(i,2)==NodiTLHRH(j,2)
NodoTLHR3DH(t,1)=NodiTLH(i,2);
SpeTLHRH(j+1,1) = SpeTLH(i+1,1);
PsTLHRH(j+1,1) = PsTLH(i+1,1);
t=t+1;
end
end
end
end
%% In Place Link
if yesIPL == 1
NodiIPL = -1*cell2mat(NodoInPlaceLink(:,2:3));
NodiIPL(:,2) = NodiIPL(:,2) + Shift;
% Controllo quale sia il numero del nodo più profondo per invertire
% eventualmente le matrici
Nodo1 = find(cell2mat(NodoInPlaceLink(:,2))==1);
Prof1 = cell2mat(NodoInPlaceLink(Nodo1,3));
Nodo2 = find(cell2mat(NodoInPlaceLink(:,2))==2);
Prof2 = cell2mat(NodoInPlaceLink(Nodo2,3));
if Prof2<Prof1
Inverti=1;
else
Inverti=0;
end
% Costruisco il segmento di pertinenza
spe0 = 0; % segmento di pertinenza dell'ancora
if Inverti == 0
spe1 = Nodi(1,2)-((NodiIPL(1,2) + NodiIPL(2,2))/2); % segmento di pertinenza del primo nodo
elseif Inverti == 1
spe1 = Nodi(end,2)-((NodiIPL(end,2) + NodiIPL(end-1,2))/2); % segmento di pertinenza del primo nodo
end
if rIPL>2
spe2 = zeros(rIPL-2,1);
for i = 2:(rIPL-1)
if Inverti == 0
media1 = (abs(NodiIPL(i,2)) + abs(NodiIPL(i-1,2)))/2;
media2 = (abs(NodiIPL(i,2)) + abs(NodiIPL(i+1,2)))/2;
elseif Inverti == 1
media1 = (abs(NodiIPL(rIPL-i+1,2)) + abs(NodiIPL(rIPL,2)))/2;
media2 = (abs(NodiIPL(rIPL-i+1,2)) + abs(NodiIPL(rIPL-i,2)))/2;
end
spe2(i-1,1) = media1 - media2;
end
else
spe2 = [];
end
if Inverti == 0
spelast = (NodiIPL(rIPL-1,2)+NodiIPL(rIPL,2))/2; % segmento di pertinenza del nodo superficiale
elseif Inverti == 1
spelast = (NodiIPL(2,2)+NodiIPL(1,2))/2; % segmento di pertinenza del nodo superficiale
end
SpeIPL = [spe0; spe1; spe2; spelast];
% Calcolo la profondità dello spostamento relativo
if Inverti == 0
ps0 = (-1)*Nodi(1,2); % profondità dell'ancora
elseif Inverti == 1
ps0 = (-1)*Nodi(end,2); % profondità dell'ancora
end
if spe1 <= 1
ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo IPL è data da
else
ps1 = cell2mat(NodoInPlaceLink(1,3))+0.5;
end
% ancora + segmento di pertinenza del primo nodo
ps2 = zeros(rIPL-1,1);
for j = 2:rIPL
if j == 2
if SpeIPL(j+1,1) <= 1
psj = ps1 + SpeIPL(j+1,1);
else
psj = cell2mat(NodoInPlaceLink(j,3))+0.5+Shift;
end
% la profondità a cui il nodo j di tipo In Place Link rileva lo spostamento è data dalla
% somma fra il suo segmento di pertinenza e la profondità a cui rileva lo spostamento
% il nodo precedente
psPrec = psj;
% mi serve come appoggio per il calcolo della profondità dello spostamento del nodo successivo
else
if strcmp(IDcentralina,'ID0070') == 1 && strcmp(DTcatena,'DT0111 IPI') == 1 || ...
strcmp(IDcentralina,'ID0071') == 1 && strcmp(DTcatena,'DT0112 IPI') == 1 || ...
strcmp(IDcentralina,'ID0072') == 1 && strcmp(DTcatena,'DT0113 IPI') == 1 || ...
strcmp(IDcentralina,'ID0073') == 1 && strcmp(DTcatena,'DT0114 IPI') == 1
if SpeIPL(j+1,1) <= 0.5
psj = psPrec + SpeIPL(j+1,1);
else
psj = cell2mat(NodoInPlaceLink(j,3))+0.25+Shift;
end
else
if SpeIPL(j+1,1) <= 1
psj = psPrec + SpeIPL(j+1,1);
else
psj = cell2mat(NodoInPlaceLink(j,3))+0.5+Shift;
end
end
psPrec = psj;
end
ps2(j-1,1) = psj;
end
PsIPL = [ps0; ps1; ps2];
text = 'Segments of relevance and calculation points of In Place Link defined correctly';
fprintf(fileID,fmt,text);
for i = 2:rIPL+1
if SpeIPL(i) > 1
SpeIPL(i) = 1;
end
if strcmp(IDcentralina,'ID0070') == 1 && strcmp(DTcatena,'DT0111 IPI') == 1 || ...
strcmp(IDcentralina,'ID0071') == 1 && strcmp(DTcatena,'DT0112 IPI') == 1 || ...
strcmp(IDcentralina,'ID0072') == 1 && strcmp(DTcatena,'DT0113 IPI') == 1 || ...
strcmp(IDcentralina,'ID0073') == 1 && strcmp(DTcatena,'DT0114 IPI') == 1
if SpeIPL(i) > 0.5
SpeIPL(i) = 0.5;
end
end
end
else
% Non ci sono nodi In Place Link
SpeIPL = [];
PsIPL = [];
Inverti = [];
end
%% In Place Link HR
if yesIPLHR == 1
% Definizione dei segmenti di pertinenza delle ampolle
% PsIPLHR = Profondità dello spostamento
NodiIPLHR = -1*cell2mat(NodoInPlaceLinkHR(:,2:3));
NodiIPLHR(:,2) = NodiIPLHR(:,2) + Shift;
% Costruisco il segmento di pertinenza
spe0 = 0; % segmento di pertinenza dell'ancora
if rIPLHR == 1 % c'è una sola ampolla
SpeIPLHR = [0; 0.5]; % lo impongo di default
else
spe1 = Nodi(1,2)-((NodiIPLHR(1,2) + NodiIPLHR(2,2))/2); % segmento di pertinenza del primo nodo
if rIPLHR>2
spe2 = zeros(rIPLHR-2,1);
for i = 2:(rIPLHR-1)
media1 = (abs(NodiIPLHR(i,2)) + abs(NodiIPLHR(i-1,2)))/2;
media2 = (abs(NodiIPLHR(i,2)) + abs(NodiIPLHR(i+1,2)))/2;
spei = media1 - media2;
spe2(i-1,1) = spei;
end
else
spe2 = [];
end
spelast = (NodiIPLHR(rIPLHR-1,2)+NodiIPLHR(rIPLHR,2))/2; % segmento di pertinenza del nodo superficiale
SpeIPLHR = [spe0; spe1; spe2; spelast];
end
% Calcolo la profondità dello spostamento relativo
ps0 = (-1)*Nodi(1,2); % profondità dell'ancora
if rIPLHR == 1 % c'è una sola ampolla
PsIPLHR = [ps0; -1*NodiIPLHR(1,2)];
else
if spe1 <= 1
ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo IPLHR è data
% da ancora + segmento di pertinenza del primo nodo
else
ps1 = cell2mat(NodoInPlaceLinkHR(1,3))+0.5+Shift;
end
ps2 = zeros(rIPLHR-1,1);
for j = 2:rIPLHR
if j == 2
if SpeIPLHR(j+1,1) <= 1
psj = ps1 + SpeIPLHR(j+1,1);
else
psj = cell2mat(NodoInPlaceLinkHR(j,3))+0.5+Shift;
end
% la profondità a cui il nodo j di tipo Tilt Link HR rileva lo
% spostamento è data dalla somma fra il suo segmento di
% pertinenza e la profondità a cui rileva lo spostamento
% il nodo precedente
psPrec = psj; % mi serve come appoggio per il calcolo della
% profondità dello spostamento del nodo successivo
else
if SpeIPLHR(j+1,1) <= 1
psj = psPrec + SpeIPLHR(j+1,1);
else
psj = cell2mat(NodoInPlaceLinkHR(j,3))+0.5+Shift;
end
psPrec = psj;
end
ps2(j-1,1) = psj;
end
PsIPLHR = [ps0; ps1; ps2];
end
for i = 2:rIPLHR+1
if SpeIPLHR(i) > 1
SpeIPLHR(i) = 1;
end
end
if yesIPL == 1 % Se ci sono In Place Link, il segmento di pertinenza
% dell'ampolla lo scrivo considerando i nodi In Place Link sopra e
% sotto (se sono presenti)
salta = zeros(rIPLHR,1);
esco = 0; % entra o meno nel ciclo successivo
if yesIPLHR3D == 1
[dim,~] = size(NodoInPlaceLinkHR3D);
if rIPLHR == dim % vuol dire che tutti i nodi sono dopppi
esco = 1; % non entro nel ciclo successivo
end
end
if esco == 0
NodiIPLdown = zeros(rIPLHR,1);
NodiIPLup = zeros(rIPLHR,1);
ProfIPLHR = zeros(rIPLHR*3,1);
for i = 1:rIPLHR
prof = NodiIPLHR(i,2);
% cerco il nodo sotto all'Ampolla
B = NodiIPL(:,2) > prof; % uso > perchè il segno della profondità è +
A = NodiIPL(B,2);
if i == 1 % guardo se il primo nodo è Ampolla o Mems
C = isempty(A);
if C == 1 % il primo nodo è Ampolla
salta(i) = 1;
else
salta(i) = 0;
end
end
NodoIPLdown = A(end); % nodo In Place Link sotto all'Ampolla
% cerco il nodo dopo l'Ampolla
B = NodiIPL(:,2) < prof;
A = NodiIPL(B,2);
CC = isempty(A);
if C == 1 % Manca il nodo Sotto
salta(i) = 1;
else
if CC == 1 % ovvero se In Place Link e In Place Link HR sono nello
% stesso nodo doppio, ignoro il passaggio (manca
% il nodo sopra)
salta(i) = 1;
else
salta(i) = 0;
NodoIPLup = A(1);
NodiIPLdown(i,1) = NodoIPLdown;
NodiIPLup(i,1) = NodoIPLup; % Nodo In Place Link sopra all'ampolla
end
end
end
spe0 = 0; % segmento di pertinenza dell'ancora
if salta(1) == 1
spe1 = Nodi(1,2)-NodiIPLHR(1,2); % segmento di pertinenza del primo nodo
ii = 2;
else
spe1 = Nodi(1,2)-NodiIPLdown(1,1); % segmento di pertinenza del
% primo nodo. N.B.: Per funzionare correttamente, il primo nodo
% dopo l'ancora deve per forza essere un Tilt Link!
ii = 1;
end
spe2 = zeros(rIPLHR,1);
for i = ii:rIPLHR
spei = (NodiIPLdown(i,1)-NodiIPLup(i,1))/2;
spe2(i,1) = spei;
end
SpeIPLHR = [spe0; spe1; spe2];
% Calcolo profondità dello spostamento relativo
m = 1;
for i = 1:rIPLHR
if salta(i) == 1
if i == 1 % considero l'ancora
a = (Nodi(i,2)+NodiIPLHR(i,2))/2;
ProfIPLHR = PsIPLHR;
else
a = (NodiIPLHR(i-1,2)+NodiIPLHR(i,2))/2;
end
if i == rIPLHR % ultimo nodo
if salta(i) == 1
b = NodiIPLHR(i,2);
c = NodiIPLHR(i,2)+0.25;
else
b = (NodiIPLHR(i,2)+NodiIPLup(i))/2;
c = NodiIPLup(i)-(NodiIPLHR(i,2)-NodiIPLup(i))/2;
end
else
if salta(i+1) == 1
b = (NodiIPLHR(i,2)+NodiIPLHR(i+1,2))/2;
c = (NodiIPLHR(i+1,2)-(NodiIPLHR(i,2)-NodiIPLHR(i+1,2)))/2;
else
b = (NodiIPLHR(i,2)+NodiIPLup(i))/2;
c = NodiIPLup(i)-(NodiIPLHR(i,2)-NodiIPLup(i))/2;
end
end
else
a = (NodiIPLdown(i)+NodiIPLHR(i,2))/2;
b = (NodiIPLHR(i,2)+NodiIPLup(i))/2;
c = (NodiIPLup(i)-(NodiIPLHR(i,2)-NodiIPLup(i))/2);
end
ProfIPLHR(m,1) = a;
ProfIPLHR(m+1,1) = b;
ProfIPLHR(m+2,1) = c;
m = m+3;
end
end
end
text = 'Segments of relevance and calculation points of In Place Link HR defined correctly';
fprintf(fileID,fmt,text);
else
% Non ci sono nodi In Place Link HR
PsIPLHR = [];
SpeIPLHR = [];
end
%% In Place Link HR 3D
if yesIPLHR3D == 1
NodoIPLHR3D = zeros(rIPL,1);
t = 1;
for i=1:rIPL
for j=1:rIPLHR
if NodiIPL(i,2)==NodiIPLHR(j,2)
NodoIPLHR3D(t,1)=NodiIPL(i,2);
SpeIPLHR(j+1,1) = SpeIPL(i+1,1);
PsIPLHR(j+1,1) = PsIPL(i+1,1);
% il segmento di pertinenza dell'ampolla è identico al SP
% del corrispondente MEMS
t=t+1;
end
end
end
end
% Chiudo Testo
fclose(fileID);
end