Back to home page

EIC code displayed by LXR

 
 

    


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; ///phi
0025   CellID _cid; ///cellID
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);//  0
0065   rValues.push_back( 30);//  1
0066   rValues.push_back( 35);//  2
0067   rValues.push_back( 40);//  3
0068   rValues.push_back( 50);//  4
0069   rValues.push_back( 60);//  5
0070   rValues.push_back( 70);//  6
0071   rValues.push_back( 80);//  7
0072   rValues.push_back( 90);//  8
0073   rValues.push_back(100);//  9
0074   rValues.push_back(110);// 10
0075   rValues.push_back(120);// 11
0076   rValues.push_back(130);// 12
0077   rValues.push_back(140);// 13
0078   rValues.push_back(150);// 14
0079   rValues.push_back(153);// 15
0080 
0081   const double DegToRad(M_PI/180.0);
0082 
0083   phiValues.push_back( 10*DegToRad);//  0
0084   phiValues.push_back( 20*DegToRad);//  1
0085   phiValues.push_back( 30*DegToRad);//  2
0086   phiValues.push_back( 40*DegToRad);//  3
0087   phiValues.push_back( 50*DegToRad);//  4
0088   phiValues.push_back( 60*DegToRad);//  5
0089   phiValues.push_back( 70*DegToRad);//  6
0090   phiValues.push_back( 80*DegToRad);//  7
0091   phiValues.push_back( 90*DegToRad);//  8
0092   phiValues.push_back(100*DegToRad);//  9
0093   phiValues.push_back(110*DegToRad);// 10
0094   phiValues.push_back(120*DegToRad);// 11
0095   phiValues.push_back(130*DegToRad);// 12
0096   phiValues.push_back(140*DegToRad);// 13
0097   phiValues.push_back(150*DegToRad);// 14
0098   //need one less phiValue than radial segments
0099   //phiValues.push_back(160*DegToRad);// 15
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 }