CMS 3D CMS Logo

Public Member Functions | Private Attributes

cms::SiPixelClusterProducer Class Reference

#include <SiPixelClusterProducer.h>

Inheritance diagram for cms::SiPixelClusterProducer:
edm::EDProducer edm::ProducerBase edm::ProductRegistryHelper

List of all members.

Public Member Functions

virtual void beginJob ()
virtual void produce (edm::Event &e, const edm::EventSetup &c)
 The "Event" entrypoint: gets called by framework for every event.
void run (const edm::DetSetVector< PixelDigi > &input, edm::ESHandle< TrackerGeometry > &geom, edmNew::DetSetVector< SiPixelCluster > &output)
 Iterate over DetUnits, and invoke the PixelClusterizer on each.
void setupClusterizer ()
 SiPixelClusterProducer (const edm::ParameterSet &conf)
 Constructor: set the ParameterSet and defer all thinking to setupClusterizer().
virtual ~SiPixelClusterProducer ()

Private Attributes

PixelClusterizerBaseclusterizer_
std::string clusterMode_
edm::ParameterSet conf_
int32_t maxTotalClusters_
 Optional limit on the total number of clusters.
bool readyToCluster_
edm::InputTag src_
SiPixelGainCalibrationServiceBasetheSiPixelGainCalibration_

Detailed Description

Definition at line 57 of file SiPixelClusterProducer.h.


Constructor & Destructor Documentation

SiPixelClusterProducer::SiPixelClusterProducer ( const edm::ParameterSet conf) [explicit]

Constructor: set the ParameterSet and defer all thinking to setupClusterizer().

Definition at line 51 of file SiPixelClusterProducer.cc.

References edm::ParameterSet::getParameter(), setupClusterizer(), and theSiPixelGainCalibration_.

    : 
    conf_(conf),
    theSiPixelGainCalibration_(0), 
    clusterMode_("None"),     // bogus
    clusterizer_(0),          // the default, in case we fail to make one
    readyToCluster_(false),   // since we obviously aren't
    src_( conf.getParameter<edm::InputTag>( "src" ) ),
    maxTotalClusters_( conf.getParameter<int32_t>( "maxNumberOfClusters" ) )
  {
    //--- Declare to the EDM what kind of collections we will be making.
    produces<SiPixelClusterCollectionNew>(); 

    std::string payloadType = conf.getParameter<std::string>( "payloadType" );

    if (strcmp(payloadType.c_str(), "HLT") == 0)
       theSiPixelGainCalibration_ = new SiPixelGainCalibrationForHLTService(conf);
    else if (strcmp(payloadType.c_str(), "Offline") == 0)
       theSiPixelGainCalibration_ = new SiPixelGainCalibrationOfflineService(conf);
    else if (strcmp(payloadType.c_str(), "Full") == 0)
       theSiPixelGainCalibration_ = new SiPixelGainCalibrationService(conf);

    //--- Make the algorithm(s) according to what the user specified
    //--- in the ParameterSet.
    setupClusterizer();

  }
SiPixelClusterProducer::~SiPixelClusterProducer ( ) [virtual]

Definition at line 80 of file SiPixelClusterProducer.cc.

References clusterizer_, and theSiPixelGainCalibration_.


Member Function Documentation

void SiPixelClusterProducer::beginJob ( void  ) [virtual]
void SiPixelClusterProducer::produce ( edm::Event e,
const edm::EventSetup c 
) [virtual]

The "Event" entrypoint: gets called by framework for every event.

Implements edm::EDProducer.

Definition at line 95 of file SiPixelClusterProducer.cc.

References relativeConstraints::geom, edm::EventSetup::get(), edm::Event::getByLabel(), collect_tpl::input, convertSQLitetoXML_cfg::output, edm::Event::put(), run(), SiPixelGainCalibrationServiceBase::setESObjects(), src_, and theSiPixelGainCalibration_.

  {

    //Setup gain calibration service
    theSiPixelGainCalibration_->setESObjects( es );

   // Step A.1: get input data
    //edm::Handle<PixelDigiCollection> pixDigis;
    edm::Handle< edm::DetSetVector<PixelDigi> >  input;
    e.getByLabel( src_, input);

    // Step A.2: get event setup
    edm::ESHandle<TrackerGeometry> geom;
    es.get<TrackerDigiGeometryRecord>().get( geom );

    // Step B: create the final output collection
    std::auto_ptr<SiPixelClusterCollectionNew> output( new SiPixelClusterCollectionNew() );
    //FIXME: put a reserve() here

    // Step C: Iterate over DetIds and invoke the pixel clusterizer algorithm
    // on each DetUnit
    run(*input, geom, *output );

    // Step D: write output to file
    e.put( output );

  }
void SiPixelClusterProducer::run ( const edm::DetSetVector< PixelDigi > &  input,
edm::ESHandle< TrackerGeometry > &  geom,
edmNew::DetSetVector< SiPixelCluster > &  output 
)

Iterate over DetUnits, and invoke the PixelClusterizer on each.

Definition at line 148 of file SiPixelClusterProducer.cc.

References edm::DetSetVector< T >::begin(), PixelClusterizerBase::clusterizeDetUnit(), clusterizer_, relativeConstraints::empty, edm::DetSetVector< T >::end(), maxTotalClusters_, readyToCluster_, and edmNew::DetSetVector< T >::swap().

Referenced by produce().

                                                                                {
    if ( ! readyToCluster_ ) {
      edm::LogError("SiPixelClusterProducer")
                <<" at least one clusterizer is not ready -- can't run!" ;
      // TO DO: throw an exception here?  The user may want to know...
      return;   // clusterizer is invalid, bail out
    }

    int numberOfDetUnits = 0;
    int numberOfClusters = 0;
 
    // Iterate on detector units
    edm::DetSetVector<PixelDigi>::const_iterator DSViter = input.begin();
    for( ; DSViter != input.end(); DSViter++) {
      ++numberOfDetUnits;

      //  LogDebug takes very long time, get rid off.
      //LogDebug("SiStripClusterizer") << "[SiPixelClusterProducer::run] DetID" << DSViter->id;

      std::vector<short> badChannels; 
      DetId detIdObject(DSViter->detId());
      
      // Comment: At the moment the clusterizer depends on geometry
      // to access information as the pixel topology (number of columns
      // and rows in a detector module). 
      // In the future the geometry service will be replaced with
      // a ES service.
      const GeomDetUnit      * geoUnit = geom->idToDetUnit( detIdObject );
      const PixelGeomDetUnit * pixDet  = dynamic_cast<const PixelGeomDetUnit*>(geoUnit);
      if (! pixDet) {
        // Fatal error!  TO DO: throw an exception!
        assert(0);
      }
      // Produce clusters for this DetUnit and store them in 
      // a DetSet
      edmNew::DetSetVector<SiPixelCluster>::FastFiller spc(output, DSViter->detId());
      clusterizer_->clusterizeDetUnit(*DSViter, pixDet, badChannels, spc);
      if ( spc.empty() ) {
        spc.abort();
      } else {
        numberOfClusters += spc.size();
      }

      if ((maxTotalClusters_ >= 0) && (numberOfClusters > maxTotalClusters_)) {
        edm::LogError("TooManyClusters") <<  "Limit on the number of clusters exceeded. An empty cluster collection will be produced instead.\n";
        edmNew::DetSetVector<SiPixelCluster> empty;
        empty.swap(output);
        break;
      }
    } // end of DetUnit loop
    
    //LogDebug ("SiPixelClusterProducer") << " Executing " 
    //      << clusterMode_ << " resulted in " << numberOfClusters
    //                              << " SiPixelClusters in " << numberOfDetUnits << " DetUnits."; 
  }
void SiPixelClusterProducer::setupClusterizer ( )

Set up the specific algorithm we are going to use. TO DO: in the future, we should allow for a different algorithm for each detector subset (e.g. barrel vs forward, per layer, etc).

Definition at line 128 of file SiPixelClusterProducer.cc.

References clusterizer_, clusterMode_, conf_, edm::ParameterSet::getUntrackedParameter(), and readyToCluster_.

Referenced by SiPixelClusterProducer().

                                                 {
    clusterMode_ = 
      conf_.getUntrackedParameter<std::string>("ClusterMode","PixelThresholdClusterizer");

    if ( clusterMode_ == "PixelThresholdClusterizer" ) {
      clusterizer_ = new PixelThresholdClusterizer(conf_);
      readyToCluster_ = true;
    } 
    else {
      edm::LogError("SiPixelClusterProducer") << "[SiPixelClusterProducer]:"
                <<" choice " << clusterMode_ << " is invalid.\n"
                << "Possible choices:\n" 
                << "    PixelThresholdClusterizer";
      readyToCluster_ = false;
    }
  }

Member Data Documentation

Definition at line 82 of file SiPixelClusterProducer.h.

Referenced by beginJob(), run(), setupClusterizer(), and ~SiPixelClusterProducer().

Definition at line 81 of file SiPixelClusterProducer.h.

Referenced by setupClusterizer().

Definition at line 78 of file SiPixelClusterProducer.h.

Referenced by setupClusterizer().

Optional limit on the total number of clusters.

Definition at line 87 of file SiPixelClusterProducer.h.

Referenced by run().

Definition at line 83 of file SiPixelClusterProducer.h.

Referenced by run(), and setupClusterizer().

Definition at line 84 of file SiPixelClusterProducer.h.

Referenced by produce().