Scheduled service maintenance on November 22


On Friday, November 22, 2024, between 06:00 CET and 18:00 CET, GIN services will undergo planned maintenance. Extended service interruptions should be expected. We will try to keep downtimes to a minimum, but recommend that users avoid critical tasks, large data uploads, or DOI requests during this time.

We apologize for any inconvenience.

Export_Axons_Neuromorph_4.m 4.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. %
  2. function Export_Axons_Neuromorph_4( 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. Ind_Repet = [Ind_Repet; i];
  70. end
  71. end
  72. % Salvamos los datos
  73. filename_new = filename(1:end-4); % Quitamos la extensión .swc
  74. save([filename_new, '.mat']);
  75. end
  76. end