Go to the documentation of this file.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/DDExpandedView.h>
00012 #include "DetectorDescription/Core/interface/DDName.h"
00013 #include "DetectorDescription/Core/interface/DDSolid.h"
00014 #include "DetectorDescription/Core/interface/DDMaterial.h"
00015
00016 #include <Geometry/Records/interface/IdealGeometryRecord.h>
00017
00018 #include <iostream>
00019 #include <istream>
00020 #include <fstream>
00021 #include <string>
00022 #include <vector>
00023 #include <algorithm>
00024 #include <utility>
00025
00026 class PhysicalPartsTree : public edm::EDAnalyzer {
00027
00028 public:
00029
00030 explicit PhysicalPartsTree( const edm::ParameterSet& );
00031 ~PhysicalPartsTree();
00032
00033 virtual void analyze( const edm::Event&, const edm::EventSetup& );
00034 virtual void beginRun( const edm::Run&, const edm::EventSetup& );
00035
00036 private:
00037
00038
00039 };
00040
00041 PhysicalPartsTree::PhysicalPartsTree( const edm::ParameterSet& iConfig )
00042 {
00043
00044 }
00045
00046
00047 PhysicalPartsTree::~PhysicalPartsTree()
00048 {
00049 }
00050
00051 void PhysicalPartsTree::analyze( const edm::Event& iEvent, const edm::EventSetup& iSetup ) {
00052 std::cout << "analyze does nothing" << std::endl;
00053 }
00054
00055 void PhysicalPartsTree::beginRun( const edm::Run&, const edm::EventSetup& iSetup ) {
00056
00057 double tolerance = 1.0e-3;
00058
00059 std::string physicalPartsTreeFileName("PHYSICALPARTSTREE.dat");
00060 std::string logicalPartTypesFileName("LOGICALPARTTYPES.dat");
00061 std::string nominalPlacementsFileName("NOMINALPLACEMENTS.dat");
00062 std::string detectorPartsFileName("DETECTORPARTS.dat");
00063 std::string pospartsGraphFileName("POSPARTSGRAPH.dat");
00064
00065 std::ofstream physicalPartsTreeOS(physicalPartsTreeFileName.c_str());
00066 std::ofstream logicalPartTypesOS(logicalPartTypesFileName.c_str());
00067 std::ofstream nominalPlacementsOS(nominalPlacementsFileName.c_str());
00068 std::ofstream detectorPartsOS(detectorPartsFileName.c_str());
00069 std::ofstream pospartsGraphOS(pospartsGraphFileName.c_str());
00070
00071
00072 std::string slpname;
00073 std::string scategory;
00074 std::vector<std::string> lpname_vec;
00075
00076
00077 std::cout << "PhysicalPartsTree Analyzer..." << std::endl;
00078 edm::ESTransientHandle<DDCompactView> pDD;
00079
00080 iSetup.get<IdealGeometryRecord>().get( "", pDD );
00081
00082 const DDCompactView & cpv = *pDD;
00083 DDExpandedView epv(cpv);
00084 int pospartid=0;
00085 size_t lastfound;
00086 std::string lgname;
00087 while(epv.next()){
00088
00089
00090 std::ostringstream parent, child,logicalpartid,parentid;
00091 child << epv.logicalPart().name();
00092 const DDGeoHistory & hist = epv.geoHistory();
00093 parent << hist[hist.size()-2].logicalPart().name();
00094 logicalpartid << epv.geoHistory();
00095 parentid<<hist[hist.size()-2];
00096 lgname=logicalpartid.str();
00097 lastfound=lgname.find_last_of("/\\");
00098 lgname=lgname.substr(lastfound+1,lgname.size());
00099 physicalPartsTreeOS<<lgname<<","<< parentid.str() << "," << child.str()<<std::endl;
00100
00101
00102
00103 bool reflection = false;
00104
00105 DD3Vector x, y, z;
00106 epv.rotation().GetComponents(x, y, z);
00107
00108
00109
00110
00111
00112
00113 if ( (1.0 + (x.Cross(y)).Dot(z)) <= tolerance ) {
00114 reflection = true;
00115 }
00116 std::vector<double> comps(9);
00117 epv.rotation().GetComponents(comps.begin(), comps.end());
00118 nominalPlacementsOS<< logicalpartid.str()<<","
00119 << epv.translation().X() << ","
00120 << epv.translation().Y() << ","
00121 << epv.translation().Z()<< ","
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131 << comps[0]<<","
00132 << comps[1]<<","
00133 << comps[2]<<","
00134 << comps[3]<<","
00135 << comps[4]<<","
00136 << comps[5]<<","
00137 << comps[6]<<","
00138 << comps[7]<<","
00139 << comps[8]<<","
00140 << (int)reflection
00141 <<std::endl;
00142
00143
00144
00145 detectorPartsOS <<epv.logicalPart().solid().toString() << ","
00146 <<epv.logicalPart().material().toString() << ","
00147 <<logicalpartid.str()
00148 <<std::endl;
00149
00150
00151
00152 pospartsGraphOS<<++pospartid<< ","<<epv.copyno()<< ","
00153 <<parent.str() << "," << child.str()<<std::endl;
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 slpname=epv.logicalPart().toString();
00164
00165 std::vector<std::string>::iterator it = find(lpname_vec.begin(), lpname_vec.end(), slpname);
00166
00167 if (it==lpname_vec.end()){
00168 if(DDEnums::categoryName(epv.logicalPart().category())){
00169 std::ostringstream category;
00170 category<<DDEnums::categoryName(epv.logicalPart().category());
00171 scategory=category.str();
00172 std::string unspec="unspecified";
00173 if(scategory==unspec){
00174 lpname_vec.push_back(slpname);
00175 logicalPartTypesOS <<slpname<< ","
00176 <<"DETECTORPARTS"<<std::endl;
00177 }
00178 else{
00179 lpname_vec.push_back(slpname);
00180 logicalPartTypesOS <<slpname<< ","<<scategory<<std::endl;
00181
00182 }
00183 }
00184 else{
00185 lpname_vec.push_back(slpname);
00186 logicalPartTypesOS <<slpname<< ","
00187 <<"DETECTORPARTS"<<std::endl;
00188
00189 }
00190 }
00191
00192
00193
00194 }
00195
00196
00197 physicalPartsTreeOS.close();
00198 logicalPartTypesOS.close();
00199 nominalPlacementsOS.close();
00200 detectorPartsOS.close();
00201 pospartsGraphOS.close();
00202 }
00203
00204
00205 DEFINE_FWK_MODULE(PhysicalPartsTree);