Go to the documentation of this file.00001
00011 #include "RecoLocalCalo/EcalRecProducers/plugins/EcalTPSkimmer.h"
00012
00013 #include "DataFormats/Common/interface/Handle.h"
00014 #include "FWCore/Framework/interface/ESHandle.h"
00015
00016 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00017
00018 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00019 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00020 #include "DataFormats/EcalDetId/interface/EcalTrigTowerDetId.h"
00021
00022 #include "CondFormats/DataRecord/interface/EcalChannelStatusRcd.h"
00023 #include "CondFormats/EcalObjects/interface/EcalChannelStatus.h"
00024
00025 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00026
00027 EcalTPSkimmer::EcalTPSkimmer(const edm::ParameterSet& ps)
00028 {
00029 skipModule_ = ps.getParameter<bool>("skipModule");
00030
00031 doBarrel_ = ps.getParameter<bool>("doBarrel");
00032 doEndcap_ = ps.getParameter<bool>("doEndcap");
00033
00034 chStatusToSelectTP_ = ps.getParameter<std::vector<uint32_t> >("chStatusToSelectTP");
00035
00036 tpOutputCollection_ = ps.getParameter<std::string>("tpOutputCollection");
00037 tpInputCollection_ = ps.getParameter<edm::InputTag>("tpInputCollection");
00038
00039 produces< EcalTrigPrimDigiCollection >(tpOutputCollection_);
00040 }
00041
00042 EcalTPSkimmer::~EcalTPSkimmer()
00043 {
00044 }
00045
00046 void
00047 EcalTPSkimmer::produce(edm::Event& evt, const edm::EventSetup& es)
00048 {
00049 insertedTP_.clear();
00050
00051 using namespace edm;
00052
00053 es.get<IdealGeometryRecord>().get(ttMap_);
00054
00055
00056 std::auto_ptr< EcalTrigPrimDigiCollection > tpOut( new EcalTrigPrimDigiCollection );
00057
00058 if ( skipModule_ ) {
00059 evt.put( tpOut, tpOutputCollection_ );
00060 return;
00061 }
00062
00063 edm::ESHandle<EcalChannelStatus> chStatus;
00064 es.get<EcalChannelStatusRcd>().get(chStatus);
00065
00066 edm::Handle<EcalTrigPrimDigiCollection> tpIn;
00067 evt.getByLabel(tpInputCollection_, tpIn);
00068
00069 if ( ! tpIn.isValid() ) {
00070 edm::LogError("EcalTPSkimmer") << "Can't get the product " << tpInputCollection_.instance()
00071 << " with label " << tpInputCollection_.label();
00072 return;
00073 }
00074
00075 if ( doBarrel_ ) {
00076 EcalChannelStatusMap::const_iterator chit;
00077 uint16_t code = 0;
00078 for ( int i = 0; i < EBDetId::kSizeForDenseIndexing; ++i )
00079 {
00080 if ( ! EBDetId::validDenseIndex( i ) ) continue;
00081 EBDetId id = EBDetId::detIdFromDenseIndex( i );
00082 chit = chStatus->find( id );
00083
00084 if ( chit != chStatus->end() ) {
00085 code = (*chit).getStatusCode() & 0x001F;
00086 if ( std::find( chStatusToSelectTP_.begin(), chStatusToSelectTP_.end(), code ) != chStatusToSelectTP_.end() ) {
00087
00088 EcalTrigTowerDetId ttDetId( ((EBDetId)id).tower() );
00089
00090 if ( ! alreadyInserted( ttDetId ) ) insertTP( ttDetId, tpIn, *tpOut );
00091 }
00092 } else {
00093 edm::LogError("EcalDetIdToBeRecoveredProducer") << "No channel status found for xtal "
00094 << id.rawId()
00095 << "! something wrong with EcalChannelStatus in your DB? ";
00096 }
00097 }
00098 }
00099
00100 if ( doEndcap_ ) {
00101 EcalChannelStatusMap::const_iterator chit;
00102 uint16_t code = 0;
00103 for ( int i = 0; i < EEDetId::kSizeForDenseIndexing; ++i )
00104 {
00105 if ( ! EEDetId::validDenseIndex( i ) ) continue;
00106 EEDetId id = EEDetId::detIdFromDenseIndex( i );
00107 chit = chStatus->find( id );
00108
00109 if ( chit != chStatus->end() ) {
00110 code = (*chit).getStatusCode() & 0x001F;
00111 if ( std::find( chStatusToSelectTP_.begin(), chStatusToSelectTP_.end(), code ) != chStatusToSelectTP_.end() ) {
00112
00113 EcalTrigTowerDetId ttDetId = ttMap_->towerOf( id );
00114
00115 if ( ! alreadyInserted( ttDetId ) ) insertTP( ttDetId, tpIn, *tpOut );
00116 }
00117 } else {
00118 edm::LogError("EcalDetIdToBeRecoveredProducer") << "No channel status found for xtal "
00119 << id.rawId()
00120 << "! something wrong with EcalChannelStatus in your DB? ";
00121 }
00122 }
00123 }
00124
00125
00126 LogInfo("EcalTPSkimmer") << "total # of TP inserted: " << tpOut->size();
00127
00128 evt.put( tpOut, tpOutputCollection_ );
00129 }
00130
00131
00132 bool EcalTPSkimmer::alreadyInserted( EcalTrigTowerDetId ttId )
00133 {
00134 return ( insertedTP_.find( ttId ) != insertedTP_.end() );
00135 }
00136
00137
00138 void EcalTPSkimmer::insertTP( EcalTrigTowerDetId ttId, edm::Handle<EcalTrigPrimDigiCollection> &tpIn, EcalTrigPrimDigiCollection &tpOut )
00139 {
00140 EcalTrigPrimDigiCollection::const_iterator tpIt = tpIn->find( ttId );
00141 if ( tpIt != tpIn->end() ) {
00142 tpOut.push_back( *tpIt );
00143 insertedTP_.insert( ttId );
00144 }
00145 }
00146
00147
00148 #include "FWCore/Framework/interface/MakerMacros.h"
00149 DEFINE_FWK_MODULE( EcalTPSkimmer );
00150