Go to the documentation of this file.00001
00002
00003
00004
00005 #include <memory>
00006
00007 #include "DigiSimLinkProducer.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 DigiSimLinkProducer::DigiSimLinkProducer(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<StripDigiSimLink> >().setBranchAlias ( alias + "siStripDigiSimLink");
00070 trackerContainers.clear();
00071 trackerContainers = conf.getParameter<std::vector<std::string> >("ROUList");
00072 geometryType = conf.getParameter<std::string>("GeometryType");
00073 useConfFromDB = conf.getParameter<bool>("TrackerConfigurationFromDB");
00074 edm::Service<edm::RandomNumberGenerator> rng;
00075 if ( ! rng.isAvailable()) {
00076 throw cms::Exception("Configuration")
00077 << "DigiSimLinkProducer requires the RandomNumberGeneratorService\n"
00078 "which is not present in the configuration file. You must add the service\n"
00079 "in the configuration file or remove the modules that require it.";
00080 }
00081
00082 rndEngine = &(rng->getEngine());
00083 zeroSuppression = conf_.getParameter<bool>("ZeroSuppression");
00084 theDigiAlgo = new DigiSimLinkAlgorithm(conf_,(*rndEngine));
00085
00086 }
00087
00088
00089 DigiSimLinkProducer::~DigiSimLinkProducer() {
00090 delete theDigiAlgo;
00091 }
00092
00093
00094 void DigiSimLinkProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00095 {
00096
00097 edm::ESHandle < ParticleDataTable > pdt;
00098 iSetup.getData( pdt );
00099
00100 if(useConfFromDB){
00101 edm::ESHandle<SiStripDetCabling> detCabling;
00102 iSetup.get<SiStripDetCablingRcd>().get( detCabling );
00103 detCabling->addConnected(theDetIdList);
00104 }
00105
00106 edm::Handle<CrossingFrame<PSimHit> > cf_simhit;
00107 std::vector<const CrossingFrame<PSimHit> *> cf_simhitvec;
00108 for(uint32_t i = 0; i< trackerContainers.size();i++){
00109 iEvent.getByLabel("mix",trackerContainers[i],cf_simhit);
00110 cf_simhitvec.push_back(cf_simhit.product());
00111 }
00112
00113 std::auto_ptr<MixCollection<PSimHit> > allTrackerHits(new MixCollection<PSimHit>(cf_simhitvec));
00114
00115
00116 SimHitMap.clear();
00117
00118
00119 std::vector<std::pair<const PSimHit*,int> > trackerHits(SimHitSelectorFromDB_.getSimHit(allTrackerHits,theDetIdList));
00120 std::vector<std::pair<const PSimHit*,int> >::iterator isim;
00121 for (isim=trackerHits.begin() ; isim!= trackerHits.end();isim++) {
00122
00123 SimHitMap[((*isim).first)->detUnitId()].push_back(*isim);
00124 }
00125
00126 edm::ESHandle<TrackerGeometry> pDD;
00127 iSetup.get<TrackerDigiGeometryRecord>().get(geometryType,pDD);
00128
00129 edm::ESHandle<MagneticField> pSetup;
00130 iSetup.get<IdealMagneticFieldRecord>().get(pSetup);
00131
00132
00133 edm::ESHandle<SiStripLorentzAngle> lorentzAngleHandle;
00134 edm::ESHandle<SiStripGain> gainHandle;
00135 edm::ESHandle<SiStripNoises> noiseHandle;
00136 edm::ESHandle<SiStripThreshold> thresholdHandle;
00137 edm::ESHandle<SiStripPedestals> pedestalHandle;
00138 edm::ESHandle<SiStripBadStrip> deadChannelHandle;
00139 std::string LAname = conf_.getParameter<std::string>("LorentzAngle");
00140 iSetup.get<SiStripLorentzAngleSimRcd>().get(LAname,lorentzAngleHandle);
00141 std::string gainLabel = conf_.getParameter<std::string>("Gain");
00142 iSetup.get<SiStripGainSimRcd>().get(gainLabel,gainHandle);
00143 iSetup.get<SiStripNoisesRcd>().get(noiseHandle);
00144 iSetup.get<SiStripThresholdRcd>().get(thresholdHandle);
00145 iSetup.get<SiStripPedestalsRcd>().get(pedestalHandle);
00146 iSetup.get<SiStripBadChannelRcd>().get(deadChannelHandle);
00147
00148 theDigiAlgo->setParticleDataTable(&*pdt);
00149
00150
00151 theDigiVector.reserve(10000);
00152 theDigiVector.clear();
00153 theDigiLinkVector.reserve(10000);
00154 theDigiLinkVector.clear();
00155
00156 for(TrackingGeometry::DetUnitContainer::const_iterator iu = pDD->detUnits().begin(); iu != pDD->detUnits().end(); iu ++){
00157 if(useConfFromDB){
00158
00159 if(theDetIdList.find((*iu)->geographicalId().rawId())==theDetIdList.end())
00160 continue;
00161 }
00162 GlobalVector bfield=pSetup->inTesla((*iu)->surface().position());
00163 StripGeomDetUnit* sgd = dynamic_cast<StripGeomDetUnit*>((*iu));
00164 if (sgd != 0){
00165 edm::DetSet<SiStripDigi> collectorZS((*iu)->geographicalId().rawId());
00166 edm::DetSet<SiStripRawDigi> collectorRaw((*iu)->geographicalId().rawId());
00167 edm::DetSet<StripDigiSimLink> linkcollector((*iu)->geographicalId().rawId());
00168 float langle = (lorentzAngleHandle.isValid()) ? lorentzAngleHandle->getLorentzAngle((*iu)->geographicalId().rawId()) : 0.;
00169 theDigiAlgo->run(collectorZS,collectorRaw,SimHitMap[(*iu)->geographicalId().rawId()],sgd,bfield,langle,
00170 gainHandle,thresholdHandle,noiseHandle,pedestalHandle, deadChannelHandle);
00171 if(zeroSuppression){
00172 if(collectorZS.data.size()>0){
00173 theDigiVector.push_back(collectorZS);
00174 if(SimHitMap[(*iu)->geographicalId().rawId()].size()>0){
00175 linkcollector.data = theDigiAlgo->make_link();
00176 if(linkcollector.data.size()>0)
00177 theDigiLinkVector.push_back(linkcollector);
00178 }
00179 }
00180 }else{
00181 if(collectorRaw.data.size()>0){
00182 theRawDigiVector.push_back(collectorRaw);
00183 if(SimHitMap[(*iu)->geographicalId().rawId()].size()>0){
00184 linkcollector.data = theDigiAlgo->make_link();
00185 if(linkcollector.data.size()>0)
00186 theDigiLinkVector.push_back(linkcollector);
00187 }
00188 }
00189 }
00190 }
00191 }
00192
00193
00194 std::auto_ptr<edm::DetSetVector<StripDigiSimLink> > outputlink(new edm::DetSetVector<StripDigiSimLink>(theDigiLinkVector));
00195
00196 iEvent.put(outputlink);
00197 }