Script_Analisis_PLANOS_Neuronas_1.m 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. function [Q, Intersecciones_Detalladas, Error_Length, Estimated_Axon_Length, Filas_Centros, Columnas_Centros, Z_Centros] = Script_Analisis_PLANOS_Neuronas_1 ( Cortes_XY_Axon, h_Cortes, Columnas_Rejilla, Rejilla_X, Filas_Rejilla, Rejilla_Y, Cortes, Grosor_Corte, Sampling_Box_X, Sampling_Box_Y, Sampling_box_height, Axon_Real_Length, dist_Planos )
  2. % Definimos los parámetros estereológicos:
  3. % h_Cortes = 2; % Analizamos un corte cada 'h_Cortes' cortes de la muestra
  4. % Creamos unos vectores con los centros de las celdas de la rejilla en que hemos dividido el corte; en esos centros irá la sonda esférica:
  5. Filas_Centros = Filas_Rejilla + Rejilla_Y/2;
  6. Columnas_Centros = Columnas_Rejilla + Rejilla_X/2;
  7. Z_Centros = Cortes + Grosor_Corte/2;
  8. Intersecciones_Detalladas = cell(size(Cortes_XY_Axon));
  9. Q = 0; % Intersecciones totales
  10. % Recorremos los cortes para analizar:
  11. for i = 1:h_Cortes:length(Cortes_XY_Axon)
  12. % Para cada corte generamos tres matrices, las dos primeras con los ángulos de azimutal y elevación de los planos en cada sampling box (o en cada celda de la rejilla):
  13. AZIM = pi - 2*pi*rand( length(Filas_Centros), length(Columnas_Centros) );
  14. ELEV = pi/2 - pi*rand( length(Filas_Centros), length(Columnas_Centros) );
  15. % La tercera con el onset, i.e.
  16. ONSET = dist_Planos*rand( length(Filas_Centros), length(Columnas_Centros) );
  17. % 'dummy_CORTE' contiene la distribución de ramas axónicas en cada celda de la rejilla de ese corte:
  18. dummy_CORTE = Cortes_XY_Axon{i, 1};
  19. % 'dummy_INTERSECCIONES' contiene las intersecciones en cada celda de la rejilla en que se dividió el corte. En cada celda, cada
  20. % intersección está codificada como un número que es la rama que en esa celda intersecta con la esfera:
  21. dummy_INTERSECCIONES = cell( length( Filas_Rejilla ), length( Columnas_Rejilla ) );
  22. ind_CORTE = find(~cellfun(@isempty, dummy_CORTE)); % índices de las ramas que aparecen en este corte
  23. for j = ind_CORTE % Recorremos las ramas de ese corte
  24. [row_a, col_a] = find(~cellfun(@isempty, dummy_CORTE{1, j})); % para cada rama estos son los índices de las celdas de ese corte en el que aparecen dichas ramas
  25. % row_a_Y = length( Filas_Rejilla ) - row_a + 1; % Le damos la vuela porque los índices empiezan por arriba (índices matriciales), pero hemos generado la rejilla empezando por abajo en la Y, i.e. por los negativos.
  26. for k = 1:length(row_a) % Recorremos los índices de las celdas de ese corte en el que aparece la presente rama
  27. dummy_a = dummy_CORTE{1, j}{row_a(k), col_a(k)}; % Coordenadas de los puntos de la rama cuya intersección estamos estudiando
  28. % Nos quedamos sólo con los puntos de la rama que están dentro de la sampling box:
  29. % ind_sampling_box = (abs( dummy_a(:, 1) - Columnas_Centros(col_a(k)) ) <= Sampling_Box_X/2) &...
  30. % (abs( dummy_a(:, 2) - Filas_Centros(row_a(k)) ) <= Sampling_Box_Y/2) &...
  31. % (abs( dummy_a(:, 3) - Z_Centros(i) )) <= Sampling_box_height/2;
  32. % dummy_b = dummy_a( ind_sampling_box, : );
  33. % Obtenemos los cortes entre ese trozo de rama y la sampling box, incluidos los puntos de dentro, para coger toda la longitud de la rama:
  34. dummy_b = Corte_Rama_Samplng_Box( dummy_a, Columnas_Centros(col_a(k)), Filas_Centros(row_a(k)), Z_Centros(i), Sampling_Box_X, Sampling_Box_Y, Sampling_box_height );
  35. if ~isempty( dummy_b ) % Si hay algún punto de la rama en la sampling box pasamos a los cortes con los planos
  36. % Num intersecciones con los planos
  37. num_inters = Cortes_con_Planos_Virtuales( AZIM( row_a(k), col_a(k) ), ELEV( row_a(k), col_a(k) ), ONSET( row_a(k), col_a(k) ), ( dummy_b(:, 1:3) )', dist_Planos );
  38. % Metemos los índices de las ramas que intersectan los planos, en la celda adecuada de 'dummy_INTERSECCIONES':
  39. if num_inters > 0
  40. dummy_INTERSECCIONES{row_a(k), col_a(k)} = [dummy_INTERSECCIONES{row_a(k), col_a(k)}; repmat(j, num_inters, 1) ];
  41. % Añadimos estas intersecciones al número total:
  42. Q = Q + num_inters;
  43. end
  44. end
  45. end
  46. end
  47. Intersecciones_Detalladas{i, 1} = dummy_INTERSECCIONES;
  48. end
  49. % %% Estimación de la longuitud del axón
  50. % clc
  51. % Section Sampling Fraction ( ssf ) = the fraction of the total number of sections containing the reference space
  52. % that were actually used in the analysis, es decir, cada cuantos cortes tomamos uno para analizar con las esferas.
  53. % Por ejemplo, si tomamos 1 corte de cada 8 --> ssf = 1/8;
  54. ssf = 1/h_Cortes;
  55. % Area Sampling Fraction ( asf ) = the fraction of the area of the profiles of the reference volume seen in the sections
  56. % that were sampled by the sampling boxes that contained the spherical probes (profiles son los que aparece del axón
  57. % cuando éste se corta con un plano de enfoque paralelo a XY); ver Figs. 6, 7 y 8 de "Stereological length estimation using spherical probes";
  58. % El 'frame' es la caja en la que se introduce la esfera; esa caja luego se introduce en la celda de la rejilla en que se ha dividido el corte.
  59. % Es el area_frame / area x-y step
  60. % lado_x_Frame = 50; % en micras
  61. % lado_y_Frame = 50; % en micras
  62. asf = Sampling_Box_X*Sampling_Box_Y / ( Rejilla_X*Rejilla_Y );
  63. % Thickness Sampling Fraction ( tsf ) = the fraction of the final, i.e. after-processing, section thickness sampled by
  64. % the sampling boxes = 1//(sampling box height/section thickness).
  65. % sampling_box_height = 50; % en micras
  66. hsf = Sampling_box_height / Grosor_Corte;
  67. % Longitud axón estimada:
  68. Estimated_Axon_Length = 2*Q*dist_Planos*( 1/ssf )*( 1/asf )*( 1/hsf );
  69. % %% Error de la esitimación
  70. Error_Length = ( Axon_Real_Length - Estimated_Axon_Length )*100/Axon_Real_Length;