Go to the documentation of this file.00001 #include "Geometry/RPCGeometry/interface/RPCRoll.h"
00002 #include "Geometry/RPCGeometry/interface/RPCRollSpecs.h"
00003 #include "SimMuon/RPCDigitizer/src/RPCSimParam.h"
00004 #include "Geometry/CommonTopologies/interface/RectangularStripTopology.h"
00005 #include "Geometry/CommonTopologies/interface/TrapezoidalStripTopology.h"
00006
00007 #include "FWCore/ServiceRegistry/interface/Service.h"
00008 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
00009 #include "FWCore/Utilities/interface/Exception.h"
00010 #include "CLHEP/Random/RandomEngine.h"
00011 #include "CLHEP/Random/RandFlat.h"
00012 #include <cmath>
00013
00014
00015 #include "CLHEP/Random/Random.h"
00016 #include "CLHEP/Random/RandFlat.h"
00017 #include "CLHEP/Random/RandPoissonQ.h"
00018
00019 RPCSimParam::RPCSimParam(const edm::ParameterSet& config) : RPCSim(config){
00020 aveEff = config.getParameter<double>("averageEfficiency");
00021 aveCls = config.getParameter<double>("averageClusterSize");
00022 resRPC = config.getParameter<double>("timeResolution");
00023 timOff = config.getParameter<double>("timingRPCOffset");
00024 dtimCs = config.getParameter<double>("deltatimeAdjacentStrip");
00025 resEle = config.getParameter<double>("timeJitter");
00026 sspeed = config.getParameter<double>("signalPropagationSpeed");
00027 lbGate = config.getParameter<double>("linkGateWidth");
00028 rpcdigiprint = config.getParameter<bool>("printOutDigitizer");
00029
00030 rate=config.getParameter<double>("Rate");
00031 nbxing=config.getParameter<int>("Nbxing");
00032 gate=config.getParameter<double>("Gate");
00033
00034 if (rpcdigiprint) {
00035 std::cout <<"Average Efficiency = "<<aveEff<<std::endl;
00036 std::cout <<"Average Cluster Size = "<<aveCls<<" strips"<<std::endl;
00037 std::cout <<"RPC Time Resolution = "<<resRPC<<" ns"<<std::endl;
00038 std::cout <<"RPC Signal formation time = "<<timOff<<" ns"<<std::endl;
00039 std::cout <<"RPC adjacent strip delay = "<<dtimCs<<" ns"<<std::endl;
00040 std::cout <<"Electronic Jitter = "<<resEle<<" ns"<<std::endl;
00041 std::cout <<"Signal propagation time = "<<sspeed<<" x c"<<std::endl;
00042 std::cout <<"Link Board Gate Width = "<<lbGate<<" ns"<<std::endl;
00043 }
00044
00045 _rpcSync = new RPCSynchronizer(config);
00046 }
00047
00048 void RPCSimParam::setRandomEngine(CLHEP::HepRandomEngine& eng){
00049 flatDistribution_ = new CLHEP::RandFlat(eng);
00050 flatDistribution1 = new CLHEP::RandFlat(eng);
00051 flatDistribution2 = new CLHEP::RandFlat(eng);
00052 poissonDistribution = new CLHEP::RandPoissonQ(eng);
00053 _rpcSync->setRandomEngine(eng);
00054 }
00055
00056
00057 RPCSimParam::~RPCSimParam(){
00058 delete flatDistribution_;
00059 delete flatDistribution1;
00060 delete flatDistribution2;
00061 delete poissonDistribution;
00062 delete _rpcSync;
00063 }
00064
00065
00066 void
00067 RPCSimParam::simulate(const RPCRoll* roll,
00068 const edm::PSimHitContainer& rpcHits)
00069 {
00070 _rpcSync->setRPCSimSetUp(getRPCSimSetUp());
00071 theRpcDigiSimLinks.clear();
00072 theDetectorHitMap.clear();
00073 theRpcDigiSimLinks = RPCDigiSimLinks(roll->id().rawId());
00074
00075 const Topology& topology=roll->specs()->topology();
00076
00077 for (edm::PSimHitContainer::const_iterator _hit = rpcHits.begin();
00078 _hit != rpcHits.end(); ++_hit){
00079
00080
00081 const LocalPoint& entr=_hit->entryPoint();
00082 int time_hit = _rpcSync->getSimHitBx(&(*_hit));
00083
00084
00085 float eff = flatDistribution_->fire(1);
00086 if (eff < aveEff) {
00087
00088 int centralStrip = topology.channel(entr)+1;
00089 int fstrip=centralStrip;
00090 int lstrip=centralStrip;
00091
00092 double w = flatDistribution_->fire(1);
00093 if (w < 1.e-10) w=1.e-10;
00094 int clsize = static_cast<int>( -1.*aveCls*log(w)+1.);
00095 std::vector<int> cls;
00096 cls.push_back(centralStrip);
00097 if (clsize > 1){
00098 for (int cl = 0; cl < (clsize-1)/2; cl++)
00099 if (centralStrip - cl -1 >= 1 ){
00100 fstrip = centralStrip-cl-1;
00101 cls.push_back(fstrip);
00102 }
00103 for (int cl = 0; cl < (clsize-1)/2; cl++)
00104 if (centralStrip + cl + 1 <= roll->nstrips() ){
00105 lstrip = centralStrip+cl+1;
00106 cls.push_back(lstrip);
00107 }
00108 if (clsize%2 == 0 ){
00109
00110
00111 double deltaw=roll->centreOfStrip(centralStrip).x()-entr.x();
00112 if (deltaw<0.) {
00113 if (lstrip < roll->nstrips() ){
00114 lstrip++;
00115 cls.push_back(lstrip);
00116 }
00117 }else{
00118 if (fstrip > 1 ){
00119 fstrip--;
00120 cls.push_back(fstrip);
00121 }
00122 }
00123 }
00124 }
00125
00126 for (std::vector<int>::iterator i=cls.begin(); i!=cls.end();i++){
00127
00128 std::pair<unsigned int, int> digi(*i,time_hit);
00129
00130 theDetectorHitMap.insert(DetectorHitMap::value_type(digi,&(*_hit)));
00131 strips.insert(digi);
00132 }
00133 }
00134 }
00135 }
00136
00137
00138 void RPCSimParam::simulateNoise(const RPCRoll* roll)
00139 {
00140
00141 RPCDetId rpcId = roll->id();
00142 int nstrips = roll->nstrips();
00143 double area = 0.0;
00144
00145 if ( rpcId.region() == 0 )
00146 {
00147 const RectangularStripTopology* top_ = dynamic_cast<const
00148 RectangularStripTopology*>(&(roll->topology()));
00149 float xmin = (top_->localPosition(0.)).x();
00150 float xmax = (top_->localPosition((float)roll->nstrips())).x();
00151 float striplength = (top_->stripLength());
00152 area = striplength*(xmax-xmin);
00153 }
00154 else
00155 {
00156 const TrapezoidalStripTopology* top_=dynamic_cast<const TrapezoidalStripTopology*>(&(roll->topology()));
00157 float xmin = (top_->localPosition(0.)).x();
00158 float xmax = (top_->localPosition((float)roll->nstrips())).x();
00159 float striplength = (top_->stripLength());
00160 area = striplength*(xmax-xmin);
00161 }
00162
00163 double ave = rate*nbxing*gate*area*1.0e-9;
00164
00165 N_hits = poissonDistribution->fire(ave);
00166
00167 for (int i = 0; i < N_hits; i++ ){
00168 int strip = static_cast<int>(flatDistribution1->fire(1,nstrips));
00169 int time_hit;
00170 time_hit = (static_cast<int>(flatDistribution2->fire((nbxing*gate)/gate))) - nbxing/2;
00171 std::pair<int, int> digi(strip,time_hit);
00172 strips.insert(digi);
00173 }
00174
00175 }