CMS 3D CMS Logo

Public Member Functions | Private Types | Private Attributes

DigiSimLinkProducer Class Reference

#include <DigiSimLinkProducer.h>

List of all members.

Public Member Functions

 DigiSimLinkProducer (const edm::ParameterSet &conf)
virtual void produce (edm::Event &e, const edm::EventSetup &c)
virtual ~DigiSimLinkProducer ()

Private Types

typedef std::map< unsigned int,
std::vector< std::pair< const
PSimHit *, int > >, std::less
< unsigned int > > 
simhit_map
typedef simhit_map::iterator simhit_map_iterator
typedef std::vector< std::string > vstring

Private Attributes

std::string alias
edm::ParameterSet conf_
std::string geometryType
int numStrips
CLHEP::HepRandomEngine * rndEngine
simhit_map SimHitMap
SimHitSelectorFromDB SimHitSelectorFromDB_
std::map< uint32_t,
std::vector< int > > 
theDetIdList
DigiSimLinkAlgorithmtheDigiAlgo
std::vector< edm::DetSet
< StripDigiSimLink > > 
theDigiLinkVector
std::vector< edm::DetSet
< SiStripDigi > > 
theDigiVector
std::vector< edm::DetSet
< SiStripRawDigi > > 
theRawDigiVector
SiStripFedZeroSuppression * theSiFEDZeroSuppress
vstring trackerContainers
bool useConfFromDB
bool zeroSuppression

Detailed Description

DigiSimLinkProducer to convert hits to digis

Definition at line 34 of file DigiSimLinkProducer.h.


Member Typedef Documentation

typedef std::map<unsigned int, std::vector<std::pair<const PSimHit*, int> >,std::less<unsigned int> > DigiSimLinkProducer::simhit_map [private]

Definition at line 46 of file DigiSimLinkProducer.h.

typedef simhit_map::iterator DigiSimLinkProducer::simhit_map_iterator [private]

Definition at line 47 of file DigiSimLinkProducer.h.

typedef std::vector<std::string> DigiSimLinkProducer::vstring [private]

Definition at line 45 of file DigiSimLinkProducer.h.


Constructor & Destructor Documentation

DigiSimLinkProducer::DigiSimLinkProducer ( const edm::ParameterSet &  conf) [explicit]

Definition at line 63 of file DigiSimLinkProducer.cc.

References alias, conf_, geometryType, rndEngine, theDigiAlgo, trackerContainers, useConfFromDB, and zeroSuppression.

                                                                    : 
  conf_(conf)
{
  alias = conf.getParameter<std::string>("@module_label");
  edm::ParameterSet ParamSet=conf_.getParameter<edm::ParameterSet>("DigiModeList");
  
  produces<edm::DetSetVector<StripDigiSimLink> >().setBranchAlias ( alias + "siStripDigiSimLink");
  trackerContainers.clear();
  trackerContainers = conf.getParameter<std::vector<std::string> >("ROUList");
  geometryType = conf.getParameter<std::string>("GeometryType");
  useConfFromDB = conf.getParameter<bool>("TrackerConfigurationFromDB");
  edm::Service<edm::RandomNumberGenerator> rng;
  if ( ! rng.isAvailable()) {
    throw cms::Exception("Configuration")
      << "DigiSimLinkProducer requires the RandomNumberGeneratorService\n"
      "which is not present in the configuration file.  You must add the service\n"
      "in the configuration file or remove the modules that require it.";
  }
  
  rndEngine       = &(rng->getEngine());
  zeroSuppression = conf_.getParameter<bool>("ZeroSuppression");
  theDigiAlgo = new DigiSimLinkAlgorithm(conf_,(*rndEngine));

}
DigiSimLinkProducer::~DigiSimLinkProducer ( ) [virtual]

Definition at line 89 of file DigiSimLinkProducer.cc.

References theDigiAlgo.

                                          { 
  delete theDigiAlgo;
}  

Member Function Documentation

void DigiSimLinkProducer::produce ( edm::Event &  e,
const edm::EventSetup &  c 
) [virtual]

Definition at line 94 of file DigiSimLinkProducer.cc.

References conf_, geometryType, linker::i, DigiSimLinkAlgorithm::make_link(), DigiSimLinkAlgorithm::run(), DigiSimLinkAlgorithm::setParticleDataTable(), SimHitMap, SimHitSelectorFromDB_, theDetIdList, theDigiAlgo, theDigiLinkVector, theDigiVector, theRawDigiVector, trackerContainers, useConfFromDB, and zeroSuppression.

{
  // Step A: Get Inputs
  edm::ESHandle < ParticleDataTable > pdt;
  iSetup.getData( pdt );

  if(useConfFromDB){
    edm::ESHandle<SiStripDetCabling> detCabling;
    iSetup.get<SiStripDetCablingRcd>().get( detCabling );
    detCabling->addConnected(theDetIdList);
  }

  edm::Handle<CrossingFrame<PSimHit> > cf_simhit;
  std::vector<const CrossingFrame<PSimHit> *> cf_simhitvec;
  for(uint32_t i = 0; i< trackerContainers.size();i++){
    iEvent.getByLabel("mix",trackerContainers[i],cf_simhit);
    cf_simhitvec.push_back(cf_simhit.product());
  }

  std::auto_ptr<MixCollection<PSimHit> > allTrackerHits(new MixCollection<PSimHit>(cf_simhitvec));
  
  //Loop on PSimHit
  SimHitMap.clear();
  
  //inside SimHitSelectorFromDb add the counter information from the original allhits collection 
  std::vector<std::pair<const PSimHit*,int> > trackerHits(SimHitSelectorFromDB_.getSimHit(allTrackerHits,theDetIdList));
  std::vector<std::pair<const PSimHit*,int> >::iterator isim;
  for (isim=trackerHits.begin() ; isim!= trackerHits.end();isim++) {
    //make a pair = <*isim, counter> and save also position in the vector for DigiSimLink
    SimHitMap[((*isim).first)->detUnitId()].push_back(*isim);
  }
  
  edm::ESHandle<TrackerGeometry> pDD;
  iSetup.get<TrackerDigiGeometryRecord>().get(geometryType,pDD);
  
  edm::ESHandle<MagneticField> pSetup;
  iSetup.get<IdealMagneticFieldRecord>().get(pSetup);
  
  //get gain noise pedestal lorentzAngle from ES handle
  edm::ESHandle<SiStripLorentzAngle> lorentzAngleHandle;
  edm::ESHandle<SiStripGain> gainHandle;
  edm::ESHandle<SiStripNoises> noiseHandle;
  edm::ESHandle<SiStripThreshold> thresholdHandle;
  edm::ESHandle<SiStripPedestals> pedestalHandle;
  edm::ESHandle<SiStripBadStrip> deadChannelHandle;
  std::string LAname = conf_.getParameter<std::string>("LorentzAngle");
  iSetup.get<SiStripLorentzAngleSimRcd>().get(LAname,lorentzAngleHandle);
  std::string gainLabel = conf_.getParameter<std::string>("Gain");
  iSetup.get<SiStripGainSimRcd>().get(gainLabel,gainHandle);
  iSetup.get<SiStripNoisesRcd>().get(noiseHandle);
  iSetup.get<SiStripThresholdRcd>().get(thresholdHandle);
  iSetup.get<SiStripPedestalsRcd>().get(pedestalHandle);
  iSetup.get<SiStripBadChannelRcd>().get(deadChannelHandle);

  //Retrieve tracker topology from geometry
  edm::ESHandle<TrackerTopology> tTopoHand;
  iSetup.get<IdealGeometryRecord>().get(tTopoHand);
  const TrackerTopology *tTopo=tTopoHand.product();

  theDigiAlgo->setParticleDataTable(&*pdt);

  // Step B: LOOP on StripGeomDetUnit
  theDigiVector.reserve(10000);
  theDigiVector.clear();
  theDigiLinkVector.reserve(10000);
  theDigiLinkVector.clear();

  for(TrackingGeometry::DetUnitContainer::const_iterator iu = pDD->detUnits().begin(); iu != pDD->detUnits().end(); iu ++){
    if(useConfFromDB){
      //apply the cable map _before_ digitization: consider only the detis that are connected 
      if(theDetIdList.find((*iu)->geographicalId().rawId())==theDetIdList.end())
        continue;
    }
    GlobalVector bfield=pSetup->inTesla((*iu)->surface().position());
    StripGeomDetUnit* sgd = dynamic_cast<StripGeomDetUnit*>((*iu));
    if (sgd != 0){
      edm::DetSet<SiStripDigi> collectorZS((*iu)->geographicalId().rawId());
      edm::DetSet<SiStripRawDigi> collectorRaw((*iu)->geographicalId().rawId());
      edm::DetSet<StripDigiSimLink> linkcollector((*iu)->geographicalId().rawId());
      float langle = (lorentzAngleHandle.isValid()) ? lorentzAngleHandle->getLorentzAngle((*iu)->geographicalId().rawId()) : 0.;
      theDigiAlgo->run(collectorZS,collectorRaw,SimHitMap[(*iu)->geographicalId().rawId()],sgd,bfield,langle,
                       gainHandle,thresholdHandle,noiseHandle,pedestalHandle, deadChannelHandle, tTopo);
      if(zeroSuppression){
        if(collectorZS.data.size()>0){
          theDigiVector.push_back(collectorZS);
          if(SimHitMap[(*iu)->geographicalId().rawId()].size()>0){
            linkcollector.data = theDigiAlgo->make_link();
            if(linkcollector.data.size()>0)
              theDigiLinkVector.push_back(linkcollector);
          }
        }
      }else{
        if(collectorRaw.data.size()>0){
          theRawDigiVector.push_back(collectorRaw);
          if(SimHitMap[(*iu)->geographicalId().rawId()].size()>0){
            linkcollector.data = theDigiAlgo->make_link();
            if(linkcollector.data.size()>0)
              theDigiLinkVector.push_back(linkcollector);
          }
        }
      }
    }
  }

  // Step C: create output collection
  std::auto_ptr<edm::DetSetVector<StripDigiSimLink> > outputlink(new edm::DetSetVector<StripDigiSimLink>(theDigiLinkVector));
  // Step D: write output to file
  iEvent.put(outputlink);
}

Member Data Documentation

std::string DigiSimLinkProducer::alias [private]

Definition at line 62 of file DigiSimLinkProducer.h.

Referenced by DigiSimLinkProducer().

edm::ParameterSet DigiSimLinkProducer::conf_ [private]

Definition at line 56 of file DigiSimLinkProducer.h.

Referenced by DigiSimLinkProducer(), and produce().

std::string DigiSimLinkProducer::geometryType [private]

Definition at line 61 of file DigiSimLinkProducer.h.

Referenced by DigiSimLinkProducer(), and produce().

Definition at line 59 of file DigiSimLinkProducer.h.

CLHEP::HepRandomEngine* DigiSimLinkProducer::rndEngine [private]

Definition at line 60 of file DigiSimLinkProducer.h.

Referenced by DigiSimLinkProducer().

Definition at line 58 of file DigiSimLinkProducer.h.

Referenced by produce().

SimHitSelectorFromDB DigiSimLinkProducer::SimHitSelectorFromDB_ [private]

Definition at line 52 of file DigiSimLinkProducer.h.

Referenced by produce().

std::map<uint32_t, std::vector<int> > DigiSimLinkProducer::theDetIdList [private]

Definition at line 51 of file DigiSimLinkProducer.h.

Referenced by produce().

Definition at line 49 of file DigiSimLinkProducer.h.

Referenced by DigiSimLinkProducer(), produce(), and ~DigiSimLinkProducer().

std::vector<edm::DetSet<StripDigiSimLink> > DigiSimLinkProducer::theDigiLinkVector [private]

Definition at line 55 of file DigiSimLinkProducer.h.

Referenced by produce().

std::vector<edm::DetSet<SiStripDigi> > DigiSimLinkProducer::theDigiVector [private]

Definition at line 53 of file DigiSimLinkProducer.h.

Referenced by produce().

std::vector<edm::DetSet<SiStripRawDigi> > DigiSimLinkProducer::theRawDigiVector [private]

Definition at line 54 of file DigiSimLinkProducer.h.

Referenced by produce().

SiStripFedZeroSuppression* DigiSimLinkProducer::theSiFEDZeroSuppress [private]

Definition at line 50 of file DigiSimLinkProducer.h.

Definition at line 57 of file DigiSimLinkProducer.h.

Referenced by DigiSimLinkProducer(), and produce().

Definition at line 64 of file DigiSimLinkProducer.h.

Referenced by DigiSimLinkProducer(), and produce().

Definition at line 63 of file DigiSimLinkProducer.h.

Referenced by DigiSimLinkProducer(), and produce().