9#include <framework/gearbox/GearDir.h>
10#include <framework/logging/Logger.h>
11#include <framework/utilities/FileSystem.h>
12#include <framework/utilities/MathHelpers.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/iostreams/filtering_stream.hpp>
24#include <Math/ChebyshevPol.h>
45 if ((*m_t0FromDB).isValid()) {
52 if ((*m_badWireFromDB).isValid()) {
58 if ((*m_badBoardsFromDB).isValid()) {
64 if ((*m_propSpeedFromDB).isValid()) {
71 if ((*m_timeWalkFromDB).isValid()) {
78 if ((*m_xtRelFromDB).isValid()) {
85 if ((*m_sResolFromDB).isValid()) {
92 if ((*m_fFactorFromDB).isValid()) {
99 if ((*m_chMapFromDB).isValid()) {
106 if ((*m_displacementFromDB).isValid()) {
113 if ((*m_alignmentFromDB).isValid()) {
121 if ((*m_misalignmentFromDB).isValid()) {
130 if ((*m_eDepToADCConversionsFromDB).isValid()) {
140 B2WARNING(
"CDCGeometryPar: Strange that readFromDB is not called! Please make sure that CDC is included in Geometry.");
165 for (
unsigned i = 0; i < 4; ++i) {
167 for (
unsigned j = 0; j < 2; ++j)
170 for (
unsigned i = 0; i < c_maxNSenseLayers; ++i) {
182 for (
unsigned i = 0; i < c_maxNFieldLayers; ++i) {
188 for (
unsigned L = 0; L < c_maxNSenseLayers; ++L) {
189 for (
unsigned C = 0; C < c_maxNDriftCells; ++C) {
190 for (
unsigned i = 0; i < 3; ++i) {
198 for (
unsigned i = 0; i < 7; ++i) {
208 for (
unsigned L = 0; L < c_maxNSenseLayers; ++L) {
209 for (
unsigned i = 0; i < 2; ++i) {
210 for (
unsigned alpha = 0; alpha < c_maxNAlphaPoints; ++alpha) {
211 for (
unsigned theta = 0; theta < c_maxNThetaPoints; ++theta) {
212 for (
unsigned xtparam = 0; xtparam < c_nXTParams; ++xtparam) {
213 m_XT[L][i][alpha][theta][xtparam] = 0.;
216 for (
unsigned sigmaparam = 0; sigmaparam < c_nSigmaParams; ++sigmaparam) {
217 m_Sigma[L][i][alpha][theta][sigmaparam] = 0.;
224 for (
unsigned board = 0; board < c_nBoards; ++board) {
225 for (
unsigned i = 0; i < 2; ++i) {
228 for (
unsigned channel = 0; channel < 48; ++channel) {
233 for (
unsigned superLayer = 0; superLayer < c_nSuperLayers; ++superLayer) {
234 for (
unsigned layer = 0; layer < 8; ++layer) {
246 m_rWall[0] = geom.getInnerWall(2).getRmin();
247 m_zWall[0][0] = geom.getInnerWall(0).getZbwd();
248 m_zWall[0][1] = geom.getInnerWall(0).getZfwd();
250 m_rWall[1] = geom.getInnerWall(0).getRmax();
251 m_zWall[1][0] = geom.getInnerWall(0).getZbwd();
252 m_zWall[1][1] = geom.getInnerWall(0).getZbwd();
255 m_rWall[2] = geom.getOuterWall(0).getRmin();
256 m_zWall[2][0] = geom.getOuterWall(0).getZbwd();
257 m_zWall[2][1] = geom.getOuterWall(0).getZfwd();
259 m_rWall[3] = geom.getOuterWall(1).getRmax();
260 m_zWall[3][0] = geom.getOuterWall(0).getZbwd();
261 m_zWall[3][1] = geom.getOuterWall(0).getZfwd();
269 B2DEBUG(100,
"CDCGeometryPar: Define a mixture of gases and wires in the tracking volume.");
271 B2FATAL(
"CDCGeometryPar: Materialdefinition=2 is disabled for now.");
273 B2FATAL(
"CDCGeometryPar: Materialdefinition mode you specify is invalid.");
284 GearDir content =
GearDir(
"/Detector/DetectorComponent[@name=\"CDC\"]/Content/");
290 for (
const auto& sense : geom.getSenseLayers()) {
291 uint layerId = sense.getId();
296 m_nWires[layerId] = sense.getNWires();
298 m_offSet[layerId] = sense.getOffset();
309 B2FATAL(
"CDCGeometryPar: invalid wire z definition mode specified");
313 const int nWires =
m_nWires[layerId];
314 for (
int iCell = 0; iCell < nWires; ++iCell) {
321 for (
const auto& field : geom.getFieldLayers()) {
322 uint layerId = field.getId();
354 B2FATAL(
"HardwareClockSettings payloads are not valid.");
355 const double officialClockFreq4TDC = 2 *
m_clockSettings->getAcceleratorRF();
357 B2WARNING(
"ClockFreq4TDC changed from cdclocal " << scientific << setprecision(6) <<
m_clockFreq4TDC <<
" to official " <<
358 officialClockFreq4TDC <<
" (GHz) (difference larger than 0.01%)");
361 B2DEBUG(100,
"CDCGeometryPar: Clock freq. for TDC= " <<
m_clockFreq4TDC <<
" (GHz).");
363 B2DEBUG(100,
"CDCGeometryPar: TDC bin width= " <<
m_tdcBinWidth <<
" (ns).");
374 B2DEBUG(100,
"CDCGeometryPar: Load displacement params. (=1); not load (=0):" <<
m_displacement);
377 B2DEBUG(100,
"CDCGeometryPar: Read displacement from DB");
386 B2DEBUG(100,
"CDCGeometryPar: Load alignment params. (=1); not load (=0):" <<
390 B2DEBUG(100,
"CDCGeometryPar: Read alignment from DB");
399 B2DEBUG(100,
"CDCGeometryPar: Load misalignment params. (=1); not load (=0):" <<
403 B2DEBUG(100,
"CDCGeometryPar: Read misalignment from DB");
416 B2FATAL(
"ModifiedLeftRightFlag = true is disabled for now; need to update a G4-related code in framework...");
425 B2DEBUG(100,
"CDCGeometryPar: Read xt from DB");
432 B2DEBUG(100,
"CDCGeometryPar: Read sigma from DB");
439 B2DEBUG(100,
"CDCGeometryPar: Read fudge factors from DB");
446 B2DEBUG(100,
"CDCGeometryPar: Read prop-speed from DB");
453 B2DEBUG(100,
"CDCGeometryPar: Read t0 from DB");
460 B2DEBUG(100,
"CDCGeometryPar: Read badwire from DB");
464 B2FATAL(
"Text file input mode for bdwires is disabled now!");
468 B2DEBUG(100,
"CDCGeometryPar: Read ch-map from DB");
475 B2DEBUG(100,
"CDCGeometryPar: Read time-walk from DB");
480 B2DEBUG(100,
"CDCGeometryPar: Time-walk param. mode= " <<
m_twParamMode);
483 B2DEBUG(29,
"CDCGeometryPar: Read EDepToADC from DB");
484 if ((*m_eDepToADCConversionsFromDB).isValid()) {
510 std::string fileName0;
515 }
else if (set == c_Misaligned) {
517 }
else if (set == c_Aligned) {
523 }
else if (set == c_Misaligned) {
525 }
else if (set == c_Aligned) {
530 boost::iostreams::filtering_istream ifs;
535 double back[np], fwrd[np], tension;
540 for (
int i = 0; i < np; ++i) {
543 for (
int i = 0; i < np; ++i) {
549 if (ifs.eof())
break;
557 for (
int i = 0; i < np; ++i) {
561 }
else if (set == c_Misaligned) {
564 }
else if (set == c_Aligned) {
575 }
else if (set == c_Misaligned) {
579 }
else if (set == c_Aligned) {
586 if (nRead !=
m_nSenseWires) B2FATAL(
"CDCGeometryPar::readWirePositionParams: #lines read-in (=" << nRead <<
587 ") is inconsistent with total #sense wires (=" <<
m_nSenseWires <<
") !");
589 boost::iostreams::close(ifs);
597 for (
unsigned iL = 0; iL < c_maxNSenseLayers; ++iL) {
604 auto layerID =
WireID(iL, 511);
615 for (
unsigned iC = 0; iC <
m_nWires[iL]; ++iC) {
627 m_BWirPosAlign[iL][iC][0] = d_layerXbwd + cos(d_layerPhiBwd) * wireXbwd + sin(d_layerPhiBwd) * wireYbwd;
628 m_BWirPosAlign[iL][iC][1] = d_layerYbwd - sin(d_layerPhiBwd) * wireXbwd + cos(d_layerPhiBwd) * wireYbwd;
631 m_FWirPosAlign[iL][iC][0] = d_layerXfwd + cos(d_layerPhiFwd) * wireXfwd + sin(d_layerPhiFwd) * wireYfwd;
632 m_FWirPosAlign[iL][iC][1] = d_layerYfwd - sin(d_layerPhiFwd) * wireXfwd + cos(d_layerPhiFwd) * wireYfwd;
638 double back[np], fwrd[np];
640 for (
unsigned iL = 0; iL < c_maxNSenseLayers; ++iL) {
646 for (
unsigned iC = 0; iC <
m_nWires[iL]; ++iC) {
656 for (
int i = 0; i < np; ++i) {
677 double back[np], fwrd[np];
679 for (
unsigned iL = 0; iL < c_maxNSenseLayers; ++iL) {
685 for (
unsigned iC = 0; iC <
m_nWires[iL]; ++iC) {
695 for (
int i = 0; i < np; ++i) {
727 fileName0 = gbxParams.
getString(
"xt4ReconFileName");
730 boost::iostreams::filtering_istream ifs;
734 unsigned short nAlphaBins = 0;
735 if (ifs >> nAlphaBins) {
736 if (nAlphaBins == 0 || nAlphaBins > c_maxNAlphaPoints) B2FATAL(
"Fail to read alpha bins !");
738 B2FATAL(
"Fail to read alpha bins !");
741 double alpha0, alpha1, alpha2;
742 for (
unsigned short i = 0; i < nAlphaBins; ++i) {
743 ifs >> alpha0 >> alpha1 >> alpha2;
748 unsigned short nThetaBins = 0;
749 if (ifs >> nThetaBins) {
750 if (nThetaBins == 0 || nThetaBins > c_maxNThetaPoints) B2FATAL(
"CDCGeometryPar: fail to read theta bins !");
752 B2FATAL(
"CDCGeometryPar: fail to read theta bins !");
755 double theta0, theta1, theta2;
757 for (
unsigned short i = 0; i < nThetaBins; ++i) {
758 ifs >> theta0 >> theta1 >> theta2;
763 unsigned short iCL, iLR;
764 const unsigned short npx = c_nXTParams - 1;
766 double theta, alpha, dummy1;
771 if (np <= 0 || np > npx) B2FATAL(
"CDCGeometryPar: no. of xt-params. outside limits !");
773 const double epsi = 0.1;
781 ifs >> theta >> alpha >> dummy1 >> iLR;
782 for (
int i = 0; i < np; ++i) {
787 for (
unsigned short i = 0; i < nThetaBins; ++i) {
793 if (itheta < 0) B2FATAL(
"CDCGeometryPar: thetas in xt.dat are inconsistent !");
796 for (
unsigned short i = 0; i < nAlphaBins; ++i) {
802 if (ialpha < 0) B2FATAL(
"CDCGeometryPar: alphas in xt.dat are inconsistent !");
804 for (
int i = 0; i < np; ++i) {
805 m_XT[iCL][iLR][ialpha][itheta][i] = xtc[i];
808 double boundT = xtc[6];
810 m_XT[iCL][iLR][ialpha][itheta][np] = ROOT::Math::Chebyshev5(boundT, xtc[0], xtc[1], xtc[2], xtc[3], xtc[4], xtc[5]);
812 m_XT[iCL][iLR][ialpha][itheta][np] =
822 boost::iostreams::close(ifs);
825 const double degrad = M_PI / 180.;
826 for (
unsigned i = 0; i < nAlphaBins; ++i) {
829 for (
unsigned i = 0; i < nThetaBins; ++i) {
852 fileName0 = gbxParams.
getString(
"sigma4ReconFileName");
859 unsigned short nAlphaBins = 0;
860 if (ifs >> nAlphaBins) {
861 if (nAlphaBins == 0 || nAlphaBins > c_maxNAlphaPoints) B2FATAL(
"Fail to read alpha bins !");
863 B2FATAL(
"Fail to read alpha bins !");
867 double alpha0, alpha1, alpha2;
868 for (
unsigned short i = 0; i < nAlphaBins; ++i) {
869 ifs >> alpha0 >> alpha1 >> alpha2;
874 unsigned short nThetaBins = 0;
875 if (ifs >> nThetaBins) {
876 if (nThetaBins == 0 || nThetaBins > c_maxNThetaPoints) B2FATAL(
"CDCGeometryPar: fail to read theta bins !");
878 B2FATAL(
"CDCGeometryPar: fail to read theta bins !");
882 double theta0, theta1, theta2;
884 for (
unsigned short i = 0; i < nThetaBins; ++i) {
885 ifs >> theta0 >> theta1 >> theta2;
889 unsigned short np = 0;
890 unsigned short iCL, iLR;
891 double sigma[c_nSigmaParams];
897 if (np > c_nSigmaParams) B2FATAL(
"CDCGeometryPar: no. of sigma-params. outside limits !");
901 const double epsi = 0.1;
909 ifs >> theta >> alpha >> iLR;
910 for (
int i = 0; i < np; ++i) {
915 for (
unsigned short i = 0; i < nThetaBins; ++i) {
921 if (itheta < 0) B2FATAL(
"CDCGeometryPar: thetas in sigma.dat are inconsistent !");
924 for (
unsigned short i = 0; i < nAlphaBins; ++i) {
930 if (ialpha < 0) B2FATAL(
"CDCGeometryPar: alphas in sigma.dat are inconsistent !");
932 for (
int i = 0; i < np; ++i) {
933 m_Sigma[iCL][iLR][ialpha][itheta][i] = sigma[i];
940 const double degrad = M_PI / 180.;
941 for (
unsigned i = 0; i < nAlphaBins; ++i) {
944 for (
unsigned i = 0; i < nThetaBins; ++i) {
956 fileName0 = gbxParams.
getString(
"fudgeFactorFileName");
958 B2WARNING(
"readFFactor is not ready! " << fileName0);
968 fileName0 = gbxParams.
getString(
"propSpeed4ReconFileName");
980 if (ifs.eof())
break;
986 if (
m_debug) B2DEBUG(150, iL <<
" " << speed);
989 if (nRead != c_maxNSenseLayers) B2FATAL(
"CDCGeometryPar::readPropSpeed: #lines read-in (=" << nRead <<
990 ") is inconsistent with total #layers (=" << c_maxNSenseLayers <<
") !");
1000 fileName0 = gbxParams.
getString(
"t04ReconFileName");
1011 ifs >> iL >> iC >> t0;
1017 if (ifs.eof())
break;
1024 B2DEBUG(150, iL <<
" " << iC <<
" " << t0);
1028 if (nRead !=
m_nSenseWires) B2FATAL(
"CDCGeometryPar::readT0: #lines read-in (=" << nRead <<
1029 ") is inconsistent with total #sense wires (=" <<
m_nSenseWires <<
") !");
1042 fileName0 = gbxParams.
getString(
"tw4ReconFileName");
1048 unsigned short nPars(0);
1051 B2FATAL(
"CDCGeometryPar::readTW: invalid mode specified!");
1054 B2FATAL(
"CDCGeometryPar::readTW: invalid #params specified!");
1057 unsigned iBoard = 0;
1060 while (ifs >> iBoard) {
1061 for (
unsigned short i = 0; i < nPars; ++i) {
1067 if (nRead != c_nBoards) B2FATAL(
"CDCGeometryPar::readTW: #lines read-in (=" << nRead <<
") is inconsistent with #boards (=" <<
1084 unsigned short iSL, iL, iW, iB, iC;
1089 ifs >> iSL >> iL >> iW >> iB >> iC;
1090 if (ifs.eof())
break;
1095 m_wireToBoard.insert(pair<WireID, unsigned short>(wID, iB));
1098 if (nRead !=
m_nSenseWires) B2FATAL(
"CDCGeometryPar::readChMap: #lines read-in (=" << nRead <<
1099 ") is inconsistent with #sense-wires (="
1111 fileName0 = gbxParams.
getString(
"fudgeFactorFileName");
1115 std::string fileName1 =
"/data/cdc/" + fileName0;
1118 if (fileName ==
"") {
1122 if (fileName ==
"") {
1123 B2FATAL(
"CDC::openFile: " << fileName0 <<
" not exist!");
1125 B2DEBUG(29,
"CDC::openFile: open " << fileName);
1126 ifs.open(fileName.c_str());
1127 if (!ifs) B2FATAL(
"CDC::openFile: cannot open " << fileName <<
" !");
1130 unsigned short paramMode(0), nParams(0);
1131 ifs >> paramMode >> nParams;
1132 if (paramMode > 1) B2FATAL(
"Param mode > 1!");
1133 if (nParams > 7) B2FATAL(
"No. of params. > 7!");
1134 unsigned short groupId(0);
1136 B2DEBUG(29, paramMode <<
" " << nParams <<
" " << groupId);
1137 if (groupId > 0) B2FATAL(
"GgroupId > 0!");
1139 unsigned short cLMin[c_nSuperLayers], cLMax[c_nSuperLayers];
1142 for (
unsigned int sl = 1; sl < c_nSuperLayers; ++sl) {
1143 cLMin[sl] = cLMax[0] + 6 * sl - 5;
1144 cLMax[sl] = cLMax[0] + 6 * sl;
1147 unsigned short id = 0;
1149 unsigned short nRead = 0;
1151 for (
unsigned short i = 0; i < nParams; ++i) {
1153 for (
unsigned short cL = cLMin[
id]; cL <= cLMax[id]; ++cL) {
1154 for (
unsigned short cell = 0; cell <
m_nWires[cL]; ++cell) {
1160 if (nRead > c_nSuperLayers) B2FATAL(
"No. of read in lines > " << c_nSuperLayers <<
" !");
1170 for (
unsigned short iCL = 0; iCL < c_maxNSenseLayers; ++iCL) {
1171 for (
unsigned short iW = 0; iW < c_maxNDriftCells; ++iW) {
1176 for (
auto const& ent : (*m_t0FromDB)->getT0s()) {
1179 const unsigned short iW = wid.
getIWire();
1190 double oldMeanT0 = 0;
1191 unsigned short it1 = 0;
1192 for (
unsigned short it = 0; it < maxIt; ++it) {
1194 double effiSum = 0.;
1197 for (
unsigned short iCL = 0; iCL < c_maxNSenseLayers; ++iCL) {
1198 for (
unsigned short iW = 0; iW <
m_nWires[iCL]; ++iW) {
1199 if (
m_t0[iCL][iW] < minT0 ||
m_t0[iCL][iW] > maxT0)
continue;
1214 B2DEBUG(29, it <<
" " << effiSum <<
" " <<
m_meanT0 <<
" " << stdvT0);
1215 if (fabs(
m_meanT0 - oldMeanT0) < epsi)
break;
1220 B2FATAL(
"Wire efficiency sum <= 0!");
1223 if (it1 == maxIt - 1) B2WARNING(
"Max. iterations(=" << maxIt <<
") needed to calculate the mean t0. Strange.");
1243 for (
unsigned short iCL = 0; iCL < (*m_propSpeedFromDB)->getEntries(); ++iCL) {
1255 for (
unsigned short iBd = 0; iBd < (*m_timeWalkFromDB)->getEntries(); ++iBd) {
1256 int np = ((*m_timeWalkFromDB)->getTimeWalkParams(iBd)).size();
1257 for (
int i = 0; i < np; ++i) {
1258 m_timeWalkCoef[iBd][i] = ((*m_timeWalkFromDB)->getTimeWalkParams(iBd))[i];
1282 for (
unsigned short iCL = 0; iCL < c_maxNSenseLayers; ++iCL) {
1289 for (
unsigned short iLR = 0; iLR < 2; ++iLR) {
1292 const std::vector<float> params = (*m_xtRelFromDB)->getXtParams(iCL, iLR, iA, iT);
1293 unsigned short np = params.size();
1295 for (
unsigned short i = 0; i < np; ++i) {
1296 m_XT[iCL][iLR][iA][iT][i] = params[i];
1299 double boundT =
m_XT[iCL][iLR][iA][iT][6];
1301 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],
1302 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]);
1304 m_XT[iCL][iLR][iA][iT][np] =
1305 m_XT[iCL][iLR][iA][iT][0] + boundT
1306 * (
m_XT[iCL][iLR][iA][iT][1] + boundT
1307 * (
m_XT[iCL][iLR][iA][iT][2] + boundT
1308 * (
m_XT[iCL][iLR][iA][iT][3] + boundT
1309 * (
m_XT[iCL][iLR][iA][iT][4] + boundT
1310 * (
m_XT[iCL][iLR][iA][iT][5])))));
1339 for (
unsigned short iCL = 0; iCL < c_maxNSenseLayers; ++iCL) {
1340 for (
unsigned short iLR = 0; iLR < 2; ++iLR) {
1343 const std::vector<float> params = (*m_sResolFromDB)->getSigmaParams(iCL, iLR, iA, iT);
1344 unsigned short np = params.size();
1346 for (
unsigned short i = 0; i < np; ++i) {
1360 unsigned short groupId = (*m_fFactorFromDB)->getGroupID();
1361 unsigned short nEnt = (*m_fFactorFromDB)->getEntries();
1362 B2DEBUG(29,
"setFFactor called: groupId,nEnt= " << groupId <<
" " << nEnt);
1366 B2FATAL(
"CDCGeometryPar:: Invalid group-id " << groupId <<
" specified!");
1369 for (
unsigned short id = 0;
id < nEnt; ++id) {
1370 unsigned short np = ((*m_fFactorFromDB)->getFactors(
id)).size();
1371 if (np != 3) B2FATAL(
"CDCGeometryPar:: No. of fudge factors != 3!");
1372 for (
unsigned short i = 0; i < np; ++i) {
1389 const unsigned short isl = cm.getISuperLayer();
1391 const uint il = cm.getILayer();
1392 const int iw = cm.getIWire();
1393 const int iBd = cm.getBoardID();
1394 const WireID wID(isl, il, iw);
1395 m_wireToBoard.insert(pair<WireID, unsigned short>(wID, iBd));
1396 const int iCh = cm.getBoardChannel();
1405 unsigned short groupId = (*m_eDepToADCConversionsFromDB)->getGroupID();
1406 unsigned short nEnt = (*m_eDepToADCConversionsFromDB)->getEntries();
1408 if (nEnt > c_nSuperLayers) B2FATAL(
"CDCGeometryPar:: group-id " << groupId <<
" and #entries " << nEnt <<
" are inconsistent!");
1409 }
else if (groupId == 1) {
1410 if (nEnt > c_maxNSenseLayers) B2FATAL(
"CDCGeometryPar:: group-id " << groupId <<
" and #entries " << nEnt <<
" are inconsistent!");
1412 B2FATAL(
"CDCGeometryPar:: Invalid group-id " << groupId <<
" specified !");
1415 unsigned short cLMin[c_nSuperLayers], cLMax[c_nSuperLayers];
1418 for (
unsigned int sl = 1; sl < c_nSuperLayers; ++sl) {
1419 cLMin[sl] = cLMax[0] + 6 * sl - 5;
1420 cLMax[sl] = cLMax[0] + 6 * sl;
1423 for (
unsigned short id = 0;
id < nEnt; ++id) {
1424 unsigned short np = ((*m_eDepToADCConversionsFromDB)->getParams(
id)).size();
1425 if (np > 7) B2FATAL(
"CDCGeometryPar:: No. of edep-to-ADC conversion params. > 7");
1427 for (
unsigned short cL = cLMin[
id]; cL <= cLMax[id]; ++cL) {
1428 for (
unsigned short cell = 0; cell <
m_nWires[cL]; ++cell) {
1429 for (
unsigned short i = 0; i < np; ++i) {
1434 }
else if (groupId == 1) {
1435 for (
unsigned short cell = 0; cell <
m_nWires[id]; ++cell) {
1436 for (
unsigned short i = 0; i < np; ++i) {
1440 }
else if (groupId == 2) {
1442 B2FATAL(
"CDCGeometryPar::setEDepToADCConversions(): groupId=2 not ready!");
1461 const double cth = fabs(costh) + dlt;
1462 const double iGen = edep / dx;
1463 const double tmp = cth - gam * iGen;
1464 const double disc = tmp * tmp + 4.*alf * cth * iGen;
1468 iMea = cth * iGen / tmp;
1469 }
else if (disc >= 0.) {
1470 iMea = (-tmp +
sqrt(disc)) / (2.*alf);
1473 double convF = mainF;
1475 convF = mainF * std::min(iMea / iGen, 1.);
1483 convF *= 1. + a * (costh - b);
1502 if (set == c_Misaligned) {
1506 }
else if (set == c_Base) {
1528 if (set == c_Misaligned) {
1531 }
else if (set == c_Base) {
1550 if (set == c_Misaligned) {
1554 }
else if (set == c_Base) {
1576 if (set == c_Misaligned) {
1579 }
else if (set == c_Base) {
1590 if (set == c_Misaligned) {
1592 }
else if (set == c_Aligned) {
1600 static double IRWL[c_maxNSenseLayers] = {0};
1611 static double ORWL[c_maxNSenseLayers] = {0};
1626 const unsigned nWires =
m_nWires[layerId];
1630 const double phiSize = 2 * M_PI / double(nWires);
1633 for (
unsigned i = 0; i < 1; ++i) {
1634 const double phiF = phiSize * (double(i) +
offset)
1641 const double beta = (position.
Z() - b.Z()) / u.Z();
1643 double dPhi = std::atan2(position.
Y(), position.
X())
1644 - std::atan2(p.Y(), p.X())
1646 while (dPhi < 0) dPhi += (2. * M_PI);
1647 j = int(dPhi / phiSize);
1648 while (j >= nWires) j -= nWires;
1657 std::ofstream ofs(of.c_str(), std::ios::out);
1659 B2ERROR(
"CDCGeometryPar::read !!! can not open file : "
1662 ofs <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
1664 <<
"<Subdetector type=\"CDC\">"
1666 <<
" <Name>CDC BelleII </Name>"
1668 <<
" <Description>CDC geometry parameters</Description>"
1670 <<
" <Version>0</Version>"
1672 <<
" <GeoCreator>CDCBelleII</GeoCreator>"
1676 <<
" <Rotation desc=\"Rotation of the whole cdc detector (should be the same as beampipe)\" unit=\"mrad\">0.0</Rotation>"
1678 <<
" <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>"
1680 <<
" <Material>CDCGas</Material>"
1684 ofs <<
" <SLayers>" << endl;
1687 ofs <<
" <SLayer id=\"" << i <<
"\">" << endl;
1688 ofs <<
" <Radius desc=\"Radius of wires in this layer\" unit=\"mm\">" <<
senseWireR(i) <<
"</Radius>" << endl;
1689 ofs <<
" <BackwardZ desc=\"z position of this wire layer at backward endplate\" unit=\"mm\">" <<
senseWireBZ(
1690 i) <<
"</BackwardZ>" << endl;
1691 ofs <<
" <ForwardZ desc=\"z position of this wire layer at forward endplate\" unit=\"mm\">" <<
senseWireFZ(
1692 i) <<
"</ForwardZ>" << endl;
1693 ofs <<
" <NHoles desc=\"the number of holes in this layer, 2*(cell number)\">" <<
nWiresInLayer(
1694 i) * 2 <<
"</NHoles>" << endl;
1695 ofs <<
" <NShift desc=\"the shifted hole number of each wire in this layer\">" <<
nShifts(i) <<
"</NShift>" << endl;
1696 ofs <<
" <Offset desc=\"wire offset in phi direction at endplate\">" <<
m_offSet[i] <<
"</Offset>" << endl;
1697 ofs <<
" </SLayer>" << endl;
1700 ofs <<
" </SLayers>" << endl;
1701 ofs <<
" <FLayers>" << endl;
1704 ofs <<
" <FLayer id=\"" << i <<
"\">" << endl;
1705 ofs <<
" <Radius desc=\"Radius of field wires in this layer\" unit=\"mm\">" <<
fieldWireR(i) <<
"</Radius>" << endl;
1706 ofs <<
" <BackwardZ desc=\"z position of this field wire layer at backward endplate\" unit=\"mm\">" <<
fieldWireBZ(
1707 i) <<
"</BackwardZ>" << endl;
1708 ofs <<
" <ForwardZ desc=\"z position of this field wire layer at forward endplate\" unit=\"mm\">" <<
fieldWireFZ(
1709 i) <<
"</ForwardZ>" << endl;
1710 ofs <<
" </FLayer>" << endl;
1713 ofs <<
" </FLayers>" << endl;
1715 ofs <<
" <InnerWall name=\"InnerWall\">" << endl;
1716 ofs <<
" <InnerR desc=\"Inner radius\" unit=\"mm\">" <<
innerRadiusInnerWall() <<
"</InnerR>" << endl;
1717 ofs <<
" <OuterR desc=\"Outer radius\" unit=\"mm\">" <<
outerRadiusInnerWall() <<
"</OuterR>" << endl;
1718 ofs <<
" <BackwardZ desc=\"z position at backward endplate\" unit=\"mm\">" <<
m_zWall[0][0] <<
"</BackwardZ>" << endl;
1719 ofs <<
" <ForwardZ desc=\"z position at forward endplate\" unit=\"mm\">" <<
m_zWall[0][1] <<
"</ForwardZ>" << endl;
1720 ofs <<
" </InnerWall>" << endl;
1722 ofs <<
" <OuterWall name=\"OuterWall\">" << endl;
1723 ofs <<
" <InnerR desc=\"Inner radius\" unit=\"mm\">" <<
innerRadiusOuterWall() <<
"</InnerR>" << endl;
1724 ofs <<
" <OuterR desc=\"Outer radius\" unit=\"mm\">" <<
outerRadiusOuterWall() <<
"</OuterR>" << endl;
1725 ofs <<
" <BackwardZ desc=\"z position at backward endplate\" unit=\"mm\">" <<
m_zWall[2][0] <<
"</BackwardZ>" << endl;
1726 ofs <<
" <ForwardZ desc=\"z position at forward endplate\" unit=\"mm\">" <<
m_zWall[2][1] <<
"</ForwardZ>" << endl;
1727 ofs <<
" </OuterWall>" << endl;
1729 ofs <<
" </Content>" << endl
1730 <<
"</Subdetector>" << endl;
1734 double& Yb_sag,
double& Yf_sag)
const
1765 if (set == c_Aligned) {
1779 }
else if (set == c_Misaligned) {
1793 }
else if (set == c_Base) {
1808 B2FATAL(
"CDCGeometryPar::getWireSagEffect: called with an invalid set: " <<
" " << set);
1811 const double dx = Xf - Xb;
1812 const double dy = Yf - Yb;
1813 const double dz = Zf - Zb;
1815 const double Zfp =
sqrt(dz * dz + dx * dx);
1816 const double Zp = (Z - Zb) * Zfp / dz;
1818 const double Y_sag = (Coef * (Zp - Zfp) + dy / Zfp) * Zp + Yb;
1819 const double dydz = (Coef * (2.*Zp - Zfp) * Zfp + dy) / dz;
1821 Yb_sag = Y_sag + dydz * (Zb - Z);
1822 Yf_sag = Y_sag + dydz * (Zf - Z);
1828 const unsigned L = layerID;
1829 const unsigned C = cellID;
1833 const double phiSize = 2 * M_PI / double(
m_nWires[L]);
1835 const double phiF = phiSize * (double(C) + offSet)
1848 for (
int i = 0; i < 3; ++i) {
1865 const unsigned L = layerID;
1866 const unsigned C = cellID;
1868 static bool first =
true;
1869 static ofstream ofs;
1872 ofs.open(
"alignment.dat");
1875 ofs << L <<
" " << C;
1877 ofs << setiosflags(ios::showpoint | ios::uppercase);
1879 for (
int i = 0; i < 3; ++i) ofs <<
" " << setw(15) << setprecision(8) <<
m_BWirPos[L][C][i];
1881 for (
int i = 0; i < 3; ++i) ofs <<
" " << setw(15) << setprecision(8) <<
m_FWirPos[L][C][i];
1882 ofs << setiosflags(ios::fixed);
1889 const double theta)
const
1891 if (iCLayer < m_firstLayerOffset || iCLayer >= c_maxNSenseLayers) {
1900 double delta = time - minTime;
1906 B2FATAL(
"linearInterpolationOfXT = false is not allowed now !");
1909 unsigned short ial[2] = {0};
1910 unsigned short ilr[2] = {lro, lro};
1913 unsigned short ith[2] = {0};
1916 unsigned short jal, jlr, jth;
1920 double timep = delta < 0. ? minTime - delta : time;
1923 for (
unsigned k = 0; k < 4; ++k) {
1928 w = (1. - wal) * (1. - wth);
1929 }
else if (k == 1) {
1933 w = (1. - wal) * wth;
1934 }
else if (k == 2) {
1938 w = wal * (1. - wth);
1946 double boundary =
m_XT[iCLayer][jlr][jal][jth][6];
1948 if (timep < boundary) {
1950 const double& c1 =
m_XT[iCLayer][jlr][jal][jth][1];
1951 const double& c2 =
m_XT[iCLayer][jlr][jal][jth][2];
1952 const double& c3 =
m_XT[iCLayer][jlr][jal][jth][3];
1953 const double& c4 =
m_XT[iCLayer][jlr][jal][jth][4];
1954 const double& c5 =
m_XT[iCLayer][jlr][jal][jth][5];
1955 dDdt += w * ROOT::Math::Chebyshev4(timep, c1 + 3.*c3 + 5.*c5, 4.*c2 + 8.*c4, 6.*c3 + 10.*c5, 8.*c4, 10.*c5);
1957 dDdt += w * (
m_XT[iCLayer][jlr][jal][jth][1] + timep
1958 * (2.*
m_XT[iCLayer][jlr][jal][jth][2] + timep
1959 * (3.*
m_XT[iCLayer][jlr][jal][jth][3] + timep
1960 * (4.*
m_XT[iCLayer][jlr][jal][jth][4] + timep
1961 * (5.*
m_XT[iCLayer][jlr][jal][jth][5])))));
1964 dDdt += w *
m_XT[iCLayer][jlr][jal][jth][7];
1977 const double theta)
const
1979 if (iCLayer < m_firstLayerOffset || iCLayer >= c_maxNSenseLayers) {
1989 B2FATAL(
"linearInterpolationOfXT = false is not allowed now !");
1992 unsigned short ial[2] = {0};
1993 unsigned short ilr[2] = {lro, lro};
1996 unsigned short ith[2] = {0};
1999 unsigned short jal, jlr, jth;
2003 double timep = time;
2006 for (
unsigned k = 0; k < 4; ++k) {
2011 w = (1. - wal) * (1. - wth);
2012 }
else if (k == 1) {
2016 w = (1. - wal) * wth;
2017 }
else if (k == 2) {
2021 w = wal * (1. - wth);
2029 double boundary =
m_XT[iCLayer][jlr][jal][jth][6];
2031 if (timep < boundary) {
2033 dist += w * ROOT::Math::Chebyshev5(timep,
m_XT[iCLayer][jlr][jal][jth][0],
m_XT[iCLayer][jlr][jal][jth][1],
2034 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]);
2036 dist += w * (
m_XT[iCLayer][jlr][jal][jth][0] + timep
2037 * (
m_XT[iCLayer][jlr][jal][jth][1] + timep
2038 * (
m_XT[iCLayer][jlr][jal][jth][2] + timep
2039 * (
m_XT[iCLayer][jlr][jal][jth][3] + timep
2040 * (
m_XT[iCLayer][jlr][jal][jth][4] + timep
2041 * (
m_XT[iCLayer][jlr][jal][jth][5]))))));
2044 dist += w * (
m_XT[iCLayer][jlr][jal][jth][7] * (timep - boundary) +
m_XT[iCLayer][jlr][jal][jth][8]);
2056 const bool calculateMinTime,
2057 const double inputMinTime)
const
2059 if (iCLayer < m_firstLayerOffset || iCLayer >= c_maxNSenseLayers) {
2070 B2FATAL(
"linearInterpolationOfXT = false is not allowed now !");
2073 unsigned short ial[2] = {0};
2074 unsigned short ilr[2] = {lro, lro};
2077 unsigned short ith[2] = {0};
2083 delta = time - minTime;
2085 unsigned short jal, jlr, jth;
2089 double timep = delta < 0. ? minTime - delta : time;
2092 for (
unsigned k = 0; k < 4; ++k) {
2097 w = (1. - wal) * (1. - wth);
2098 }
else if (k == 1) {
2102 w = (1. - wal) * wth;
2103 }
else if (k == 2) {
2107 w = wal * (1. - wth);
2115 double boundary =
m_XT[iCLayer][jlr][jal][jth][6];
2117 if (timep < boundary) {
2119 dist += w * ROOT::Math::Chebyshev5(timep,
m_XT[iCLayer][jlr][jal][jth][0],
m_XT[iCLayer][jlr][jal][jth][1],
2120 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]);
2122 dist += w * (
m_XT[iCLayer][jlr][jal][jth][0] + timep
2123 * (
m_XT[iCLayer][jlr][jal][jth][1] + timep
2124 * (
m_XT[iCLayer][jlr][jal][jth][2] + timep
2125 * (
m_XT[iCLayer][jlr][jal][jth][3] + timep
2126 * (
m_XT[iCLayer][jlr][jal][jth][4] + timep
2127 * (
m_XT[iCLayer][jlr][jal][jth][5]))))));
2130 dist += w * (
m_XT[iCLayer][jlr][jal][jth][7] * (timep - boundary) +
m_XT[iCLayer][jlr][jal][jth][8]);
2136 if (delta < 0.) dist *= -1.;
2142 const double theta)
const
2144 if (iCLayer < m_firstLayerOffset || iCLayer >= c_maxNSenseLayers) {
2152 B2FATAL(
"linearInterpolationOfXT = false is not allowed now !");
2156 unsigned short ial[2] = {0};
2157 unsigned short ilr[2] = {lro, lro};
2160 unsigned short ith[2] = {0};
2167 const double alpha,
const double theta,
2168 const double wal,
const unsigned short ial[2],
const unsigned short ilr[2],
2169 const double wth,
const unsigned short ith[2])
const
2171 double minTime = 0.;
2174 unsigned short jal, jlr, jth;
2177 double c[6] = {0.}, a[6] = {0.};
2178 for (
unsigned k = 0; k < 4; ++k) {
2183 w = (1. - wal) * (1. - wth);
2184 }
else if (k == 1) {
2188 w = (1. - wal) * wth;
2189 }
else if (k == 2) {
2193 w = wal * (1. - wth);
2201 for (
int i = 0; i < 5; ++i) {
2202 c[i] += w *
m_XT[iCLayer][jlr][jal][jth][i];
2207 a[0] = c[0] - c[2] + c[4];
2208 a[1] = c[1] - 3.*c[3] + 5.*c[5];
2209 a[2] = 2.*c[2] - 8.*c[4];
2210 a[3] = 4.*c[3] - 20.*c[5];
2214 for (
int i = 0; i < 5; ++i) a[i] = c[i];
2219 const double det = a[1] * a[1] - 4.*a[2] * a[0];
2222 minTime = (-a[1] +
sqrt(det)) / (2.*a[2]);
2225 minTime = -a[1] / (2.*a[2]);
2227 }
else if (a[1] != 0.) {
2228 minTime = -a[0] / a[1];
2230 B2WARNING(
"CDCGeometryPar::getMinDriftTime: minDriftTime not determined; assume zero.\n" <<
"layer(#0-55),lr,alpha(rad),theta= " <<
2231 iCLayer <<
" " << lr <<
" " << alpha <<
" " << theta);
2238 const double epsi4x = 5.e-6;
2239 const unsigned short maxIter = 8;
2240 const double maxDt = 20.;
2241 unsigned short nIter = 0;
2242 double minXsq = 1.e10;
2243 double minMinTime = minTime;
2244 for (nIter = 0; nIter <= maxIter; ++nIter) {
2247 double x = a[0] + t * (a[1] + t * (a[2] + t * (a[3] + t * (a[4] + t * a[5]))));
2253 double xp = a[1] + t * (2 * a[2] + t * (3 * a[3] + t * (4 * a[4] + t * 5 * a[5])));
2254 double xpp = 2 * a[2] + t * (6 * a[3] + t * (12 * a[4] + t * 20 * a[5]));
2255 double den = xp * xp + x * xpp;
2262 edm = fabs(x * xp) /
sqrt(den);
2263 if (edm < epsi4x)
break;
2270 dt = std::min(dt, maxDt);
2272 dt = std::max(dt, -maxDt);
2275 B2WARNING(
"CDCGeometryPar::getMinDriftTime: den = 0\n" <<
"layer(#0-55),lr,alpha(rad),theta= " <<
2278 " " << alpha <<
" " << theta);
2284 if (nIter == (maxIter + 1)) minTime = minMinTime;
2292 const double theta)
const
2294 if (iCLayer < m_firstLayerOffset || iCLayer >= c_maxNSenseLayers) {
2300 const double eps = 2.5e-1;
2301 const double maxTrials = 100;
2303 double maxTime = 2000.;
2305 double t0 = minTime;
2306 const bool calMinTime =
false;
2310 double t1 = maxTime;
2312 while (((t1 - t0) > eps) && (i < maxTrials)) {
2313 time = 0.5 * (t0 + t1);
2314 double d1 =
getDriftLength(time, iCLayer, lr, alpha, theta, calMinTime, minTime) - dist;
2323 if (i >= maxTrials - 1 || time > maxTime) {
2324 B2WARNING(
"CDCGeometryPar::getDriftTime " << dist <<
" " << iCLayer <<
" " << alpha <<
" " << lr <<
" " << t0 <<
" " << t1 <<
" " <<
2333 const double theta)
const
2335 if (iCLayer < m_firstLayerOffset || iCLayer >= c_maxNSenseLayers) {
2342 const double driftL = fabs(DriftL0);
2348 B2FATAL(
"linearInterpolationOfSgm = false is not allowed now !");
2352 unsigned short ial[2] = {0};
2353 unsigned short ilr[2] = {lro, lro};
2356 unsigned short ith[2] = {0};
2360 unsigned short jal, jlr, jth;
2362 for (
unsigned k = 0; k < 4; ++k) {
2367 w = (1. - wal) * (1. - wth);
2368 }
else if (k == 1) {
2372 w = (1. - wal) * wth;
2373 }
else if (k == 2) {
2377 w = wal * (1. - wth);
2385 const double& P0 =
m_Sigma[iCLayer][jlr][jal][jth][0];
2386 const double& P1 =
m_Sigma[iCLayer][jlr][jal][jth][1];
2387 const double& P2 =
m_Sigma[iCLayer][jlr][jal][jth][2];
2388 const double& P3 =
m_Sigma[iCLayer][jlr][jal][jth][3];
2389 const double& P4 =
m_Sigma[iCLayer][jlr][jal][jth][4];
2390 const double& P5 =
m_Sigma[iCLayer][jlr][jal][jth][5];
2391 const double& P6 =
m_Sigma[iCLayer][jlr][jal][jth][6];
2395 sigma += w *
sqrt(P0 / (driftL * driftL + P1) + P2 * driftL + P3 +
2396 P4 * exp(P5 * (driftL - P6) * (driftL - P6)));
2398 double forthTermAtP7 = P4 * exp(P5 * (P7 - P6) * (P7 - P6));
2399 const double& P8 =
m_Sigma[iCLayer][jlr][jal][jth][8];
2401 double sigmaAtP7 =
sqrt(P0 / (P7 * P7 + P1) + P2 * P7 + P3 + forthTermAtP7);
2402 sigma += w * (P8 * (driftL - P7) + sigmaAtP7);
2404 double onePls4AtP7 =
sqrt(P0 / (P7 * P7 + P1) + forthTermAtP7);
2405 const double onePls4 = P8 * (driftL - P7) + onePls4AtP7;
2406 sigma += w *
sqrt(P2 * driftL + P3 + onePls4 * onePls4);
2408 forthTermAtP7 =
sqrt(forthTermAtP7);
2409 const double forthTerm = P8 * (driftL - P7) + forthTermAtP7;
2410 sigma += w *
sqrt(P0 / (driftL * driftL + P1) + P2 * driftL + P3 +
2411 forthTerm * forthTerm);
2424 unsigned short lr = 0;
2425 double wCrossT = (posOnWire.
Cross(posOnTrack)).Z();
2429 }
else if (wCrossT > 0.) {
2432 if ((posOnTrack - posOnWire).Perp() != 0.) {
2433 double wCrossP = (posOnWire.
Cross(momentum)).Z();
2435 if (posOnTrack.
Perp() > posOnWire.
Perp()) {
2440 }
else if (wCrossP < 0.) {
2441 if (posOnTrack.
Perp() < posOnWire.
Perp()) {
2459 const double distanceCrossP = ((posOnWire - posOnTrack).Cross(momentum)).Z();
2460 unsigned short int lr = (distanceCrossP > 0.) ? 1 : 0;
2467 const double wx = posOnWire.
X();
2468 const double wy = posOnWire.
Y();
2469 const double px = momentum.X();
2470 const double py = momentum.Y();
2472 const double cross = wx * py - wy * px;
2473 const double dot = wx * px + wy * py;
2475 return atan2(cross,
dot);
2480 return atan2(momentum.Perp(), momentum.Z());
2486 unsigned short lro = (fabs(alpha) <= 0.5 * M_PI) ? lr : abs(lr - 1);
2494 double alphao = alpha;
2495 if (alpha > 0.5 * M_PI) {
2497 }
else if (alpha < -0.5 * M_PI) {
2507 double thetao = fabs(alpha) > 0.5 * M_PI ? M_PI - theta : theta;
2512 unsigned short lrs[2])
const
2521 lrs[0] = abs(lrs[0] - 1);
2528 lrs[1] = abs(lrs[1] - 1);
2535 points[0] = points[1] - 1;
2542 unsigned short lrs[2])
const
2551 lrs[0] = abs(lrs[0] - 1);
2558 lrs[1] = abs(lrs[1] - 1);
2565 points[0] = points[1] - 1;
2587 points[0] = points[1] - 1;
2594 unsigned short points[2])
const
2610 points[0] = points[1] - 1;
2636 const unsigned short nLayers[c_nSuperLayers] = {8, 6, 6, 6, 6, 6, 6, 6, 6};
2638 for (
unsigned short SLayer = 0; SLayer < c_nSuperLayers; ++SLayer) {
2639 unsigned short firstCLayer = 0;
2640 for (
unsigned short i = 0; i < SLayer; ++i) {
2641 firstCLayer += nLayers[i];
2645 for (
unsigned short Layer = 0; Layer < nLayers[SLayer]; ++Layer) {
2646 unsigned short CLayer = firstCLayer + Layer;
2648 if (CLayer == firstCLayer) {
2651 }
else if (CLayer == firstCLayer + 1) {
2656 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).
static const baseType layerDPhi
Layer rotation in global X-Y plane (gamma) dPhi = forward - backward endplate.
static const baseType layerDy
Layer shift in global Y dY = forward - 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 = forward - 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.
const std::string & getPropSpeedFile() const
Get input file name for prop-speed.
const std::string & getFFactorFile() const
Get input file name for fudge factor.
bool getDisplacementInputType()
Get input type for wire displacement.
double getAddFudgeFactorForSigmaForMC() const
Get additional fudge factor for space resol for MC.
const std::string & getXtFile() const
Get input file name for xt-relation.
const std::string & getDisplacementFile() const
Get input file name for wire displacement.
const std::string & getSigmaFile() const
Get input file name for sigma.
bool getAlignmentInputType()
Get input type for wire alignment.
double getMaterialDefinitionMode() const
Get material definition mode.
bool getT0InputType()
Get input type for t0.
const std::string & getT0File() const
Get input file name for t0.
bool getEDepToADCInputType()
Get input type for edeptoadc.
bool getAlignment() const
Get alignment switch.
const std::string & getChMapFile() const
Get input file name for channel map.
bool getMisalignment() const
Get misalignment switch.
bool getDisplacement() const
Get displacement switch.
const std::string & getAlignmentFile() const
Get input file name for wire alignment.
int getSenseWireZposMode() const
Get sense wire z position mode.
const std::string & getEDepToADCFile() const
Get input file name for edeptoadc.
const std::string & getMisalignmentFile() const
Get input file name for wire misalignment.
double getAddFudgeFactorForSigmaForData() const
Get additional fudge factor for space resol for data.
bool getTwInputType()
Get input type for time-walk.
const std::string & getTwFile() const
Get input file name for time-walk.
bool getChMapInputType()
Get input type for channel map.
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.
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 sense 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.
static unsigned short getOutgoingLR(const unsigned short lr, const double alpha)
Converts incoming-lr to outgoing-lr.
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.
static unsigned nWireLayers()
Returns a number of wire layers.
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.
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.
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 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.
static double getOutgoingAlpha(const double alpha)
Converts incoming- to outgoing-alpha.
double getMinDriftTime(unsigned short layer, unsigned short lr, double alpha=0., double theta=0.5 *M_PI) const
Return the min.
DBObjPtr< CDCBadBoards > * m_badBoardsFromDB
bad-boards retrieved from DB.
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)
static void Print()
Print some debug information.
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.
void setBadBoard()
Set bad-boards (from DB)
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.
static double getOutgoingTheta(const double alpha, const double theta)
Converts incoming- to outgoing-theta.
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.
double getMinDriftTimeWithXtPoints(unsigned short layer, unsigned short lr, double alpha, double theta, double wal, const unsigned short ial[2], const unsigned short ilr[2], double wth, const unsigned short ith[2]) const
Return the min.
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)
float m_timeWalkCoef[c_nBoards][2]
coefficients for time walk.
static 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 resolution 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 spatial resolution (0.0130 cm).
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.
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.