XMLIdealMagneticFieldGeometryESProducer

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
#include "FWCore/Framework/interface/ModuleFactory.h"
#include "FWCore/Framework/interface/ESProducer.h"

#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/Framework/interface/ESTransientHandle.h"

#include "FWCore/Concurrency/interface/SharedResourceNames.h"

#include "DetectorDescription/Core/interface/DDCompactView.h"
#include "DetectorDescription/Core/interface/DDRoot.h"
#include "DetectorDescription/Parser/interface/DDLParser.h"
#include "CondFormats/Common/interface/FileBlob.h"
#include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"

#include "DetectorDescription/Core/interface/DDMaterial.h"
#include "DetectorDescription/Core/interface/DDSolid.h"
#include "DetectorDescription/Core/interface/DDSpecifics.h"
#include "DetectorDescription/Core/interface/DDRotationMatrix.h"

#include "DetectorDescription/Core/interface/Material.h"
#include "DetectorDescription/Core/interface/Solid.h"
#include "DetectorDescription/Core/interface/LogicalPart.h"
#include "DetectorDescription/Core/interface/Specific.h"

#include <memory>

class XMLIdealMagneticFieldGeometryESProducer : public edm::ESProducer {
public:
  XMLIdealMagneticFieldGeometryESProducer(const edm::ParameterSet&);
  ~XMLIdealMagneticFieldGeometryESProducer() override;

  typedef std::unique_ptr<DDCompactView> ReturnType;

  ReturnType produce(const IdealMagneticFieldRecord&);

private:
  std::string rootDDName_;  // this must be the form namespace:name
  std::string label_;
  edm::ESGetToken<FileBlob, MFGeometryFileRcd> geomToken_;

  DDI::Store<DDName, DDI::Material*> matStore_;
  DDI::Store<DDName, DDI::Solid*> solidStore_;
  DDI::Store<DDName, DDI::LogicalPart*> lpStore_;
  DDI::Store<DDName, DDI::Specific*> specStore_;
  DDI::Store<DDName, DDRotationMatrix*> rotStore_;
};

XMLIdealMagneticFieldGeometryESProducer::XMLIdealMagneticFieldGeometryESProducer(const edm::ParameterSet& iConfig)
    : rootDDName_(iConfig.getParameter<std::string>("rootDDName")), label_(iConfig.getParameter<std::string>("label")) {
  usesResources({{edm::ESSharedResourceNames::kDDGeometry}});

  auto cc = setWhatProduced(this);
  geomToken_ = cc.consumesFrom<FileBlob, MFGeometryFileRcd>(edm::ESInputTag("", label_));
}

XMLIdealMagneticFieldGeometryESProducer::~XMLIdealMagneticFieldGeometryESProducer(void) {}

XMLIdealMagneticFieldGeometryESProducer::ReturnType XMLIdealMagneticFieldGeometryESProducer::produce(
    const IdealMagneticFieldRecord& iRecord) {
  using namespace edm::es;

  edm::ESTransientHandle<FileBlob> gdd = iRecord.getTransientHandle(geomToken_);

  DDName ddName(rootDDName_);
  DDLogicalPart rootNode(ddName);
  DDRootDef::instance().set(rootNode);
  ReturnType returnValue(new DDCompactView(rootNode));
  DDLParser parser(*returnValue);
  parser.getDDLSAX2FileHandler()->setUserNS(true);
  parser.clearFiles();

  std::unique_ptr<std::vector<unsigned char> > tb = (*gdd).getUncompressedBlob();

  parser.parse(*tb, tb->size());

  returnValue->lockdown();

  return returnValue;
}

DEFINE_FWK_EVENTSETUP_MODULE(XMLIdealMagneticFieldGeometryESProducer);