PRUEBA_I_Script_Analisis_PLANOS_Neuronas_1.m 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. function [Q, Intersecciones_Detalladas, Error_Length, Estimated_Axon_Length, Filas_Centros, Columnas_Centros, Z_Centros] = PRUEBA_I_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, AZIM_0, ELEV_0, ONSET_0 )
  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 = AZIM_0(:, :, i);
  14. ELEV = ELEV_0(:, :, i);
  15. % AZIM = pi - 2*pi*rand( length(Filas_Centros), length(Columnas_Centros) );
  16. % ELEV = pi/2 - pi*rand( length(Filas_Centros), length(Columnas_Centros) );
  17. % La tercera con el onset, i.e.
  18. % ONSET = dist_Planos*rand( length(Filas_Centros), length(Columnas_Centros) );
  19. ONSET = dist_Planos*ONSET_0(:, :, i);
  20. % 'dummy_CORTE' contiene la distribución de ramas axónicas en cada celda de la rejilla de ese corte:
  21. dummy_CORTE = Cortes_XY_Axon{i, 1};
  22. % 'dummy_INTERSECCIONES' contiene las intersecciones en cada celda de la rejilla en que se dividió el corte. En cada celda, cada
  23. % intersección está codificada como un número que es la rama que en esa celda intersecta con la esfera:
  24. dummy_INTERSECCIONES = cell( length( Filas_Rejilla ), length( Columnas_Rejilla ) );
  25. ind_CORTE = find(~cellfun(@isempty, dummy_CORTE)); % índices de las ramas que aparecen en este corte
  26. for j = ind_CORTE % Recorremos las ramas de ese corte
  27. [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
  28. % 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.
  29. for k = 1:length(row_a) % Recorremos los índices de las celdas de ese corte en el que aparece la presente rama
  30. dummy_a = dummy_CORTE{1, j}{row_a(k), col_a(k)}; % Coordenadas de los puntos de la rama cuya intersección estamos estudiando
  31. % Nos quedamos sólo con los puntos de la rama que están dentro de la sampling box:
  32. ind_sampling_box = (abs( dummy_a(:, 1) - Columnas_Centros(col_a(k)) ) <= Sampling_Box_X/2) &...
  33. (abs( dummy_a(:, 2) - Filas_Centros(row_a(k)) ) <= Sampling_Box_Y/2) &...
  34. (abs( dummy_a(:, 3) - Z_Centros(i) )) <= Sampling_box_height/2;
  35. dummy_b = dummy_a( ind_sampling_box, : );
  36. % 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:
  37. % 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 );
  38. if ~isempty( dummy_b ) % Si hay algún punto de la rama en la sampling box pasamos a los cortes con los planos
  39. % Num intersecciones con los planos
  40. 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 );
  41. % Metemos los índices de las ramas que intersectan los planos, en la celda adecuada de 'dummy_INTERSECCIONES':
  42. if num_inters > 0
  43. dummy_INTERSECCIONES{row_a(k), col_a(k)} = [dummy_INTERSECCIONES{row_a(k), col_a(k)}; repmat(j, num_inters, 1) ];
  44. % Añadimos estas intersecciones al número total:
  45. Q = Q + num_inters;
  46. end
  47. end
  48. end
  49. end
  50. Intersecciones_Detalladas{i, 1} = dummy_INTERSECCIONES;
  51. end
  52. % %% Estimación de la longuitud del axón
  53. % clc
  54. % Section Sampling Fraction ( ssf ) = the fraction of the total number of sections containing the reference space
  55. % that were actually used in the analysis, es decir, cada cuantos cortes tomamos uno para analizar con las esferas.
  56. % Por ejemplo, si tomamos 1 corte de cada 8 --> ssf = 1/8;
  57. ssf = 1/h_Cortes;
  58. % Area Sampling Fraction ( asf ) = the fraction of the area of the profiles of the reference volume seen in the sections
  59. % that were sampled by the sampling boxes that contained the spherical probes (profiles son los que aparece del axón
  60. % 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";
  61. % 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.
  62. % Es el area_frame / area x-y step
  63. % lado_x_Frame = 50; % en micras
  64. % lado_y_Frame = 50; % en micras
  65. asf = Sampling_Box_X*Sampling_Box_Y / ( Rejilla_X*Rejilla_Y );
  66. % Thickness Sampling Fraction ( tsf ) = the fraction of the final, i.e. after-processing, section thickness sampled by
  67. % the sampling boxes = 1//(sampling box height/section thickness).
  68. % sampling_box_height = 50; % en micras
  69. hsf = Sampling_box_height / Grosor_Corte;
  70. % Longitud axón estimada:
  71. Estimated_Axon_Length = 2*Q*dist_Planos*( 1/ssf )*( 1/asf )*( 1/hsf );
  72. % %% Error de la esitimación
  73. Error_Length = ( Axon_Real_Length - Estimated_Axon_Length )*100/Axon_Real_Length;