9#include <framework/gearbox/Gearbox.h> 
   10#include <framework/gearbox/GearDir.h> 
   11#include <framework/logging/Logger.h> 
   12#include <framework/utilities/FileSystem.h> 
   14#include <cdc/geometry/CDCGeometryPar.h> 
   15#include <cdc/geometry/CDCGeoControlPar.h> 
   16#include <cdc/simulation/CDCSimControlPar.h> 
   17#include <cdc/utilities/OpenFile.h> 
   22#include <boost/format.hpp> 
   26#include <boost/iostreams/filtering_stream.hpp> 
   30#include <Math/ChebyshevPol.h> 
   52    if ((*m_t0FromDB).isValid()) {
 
   59    if ((*m_badWireFromDB).isValid()) {
 
   66    if ((*m_propSpeedFromDB).isValid()) {
 
   73    if ((*m_timeWalkFromDB).isValid()) {
 
   80    if ((*m_xtRelFromDB).isValid()) {
 
   87    if ((*m_sResolFromDB).isValid()) {
 
   94    if ((*m_fFactorFromDB).isValid()) {
 
  101    if ((*m_chMapFromDB).isValid()) {
 
  108    if ((*m_displacementFromDB).isValid()) {
 
  115    if ((*m_alignmentFromDB).isValid()) {
 
  123      if ((*m_misalignmentFromDB).isValid()) {
 
  132    if ((*m_eDepToADCConversionsFromDB).isValid()) {
 
  145    B2WARNING(
"CDCGeometryPar: Strange that readFromDB is not called! Please make sure that CDC is included in Geometry.");
 
  184  for (
unsigned i = 0; i < 4; ++i) {
 
  186    for (
unsigned j = 0; j < 2; ++j)
 
  189  for (
unsigned i = 0; i < c_maxNSenseLayers; ++i) {
 
  201  for (
unsigned i = 0; i < c_maxNFieldLayers; ++i) {
 
  207  for (
unsigned L = 0; L < c_maxNSenseLayers; ++L) {
 
  208    for (
unsigned C = 0; C < c_maxNDriftCells; ++C) {
 
  209      for (
unsigned i = 0; i < 3; ++i) {
 
  217      for (
unsigned i = 0; i < 7; ++i) {
 
  227  for (
unsigned L = 0; L < c_maxNSenseLayers; ++L) {
 
  228    for (
unsigned i = 0; i < 2; ++i) {
 
  229      for (
unsigned alpha = 0; alpha < c_maxNAlphaPoints; ++alpha) {
 
  230        for (
unsigned theta = 0; theta < c_maxNThetaPoints; ++theta) {
 
  231          for (
unsigned xtparam = 0; xtparam < c_nXTParams; ++xtparam) {
 
  232            m_XT[L][i][alpha][theta][xtparam] = 0.;
 
  235          for (
unsigned sigmaparam = 0; sigmaparam < c_nSigmaParams; ++sigmaparam) {
 
  236            m_Sigma[L][i][alpha][theta][sigmaparam] = 0.;
 
  243  for (
unsigned board = 0; board < c_nBoards; ++board) {
 
  244    for (
unsigned i = 0; i < 2; ++i) {
 
  247    for (
unsigned channel = 0; channel < 48; ++channel) {
 
  252  for (
unsigned superLayer = 0; superLayer < c_nSuperLayers; ++superLayer) {
 
  253    for (
unsigned layer = 0; layer < 8; ++layer) {
 
  266  m_rWall[0]    = geom.getInnerWall(2).getRmin();
 
  267  m_zWall[0][0] = geom.getInnerWall(0).getZbwd();
 
  268  m_zWall[0][1] = geom.getInnerWall(0).getZfwd();
 
  270  m_rWall[1] = geom.getInnerWall(0).getRmax();
 
  271  m_zWall[1][0] = geom.getInnerWall(0).getZbwd();
 
  272  m_zWall[1][1] = geom.getInnerWall(0).getZbwd();
 
  275  m_rWall[2] = geom.getOuterWall(0).getRmin();
 
  276  m_zWall[2][0] = geom.getOuterWall(0).getZbwd();
 
  277  m_zWall[2][1] = geom.getOuterWall(0).getZfwd();
 
  279  m_rWall[3] = geom.getOuterWall(1).getRmax();
 
  280  m_zWall[3][0] = geom.getOuterWall(0).getZbwd();
 
  281  m_zWall[3][1] = geom.getOuterWall(0).getZfwd();
 
  290    B2DEBUG(100, 
"CDCGeometryPar: Define a mixture of gases and wires in the tracking volume.");
 
  293    B2FATAL(
"CDCGeometryPar: Materialdefinition=2 is disabled for now.");
 
  295    B2FATAL(
"CDCGeometryPar: Materialdefinition mode you specify is invalid.");
 
  306  GearDir content = 
GearDir(
"/Detector/DetectorComponent[@name=\"CDC\"]/Content/");
 
  314  for (
const auto& sense : geom.getSenseLayers()) {
 
  315    uint layerId = sense.getId();
 
  320    m_nWires[layerId]           = sense.getNWires();
 
  322    m_offSet[layerId]           = sense.getOffset();
 
  335      B2FATAL(
"CDCGeometryPar: invalid wire z definition mode specified");
 
  339    const int nWires = 
m_nWires[layerId];
 
  340    for (
int iCell = 0; iCell < nWires; ++iCell) {
 
  347  for (
const auto& field : geom.getFieldLayers()) {
 
  348    uint layerId = field.getId();
 
  380    B2FATAL(
"HardwareClockSettings payloads are not valid.");
 
  381  const double officialClockFreq4TDC = 2 * 
m_clockSettings->getAcceleratorRF(); 
 
  383    B2WARNING(
"ClockFreq4TDC changed from cdclocal " << scientific << setprecision(6) << 
m_clockFreq4TDC << 
" to official " <<
 
  384              officialClockFreq4TDC << 
" (GHz) (difference larger than 0.01%)");
 
  387  B2DEBUG(100, 
"CDCGeometryPar: Clock freq. for TDC= " << 
m_clockFreq4TDC << 
" (GHz).");
 
  389  B2DEBUG(100, 
"CDCGeometryPar: TDC bin width= " << 
m_tdcBinWidth << 
" (ns).");
 
  400  B2DEBUG(100, 
"CDCGeometryPar: Load displacement params. (=1); not load (=0):" << 
m_displacement);
 
  403      B2DEBUG(100, 
"CDCGeometryPar: Read displacement from DB");
 
  412  B2DEBUG(100, 
"CDCGeometryPar: Load alignment params. (=1); not load (=0):" <<
 
  416      B2DEBUG(100, 
"CDCGeometryPar: Read alignment from DB");
 
  425  B2DEBUG(100, 
"CDCGeometryPar: Load misalignment params. (=1); not load (=0):" <<
 
  429      B2DEBUG(100, 
"CDCGeometryPar: Read misalignment from DB");
 
  442    B2FATAL(
"ModifiedLeftRightFlag = true is disabled for now; need to update a G4-related code in framework...");
 
  451      B2DEBUG(100, 
"CDCGeometryPar: Read xt from DB");
 
  458      B2DEBUG(100, 
"CDCGeometryPar: Read sigma from DB");
 
  465      B2DEBUG(100, 
"CDCGeometryPar: Read fudge factors from DB");
 
  472      B2DEBUG(100, 
"CDCGeometryPar: Read prop-speed from DB");
 
  479      B2DEBUG(100, 
"CDCGeometryPar: Read t0 from DB");
 
  486      B2DEBUG(100, 
"CDCGeometryPar: Read badwire from DB");
 
  490      B2FATAL(
"Text file input mode for bdwires is disabled now!");
 
  494      B2DEBUG(100, 
"CDCGeometryPar: Read ch-map from DB");
 
  501      B2DEBUG(100, 
"CDCGeometryPar: Read time-walk from DB");
 
  506    B2DEBUG(100, 
"CDCGeometryPar: Time-walk param. mode= " << 
m_twParamMode);
 
  509      B2DEBUG(29, 
"CDCGeometryPar: Read EDepToADC from DB");
 
  510      if ((*m_eDepToADCConversionsFromDB).isValid()) {
 
  582  std::string fileName0;
 
  587    } 
else if (set == c_Misaligned) {
 
  589    } 
else if (set == c_Aligned) {
 
  595    } 
else if (set == c_Misaligned) {
 
  597    } 
else if (set == c_Aligned) {
 
  604  boost::iostreams::filtering_istream ifs;
 
  609  double back[np], fwrd[np], tension;
 
  614    for (
int i = 0; i < np; ++i) {
 
  617    for (
int i = 0; i < np; ++i) {
 
  623    if (ifs.eof()) 
break;
 
  631    for (
int i = 0; i < np; ++i) {
 
  635      } 
else if (set == c_Misaligned) {
 
  638      } 
else if (set == c_Aligned) {
 
  650    } 
else if (set == c_Misaligned) {
 
  655    } 
else if (set == c_Aligned) {
 
  674  if (nRead != 
m_nSenseWires) B2FATAL(
"CDCGeometryPar::readWirePositionParams: #lines read-in (=" << nRead <<
 
  675                                        ") is inconsistent with total #sense wires (=" << 
m_nSenseWires << 
") !");
 
  678  boost::iostreams::close(ifs);
 
  686  for (
unsigned iL = 0; iL < c_maxNSenseLayers; ++iL) {
 
  693    auto layerID = 
WireID(iL, 511);
 
  704    for (
unsigned iC = 0; iC < 
m_nWires[iL]; ++iC) {
 
  716      m_BWirPosAlign[iL][iC][0] = d_layerXbwd + cos(d_layerPhiBwd) * wireXbwd + sin(d_layerPhiBwd) * wireYbwd;
 
  717      m_BWirPosAlign[iL][iC][1] = d_layerYbwd - sin(d_layerPhiBwd) * wireXbwd + cos(d_layerPhiBwd) * wireYbwd;
 
  720      m_FWirPosAlign[iL][iC][0] = d_layerXfwd + cos(d_layerPhiFwd) * wireXfwd + sin(d_layerPhiFwd) * wireYfwd;
 
  721      m_FWirPosAlign[iL][iC][1] = d_layerYfwd - sin(d_layerPhiFwd) * wireXfwd + cos(d_layerPhiFwd) * wireYfwd;
 
  727  double back[np], fwrd[np];
 
  729  for (
unsigned iL = 0; iL < c_maxNSenseLayers; ++iL) {
 
  735    for (
unsigned iC = 0; iC < 
m_nWires[iL]; ++iC) {
 
  746      for (
int i = 0; i < np; ++i) {
 
  770  double back[np], fwrd[np];
 
  772  for (
unsigned iL = 0; iL < c_maxNSenseLayers; ++iL) {
 
  778    for (
unsigned iC = 0; iC < 
m_nWires[iL]; ++iC) {
 
  789      for (
int i = 0; i < np; ++i) {
 
  824    fileName0 = gbxParams.
getString(
"xt4ReconFileName");
 
  827  boost::iostreams::filtering_istream ifs;
 
  851  unsigned short nAlphaBins = 0;
 
  852  if (ifs >> nAlphaBins) {
 
  853    if (nAlphaBins == 0 || nAlphaBins > c_maxNAlphaPoints) B2FATAL(
"Fail to read alpha bins !");
 
  855    B2FATAL(
"Fail to read alpha bins !");
 
  858  double alpha0, alpha1, alpha2;
 
  859  for (
unsigned short i = 0; i < nAlphaBins; ++i) {
 
  860    ifs >> alpha0 >> alpha1 >> alpha2;
 
  865  unsigned short nThetaBins = 0;
 
  866  if (ifs >> nThetaBins) {
 
  867    if (nThetaBins == 0 || nThetaBins > c_maxNThetaPoints) B2FATAL(
"CDCGeometryPar: fail to read theta bins !");
 
  869    B2FATAL(
"CDCGeometryPar: fail to read theta bins !");
 
  872  double theta0, theta1, theta2;
 
  874  for (
unsigned short i = 0; i < nThetaBins; ++i) {
 
  875    ifs >> theta0 >> theta1 >> theta2;
 
  880  unsigned short iCL, iLR;
 
  881  const unsigned short npx = c_nXTParams - 1;
 
  883  double theta, alpha, dummy1;
 
  886  if (m_xtParamMode < 0 || m_xtParamMode > 3) B2FATAL(
"CDCGeometryPar: invalid xt-parameterization mode read !");
 
  888  if (np <= 0 || np > npx) B2FATAL(
"CDCGeometryPar: no. of xt-params. outside limits !");
 
  890  const double epsi = 0.1;
 
  898    ifs >> theta >> alpha >> dummy1 >> iLR;
 
  899    for (
int i = 0; i < np; ++i) {
 
  904    for (
unsigned short i = 0; i < nThetaBins; ++i) {
 
  910    if (itheta < 0) B2FATAL(
"CDCGeometryPar: thetas in xt.dat are inconsistent !");
 
  913    for (
unsigned short i = 0; i < nAlphaBins; ++i) {
 
  919    if (ialpha < 0) B2FATAL(
"CDCGeometryPar: alphas in xt.dat are inconsistent !");
 
  921    for (
int i = 0; i < np; ++i) {
 
  922      m_XT[iCL][iLR][ialpha][itheta][i] = xtc[i];
 
  925    double boundT = xtc[6];
 
  927      m_XT[iCL][iLR][ialpha][itheta][np] = ROOT::Math::Chebyshev5(boundT, xtc[0], xtc[1], xtc[2], xtc[3], xtc[4], xtc[5]);
 
  929      m_XT[iCL][iLR][ialpha][itheta][np] =
 
  940  boost::iostreams::close(ifs);
 
  943  const double degrad = M_PI / 180.;
 
  944  for (
unsigned i = 0; i < nAlphaBins; ++i) {
 
  947  for (
unsigned i = 0; i < nThetaBins; ++i) {
 
  970    fileName0 = gbxParams.
getString(
"sigma4ReconFileName");
 
  978  unsigned short nAlphaBins = 0;
 
  979  if (ifs >> nAlphaBins) {
 
  980    if (nAlphaBins == 0 || nAlphaBins > c_maxNAlphaPoints) B2FATAL(
"Fail to read alpha bins !");
 
  982    B2FATAL(
"Fail to read alpha bins !");
 
  986  double alpha0, alpha1, alpha2;
 
  987  for (
unsigned short i = 0; i < nAlphaBins; ++i) {
 
  988    ifs >> alpha0 >> alpha1 >> alpha2;
 
  994  unsigned short nThetaBins = 0;
 
  995  if (ifs >> nThetaBins) {
 
  996    if (nThetaBins == 0 || nThetaBins > c_maxNThetaPoints) B2FATAL(
"CDCGeometryPar: fail to read theta bins !");
 
  998    B2FATAL(
"CDCGeometryPar: fail to read theta bins !");
 
 1002  double theta0, theta1, theta2;
 
 1004  for (
unsigned short i = 0; i < nThetaBins; ++i) {
 
 1005    ifs >> theta0 >> theta1 >> theta2;
 
 1010  unsigned short np = 0;
 
 1011  unsigned short iCL, iLR;
 
 1012  double sigma[c_nSigmaParams]; 
 
 1013  double theta, alpha;
 
 1017  if (m_sigmaParamMode < 0 || m_sigmaParamMode > 4) B2FATAL(
"CDCGeometryPar: invalid sigma-parameterization mode read !");
 
 1019  if (np > c_nSigmaParams) B2FATAL(
"CDCGeometryPar: no. of sigma-params. outside limits !");
 
 1023  const double epsi = 0.1;
 
 1025  while (ifs >> iCL) {
 
 1031    ifs >> theta >> alpha >> iLR;
 
 1033    for (
int i = 0; i < np; ++i) {
 
 1038    for (
unsigned short i = 0; i < nThetaBins; ++i) {
 
 1044    if (itheta < 0) B2FATAL(
"CDCGeometryPar: thetas in sigma.dat are inconsistent !");
 
 1047    for (
unsigned short i = 0; i < nAlphaBins; ++i) {
 
 1053    if (ialpha < 0) B2FATAL(
"CDCGeometryPar: alphas in sigma.dat are inconsistent !");
 
 1055    for (
int i = 0; i < np; ++i) {
 
 1056      m_Sigma[iCL][iLR][ialpha][itheta][i] = sigma[i];
 
 1063  const double degrad = M_PI / 180.;
 
 1064  for (
unsigned i = 0; i < nAlphaBins; ++i) {
 
 1067  for (
unsigned i = 0; i < nThetaBins; ++i) {
 
 1080    fileName0 = gbxParams.
getString(
"fudgeFactorFileName");
 
 1082  B2WARNING(
"readFFactor is not ready! " << fileName0);
 
 1092    fileName0 = gbxParams.
getString(
"propSpeed4ReconFileName");
 
 1105    if (ifs.eof()) 
break;
 
 1111    if (
m_debug) B2DEBUG(150, iL << 
" " << speed);
 
 1114  if (nRead != c_maxNSenseLayers) B2FATAL(
"CDCGeometryPar::readPropSpeed: #lines read-in (=" << nRead <<
 
 1115                                            ") is inconsistent with total #layers (=" << c_maxNSenseLayers << 
") !");
 
 1160    fileName0 = gbxParams.
getString(
"t04ReconFileName");
 
 1172    ifs >> iL >> iC >> t0;
 
 1178    if (ifs.eof()) 
break;
 
 1185      B2DEBUG(150, iL << 
" " << iC << 
" " << t0);
 
 1189  if (nRead != 
m_nSenseWires) B2FATAL(
"CDCGeometryPar::readT0: #lines read-in (=" << nRead <<
 
 1190                                        ") is inconsistent with total #sense wires (=" << 
m_nSenseWires << 
") !");
 
 1241    fileName0 = gbxParams.
getString(
"tw4ReconFileName");
 
 1248  unsigned short nPars(0);
 
 1251    B2FATAL(
"CDCGeometryPar::readTW: invalid mode specified!");
 
 1254    B2FATAL(
"CDCGeometryPar::readTW: invalid #params specified!");
 
 1257  unsigned iBoard = 0;
 
 1260  while (ifs >> iBoard) {
 
 1261    for (
unsigned short i = 0; i < nPars; ++i) {
 
 1267  if (nRead != c_nBoards) B2FATAL(
"CDCGeometryPar::readTW: #lines read-in (=" << nRead << 
") is inconsistent with #boards (=" <<
 
 1285  unsigned short iSL, iL, iW, iB, iC;
 
 1290    ifs >> iSL >> iL >> iW >> iB >> iC;
 
 1291    if (ifs.eof()) 
break;
 
 1296    m_wireToBoard.insert(pair<WireID, unsigned short>(wID, iB));
 
 1299  if (nRead != 
m_nSenseWires) B2FATAL(
"CDCGeometryPar::readChMap: #lines read-in (=" << nRead <<
 
 1300                                        ") is inconsistent with #sense-wires (=" 
 1313    fileName0 = gbxParams.
getString(
"fudgeFactorFileName");
 
 1318  std::string fileName1 = 
"/data/cdc/" + fileName0;
 
 1321  if (fileName == 
"") {
 
 1325  if (fileName == 
"") {
 
 1326    B2FATAL(
"CDC::openFile: " << fileName0 << 
" not exist!");
 
 1329    B2DEBUG(29, 
"CDC::openFile: open " << fileName);
 
 1330    ifs.open(fileName.c_str());
 
 1331    if (!ifs) B2FATAL(
"CDC::openFile: cannot open " << fileName << 
" !");
 
 1334  unsigned short paramMode(0), nParams(0);
 
 1335  ifs >> paramMode >> nParams;
 
 1336  if (paramMode > 1) B2FATAL(
"Param mode > 1!");
 
 1337  if (nParams > 7)   B2FATAL(
"No. of params. > 7!");
 
 1338  unsigned short groupId(0);
 
 1340  B2DEBUG(29, paramMode << 
" " << nParams << 
" " << groupId);
 
 1341  if (groupId > 0) B2FATAL(
"GgroupId > 0!");
 
 1344  unsigned short cLMin[c_nSuperLayers], cLMax[c_nSuperLayers]; 
 
 1347  for (
unsigned int sl = 1; sl < c_nSuperLayers; ++sl) {
 
 1348    cLMin[sl] = cLMax[0] + 6 * sl - 5;
 
 1349    cLMax[sl] = cLMax[0] + 6 * sl;
 
 1352  unsigned short id = 0;
 
 1354  unsigned short nRead = 0;
 
 1356    for (
unsigned short i = 0; i < nParams; ++i) {
 
 1358      for (
unsigned short cL = cLMin[
id]; cL <= cLMax[id]; ++cL) { 
 
 1359        for (
unsigned short cell = 0; cell < 
m_nWires[cL]; ++cell) { 
 
 1366    if (nRead > c_nSuperLayers) B2FATAL(
"No. of read in lines > " << c_nSuperLayers << 
" !");
 
 1376  for (
unsigned short iCL = 0; iCL < c_maxNSenseLayers; ++iCL) {
 
 1377    for (
unsigned short iW = 0; iW < c_maxNDriftCells; ++iW) {
 
 1382  for (
auto const& ent : (*m_t0FromDB)->getT0s()) {
 
 1385    const unsigned short iW  = wid.
getIWire();
 
 1396  double oldMeanT0 = 0;
 
 1397  unsigned short it1 = 0;
 
 1398  for (
unsigned short it = 0; it < maxIt; ++it) {
 
 1400    double effiSum = 0.;
 
 1403    for (
unsigned short iCL = 0; iCL < c_maxNSenseLayers; ++iCL) {
 
 1404      for (
unsigned short iW = 0; iW < 
m_nWires[iCL]; ++iW) {
 
 1405        if (
m_t0[iCL][iW] < minT0 || 
m_t0[iCL][iW] > maxT0) 
continue;
 
 1420      B2DEBUG(29, it << 
" " << effiSum << 
" " << 
m_meanT0 << 
" " << stdvT0);
 
 1421      if (fabs(
m_meanT0 - oldMeanT0) < epsi) 
break;
 
 1426      B2FATAL(
"Wire efficiency sum <= 0!");
 
 1429  if (it1 == maxIt - 1) B2WARNING(
"Max. iterations(=" << maxIt << 
") needed to calculte the mean t0. Strange.");
 
 1444  for (
unsigned short iCL = 0; iCL < (*m_propSpeedFromDB)->getEntries(); ++iCL) {
 
 1456  for (
unsigned short iBd = 0; iBd < (*m_timeWalkFromDB)->getEntries(); ++iBd) {
 
 1457    int np = ((*m_timeWalkFromDB)->getTimeWalkParams(iBd)).size();
 
 1458    for (
int i = 0; i < np; ++i) {
 
 1459      m_timeWalkCoef[iBd][i] = ((*m_timeWalkFromDB)->getTimeWalkParams(iBd))[i];
 
 1485  for (
unsigned short iCL = 0; iCL < c_maxNSenseLayers; ++iCL) {
 
 1492    for (
unsigned short iLR = 0; iLR < 2; ++iLR) {
 
 1495          const std::vector<float> params = (*m_xtRelFromDB)->getXtParams(iCL, iLR, iA, iT);
 
 1496          unsigned short np = params.size();
 
 1498          for (
unsigned short i = 0; i < np; ++i) {
 
 1499            m_XT[iCL][iLR][iA][iT][i] = params[i];
 
 1502          double boundT = 
m_XT[iCL][iLR][iA][iT][6];
 
 1504            m_XT[iCL][iLR][iA][iT][np] = ROOT::Math::Chebyshev5(boundT, 
m_XT[iCL][iLR][iA][iT][0], 
m_XT[iCL][iLR][iA][iT][1],
 
 1505                                                                m_XT[iCL][iLR][iA][iT][2], 
m_XT[iCL][iLR][iA][iT][3], 
m_XT[iCL][iLR][iA][iT][4], 
m_XT[iCL][iLR][iA][iT][5]);
 
 1507            m_XT[iCL][iLR][iA][iT][np] =
 
 1508              m_XT[iCL][iLR][iA][iT][0] + boundT
 
 1509              * (
m_XT[iCL][iLR][iA][iT][1] + boundT
 
 1510                 * (
m_XT[iCL][iLR][iA][iT][2] + boundT
 
 1511                    * (
m_XT[iCL][iLR][iA][iT][3] + boundT
 
 1512                       * (
m_XT[iCL][iLR][iA][iT][4] + boundT
 
 1513                          * (
m_XT[iCL][iLR][iA][iT][5])))));
 
 1548  for (
unsigned short iCL = 0; iCL < c_maxNSenseLayers; ++iCL) {
 
 1549    for (
unsigned short iLR = 0; iLR < 2; ++iLR) {
 
 1552          const std::vector<float> params = (*m_sResolFromDB)->getSigmaParams(iCL, iLR, iA, iT);
 
 1553          unsigned short np = params.size();
 
 1555          for (
unsigned short i = 0; i < np; ++i) {
 
 1569  unsigned short groupId = (*m_fFactorFromDB)->getGroupID();
 
 1570  unsigned short nEnt    = (*m_fFactorFromDB)->getEntries();
 
 1571  B2DEBUG(29, 
"setFFactor called: groupId,nEnt= " << groupId << 
" " << nEnt);
 
 1575    B2FATAL(
"CDCGeometryPar:: Invalid group-id " << groupId << 
" specified!");
 
 1578  for (
unsigned short id = 0; 
id < nEnt; ++id) {
 
 1579    unsigned short np = ((*m_fFactorFromDB)->getFactors(
id)).size();
 
 1580    if (np != 3) B2FATAL(
"CDCGeometryPar:: No. of fudge factors != 3!");
 
 1581    for (
unsigned short i = 0; i < np; ++i) {
 
 1598    const unsigned short isl = cm.getISuperLayer();
 
 1600    const uint il  = cm.getILayer();
 
 1601    const int iw  = cm.getIWire();
 
 1602    const int iBd = cm.getBoardID();
 
 1603    const WireID wID(isl, il, iw);
 
 1604    m_wireToBoard.insert(pair<WireID, unsigned short>(wID, iBd));
 
 1605    const int iCh = cm.getBoardChannel();
 
 1614  unsigned short groupId = (*m_eDepToADCConversionsFromDB)->getGroupID();
 
 1615  unsigned short nEnt    = (*m_eDepToADCConversionsFromDB)->getEntries();
 
 1617    if (nEnt > c_nSuperLayers) B2FATAL(
"CDCGeometryPar:: group-id " << groupId << 
" and #entries " << nEnt << 
" are inconsistent!");
 
 1618  } 
else if (groupId == 1) { 
 
 1619    if (nEnt > c_maxNSenseLayers) B2FATAL(
"CDCGeometryPar:: group-id " << groupId << 
" and #entries " << nEnt << 
" are inconsistent!");
 
 1621    B2FATAL(
"CDCGeometryPar:: Invalid group-id " << groupId << 
" specified !");
 
 1624  unsigned short cLMin[c_nSuperLayers], cLMax[c_nSuperLayers]; 
 
 1627  for (
unsigned int sl = 1; sl < c_nSuperLayers; ++sl) {
 
 1628    cLMin[sl] = cLMax[0] + 6 * sl - 5;
 
 1629    cLMax[sl] = cLMax[0] + 6 * sl;
 
 1632  for (
unsigned short id = 0; 
id < nEnt; ++id) {
 
 1633    unsigned short np = ((*m_eDepToADCConversionsFromDB)->getParams(
id)).size();
 
 1634    if (np > 7) B2FATAL(
"CDCGeometryPar:: No. of edep-to-ADC conversion params. > 7");
 
 1636      for (
unsigned short cL = cLMin[
id]; cL <= cLMax[id]; ++cL) { 
 
 1637        for (
unsigned short cell = 0; cell < 
m_nWires[cL]; ++cell) { 
 
 1638          for (
unsigned short i = 0; i < np; ++i) {
 
 1643    } 
else if (groupId == 1) { 
 
 1644      for (
unsigned short cell = 0; cell < 
m_nWires[id]; ++cell) { 
 
 1645        for (
unsigned short i = 0; i < np; ++i) {
 
 1649    } 
else if (groupId == 2) { 
 
 1651      B2FATAL(
"CDCGeometryPar::setEDepToADCConversions(): groupId=2 not ready!");
 
 1670  const double cth  = fabs(costh) + dlt;
 
 1671  const double iGen = edep / dx; 
 
 1672  const double tmp  = cth - gam * iGen;
 
 1673  const double disc = tmp * tmp + 4.*alf * cth * iGen;
 
 1677    iMea = cth * iGen / tmp;
 
 1678  } 
else if (disc >= 0.) {
 
 1679    iMea = (-tmp + 
sqrt(disc)) / (2.*alf);
 
 1687  double convF = mainF;
 
 1689    convF = mainF * std::min(iMea / iGen, 1.);
 
 1698  convF *= 1. + a * (costh - b);
 
 1718  if (set == c_Misaligned) {
 
 1722  } 
else if (set == c_Base) {
 
 1744  if (set == c_Misaligned) {
 
 1747  } 
else if (set == c_Base) {
 
 1766  if (set == c_Misaligned) {
 
 1770  } 
else if (set == c_Base) {
 
 1792  if (set == c_Misaligned) {
 
 1795  } 
else if (set == c_Base) {
 
 1806  if (set == c_Misaligned) {
 
 1808  } 
else if (set == c_Aligned) {
 
 1816  static double IRWL[c_maxNSenseLayers] = {0};
 
 1828  static double ORWL[c_maxNSenseLayers] = {0};
 
 1844  const unsigned nWires = 
m_nWires[layerId];
 
 1848  const double phiSize = 2 * M_PI / double(nWires);
 
 1865  for (
unsigned i = 0; i < 1; ++i) {
 
 1866    const double phiF = phiSize * (double(i) + 
offset)
 
 1873    const double beta = (position.
Z() - b.Z()) / u.Z();
 
 1875    double dPhi = std::atan2(position.
Y(), position.
X())
 
 1876                  - std::atan2(p.Y(), p.X())
 
 1878    while (dPhi < 0) dPhi += (2. * M_PI);
 
 1879    j = int(dPhi / phiSize);
 
 1880    while (j >= nWires) j -= nWires;
 
 1889  std::ofstream ofs(of.c_str(), std::ios::out);
 
 1891    B2ERROR(
"CDCGeometryPar::read !!! can not open file : " 
 1894  ofs << 
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
 1896      << 
"<Subdetector type=\"CDC\">" 
 1898      << 
"  <Name>CDC BelleII </Name>" 
 1900      << 
"  <Description>CDC geometry parameters</Description>" 
 1902      << 
"  <Version>0</Version>" 
 1904      << 
"  <GeoCreator>CDCBelleII</GeoCreator>" 
 1908      << 
"    <Rotation desc=\"Rotation of the whole cdc detector (should be the same as beampipe)\" unit=\"mrad\">0.0</Rotation>" 
 1910      << 
"    <OffsetZ desc=\"The offset of the whole cdc in z with respect to the IP (should be the same as beampipe)\" unit=\"mm\">0.0</OffsetZ>" 
 1912      << 
"    <Material>CDCGas</Material>" 
 1916  ofs << 
"    <SLayers>" << endl;
 
 1919    ofs << 
"      <SLayer id=\"" << i << 
"\">" << endl;
 
 1920    ofs << 
"        <Radius desc=\"Radius of wires in this layer\" unit=\"mm\">" << 
senseWireR(i) << 
"</Radius>" << endl;
 
 1921    ofs << 
"        <BackwardZ desc=\"z position of this wire layer at backward endplate\" unit=\"mm\">" << 
senseWireBZ(
 
 1922          i) << 
"</BackwardZ>" << endl;
 
 1923    ofs << 
"        <ForwardZ desc=\"z position of this wire layer at forward endplate\" unit=\"mm\">" << 
senseWireFZ(
 
 1924          i) << 
"</ForwardZ>" << endl;
 
 1927    ofs << 
"        <NHoles desc=\"the number of holes in this layer, 2*(cell number)\">" << 
nWiresInLayer(
 
 1928          i) * 2 << 
"</NHoles>" << endl;
 
 1929    ofs << 
"        <NShift desc=\"the shifted hole number of each wire in this layer\">" << 
nShifts(i) << 
"</NShift>" << endl;
 
 1930    ofs << 
"        <Offset desc=\"wire offset in phi direction at endplate\">" << 
m_offSet[i] << 
"</Offset>" << endl;
 
 1931    ofs << 
"      </SLayer>" << endl;
 
 1934  ofs << 
"    </SLayers>" << endl;
 
 1935  ofs << 
"    <FLayers>" << endl;
 
 1938    ofs << 
"      <FLayer id=\"" << i << 
"\">" << endl;
 
 1939    ofs << 
"        <Radius desc=\"Radius of field wires in this layer\" unit=\"mm\">" << 
fieldWireR(i) << 
"</Radius>" << endl;
 
 1940    ofs << 
"        <BackwardZ desc=\"z position of this field wire layer at backward endplate\" unit=\"mm\">" << 
fieldWireBZ(
 
 1941          i) << 
"</BackwardZ>" << endl;
 
 1942    ofs << 
"        <ForwardZ desc=\"z position of this field wire layer at forward endplate\" unit=\"mm\">" << 
fieldWireFZ(
 
 1943          i) << 
"</ForwardZ>" << endl;
 
 1944    ofs << 
"      </FLayer>" << endl;
 
 1947  ofs << 
"    </FLayers>" << endl;
 
 1949  ofs << 
"    <InnerWall name=\"InnerWall\">" << endl;
 
 1950  ofs << 
"      <InnerR desc=\"Inner radius\" unit=\"mm\">" << 
innerRadiusInnerWall() << 
"</InnerR>" << endl;
 
 1951  ofs << 
"      <OuterR desc=\"Outer radius\" unit=\"mm\">" << 
outerRadiusInnerWall() << 
"</OuterR>" << endl;
 
 1952  ofs << 
"      <BackwardZ desc=\"z position at backward endplate\" unit=\"mm\">" << 
m_zWall[0][0] << 
"</BackwardZ>" << endl;
 
 1953  ofs << 
"      <ForwardZ desc=\"z position at forward endplate\" unit=\"mm\">" << 
m_zWall[0][1] << 
"</ForwardZ>" << endl;
 
 1954  ofs << 
"    </InnerWall>" << endl;
 
 1956  ofs << 
"    <OuterWall name=\"OuterWall\">" << endl;
 
 1957  ofs << 
"      <InnerR desc=\"Inner radius\" unit=\"mm\">" << 
innerRadiusOuterWall() << 
"</InnerR>" << endl;
 
 1958  ofs << 
"      <OuterR desc=\"Outer radius\" unit=\"mm\">" << 
outerRadiusOuterWall() << 
"</OuterR>" << endl;
 
 1959  ofs << 
"      <BackwardZ desc=\"z position at backward endplate\" unit=\"mm\">" << 
m_zWall[2][0] << 
"</BackwardZ>" << endl;
 
 1960  ofs << 
"      <ForwardZ desc=\"z position at forward endplate\" unit=\"mm\">" << 
m_zWall[2][1] << 
"</ForwardZ>" << endl;
 
 1961  ofs << 
"    </OuterWall>" << endl;
 
 1963  ofs << 
"  </Content>"                                         << endl
 
 1964      << 
"</Subdetector>"                                       << endl;
 
 1968                                      double& Yb_sag, 
double& Yf_sag)
 const 
 1999  if (set == c_Aligned) {
 
 2013  } 
else if (set == c_Misaligned) {
 
 2027  } 
else if (set == c_Base) {
 
 2042    B2FATAL(
"CDCGeometryPar::getWireSagEffect: called with an invalid set: " << 
" " << set);
 
 2045  const double dx = Xf - Xb;
 
 2046  const double dy = Yf - Yb;
 
 2047  const double dz = Zf - Zb;
 
 2049  const double Zfp = 
sqrt(dz * dz + dx * dx); 
 
 2050  const double Zp  = (Z - Zb) * Zfp / dz;
 
 2052  const double Y_sag = (Coef * (Zp - Zfp) + dy / Zfp) * Zp + Yb;
 
 2053  const double dydz = (Coef * (2.*Zp - Zfp) * Zfp + dy) / dz;
 
 2055  Yb_sag = Y_sag + dydz * (Zb - Z);
 
 2056  Yf_sag = Y_sag + dydz * (Zf - Z);
 
 2062  const unsigned L = layerID;
 
 2063  const unsigned C =  cellID;
 
 2067  const double phiSize = 2 * M_PI / double(
m_nWires[L]);
 
 2069  const double phiF = phiSize * (double(C) + 
offset)
 
 2082  for (
int i = 0; i < 3; ++i) {
 
 2100  const unsigned L = layerID;
 
 2101  const unsigned C =  cellID;
 
 2103  static bool first = 
true;
 
 2104  static ofstream ofs;
 
 2107    ofs.open(
"alignment.dat");
 
 2110  ofs << L << 
"  " << C;
 
 2112  ofs << setiosflags(ios::showpoint | ios::uppercase);
 
 2114  for (
int i = 0; i < 3; ++i) ofs << 
"  " <<  setw(15) << setprecision(8) << 
m_BWirPos[L][C][i];
 
 2116  for (
int i = 0; i < 3; ++i) ofs << 
"  " <<  setw(15) << setprecision(8) << 
m_FWirPos[L][C][i];
 
 2117  ofs << setiosflags(ios::fixed);
 
 2124                                 const double theta)
 const 
 2126  if (iCLayer < m_firstLayerOffset || iCLayer >= c_maxNSenseLayers) {
 
 2134  double delta = time - minTime;
 
 2140    B2FATAL(
"linearInterpolationOfXT = false is not allowed now !");
 
 2143    unsigned short ial[2] = {0};
 
 2144    unsigned short ilr[2] = {lro, lro};
 
 2147    unsigned short ith[2] = {0};
 
 2150    unsigned short jal(0), jlr(0), jth(0);
 
 2154    double timep = delta < 0. ? minTime - delta : time;
 
 2157    for (
unsigned k = 0; k < 4; ++k) {
 
 2162        w = (1. - wal) * (1. - wth);
 
 2163      } 
else if (k == 1) {
 
 2167        w = (1. - wal) * wth;
 
 2168      } 
else if (k == 2) {
 
 2172        w = wal * (1. - wth);
 
 2173      } 
else if (k == 3) {
 
 2180      double boundary = 
m_XT[iCLayer][jlr][jal][jth][6];
 
 2182      if (timep < boundary) {
 
 2184          const double& c1 = 
m_XT[iCLayer][jlr][jal][jth][1];
 
 2185          const double& c2 = 
m_XT[iCLayer][jlr][jal][jth][2];
 
 2186          const double& c3 = 
m_XT[iCLayer][jlr][jal][jth][3];
 
 2187          const double& c4 = 
m_XT[iCLayer][jlr][jal][jth][4];
 
 2188          const double& c5 = 
m_XT[iCLayer][jlr][jal][jth][5];
 
 2189          dDdt += w * ROOT::Math::Chebyshev4(timep, c1 + 3.*c3 + 5.*c5, 4.*c2 + 8.*c4, 6.*c3 + 10.*c5, 8.*c4, 10.*c5);
 
 2191          dDdt += w * (
m_XT[iCLayer][jlr][jal][jth][1] + timep
 
 2192                       * (2.*
m_XT[iCLayer][jlr][jal][jth][2] + timep
 
 2193                          * (3.*
m_XT[iCLayer][jlr][jal][jth][3] + timep
 
 2194                             * (4.*
m_XT[iCLayer][jlr][jal][jth][4] + timep
 
 2195                                * (5.*
m_XT[iCLayer][jlr][jal][jth][5])))));
 
 2198        dDdt += w * 
m_XT[iCLayer][jlr][jal][jth][7];
 
 2212                                       const double theta)
 const 
 2214  if (iCLayer < m_firstLayerOffset || iCLayer >= c_maxNSenseLayers) {
 
 2226    B2FATAL(
"linearInterpolationOfXT = false is not allowed now !");
 
 2229    unsigned short ial[2] = {0};
 
 2230    unsigned short ilr[2] = {lro, lro};
 
 2233    unsigned short ith[2] = {0};
 
 2236    unsigned short jal(0), jlr(0), jth(0);
 
 2240    double timep = time;
 
 2244    for (
unsigned k = 0; k < 4; ++k) {
 
 2249        w = (1. - wal) * (1. - wth);
 
 2250      } 
else if (k == 1) {
 
 2254        w = (1. - wal) * wth;
 
 2255      } 
else if (k == 2) {
 
 2259        w = wal * (1. - wth);
 
 2260      } 
else if (k == 3) {
 
 2267      double boundary = 
m_XT[iCLayer][jlr][jal][jth][6];
 
 2269      if (timep < boundary) {
 
 2271          dist += w * ROOT::Math::Chebyshev5(timep, 
m_XT[iCLayer][jlr][jal][jth][0], 
m_XT[iCLayer][jlr][jal][jth][1],
 
 2272                                             m_XT[iCLayer][jlr][jal][jth][2], 
m_XT[iCLayer][jlr][jal][jth][3], 
m_XT[iCLayer][jlr][jal][jth][4], 
m_XT[iCLayer][jlr][jal][jth][5]);
 
 2274          dist += w * (
m_XT[iCLayer][jlr][jal][jth][0] + timep
 
 2275                       * (
m_XT[iCLayer][jlr][jal][jth][1] + timep
 
 2276                          * (
m_XT[iCLayer][jlr][jal][jth][2] + timep
 
 2277                             * (
m_XT[iCLayer][jlr][jal][jth][3] + timep
 
 2278                                * (
m_XT[iCLayer][jlr][jal][jth][4] + timep
 
 2279                                   * (
m_XT[iCLayer][jlr][jal][jth][5]))))));
 
 2282        dist += w * (
m_XT[iCLayer][jlr][jal][jth][7] * (timep - boundary) + 
m_XT[iCLayer][jlr][jal][jth][8]);
 
 2295                                      const bool calculateMinTime,
 
 2296                                      const double inputMinTime)
 const 
 2298  if (iCLayer < m_firstLayerOffset || iCLayer >= c_maxNSenseLayers) {
 
 2305  double minTime = calculateMinTime ? 
getMinDriftTime(iCLayer, lr, alpha, theta) : inputMinTime;
 
 2306  double delta = time - minTime;
 
 2314    B2FATAL(
"linearInterpolationOfXT = false is not allowed now !");
 
 2317    unsigned short ial[2] = {0};
 
 2318    unsigned short ilr[2] = {lro, lro};
 
 2321    unsigned short ith[2] = {0};
 
 2324    unsigned short jal(0), jlr(0), jth(0);
 
 2328    double timep = delta < 0. ? minTime - delta : time;
 
 2333    for (
unsigned k = 0; k < 4; ++k) {
 
 2338        w = (1. - wal) * (1. - wth);
 
 2339      } 
else if (k == 1) {
 
 2343        w = (1. - wal) * wth;
 
 2344      } 
else if (k == 2) {
 
 2348        w = wal * (1. - wth);
 
 2349      } 
else if (k == 3) {
 
 2369      double boundary = 
m_XT[iCLayer][jlr][jal][jth][6];
 
 2371      if (timep < boundary) {
 
 2373          dist += w * ROOT::Math::Chebyshev5(timep, 
m_XT[iCLayer][jlr][jal][jth][0], 
m_XT[iCLayer][jlr][jal][jth][1],
 
 2374                                             m_XT[iCLayer][jlr][jal][jth][2], 
m_XT[iCLayer][jlr][jal][jth][3], 
m_XT[iCLayer][jlr][jal][jth][4], 
m_XT[iCLayer][jlr][jal][jth][5]);
 
 2376          dist += w * (
m_XT[iCLayer][jlr][jal][jth][0] + timep
 
 2377                       * (
m_XT[iCLayer][jlr][jal][jth][1] + timep
 
 2378                          * (
m_XT[iCLayer][jlr][jal][jth][2] + timep
 
 2379                             * (
m_XT[iCLayer][jlr][jal][jth][3] + timep
 
 2380                                * (
m_XT[iCLayer][jlr][jal][jth][4] + timep
 
 2381                                   * (
m_XT[iCLayer][jlr][jal][jth][5]))))));
 
 2384        dist += w * (
m_XT[iCLayer][jlr][jal][jth][7] * (timep - boundary) + 
m_XT[iCLayer][jlr][jal][jth][8]);
 
 2391  if (delta < 0.) dist *= -1.;
 
 2397                                       const double theta)
 const 
 2399  if (iCLayer < m_firstLayerOffset || iCLayer >= c_maxNSenseLayers) {
 
 2403  double minTime = 0.;
 
 2409    B2FATAL(
"linearInterpolationOfXT = false is not allowed now !");
 
 2412    unsigned short ial[2] = {0};
 
 2413    unsigned short ilr[2] = {lro, lro};
 
 2416    unsigned short ith[2] = {0};
 
 2419    unsigned short jal(0), jlr(0), jth(0);
 
 2422    double c[6] = {0.}, a[6] = {0.};
 
 2423    for (
unsigned k = 0; k < 4; ++k) {
 
 2428        w = (1. - wal) * (1. - wth);
 
 2429      } 
else if (k == 1) {
 
 2433        w = (1. - wal) * wth;
 
 2434      } 
else if (k == 2) {
 
 2438        w = wal * (1. - wth);
 
 2439      } 
else if (k == 3) {
 
 2446      for (
int i = 0; i < 5; ++i) {
 
 2447        c[i] += w * 
m_XT[iCLayer][jlr][jal][jth][i];
 
 2452      a[0] = c[0] -    c[2] +    c[4];
 
 2453      a[1] = c[1] - 3.*c[3] + 5.*c[5];
 
 2454      a[2] =        2.*c[2] - 8.*c[4];
 
 2455      a[3] =        4.*c[3] - 20.*c[5];
 
 2459      for (
int i = 0; i < 5; ++i) a[i] = c[i];
 
 2466      const double det = a[1] * a[1] - 4.*a[2] * a[0];
 
 2469        minTime = (-a[1] + 
sqrt(det)) / (2.*a[2]);
 
 2473        minTime = -a[1]  / (2.*a[2]);
 
 2476    } 
else if (a[1] != 0.) {
 
 2477      minTime = -a[0] / a[1];  
 
 2479      B2WARNING(
"CDCGeometryPar::getMinDriftTime: minDriftTime not determined; assume zero.\n" << 
"layer(#0-55),lr,alpha(rad),theta= " <<
 
 2480                iCLayer << 
" " << lr << 
" " << alpha << 
" " << theta);
 
 2489    const double epsi4x = 5.e-6; 
 
 2491    const unsigned short maxIter = 8;
 
 2492    const double maxDt = 20.; 
 
 2493    unsigned short nIter = 0;
 
 2494    double minXsq = 1.e10; 
 
 2495    double minMinTime = minTime;
 
 2498    for (nIter = 0; nIter <= maxIter; ++nIter) {
 
 2501      double x   = a[0] + t * (a[1] + t * (a[2] + t * (a[3] + t * (a[4] + t * a[5]))));
 
 2507      double xp  = a[1] + t * (2 * a[2] + t * (3 * a[3] + t * (4 * a[4] + t * 5 * a[5])));
 
 2508      double xpp = 2 * a[2] + t * (6 * a[3] + t * (12 * a[4] + t * 20 * a[5]));
 
 2509      double den = xp * xp + x * xpp;
 
 2516        edm = fabs(x * xp) / 
sqrt(den); 
 
 2517        if (edm < epsi4x) 
break; 
 
 2524          dt = std::min(dt,  maxDt);
 
 2526          dt = std::max(dt, -maxDt);
 
 2529        B2WARNING(
"CDCGeometryPar::getMinDriftTime: den = 0\n" << 
"layer(#0-55),lr,alpha(rad),theta= " <<
 
 2532                  " " << alpha << 
" " << theta);
 
 2538    if (nIter == (maxIter + 1)) minTime = minMinTime;
 
 2591                                    const double theta)
 const 
 2593  if (iCLayer < m_firstLayerOffset || iCLayer >= c_maxNSenseLayers) {
 
 2599  const double eps = 2.5e-1;
 
 2600  const double maxTrials = 100;
 
 2608  double maxTime = 2000.; 
 
 2614  double t0 = minTime;
 
 2616  const bool calMinTime = 
false;
 
 2621  double t1 = maxTime;
 
 2623  while (((t1 - t0) > eps) && (i < maxTrials)) {
 
 2624    time = 0.5 * (t0 + t1);
 
 2625    double d1 = 
getDriftLength(time, iCLayer, lr, alpha, theta, calMinTime, minTime) - dist;
 
 2635  if (i >= maxTrials - 1 || time > maxTime) {
 
 2636    B2WARNING(
"CDCGeometryPar::getDriftTime " << dist << 
" " << iCLayer << 
" " << alpha << 
" " << lr << 
" " << t0 << 
" " << t1 << 
" " <<
 
 2647                                const double theta)
 const 
 2649  if (iCLayer < m_firstLayerOffset || iCLayer >= c_maxNSenseLayers) {
 
 2656  const double driftL = fabs(DriftL0);
 
 2662    B2FATAL(
"linearInterpolationOfSgm = false is not allowed now !");
 
 2666    unsigned short ial[2] = {0};
 
 2667    unsigned short ilr[2] = {lro, lro};
 
 2670    unsigned short ith[2] = {0};
 
 2674    unsigned short jal(0), jlr(0), jth(0);
 
 2676    for (
unsigned k = 0; k < 4; ++k) {
 
 2681        w = (1. - wal) * (1. - wth);
 
 2682      } 
else if (k == 1) {
 
 2686        w = (1. - wal) * wth;
 
 2687      } 
else if (k == 2) {
 
 2691        w = wal * (1. - wth);
 
 2692      } 
else if (k == 3) {
 
 2710      const double& P0 = 
m_Sigma[iCLayer][jlr][jal][jth][0];
 
 2711      const double& P1 = 
m_Sigma[iCLayer][jlr][jal][jth][1];
 
 2712      const double& P2 = 
m_Sigma[iCLayer][jlr][jal][jth][2];
 
 2713      const double& P3 = 
m_Sigma[iCLayer][jlr][jal][jth][3];
 
 2714      const double& P4 = 
m_Sigma[iCLayer][jlr][jal][jth][4];
 
 2715      const double& P5 = 
m_Sigma[iCLayer][jlr][jal][jth][5];
 
 2716      const double& P6 = 
m_Sigma[iCLayer][jlr][jal][jth][6];
 
 2718#if defined(CDC_DEBUG) 
 2719      cout << 
"driftL= " << driftL << endl;
 
 2720      cout << 
"iCLayer= " << iCLayer << 
" " << jlr << 
" " << jal << 
" " << jth << endl;
 
 2721      cout << 
"P0= " << P0 << endl;
 
 2722      cout << 
"P1= " << P1 << endl;
 
 2723      cout << 
"P2= " << P2 << endl;
 
 2724      cout << 
"P3= " << P3 << endl;
 
 2725      cout << 
"P4= " << P4 << endl;
 
 2726      cout << 
"P5= " << P5 << endl;
 
 2727      cout << 
"P6= " << P6 << endl;
 
 2732        sigma += w * 
sqrt(P0 / (driftL * driftL + P1) + P2 * driftL + P3 +
 
 2733                          P4 * exp(P5 * (driftL - P6) * (driftL - P6)));
 
 2735        double forthTermAtP7 = P4 * exp(P5 * (P7 - P6) * (P7 - P6));
 
 2736        const double& P8 = 
m_Sigma[iCLayer][jlr][jal][jth][8];
 
 2738          double sigmaAtP7 = 
sqrt(P0 / (P7 * P7 + P1) + P2 * P7 + P3 + forthTermAtP7);
 
 2739          sigma += w * (P8 * (driftL - P7) + sigmaAtP7);
 
 2741          double onePls4AtP7 = 
sqrt(P0 / (P7 * P7 + P1) + forthTermAtP7);
 
 2742          const double onePls4 = P8 * (driftL - P7) + onePls4AtP7;
 
 2743          sigma += w * 
sqrt(P2 * driftL + P3 + onePls4 * onePls4);
 
 2745          forthTermAtP7 = 
sqrt(forthTermAtP7);
 
 2746          const double forthTerm = P8 * (driftL - P7) + forthTermAtP7;
 
 2747          sigma += w * 
sqrt(P0 / (driftL * driftL + P1) + P2 * driftL + P3 +
 
 2748                            forthTerm * forthTerm);
 
 2761  unsigned short lr = 0;
 
 2762  double wCrossT = (posOnWire.
Cross(posOnTrack)).Z();
 
 2766  } 
else if (wCrossT > 0.) {
 
 2769    if ((posOnTrack - posOnWire).Perp() != 0.) {
 
 2770      double wCrossP = (posOnWire.
Cross(momentum)).Z();
 
 2772        if (posOnTrack.
Perp() > posOnWire.
Perp()) {
 
 2777      } 
else if (wCrossP < 0.) {
 
 2778        if (posOnTrack.
Perp() < posOnWire.
Perp()) {
 
 2796  const double distanceCrossP = ((posOnWire - posOnTrack).Cross(momentum)).Z();
 
 2797  unsigned short int lr = (distanceCrossP > 0.) ? 1 : 0;
 
 2804  const double wx = posOnWire.
X();
 
 2805  const double wy = posOnWire.
Y();
 
 2806  const double px = momentum.X();
 
 2807  const double py = momentum.Y();
 
 2809  const double cross = wx * py - wy * px;
 
 2810  const double dot   = wx * px + wy * py;
 
 2812  return atan2(cross, 
dot);
 
 2817  return atan2(momentum.Perp(), momentum.Z());
 
 2823  unsigned short lro = (fabs(alpha) <= 0.5 * M_PI) ? lr : abs(lr - 1);
 
 2831  double alphao = alpha;
 
 2832  if (alpha >  0.5 * M_PI) {
 
 2834  } 
else if (alpha < -0.5 * M_PI) {
 
 2844  double thetao = fabs(alpha) >  0.5 * M_PI  ?  M_PI - theta  :  theta;
 
 2850                                           unsigned short lrs[2])
 const 
 2859      lrs[0] = abs(lrs[0] - 1); 
 
 2866      lrs[1] = abs(lrs[1] - 1); 
 
 2873    points[0] = points[1] - 1;
 
 2880                                               unsigned short lrs[2])
 const 
 2889      lrs[0] = abs(lrs[0] - 1); 
 
 2896      lrs[1] = abs(lrs[1] - 1); 
 
 2903    points[0] = points[1] - 1;
 
 2929    points[0] = points[1] - 1;
 
 2936                                               unsigned short points[2])
 const 
 2952    points[0] = points[1] - 1;
 
 2984  const unsigned short nLayers[c_nSuperLayers] = {8, 6, 6, 6, 6, 6, 6, 6, 6}; 
 
 2986  for (
unsigned short SLayer = 0; SLayer < c_nSuperLayers; ++SLayer) {
 
 2987    unsigned short firstCLayer = 0;
 
 2988    for (
unsigned short i = 0; i < SLayer; ++i) {
 
 2989      firstCLayer += nLayers[i];
 
 2994    for (
unsigned short Layer = 0; Layer < nLayers[SLayer]; ++Layer) {
 
 2995      unsigned short CLayer = firstCLayer + Layer;
 
 2997      if (CLayer == firstCLayer) {
 
 3000      } 
else if (CLayer == firstCLayer + 1) {
 
 3006        if (Layer % 2 == 0) {
 
DataType Z() const
access variable Z (= .at(2) without boundary check)
void SetX(DataType x)
set X/1st-coordinate
B2Vector3< DataType > Cross(const B2Vector3< DataType > &p) const
Cross product.
DataType X() const
access variable X (= .at(0) without boundary check)
DataType Y() const
access variable Y (= .at(1) without boundary check)
void SetZ(DataType z)
set Z/3rd-coordinate
void SetY(DataType y)
set Y/2nd-coordinate
DataType Perp() const
The transverse component (R in cylindrical coordinate system).
B2Vector3< DataType > Unit() const
Unit vector parallel to this.
static const baseType layerDPhi
Layer rotation in global X-Y plane (gamma) dPhi = foward - backward endplate.
static const baseType layerDy
Layer shift in global Y dY = foward - backward endplate.
static const baseType wireBwdZ
Wire Z position w.r.t. nominal on backward endplate.
static const baseType layerDx
Layer shift in global X dX = foward - backward endplate.
static const baseType wireBwdY
Wire Y position w.r.t. nominal on backward endplate.
static const baseType wireFwdZ
Wire Z position w.r.t. nominal on forward endplate.
static const baseType wireFwdY
Wire Y position w.r.t. nominal on forward endplate.
static const baseType wireFwdX
Wire X position w.r.t. nominal on forward endplate.
static const baseType wireBwdX
Wire X position w.r.t. nominal on backward endplate.
static const baseType layerY
Layer shift in global Y at backward endplate.
static const baseType layerX
Layer shift in global X at backward endplate.
static const baseType layerPhi
Layer rotation in global X-Y plane (gamma) at backward endplate.
static const baseType wireTension
Wire tension w.r.t. nominal (=50. ?)
The Class for CDC geometry.
static const baseType wireBwdZ
Wire Z position w.r.t. nominal on backward endplate.
static const baseType wireBwdY
Wire Y position w.r.t. nominal on backward endplate.
static const baseType wireFwdZ
Wire Z position w.r.t. nominal on forward endplate.
static const baseType wireFwdY
Wire Y position w.r.t. nominal on forward endplate.
static const baseType wireFwdX
Wire X position w.r.t. nominal on forward endplate.
static const baseType wireBwdX
Wire X position w.r.t. nominal on backward endplate.
static const baseType wireTension
Wire tension w.r.t. nominal (=50. ?)
The Class for CDC Geometry Control Parameters.
bool getDebug() const
Get debug flag.
bool getSigmaInputType()
Get input type for sigma.
bool getMisalignmentInputType()
Get input type for wire misalignment.
std::string getT0File() const
Get input file name for t0.
bool getDisplacementInputType()
Get input type for wire displacement.
double getAddFudgeFactorForSigmaForMC() const
Get additional fudge factor for space resol for MC.
std::string getEDepToADCFile() const
Get input file name for edeptoadc.
std::string getDisplacementFile() const
Get input file name for wire displacement.
std::string getMisalignmentFile() const
Get input file name for wire misalignment.
std::string getAlignmentFile() const
Get input file name for wire alignment.
bool getAlignmentInputType()
Get input type for wire alignment.
double getMaterialDefinitionMode() const
Get material definition mode.
std::string getPropSpeedFile() const
Get input file name for prop-speed.
bool getT0InputType()
Get input type for t0.
bool getEDepToADCInputType()
Get input type for edeptoadc.
std::string getSigmaFile() const
Get input file name for sigma.
bool getAlignment() const
Get alignment switch.
bool getMisalignment() const
Get misalignment switch.
bool getDisplacement() const
Get displacement switch.
int getSenseWireZposMode() const
Get sense wire z position mode.
double getAddFudgeFactorForSigmaForData() const
Get additional fudge factor for space resol for data.
std::string getXtFile() const
Get input file name for xt-relation.
bool getTwInputType()
Get input type for time-walk.
std::string getFFactorFile() const
Get input file name for fudge factor.
bool getChMapInputType()
Get input type for channel map.
std::string getTwFile() const
Get input file name for time-walk.
bool getFFactorInputType()
Get input type for fuge factor.
bool getXtInputType()
Get input type for xt.
bool getBwInputType()
Get input type for bad wire.
bool getPropSpeedInputType()
Get input type for prop.
static CDCGeoControlPar & getInstance()
Static method to get a reference to the CDCGeoControlPar instance.
std::string getChMapFile() const
Get input file name for channel map.
The Class for CDC Geometry Parameters.
void outputDesignWirParam(unsigned layerID, unsigned cellID) const
Write the designed wire parameters to the alignment.dat (default).
std::map< WireID, unsigned short > m_wireToChannel
map relating wire-id and channel-id.
void setWirPosAlignParams()
Set wire alignment params.
int m_materialDefinitionMode
Control switch for gas and wire material definition.
unsigned short m_nAlphaPoints4Sgm
No.
void readSigma(const GearDir &gbxParams, int mode=0)
Read spatial resolution table.
void readTW(const GearDir &gbxParams, int mode=0)
Read time-walk parameter.
void setXtRel()
Set XT-relation table (from DB) (new).
float m_BWirPosMisalign[c_maxNSenseLayers][c_maxNDriftCells][3]
Wire position incl.
DBObjPtr< CDCBadWires > * m_badWireFromDB
bad-wires retrieved from DB.
double getTheta(const B2Vector3D &momentum) const
Returns track incident angle (theta in rad.).
void readT0(const GearDir &gbxParams, int mode=0)
Read t0 parameters (from a file).
void setT0()
Set t0 parameters (from DB)
float m_alphaPoints4Sgm[c_maxNAlphaPoints]
alpha sampling points for sigma (rad)
virtual ~CDCGeometryPar()
Destructor.
ushort m_maxNSuperLayers
Maximum number of Super Layers.
double m_fudgeFactorForSigma[3]
Fuge factor for space resol.
double outerRadiusInnerWall() const
Returns the outer radius of the inner wall.
int m_sigmaParamMode
Mode for sigma parameterization.
bool m_alignment
Switch for alignment.
float m_alphaPoints[c_maxNAlphaPoints]
alpha sampling points for xt (rad)
void getClosestAlphaPoints(const double alpha, double &wal, unsigned short points[2], unsigned short lrs[2]) const
Returns the two closest alpha points for the input track incident angle (alpha).
void readEDepToADC(const GearDir &gbxParams, int mode=0)
Read spatial edep-to-adc conv.
double m_globalPhiRotation
Global ratation in phi (rad.); only for sence wires now.
EWirePosition
Wire position set.
double innerRadiusOuterWall() const
Returns the inner radius of the outer wall.
unsigned cellId(unsigned layerId, const B2Vector3D &position) const
The method to get cell id based on given layer id and the position.
void newReadSigma(const GearDir &gbxParams, int mode=0)
Read spatial resolution table in new format.
void setEDepToADCConversions()
Set edep-to-ADC conversion params.
double m_nominalPropSpeed
Nominal propagation speed of the sense wire (27.25 cm/nsec).
int nShifts(int layerId) const
Returns number shift.
float m_thetaPoints[c_maxNThetaPoints]
theta sampling points for xt (rad)
void setDesignWirParam(unsigned layerID, unsigned cellID)
Set the desizend wire parameters.
void getWireSagEffect(EWirePosition set, unsigned layerID, unsigned cellID, double zw, double &ywb_sag, double &ywf_sag) const
Compute effects of the sense wire sag.
DBArray< CDCDisplacement > * m_displacementFromDB
displacement params.
bool m_XTetc
Switch for reading x-t etc.
void setShiftInSuperLayer()
Calculates and saves shifts in super-layers (to be used in searching hits in neighboring cells)
int m_nShifts[c_maxNSenseLayers]
The array to store shifted cell number in each sense wire layer.
bool m_wireSag
Switch for sense wire sag.
bool m_XTetc4Recon
Switch for selecting xt etc.
double getDriftLength0(double dt, unsigned short layer, unsigned short lr, double alpha=0., double theta=0.5 *M_PI) const
Return the drift dength to the sense wire; tentative ver.
unsigned short m_boardAndChannelToWire[c_nBoards][48]
array relating board-channel-id and wire-id.
unsigned short m_nThetaPoints4Sgm
No.
float m_WireSagCoef[c_maxNSenseLayers][c_maxNDriftCells]
Wire sag coefficient for each cell; ibid.
void generateXML(const std::string &of)
Generate an xml file used in gearbox.
void getClosestAlphaPoints4Sgm(const double alpha, double &wal, unsigned short points[2], unsigned short lrs[2]) const
Returns the two closest alpha points for sigma for the input track incident angle (alpha).
DBObjPtr< HardwareClockSettings > m_clockSettings
hardware clock settings
float m_eDepToADCParams[c_maxNSenseLayers][c_maxNDriftCells][7]
edep-to-ADC conv.
double m_minTrackLength
Minimum track length for G4 step.
double getAlpha(const B2Vector3D &posOnWire, const B2Vector3D &momentum) const
Returns track incident angle in rphi plane (alpha in rad.).
double fieldWireR(int layerId) const
Returns radius of field wire in each layer.
float m_FWirPosMisalign[c_maxNSenseLayers][c_maxNDriftCells][3]
Wire position incl.
const B2Vector3D wireForwardPosition(uint layerId, int cellId, EWirePosition set=c_Base) const
Returns the forward position of the input sense wire.
bool isDeadWire(const WireID &wid, double &eff)
Inquire if the wire is dead.
unsigned m_nWires[c_maxNSenseLayers]
The array to store the wire number in each sense wire layre.
double getDriftV(double dt, unsigned short layer, unsigned short lr, double alpha=0., double theta=0.5 *M_PI) const
Get the realistic drift velocity.
double m_clockFreq4TDC
Clock frequency used for TDC (GHz).
int m_nFLayer
The number of field wire layer.
static CDCGeometryPar * m_B4CDCGeometryParDB
Pointer that saves the instance of this class.
DBObjPtr< CDCMisalignment > * m_misalignmentFromDB
misalignment params.
float m_XT[c_maxNSenseLayers][2][c_maxNAlphaPoints][c_maxNThetaPoints][c_nXTParams]
XT-relation coefficients for each layer, Left/Right, entrance angle and polar angle.
signed short m_shiftInSuperLayer[c_nSuperLayers][8]
shift in phi-direction wrt the 1st layer in each super layer
std::string m_version
The version of geometry parameters.
const B2Vector3D wireBackwardPosition(uint layerId, int cellId, EWirePosition set=c_Base) const
Returns the backward position of the input sense wire.
bool m_linearInterpolationOfXT
Switch for linear interpolation of xt.
DBObjPtr< CDCSpaceResols > * m_sResolFromDB
sigma params.
void setDisplacement()
Set displacement of sense wire.
double getOutgoingAlpha(const double alpha) const
Converts incoming- to outgoing-alpha.
bool isHotWire(const WireID &wid)
Inquire if the wire is hot.
double m_meanT0
mean t0 over all wires; should be double.
bool m_debug
Switch for debug printing.
DBObjPtr< CDCTimeWalks > * m_timeWalkFromDB
time-walk coeffs.
ushort m_nSenseWires
Maximum number of Sense Wires.
unsigned short m_tdcOffset
Not used; to be removed later.
double getSigma(double dist, unsigned short layer, unsigned short lr, double alpha=0., double theta=0.5 *M_PI) const
Return the basic resolution of drift length (cm).
CDCGeometryPar(const CDCGeometry *=nullptr)
Singleton class.
unsigned short getOutgoingLR(const unsigned short lr, const double alpha) const
Converts incoming-lr to outgoing-lr.
ushort m_maxNSenseLayers
Maximum number of Sense Wire Layers.
void readWirePositionParams(EWirePosition set, const CDCGeometry *geom)
Read displacement or (mis)alignment params from text file.
float m_thetaPoints4Sgm[c_maxNThetaPoints]
theta sampling points for sigma (rad)
std::map< WireID, unsigned short > m_wireToBoard
map relating wire-id and board-id.
double getOutgoingTheta(const double alpha, const double theta) const
Converts incoming- to outgoing-theta.
double m_senseWireDiameter
The diameter of sense wires.
double offset(int layerID) const
Return wire offset in phi direction at endplate.
bool m_displacement
Switch for displacement.
int m_twParamMode
Mode for tw parameterization.
double senseWireBZ(int layerId) const
Returns backward z position of sense wire in each layer.
double m_dzSBackwardLayer[c_maxNSenseLayers]
Corrections for backward z position of sense wire layers.
double getMinDriftTime(unsigned short layer, unsigned short lr, double alpha=0., double theta=0.5 *M_PI) const
Return the min.
unsigned nWiresInLayer(int layerId) const
Returns wire numbers in a layer.
double fieldWireBZ(int layerId) const
Returns backward z position of field wire in each layer.
void getClosestThetaPoints(const double alpha, const double theta, double &wth, unsigned short points[2]) const
Returns the two closest theta points for the input track incident angle (theta).
double senseWireFZ(int layerId) const
Returns forward z position of sense wire in each layer.
void readPropSpeed(const GearDir &gbxParams, int mode=0)
Read the propagation speed along the sense wire.
double innerRadiusInnerWall() const
Returns the inner radius of the inner wall.
DBObjPtr< CDCTimeZeros > * m_t0FromDB
t0s retrieved from DB.
int m_xtFileFormat
Format of xt input file.
int m_sigmaFileFormat
Format of sigma input file.
ushort m_firstSuperLayerOffset
Offset of the first super layer (for reduced CDC studies)
void setChMap()
Set channel map (from DB)
DBObjPtr< CDCFudgeFactorsForSigma > * m_fFactorFromDB
fudge factors retrieved from DB.
int m_nSLayer
The number of sense wire layer.
DBArray< CDCChannelMap > * m_chMapFromDB
channel map retrieved from DB.
void calcMeanT0(double minT0=3800, double maxT0=5800, int maxIt=10, double nStdv=3, double epsi=0.1)
Calculate mean t0 in ns (over all good wires)
void readFromDB(const CDCGeometry &)
Gets geometry parameters from database.
DBObjPtr< CDCXtRelations > * m_xtRelFromDB
xt params.
double m_nominalDriftV
Nominal drift velocity (4.0x10^-3 cm/nsec).
float m_FWirPos[c_maxNSenseLayers][c_maxNDriftCells][3]
Wire position incl.
float m_WireSagCoefAlign[c_maxNSenseLayers][c_maxNDriftCells]
Wire sag coefficient incl.
double m_zSForwardLayer[c_maxNSenseLayers]
The array to store forward z position of sense wire layers.
bool m_linearInterpolationOfSgm
Switch for linear interpolation of sigma.
DBObjPtr< CDCPropSpeeds > * m_propSpeedFromDB
prop.
void setBadWire()
Set bad-wires (from DB)
int m_xtParamMode
Mode for xt parameterization.
float m_FWirPosAlign[c_maxNSenseLayers][c_maxNDriftCells][3]
Wire position incl.
double fieldWireFZ(int layerId) const
Returns forward z position of field wire in each layer.
double m_dzSForwardLayer[c_maxNSenseLayers]
Corrections for forward z position of sense wire layers.
double getEDepToADCConvFactor(unsigned short layer, unsigned short cell, double edep, double dx, double costh)
Return edep-to-ADC conversion factor.
double m_nominalDriftVInv
Inverse of the nominal drift velocity.
const double * innerRadiusWireLayer() const
Returns an array of inner radius of wire layers.
double getDriftTime(double dist, unsigned short layer, unsigned short lr, double alpha, double theta) const
Return the drift time to the sense wire.
void setPropSpeed()
Set prop.
signed short getShiftInSuperLayer(unsigned short iSuperLayer, unsigned short iLayer) const
Returns shift in the super-layer.
double getWireSagCoef(EWirePosition set, uint layerId, int cellId) const
Returns coefficient for the sense wire sag.
void readChMap()
Read channel map between wire-id and electronics-id.
double m_zFForwardLayer[c_maxNFieldLayers]
The array to store forward z position of field wire layers.
double m_rSLayer[c_maxNSenseLayers]
The array to store radius of sense wire layers.
double m_fieldWireDiameter
The diameter of field wires.
double m_zFBackwardLayer[c_maxNFieldLayers]
The array to store backward z position of field wire layers.
ushort m_nFieldWires
Maximum number of Field Wires.
float m_WireSagCoefMisalign[c_maxNSenseLayers][c_maxNDriftCells]
Wire sag coefficient incl.
double getDriftLength(double dt, unsigned short layer, unsigned short lr, double alpha=0., double theta=0.5 *M_PI, bool calculateMinTime=true, double minTime=0.) const
Return the drift dength to the sense wire.
double m_cellSize[c_maxNSenseLayers]
The array to store cell size in each sense wire layer.
float m_BWirPosAlign[c_maxNSenseLayers][c_maxNDriftCells][3]
Wire position incl.
double outerRadiusOuterWall() const
Returns the outer radius of the outer wall.
float m_t0[c_maxNSenseLayers][c_maxNDriftCells]
t0 for each sense-wire (in nsec).
void setWirPosMisalignParams()
Set wire misalignment params.
double m_offSet[c_maxNSenseLayers]
The array to store z offset of sense wire layers.
void setTW()
Set time-walk parameters.
void setSResol()
Set spatial resolution (from DB).
double m_zSBackwardLayer[c_maxNSenseLayers]
The array to store backward z position of sense wire layers.
unsigned short getOldLeftRight(const B2Vector3D &posOnWire, const B2Vector3D &posOnTrack, const B2Vector3D &momentum) const
Returns old left/right.
float m_propSpeedInv[c_maxNSenseLayers]
Inverse of propagation speed of the sense wire.
ushort m_maxNCellsPerLayer
Maximum number wires within a layer.
double m_zWall[4][2]
The array to store z position of inner wall and outer wall.
bool isBadWire(const WireID &wid)
Inquire if the wire is totally-dead.
DBObjPtr< CDCAlignment > * m_alignmentFromDB
alignment params.
ushort m_maxNFieldLayers
Maximum number of Field Wire Layers.
bool m_misalignment
Switch for misalignment.
double m_senseWireDensity
The density of sense wires.
static CDCGeometryPar & Instance(const CDCGeometry *=nullptr)
Static method to get a reference to the CDCGeometryPar instance.
ushort m_firstLayerOffset
Offset of the first layer (for reduced CDC studies)
void Print() const
Print some debug information.
float m_timeWalkCoef[c_nBoards][2]
coefficients for time walk.
void readFFactor(const GearDir &gbxParams, int mode=0)
Read fudge factors.
unsigned short m_nThetaPoints
No.
double m_maxSpaceResol
max space resolution allowed (cm).
double m_thresholdEnergyDeposit
Energy thresh.
float m_BWirPos[c_maxNSenseLayers][c_maxNDriftCells][3]
Wire position incl.
float m_Sigma[c_maxNSenseLayers][2][c_maxNAlphaPoints][c_maxNThetaPoints][c_nSigmaParams]
position resulution for each layer.
void readXT(const GearDir &gbxParams, int mode=0)
Read XT-relation table.
double m_rFLayer[c_maxNFieldLayers]
The array to store radius of field wire layers.
void newReadXT(const GearDir &gbxParams, int mode=0)
Read XT-relation table in new format.
double m_nominalSpaceResol
Nominal spacial resolution (0.0130 cm).
unsigned nWireLayers() const
Returns a number of wire layers.
unsigned short m_nAlphaPoints
No.
unsigned short getNewLeftRightRaw(const B2Vector3D &posOnWire, const B2Vector3D &posOnTrack, const B2Vector3D &momentum) const
Returns new left/right_raw.
int m_senseWireZposMode
Mode for sense wire z position corr.
double m_rWall[4]
The array to store radius of inner wall and outer wall.
double m_tdcBinWidth
TDC bin width (nsec/bin).
bool m_modLeftRightFlag
Switch for modified left/right flag.
void getClosestThetaPoints4Sgm(const double alpha, const double theta, double &wth, unsigned short points[2]) const
Returns the two closest theta points for sigma for the input track incident angle (theta).
DBObjPtr< CDCEDepToADCConversions > * m_eDepToADCConversionsFromDB
Pointer to edep-to-ADC conv.
const double * outerRadiusWireLayer() const
Returns an array of outer radius of wire layers.
double senseWireR(int layerId) const
Returns radius of sense wire in each layer.
double m_senseWireTension
The tension of sense wires.
void setFFactor()
Set fudge factors (from DB).
bool getModLeftRightFlag() const
Get modified left/right flag.
double getMinTrackLength() const
Get minimum track length.
double getThresholdEnergyDeposit() const
Get threshold for Energy Deposit;.
static CDCSimControlPar & getInstance()
Static method to get a reference to the CDCSimControlPar instance.
bool getWireSag() const
Get wiresag flag.
void addCallback(std::function< void(const std::string &)> callback, bool onDestruction=false)
Add a callback method.
Class for accessing arrays of objects in the database.
Class for accessing objects in the database.
static std::string findFile(const std::string &path, bool silent=false)
Search for given file or directory in local or central release directory, and return absolute path if...
GearDir is the basic class used for accessing the parameter store.
virtual std::string getString(const std::string &path="") const noexcept(false) override
Get the parameter path as a string.
Optional DBObjPtr: This class behaves the same as the DBObjPtr except that it will not raise errors w...
Class to identify a wire inside the CDC.
unsigned short getICLayer() const
Getter for continuous layer numbering.
unsigned short getIWire() const
Getter for wire within the layer.
unsigned short getEWire() const
Getter for encoded wire number.
B2Vector3< double > B2Vector3D
typedef for common usage with double
double sqrt(double a)
sqrt for double
T dot(GeneralVector< T > a, GeneralVector< T > b)
dot product of two general vectors
void openFileB(boost::iostreams::filtering_istream &ifs, const std::string &fileName0)
Open a file using boost (to be able to read a gzipped file)
void openFileA(std::ifstream &ifs, const std::string &fileName0)
Open a file.
Abstract base class for different kinds of events.