Belle II Software development
CDCGeometryPar.h
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#pragma once
10
11#include <framework/gearbox/GearDir.h>
12#include <framework/database/DBArray.h>
13#include <framework/database/DBObjPtr.h>
14#include <framework/dbobjects/HardwareClockSettings.h>
15#include <framework/geometry/B2Vector3.h>
16
17#include <cdc/dataobjects/WireID.h>
18#include <cdc/dbobjects/CDCTimeZeros.h>
19#include <cdc/dbobjects/CDCBadWires.h>
20#include <cdc/dbobjects/CDCBadBoards.h>
21#include <cdc/dbobjects/CDCPropSpeeds.h>
22#include <cdc/dbobjects/CDCTimeWalks.h>
23#include <cdc/dbobjects/CDCXtRelations.h>
24#include <cdc/dbobjects/CDCSpaceResols.h>
25#include <cdc/dbobjects/CDCFudgeFactorsForSigma.h>
26#include <cdc/dbobjects/CDCChannelMap.h>
27#include <cdc/dbobjects/CDCDisplacement.h>
28#include <cdc/dbobjects/CDCAlignment.h>
29#include <cdc/dbobjects/CDCMisalignment.h>
30#include <cdc/dbobjects/CDCGeometry.h>
31#include <cdc/dbobjects/CDCEDepToADCConversions.h>
32
33#include <cdc/geometry/CDCGeometryParConstants.h>
34
35#include <vector>
36#include <string>
37#include <map>
38//#include <fstream>
39
40
41namespace Belle2 {
46 namespace CDC {
47
49
53
54 public:
55
57 enum EWirePosition {c_Base = 0, c_Misaligned, c_Aligned};
58
60 virtual ~CDCGeometryPar();
61
63
66 static CDCGeometryPar& Instance(const CDCGeometry* = nullptr);
67
69 void clear();
70
72 void Print() const;
73
75 void readFromDB(const CDCGeometry&);
76
77#if 0
82 void readDeltaz(const GearDir);
83
88 void readDeltaz(const CDCGeometry&);
89
95 void openFile(std::ifstream& ifs, const std::string& fileName0) const;
96#endif
97
103 // void readWirePositionParams(EWirePosition set, const CDCGeometry*, const GearDir);
104 void readWirePositionParams(EWirePosition set, const CDCGeometry* geom);
105
110
115
121 void readXT(const GearDir& gbxParams, int mode = 0);
122
128 void newReadXT(const GearDir& gbxParams, int mode = 0);
129
133 void setXT();
134
138 void setXtRel();
139
145 void readSigma(const GearDir& gbxParams, int mode = 0);
146
152 void newReadSigma(const GearDir& gbxParams, int mode = 0);
153
159 void readFFactor(const GearDir& gbxParams, int mode = 0);
160
164 void setSResol();
165
169 void setFFactor();
170
176 void readPropSpeed(const GearDir& gbxParams, int mode = 0);
177
181 void setPropSpeed();
182
188 void readT0(const GearDir& gbxParams, int mode = 0);
189
193 void setT0();
194
203 void calcMeanT0(double minT0 = 3800, double maxT0 = 5800, int maxIt = 10, double nStdv = 3, double epsi = 0.1);
204
205#if 0
211 void readBadWire(const GearDir, int mode = 0);
212#endif
213
217 void setBadWire();
218
222 void setBadBoard();
223
227 // void readChMap(const GearDir);
228 void readChMap();
229
233 void setChMap();
234
240 void readTW(const GearDir& gbxParams, int mode = 0);
241
247 void readEDepToADC(const GearDir& gbxParams, int mode = 0);
248
252 void setTW();
253
256
264 double getEDepToADCConvFactor(unsigned short layer, unsigned short cell, double edep, double dx, double costh);
265
266
272 double getEDepToADCMainFactor(unsigned short layer, unsigned short cell, double costh = 0)
273 {
274 return m_eDepToADCParams[layer][cell][0] + m_eDepToADCParams[layer][cell][4] * (costh - m_eDepToADCParams[layer][cell][5]);
275 };
276
281 double getEDepToADCSigma(unsigned short layer, unsigned short cell)
282 {
283 return m_eDepToADCParams[layer][cell][6];
284 };
285
287
290 void generateXML(const std::string& of);
291
293
296 std::string version() const;
297
299
302 double motherInnerR() const;
303
305
308 double motherOuterR() const;
309
311
314 double motherLength() const;
315
317
320 int momBound() const;
321
323
327 double momZ(int iBound) const;
328
330
334 double momRmin(int iBound) const;
335
337
342 unsigned cellId(unsigned layerId, const B2Vector3D& position) const;
343
345
348 double innerRadiusOuterWall() const;
349
351
354 double outerRadiusOuterWall() const;
355
357
360 double zOuterWall() const;
361
363
366 double zOffsetOuterWall() const;
367
369
372 double innerRadiusInnerWall() const;
373
375
378 double outerRadiusInnerWall() const;
379
381
384 double zInnerWall() const;
385
387
390 double zOffsetInnerWall() const;
391
393
396 double senseWireDiameter() const;
397
399
402 double fieldWireDiameter() const;
403
405
408 unsigned nWireLayers() const;
409
411
415 unsigned nWiresInLayer(int layerId) const;
416
418
421 const double* innerRadiusWireLayer() const;
422
424
427 const double* outerRadiusWireLayer() const;
428
430
433 const double* zForwardWireLayer() const;
434
436
439 const double* zBackwardWireLayer() const;
440
442
446 double zOffsetWireLayer(unsigned i) const;
447
449
452 double getMeanT0() const;
453
455
461 const B2Vector3D wireForwardPosition(uint layerId, int cellId, EWirePosition set = c_Base) const;
462
464 const B2Vector3D wireForwardPosition(const WireID& wireID, EWirePosition set = c_Base) const
465 {
466 return wireForwardPosition(wireID.getICLayer(), wireID.getIWire(), set);
467 }
468
470
477 const B2Vector3D wireForwardPosition(uint layerId, int cellId, double z, EWirePosition set = c_Base) const;
479 const B2Vector3D wireForwardPosition(const WireID& wireID, double z,
480 EWirePosition set = c_Base) const
481 {
482 return wireForwardPosition(wireID.getICLayer(), wireID.getIWire(), z, set);
483 }
484
486
492 const B2Vector3D wireBackwardPosition(uint layerId, int cellId, EWirePosition set = c_Base) const;
493
495 const B2Vector3D wireBackwardPosition(const WireID& wireID, EWirePosition set = c_Base) const
496 {
497 return wireBackwardPosition(wireID.getICLayer(), wireID.getIWire(), set);
498 }
499
501
508 const B2Vector3D wireBackwardPosition(uint layerId, int cellId, double z, EWirePosition set = c_Base) const;
510 const B2Vector3D wireBackwardPosition(const WireID& wireID, double z, EWirePosition set = c_Base) const
511 {
512 return wireBackwardPosition(wireID.getICLayer(), wireID.getIWire(), z, set);
513 }
514
516
522 double getWireSagCoef(EWirePosition set, uint layerId, int cellId) const;
523
524
526
530 {
532 }
533
535
538 double getMinTrackLength() const
539 {
540 return m_minTrackLength;
541 }
542
544
546 bool isWireSagOn() const
547 {
548 return m_wireSag;
549 }
550
552
555 {
556 return m_modLeftRightFlag;
557 }
558
559
561
565 float getT0(const WireID& wireID) const
566 {
567 // std::cout << wireID.getICLayer() <<" "<< wireID.getIWire() << std::endl;
568 unsigned int iclayer = wireID.getICLayer();
569 unsigned int iwire = wireID.getIWire();
570 if (iclayer >= c_maxNSenseLayers) iclayer = c_maxNSenseLayers - 1;
571 if (iwire >= c_maxNDriftCells) iwire = c_maxNDriftCells - 1;
572 return m_t0[iclayer][iwire];
573 }
574
576
580 unsigned short getBoardID(const WireID& wID) const
581 {
582 std::map<WireID, unsigned short>::const_iterator it = m_wireToBoard.find(wID);
583 unsigned short iret = (it != m_wireToBoard.end()) ? it->second : -999;
584 return iret;
585 }
586
588
592 unsigned short getChannelID(const WireID& wID) const
593 {
594 std::map<WireID, unsigned short>::const_iterator it = m_wireToChannel.find(wID);
595 unsigned short iret = (it != m_wireToChannel.end()) ? it->second : -999;
596 return iret;
597 }
598
600
605 const WireID getWireID(unsigned short bd, unsigned short ch) const
606 {
607 return WireID(m_boardAndChannelToWire[bd][ch]);
608 }
609
611
616 double getTimeWalk(const WireID& wID, unsigned short adcCount) const
617 {
618 std::map<WireID, unsigned short>::const_iterator it = m_wireToBoard.find(wID);
619 // std::cout <<"SL,L,W, bd#= " << wID.getISuperLayer() <<" "<< wID.getILayer() <<" "<< wID.getIWire() <<" "<< it->second << std::endl;
620 double tw = 0.;
621 if (it != m_wireToBoard.end() && adcCount > 0) {
622 if (m_twParamMode == 0) {
623 tw = m_timeWalkCoef[it->second][0] / sqrt(adcCount);
624 } else if (m_twParamMode == 1) {
625 double p0 = m_timeWalkCoef[it->second][0];
626 double p1 = m_timeWalkCoef[it->second][1];
627 tw = p0 * exp(-p1 * adcCount);
628 }
629 }
630 // std::cout <<"bd#,coef,adc,tw= " << it->second <<" "<< m_timeWalkCoef[it->second] <<" "<< adcCount <<" "<< tw << std::endl;
631 return tw;
632 }
633
635
638
640
644 signed short getShiftInSuperLayer(unsigned short iSuperLayer, unsigned short iLayer) const;
645
647
651 double senseWireR(int layerId) const;
652
654
658 double senseWireFZ(int layerId) const;
659
661
665 double senseWireBZ(int layerId) const;
666
668
672 double fieldWireR(int layerId) const;
673
675
679 double fieldWireFZ(int layerId) const;
680
682
686 double fieldWireBZ(int layerId) const;
687
689
693 int nShifts(int layerId) const;
694
700 double offset(int layerID) const;
701
703
707 void setSenseWireR(int layerId, double r);
708
710
714 void setSenseWireFZ(int layerId, double fz);
715
717
721 void setSenseWireBZ(int layerId, double bz);
722
726
727 inline unsigned short getTdcOffset() const
728 {
729 return m_tdcOffset;
730 }
731
735
736 inline double getTdcBinWidth() const
737 {
738 return m_tdcBinWidth;
739 }
740
745
746 inline double getNominalDriftV() const
747 {
748 return m_nominalDriftV;
749 }
750
755
756 inline double getNominalPropSpeed() const
757 {
758 return m_nominalPropSpeed;
759 }
760
765
766 inline double getNominalSpaceResol() const
767 {
768 return m_nominalSpaceResol;
769 }
770
780
781 inline int getMaterialDefinitionMode() const
782 {
784 }
785
794 inline int getSenseWireZposMode() const
795 {
796 return m_senseWireZposMode;
797 }
798
804 inline double getBwdDeltaZ(unsigned short layerID) const
805 {
806 return m_dzSBackwardLayer[layerID];
807 }
808
814 inline double getFwdDeltaZ(unsigned short layerID) const
815 {
816 return m_dzSForwardLayer[layerID];
817 }
818
824
825 inline void setNominalSpaceResol(double resol)
826 {
827 m_nominalSpaceResol = resol;
828 }
829
835
836 inline double getPropSpeedInv(const unsigned int layerID) const
837 {
838 return m_propSpeedInv[layerID];
839 }
840
844 inline bool isBadWire(const WireID& wid)
845 {
846 double eff = 0;
847 bool badBoard = *m_badBoardsFromDB ? (*m_badBoardsFromDB)->isDeadBoard(getBoardID(wid), eff) : false;
848 if (badBoard) return badBoard;
849 bool torf = *m_badWireFromDB ? (*m_badWireFromDB)->isBadWire(wid) : false;
850 return torf;
851 }
852
856 inline bool isDeadWire(const WireID& wid, double& eff)
857 {
858 bool badBoard = *m_badBoardsFromDB ? (*m_badBoardsFromDB)->isDeadBoard(getBoardID(wid), eff) : false;
859 if (badBoard) return badBoard;
860 bool torf = *m_badWireFromDB ? (*m_badWireFromDB)->isDeadWire(wid, eff) : false;
861 return torf;
862 }
863
867 inline bool isHotWire(const WireID& wid)
868 {
869 bool hotBoard = *m_badBoardsFromDB ? (*m_badBoardsFromDB)->isHotBoard(getBoardID(wid)) : false;
870 if (hotBoard) return hotBoard;
871 bool torf = *m_badWireFromDB ? (*m_badWireFromDB)->isHotWire(wid) : false;
872 return torf;
873 }
874
887
888 void getWireSagEffect(EWirePosition set, unsigned layerID, unsigned cellID, double zw, double& ywb_sag, double& ywf_sag) const;
889
899
900 double getDriftV(double dt, unsigned short layer, unsigned short lr, double alpha = 0., double theta = 0.5 * M_PI) const;
901
912
913 double getDriftLength(double dt, unsigned short layer, unsigned short lr, double alpha = 0., double theta = 0.5 * M_PI,
914 bool calculateMinTime = true, double minTime = 0.) const;
915
924 double getDriftLength0(double dt, unsigned short layer, unsigned short lr, double alpha = 0., double theta = 0.5 * M_PI) const;
925
933 double getMinDriftTime(unsigned short layer, unsigned short lr, double alpha = 0., double theta = 0.5 * M_PI) const;
934
943
944 double getDriftTime(double dist, unsigned short layer, unsigned short lr, double alpha, double theta) const;
945
954 double getSigma(double dist, unsigned short layer, unsigned short lr, double alpha = 0., double theta = 0.5 * M_PI) const;
955
960 double getFudgeFactorForSigma(unsigned short target) const
961 {
962 return m_fudgeFactorForSigma[target];
963 }
964
971 unsigned short getOldLeftRight(const B2Vector3D& posOnWire, const B2Vector3D& posOnTrack, const B2Vector3D& momentum) const;
972
979
980 unsigned short getNewLeftRightRaw(const B2Vector3D& posOnWire, const B2Vector3D& posOnTrack, const B2Vector3D& momentum) const;
981
987
988 double getAlpha(const B2Vector3D& posOnWire, const B2Vector3D& momentum) const;
989
994 double getTheta(const B2Vector3D& momentum) const;
995
996
1002 unsigned short getOutgoingLR(const unsigned short lr, const double alpha) const;
1003
1004
1009 double getOutgoingAlpha(const double alpha) const;
1010
1011
1017 double getOutgoingTheta(const double alpha, const double theta) const;
1018
1019
1023 void getClosestAlphaPoints(const double alpha, double& wal, unsigned short points[2], unsigned short lrs[2]) const;
1024
1028 void getClosestAlphaPoints4Sgm(const double alpha, double& wal, unsigned short points[2], unsigned short lrs[2]) const;
1029
1033 void getClosestThetaPoints(const double alpha, const double theta, double& wth, unsigned short points[2]) const;
1034
1038 void getClosestThetaPoints4Sgm(const double alpha, const double theta, double& wth, unsigned short points[2]) const;
1039
1045 void setDesignWirParam(unsigned layerID, unsigned cellID);
1046
1052 void outputDesignWirParam(unsigned layerID, unsigned cellID) const;
1053
1057 void setDisplacement();
1058
1059
1063 ushort getNumberOfSenseWires() const { return m_nSenseWires;}
1064
1068 ushort getNumberOfFieldWires() const { return m_nFieldWires;}
1069
1074
1079
1084
1089
1094
1099
1100 private:
1102 CDCGeometryPar(const CDCGeometry* = nullptr);
1107
1108 bool m_debug;
1111 bool m_XTetc;
1116
1119
1120 std::string m_version;
1130 unsigned short m_nAlphaPoints;
1131 unsigned short m_nThetaPoints;
1132 unsigned short m_nAlphaPoints4Sgm;
1133 unsigned short m_nThetaPoints4Sgm;
1134 signed short m_shiftInSuperLayer[c_nSuperLayers][8];
1135
1136 double m_rWall[4];
1137 double m_zWall[4][2];
1138
1139 double m_rSLayer[c_maxNSenseLayers];
1140 double m_zSForwardLayer[c_maxNSenseLayers];
1141 double m_dzSForwardLayer[c_maxNSenseLayers];
1142 double m_zSBackwardLayer[c_maxNSenseLayers];
1143 double m_dzSBackwardLayer[c_maxNSenseLayers];
1144 double m_rFLayer[c_maxNFieldLayers];
1145 double m_zFForwardLayer[c_maxNFieldLayers];
1146 double m_zFBackwardLayer[c_maxNFieldLayers];
1147 double m_offSet[c_maxNSenseLayers];
1148 double m_cellSize[c_maxNSenseLayers];
1149 int m_nShifts[c_maxNSenseLayers];
1150 unsigned m_nWires[c_maxNSenseLayers];
1151
1156
1158
1159 double m_momZ[7];
1160 double m_momRmin[7];
1161
1162 // double m_bwdDz[c_maxNSenseLayers]; /*!< Tentative backward z-corrections.*/
1163 // double m_fwdDz[c_maxNSenseLayers]; /*!< Tentative forward z-corrections.*/
1164
1167
1168 float m_FWirPos[c_maxNSenseLayers][c_maxNDriftCells][3];
1169 float m_BWirPos[c_maxNSenseLayers][c_maxNDriftCells][3];
1170 float m_WireSagCoef[c_maxNSenseLayers][c_maxNDriftCells];
1171
1172 float m_FWirPosMisalign[c_maxNSenseLayers][c_maxNDriftCells][3];
1173 float m_BWirPosMisalign[c_maxNSenseLayers][c_maxNDriftCells][3];
1174 float m_WireSagCoefMisalign[c_maxNSenseLayers][c_maxNDriftCells];
1175
1176 float m_FWirPosAlign[c_maxNSenseLayers][c_maxNDriftCells][3];
1177 float m_BWirPosAlign[c_maxNSenseLayers][c_maxNDriftCells][3];
1178 float m_WireSagCoefAlign[c_maxNSenseLayers][c_maxNDriftCells];
1179 float m_eDepToADCParams[c_maxNSenseLayers][c_maxNDriftCells][7] = {};
1180
1181 float m_alphaPoints[c_maxNAlphaPoints];
1182 float m_thetaPoints[c_maxNThetaPoints];
1183 float m_alphaPoints4Sgm[c_maxNAlphaPoints];
1184 float m_thetaPoints4Sgm[c_maxNThetaPoints];
1185
1186 float m_XT[c_maxNSenseLayers][2][c_maxNAlphaPoints][c_maxNThetaPoints][c_nXTParams];
1187 float m_Sigma[c_maxNSenseLayers][2][c_maxNAlphaPoints][c_maxNThetaPoints][c_nSigmaParams];
1188 float m_propSpeedInv[c_maxNSenseLayers];
1189 float m_t0[c_maxNSenseLayers][c_maxNDriftCells] = {};
1190 float m_timeWalkCoef[c_nBoards][2];
1191
1192 // float m_meanT0; /*!< mean t0 over all wires. */
1193 double m_meanT0;
1194
1195 std::map<WireID, unsigned short> m_wireToBoard;
1196 std::map<WireID, unsigned short> m_wireToChannel;
1197 unsigned short m_boardAndChannelToWire[c_nBoards][48];
1198 unsigned short m_tdcOffset;
1207
1221
1223
1225
1226 ushort m_nSenseWires = c_nSenseWires;
1227 ushort m_nFieldWires = c_nFieldWires;
1228 ushort m_maxNSenseLayers = c_maxNSenseLayers;
1229 ushort m_maxNFieldLayers = c_maxNFieldLayers;
1230 ushort m_maxNSuperLayers = c_nSuperLayers;
1233 ushort m_maxNCellsPerLayer = c_maxNDriftCells;
1234
1235 };
1236
1237//-----------------------------------------------------------------------------
1238// Inline functions
1239//-----------------------------------------------------------------------------
1240 inline std::string CDCGeometryPar::version() const
1241 {
1242 return m_version;
1243 }
1244
1245 inline double CDCGeometryPar::momZ(int iBound) const
1246 {
1247 return m_momZ[iBound];
1248 }
1249
1250 inline double CDCGeometryPar::momRmin(int iBound) const
1251 {
1252 return m_momRmin[iBound];
1253 }
1254
1255 inline int CDCGeometryPar::nShifts(int layerID) const
1256 {
1257 return m_nShifts[layerID];
1258 }
1259
1260 inline double CDCGeometryPar::offset(int layerID) const
1261 {
1262 return m_offSet[layerID];
1263 }
1264
1265 inline unsigned CDCGeometryPar::nWiresInLayer(int layerID) const
1266 {
1267 return m_nWires[layerID];
1268 }
1269
1270 inline void CDCGeometryPar::setSenseWireR(int layerId, double r)
1271 {
1272 m_rSLayer[layerId] = r;
1273 }
1274
1275 inline void CDCGeometryPar::setSenseWireFZ(int layerId, double fz)
1276 {
1277 m_zSForwardLayer[layerId] = fz;
1278 }
1279
1280 inline void CDCGeometryPar::setSenseWireBZ(int layerId, double bz)
1281 {
1282 m_zSBackwardLayer[layerId] = bz;
1283 }
1284
1285 inline double CDCGeometryPar::senseWireR(int layerID) const
1286 {
1287 return m_rSLayer[layerID];
1288 }
1289
1290 inline double CDCGeometryPar::senseWireFZ(int layerID) const
1291 {
1292 return m_zSForwardLayer[layerID];
1293 }
1294
1295 inline double CDCGeometryPar::senseWireBZ(int layerID) const
1296 {
1297 return m_zSBackwardLayer[layerID];
1298 }
1299
1300 inline double CDCGeometryPar::fieldWireR(int layerID) const
1301 {
1302 return m_rFLayer[layerID];
1303 }
1304
1305 inline double CDCGeometryPar::fieldWireFZ(int layerID) const
1306 {
1307 return m_zFForwardLayer[layerID];
1308 }
1309
1310 inline double CDCGeometryPar::fieldWireBZ(int layerID) const
1311 {
1312 return m_zFBackwardLayer[layerID];
1313 }
1314
1316 {
1317 return m_rWall[2];
1318 }
1319
1321 {
1322 return m_rWall[3];
1323 }
1324
1325 inline double CDCGeometryPar::zOuterWall() const
1326 {
1327 return (m_zWall[2][1] - m_zWall[2][0]);
1328 }
1329
1331 {
1332 return m_rWall[0];
1333 }
1334
1336 {
1337 return m_rWall[1];
1338 }
1339
1340 inline double CDCGeometryPar::zInnerWall() const
1341 {
1342 return (m_zWall[0][1] - m_zWall[0][0]);
1343 }
1344
1346 {
1347 return (m_zWall[2][0] + zOuterWall() / 2);
1348 }
1349
1351 {
1352 return (m_zWall[0][0] + zInnerWall() / 2);
1353 }
1354
1356 {
1357 return m_senseWireDiameter;
1358 }
1359
1361 {
1362 return m_fieldWireDiameter;
1363 }
1364
1365 inline unsigned CDCGeometryPar::nWireLayers() const
1366 {
1367 return c_maxNSenseLayers;
1368 }
1369
1370 inline const double* CDCGeometryPar::zForwardWireLayer() const
1371 {
1372 return m_zSForwardLayer;
1373 }
1374
1375 inline const double* CDCGeometryPar::zBackwardWireLayer() const
1376 {
1377 return m_zSBackwardLayer;
1378 }
1379
1380 inline double CDCGeometryPar::zOffsetWireLayer(unsigned i) const
1381 {
1382 return (m_zSBackwardLayer[i] + (m_zSForwardLayer[i] - m_zSBackwardLayer[i]) / 2);
1383 }
1384
1385 inline double CDCGeometryPar::getMeanT0() const
1386 {
1387 return m_meanT0;
1388 }
1389
1390 } // end of namespace CDC
1392} // end of namespace Belle2
The Class for CDC geometry.
Definition CDCGeometry.h:27
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.
double getTimeWalk(const WireID &wID, unsigned short adcCount) const
Returns time-walk.
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).
double getNominalPropSpeed() const
Return the nominal propagation speed of the sense wire (default: 27.25 cm/nsec).
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.).
double motherLength() const
The method to get cdc mother volume length.
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.
double fieldWireDiameter() const
Returns diameter of the field wire.
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.
double zOuterWall() const
Returns the length of the outer wall in Z.
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.
const double * zBackwardWireLayer() const
Returns an array of backward z of wire layers.
double m_globalPhiRotation
Global ratation in phi (rad.); only for sense wires now.
unsigned short getBoardID(const WireID &wID) const
Returns frontend board id. corresponding to the wire id.
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).
void setNominalSpaceResol(double resol)
Set the nominal spatial resolution in the unit of um.
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 getFwdDeltaZ(unsigned short layerID) const
Return forward 'deltaZ'.
double motherInnerR() const
The method to get cdc mother volume inner R.
const double * zForwardWireLayer() const
Returns an array of forward z of wire layers.
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
double getNominalSpaceResol() const
Return the nominal spatial resolution.
float m_eDepToADCParams[c_maxNSenseLayers][c_maxNDriftCells][7]
edep-to-ADC conv.
double getThresholdEnerguDeposit() const
Returns threshold for energy deposit in one G4 step.
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.
ushort getOffsetOfFirstLayer() const
Get the offset of the first layer.
float m_FWirPosMisalign[c_maxNSenseLayers][c_maxNDriftCells][3]
Wire position incl.
double getMinTrackLength() const
Returns the minimum track length required in one G4 step (only secondary particles which pass this cr...
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.
const WireID getWireID(unsigned short bd, unsigned short ch) const
Returns wire id. corresponding to the board-and-cannel ids.
double momRmin(int iBound) const
Returns inner radius of the CDC mother volume.
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).
bool isWireSagOn() const
Returns on/off for sense wire sag in FullSim.
const B2Vector3D wireForwardPosition(const WireID &wireID, double z, EWirePosition set=c_Base) const
The same function but in a different input format.
ushort getMaxNumberOfSuperLayers() const
Get the maximum number of super layers.
int m_nFLayer
The number of field wire layer.
static CDCGeometryPar * m_B4CDCGeometryParDB
Pointer that saves the instance of this class.
double zOffsetOuterWall() const
Returns the offset of the outer wall in z direction.
DBObjPtr< CDCMisalignment > * m_misalignmentFromDB
misalignment params.
ushort getNumberOfFieldWires() const
Get the number of field wires.
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.
void setSenseWireR(int layerId, double r)
Set radius of sense wire in each layer.
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.
double senseWireDiameter() const
Returns diameter of the sense wire.
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.
double getTdcBinWidth() const
Return TDC bin width (nsec).
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.
double momZ(int iBound) const
Returns boundary position in Z axis of the CDC mother volume.
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.
float getT0(const WireID &wireID) const
Returns t0 parameter of the specified sense wire.
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.
double getFudgeFactorForSigma(unsigned short target) const
Return the fuge factor for space resol.
float m_thetaPoints4Sgm[c_maxNThetaPoints]
theta sampling points for sigma (rad)
const B2Vector3D wireForwardPosition(const WireID &wireID, EWirePosition set=c_Base) const
The same function but in a different input format.
double zInnerWall() const
Returns the length of the inner wall in Z.
void setXT()
Set XT-relation table (from DB).
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.
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 zOffsetInnerWall() const
Returns the offset of the outer wall in z direction.
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 getBwdDeltaZ(unsigned short layerID) const
Return backward 'deltaZ'.
double innerRadiusInnerWall() const
Returns the inner radius of the inner wall.
DBObjPtr< CDCTimeZeros > * m_t0FromDB
t0s retrieved from DB.
ushort getMaxNumberOfCellsPerLayer() const
Get the maximum number of cells in one layer.
int m_xtFileFormat
Format of xt input file.
int m_sigmaFileFormat
Format of sigma input file.
void setSenseWireBZ(int layerId, double bz)
set backward z position of sense wires.
ushort m_firstSuperLayerOffset
Offset of the first super layer (for reduced CDC studies)
void setChMap()
Set channel map (from DB)
double getEDepToADCSigma(unsigned short layer, unsigned short cell)
Return sigma for extra smearing of edep to ADC conversion.
double getNominalDriftV() const
Return the nominal drift velocity of He-ethane gas (default: 4.0x10^-3 cm/nsec).
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)
double getMeanT0() const
Returns the mean t0 over all 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.
ushort getNumberOfSenseLayers() const
Get the number of sense layers.
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.
double getPropSpeedInv(const unsigned int layerID) const
Get the inversel of propagation speed in the sense wire.
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.
CDCGeometryPar(const CDCGeometryPar &)
Singleton class.
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.
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.
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_momZ[7]
Z-cordinates of the cdc mother volume (7 segments).
double m_momRmin[7]
R_min of the cdc mother volume (7 segments).
double m_offSet[c_maxNSenseLayers]
The array to store z offset of sense wire layers.
int getSenseWireZposMode() const
Return mode for sense wire z position.
void setTW()
Set time-walk parameters.
const B2Vector3D wireBackwardPosition(const WireID &wireID, EWirePosition set=c_Base) const
The same function but in a different input format.
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.
ushort getNumberOfFieldLayers() const
Get the number of field layers.
const B2Vector3D wireBackwardPosition(const WireID &wireID, double z, EWirePosition set=c_Base) const
The same function but in a different input format.
DBObjPtr< CDCAlignment > * m_alignmentFromDB
alignment params.
ushort m_maxNFieldLayers
Maximum number of Field Wire Layers.
bool m_misalignment
Switch for misalignment.
int getMaterialDefinitionMode() const
Return mode for material definition.
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.
ushort getOffsetOfFirstSuperLayer() const
Get the offset of the first super layer.
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.
unsigned short getChannelID(const WireID &wID) const
Returns frontend channel id. corresponding to the wire id.
double m_nominalSpaceResol
Nominal spatial 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 motherOuterR() const
The method to get cdc mother volume outer R.
CDCGeometryPar & operator=(const CDCGeometryPar &)
Singleton class.
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).
bool isModifiedLeftRightFlagOn() const
Returns on/off for modified left/right calculation in FullSim.
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.
ushort getNumberOfSenseWires() const
Get the number of sense wires.
double m_senseWireTension
The tension of sense wires.
double getEDepToADCMainFactor(unsigned short layer, unsigned short cell, double costh=0)
Return edep-to-ADC conversion main factor (in count/keV)
double zOffsetWireLayer(unsigned i) const
Returns the offset of z of the wire layer i.
void setFFactor()
Set fudge factors (from DB).
void setSenseWireFZ(int layerId, double fz)
Set forward z position of sense wires.
std::string version() const
Returns the version of cdc geometry parameters.
int momBound() const
to get the number of boundary position of the CDC mother volume
unsigned short getTdcOffset() const
Return TDC offset value (default = 0 ch).
Class for accessing arrays of objects in the database.
Definition DBArray.h:26
Class for accessing objects in the database.
Definition DBObjPtr.h:21
GearDir is the basic class used for accessing the parameter store.
Definition GearDir.h:31
Class to identify a wire inside the CDC.
Definition WireID.h:34
unsigned short getICLayer() const
Getter for continuous layer numbering.
Definition WireID.cc:24
unsigned short getIWire() const
Getter for wire within the layer.
Definition WireID.h:145
B2Vector3< double > B2Vector3D
typedef for common usage with double
Definition B2Vector3.h:516
double sqrt(double a)
sqrt for double
Definition beamHelpers.h:28
Abstract base class for different kinds of events.