00001 #ifndef DEDXCORRECSVC_H_
00002 #define DEDXCORRECSVC_H_
00003
00004 #include "GaudiKernel/IInterface.h"
00005 #include "GaudiKernel/Kernel.h"
00006 #include "GaudiKernel/Service.h"
00007 #include "MdcGeomSvc/MdcGeomSvc.h"
00008 #include "MagneticField/IMagneticFieldSvc.h"
00009 #include "MagneticField/MagneticFieldSvc.h"
00010 #include "DedxCorrecSvc/IDedxCorrecSvc.h"
00011 #include "DedxCorrecSvc/Dedx_Helix.h"
00012
00013 #include "GaudiKernel/IDataProviderSvc.h"
00014 #include "GaudiKernel/IIncidentListener.h"
00015
00016
00017 class Identifier;
00018
00019 class DedxCorrecSvc: public Service, virtual public IDedxCorrecSvc,virtual public IIncidentListener{
00020 public:
00021 DedxCorrecSvc( const std::string& name, ISvcLocator* svcloc );
00022 ~DedxCorrecSvc();
00023
00024 virtual StatusCode queryInterface(const InterfaceID& riid, void** ppvUnknown);
00025 virtual StatusCode initialize();
00026 virtual StatusCode finalize();
00027
00028
00029 void handle(const Incident&);
00030
00031 double RungCorrec( int runNO, double ex ) const;
00032 double WireGainCorrec( int wireid,double ex) const;
00033 double DriftDistCorrec(int layid, double ddrift, double ex) const;
00034 double SaturCorrec(int layid,double costheta, double ex) const;
00035 double CosthetaCorrec(double costheta, double ex) const;
00036 double T0Correc(double t0, double ex) const;
00037 double HadronCorrec( double costheta, double dedx ) const;
00038 double ZdepCorrec(int layid,double zhit, double ex) const;
00039 double EntaCorrec(int layid,double enta, double ex) const;
00040 double LayerGainCorrec( int layid,double ex) const;
00041 double DocaSinCorrec(int layid, double doca, double enta, double ex) const;
00042 double DipAngCorrec(int layid, double costheta, double ex) const;
00043 double GlobalCorrec(double dedx) const;
00044 double CellCorrec( int ser, double adc, double dd, double enta,
00045 double z, double costheta ) const;
00046 double LayerCorrec( int layer, double z, double costheta, double ex ) const;
00047 double TrkCorrec( double costheta, double dedx ) const;
00048 double StandardCorrec( int runFlag, int ntpFlag, int runNO, double pathl, int wid, int layid, double adc, double dd, double eangle, double z, double costheta ) const;
00049 double StandardHitCorrec( int calib_rec_Flag, int runFlag, int ntpFlag, int runNO, double pathl, int wid, int layid, double adc, double dd, double eangle, double costheta ) const;
00050 double StandardTrackCorrec(int calib_rec_Flag, int typFlag, int ntpFlag, int runNO, double ex, double costheta, double t0 ) const;
00051 double PathL( int ntpFlag, const Dedx_Helix& hel, int layer, int cellid, double z ) const;
00052
00053 double D2I(const double& cosTheta, const double& D) const;
00054 double I2D(const double& cosTheta, const double& I) const;
00055 void set_flag( int calib_F );
00056
00057 double f_larcos(double x, int nbin);
00058
00059 private:
00060 bool m_initConstFlg;
00061
00062 void init_param();
00063 void init_param_svc();
00064
00065
00066 double sq(double& x) const {return (x*x);}
00067 double cub(double& x) const {return (x*x*x);}
00068 double sq4(double& x) const {return (x*x*x*x);}
00069 double sq5(double& x) const {return sq(x)*cub(x);}
00070 double sq6(double& x) const {return cub(x)*cub(x);}
00071 double sq7(double& x) const {return sq4(x)*cub(x);}
00072 double sq8(double& x) const {return sq4(x)*sq4(x);}
00073 double sq9(double& x) const {return sq4(x)*sq5(x);}
00074 double sq10(double& x) const {return sq5(x)*sq5(x);}
00075 double sq11(double& x) const {return sq5(x)*sq6(x);}
00076
00077 double T0(){return 1;}
00078 double T1(double& x) const {return x;}
00079 double T2(double& x) const {return (2*sq(x)-1);}
00080 double T3(double& x) const {return (4*cub(x)-3*x);}
00081 double T4(double& x) const {return (8*sq4(x)-8*sq(x)+1);}
00082 double T5(double& x) const {return (16*sq5(x)-20*cub(x)+5*x);}
00083 double T6(double& x) const {return (32*sq6(x)-48*sq4(x)+18*sq(x)-1);}
00084 double T7(double& x) const {return (64*sq7(x)-112*sq5(x)+56*cub(x)-7*x);}
00085 double T8(double& x) const {return (128*sq8(x)-256*sq6(x)+160*sq4(x)-32*sq(x)+1);}
00086 double T9(double& x) const {return (256*sq9(x)-576*sq7(x)+432*sq5(x)-120*cub(x)+9*x);}
00087 double T10(double& x) const {return (512*sq10(x)-1280*sq8(x)+1120*sq6(x)-400*sq4(x)+50*sq(x)-1);}
00088 double T11(double& x) const {return (1024*sq11(x)-2816*sq9(x)+2816*sq7(x)-1232*sq5(x)+220*cub(x)-11*x);}
00089 double T12(double& x) const {return (2*x*T11(x)-T10(x));}
00090 double T13(double& x) const {return (2*x*T12(x)-T11(x));}
00091 double T14(double& x) const {return (2*x*T13(x)-T12(x));}
00092 double T15(double& x) const {return (2*x*T14(x)-T13(x));}
00093 double T16(double& x) const {return (2*x*T15(x)-T14(x));}
00094 double T17(double& x) const {return (2*x*T16(x)-T15(x));}
00095 double T18(double& x) const {return (2*x*T17(x)-T16(x));}
00096 double T19(double& x) const {return (2*x*T18(x)-T17(x));}
00097 double T20(double& x) const {return (2*x*T19(x)-T18(x));}
00098
00099 private:
00100 IntegerProperty m_run;
00101 double m_valid[6796];
00102 double m_wire_g[6796];
00103 double m_rung[4][10000];
00104 double m_ddg[4][43];
00105 double m_docaeangle[40][40];
00106 vector<double> m_venangle;
00107 double m_ggs[4][43];
00108 double m_enta[4][43];
00109 double m_zdep[4][43];
00110 double m_layer_g[43];
00111 double m_dedx_gain;
00112 double m_dedx_resol;
00113 int N_run;
00114 double curve_par[5];
00115 double sigma_par[6];
00116
00117 vector<double> cos_k;
00118 vector<double> cos_b;
00119
00120 vector<double> t0_k;
00121 vector<double> t0_b;
00122
00123
00124 double Iner_Stepdoca;
00125 double Out_Stepdoca;
00126
00127 double m_alpha;
00128 double m_gamma;
00129 double m_delta;
00130 double m_power;
00131 double m_ratio;
00132
00133
00135
00136
00138 int m_rung_flag;
00139
00141 int m_wireg_flag;
00142
00144 int m_ggs_flag;
00145
00147 int m_ddg_flag;
00148
00150 int m_t0_flag;
00151
00153 int m_sat_flag;
00154
00155
00156
00158 int m_enta_flag;
00160 int m_zdep_flag;
00162 int m_layerg_flag;
00164 int m_dcasin_flag;
00166 int m_dip_flag;
00168 int m_mdcg_flag;
00170 int m_init;
00171 int m_par_flag;
00173 IMdcGeomSvc* geosvc;
00174 IMagneticFieldSvc* m_pIMF;
00175 bool m_debug;
00176 int m_debug_i, m_debug_j;
00177 };
00178
00179 #endif