Unit AccPampa; {Accesorios para el PAMPA}
Interface

Uses crt, dos;


Const {Constantes de pampa}

    PI = 3.14159265359;
    Np = 250; Mp = 251;
    RBe=1.848; RAu=19.37; RSi=2.33; RAl=2.7; RNi=8.9; RMoxtek=1.4; {rho's en g/cm^3}
    Abr:Array[1..5] Of Double = ( 0.254829592,  -0.284496736,  1.421413741,  -1.453152027,  1.061405429 );
    Pes:Double =0.3275911;
    NPG=14;{Numero de parametros globales}
Type
    DoubleArrayNP = Array[1..np] OF Double;
    DoubleArrayMP = Array[1..Mp] OF Double;
    pMN = Array[1..Mp,1..np] OF Double;
	

Var  {Variables de pampa}

    Detector		    :Byte; {por ahora solo 1:EDS}

    FF                      :Boolean; {true-> iguala los factores de escala}
   
    DiUser 		    :String; {Directorio home del usuario}
    DiDat 		    :String; {Directorio de los .dat}
    DiDat2 		    :String; {Directorio de los .dat}
    DiEsp 		    :String; {Directorio de los espectros}
    ArEsp                   :String;
    DiSal		    :String; {Directorio del .sal}
    Dieff		    :String; {Directorio archivo eficiencia}
    Pref 		    :String; {Directorio de los archivos de datos para el pampa}
    comentario		    :String;

    Einc                    :Double; {Energia de incidencia en keV}
    Toff                    :Double; {Take off, angulo de salida}
    Titer		    :Double; {Tolerancia para las iteraciones}
    Espesor		    :Double; {Espesor de la muestra}
    Espesorfilm		    :Double; {Espesor del film}
    Chi2                    :Double;

    SistOp                  :Integer; {Sistema operativo, 1:Linuz, 2:Window}
    Nzonas                  :Integer; {Numero de zonas de interes en el espectro}
    Iter                    :Integer; {Numero de iteraciones}
    Canali                  :Integer; {Canal inicial de la zona de interes}
    Canalf                  :Integer; {Canal final de la zona de interes}
    Ncanal                  :Integer; {Numero de canales}
    NL			    :Integer; {Numero total de lineas}
    Nel                     :Integer; {Numero total de elementos}   
    Ndet                    :Integer; {Numero de elementos detectados}   
    Nnodet                  :Integer; {Numero de elementos no detectados}
    Nfilm		    :Integer; {Numero total de elementos en el film}
    Nfdet		    :Integer; {Numero de elementos detectadfos en el film}
    Nfnodet		    :Integer; {Numero de elementos no detectados en el film}
    NLF			    :Integer; {Numero total de lineas en el film}
    Npicosuma		    :Integer; {Numero de picos suma}
    NG                      :Integer; {Numero total de grupos}
    NPR                     :Integer; {Numero de parametros que se refinan}
    abaco                   :Integer;
    Nint                    :Integer; {Numero de intervalos}

    Z                       :Array[1..100] Of Byte; {Numeros atomicos de los elementos (sustrato y film)}
    Zdet                    :Array[1..100] Of Byte; {Numeros atomicos de los elementos detectados (sustrato y film)}
    Znodet                  :Array[1..100] Of Byte; {Numeros atomicos de los elementos no detectados (sustrato y film)}
    Nlin                    :Array[1..100] Of Byte; {Numeros de lineas de cada elemento}
    {Nint                    :Array[1..30,1..30]of Integer; }{Numero de intervalos para hacer la integral en muestras gruesas, para cada elemento y línea}
    Cod                     :Array[1..np] Of byte; {Codigos de los parametros}
    Perf		    :Array[1..100,1..30] Of Char; {Perfiles de las lineas, Voight(V) o Gaussiana(G) (elemento, linea)}
    Borde                   :Array[1..100,1..30] Of String[2]; {Bordes de las lineas 1°-> K,L,M,N  2°->1,2,3... (elemento, linea)}
    Grupo                   :Array[0..100] Of String[2]; {Grupos}
    Sim                     :Array[0..100] Of String[2]; {Simbolos de los elementos ordenados por n. atomico(los lee del archivo SIMB.ASC)}
    Rho                     :Array[0..100] Of Double; {Densidad de los elementos ordenados por n. atomico(los lee del archivo RHO.ASC)}   
    Fesc                    :Array[1..10] Of Double; {Factor de escala}
    CK                      :Array[0..100,1..3] Of Double; {Probabilidad de transicion de las Coster-Kroning (f12,f13,f23) (las lee del archivo CK.ASC)}
    Desc		    :Array[1..300] Of String[11]; {Descripciones del borde de las lineas}
    Ymed                    :Array[1..30000] Of Longint; {intensidad medida de los canales}
    Sumcod                  :Array[0..Np] of Integer;  {Para guardar la suma acumulada de los codigos de los parametros}
    GrupoV 	 	    :Array[0..70] Of Byte; {contiene el Numero de Grupo vinculado con las lineas que se refinan}
    Sref,Snoref             :Array[0..70] Of Double; {suma de las fracciones refinadas y no refinadas de cada numero de grupo respectivamente}
    P0                      :Array[1..np] Of Double; {Parametros iniciales}
    X			    :Array[1..np] OF Double; {Aca juntamos los parametros de P0 y los parametros refinados}
    PE                      :Array[1..np] Of Double; {Errores de los parametros}
    P_Ref                   :Array[1..np] Of Double; {Parametros que se van a refinar}
    PE_Ref                   :Array[1..np] Of Double; {Errores de los parametros que se van a refinar}
    Lam_Ref		    :Array[1..np] Of Double; {Lam de los parametros que se van a refinar}
    C			    :Array[1..100] Of Double;  {Concentraciones de los elementos en el orden del .dat (sustrato detectables y no detectables, y film detectables y no detectables)}
    Ycal                    :Array[1..30000] Of Double; {intensidad calculada con pampa de cada canal}
    Ylinea		    :Array[1..30000,1..30,1..30] Of Double; {intensidad calculada con pampa de cada linea (canal, elemento,linea) para cada canal}
    Ycola		    :Array[1..30000,1..30,1..30] Of Double; {intensidad de la asimetría}
    Scola                   :Array[1..30000,1..30,1..30] Of Double; {intensidad de la asimetría}
    Yfondo		    :Array[1..30000] Of Double; {intensidad del fondo por la eficiencia para cada canal}
    Ypicosuma		    :Array[1..30000,1..50] Of Double; {intensidad de los picos suma para cada canal}
    Efic                    :Array[1..30,1..30] Of Double;
    Suma		    :Array[1..30,1..30] Of Double; {La contribucion de los picos a todos los picos suma donde estan involucrados para luego restarsela a su intensidad}
    Isuma		    :Array[1..300] Of Double; {Intensidad de los picos suma}
    Esuma		    :Array[1..300] Of Double; {Energia de los picos suma}
    Sigmasuma2              :Array[1..300] Of Double; {Ancho de los picos suma}
    Lam                     :Array[1..np] Of Double; {Lambda de los parametros}
    E                       :Array[1..30,1..30] Of Double; {Energias de las lineas (elemento, linea)}
    Fr			    :Array[1..30,1..30] Of Double; {Fracciones de las lineas (elemento, linea)}
    Tail		    :Array[1..30,1..30] Of Double; {Colas (elemento, linea)}
    Beta		    :Array[1..30,1..30] Of Double; {Betas (elemento, linea)}
    Sigma2                  :Array[1..30,1..30] Of Double; {Sigma^2 (elemento, linea) }
    Omega                   :Array[1..92,1..9] Of Double; {Yield de fluorecencia de cada borde (elemento,borde) borde->k,l1,l2,l3,m1,m2,m3,m4,m5}
    Ek,El1,El2,El3,Em1,Em2,
    Em3,Em4,Em5		    :Array[1..93] Of Double; {Energias de los bordes para cada elemento}
    A			    :Array[1..93] Of Double; {Peso atomico en u}
    S                       :Array[1..30,1..30] Of Double; {Seccion eficaz de ionizacion para cada linea (por ahora solo las k)} 
    CS                      :Array[1..3000,1..30,1..30] Of Double;{Seccion eficaz de ionizacion para cada linea (por ahora solo las k) en muestras delgadas}
    Eint                    :Array[1..3000] Of Double;{Arreglos que se usan para calcular la integral en muestras gruesas}
    Stopp                   :Array[1..3000] Of Double;
    Intens		    :Array[1..30,1..30] Of Double;  {Intensidades para muestras gruesas}
    SpAr                    :Array[1..30,1..79,1..79] Of Double;  {energias vs Stopping power de los elementos en la muestra(elemento, energía, stopping)}


Function Erfc(X:Double):Double;
Function Signo(X:Double):Double;
Function Pot(X,Y:Double):Double;
Function Cola(X,X0,Sigma,Beta:Double):Double;

Implementation


Function Erfc(X:Double):Double;
Var  T,O:Double;
       I:Byte;
Begin
  T:=1.0/(1.0+Pes*Abs(X));
  O:=0.0;
  For I:=5 DownTo 1 Do  O:=(O+Abr[I])*T;
  If Abs(X)<7 Then Erfc:=Signo(X)*(O*Exp(-Sqr(X))-1.0)+1.0
              Else Erfc:=-Signo(X)+1.0
End;


Function Signo(X:Double):Double;
Begin
  If X<0 Then Signo:=-1.0
         Else Signo:=1.0
End;

Function Pot(X,Y:Double):Double;
Begin
  If X<>0.0 Then Pot:=Exp(Y*Ln(X))
  Else Pot:=0.0
end;

Function Cola(X,X0,Sigma,Beta:Double):Double;
Begin
 If Beta=0.0 Then Cola:=0.0
 Else Cola:= Exp((X-X0)/Beta) * 0.5 * Exp(sqr(sigma/Beta)/2.0) *
           Erfc((X-X0)/(Sigma*Sqrt(2.0)) + Sigma/(Beta*Sqrt(2.0)))
End;


Begin

End.
