00001 #include "Geometry/TrackerNumberingBuilder/interface/GeometricDet.h"
00002 #include "Geometry/TrackerNumberingBuilder/interface/TrackerShapeToBounds.h"
00003 #include "DetectorDescription/Core/interface/DDFilteredView.h"
00004 #include "DetectorDescription/Core/interface/DDSolid.h"
00005 #include "DetectorDescription/Core/interface/DDMaterial.h"
00006 #include "DetectorDescription/Core/interface/DDExpandedNode.h"
00007 #include "CondFormats/GeometryObjects/interface/PGeometricDet.h"
00008
00009 #include "CLHEP/Units/GlobalSystemOfUnits.h"
00010
00011 #include <boost/bind.hpp>
00012
00013 #include <cfloat>
00014 #include <vector>
00015 #include <string>
00016
00017 namespace {
00018
00019 std::string strue("true");
00020
00021 template<typename DDView>
00022 double getDouble(const char * s, DDView const & ev) {
00023 DDValue val(s);
00024 std::vector<const DDsvalues_type *> result;
00025 ev.specificsV(result);
00026 std::vector<const DDsvalues_type *>::iterator it = result.begin();
00027 bool foundIt = false;
00028 for (; it != result.end(); ++it)
00029 {
00030 foundIt = DDfetch(*it,val);
00031 if (foundIt) break;
00032 }
00033 if (foundIt)
00034 {
00035 const std::vector<std::string> & temp = val.strings();
00036 if (temp.size() != 1)
00037 {
00038 throw cms::Exception("Configuration") << "I need 1 "<< s << " tags";
00039 }
00040 return double(::atof(temp[0].c_str()));
00041 }
00042 return 0;
00043 }
00044
00045 template<typename DDView>
00046 std::string getString(const char * s, DDView const & ev) {
00047 DDValue val(s);
00048 std::vector<const DDsvalues_type *> result;
00049 ev.specificsV(result);
00050 std::vector<const DDsvalues_type *>::iterator it = result.begin();
00051 bool foundIt = false;
00052 for (; it != result.end(); ++it)
00053 {
00054 foundIt = DDfetch(*it,val);
00055 if (foundIt) break;
00056
00057 }
00058 if (foundIt)
00059 {
00060 const std::vector<std::string> & temp = val.strings();
00061 if (temp.size() != 1)
00062 {
00063 throw cms::Exception("Configuration") << "I need 1 "<< s << " tags";
00064 }
00065 return temp[0];
00066 }
00067 return "NotFound";
00068 }
00069 }
00070
00071
00076 GeometricDet::~GeometricDet(){
00077
00078 deleteComponents();
00079 }
00080 #ifdef GEOMETRICDETDEBUG
00081
00082 GeometricDet::GeometricDet(DDnav_type const & navtype, GeometricEnumType type) :
00083 _ddd(navtype.begin(),navtype.end()), _type(type){
00084
00085
00086
00087
00088 _fromDD = true;
00089 DDCompactView cpv;
00090 DDExpandedView ev(cpv);
00091 ev.goTo(navtype);
00092 _params = ((ev.logicalPart()).solid()).parameters();
00093 _trans = ev.translation();
00094 _phi = _trans.Phi();
00095 _rho = _trans.Rho();
00096 _rot = ev.rotation();
00097 _shape = ((ev.logicalPart()).solid()).shape();
00098 _ddname = ((ev.logicalPart()).ddname()).name();
00099 _parents = GeoHistory(ev.geoHistory().begin(),ev.geoHistory().end()) ;
00100 _volume = ((ev.logicalPart()).solid()).volume();
00101 _density = ((ev.logicalPart()).material()).density();
00102
00103 _weight = _density * ( _volume / 1000.);
00104 _copy = ev.copyno();
00105 _material = ((ev.logicalPart()).material()).name().fullname();
00106 _radLength = getDouble("TrackerRadLength",ev);
00107 _xi = getDouble("TrackerXi",ev);
00108 _pixROCRows = getDouble("PixelROCRows",ev);
00109 _pixROCCols = getDouble("PixelROCCols",ev);
00110 _pixROCx = getDouble("PixelROC_X",ev);
00111 _pixROCy = getDouble("PixelROC_Y",ev);
00112 _stereo = getString("TrackerStereoDetectors",ev)==strue;
00113 _siliconAPVNum = getDouble("SiliconAPVNumber",ev);
00114
00115 }
00116
00117 GeometricDet::GeometricDet(DDExpandedView* fv, GeometricEnumType type) : _type(type) {
00118
00119
00120
00121
00122 _fromDD = true;
00123 _ddd = nav_type(fv->navPos().begin(),fv->navPos().end() );
00124 _params = ((fv->logicalPart()).solid()).parameters();
00125 _trans = fv->translation();
00126 _phi = _trans.Phi();
00127 _rho = _trans.Rho();
00128 _rot = fv->rotation();
00129 _shape = ((fv->logicalPart()).solid()).shape();
00130 _ddname = ((fv->logicalPart()).ddname()).name();
00131 _parents = GeoHistory(fv->geoHistory().begin(),fv->geoHistory().end()) ;
00132 _volume = ((fv->logicalPart()).solid()).volume();
00133 _density = ((fv->logicalPart()).material()).density();
00134
00135 _weight = _density * ( _volume / 1000.);
00136 _copy = fv->copyno();
00137 _material = ((fv->logicalPart()).material()).name().fullname();
00138 _radLength = getDouble("TrackerRadLength",*fv);
00139 _xi = getDouble("TrackerXi",*fv);
00140 _pixROCRows = getDouble("PixelROCRows",*fv);
00141 _pixROCCols = getDouble("PixelROCCols",*fv);
00142 _pixROCx = getDouble("PixelROC_X",*fv);
00143 _pixROCy = getDouble("PixelROC_Y",*fv);
00144 _stereo = getString("TrackerStereoDetectors",*fv)=="true";
00145 _siliconAPVNum = getDouble("SiliconAPVNumber",*fv);
00146
00147 }
00148 #endif
00149
00150 GeometricDet::GeometricDet(DDFilteredView* fv, GeometricEnumType type) :
00151
00152
00153
00154 _trans(fv->translation()),
00155 _phi(_trans.Phi()),
00156 _rho(_trans.Rho()),
00157 _rot(fv->rotation()),
00158 _shape(((fv->logicalPart()).solid()).shape()),
00159 _ddname(((fv->logicalPart()).ddname()).name()),
00160 _type(type),
00161 _params(((fv->logicalPart()).solid()).parameters()),
00162
00163 #ifdef GEOMTRICDETDEBUG
00164 _parents(fv->geoHistory().begin(),fv->geoHistory().end()),
00165 _volume(((fv->logicalPart()).solid()).volume()),
00166 _density(((fv->logicalPart()).material()).density()),
00167
00168 _weight(_density * ( _volume / 1000.)),
00169 _copy(fv->copyno()),
00170 _material(((fv->logicalPart()).material()).name().fullname()),
00171 #endif
00172 _radLength(getDouble("TrackerRadLength",*fv)),
00173 _xi(getDouble("TrackerXi",*fv)),
00174 _pixROCRows(getDouble("PixelROCRows",*fv)),
00175 _pixROCCols(getDouble("PixelROCCols",*fv)),
00176 _pixROCx(getDouble("PixelROC_X",*fv)),
00177 _pixROCy(getDouble("PixelROC_Y",*fv)),
00178 _stereo(getString("TrackerStereoDetectors",*fv)==strue),
00179 _siliconAPVNum(getDouble("SiliconAPVNumber",*fv))
00180 #ifdef GEOMTRICDETDEBUG
00181 ,
00182 _fromDD(true)
00183 #endif
00184 {
00185
00186
00187 const DDFilteredView::nav_type& nt = fv->navPos();
00188 _ddd = nav_type(nt.begin(), nt.end());
00189 }
00190
00191
00192
00193 GeometricDet::GeometricDet ( const PGeometricDet::Item& onePGD, GeometricEnumType type) :
00194 _trans(onePGD._x, onePGD._y, onePGD._z),
00195 _phi(onePGD._phi),
00196 _rho(onePGD._rho),
00197 _rot(onePGD._a11, onePGD._a12, onePGD._a13,
00198 onePGD._a21, onePGD._a22, onePGD._a23,
00199 onePGD._a31, onePGD._a32, onePGD._a33),
00200 _shape(DDSolidShapesName::index(onePGD._shape)),
00201 _ddd(),
00202 _ddname(onePGD._name, onePGD._ns),
00203 _type(type),
00204 _params(),
00205 _geographicalID(onePGD._geographicalID),
00206 #ifdef GEOMTRICDETDEBUG
00207 _parents(),
00208 _volume(onePGD._volume),
00209 _density(onePGD._density),
00210 _weight(onePGD._weight),
00211 _copy(onePGD._copy),
00212 _material(onePGD._material),
00213 #endif
00214 _radLength(onePGD._radLength),
00215 _xi(onePGD._xi),
00216 _pixROCRows(onePGD._pixROCRows),
00217 _pixROCCols(onePGD._pixROCCols),
00218 _pixROCx(onePGD._pixROCx),
00219 _pixROCy(onePGD._pixROCy),
00220 _stereo(onePGD._stereo),
00221 _siliconAPVNum(onePGD._siliconAPVNum)
00222 #ifdef GEOMTRICDETDEBUG
00223 ,
00224 _fromDD(false)
00225 #endif
00226 {
00227
00228
00229 if(onePGD._shape==1||onePGD._shape==3){
00230 _params.reserve(11);
00231 _params.push_back(onePGD._params0);
00232 _params.push_back(onePGD._params1);
00233 _params.push_back(onePGD._params2);
00234 _params.push_back(onePGD._params3);
00235 _params.push_back(onePGD._params4);
00236 _params.push_back(onePGD._params5);
00237 _params.push_back(onePGD._params6);
00238 _params.push_back(onePGD._params7);
00239 _params.push_back(onePGD._params8);
00240 _params.push_back(onePGD._params9);
00241 _params.push_back(onePGD._params10);
00242 }
00243
00244 _ddd.reserve(onePGD._numnt);
00245 _ddd.push_back(onePGD._nt0);
00246 _ddd.push_back(onePGD._nt1);
00247 _ddd.push_back(onePGD._nt2);
00248 _ddd.push_back(onePGD._nt3);
00249 if ( onePGD._numnt > 4 ) {
00250 _ddd.push_back(onePGD._nt4);
00251 if ( onePGD._numnt > 5 ) {
00252 _ddd.push_back(onePGD._nt5);
00253 if ( onePGD._numnt > 6 ) {
00254 _ddd.push_back(onePGD._nt6);
00255 if ( onePGD._numnt > 7 ) {
00256 _ddd.push_back(onePGD._nt7);
00257 if ( onePGD._numnt > 8 ) {
00258 _ddd.push_back(onePGD._nt8);
00259 if ( onePGD._numnt > 9 ) {
00260 _ddd.push_back(onePGD._nt9);
00261 if ( onePGD._numnt > 10 ) {
00262 _ddd.push_back(onePGD._nt10);
00263 }}}}}}
00264 }
00265
00266 }
00267
00268 GeometricDet::ConstGeometricDetContainer GeometricDet::deepComponents() const {
00269
00270
00271
00272
00273 ConstGeometricDetContainer _temp;
00274 deepComponents(_temp);
00275 return _temp;
00276 }
00277
00278 void GeometricDet::deepComponents(GeometricDetContainer & cont) const {
00279
00280 if (isLeaf())
00281 cont.push_back(const_cast<GeometricDet*>(this));
00282 else
00283 std::for_each(_container.begin(),_container.end(),
00284 boost::bind(&GeometricDet::deepComponents,_1,boost::ref(cont))
00285 );
00286 }
00287
00288
00289 void GeometricDet::addComponents(GeometricDetContainer const & cont){
00290
00291 if (_container.empty()) {
00292 _container=cont;
00293 return;
00294 }
00295 _container.reserve(_container.size()+cont.size());
00296 std::copy(cont.begin(), cont.end(), back_inserter(_container));
00297 }
00298
00299
00300 void GeometricDet::addComponent(GeometricDet* det){
00301
00302 _container.push_back(det);
00303 }
00304
00305 namespace {
00306 struct Deleter {
00307 void operator()(GeometricDet const* det) const { delete const_cast<GeometricDet*>(det);}
00308 };
00309 }
00310
00311 void GeometricDet::deleteComponents(){
00312
00313 std::for_each(_container.begin(),_container.end(),Deleter());
00314 _container.clear();
00315 }
00316
00317
00318 GeometricDet::Position GeometricDet::positionBounds() const{
00319
00320 Position _pos(float(_trans.x()/cm),
00321 float(_trans.y()/cm),
00322 float(_trans.z()/cm));
00323 return _pos;
00324 }
00325
00326 GeometricDet::Rotation GeometricDet::rotationBounds() const{
00327
00328 DD3Vector x, y, z;
00329 _rot.GetComponents(x, y, z);
00330 Rotation _rotation(float(x.X()),float(x.Y()),float(x.Z()),
00331 float(y.X()),float(y.Y()),float(y.Z()),
00332 float(z.X()),float(z.Y()),float(z.Z()));
00333 return _rotation;
00334 }
00335
00336 const Bounds * GeometricDet::bounds() const{
00337
00338 const std::vector<double>& par = _params;
00339 Bounds * bounds = 0;
00340 TrackerShapeToBounds shapeToBounds;
00341 bounds = shapeToBounds.buildBounds(_shape,par);
00342 return bounds;
00343 }
00344