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.