CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/Geometry/DTGeometryBuilder/src/DTGeometryBuilderFromCondDB.cc

Go to the documentation of this file.
00001 /******* \class DTGeometryBuilderFromCondDB *******
00002  *
00003  * Description:
00004  *  
00005  *  detailed description
00006  *
00007  * \author : Stefano Lacaprara - INFN LNL <stefano.lacaprara@pd.infn.it>
00008  * $date   : 19/11/2008 19:15:14 CET $
00009  *
00010  * Modification:
00011  *
00012  *********************************/
00013 
00014 /* This Class Header */
00015 #include "Geometry/DTGeometryBuilder/src/DTGeometryBuilderFromCondDB.h"
00016 
00017 /* Collaborating Class Header */
00018 #include <CondFormats/GeometryObjects/interface/RecoIdealGeometry.h>
00019 #include <Geometry/DTGeometry/interface/DTGeometry.h>
00020 #include <DataFormats/MuonDetId/interface/DTChamberId.h>
00021 #include <DataFormats/MuonDetId/interface/DTSuperLayerId.h>
00022 #include <DataFormats/MuonDetId/interface/DTLayerId.h>
00023 #include "DataFormats/GeometrySurface/interface/RectangularPlaneBounds.h"
00024 #include "CLHEP/Units/GlobalSystemOfUnits.h"
00025 
00026 /* C++ Headers */
00027 #include <iostream>
00028 using namespace std;
00029 
00030 /* ====================================================================== */
00031 
00032 /* Constructor */ 
00033 DTGeometryBuilderFromCondDB::DTGeometryBuilderFromCondDB() {
00034 }
00035 
00036 /* Destructor */ 
00037 DTGeometryBuilderFromCondDB::~DTGeometryBuilderFromCondDB() {
00038 }
00039 
00040 /* Operations */ 
00041 void
00042 DTGeometryBuilderFromCondDB::build(boost::shared_ptr<DTGeometry> theGeometry,
00043                                    const RecoIdealGeometry& rig) {
00044   //  cout << "DTGeometryBuilderFromCondDB " << endl;
00045   const std::vector<DetId>& detids(rig.detIds());
00046   //  cout << "size " << detids.size() << endl;
00047 
00048   size_t idt = 0;
00049   DTChamber* chamber(0);
00050   DTSuperLayer* sl(0);
00051   while(idt < detids.size()) {
00052     //copy(par.begin(), par.end(), ostream_iterator<double>(std::cout," "));
00053     if (int(*(rig.shapeStart(idt)))==0){ // a Chamber
00054       // add the provious chamber which by now has been updated with SL and
00055       // layers
00056       if (chamber) theGeometry->add(chamber);
00057       // go for the actual one
00058       DTChamberId chid(detids[idt]);
00059       //cout << "CH: " <<  chid << endl;
00060       chamber = buildChamber(chid, rig, idt); 
00061     }
00062     else if (int(*(rig.shapeStart(idt)))==1){ // a SL
00063       DTSuperLayerId slid(detids[idt]);
00064       //cout << "  SL: " <<  slid << endl;
00065       sl = buildSuperLayer(chamber, slid, rig, idt);
00066       theGeometry->add(sl);
00067     }
00068     else if (int(*(rig.shapeStart(idt)))==2){ // a Layer
00069       DTLayerId lid(detids[idt]);
00070       //cout << "    LAY: " <<  lid << endl;
00071       DTLayer* lay = buildLayer(sl, lid, rig, idt);
00072       theGeometry->add(lay);
00073     } else {
00074       cout << "What is this?" << endl;
00075     }
00076     ++idt;
00077   }
00078   if (chamber) theGeometry->add(chamber); // add the last chamber
00079 }
00080 
00081 DTChamber* DTGeometryBuilderFromCondDB::buildChamber(const DetId& id,
00082                                                      const RecoIdealGeometry& rig,
00083                                                      size_t idt ) const {
00084   DTChamberId detId(id);  
00085 
00086 
00087   float width = (*(rig.shapeStart(idt) + 1))/cm;     // r-phi  dimension - different in different chambers
00088   float length = (*(rig.shapeStart(idt) + 2))/cm;    // z      dimension - constant 125.55 cm
00089   float thickness = (*(rig.shapeStart(idt) + 3))/cm; // radial thickness - almost constant about 18 cm
00090 
00092   // width is along local X
00093   // length is along local Y
00094   // thickness is long local Z
00095   RCPPlane surf(plane(rig.tranStart(idt), rig.rotStart(idt), new RectangularPlaneBounds(width, length, thickness) ));
00096 
00097   DTChamber* chamber = new DTChamber(detId, surf);
00098 
00099   return chamber;
00100 }
00101 
00102 DTSuperLayer*
00103 DTGeometryBuilderFromCondDB::buildSuperLayer(DTChamber* chamber,
00104                                              const DetId& id,
00105                                              const RecoIdealGeometry& rig,
00106                                              size_t idt) const {
00107 
00108   DTSuperLayerId slId(id);
00109 
00110   float width = (*(rig.shapeStart(idt) + 1))/cm;     // r-phi  dimension - different in different chambers
00111   float length = (*(rig.shapeStart(idt) + 2))/cm;    // z      dimension - constant 126.8 cm
00112   float thickness = (*(rig.shapeStart(idt) + 3))/cm; // radial thickness - almost constant about 5 cm
00113 
00114   // Ok this is the slayer position...
00115   RCPPlane surf(plane(rig.tranStart(idt), rig.rotStart(idt), new RectangularPlaneBounds(width, length, thickness) ));
00116 
00117   DTSuperLayer* slayer = new DTSuperLayer(slId, surf, chamber);
00118 
00119   // cout << "adding slayer " << slayer->id() << " to chamber "<<  chamber->id() << endl;
00120   chamber->add(slayer);
00121   return slayer;
00122 }
00123 
00124 DTLayer*
00125 DTGeometryBuilderFromCondDB::buildLayer(DTSuperLayer* sl,
00126                                         const DetId& id,
00127                                         const RecoIdealGeometry& rig,
00128                                         size_t idt) const {
00129 
00130   DTLayerId layId(id);
00131 
00132   // Layer specific parameter (size)
00133   float width = (*(rig.shapeStart(idt) + 1))/cm;     // r-phi  dimension - changes in different chambers
00134   float length = (*(rig.shapeStart(idt) + 2))/cm;    // z      dimension - constant 126.8 cm
00135   float thickness = (*(rig.shapeStart(idt) + 3))/cm; // radial thickness - almost constant about 20 cm
00136 
00137 
00138   RCPPlane surf(plane(rig.tranStart(idt), rig.rotStart(idt), new RectangularPlaneBounds(width, length, thickness) ));
00139 
00140   // Loop on wires
00141   int firstWire=int(*(rig.shapeStart(idt) + 4 ));//par[4]);
00142   int WCounter=int(*(rig.shapeStart(idt) + 5 ));//par[5]);
00143   double sensibleLenght=(*(rig.shapeStart(idt) + 6 ))/cm;//par[6]/cm;
00144   DTTopology topology(firstWire, WCounter, sensibleLenght);
00145 
00146   DTLayerType layerType;
00147 
00148   DTLayer* layer = new DTLayer(layId, surf, topology, layerType, sl);
00149   // cout << "adding layer " << layer->id() << " to sl "<<  sl->id() << endl;
00150 
00151   sl->add(layer);
00152   return layer;
00153 }
00154 
00155 DTGeometryBuilderFromCondDB::RCPPlane 
00156 DTGeometryBuilderFromCondDB::plane(const vector<double>::const_iterator tranStart,
00157                                    const vector<double>::const_iterator rotStart,
00158                                    Bounds * bounds) const {
00159   // extract the position
00160   const Surface::PositionType posResult(*(tranStart), *(tranStart+1), *(tranStart+2));
00161   // now the rotation
00162   Surface::RotationType rotResult( *(rotStart+0), *(rotStart+1), *(rotStart+2), 
00163                                    *(rotStart+3), *(rotStart+4), *(rotStart+5),
00164                                    *(rotStart+6), *(rotStart+7), *(rotStart+8) );
00165 
00166   return RCPPlane( new Plane( posResult, rotResult, bounds));
00167 }