Go to the documentation of this file.00001
00002
00003
00005
00006
00008
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
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
00037 using namespace edm;
00038
00040
00041
00042
00044
00045 class BeamSpotFromSimProducer : public edm::EDProducer
00046 {
00047 public:
00048
00049
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
00088 BeamSpotFromSimProducer::BeamSpotFromSimProducer(edm::ParameterSet const& iConfig)
00089 {
00090 produces< reco::BeamSpot >( "BeamSpot" ).setBranchAlias("BeamSpot");
00091 }
00092
00094
00095 BeamSpotFromSimProducer::~BeamSpotFromSimProducer()
00096 {
00097 }
00098
00100
00101 void BeamSpotFromSimProducer::endRun(edm::Run& run, const edm::EventSetup& iSetup)
00102 {
00104 }
00105
00107
00108 void BeamSpotFromSimProducer::beginRun(edm::Run& run, const edm::EventSetup& iSetup )
00109 {
00110 std::cout << "BeamSpotFromSimProducer" << std::endl;
00111 }
00112
00114
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
00127
00128
00129
00130 unsigned int iProcess=iEvent.processHistory().size();
00131
00132
00133
00134
00135
00136
00137 if (iProcess>0) iProcess=0;
00138
00139 std::string nameProcess = iEvent.processHistory()[iProcess].processName();
00140
00141
00142
00143
00144
00145 iEvent.getProcessParameterSet(nameProcess,ps);
00146
00147
00148
00149
00150
00151
00152
00153
00154
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
00194 error_(0,0)=0.1*sigmaX_;
00195 error_(1,1)=0.1*sigmaY_;
00196 error_(2,2)=0.1*sigmaZ_;
00197
00198
00199 error_(3,3)=0.1*sigmaZ_;
00200 error_(6,6)=0.1*sigmaX_;
00201
00202
00203
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
00227 DEFINE_FWK_MODULE(BeamSpotFromSimProducer);
00228