00001 #include <memory>
00002
00003 #include <FWCore/Framework/interface/EDAnalyzer.h>
00004 #include <FWCore/Framework/interface/EventSetup.h>
00005 #include "FWCore/Framework/interface/ESTransientHandle.h"
00006 #include <FWCore/Framework/interface/ESHandle.h>
00007 #include <FWCore/Framework/interface/MakerMacros.h>
00008
00009 #include <DetectorDescription/Core/interface/DDCompactView.h>
00010 #include <DetectorDescription/Core/interface/DDValue.h>
00011 #include "DetectorDescription/Core/interface/DDName.h"
00012 #include "DetectorDescription/Core/interface/DDSolid.h"
00013
00014 #include <Geometry/Records/interface/IdealGeometryRecord.h>
00015
00016 #include <iostream>
00017 #include <istream>
00018 #include <fstream>
00019 #include <string>
00020
00021
00022 class SolidsForOnline : public edm::EDAnalyzer {
00023
00024 public:
00025
00026 explicit SolidsForOnline( const edm::ParameterSet& );
00027 ~SolidsForOnline();
00028
00029 virtual void analyze( const edm::Event&, const edm::EventSetup& );
00030 virtual void beginRun( const edm::Run&, const edm::EventSetup& );
00031
00032 private:
00033
00034 std::string filename_;
00035 };
00036
00037 SolidsForOnline::SolidsForOnline( const edm::ParameterSet& iConfig ) { }
00038
00039
00040 SolidsForOnline::~SolidsForOnline() { }
00041
00042 void SolidsForOnline::analyze( const edm::Event& iEvent, const edm::EventSetup& iSetup ) {
00043 std::cout << "analyze does nothing" << std::endl;
00044 }
00045
00046 void SolidsForOnline::beginRun( const edm::Run&, const edm::EventSetup& iSetup ) {
00047
00048
00049
00050 std::string solidsFileName("SOLIDS.dat");
00051 std::string boxFileName("BOXES.dat");
00052
00053 std::string tubesFileName("TUBES.dat");
00054 std::string polyHedraFileName("POLYHEDRAS.dat");
00055 std::string polyConeFileName("POLYCONES.dat");
00056 std::string conesFileName("CONES.dat");
00057 std::string pseudoTrapFileName("PSEUDOTRAPEZOIDS.dat");
00058 std::string trapFileName("TRAPEZOIDS.dat");
00059 std::string boolSolidsFileName("BOOLEANSOLIDS.dat");
00060 std::string reflectionSolidsFileName("REFLECTIONSOLIDS.dat");
00061 std::string torusFileName("TORUS.dat");
00062
00063 std::ofstream solidsOS(solidsFileName.c_str());
00064 std::ofstream boxOS(boxFileName.c_str());
00065 std::ofstream tubeOS(tubesFileName.c_str());
00066 std::ofstream polyHOS(polyHedraFileName.c_str());
00067 std::ofstream polyCOS(polyConeFileName.c_str());
00068 std::ofstream coneOS(conesFileName.c_str());
00069 std::ofstream ptrapOS(pseudoTrapFileName.c_str());
00070 std::ofstream trapOS(trapFileName.c_str());
00071 std::ofstream boolOS(boolSolidsFileName.c_str());
00072 std::ofstream reflectionOS(reflectionSolidsFileName.c_str());
00073 std::ofstream torusOS(torusFileName.c_str());
00074
00075 std::cout << "SolidsForOnline Analyzer..." << std::endl;
00076
00077 edm::ESTransientHandle<DDCompactView> pDD;
00078
00079 iSetup.get<IdealGeometryRecord>().get( "", pDD );
00080
00081 const DDCompactView & cpv = *pDD;
00082 DDCompactView::graph_type gra = cpv.graph();
00083
00084 DDSolid::iterator<DDSolid> sit(DDSolid::begin()), sed(DDSolid::end());
00085 for (; sit != sed; ++sit) {
00086 if (! sit->isDefined().second) continue;
00087 const DDSolid& solid = *sit;
00089 solidsOS<<solid.name()<<","<<DDSolidShapesName::name(solid.shape())
00090 << std::endl;
00091
00092
00093 switch (solid.shape())
00094 {
00095 case ddunion:
00096 {
00097
00098 DDBooleanSolid boolSolid(solid);
00099 boolOS << boolSolid.name() << "," ;
00100 boolOS << "U";
00101 boolOS << "," << boolSolid.translation().x()
00102 << "," << boolSolid.translation().y()
00103 << "," << boolSolid.translation().z()
00104 << "," << boolSolid.solidA().name()
00105 << "," << boolSolid.solidB().name()
00106 << "," << boolSolid.rotation().name()
00107 << std::endl;
00108
00109 break;
00110 }
00111 case ddsubtraction:
00112 {
00113 DDBooleanSolid boolSolid(solid);
00114 boolOS << boolSolid.name() << "," ;
00115 boolOS << "S";
00116 boolOS << "," << boolSolid.translation().x()
00117 << "," << boolSolid.translation().y()
00118 << "," << boolSolid.translation().z()
00119 << "," << boolSolid.solidA().name()
00120 << "," << boolSolid.solidB().name()
00121 << "," << boolSolid.rotation().name()
00122 << std::endl;
00123 break;
00124 }
00125 case ddintersection:
00126 {
00127
00128
00129 DDBooleanSolid boolSolid(solid);
00130
00131
00132
00133
00134
00135
00136 boolOS << boolSolid.name() << "," ;
00137 boolOS << "I";
00138 boolOS << "," << boolSolid.translation().x()
00139 << "," << boolSolid.translation().y()
00140 << "," << boolSolid.translation().z()
00141 << "," << boolSolid.solidA().name()
00142 << "," << boolSolid.solidB().name()
00143 << "," << boolSolid.rotation().name()
00144 << std::endl;
00145
00146 break;
00147
00148 }
00149 case ddreflected:
00150 {
00151 DDReflectionSolid reflection(solid);
00152 reflectionOS<<reflection.name()<<","
00153 <<reflection.unreflected().name()
00154 <<std::endl;
00155 break;
00156 }
00157 case ddbox:
00158 {
00159 DDBox box(solid);
00160
00161 boxOS<<box.name()<<",";
00162 boxOS<<2.0*box.halfX()<<","<<2.0*box.halfY()<<","<<2.0*box.halfZ()<<std::endl;
00163 break;
00164 }
00165
00166 case ddpseudotrap:
00167 {
00168 DDPseudoTrap pseudoTrap(solid);
00169
00170 ptrapOS<<pseudoTrap.name() <<",";
00171 ptrapOS<<pseudoTrap.x1() <<","<<pseudoTrap.x2() <<","
00172 <<pseudoTrap.halfZ()*2. <<","<<pseudoTrap.y1() <<","
00173 <<pseudoTrap.y2() <<","<<pseudoTrap.radius()<<","
00174 <<pseudoTrap.atMinusZ()
00175 << std::endl;
00176
00177 break;
00178 }
00179
00180 case ddtubs:
00181 {
00182
00183
00184
00185
00186 DDTubs tubs(solid);
00187 tubeOS<<tubs.name()<<","<<tubs.rIn()<<","
00188 <<tubs.rOut()<<","<<tubs.zhalf()*2.0<<","
00189 <<tubs.startPhi()<<","<<tubs.deltaPhi()<<","
00190 <<"0"<<","<<"0"<<","
00191 <<"0"
00192 <<std::endl;
00193
00194 break;
00195 }
00196 case ddtrap:
00197 {
00198 DDTrap trap(solid);
00199 trapOS<<trap.name()<<",";
00200 trapOS<<trap.alpha1()<<","<<trap.alpha2()<<","
00201 <<trap.x1()<<","<<trap.x2()<<","
00202 <<trap.halfZ()*2.0<<","<<trap.y1()<<","
00203 <<trap.y2()<<","
00204 <<trap.phi()<<","<<trap.theta()<<","
00205 <<trap.x3()<<","<<trap.x4()
00206 <<std::endl;
00207 break;
00208 }
00209 case ddcons:
00210 {
00211 DDCons cons(solid);
00212 coneOS<<cons.name()<<","<<cons.zhalf()*2.0<<","
00213 <<cons.rInMinusZ()<<","
00214 <<cons.rOutMinusZ()<<","<<cons.rInPlusZ()<<","
00215 <<cons.rOutPlusZ()<<","<<cons.phiFrom()<<","
00216 <<cons.deltaPhi()
00217 <<std::endl;
00218
00219 break;
00220 }
00221
00222 case ddpolycone_rz:
00223 {
00224
00225 DDPolycone polyCone(solid);
00226 polyCOS<<polyCone.name()<<","<<polyCone.startPhi()
00227 <<","<<polyCone.deltaPhi()<<","<<"RZ"
00228 <<std::endl;
00229 break;
00230 }
00231 case ddpolyhedra_rz:
00232 {
00233 DDPolyhedra polyHedra(solid);
00234 polyHOS<<polyHedra.name()<<",";
00235 polyHOS<<polyHedra.sides()<<","<<polyHedra.startPhi()
00236 <<","<<polyHedra.deltaPhi()<<","<<"RZ"
00237 <<std::endl;
00238 break;
00239 }
00240 case ddpolycone_rrz:{
00241
00242 DDPolycone polyCone(solid);
00243 polyCOS<<polyCone.name()<<","<<polyCone.startPhi()
00244 <<","<<polyCone.deltaPhi()<<","<<"ZS"
00245 <<std::endl;
00246 break;
00247 }
00248 case ddpolyhedra_rrz:
00249 {
00250
00251 DDPolyhedra polyHedra(solid);
00252 polyHOS<<polyHedra.name()<<",";
00253 polyHOS<<polyHedra.sides()<<","<<polyHedra.startPhi()
00254 <<","<<polyHedra.deltaPhi()<<","<<"ZS"
00255 <<std::endl;
00256 break;
00257 }
00258
00259 case ddtrunctubs:{
00260
00261 DDTruncTubs tubs(solid);
00262 tubeOS<<tubs.name()<<","<<tubs.rIn()<<","
00263 <<tubs.rOut()<<","<<tubs.zHalf()*2.0<<","
00264 <<tubs.startPhi()<<","<<tubs.deltaPhi()<<","
00265 <<tubs.cutAtStart()<<","<<tubs.cutAtDelta()<<","
00266 <<tubs.cutInside()
00267 <<std::endl;
00268 break;
00269 }
00270
00271 case ddtorus: {
00272 DDTorus torus(solid);
00273 torusOS<<torus.name()<<","<<torus.rMin()<<","
00274 <<torus.rMax()<<","<<torus.rTorus()<<","
00275 <<torus.startPhi()<<","<<torus.deltaPhi()
00276 <<std::endl;
00277 break;
00278 }
00279
00280 case ddshapeless:{
00281
00282
00283
00284
00285
00286
00287 break;
00288 }
00289 case dd_not_init:
00290 default:
00291 throw DDException("DDDToPersFactory::solid(...) either not inited or no such solid.");
00292 break;
00293 }
00294
00295
00296 }
00297 solidsOS.close();
00298 boxOS.close();
00299
00300 tubeOS.close();
00301 polyHOS.close();
00302 polyCOS.close();
00303 coneOS.close();
00304 ptrapOS.close();
00305 trapOS.close();
00306 boolOS.close();
00307 reflectionOS.close();
00308 }
00309
00310
00311 DEFINE_FWK_MODULE(SolidsForOnline);