00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 #ifndef __XSM_INSTRUMENT_H
00029 #define __XSM_INSTRUMENT_H
00030 
00031 #include <iostream>
00032 #include <fstream>
00033 
00034 #include <cstdio>
00035 #include <cstdlib>
00036 #include <cmath>
00037 #include <cstring>
00038 
00039 #include <unistd.h>
00040 
00041 #include "xsmtypes.h"
00042 #include "xsmmasks.h"
00043 
00044 
00045 
00046 typedef enum OFFSET_MODE { OFM_UNDEFINED, OFM_DSP_OFFSET_ADDING, OFM_ANALOG_OFFSET_ADDING };
00047 
00048 class XSM_Instrument{
00049 public:
00050   XSM_Instrument(XSMRESOURCES &xsmres);
00051   virtual ~XSM_Instrument(){};
00052 
00053   double UOutLimit(double u){
00054     if(u>AnalogVMaxOut) { u=AnalogVMaxOut; }
00055     if(u<-AnalogVMaxOut) { u=-AnalogVMaxOut; }
00056     return u;
00057   };
00058 
00059   double UInLimit(double u){
00060     if(u>AnalogVMaxIn) { u=AnalogVMaxIn; }
00061     if(u<-AnalogVMaxIn) { u=-AnalogVMaxIn; }
00062     return u;
00063   };
00064   
00065   
00066   virtual double XRangeMax(){ return(xR*Vx); };
00067   virtual double YRangeMax(){ return(yR*Vy); };
00068   virtual double ZRangeMax(){ return(zR*Vz); };
00069 
00070   virtual double X0RangeMax(){ return(xR*Vx0); };
00071   virtual double Y0RangeMax(){ return(yR*Vy0); };
00072   virtual double Z0RangeMax(){ return(zR*Vz0); };
00073 
00074   virtual double XScanRangeMax(){ return(2*XRangeMax()); };
00075   virtual double YScanRangeMax(){ return(2*YRangeMax()); };
00076 
00077   virtual double XResolution(){ return(xd*Vx); };
00078   virtual double YResolution(){ return(yd*Vy); };
00079   virtual double ZResolution(const gchar *Z_Unit_Alias=NULL){ 
00080           if (Z_Unit_Alias){
00081 
00082                   if (strncmp (Z_Unit_Alias, "AA", 2) == 0) return zd*Vz;
00083                   if (strncmp (Z_Unit_Alias, "nm", 2) == 0) return zd*Vz;
00084                   if (strncmp (Z_Unit_Alias, "um", 2) == 0) return zd*Vz;
00085                   if (strncmp (Z_Unit_Alias, "mm", 2) == 0) return zd*Vz;
00086                   if (strncmp (Z_Unit_Alias, "nA", 2) == 0) return (AnalogVMaxIn/DigRangeIn)/nAmpere2Volt;
00087                   if (strncmp (Z_Unit_Alias, "pA", 2) == 0) return (AnalogVMaxIn/DigRangeIn)/nAmpere2Volt;
00088                   if (strncmp (Z_Unit_Alias, "nN", 2) == 0) return (AnalogVMaxIn/DigRangeIn)/nNewton2Volt;
00089                   if (strncmp (Z_Unit_Alias, "Hz", 2) == 0) return (AnalogVMaxIn/DigRangeIn)/dHertz2Volt;
00090 
00091 
00092                   if (strncmp (Z_Unit_Alias, "V" ,1) == 0) return AnalogVMaxIn/DigRangeIn;
00093                   if (strncmp (Z_Unit_Alias, "1" ,1) == 0) return 1.;
00094                   return 1.;
00095           }
00096           return zd*Vz; 
00097   };
00098   virtual double X0Resolution(){ return(xd*Vx0); };
00099   virtual double Y0Resolution(){ return(yd*Vy0); };
00100   virtual double Z0Resolution(const gchar *Z_Unit_Alias=NULL){ 
00101           return zd*Vz0; 
00102   };
00103 
00104   virtual double Dig2nAmpere(long I){return ((double)I*AnalogVMaxIn/(DigRangeIn*nAmpere2Volt));};
00105   virtual double Dig2V(long U){return(AnalogVMaxIn/(double)DigRangeIn*(double)U);};
00106 
00107   
00108   virtual double Dig2XA(long dig){ return(XResolution()*(double)dig); };
00109   virtual double Dig2YA(long dig){ return(YResolution()*(double)dig); };
00110   virtual double Dig2ZA(long dig){ return(ZResolution()*(double)dig); };
00111 
00112   virtual double XA2Dig(double ang){ return(ang/XResolution()); };
00113   virtual double YA2Dig(double ang){ return(ang/YResolution()); };
00114   virtual double ZA2Dig(double ang){ return(ang/ZResolution()); };
00115 
00116   virtual double Dig2X0A(long dig){ return(X0Resolution()*(double)dig); };
00117   virtual double Dig2Y0A(long dig){ return(Y0Resolution()*(double)dig); };
00118   virtual double Dig2Z0A(long dig){ return(Z0Resolution()*(double)dig); };
00119 
00120   virtual double X0A2Dig(double ang){ return(ang/X0Resolution()); };
00121   virtual double Y0A2Dig(double ang){ return(ang/Y0Resolution()); };
00122   virtual double Z0A2Dig(double ang){ return(ang/Z0Resolution()); };
00123 
00124   
00125   virtual double VX(int i=-1){ return(i>=0 ? Vx = VList[i] : Vx); };  
00126   virtual double VY(int i=-1){ return(i>=0 ? Vy = VList[i] : Vy); };  
00127   virtual double VZ(int i=-1){ return(i>=0 ? Vz = VList[i] : Vz); };  
00128 
00129   virtual double VX0(int i=-1){ return(i>=0 ? Vx0 = VList[i] : Vx0); };  
00130   virtual double VY0(int i=-1){ return(i>=0 ? Vy0 = VList[i] : Vy0); };  
00131   virtual double VZ0(int i=-1){ return(i>=0 ? Vz0 = VList[i] : Vz0); };  
00132 
00133   virtual OFFSET_MODE OffsetMode (OFFSET_MODE ofm=OFM_UNDEFINED);
00134 
00135   virtual double VoltOut2Dig(double U){ return U*DigRangeOut/AnalogVMaxOut; };
00136   virtual double Dig2VoltOut(double dig){ return dig/DigRangeOut*AnalogVMaxOut; };
00137 
00138   virtual double VoltIn2Dig(double U){ return U*DigRangeIn/AnalogVMaxIn; };
00139   virtual double Dig2VoltIn(double dig){ return dig/DigRangeIn*AnalogVMaxIn; };
00140 
00141   virtual double BiasV2Vabs(double U){ return UOutLimit(U/BiasGain); }; 
00142   virtual double BiasV2V(double U){ return U/BiasGain; }; 
00143   virtual double nAmpere2V(double I){ return UInLimit(I*nAmpere2Volt); };
00144   virtual double nNewton2V(double F){ return UInLimit(F*nNewton2Volt); };
00145   virtual double dHertz2V(double v){ return UInLimit(v*dHertz2Volt); };
00146   virtual double eV2V(double eV){ return UOutLimit(eV/eV2Volt); };
00147   virtual double V2BiasV(double U){return U*BiasGain; }; 
00148 
00149   gchar *type;
00150   gchar *name;
00151   gchar *xunitname;
00152   gchar *yunitname;
00153   gchar *zunitname;
00154 
00155 protected:
00156   
00157   long   DigRangeOut;     
00158   double AnalogVMaxOut; 
00159   long   DigRangeIn;     
00160   double AnalogVMaxIn; 
00161   double VList[GAIN_POSITIONS];   
00162   double Vx, Vy, Vz; 
00163   double Vx0, Vy0, Vz0; 
00164   double xPsens, yPsens, zPsens; 
00165   double BiasGain;     
00166   double nAmpere2Volt; 
00167   double nNewton2Volt; 
00168   double dHertz2Volt;  
00169   double eV2Volt;      
00170 
00171   
00172   double xR, yR, zR; 
00173   double xd, yd, zd; 
00174 
00175 private:
00176   OFFSET_MODE offset_mode;
00177 };
00178 
00179 class STM_Instrument : public XSM_Instrument{
00180  public:
00181   STM_Instrument(XSMRESOURCES &xsmres) : XSM_Instrument(xsmres){ 
00182     type = g_strdup("STM"); 
00183     zunitname = yunitname = xunitname = g_strdup("Ang");
00184   };
00185   virtual ~STM_Instrument(){ 
00186     g_free(type); 
00187     g_free(xunitname);
00188   };
00189 
00190   
00191   
00192 };
00193 
00194 class AFM_Instrument : public XSM_Instrument{
00195  public:
00196   AFM_Instrument(XSMRESOURCES &xsmres) : XSM_Instrument(xsmres){ 
00197     type = g_strdup("AFM"); 
00198     zunitname = yunitname = xunitname = g_strdup("Ang");
00199   };
00200   virtual ~AFM_Instrument(){ 
00201     g_free(type); 
00202     g_free(xunitname);
00203   };
00204 
00205   
00206   
00207 };
00208 class SPALEED_Instrument : public XSM_Instrument{
00209  public:
00210   SPALEED_Instrument(XSMRESOURCES &xsmres, double *E, double *Gt, long *M);
00211   virtual ~SPALEED_Instrument(){ 
00212     g_free(type); 
00213     g_free(xunitname);
00214     g_free(yunitname);
00215     g_free(zunitname);
00216   };
00217 
00218   
00219   virtual double XRangeMax(){ return(Transform2Usr(xR)); };
00220   virtual double YRangeMax(){ return(Transform2Usr(yR)); };
00221   virtual double ZRangeMax(){ return(zR); };
00222 
00223   virtual double XResolution(){ return(xd); };
00224   virtual double YResolution(){ return(yd); };
00225   virtual double ZResolution(){ return(1. / (*Gate)); };
00226 
00227   
00228   virtual double Dig2XA(long dig){ return(Transform2Usr(XResolution()*(double)dig)); };
00229   virtual double Dig2YA(long dig){ return(Transform2Usr(YResolution()*(double)dig)); };
00230   virtual double Dig2ZA(long dig){ return(ZResolution()*(double)dig); };
00231 
00232   virtual double XA2Dig(double ang){ return(Transform2V(ang)/XResolution()); };
00233   virtual double YA2Dig(double ang){ return(Transform2V(ang)/YResolution()); };
00234   virtual double ZA2Dig(double ang){ return(ang/ZResolution()); };
00235 
00236  private:
00237   double Transform2V(double x){ 
00238     return x;
00239   };
00240   
00241   double Transform2Usr(double x){ 
00242     return x;
00243   };
00244   
00245   long   *Mode;
00246   double *En;
00247   double *Gate;
00248   SUnit  *Su;
00249   BZUnit *BZu;
00250 };
00251 #endif