00001
00002
00003
00004
00005
00006
00007 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeomBuilderFromGeometricDet.h"
00008 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00009 #include "Geometry/TrackerGeometryBuilder/interface/PlaneBuilderForGluedDet.h"
00010 #include "Geometry/CommonDetUnit/interface/GeomDetUnit.h"
00011 #include "Geometry/TrackerGeometryBuilder/interface/GluedGeomDet.h"
00012 #include "Geometry/CommonDetUnit/interface/GeomDetType.h"
00013 #include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetType.h"
00014 #include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h"
00015 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetType.h"
00016 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
00017 #include "DataFormats/DetId/interface/DetId.h"
00018 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
00019 #include "DataFormats/GeometrySurface/interface/MediumProperties.h"
00020
00021
00022 #include <cfloat>
00023 #include <cassert>
00024 using std::vector;
00025 using std::string;
00026
00027 namespace {
00028 void verifyDUinTG(TrackerGeometry const & tg) {
00029 int off=0; int end=0;
00030 for ( int i=1; i!=7; i++) {
00031 auto det = GeomDetEnumerators::tkDetEnum[i];
00032 off = tg.offsetDU(det);
00033 end = tg.endsetDU(det); assert(end>off);
00034 for (int j=off; j!=end; ++j) {
00035 assert(tg.detUnits()[j]->geographicalId().subdetId()==i);
00036 assert(tg.detUnits()[j]->subDetector()==det);
00037 assert(tg.detUnits()[j]->index()==j);
00038 }
00039 }
00040 }
00041 }
00042
00043 TrackerGeometry* TrackerGeomBuilderFromGeometricDet::build( const GeometricDet* gd){
00044
00045 thePixelDetTypeMap.clear();
00046 theStripDetTypeMap.clear();
00047
00048 TrackerGeometry* tracker = new TrackerGeometry(gd);
00049 std::vector<const GeometricDet*> comp;
00050 gd->deepComponents(comp);
00051
00052 std::vector<const GeometricDet*> dets[6];
00053 std::vector<const GeometricDet*> & pixB = dets[0]; pixB.reserve(comp.size());
00054 std::vector<const GeometricDet*> & pixF = dets[1]; pixF.reserve(comp.size());
00055 std::vector<const GeometricDet*> & tib = dets[2]; tib.reserve(comp.size());
00056 std::vector<const GeometricDet*> & tid = dets[3]; tid.reserve(comp.size());
00057 std::vector<const GeometricDet*> & tob = dets[4]; tob.reserve(comp.size());
00058 std::vector<const GeometricDet*> & tec = dets[5]; tec.reserve(comp.size());
00059
00060 for(u_int32_t i = 0;i<comp.size();i++)
00061 dets[comp[i]->geographicalID().subdetId()-1].push_back(comp[i]);
00062
00063
00064 buildPixel(pixB,tracker,theDetIdToEnum.type(1), "barrel");
00065 buildPixel(pixF,tracker,theDetIdToEnum.type(2), "endcap");
00066 buildSilicon(tib,tracker,theDetIdToEnum.type(3), "barrel");
00067 buildSilicon(tid,tracker,theDetIdToEnum.type(4), "endcap");
00068 buildSilicon(tob,tracker,theDetIdToEnum.type(5), "barrel");
00069 buildSilicon(tec,tracker,theDetIdToEnum.type(6), "endcap");
00070 buildGeomDet(tracker);
00071
00072 verifyDUinTG(*tracker);
00073
00074 return tracker;
00075 }
00076
00077 void TrackerGeomBuilderFromGeometricDet::buildPixel(std::vector<const GeometricDet*> const & gdv,
00078 TrackerGeometry* tracker,
00079 GeomDetType::SubDetector det,
00080 const std::string& part){
00081 tracker->setOffsetDU(det);
00082
00083 for(u_int32_t i=0; i<gdv.size(); i++){
00084
00085 std::string const & detName = gdv[i]->name().fullname();
00086 if (thePixelDetTypeMap.find(detName) == thePixelDetTypeMap.end()) {
00087 std::auto_ptr<const Bounds> bounds(gdv[i]->bounds());
00088 PixelTopology* t =
00089 theTopologyBuilder->buildPixel(&*bounds,
00090 gdv[i]->pixROCRows(),
00091 gdv[i]->pixROCCols(),
00092 gdv[i]->pixROCx(),
00093 gdv[i]->pixROCy(),
00094 part);
00095
00096 thePixelDetTypeMap[detName] = new PixelGeomDetType(t,detName,det);
00097 tracker->addType(thePixelDetTypeMap[detName]);
00098 }
00099
00100 PlaneBuilderFromGeometricDet::ResultType plane = buildPlaneWithMaterial(gdv[i]);
00101 GeomDetUnit* temp = new PixelGeomDetUnit(&(*plane),thePixelDetTypeMap[detName],gdv[i]);
00102
00103 tracker->addDetUnit(temp);
00104 tracker->addDetUnitId(gdv[i]->geographicalID());
00105 }
00106 tracker->setEndsetDU(det);
00107
00108 }
00109
00110 void TrackerGeomBuilderFromGeometricDet::buildSilicon(std::vector<const GeometricDet*> const & gdv,
00111 TrackerGeometry* tracker,
00112 GeomDetType::SubDetector det,
00113 const std::string& part)
00114 {
00115 tracker->setOffsetDU(det);
00116
00117 for(u_int32_t i=0;i<gdv.size();i++){
00118
00119 std::string const & detName = gdv[i]->name().fullname();
00120 if (theStripDetTypeMap.find(detName) == theStripDetTypeMap.end()) {
00121 std::auto_ptr<const Bounds> bounds(gdv[i]->bounds());
00122 StripTopology* t =
00123 theTopologyBuilder->buildStrip(&*bounds,
00124 gdv[i]->siliconAPVNum(),
00125 part);
00126 theStripDetTypeMap[detName] = new StripGeomDetType( t,detName,det,
00127 gdv[i]->stereo());
00128 tracker->addType(theStripDetTypeMap[detName]);
00129 }
00130
00131 StripSubdetector sidet( gdv[i]->geographicalID());
00132 double scale = (sidet.partnerDetId()) ? 0.5 : 1.0 ;
00133
00134 PlaneBuilderFromGeometricDet::ResultType plane = buildPlaneWithMaterial(gdv[i],scale);
00135 GeomDetUnit* temp = new StripGeomDetUnit(&(*plane), theStripDetTypeMap[detName],gdv[i]);
00136
00137 tracker->addDetUnit(temp);
00138 tracker->addDetUnitId(gdv[i]->geographicalID());
00139 }
00140 tracker->setEndsetDU(det);
00141
00142 }
00143
00144
00145 void TrackerGeomBuilderFromGeometricDet::buildGeomDet(TrackerGeometry* tracker){
00146 PlaneBuilderForGluedDet gluedplaneBuilder;
00147 std::vector<GeomDetUnit*> const & gdu= tracker->detUnits();
00148 std::vector<DetId> const & gduId = tracker->detUnitIds();
00149
00150 for(u_int32_t i=0;i<gdu.size();i++){
00151 StripSubdetector sidet( gduId[i].rawId());
00152 tracker->addDet((GeomDet*) gdu[i]);
00153 tracker->addDetId(gduId[i]);
00154 if(sidet.glued()!=0&&sidet.stereo()==1){
00155 int partner_pos=-1;
00156 for(u_int32_t jj=0;jj<gduId.size();jj++){
00157 if(sidet.partnerDetId()== gduId[jj]) {
00158 partner_pos=jj;
00159 break;
00160 }
00161 }
00162 const GeomDetUnit* dus = gdu[i];
00163 if(partner_pos==-1){
00164 throw cms::Exception("Configuration") <<"No partner detector found \n"
00165 <<"There is a problem on Tracker geometry configuration\n";
00166 }
00167 const GeomDetUnit* dum = gdu[partner_pos];
00168 std::vector<const GeomDetUnit *> glued(2);
00169 glued[0]=dum;
00170 glued[1]=dus;
00171 PlaneBuilderForGluedDet::ResultType plane = gluedplaneBuilder.plane(glued);
00172 GluedGeomDet* gluedDet = new GluedGeomDet(&(*plane),dum,dus);
00173 tracker->addDet((GeomDet*) gluedDet);
00174 tracker->addDetId(DetId(sidet.glued()));
00175 }
00176 }
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 PlaneBuilderFromGeometricDet::ResultType
00230 TrackerGeomBuilderFromGeometricDet::buildPlaneWithMaterial(const GeometricDet* gd,
00231 double scale) const
00232 {
00233 PlaneBuilderFromGeometricDet planeBuilder;
00234 PlaneBuilderFromGeometricDet::ResultType plane = planeBuilder.plane(gd);
00235
00236
00237
00238 plane->setMediumProperties(MediumProperties(gd->radLength()*scale,gd->xi()*scale));
00239
00240 return plane;
00241 }