CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC2/src/RecoVertex/BeamSpotProducer/plugins/BeamSpotFromSimProducer.cc

Go to the documentation of this file.
00001 
00002 //  Producer by Anders  //
00003 //    Jan 2013 @ CU    //
00005 
00006 
00008 // FRAMEWORK HEADERS
00009 #include "FWCore/PluginManager/interface/ModuleDef.h"
00010 #include "FWCore/Framework/interface/MakerMacros.h"
00011 //
00012 #include "FWCore/Framework/interface/EDProducer.h"
00013 #include "FWCore/Framework/interface/Event.h"
00014 #include "FWCore/Framework/interface/ESHandle.h"
00015 #include "FWCore/Framework/interface/EventSetup.h"
00016 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00017 //
00018 #include "FWCore/Utilities/interface/InputTag.h"
00019 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00020 #include "FWCore/ServiceRegistry/interface/Service.h"
00021 
00023 // DATA FORMATS HEADERS
00024 #include "DataFormats/Common/interface/Handle.h"
00025 #include "DataFormats/Common/interface/EDProduct.h"
00026 #include "DataFormats/Common/interface/Ref.h"
00027 #include "DataFormats/Provenance/interface/ProcessHistory.h"
00028 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00029 //
00030 #include "DataFormats/Math/interface/LorentzVector.h"
00031 #include "DataFormats/Math/interface/Vector3D.h"
00032 //
00033 #include <string>
00034 
00036 // NAMESPACES
00037 using namespace edm;
00038 
00040 //                          //
00041 //     CLASS DEFINITION     //
00042 //                          //
00044 
00045 class BeamSpotFromSimProducer : public edm::EDProducer
00046 {
00047 public:
00048 
00049   // point in the space
00050   typedef math::XYZPoint Point;
00051   enum { dimension = 7 };
00052   typedef math::Error<dimension>::type CovarianceMatrix;
00053 
00054 
00056   explicit BeamSpotFromSimProducer(const edm::ParameterSet& iConfig);
00057   virtual ~BeamSpotFromSimProducer();
00058 
00059 protected:
00060                      
00061 private:
00062 
00065   virtual void beginRun( edm::Run& run, const edm::EventSetup& iSetup );
00066   virtual void endRun( edm::Run& run, const edm::EventSetup& iSetup );
00067   virtual void produce( edm::Event& iEvent, const edm::EventSetup& iSetup );
00068 
00069   double meanX_;
00070   double meanY_;
00071   double meanZ_;
00072 
00073   double sigmaX_;
00074   double sigmaY_;
00075   double sigmaZ_;
00076 
00077   double dxdz_;
00078   double dydz_;
00079 
00080   Point point_;
00081   CovarianceMatrix error_;
00082 
00083 };
00084 
00085 
00087 // CONSTRUCTOR
00088 BeamSpotFromSimProducer::BeamSpotFromSimProducer(edm::ParameterSet const& iConfig) // :   config(iConfig)
00089 {
00090   produces< reco::BeamSpot >( "BeamSpot" ).setBranchAlias("BeamSpot");
00091 }
00092 
00094 // DESTRUCTOR
00095 BeamSpotFromSimProducer::~BeamSpotFromSimProducer()
00096 {
00097 }  
00098 
00100 // END JOB
00101 void BeamSpotFromSimProducer::endRun(edm::Run& run, const edm::EventSetup& iSetup)
00102 {
00104 }
00105 
00107 // BEGIN JOB
00108 void BeamSpotFromSimProducer::beginRun(edm::Run& run, const edm::EventSetup& iSetup )
00109 {
00110   std::cout << "BeamSpotFromSimProducer" << std::endl;
00111 }
00112 
00114 // PRODUCE
00115 void BeamSpotFromSimProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00116 {
00117 
00118 
00119   static bool gotProcessParameterSet=false;
00120 
00121   if(!gotProcessParameterSet){
00122 
00123     gotProcessParameterSet=true;
00124 
00125     edm::ParameterSet ps;
00126     //fetch the real process name using the processHistory accessor of 
00127     //the edm::Event, then find the     
00128     // last-1 entry and ask for it's processName
00129 
00130     unsigned int iProcess=iEvent.processHistory().size();
00131     //std::cout << "Process History size = "<<iProcess<<std::endl;
00132     //for (unsigned int i=0;i<iProcess;i++){
00133     //  std::cout << "Process "<<i<<" name: "
00134     //          <<iEvent.processHistory()[i].processName()<<std::endl;
00135     //}
00136 
00137     if (iProcess>0) iProcess=0;
00138 
00139     std::string nameProcess = iEvent.processHistory()[iProcess].processName();
00140     //std::cout << "nameProcess:"<<nameProcess<<std::endl;
00141     
00142     // Now ask the edm::Event for the top level parameter set of this process, 
00143     //return it in ps
00144 
00145     iEvent.getProcessParameterSet(nameProcess,ps);
00146 
00147     // The VtxSmeared has a parameter name "SigmaZ" this will 
00148     // retrieve it.
00149 
00150     //cout << "Will print out ps:" << endl;
00151     //cout << ps << endl;
00152     //cout << "Done printing ps" << endl;
00153 
00154     //    double SigmaZ = ps.getParameterSet("HLLHCVtxSmearingParameters").getParameter<double>("SigmaZ");
00155 
00156     double SigmaX = ps.getParameterSet("VtxSmeared").getParameter<double>("SigmaX");
00157     double SigmaY = ps.getParameterSet("VtxSmeared").getParameter<double>("SigmaY");
00158     double SigmaZ = ps.getParameterSet("VtxSmeared").getParameter<double>("SigmaZ");
00159 
00160     meanX_ = ps.getParameterSet("VtxSmeared").getParameter<double>("MeanX");
00161     meanY_ = ps.getParameterSet("VtxSmeared").getParameter<double>("MeanY");
00162     meanZ_ = ps.getParameterSet("VtxSmeared").getParameter<double>("MeanZ");
00163 
00164     double HalfCrossingAngle = ps.getParameterSet("VtxSmeared").getParameter<double>("HalfCrossingAngle");
00165     double CrabAngle = ps.getParameterSet("VtxSmeared").getParameter<double>("CrabAngle");
00166 
00167     static const double sqrtOneHalf=sqrt(0.5);
00168 
00169     double sinbeta=sin(CrabAngle);
00170     double cosbeta=cos(CrabAngle);
00171     double cosalpha=cos(HalfCrossingAngle);
00172     double sinamb=sin(HalfCrossingAngle-CrabAngle);
00173     double cosamb=sin(HalfCrossingAngle-CrabAngle);
00174 
00175     sigmaX_=sqrtOneHalf*hypot(SigmaZ*sinbeta,SigmaX*cosbeta)/cosalpha;
00176 
00177     sigmaY_=sqrtOneHalf*SigmaY;
00178 
00179     sigmaZ_=sqrtOneHalf*hypot(sinamb/SigmaX,cosamb/SigmaZ);
00180   
00181     dxdz_=0.0;
00182     dydz_=0.0;
00183     
00184     point_=Point(meanX_,meanY_,meanZ_);
00185 
00186     for (unsigned int j=0; j<7; j++) {
00187       for (unsigned int k=j; k<7; k++) {
00188         error_(j,k) = 0.0;
00189       }
00190     }
00191 
00192 
00193     //arbitrarily set position errors to 1/10 of width.
00194     error_(0,0)=0.1*sigmaX_;
00195     error_(1,1)=0.1*sigmaY_;
00196     error_(2,2)=0.1*sigmaZ_;
00197     
00198     //arbitrarily set width errors to 1/10 of width.
00199     error_(3,3)=0.1*sigmaZ_;
00200     error_(6,6)=0.1*sigmaX_;
00201 
00202     //arbitrarily set error on beam axis direction to 1/100 of
00203     //beam aspect ratio    
00204     error_(4,4)=0.01*sigmaX_/sigmaZ_;
00205     error_(5,5)=error_(4,4);
00206     
00207   }
00208 
00209 
00211   std::auto_ptr< reco::BeamSpot > BeamSpotForOutput( new reco::BeamSpot(point_,
00212                                                                         sigmaZ_,
00213                                                                         dxdz_,
00214                                                                         dydz_,
00215                                                                         sigmaX_,
00216                                                                         error_,
00217                                                                         reco::BeamSpot::Fake));
00218 
00219 
00220   iEvent.put( BeamSpotForOutput, "BeamSpot");
00221 
00222 } 
00223 
00224 
00225 // ///////////////////////////
00226 // // DEFINE THIS AS A PLUG-IN
00227 DEFINE_FWK_MODULE(BeamSpotFromSimProducer);
00228