Go to the documentation of this file.00001
00002
00003
00004
00005 #include <memory>
00006
00007 #include "SimTracker/SiStripDigitizer/interface/SiStripDigitizer.h"
00008
00009 #include "DataFormats/Common/interface/DetSetVector.h"
00010 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
00011 #include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
00012 #include "SimDataFormats/TrackerDigiSimLink/interface/StripDigiSimLink.h"
00013
00014
00015 #include "FWCore/Framework/interface/Frameworkfwd.h"
00016 #include "FWCore/Framework/interface/EDProducer.h"
00017
00018 #include "FWCore/Framework/interface/Event.h"
00019 #include "FWCore/Framework/interface/MakerMacros.h"
00020
00021 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00022 #include "SimDataFormats/TrackingHit/interface/PSimHitContainer.h"
00023 #include "SimDataFormats/TrackingHit/interface/PSimHit.h"
00024 #include "SimDataFormats/CrossingFrame/interface/CrossingFrame.h"
00025 #include "SimDataFormats/CrossingFrame/interface/MixCollection.h"
00026
00027
00028 #include "FWCore/Framework/interface/EventSetup.h"
00029 #include "FWCore/Framework/interface/ESHandle.h"
00030 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00031 #include "Geometry/CommonDetUnit/interface/GeomDetType.h"
00032 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
00033 #include "Geometry/TrackerNumberingBuilder/interface/GeometricDet.h"
00034 #include "Geometry/CommonTopologies/interface/StripTopology.h"
00035 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetType.h"
00036 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
00037
00038 #include "MagneticField/Engine/interface/MagneticField.h"
00039 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00040
00041 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
00042 #include "SimGeneral/HepPDTRecord/interface/ParticleDataTable.h"
00043
00044
00045 #include "CondFormats/DataRecord/interface/SiStripCondDataRecords.h"
00046 #include "CalibTracker/Records/interface/SiStripDependentRecords.h"
00047 #include "CondFormats/SiStripObjects/interface/SiStripLorentzAngle.h"
00048 #include "CondFormats/SiStripObjects/interface/SiStripNoises.h"
00049 #include "CondFormats/SiStripObjects/interface/SiStripPedestals.h"
00050 #include "CondFormats/SiStripObjects/interface/SiStripThreshold.h"
00051 #include "CondFormats/SiStripObjects/interface/SiStripBadStrip.h"
00052 #include "CalibFormats/SiStripObjects/interface/SiStripGain.h"
00053 #include "CalibFormats/SiStripObjects/interface/SiStripDetCabling.h"
00054 #include "CalibFormats/SiStripObjects/interface/SiStripQuality.h"
00055
00056
00057
00058 #include "FWCore/ServiceRegistry/interface/Service.h"
00059 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
00060 #include "FWCore/Utilities/interface/Exception.h"
00061 #include "CLHEP/Random/RandomEngine.h"
00062
00063 SiStripDigitizer::SiStripDigitizer(const edm::ParameterSet& conf) :
00064 conf_(conf)
00065 {
00066 alias = conf.getParameter<std::string>("@module_label");
00067 edm::ParameterSet ParamSet=conf_.getParameter<edm::ParameterSet>("DigiModeList");
00068
00069 produces<edm::DetSetVector<SiStripDigi> >(ParamSet.getParameter<std::string>("ZSDigi")).setBranchAlias( ParamSet.getParameter<std::string>("ZSDigi") );
00070 produces<edm::DetSetVector<StripDigiSimLink> >().setBranchAlias ( alias + "siStripDigiSimLink");
00071 produces<edm::DetSetVector<SiStripRawDigi> >(ParamSet.getParameter<std::string>("SCDigi")).setBranchAlias( alias + ParamSet.getParameter<std::string>("SCDigi") );
00072 produces<edm::DetSetVector<SiStripRawDigi> >(ParamSet.getParameter<std::string>("VRDigi")).setBranchAlias( alias + ParamSet.getParameter<std::string>("VRDigi") );
00073 produces<edm::DetSetVector<SiStripRawDigi> >(ParamSet.getParameter<std::string>("PRDigi")).setBranchAlias( alias + ParamSet.getParameter<std::string>("PRDigi") );
00074 trackerContainers.clear();
00075 trackerContainers = conf.getParameter<std::vector<std::string> >("ROUList");
00076 geometryType = conf.getParameter<std::string>("GeometryType");
00077 useConfFromDB = conf.getParameter<bool>("TrackerConfigurationFromDB");
00078 edm::Service<edm::RandomNumberGenerator> rng;
00079 if ( ! rng.isAvailable()) {
00080 throw cms::Exception("Configuration")
00081 << "SiStripDigitizer requires the RandomNumberGeneratorService\n"
00082 "which is not present in the configuration file. You must add the service\n"
00083 "in the configuration file or remove the modules that require it.";
00084 }
00085
00086 rndEngine = &(rng->getEngine());
00087 zeroSuppression = conf_.getParameter<bool>("ZeroSuppression");
00088 theDigiAlgo = new SiStripDigitizerAlgorithm(conf_,(*rndEngine));
00089
00090 }
00091
00092
00093 SiStripDigitizer::~SiStripDigitizer() {
00094 delete theDigiAlgo;
00095 }
00096
00097
00098 void SiStripDigitizer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00099 {
00100
00101 edm::ESHandle < ParticleDataTable > pdt;
00102 iSetup.getData( pdt );
00103
00104 if(useConfFromDB){
00105 edm::ESHandle<SiStripDetCabling> detCabling;
00106 iSetup.get<SiStripDetCablingRcd>().get( detCabling );
00107 detCabling->addConnected(theDetIdList);
00108 }
00109
00110 edm::Handle<CrossingFrame<PSimHit> > cf_simhit;
00111 std::vector<const CrossingFrame<PSimHit> *> cf_simhitvec;
00112 for(uint32_t i = 0; i< trackerContainers.size();i++){
00113 iEvent.getByLabel("mix",trackerContainers[i],cf_simhit);
00114 cf_simhitvec.push_back(cf_simhit.product());
00115 }
00116
00117 std::auto_ptr<MixCollection<PSimHit> > allTrackerHits(new MixCollection<PSimHit>(cf_simhitvec));
00118
00119
00120 SimHitMap.clear();
00121
00122
00123 std::vector<std::pair<const PSimHit*,int> > trackerHits(SimHitSelectorFromDB_.getSimHit(allTrackerHits,theDetIdList));
00124 std::vector<std::pair<const PSimHit*,int> >::iterator isim;
00125 for (isim=trackerHits.begin() ; isim!= trackerHits.end();isim++) {
00126
00127 SimHitMap[((*isim).first)->detUnitId()].push_back(*isim);
00128 }
00129
00130 edm::ESHandle<TrackerGeometry> pDD;
00131 iSetup.get<TrackerDigiGeometryRecord>().get(geometryType,pDD);
00132
00133 edm::ESHandle<MagneticField> pSetup;
00134 iSetup.get<IdealMagneticFieldRecord>().get(pSetup);
00135
00136
00137 edm::ESHandle<SiStripLorentzAngle> lorentzAngleHandle;
00138 edm::ESHandle<SiStripGain> gainHandle;
00139 edm::ESHandle<SiStripNoises> noiseHandle;
00140 edm::ESHandle<SiStripThreshold> thresholdHandle;
00141 edm::ESHandle<SiStripPedestals> pedestalHandle;
00142 edm::ESHandle<SiStripBadStrip> deadChannelHandle;
00143 std::string LAname = conf_.getParameter<std::string>("LorentzAngle");
00144 iSetup.get<SiStripLorentzAngleSimRcd>().get(LAname,lorentzAngleHandle);
00145 std::string gainLabel = conf_.getParameter<std::string>("Gain");
00146 iSetup.get<SiStripGainSimRcd>().get(gainLabel,gainHandle);
00147 iSetup.get<SiStripNoisesRcd>().get(noiseHandle);
00148 iSetup.get<SiStripThresholdRcd>().get(thresholdHandle);
00149 iSetup.get<SiStripPedestalsRcd>().get(pedestalHandle);
00150 iSetup.get<SiStripBadChannelRcd>().get(deadChannelHandle);
00151
00152 theDigiAlgo->setParticleDataTable(&*pdt);
00153
00154
00155 theDigiVector.reserve(10000);
00156 theDigiVector.clear();
00157 theDigiLinkVector.reserve(10000);
00158 theDigiLinkVector.clear();
00159
00160 for(TrackingGeometry::DetUnitContainer::const_iterator iu = pDD->detUnits().begin(); iu != pDD->detUnits().end(); iu ++){
00161 if(useConfFromDB){
00162
00163 if(theDetIdList.find((*iu)->geographicalId().rawId())==theDetIdList.end())
00164 continue;
00165 }
00166 GlobalVector bfield=pSetup->inTesla((*iu)->surface().position());
00167 StripGeomDetUnit* sgd = dynamic_cast<StripGeomDetUnit*>((*iu));
00168 if (sgd != 0){
00169 edm::DetSet<SiStripDigi> collectorZS((*iu)->geographicalId().rawId());
00170 edm::DetSet<SiStripRawDigi> collectorRaw((*iu)->geographicalId().rawId());
00171 edm::DetSet<StripDigiSimLink> linkcollector((*iu)->geographicalId().rawId());
00172 float langle = (lorentzAngleHandle.isValid()) ? lorentzAngleHandle->getLorentzAngle((*iu)->geographicalId().rawId()) : 0.;
00173 theDigiAlgo->run(collectorZS,collectorRaw,SimHitMap[(*iu)->geographicalId().rawId()],sgd,bfield,langle,
00174 gainHandle,thresholdHandle,noiseHandle,pedestalHandle, deadChannelHandle);
00175 if(zeroSuppression){
00176 if(collectorZS.data.size()>0){
00177 theDigiVector.push_back(collectorZS);
00178 if(SimHitMap[(*iu)->geographicalId().rawId()].size()>0){
00179 linkcollector.data = theDigiAlgo->make_link();
00180 if(linkcollector.data.size()>0)
00181 theDigiLinkVector.push_back(linkcollector);
00182 }
00183 }
00184 }else{
00185 if(collectorRaw.data.size()>0){
00186 theRawDigiVector.push_back(collectorRaw);
00187 if(SimHitMap[(*iu)->geographicalId().rawId()].size()>0){
00188 linkcollector.data = theDigiAlgo->make_link();
00189 if(linkcollector.data.size()>0)
00190 theDigiLinkVector.push_back(linkcollector);
00191 }
00192 }
00193 }
00194 }
00195 }
00196
00197 if(zeroSuppression){
00198
00199 std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > output_virginraw(new edm::DetSetVector<SiStripRawDigi>());
00200 std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > output_scopemode(new edm::DetSetVector<SiStripRawDigi>());
00201 std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > output_processedraw(new edm::DetSetVector<SiStripRawDigi>());
00202 std::auto_ptr<edm::DetSetVector<SiStripDigi> > output(new edm::DetSetVector<SiStripDigi>(theDigiVector) );
00203 std::auto_ptr<edm::DetSetVector<StripDigiSimLink> > outputlink(new edm::DetSetVector<StripDigiSimLink>(theDigiLinkVector) );
00204
00205 edm::ParameterSet ParamSet=conf_.getParameter<edm::ParameterSet>("DigiModeList");
00206 iEvent.put(output,ParamSet.getParameter<std::string>("ZSDigi"));
00207 iEvent.put(outputlink);
00208 iEvent.put(output_scopemode, ParamSet.getParameter<std::string>("SCDigi"));
00209 iEvent.put(output_virginraw, ParamSet.getParameter<std::string>("VRDigi"));
00210 iEvent.put(output_processedraw,ParamSet.getParameter<std::string>("PRDigi"));
00211 }else{
00212
00213 std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > output_virginraw(new edm::DetSetVector<SiStripRawDigi>(theRawDigiVector));
00214 std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > output_scopemode(new edm::DetSetVector<SiStripRawDigi>());
00215 std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > output_processedraw(new edm::DetSetVector<SiStripRawDigi>());
00216 std::auto_ptr<edm::DetSetVector<SiStripDigi> > output(new edm::DetSetVector<SiStripDigi>() );
00217 std::auto_ptr<edm::DetSetVector<StripDigiSimLink> > outputlink(new edm::DetSetVector<StripDigiSimLink>(theDigiLinkVector) );
00218
00219 edm::ParameterSet ParamSet=conf_.getParameter<edm::ParameterSet>("DigiModeList");
00220 iEvent.put(output,ParamSet.getParameter<std::string>("ZSDigi"));
00221 iEvent.put(outputlink);
00222 iEvent.put(output_scopemode, ParamSet.getParameter<std::string>("SCDigi"));
00223 iEvent.put(output_virginraw, ParamSet.getParameter<std::string>("VRDigi"));
00224 iEvent.put(output_processedraw,ParamSet.getParameter<std::string>("PRDigi"));
00225 }
00226 }