Export_Axons_Neuromorph_3.m 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. %
  2. function Export_Axons_Neuromorph_3( filename )
  3. % Leemos un archivo .swc. Obtenemos una tabla
  4. LL = importdata(filename, ' ');
  5. if ~isfield(LL, 'data')
  6. warning('¡Hay que importar a mano!');
  7. disp(filename(end-13:end));
  8. else
  9. A = LL.data;
  10. if size(A, 2) ~= 7 && size(A, 2) ~= 3
  11. warning('¡Hay que importar a mano!');
  12. disp(filename(end-13:end));
  13. else
  14. if size(A, 2) == 3
  15. A = Preparar_SWC_Raro( LL );
  16. end
  17. A = A(:, 2:end);
  18. AXON = A(A(:, 1) == 2, :);
  19. % Organizamos el axon por ramas como una cell.
  20. % Buscamos los ínidices de la columna 6 que estén repetidos; esos indicarán branching y por lo tanto señalarán ramas distintas:
  21. [~, idx ] = unique(AXON(:, 6), 'stable');%don't sort
  22. fila = setxor(1:numel(AXON(:, 6)), idx);
  23. % ind2 = AXON(idx, 6);
  24. AXON_Cell = {};
  25. % Recorremos de mos a más los índices de los puntos en el axón:
  26. rama = 1;
  27. dummy = [];
  28. Ind_Repet = [];
  29. for i = 1:size(AXON, 1)
  30. if ~ismember( AXON(i, 6), AXON(fila, 6) ) % El punto del AXON en el que estamos NO está repetido; seguimos almacenando los puntos de la rama
  31. dummy = [dummy; [AXON(i, 2), AXON(i, 3), AXON(i, 4), AXON(i, 6)]];
  32. if i == size(AXON, 1) % Se acaban los índices y guardamos la rama
  33. % Pegamos la rama al árbol:
  34. ind0 = find( AXON(:, 2) == dummy(1, 1) & AXON(:, 3) == dummy(1, 2) & AXON(:, 4) == dummy(1, 3) ); % fila del primer elemento de la rama
  35. if ind0 > 1
  36. if AXON(ind0-1, 6) + 1 == dummy(1, 4)
  37. ind1 = ind0 - 1; % Tomamos el índice del punto anterior al primero de la rama
  38. else % se ramifica.
  39. ind1 = find( AXON(:, 6) == dummy(1, 4) ); % debe tener dos elementos;
  40. ind1 = ind1(1); % tomamos el primero
  41. end
  42. dummy = [[AXON(ind1, 2), AXON(ind1, 3), AXON(ind1, 4), AXON(ind1, 6)]; dummy];
  43. end
  44. AXON_Cell{1, rama} = dummy; % Guardamos la rama que acaba
  45. end
  46. else % El punto de AXON en el que estamos SÍ está repetido; creamos una rama nueva
  47. % AXON_Cell{1, rama} = [dummy; [AXON(i, 2), AXON(i, 3), AXON(i, 4), AXON(i, 6)]]; % Guardamos la rama que acaba
  48. % Empalmamos esta rama al árbol. Tomamos el índice del primer punto de la rama. Si ese índice es mayor que 1 y el índice del anterior
  49. % punto + 1 es igual a ese, entonces ponemos el anterior punto primero en la rama. Si no lo es, significa que el anterior punto de la rama
  50. % es una bifurcación; la buscamos y la ponemos en primer lugar en la rama:
  51. % if AXON(i, 6) == 1
  52. if i == 1
  53. dummy = [AXON(i, 2), AXON(i, 3), AXON(i, 4), AXON(i, 6)];
  54. end
  55. ind0 = find( AXON(:, 2) == dummy(1, 1) & AXON(:, 3) == dummy(1, 2) & AXON(:, 4) == dummy(1, 3) ); % fila del primer elemento de la rama
  56. if ind0 > 1
  57. if AXON(ind0-1, 6) + 1 == dummy(1, 4)
  58. ind1 = ind0 - 1; % Tomamos el índice del punto anterior al primero de la rama
  59. else % se ramifica.
  60. ind1 = find( AXON(:, 6) == dummy(1, 4) ); % debe tener dos elementos;
  61. ind1 = ind1(1); % tomamos el primero
  62. end
  63. dummy = [[AXON(ind1, 2), AXON(ind1, 3), AXON(ind1, 4), AXON(ind1, 6)]; dummy];
  64. end
  65. AXON_Cell{1, rama} = dummy; % Guardamos la rama que acaba
  66. % Comenzamos una nueva rama
  67. rama = rama + 1; % índice de la rama en la que nos encontramos
  68. dummy = [AXON(i, 2), AXON(i, 3), AXON(i, 4), AXON(i, 6)]; % Guardamos en la rama como primer punto, el punto repetido
  69. if i == size(AXON, 1) % Se acaban los índices y guardamos la rama
  70. % Pegamos la rama al árbol:
  71. ind0 = find( AXON(:, 2) == dummy(1, 1) & AXON(:, 3) == dummy(1, 2) & AXON(:, 4) == dummy(1, 3) ); % fila del primer elemento de la rama
  72. if ind0 > 1
  73. if AXON(ind0-1, 6) + 1 == dummy(1, 4) % En este caso el punto anterior continúa a este punto (no hay ramificación)
  74. ind1 = ind0 - 1; % Tomamos el índice del punto anterior al primero de la rama
  75. else
  76. if AXON(ind0-1, 6) == dummy(1, 4) % Este punto y el anterior tienen el mísmo parent index
  77. ind1 = ind0-2;
  78. else% se ramifica.
  79. ind1 = find( AXON(:, 6) == dummy(1, 4) ); % debe tener dos elementos;
  80. ind1 = ind1(1); % tomamos el primero
  81. end
  82. end
  83. dummy = [[AXON(ind1, 2), AXON(ind1, 3), AXON(ind1, 4), AXON(ind1, 6)]; dummy];
  84. end
  85. AXON_Cell{1, rama} = dummy; % Guardamos la rama que acaba
  86. end
  87. Ind_Repet = [Ind_Repet; i];
  88. end
  89. end
  90. % Salvamos los datos
  91. filename_new = filename(1:end-4); % Quitamos la extensión .swc
  92. save([filename_new, '.mat']);
  93. end
  94. end