![]() |
![]() |
00001 #include "Geometry/CSCGeometry/interface/CSCGattiFunction.h" 00002 #include "Geometry/CSCGeometry/interface/CSCChamberSpecs.h" 00003 #include "FWCore/MessageLogger/interface/MessageLogger.h" 00004 #include <cmath> 00005 #ifndef M_PI_2 00006 #define M_PI_2 1.57079632679489661923 00007 #endif 00008 00009 00010 CSCGattiFunction::CSCGattiFunction() 00011 : k1(0.), 00012 k2(0.), 00013 k3(0.), 00014 h(0.), 00015 norm(0.), 00016 sqrtk3(0.), 00017 thePreviousSpecs(0) 00018 { 00019 } 00020 00021 00022 void CSCGattiFunction::initChamberSpecs(const CSCChamberSpecs & chamberSpecs) { 00023 if(&chamberSpecs != thePreviousSpecs) { 00024 LogTrace("CSCGattiFunction") << "CSCGattiFunction::initChamberSpecs setting new values."; 00025 h = chamberSpecs.anodeCathodeSpacing(); 00026 double s = chamberSpecs.wireSpacing(); 00027 double ra = chamberSpecs.wireRadius(); 00028 static const double parm[5] = {.1989337e-02, -.6901542e-04, .8665786, 00029 154.6177, -.6801630e-03 }; 00030 k3 = (parm[0]*s/h + parm[1]) 00031 * (parm[2]*s/ra + parm[3] + parm[4]*s*s/ra/ra); 00032 sqrtk3 = sqrt(k3); 00033 norm = 0.5 / std::atan( sqrtk3 ); 00034 k2 = M_PI_2 * (1. - sqrtk3/2.); 00035 k1 = 0.25 * k2 * sqrtk3 / std::atan(sqrtk3); 00036 thePreviousSpecs = &chamberSpecs; 00037 } 00038 00039 LogTrace("CSCGattiFunction") << "CSCGattiFunction: constants k1=" << 00040 k1 << ", k2=" << k2 << ", k3=" << k3 << 00041 ", h=" << h << ", norm=" << norm; 00042 } 00043 00044 00045 double CSCGattiFunction::binValue( double x, double stripWidth) const { 00046 double tanh1 = tanh(k2 * (x+stripWidth*0.5)/h ); 00047 double tanh2 = tanh(k2 * (x-stripWidth*0.5)/h ); 00048 return norm * ( std::atan(sqrtk3*tanh1) - std::atan(sqrtk3*tanh2) ); 00049 } 00050