Go to the documentation of this file.00001 #include <string>
00002 #include <vector>
00003 #include <iostream>
00004 #include <iomanip>
00005
00006 #include "FWCore/Framework/interface/EDAnalyzer.h"
00007 #include "FWCore/Framework/interface/Event.h"
00008 #include "FWCore/Framework/interface/EventSetup.h"
00009 #include "FWCore/Framework/interface/ESTransientHandle.h"
00010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00011 #include "FWCore/Utilities/interface/InputTag.h"
00012 #include "FWCore/ParameterSet/interface/types.h"
00013 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00014
00015 #include "DataFormats/DetId/interface/DetId.h"
00016 #include "DataFormats/Math/interface/Vector3D.h"
00017 #include "DetectorDescription/Core/interface/DDFilteredView.h"
00018 #include "DetectorDescription/Core/interface/DDCompactView.h"
00019 #include "DetectorDescription/Core/interface/DDMaterial.h"
00020 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00021
00022 static
00023 bool dddGetStringRaw(const DDFilteredView & view, const std::string & name, std::string & value) {
00024 std::vector<const DDsvalues_type *> result;
00025 view.specificsV(result);
00026 for (std::vector<const DDsvalues_type *>::iterator it = result.begin(); it != result.end(); ++it) {
00027 DDValue parameter(name);
00028 if (DDfetch(*it, parameter)) {
00029 if (parameter.strings().size() == 1) {
00030 value = parameter.strings().front();
00031 return true;
00032 } else {
00033 throw cms::Exception("Configuration")<< " ERROR: multiple " << name << " tags encountered";
00034 return false;
00035 }
00036 }
00037 }
00038 return false;
00039 }
00040
00041 static inline
00042 double dddGetDouble(const std::string & s, DDFilteredView const & view) {
00043 std::string value;
00044 if (dddGetStringRaw(view, s, value))
00045 return double(::atof(value.c_str()));
00046 else
00047 return NAN;
00048 }
00049
00050 static inline
00051 std::string dddGetString(const std::string & s, DDFilteredView const & view) {
00052 std::string value;
00053 if (dddGetStringRaw(view, s, value))
00054 return value;
00055 else
00056 return std::string();
00057 }
00058
00059 static inline
00060 std::ostream & operator<<(std::ostream & out, const math::XYZVector & v) {
00061 out << std::fixed << std::setprecision(3);
00062 return out << "(" << v.rho() << ", " << v.z() << ", " << v.phi() << ")";
00063 }
00064
00065 class ListGroups : public edm::EDAnalyzer
00066 {
00067 public:
00068 ListGroups(const edm::ParameterSet &);
00069 virtual ~ListGroups();
00070
00071 private:
00072 void analyze(const edm::Event &, const edm::EventSetup &);
00073 void beginJob() {}
00074 void endJob();
00075 };
00076
00077 ListGroups::ListGroups(const edm::ParameterSet &) {
00078 }
00079
00080 ListGroups::~ListGroups() {
00081 }
00082
00083 void
00084 ListGroups::analyze(const edm::Event& evt, const edm::EventSetup& setup) {
00085 edm::ESTransientHandle<DDCompactView> hDdd;
00086 setup.get<IdealGeometryRecord>().get( hDdd );
00087 DDFilteredView fv(*hDdd);
00088
00089 DDSpecificsFilter filter;
00090 filter.setCriteria(DDValue("TrackingMaterialGroup", ""), DDSpecificsFilter::not_equals);
00091 fv.addFilter(filter);
00092
00093 while (fv.next()) {
00094
00095 std::cout << dddGetString("TrackingMaterialGroup", fv) << '\t';
00096
00097
00098 const DDGeoHistory & history = fv.geoHistory();
00099 std::cout << '/';
00100 for (unsigned int h = 2; h < history.size(); ++h)
00101 std::cout << '/' << history[h].logicalPart().name().name() << '[' << history[h].copyno() << ']';
00102
00103
00104 math::XYZVector position = fv.translation() / 10.;
00105 std::cout << "\t" << position << std::endl;
00106 };
00107 std::cout << std::endl;
00108 }
00109
00110 void
00111 ListGroups::endJob() {
00112 }
00113
00114
00115
00116 #include "FWCore/PluginManager/interface/ModuleDef.h"
00117 #include "FWCore/Framework/interface/MakerMacros.h"
00118 DEFINE_FWK_MODULE(ListGroups);