Ir al contenido



Foto

Decodificar coordenadas de un plano cartesiano en base64

#decodificarBase64 #PlanoCartesiano #EstablecerDiscriminantes #equiposBiomedicos #array #Tchart #delphi7 #perfeccionaRutina

  • Por favor identifícate para responder
14 respuestas en este tema

#1 MarCaribe

MarCaribe

    Member

  • Miembros
  • PipPip
  • 34 mensajes

Escrito 17 abril 2019 - 03:01

Buenas tardes gente,

 

Estoy realizando la decodificacion de tramas en base64, bajo el lenguaje delphi7, efectivamente ya he visto varios hilos relacionados al tema los cuales me han sido muy útiles e ido mejorando.

 

Les comento: tengo varias tramas codificadas en base64, las cuales contienen estas imágenes fQsR0Zk(https://ibb.co/fQsR0Zk) que  necesito replicar exactamente en delphi7. Dicho esto me gustaría vieran lo que he logrado aquí => (https://ibb.co/c3PmMw8). todas las gráficas que debo extraer se dividen en histogramas y disperso gramas. 

 

Ahora bien, tengo explicita mente dos problemas, cuales son:

 

1. La trama recibida del equipo medico trae varios campos y justo antes del campo que trae la trama codificada, vienen unos datos que delimitan los histogramas asi (<<32\200|AAAAAAAAA......>>), es decir discriminan-tes, la campana del histograma me las devuelve correctamente pero no caen dentro del rango correcto. Por ejemplo: decodifico un histograma PLT y la figura es extraída correctamente pero debe estar dentro de un discriminaste de 30 y 200 sobre el eje x, pero ese detalle obviamente no lo trae la trama, por lo que debo especificarlo yo en el tchart sobre el que dibujo el gráfico, ya he buscado y manejado las propiedades axis de estos componentes y no se como establecerle dichos discriminantes.

 

2. Los dispersogramas no me dan las orientaciones correspondientes a las solicitadas en el tchart... (mi jefe esta q me ahorca jaj!. y no se que hacer).

 

Me gustaría mostrarles el código implementado para cada gráfico (histogramas y dispersogramas) y me corrijáis si estoy haciendo algo incorrecto:

 

NOTA IMPORTANTE: leer el adjunto que les adjunte de como tratar los dispersogramas, no se como tratar las tramas como 2000 arrays de 5 bytes.... AYUDA POR FAVOR!!


delphi
  1. //lo unico que me falta en este codigo es establecerle los discriminantes sobre el eje x y SOBRE EL COMPONENTE Tchart.
  2. //que aún no consigo establecerle, ya que al hacer uso de la propiedad axis y ticks y grids, no hallo la forma de establecerlos
  3. procedure TFrHistogramas.dibujarHistogramas(memo: TMemo;serie: TChartSeries);
  4. var
  5. datos_codificado: PByteArray;
  6. i,longitud: Integer;
  7. begin
  8. serie.Clear;
  9. if Length(Trim(memo.Lines.Text)) > 0 then begin
  10. datos_codificado:= StrToBin(memo.Lines.Text, longitud, True);
  11. if (datos_codificado <> nil) and (longitud > 0) then begin
  12. try
  13. with serie do
  14. begin
  15. Marks.Visible:= False;
  16. for i:=0 to longitud -1 do
  17. Add(datos_codificado[i]);
  18. end;
  19. finally
  20. FreeMem(datos_codificado);
  21. end;
  22. end;
  23. end;
  24. end;
  25.  
  26.  
  27. //en este codigo aparte de establecerle los discriminantes, no logro replicar las orientaciones de las
  28. //coordenadas correctamente por lo que el grafico sale distorsionado
  29. procedure TFrScatterGram.dibujarScattergram(memo: TMemo; serie: TChartSeries);
  30. var
  31. datos_codificado: PByteArray;
  32. x, y, i, longitud, color: Integer;
  33. begin
  34. serie.Clear;
  35. i:=0;
  36. if Length(Trim(memo.Lines.Text)) > 0 then begin
  37. datos_codificado:= PByteArray(StrToBin(memo.Lines.Text, longitud, True));
  38. if (datos_codificado <> nil) and (longitud > 0) then begin
  39. try
  40. with serie do begin
  41. //para mi: el error esta aqui en la forma de leer los bytes, NO SE QUE HACER...
  42. while i < (longitud div 5) do begin
  43. x:= datos_codificado[i] and $FF;
  44. y:= (datos_codificado[i+1]);
  45. //color:= datos_codificado[i] shr RGB(255 * Random(1), 255 * Random(1), 255 * Random(1));
  46. i:=i+2;
  47. AddXY(x,y, '', clWhite);
  48. end;
  49. end;
  50. finally
  51. FreeMem(datos_codificado);
  52. end;
  53. end;
  54. end;
  55. end;

adjuntarles también las tramas en base64 correspondientes a los dispersogramas (que es lo que mas imperativo en este momento). Estoy "casi segura" que el error esta en como se están leyendo los bytes. (archivo TRAMAS.txt).

Y adjunto también información relacionada en el manual respecto a como tratar los dispersogramas. (Manual_comoTratarDispersogramas.txt).

 

Agradezco vuestra ayuda en el tema y me colaboréis en el perfeccionamiento de estos gráficos ya que no se que mas hacer.

Muchas gracias antes que nada por leer este post

;)  8o|

 

 

 

 

Archivos adjuntos


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.876 mensajes
  • LocationMadrid - España

Escrito 18 abril 2019 - 04:34

Yo modificaría tu código así:


delphi
  1. procedure TFrScatterGram.dibujarScattergram(D: String; Tipo: integer; serie: TChartSeries);
  2. var
  3. datos_codificado: PByteArray;
  4. x, y, i, longitud, color: Integer;
  5. begin
  6. serie.Clear;
  7. i:=0;
  8. if Length(Trim(D)) > 0 then begin
  9. datos_codificado:= PByteArray(StrToBin(D, longitud, True));
  10. if (datos_codificado <> nil) and (longitud > 0) then begin
  11. try
  12. with serie do begin
  13. while i < longitud do begin
  14. Color:= GetColor(datos_codificado[i+Tipo-1]);
  15. y:= datos_codificado[i];
  16. x:= (datos_codificado[i+1]);
  17. i:=i+Tipo;
  18. AddXY(x,y, '', Color);
  19. end;
  20. end;
  21. finally
  22. FreeMem(datos_codificado);
  23. end;
  24. end;
  25. end;
  26. end;

Tipo es 4 0 5 dependiendo del numero e bytes que  ocupa un dato WBC o RTC ocupan 5 bytes mientras que RBC/PLT ocupan 4
El color lo puedes calcular con esta función:
 


delphi
  1. function GetColor(CT: integer): TColor;
  2. begin
  3. Result:= 0;
  4. case CT of
  5. 0: Result:= RGB(160, 160, 160);
  6. 1: Result:= RGB(0, 255, 255);
  7. 2: Result:= RGB(250, 0, 250);
  8. 3: Result:= RGB(255, 255, 255);
  9. 4: Result:= RGB(255, 255, 0);
  10. 5: Result:= RGB(0, 255, 0);
  11. 6: Result:= RGB(160, 160, 160);
  12. 7: Result:= RGB(250, 175, 160);
  13. 8: Result:= RGB(250, 175, 160);
  14. 9: Result:= RGB(255, 80, 80);
  15. 10: Result:= RGB(255, 255, 0);
  16. 11: Result:= RGB(0, 255, 255);
  17. 12: Result:= RGB(250, 0, 250);
  18. 13: Result:= RGB(255, 255, 255);
  19. 14: Result:= RGB(255, 80, 80);
  20. 15: Result:= RGB(255, 255, 0);
  21. 16: Result:= RGB(102, 102, 255);
  22. 17: Result:= RGB(0, 255, 255);
  23. 18: Result:= RGB(255, 255, 255);
  24. 19: Result:= RGB(160, 160, 160);
  25. 20: Result:= RGB(160, 160, 160);
  26. 21: Result:= RGB(160, 160, 160);
  27. end;
  28. end;

Este es el resultado después de interpretar el discriminante de la traza que mandas
acb276f211ac6fb87b9a870c0234bf94o.png

Y este es la otra traza:

c8853696b9634ae867a9c617028b5734o.png
 

 

Saludos.


  • 1

#3 MarCaribe

MarCaribe

    Member

  • Miembros
  • PipPip
  • 34 mensajes

Escrito 22 abril 2019 - 07:33

Yo modificaría tu código así:


delphi
  1. procedure TFrScatterGram.dibujarScattergram(D: String; Tipo: integer; serie: TChartSeries);
  2. var
  3. datos_codificado: PByteArray;
  4. x, y, i, longitud, color: Integer;
  5. begin
  6. serie.Clear;
  7. i:=0;
  8. if Length(Trim(D)) > 0 then begin
  9. datos_codificado:= PByteArray(StrToBin(D, longitud, True));
  10. if (datos_codificado <> nil) and (longitud > 0) then begin
  11. try
  12. with serie do begin
  13. while i < longitud do begin
  14. Color:= GetColor(datos_codificado[i+Tipo-1]);
  15. y:= datos_codificado[i];
  16. x:= (datos_codificado[i+1]);
  17. i:=i+Tipo;
  18. AddXY(x,y, '', Color);
  19. end;
  20. end;
  21. finally
  22. FreeMem(datos_codificado);
  23. end;
  24. end;
  25. end;
  26. end;

Tipo es 4 0 5 dependiendo del numero e bytes que  ocupa un dato WBC o RTC ocupan 5 bytes mientras que RBC/PLT ocupan 4
El color lo puedes calcular con esta función:
 


delphi
  1. function GetColor(CT: integer): TColor;
  2. begin
  3. Result:= 0;
  4. case CT of
  5. 0: Result:= RGB(160, 160, 160);
  6. 1: Result:= RGB(0, 255, 255);
  7. 2: Result:= RGB(250, 0, 250);
  8. 3: Result:= RGB(255, 255, 255);
  9. 4: Result:= RGB(255, 255, 0);
  10. 5: Result:= RGB(0, 255, 0);
  11. 6: Result:= RGB(160, 160, 160);
  12. 7: Result:= RGB(250, 175, 160);
  13. 8: Result:= RGB(250, 175, 160);
  14. 9: Result:= RGB(255, 80, 80);
  15. 10: Result:= RGB(255, 255, 0);
  16. 11: Result:= RGB(0, 255, 255);
  17. 12: Result:= RGB(250, 0, 250);
  18. 13: Result:= RGB(255, 255, 255);
  19. 14: Result:= RGB(255, 80, 80);
  20. 15: Result:= RGB(255, 255, 0);
  21. 16: Result:= RGB(102, 102, 255);
  22. 17: Result:= RGB(0, 255, 255);
  23. 18: Result:= RGB(255, 255, 255);
  24. 19: Result:= RGB(160, 160, 160);
  25. 20: Result:= RGB(160, 160, 160);
  26. 21: Result:= RGB(160, 160, 160);
  27. end;
  28. end;

Este es el resultado después de interpretar el discriminante de la traza que mandas
acb276f211ac6fb87b9a870c0234bf94o.png

Y este es la otra traza:

c8853696b9634ae867a9c617028b5734o.png
 

 

Saludos.

 

Wow, enserio escandrafa, sos un duro, ese gráfico de dispersión te dio tal cual... sin embargo el segundo sigue siendo bastante difícil de interpretar :( ....

 

Escandrafa, me gustaría saber como lograste sacar el discriminan-te, en esa gráfica usando el tchart. Pues me interesaría revisar el criterio que usas (quizás no logro ver como lo extraes o en que lineas se tiene en cuenta el discriminan-te), para aplicarlo a los demás diagramas que tengo por delante, muchísimas gracias  :cool:   :angel: !!!.

 

has sido de demasiada ayuda en este viaje! mil y mil gracias por compartir tus conocimientos.


  • 0

#4 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.876 mensajes
  • LocationMadrid - España

Escrito 22 abril 2019 - 02:00

En el caso del Dispersograma 1 y según la documentación que aportas, el discriminante se obtiene de esta cadena: 10^0^0^28^75^28^101^63^255^63 interpretada como pares de puntos
(10,0) (0,28) (75,28) (101,63) (255,63)
 
El código que he usado para interpretar toda la cabecera y pintar el discriminante en el TChart es este:

delphi
  1. procedure TForm1.Descriptor(D: String);
  2. var
  3. x,y,i, n: integer;
  4. begin
  5. if D[2] <> '|' then exit;
  6. i:= Length(D);
  7. while D[i] <> '|' do dec(i); dec(i);
  8. while (D[i] <> '\') and (D[i] <> '|') do dec(i);
  9. n:= i;
  10. while D[n] <> '|' do
  11. begin
  12. inc(n);
  13. i:= n;
  14. while D[n] <> '^' do inc(n);
  15. x:= StrToInt(Copy(D, i, n-i));
  16. inc(n); i:= n;
  17. while (D[n] <> '^') and (D[n] <> '|') do inc(n);
  18. y:= StrToInt(Copy(D, i, n-i));
  19. Chart.Series[1].AddXY(x, y, '', clWhite);
  20. end;
  21. end;

En el  caso del segundo, no tiene discriminante, está en blanco: M|2|S|RBC/PLT|0^10^90^CT||  (Nada entre las dos ultimas barras verticales) Si los datos se interpretan como en el primer caso, el resultado es el que mostré. Ignoro otro tipo de interpretación y no aparece en la documentación que aportas. No sabiendo el resultado final de antemano, también es complicado acercarse.
 
 
Saludos.
  • 0

#5 MarCaribe

MarCaribe

    Member

  • Miembros
  • PipPip
  • 34 mensajes

Escrito 22 abril 2019 - 02:22

Tienes razón escafandra, realmente no hay mas información relevante para el segundo disperso-grama el cual de ninguna de las formas implementadas hasta el momento arroja el gráfico deseado. y por el código del discriminan te, muchísimas gracias nuevamente por tu ayuda.


  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.012 mensajes
  • LocationMéxico

Escrito 22 abril 2019 - 03:00

Excelente aportación didáctica amigo Escafandra. Siempre aprendemos algo con sus respuestas. (y)

 

(b)


  • 0

#7 MarCaribe

MarCaribe

    Member

  • Miembros
  • PipPip
  • 34 mensajes

Escrito 22 abril 2019 - 04:19

siii egostar..... Escafandra es de mucha ayuda :)  :ap:


  • 1

#8 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.876 mensajes
  • LocationMadrid - España

Escrito 23 abril 2019 - 05:54

Jugando con la trama de dispersión 1 he obtenido este gráfico que se parece mucho a uno de los ejemplos que mandas:

17b40087df4a90889f23f8c099b7de8bo.png

[img=Whats-App-Image-2019-04-11-at-11-27-15.j 

Hace falta mas información que el manual que expones para interpretar bien esas etiquetas de las que habla.


Saludos.
  • 0

#9 MarCaribe

MarCaribe

    Member

  • Miembros
  • PipPip
  • 34 mensajes

Escrito 24 abril 2019 - 02:01

Jugando con la trama de dispersión 1 he obtenido este gráfico que se parece mucho a uno de los ejemplos que mandas:

17b40087df4a90889f23f8c099b7de8bo.png

[img=Whats-App-Image-2019-04-11-at-11-27-15.j 

Hace falta mas información que el manual que expones para interpretar bien esas etiquetas de las que habla.


Saludos

 

Escafandra, realmente como lo haces... sos un durooo realmente. Pues la info que te pase es exactamente la misma que a mi me dieron para poder extraer los gráficos. realmente no tengo mas de donde agarrar, estabas con otros pendientes de la oficina y hasta ahora tomo nuevamente este desarrollo nuevamente. Mil y mil gracias. escafandra. 
Te agradecería mucho si pudieras pasarme el juego que hiciste con la trama y el código  (h)  (y)  :ap: (que hiciste o como leiste los bytes para que te dieran??? :huh: ). Sos realmente un genio.


  • 0

#10 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.876 mensajes
  • LocationMadrid - España

Escrito 24 abril 2019 - 04:47

Escafandra, realmente como lo haces... sos un durooo realmente. Pues la info que te pase es exactamente la misma que a mi me dieron para poder extraer los gráficos. realmente no tengo mas de donde agarrar, estabas con otros pendientes de la oficina y hasta ahora tomo nuevamente este desarrollo nuevamente. Mil y mil gracias. escafandra. 
Te agradecería mucho si pudieras pasarme el juego que hiciste con la trama y el código  (h)  (y)  :ap: (que hiciste o como leiste los bytes para que te dieran??? :huh: ). Sos realmente un genio.

Pues no soy ningún genio, simplemente me fijé en ciertos detalles que paso a explicarte.

 

Tu pasaste dos tramas, una primera del tipo WBC y otra del tipo RBC/PLT. También pasaste dos ejemplos de graficos de Dispersograma, as´que en un primer momento pensé que cada uno correspondía a una de las tramas dadas.

 

El primer caso es del tipo 5 bytes, como dice el manual es  0 10 90 90D CT siendo el CT el código de color del quinteto. Si representamos la pareja 10, 0 (2º contra 1º Bytes) nos da el gráfico que ya conoces como el primer gráfico que mostraste y que obtuvimos, pero si representamos 90 90D (3º Contra 4º bytes) entonces el resultado es el segundo gráfico que mostraste en los ejemplos.

Así que de la primera trama obtenemos ambos gráficos:
fa89d96eb0ff1a7fba4aa02f7233135ao.png
 
La segunda trama que enviaste, lógicamente no tiene nada que ver con ninguno de los dos gráficos anteriores.
 
Visto esto, quedan flecos al interpretar las etiquetas de medición y los discriminantes pues el manual no lo deja claro.
 


Mira la cabecera de la trama 1:


cpp
  1. M|1|S|WBC|0^10^90^90D^CT|90^10^0^133^199^0\90D^90^0^0^255^81\10^0^0^28^75^28^101^63^255^63|

La primera parte solo indica que es un dispersograma de 5 bytes:


cpp
  1. M|1|S|WBC|0^10^90^90D^CT|

Esta parte indica cada uno de los dos disperogramas que contiene la traza:


cpp
  1. 90^10^0^133^199^0\90D^90^0^0^255^81\

Pero el manual lo describe como dos simples etiquetas.
 
Tenemos:
1.- Un dispersograma representando los pares byte 1 contra byte 0: (10 - 0)
2.- Un dispersograma representando los pares byte 2 contra byte 3: (90 - 90D)
Hecho así la gráfica sale pero no guarda relación con las etiquetas mostradas.
 
El discriminante del gráfico 1 sale de la ultima parte de la cabecera de la que salen estos puntos (10,0) (0,28) (75,28) (101,63) y (255,63)  de estos puntos el que molesta para obtener la similitud con tu ejemplo1 es el primer punto, de forma que si tomamos sólo (0,28) (75,28) (101,63) y (255,63) nos sale clavado
Pero para el segundo dispersograma ya no está claro el discriminante. En el ejemplo parece una recta con origen en (0,0) y final en (255,80) aproximadamente lo que se asemeja a esta parte de la etiqueta 2 (llamada Y en el manual y eso despista mucho) 255^81 Pero como esto no está explicado en el manual ni porqué en el disperso grama2 se obtenga de esa etiqueta y no en el 1, todo esto pasa al terreno de la conjetura.
 
En resumen, los gráficos salen porque conocemos el resultado pero no de la correcta interpretación de la cabecera y es por eso que indico que faltan cosas o la trama de ejemplo no es exactamente lo que debe ser.
 
Para finalizar te indico como es el código:


delphi
  1. with serie do begin
  2. while i < longitud do begin
  3. Color:= GetColor(datos_codificado[i+Tipo-1]);
  4. // Para disoersograma 1
  5. x:= (datos_codificado[i+1]);
  6. y:= datos_codificado[i];
  7. // Para Disoersograma 2
  8. // x:= (datos_codificado[i+2]);
  9. // y:= datos_codificado[i+3];
  10. i:=i+Tipo;
  11. AddXY(x,y, '', Color);
  12. end;
  13. end;

Saludos.


  • 0

#11 MarCaribe

MarCaribe

    Member

  • Miembros
  • PipPip
  • 34 mensajes

Escrito 24 abril 2019 - 05:03

hola escafandra, tomando tu cita...
 


Pero para el segundo dispersograma ya no está claro el discriminante. En el ejemplo parece una recta con origen en (0,0) y final en (255,80) aproximadamente lo que se asemeja a esta parte de la etiqueta 2 (llamada Y en el manual y eso despista mucho) 255^81 Pero como esto no está explicado en el manual ni porqué en el disperso grama2 se obtenga de esa etiqueta y no en el 1, todo esto pasa al terreno de la conjetura.

 



Que es muy buena por cierto, ya me había dado cuenta de ese detalle del discriminan-te, pero no tuve la perspicacia de detallar la primera trama de dispersión, ya que al recibir la información del equipo hematólogo, nosotros recibimos 6 tramas diferentes, por lo que se asume que cada una es independiente para el gráfico respectivo, Sin embargo yo estaba enfatizada solo en la segunda trama del disperso-grama, la cual no da mucha luz como lo has dicho...
 
Respecto a esto que dices,
 
"Si representamos la pareja 10, 0 (2º contra 1º Bytes) nos da el gráfico que ya conoces como el primer grafico que mostraste y que obtuvimos
Pero si representamos 90D 90 (4º Contra 3º bytes) entonces el resultado es el segundo gráfico que mostraste en los ejemplos."
 
Aún no logro entender a claridad... o cabalmente esa parte de la lectura de los bytes y canales de los que ellos hablan en el manual.
Al momento de interpretar eso en el código, tiendo a confundirme... exactamente en la cuestión de los canales. Agradezco si ayudaras a esta aprendiz en el esclarecimiento de esa parte en especifico.
 
DE ANTEMANO MILLLL GRACIAS! por tu incondicional ayuda en este tema. Me has sido de mucha utilidad para resolver este lió que me tenia realmente preocupada.


  • 0

#12 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.876 mensajes
  • LocationMadrid - España

Escrito 25 abril 2019 - 06:10

Aún no logro entender a claridad... o cabalmente esa parte de la lectura de los bytes y canales de los que ellos hablan en el manual.
Al momento de interpretar eso en el código, tiendo a confundirme... exactamente en la cuestión de los canales. Agradezco si ayudaras a esta aprendiz en el esclarecimiento de esa parte en especifico.

 

Pues según el manual que aportas hay dos tipos de Diagramas de dispersión uno de 5 bytes y otro de 4

Cada Byte se identifica con un canal y el último es el tipo de dato (CT) y determinará el color de su representación el pantalla o en papel (son distintos)

Los canales posibles son:

Para el de 5 bytes: 0, 10, 90 y 90D más un byte CT

Para el de 4 bytes: 0,10, 90 más un byte CT

 

En la práctica los canales representan coordenadas cartesianas de 0-255. Si asimílanos el canal 10 a las X y el 0 a las Y estamos representando canal 0 contra  canal 10 y obtenemos un diagrama de dispersión. Si hacemos lo mismo con 90:X - 9=D:Y obtenemos otro diagrama

 

La correspondencia de bytes es esta:

1º byte ->Canal 0

2º byte ->Canal 10

3º byte ->Canal 90

4º byte ->Canal 90D

5º byte ->CT

 

Al leer los Bytes que vienen codificados en Base64 se obtiene un array de datos, si el array lo definimos como array de Bytes entonces debemos recordar que cada 4 ó 5 bites tenemos los datos de un punto de dispersograma y se interpretan como puse arriba- Por lo tanto el código debe hacer un bucle de 5 en 5 (o de 4 en 4) para leer el punto completo. Ahora sabemos que un dato de 5 bytes en realidad se representa en dos dispersogramas distintos según los canales elegidos pero ¿Que pasa con los de 4 bytes? en este caso tenemos 3 canales y con esto solo se puede representar un solo dispersograma sobrando un canal que parece superfluo, a no ser que algo se escape de la interpretación para este tipo de caso.

 

Creo que con esto debe quedarte claro por qué hablo de orden de bytes al representar uno u otro dispersograma. En el código es bien sencillo de intercambiar para rla representación.

 

Saludos.


  • 0

#13 MarCaribe

MarCaribe

    Member

  • Miembros
  • PipPip
  • 34 mensajes

Escrito 25 abril 2019 - 08:11

Pues según el manual que aportas hay dos tipos de Diagramas de dispersión uno de 5 bytes y otro de 4

Cada Byte se identifica con un canal y el último es el tipo de dato (CT) y determinará el color de su representación el pantalla o en papel (son distintos)

Los canales posibles son:

Para el de 5 bytes: 0, 10, 90 y 90D más un byte CT

Para el de 4 bytes: 0,10, 90 más un byte CT

 

En la práctica los canales representan coordenadas cartesianas de 0-255. Si asimílanos el canal 10 a las X y el 0 a las Y estamos representando canal 0 contra  canal 10 y obtenemos un diagrama de dispersión. Si hacemos lo mismo con 90:X - 9=D:Y obtenemos otro diagrama

 

La correspondencia de bytes es esta:

1º byte ->Canal 0

2º byte ->Canal 10

3º byte ->Canal 90

4º byte ->Canal 90D

5º byte ->CT

 

Al leer los Bytes que vienen codificados en Base64 se obtiene un array de datos, si el array lo definimos como array de Bytes entonces debemos recordar que cada 4 ó 5 bites tenemos los datos de un punto de dispersograma y se interpretan como puse arriba- Por lo tanto el código debe hacer un bucle de 5 en 5 (o de 4 en 4) para leer el punto completo. Ahora sabemos que un dato de 5 bytes en realidad se representa en dos dispersogramas distintos según los canales elegidos pero ¿Que pasa con los de 4 bytes? en este caso tenemos 3 canales y con esto solo se puede representar un solo dispersograma sobrando un canal que parece superfluo, a no ser que algo se escape de la interpretación para este tipo de caso.

 

Creo que con esto debe quedarte claro por qué hablo de orden de bytes al representar uno u otro dispersograma. En el código es bien sencillo de intercambiar para rla representación.

 

Saludos.

 

Perfectamente claro Escafandra. Muchisimas gracias por toda tu ayuda. Me siento bendecida en gran medida con tu ayuda.


  • 0

#14 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.876 mensajes
  • LocationMadrid - España

Escrito 28 abril 2019 - 12:46

He investigado un poco y ya tengo resuelto el misterio. En realidad sólo había que documentarse un poco sodre estos diagramas de dispersión de tecnología M.A.P.S.S de CELL-DYN.

 

Cada canal representa una medición con un láser polarizado con un determinado ángulo:

0º:      Indica el TAMAÑO CELULAR
10º:    indica la COMPLEJIDAD CELULAR
90º:    indica la LOBULARIDAD CELULAR
90ºD:  indica la GRANULARIDAD CELULAR (Despolarizado)

 

Cada diagrama de dispersión se consigue representando los valores anteriores que llegan de la trama en los ejes cartesianos. Y hay cuatro tipos concretos:

1.- Complejidad / Lobularidad (10º, 90º)

2.- Lobularidad / Granularidad (90º, 90ºD)

3.- Complejidad / Tamaño (10º, 0º)

4.- Tamaño / Lobularidad ( 0º, 90º)

 

Los discriminantes son tres, para los tres primeros casos y sus dos primeros valores representan uno de los 4 casos anteriores seguidos de los puntos cuya unión define el discriminante gráfico concreto.

En el caso de Tramas del tipo 0, 10, 90, el caso 2 de diagrama de dispersión no existe.

 

Así las cosas, en el ejemplo de la Trama1 nos salen estos cuatro diagramas de dispersión:

e53e1568f0b5c43c441bbcd29cb87ca1o.png

Para el caso de la trama 2 tenemos:

5b83ebea9c2dda5b77e47dddd95b5ffbo.png

He preparado una aplicación de ejemplo cuyo código he tratado de mantener claro. Analiza las cadenas de discriminante para buscar el apropiado, esta es la parte más engorrosa. Utiliza TChart para facilitar el tratamiento de los diagramas.

 

Subo un proyecto de ejemplo.

 

 

Saludos.

Archivos adjuntos


  • 1

#15 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.876 mensajes
  • LocationMadrid - España

Escrito 01 mayo 2019 - 11:59

Si alguien tiene mas curiosidad sobre este tema y la automatización del hemograma, puede consultar este documento: Automatización del Hemograma

Saludos.
  • 0





Etiquetado también con una o más de estas palabras: #decodificarBase64, #PlanoCartesiano, #EstablecerDiscriminantes, #equiposBiomedicos, #array, #Tchart, #delphi7, #perfeccionaRutina