CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_2_9_HLT1_bphpatch4/src/Fireworks/Geometry/plugins/MFAnalyzer.cc

Go to the documentation of this file.
00001 #include "FWCore/Framework/interface/Frameworkfwd.h"
00002 #include "FWCore/Framework/interface/EDAnalyzer.h"
00003 
00004 #include "FWCore/Framework/interface/Event.h"
00005 #include "FWCore/Framework/interface/MakerMacros.h"
00006 
00007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00008 
00009 #include "FWCore/Framework/interface/ESHandle.h"
00010 #include "FWCore/Framework/interface/EventSetup.h"
00011 #include "FWCore/Framework/interface/ESTransientHandle.h"
00012 
00013 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00014 #include "DataFormats/GeometryVector/interface/GlobalVector.h"
00015 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00016 #include "MagneticField/Engine/interface/MagneticField.h"
00017 
00018 class MFAnalyzer : public edm::EDAnalyzer
00019 {
00020 public:
00021   explicit MFAnalyzer( const edm::ParameterSet& );
00022   ~MFAnalyzer( void );
00023 
00024   bool         valid (void) { return m_valid; }
00025 
00026 private:
00027   virtual void  analyze( const edm::Event&, const edm::EventSetup& );
00028   void          evaluate( const double point[3], double field[3] ) const;
00029   unsigned      m_mapDensityX;
00030   unsigned      m_mapDensityY;
00031   unsigned      m_mapDensityZ;
00032   double        m_minX;
00033   double        m_maxX;
00034   double        m_minY;
00035   double        m_maxY;
00036   double        m_minZ;
00037   double        m_maxZ;
00038   double        m_xBaseDir;
00039   double        m_yBaseDir;
00040   double        m_zBaseDir;
00041   bool          m_valid;
00042   edm::ESHandle<MagneticField> m_mf;
00043 };
00044 
00045 MFAnalyzer::MFAnalyzer( const edm::ParameterSet& iPset )
00046   : m_valid( false )
00047 {
00048   m_mapDensityX = iPset.getUntrackedParameter<unsigned>( "mapDensityX", 10 );
00049   m_mapDensityY = iPset.getUntrackedParameter<unsigned>( "mapDensityY", 10 );
00050   m_mapDensityZ = iPset.getUntrackedParameter<unsigned>( "mapDensityY", 10 );
00051   m_minX = iPset.getUntrackedParameter<double>( "minX", -18.0 );
00052   m_maxX = iPset.getUntrackedParameter<double>( "maxX", 18.0 );
00053   m_minY = iPset.getUntrackedParameter<double>( "minY", -18.0 );
00054   m_maxY = iPset.getUntrackedParameter<double>( "maxY", 18.0 );
00055   m_minZ = iPset.getUntrackedParameter<double>( "minZ", -18.0 );
00056   m_maxZ = iPset.getUntrackedParameter<double>( "maxZ", 18.0 );
00057 
00058   m_xBaseDir = ( m_maxX - m_minX ) / m_mapDensityX;
00059   m_yBaseDir = ( m_maxY - m_minY ) / m_mapDensityY;
00060   m_zBaseDir = ( m_maxZ - m_minZ ) / m_mapDensityZ;
00061 }
00062 
00063 MFAnalyzer::~MFAnalyzer( void )
00064 {}
00065 
00066 void
00067 MFAnalyzer::analyze( const edm::Event& iEvent, const edm::EventSetup& iSetup )
00068 {
00069   iSetup.get<IdealMagneticFieldRecord>().get( m_mf );
00070   m_mf.isValid() ? m_valid = true : m_valid = false;
00071    
00072   for( unsigned i = 0; i <= m_mapDensityX; ++i )
00073   {
00074     for( unsigned j = 0; j <= m_mapDensityY; ++j )
00075     {                       
00076       for( unsigned k = 0; k <= m_mapDensityZ; ++k )
00077       {                       
00078         // Prepare field position and get value.
00079         double x =  m_minX + m_xBaseDir * i;
00080         double y = m_minY + m_yBaseDir * j;
00081         double z = m_minZ + m_zBaseDir * k;
00082         double  pt[3] = { x, y, z };
00083         double  val[3];
00084         evaluate( pt, val );
00085         std::cout << "(" << x << ", " << y << ", " << z << ") " << val[0] << ":" << val[1] << ":" << val[2] << "; ";
00086       }
00087       std::cout << std::endl;
00088     }
00089     std::cout << std::endl;
00090   }
00091 }
00092 
00093 void
00094 MFAnalyzer::evaluate (const double point [3], double field [3]) const
00095 {
00096   GlobalVector b = m_mf->inTesla( GlobalPoint( point[0], point[1], point[2] ));
00097   
00098   field [0] = b.x();
00099   field [1] = b.y();
00100   field [2] = b.z();
00101 }
00102 
00103 DEFINE_FWK_MODULE( MFAnalyzer );