Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #include "FWCore/Framework/interface/EventSetup.h"
00007
00008 #include <memory>
00009
00010
00011 #include "FWCore/Framework/interface/Frameworkfwd.h"
00012 #include "FWCore/Framework/interface/EDProducer.h"
00013 #include "FWCore/Framework/interface/Event.h"
00014 #include "FWCore/Framework/interface/ESHandle.h"
00015 #include "FWCore/Framework/interface/MakerMacros.h"
00016 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00017
00018
00019 #include "SimDataFormats/SLHC/interface/L1CaloTriggerSetup.h"
00020 #include "SimDataFormats/SLHC/interface/L1CaloTriggerSetupRcd.h"
00021
00022 #include "SimDataFormats/SLHC/interface/L1CaloTower.h"
00023 #include "SimDataFormats/SLHC/interface/L1CaloTowerFwd.h"
00024
00025 #include <algorithm>
00026 #include <string>
00027
00028
00029 class L1RingSubtractionProducer:public edm::EDProducer
00030 {
00031 public:
00032 explicit L1RingSubtractionProducer( const edm::ParameterSet & );
00033 ~L1RingSubtractionProducer( );
00034
00035 private:
00036
00037 virtual void produce( edm::Event &, const edm::EventSetup & );
00038 virtual void endJob( );
00039
00040 edm::ESHandle < L1CaloTriggerSetup > mCaloTriggerSetup;
00041
00042 edm::InputTag mInputCollectionTag;
00043 edm::Handle < l1slhc::L1CaloTowerCollection > mInputCollection;
00044 std::auto_ptr < l1slhc::L1CaloTowerCollection > mOutputCollection;
00045
00046
00047 double getEcalConstant( int& iEta );
00048 double getHcalConstant( int& iEta );
00049
00050
00051 enum{
00052 constant,
00053 mean,
00054 median
00055 }
00056 mRingSubtractionType;
00057
00058
00059 };
00060
00061
00062
00063
00064 L1RingSubtractionProducer::L1RingSubtractionProducer( const edm::ParameterSet & aConfig ):
00065 mInputCollectionTag( aConfig.getParameter < edm::InputTag > ( "src" ) ),
00066 mOutputCollection( NULL )
00067 {
00068
00069 std::string lRingSubtractionType = aConfig.getParameter< std::string >("RingSubtractionType");
00070 std::transform( lRingSubtractionType.begin() , lRingSubtractionType.end() , lRingSubtractionType.begin() , ::toupper );
00071
00072 if( lRingSubtractionType == "MEAN" ){
00073 mRingSubtractionType = mean;
00074 }else if( lRingSubtractionType == "MEDIAN" ){
00075 mRingSubtractionType = median;
00076 }else{
00077 mRingSubtractionType = constant;
00078 }
00079
00080
00081 produces < l1slhc::L1CaloTowerCollection > ( );
00082 }
00083
00084
00085 L1RingSubtractionProducer::~L1RingSubtractionProducer( )
00086 {}
00087
00088
00089
00090
00091
00092 void L1RingSubtractionProducer::produce( edm::Event & aEvent,
00093 const edm::EventSetup & aSetup )
00094 {
00095
00096 if( mRingSubtractionType == constant ){
00097 std::cout << "!!! WARNING !!! Constant ring subtraction is yet not implemented. A constant of 0 will be assumed !!! WARNING !!!\n" << std::endl;
00098 }
00099
00100 aSetup.get < L1CaloTriggerSetupRcd > ( ).get( mCaloTriggerSetup );
00101
00102 aEvent.getByLabel( mInputCollectionTag, mInputCollection );
00103
00104
00105 mOutputCollection = std::auto_ptr < l1slhc::L1CaloTowerCollection > ( new l1slhc::L1CaloTowerCollection );
00106
00107 if( mRingSubtractionType == mean ){
00108
00109 std::map< int , double > lMeanEcal , lMeanHcal;
00110
00111 for( l1slhc::L1CaloTowerCollection::const_iterator lInputIt = mInputCollection->begin() ; lInputIt != mInputCollection->end() ; ++lInputIt ){
00112 lMeanEcal[ lInputIt->iEta() ] += double(lInputIt->E());
00113 lMeanHcal[ lInputIt->iEta() ] += double(lInputIt->H());
00114 }
00115
00116
00117 for( std::map< int , double >::iterator lIt = lMeanEcal.begin() ; lIt != lMeanEcal.end() ; ++lIt ){
00118 lIt->second /= 72;
00119 }
00120
00121
00122 for( std::map< int , double >::iterator lIt = lMeanHcal.begin() ; lIt != lMeanHcal.end() ; ++lIt ){
00123 lIt->second /= 72;
00124 }
00125
00126 for( l1slhc::L1CaloTowerCollection::const_iterator lInputIt = mInputCollection->begin() ; lInputIt != mInputCollection->end() ; ++lInputIt ){
00127 int lEta = lInputIt->iEta();
00128 int lPhi = lInputIt->iPhi();
00129
00130 int lEcal = int( double(lInputIt->E()) - lMeanEcal[ lEta ] );
00131 int lHcal = int( double(lInputIt->H()) - lMeanHcal[ lEta ] );
00132
00133 l1slhc::L1CaloTower lCaloTower( lEta , lPhi );
00134 lCaloTower.setEcal( lEcal , lInputIt->EcalFG() );
00135 lCaloTower.setHcal( lHcal , lInputIt->HcalFG() );
00136
00137 mOutputCollection->insert( lEta , lPhi , lCaloTower );
00138 }
00139
00140
00141 } else if( mRingSubtractionType == median ){
00142
00143 std::map< int , std::deque<int> > lEcals , lHcals;
00144
00145 for( l1slhc::L1CaloTowerCollection::const_iterator lInputIt = mInputCollection->begin() ; lInputIt != mInputCollection->end() ; ++lInputIt ){
00146 lEcals[ lInputIt->iEta() ].push_back( lInputIt->E() );
00147 lHcals[ lInputIt->iEta() ].push_back( lInputIt->H() );
00148
00149
00150
00151 }
00152
00153 std::map< int , double > lMedianEcal , lMedianHcal;
00154
00155
00156 for( std::map< int , std::deque<int> >::iterator lIt = lEcals.begin() ; lIt != lEcals.end() ; ++lIt ){
00157 lIt->second.resize( 72 , 0 );
00158 std::sort( lIt->second.begin() , lIt->second.end() );
00159 lMedianEcal[ lIt->first ] = (lIt->second.at( 35 ) + lIt->second.at( 36 )) / 2.0;
00160 }
00161
00162
00163
00164 for( std::map< int , std::deque<int> >::iterator lIt = lHcals.begin() ; lIt != lHcals.end() ; ++lIt ){
00165 lIt->second.resize( 72 , 0 );
00166 std::sort( lIt->second.begin() , lIt->second.end() );
00167 lMedianHcal[ lIt->first ] = (lIt->second.at( 35 ) + lIt->second.at( 36 )) / 2.0;
00168
00169 }
00170
00171
00172 for( l1slhc::L1CaloTowerCollection::const_iterator lInputIt = mInputCollection->begin() ; lInputIt != mInputCollection->end() ; ++lInputIt ){
00173 int lEta = lInputIt->iEta();
00174 int lPhi = lInputIt->iPhi();
00175
00176 int lEcal = int( double(lInputIt->E()) - lMedianEcal[ lEta ] );
00177 int lHcal = int( double(lInputIt->H()) - lMedianHcal[ lEta ] );
00178
00179 l1slhc::L1CaloTower lCaloTower( lEta , lPhi );
00180 lCaloTower.setEcal( lEcal , lInputIt->EcalFG() );
00181 lCaloTower.setHcal( lHcal , lInputIt->HcalFG() );
00182
00183 mOutputCollection->insert( lEta , lPhi , lCaloTower );
00184 }
00185
00186 }else{
00187
00188
00189 for( l1slhc::L1CaloTowerCollection::const_iterator lInputIt = mInputCollection->begin() ; lInputIt != mInputCollection->end() ; ++lInputIt ){
00190 int lEta = lInputIt->iEta();
00191 int lPhi = lInputIt->iPhi();
00192
00193 int lEcal = int( double(lInputIt->E()) - getEcalConstant( lEta ) );
00194 int lHcal = int( double(lInputIt->H()) - getHcalConstant( lEta ) );
00195
00196 l1slhc::L1CaloTower lCaloTower( lEta , lPhi );
00197 lCaloTower.setEcal( lEcal , lInputIt->EcalFG() );
00198 lCaloTower.setHcal( lHcal , lInputIt->HcalFG() );
00199
00200 mOutputCollection->insert( lEta , lPhi , lCaloTower );
00201 }
00202
00203
00204 }
00205
00206
00207
00208
00209
00210
00211 aEvent.put( mOutputCollection );
00212 }
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224 double L1RingSubtractionProducer::getEcalConstant( int& iEta ){
00225
00226
00227 return 0;
00228 }
00229
00230
00231 double L1RingSubtractionProducer::getHcalConstant( int& iEta ){
00232
00233
00234 return 0;
00235 }
00236
00237
00238
00239
00240
00241
00242 void L1RingSubtractionProducer::endJob( )
00243 {
00244 }
00245
00246
00247 DEFINE_EDM_PLUGIN( edm::MakerPluginFactory,
00248 edm::WorkerMaker < L1RingSubtractionProducer >,
00249 "L1RingSubtractionProducer" );
00250 DEFINE_FWK_PSET_DESC_FILLER( L1RingSubtractionProducer );