Go to the documentation of this file.00001 #include "Calibration/EcalAlCaRecoProducers/interface/AlCaElectronsProducer.h"
00002 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
00003 #include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
00004 #include "DataFormats/EgammaCandidates/interface/SiStripElectron.h"
00005 #include "DataFormats/EgammaCandidates/interface/Electron.h"
00006 #include "DataFormats/EgammaCandidates/interface/ElectronFwd.h"
00007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00008 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00009 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
00010 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00011 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00012 #include "DataFormats/EcalDetId/interface/ESDetId.h"
00013 #include "DataFormats/EgammaReco/interface/BasicCluster.h"
00014 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
00015 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00016 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
00017 #include "Geometry/EcalAlgo/interface/EcalPreshowerGeometry.h"
00018 #include "Geometry/CaloTopology/interface/EcalPreshowerTopology.h"
00019 #include "Geometry/Records/interface/CaloGeometryRecord.h"
00020 #include "FWCore/Framework/interface/ESHandle.h"
00021
00022 AlCaElectronsProducer::AlCaElectronsProducer(const edm::ParameterSet& iConfig)
00023 {
00024
00025 ebRecHitsLabel_ = iConfig.getParameter< edm::InputTag > ("ebRecHitsLabel");
00026 eeRecHitsLabel_ = iConfig.getParameter< edm::InputTag > ("eeRecHitsLabel");
00027 esRecHitsLabel_ = iConfig.getParameter< edm::InputTag > ("esRecHitsLabel");
00028 electronLabel_ = iConfig.getParameter< edm::InputTag > ("electronLabel");
00029
00030 alcaBarrelHitsCollection_ = iConfig.getParameter<std::string>("alcaBarrelHitCollection");
00031 alcaEndcapHitsCollection_ = iConfig.getParameter<std::string>("alcaEndcapHitCollection");
00032 alcaPreshowerHitsCollection_ = iConfig.getParameter<std::string>("alcaPreshowerHitCollection");
00033
00034 etaSize_ = iConfig.getParameter<int> ("etaSize");
00035 phiSize_ = iConfig.getParameter<int> ("phiSize");
00036 if ( phiSize_ % 2 == 0 || etaSize_ % 2 == 0)
00037 edm::LogError("AlCaElectronsProducerError") << "Size of eta/phi should be odd numbers";
00038
00039 weight_= iConfig.getParameter<double> ("eventWeight");
00040
00041 esNstrips_ = iConfig.getParameter<int> ("esNstrips");
00042 esNcolumns_ = iConfig.getParameter<int> ("esNcolumns");
00043
00044
00045 produces< EBRecHitCollection > (alcaBarrelHitsCollection_) ;
00046 produces< EERecHitCollection > (alcaEndcapHitsCollection_) ;
00047 produces< ESRecHitCollection > (alcaPreshowerHitsCollection_) ;
00048 produces< double > ("weight") ;
00049 }
00050
00051
00052 AlCaElectronsProducer::~AlCaElectronsProducer()
00053 {}
00054
00055
00056
00057 void
00058 AlCaElectronsProducer::produce (edm::Event& iEvent,
00059 const edm::EventSetup& iSetup)
00060 {
00061 using namespace edm;
00062 using namespace std;
00063
00064
00065 ESHandle<CaloGeometry> geoHandle;
00066 iSetup.get<CaloGeometryRecord>().get(geoHandle);
00067
00068 const CaloSubdetectorGeometry *geometry = geoHandle->getSubdetectorGeometry(DetId::Ecal, EcalPreshower);
00069 const CaloSubdetectorGeometry *& geometry_p = geometry;
00070
00071
00072 Handle<reco::GsfElectronCollection> pElectrons;
00073 iEvent.getByLabel(electronLabel_, pElectrons);
00074 if (!pElectrons.isValid()) {
00075 edm::LogError ("reading") << electronLabel_ << " not found" ;
00076
00077 return ;
00078 }
00079
00080 const reco::GsfElectronCollection * electronCollection =
00081 pElectrons.product();
00082
00083
00084 Handle<EBRecHitCollection> barrelRecHitsHandle;
00085 bool barrelIsFull = true ;
00086
00087 iEvent.getByLabel(ebRecHitsLabel_,barrelRecHitsHandle);
00088 if (!barrelRecHitsHandle.isValid()) {
00089 edm::LogError ("reading") << ebRecHitsLabel_ << " not found" ;
00090 barrelIsFull = false ;
00091 }
00092
00093 const EBRecHitCollection * barrelHitsCollection = 0 ;
00094 if (barrelIsFull)
00095 barrelHitsCollection = barrelRecHitsHandle.product () ;
00096
00097
00098 Handle<EERecHitCollection> endcapRecHitsHandle;
00099 bool endcapIsFull = true ;
00100
00101 iEvent.getByLabel(eeRecHitsLabel_,endcapRecHitsHandle);
00102 if (!endcapRecHitsHandle.isValid()) {
00103 edm::LogError ("reading") << eeRecHitsLabel_ << " not found" ;
00104 endcapIsFull = false ;
00105 }
00106
00107 const EERecHitCollection * endcapHitsCollection = 0 ;
00108 if (endcapIsFull)
00109 endcapHitsCollection = endcapRecHitsHandle.product () ;
00110
00111
00112
00113 Handle<ESRecHitCollection> preshowerRecHitsHandle;
00114 bool preshowerIsFull = true ;
00115
00116 iEvent.getByLabel(esRecHitsLabel_,preshowerRecHitsHandle);
00117 if (!preshowerRecHitsHandle.isValid()) {
00118 edm::LogError ("reading") << esRecHitsLabel_ << " not found" ;
00119 preshowerIsFull = false ;
00120 }
00121
00122 const ESRecHitCollection * preshowerHitsCollection = 0 ;
00123 if (preshowerIsFull)
00124 preshowerHitsCollection = preshowerRecHitsHandle.product () ;
00125
00126
00127 set<ESDetId> used_strips;
00128 used_strips.clear();
00129
00130
00131 std::auto_ptr< EBRecHitCollection > miniEBRecHitCollection (new EBRecHitCollection) ;
00132 std::auto_ptr< EERecHitCollection > miniEERecHitCollection (new EERecHitCollection) ;
00133 std::auto_ptr< ESRecHitCollection > miniESRecHitCollection (new ESRecHitCollection) ;
00134 std::auto_ptr< double > weight (new double(1));
00135 (*weight) = weight_;
00136
00137
00138
00139 reco::GsfElectronCollection::const_iterator eleIt;
00140 int ii=0;
00141
00142 for (eleIt=electronCollection->begin(); eleIt!=electronCollection->end(); eleIt++) {
00143
00144 if (fabs(eleIt->eta()) <= 1.479) {
00145
00146 ii++;
00147 const reco::SuperCluster& sc = *(eleIt->superCluster()) ;
00148
00149 int yy = 0;
00150 double currEnergy = 0.;
00151 EBDetId maxHit(0);
00152 std::vector<EBDetId> scXtals;
00153 scXtals.clear();
00154 const std::vector< std::pair<DetId, float> > & v1 = sc.hitsAndFractions();
00155
00156 for(std::vector< std::pair<DetId, float> >::const_iterator idsIt = v1.begin();
00157 idsIt != v1.end(); ++idsIt)
00158 {
00159 yy++;
00160
00161
00162 if((*idsIt).first.subdetId()!=EcalBarrel || (*idsIt).first.det()!= DetId::Ecal) continue;
00163
00164 if((barrelHitsCollection->find( (*idsIt).first ))->energy() > currEnergy) {
00165 currEnergy=(barrelHitsCollection->find( (*idsIt).first ))->energy();
00166 maxHit=(*idsIt).first;
00167 }
00168 miniEBRecHitCollection->push_back(*(barrelHitsCollection->find( (*idsIt).first )));
00169 scXtals.push_back( (*idsIt).first );
00170 }
00171
00172 if (!maxHit.null())
00173 for (int icry=0;icry< etaSize_*phiSize_;icry++)
00174 {
00175
00176 unsigned int row = icry / etaSize_;
00177 unsigned int column= icry % etaSize_;
00178 int curr_eta=maxHit.ieta() + column - (etaSize_/2);
00179 int curr_phi=maxHit.iphi() + row - (phiSize_/2);
00180
00181 if (curr_eta * maxHit.ieta() <= 0) {if (maxHit.ieta() > 0) curr_eta--; else curr_eta++; }
00182 if (curr_phi < 1) curr_phi += 360;
00183 if (curr_phi > 360) curr_phi -= 360;
00184 if (!(EBDetId::validDetId(curr_eta,curr_phi))) continue;
00185 EBDetId det = EBDetId(curr_eta,curr_phi,EBDetId::ETAPHIMODE);
00186 std::vector<EBDetId>::const_iterator usedIds;
00187
00188 bool HitAlreadyUsed=false;
00189 for(usedIds=scXtals.begin(); usedIds!=scXtals.end(); usedIds++)
00190 if(*usedIds==det)
00191 {
00192 HitAlreadyUsed=true;
00193 break;
00194 }
00195
00196 if(!HitAlreadyUsed)
00197 if (barrelHitsCollection->find(det) != barrelHitsCollection->end())
00198 miniEBRecHitCollection->push_back(*(barrelHitsCollection->find(det)));
00199 }
00200 }
00201 else
00202 {
00203
00204 ii++;
00205 const reco::SuperCluster& sc = *(eleIt->superCluster()) ;
00206
00207 int yy = 0;
00208 double currEnergy = 0.;
00209 EEDetId maxHit(0);
00210 vector<EEDetId> scXtals;
00211 scXtals.clear();
00212 const std::vector< std::pair<DetId, float> > & v1 = sc.hitsAndFractions();
00213
00214 for(std::vector< std::pair<DetId, float> >::const_iterator idsIt = v1.begin();
00215 idsIt != v1.end(); ++idsIt)
00216 {
00217 yy++;
00218
00219
00220 if((*idsIt).first.subdetId()!=EcalEndcap ||
00221 (*idsIt).first.det()!= DetId::Ecal) continue;
00222
00223 if((endcapHitsCollection->find( (*idsIt).first ))->energy() > currEnergy)
00224 {
00225 currEnergy=(endcapHitsCollection->find( (*idsIt).first ))->energy();
00226 maxHit=(*idsIt).first;
00227 }
00228 miniEERecHitCollection->push_back (
00229 *(endcapHitsCollection->find ( (*idsIt).first ))
00230 );
00231 scXtals.push_back ( (*idsIt).first ) ;
00232 }
00233
00234 int side = phiSize_ ;
00235 if (phiSize_ < etaSize_) side = etaSize_ ;
00236 int iz = 1 ;
00237 if (eleIt->eta () < 0) iz = -1 ;
00238 if (!maxHit.null())
00239
00240 for (int icry = 0 ; icry < side*side ; icry++)
00241 {
00242 unsigned int row = icry / side ;
00243 unsigned int column = icry % side ;
00244 int curr_eta = maxHit.ix () + column - (side/2);
00245 int curr_phi = maxHit.iy () + row - (side/2);
00246 if ( curr_eta <= 0 || curr_phi <= 0
00247 || curr_eta > 100 || curr_phi > 100 ) continue ;
00248 if (!(EEDetId::validDetId(curr_eta,curr_phi,iz))) continue;
00249 EEDetId det = EEDetId (curr_eta,curr_phi,iz,EEDetId::XYMODE) ;
00250 if (find (scXtals.begin (), scXtals.end (), det) != scXtals.end ())
00251 if (endcapHitsCollection->find (det) != endcapHitsCollection->end ())
00252 miniEERecHitCollection->push_back (*(endcapHitsCollection->find (det))) ;
00253 }
00254
00255
00256 reco::CaloCluster_iterator bc_iter = sc.clustersBegin();
00257 for ( ; bc_iter != sc.clustersEnd(); ++bc_iter ) {
00258 if (geometry) {
00259 double X = (*bc_iter)->x();
00260 double Y = (*bc_iter)->y();
00261 double Z = (*bc_iter)->z();
00262 const GlobalPoint point(X,Y,Z);
00263
00264 DetId tmp1 = (dynamic_cast<const EcalPreshowerGeometry*>(geometry_p))->getClosestCellInPlane(point, 1);
00265 DetId tmp2 = (dynamic_cast<const EcalPreshowerGeometry*>(geometry_p))->getClosestCellInPlane(point, 2);
00266 ESDetId strip1 = (tmp1 == DetId(0)) ? ESDetId(0) : ESDetId(tmp1);
00267 ESDetId strip2 = (tmp2 == DetId(0)) ? ESDetId(0) : ESDetId(tmp2);
00268
00269 int esindexE1 = (tmp1 == DetId(0)) ? -1 : (strip1.six()-1)*32+strip1.strip();
00270 int esindexE2 = (tmp2 == DetId(0)) ? -1 : (strip2.siy()-1)*32+strip2.strip();
00271 int esindexRh = 0;
00272
00273 EcalRecHitCollection::const_iterator esit;
00274 for (esit = preshowerHitsCollection->begin(); esit != preshowerHitsCollection->end(); esit++) {
00275
00276 ESDetId esid = ESDetId(esit->id());
00277
00278 if (used_strips.find(esid) != used_strips.end()) continue;
00279
00280 if (strip1 != ESDetId(0) && esid.plane()==1) {
00281
00282 esindexRh = (esid.six()-1)*32+esid.strip();
00283
00284 if (fabs(esindexE1-esindexRh) <= esNstrips_ && fabs(strip1.siy()-esid.siy()) <= esNcolumns_ && strip1.zside()==esid.zside()) {
00285 miniESRecHitCollection->push_back(*esit);
00286 used_strips.insert(esid);
00287 }
00288 }
00289 if (strip2 != ESDetId(0) && esid.plane()==2) {
00290
00291 esindexRh = (esid.siy()-1)*32+esid.strip();
00292
00293 if (fabs(esindexE2-esindexRh) <= esNstrips_ && fabs(strip2.six()-esid.six()) <= esNcolumns_ && strip2.zside()==esid.zside()) {
00294 miniESRecHitCollection->push_back(*esit);
00295 used_strips.insert(esid);
00296 }
00297 }
00298
00299 }
00300 }
00301 }
00302
00303 }
00304
00305 }
00306
00307
00308 iEvent.put( miniEBRecHitCollection,alcaBarrelHitsCollection_ );
00309 iEvent.put( miniEERecHitCollection,alcaEndcapHitsCollection_ );
00310 iEvent.put( miniESRecHitCollection,alcaPreshowerHitsCollection_ );
00311 iEvent.put( weight, "weight");
00312 }