File indexing completed on 2026-06-14 07:49:52
0001 #include "DDSegmentation/Segmentation.h"
0002 #include "DDSegmentation/PolarGridRPhi2.h"
0003 #include "DDSegmentation/PolarGridRPhi.h"
0004 #include "DD4hep/Printout.h"
0005 #include "DD4hep/DDTest.h"
0006
0007 #include <memory>
0008 #include <vector>
0009 #include <exception>
0010 #include <cmath>
0011
0012 static dd4hep::DDTest test( "CellDimensions" ) ;
0013
0014 using dd4hep::DDSegmentation::Segmentation;
0015 using dd4hep::DDSegmentation::CellID;
0016
0017 Segmentation* createPolarGridRPhi2();
0018 Segmentation* createPolarGridRPhi(double rSize, double phiSize);
0019 CellID getCellID(Segmentation* seg, long long rId, long long pId);
0020
0021 class TestTuple {
0022 public:
0023 double _r;
0024 double _p;
0025 CellID _cid;
0026 TestTuple( Segmentation* seg, double r, double p, long long rB, long long rP): _r(r), _p(p), _cid(getCellID(seg, rB, rP)) {}
0027 };
0028
0029 void testRPhi2();
0030 void testRPhi();
0031
0032 int main() {
0033 using namespace dd4hep;
0034 try {
0035 testRPhi2();
0036 testRPhi();
0037 }
0038 catch(const std::exception& e) {
0039 printout(ERROR,"CellDimensions","+++ Caught unhandled exception: %s",e.what());
0040 }
0041 catch(...) {
0042 printout(ERROR,"CellDimensions","+++ Caught UNKNOWN unhandled exception.");
0043 }
0044 return 0;
0045 }
0046
0047
0048 Segmentation* createPolarGridRPhi(double rSize, double phiSize) {
0049
0050 dd4hep::DDSegmentation::PolarGridRPhi* seg = new dd4hep::DDSegmentation::PolarGridRPhi("system:8,barrel:3,layer:8,slice:13,r:16,phi:16");
0051
0052 seg->setGridSizeR(rSize);
0053 seg->setGridSizePhi(phiSize);
0054 return seg;
0055
0056 }
0057
0058 Segmentation* createPolarGridRPhi2() {
0059
0060 dd4hep::DDSegmentation::PolarGridRPhi2* seg = new dd4hep::DDSegmentation::PolarGridRPhi2("system:8,barrel:3,layer:8,slice:13,r:16,phi:16");
0061
0062 std::vector<double> rValues, phiValues;
0063
0064 rValues.push_back( 10);
0065 rValues.push_back( 30);
0066 rValues.push_back( 35);
0067 rValues.push_back( 40);
0068 rValues.push_back( 50);
0069 rValues.push_back( 60);
0070 rValues.push_back( 70);
0071 rValues.push_back( 80);
0072 rValues.push_back( 90);
0073 rValues.push_back(100);
0074 rValues.push_back(110);
0075 rValues.push_back(120);
0076 rValues.push_back(130);
0077 rValues.push_back(140);
0078 rValues.push_back(150);
0079 rValues.push_back(153);
0080
0081 const double DegToRad(M_PI/180.0);
0082
0083 phiValues.push_back( 10*DegToRad);
0084 phiValues.push_back( 20*DegToRad);
0085 phiValues.push_back( 30*DegToRad);
0086 phiValues.push_back( 40*DegToRad);
0087 phiValues.push_back( 50*DegToRad);
0088 phiValues.push_back( 60*DegToRad);
0089 phiValues.push_back( 70*DegToRad);
0090 phiValues.push_back( 80*DegToRad);
0091 phiValues.push_back( 90*DegToRad);
0092 phiValues.push_back(100*DegToRad);
0093 phiValues.push_back(110*DegToRad);
0094 phiValues.push_back(120*DegToRad);
0095 phiValues.push_back(130*DegToRad);
0096 phiValues.push_back(140*DegToRad);
0097 phiValues.push_back(150*DegToRad);
0098
0099
0100
0101 seg->setGridRValues(rValues);
0102 seg->setGridPhiValues(phiValues);
0103 seg->setOffsetPhi(-M_PI);
0104
0105 return seg;
0106 }
0107
0108 CellID getCellID(dd4hep::DDSegmentation::Segmentation* seg, long long rB, long long pB){
0109 CellID cID { 0 };
0110 seg->decoder()->set(cID,"r",rB) ;
0111 seg->decoder()->set(cID,"phi",pB);
0112 return cID;
0113 }
0114
0115 void testRPhi2(){
0116 std::vector<TestTuple> tests;
0117
0118 std::unique_ptr<Segmentation> seg(createPolarGridRPhi2());
0119 const double DegToRad = M_PI/180.0;
0120 tests.push_back( TestTuple( seg.get(), 20.0, 20*10*DegToRad, 0, 1 ) );
0121 tests.push_back( TestTuple( seg.get(), 5.0, 32.5*20*DegToRad, 1, 1 ) );
0122 tests.push_back( TestTuple( seg.get(), 3.0, 151.5*150*DegToRad, 14, 1 ) );
0123
0124 try {
0125
0126 for (std::vector<TestTuple>::iterator it = tests.begin(); it != tests.end(); ++it) {
0127
0128 CellID cellid = (*it)._cid;
0129 double rSize = (*it)._r;
0130 double rPhiSize = (*it)._p;
0131
0132 test( fabs(seg->cellDimensions(cellid)[0] - rSize ) < 1e-11, " Seg: RPhi2: Dimension for R" );
0133 test( fabs(seg->cellDimensions(cellid)[1] - rPhiSize ) < 1e-11, " Seg: RPhi2: Dimension for RPhi" );
0134
0135 }
0136 } catch( std::exception &e ){
0137
0138 test.log( e.what() );
0139 test.error( "exception occurred" );
0140 }
0141
0142 }
0143
0144 void testRPhi(){
0145 std::vector<TestTuple> tests;
0146
0147 const double rSizeGrid = 10.0;
0148 const double phiSizeGrid = M_PI/36;
0149 std::unique_ptr<Segmentation> seg(createPolarGridRPhi(rSizeGrid, phiSizeGrid));
0150
0151 tests.push_back( TestTuple( seg.get(), rSizeGrid, rSizeGrid*(0) *phiSizeGrid, 0, 1 ) );
0152 tests.push_back( TestTuple( seg.get(), rSizeGrid, rSizeGrid*(1) *phiSizeGrid, 1, 1 ) );
0153 tests.push_back( TestTuple( seg.get(), rSizeGrid, rSizeGrid*(14)*phiSizeGrid, 14, 1 ) );
0154
0155 try {
0156
0157 for (std::vector<TestTuple>::iterator it = tests.begin(); it != tests.end(); ++it) {
0158
0159 CellID cellid = (*it)._cid;
0160 double rSize = (*it)._r;
0161 double rPhiSize = (*it)._p;
0162
0163 test( fabs(seg->cellDimensions(cellid)[0] - rSize ) < 1e-11, " Seg: RPhi: Dimension for R" );
0164 test( fabs(seg->cellDimensions(cellid)[1] - rPhiSize ) < 1e-11, " Seg: RPhi: Dimension for RPhi" );
0165
0166 }
0167 } catch( std::exception &e ){
0168
0169 test.log( e.what() );
0170 test.error( "exception occurred" );
0171 }
0172
0173 }