00001
00002 #include "PhysicsTools/UtilAlgos/interface/ParameterAdapter.h"
00003 #include "FWCore/Framework/interface/ESHandle.h"
00004 #include "FWCore/Framework/interface/Event.h"
00005
00006
00007 #include "Geometry/CaloEventSetup/interface/CaloTopologyRecord.h"
00008 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00009 #include "Geometry/CaloTopology/interface/CaloSubdetectorTopology.h"
00010
00011 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
00012 #include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
00013
00014 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00015 #include "DataFormats/DetId/interface/DetId.h"
00016 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00017 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00018
00019
00020 #include "Calibration/Tools/plugins/SingleEleCalibSelector.h"
00021
00022
00023 #include <CLHEP/Vector/LorentzVector.h>
00024
00025 #include <iostream>
00026
00027 SingleEleCalibSelector::SingleEleCalibSelector (const edm::ParameterSet& iConfig)
00028 {
00029 ESCOPinMin_ = iConfig.getParameter<double>("ESCOPinMin");
00030 ESCOPinMax_ = iConfig.getParameter<double>("ESCOPinMax");
00031 ESeedOPoutMin_ = iConfig.getParameter<double>("ESeedOPoutMin");
00032 ESeedOPoutMax_ = iConfig.getParameter<double>("ESeedOPoutMax");
00033 PinMPoutOPinMin_ = iConfig.getParameter<double>("PinMPoutOPinMin");
00034 PinMPoutOPinMax_ = iConfig.getParameter<double>("PinMPoutOPinMax");
00035 E5x5OPoutMin_ = iConfig.getParameter<double>("E5x5OPoutMin");
00036 E5x5OPoutMax_ = iConfig.getParameter<double>("E5x5OPoutMax");
00037 E3x3OPinMin_ = iConfig.getParameter<double>("E3x3OPinMin");
00038 E3x3OPinMax_ = iConfig.getParameter<double>("E3x3OPinMax");
00039 E3x3OE5x5Min_ = iConfig.getParameter<double>("E3x3OE5x5Min");
00040 E3x3OE5x5Max_ = iConfig.getParameter<double>("E3x3OE5x5Max");
00041 EBrecHitLabel_ = iConfig.getParameter<edm::InputTag> ("alcaBarrelHitCollection");
00042 EErecHitLabel_ = iConfig.getParameter<edm::InputTag> ("alcaEndcapHitCollection");
00043 }
00044
00045
00046
00047
00048
00049 void
00050
00051 SingleEleCalibSelector::select (edm::Handle<collection> inputHandle,
00052 const edm::Event& iEvent , const edm::EventSetup& iSetup)
00053 {
00054 selected_.clear();
00055
00056
00057 edm::Handle<EBRecHitCollection> barrelRecHitsHandle ;
00058 iEvent.getByLabel (EBrecHitLabel_, barrelRecHitsHandle) ;
00059 const EBRecHitCollection* EBHitsColl = barrelRecHitsHandle.product () ;
00060
00061
00062 edm::Handle<EERecHitCollection> endcapRecHitsHandle ;
00063 iEvent.getByLabel (EErecHitLabel_, endcapRecHitsHandle) ;
00064 const EERecHitCollection* EEHitsColl = endcapRecHitsHandle.product () ;
00065
00066
00067 iSetup.get<CaloTopologyRecord>().get(theCaloTopology);
00068
00069
00070 for( collection::const_iterator ele = (*inputHandle).begin(); ele != (*inputHandle).end(); ++ ele ){
00071
00072
00073 DetId maxHitId = findMaxHit((*ele).superCluster()->getHitsByDetId(),EBHitsColl,EEHitsColl);
00074
00075 if(maxHitId.null()){std::cout<<" Null Id"<<std::endl; continue;}
00076
00077
00078 double E5x5 = 0.;
00079 double E3x3 = 0.;
00080
00081 const CaloSubdetectorTopology* topology = theCaloTopology->getSubdetectorTopology(DetId::Ecal,maxHitId.subdetId());
00082 int WindowSize = 5;
00083 std::vector<DetId> m5x5aroundMax = topology->getWindow(maxHitId,WindowSize,WindowSize);
00084 E5x5 = EnergyNxN(m5x5aroundMax,EBHitsColl,EEHitsColl);
00085 WindowSize = 3;
00086 std::vector<DetId> m3x3aroundMax = topology->getWindow(maxHitId,WindowSize,WindowSize);
00087 E3x3 = EnergyNxN(m3x3aroundMax,EBHitsColl,EEHitsColl);
00088
00089 double pin = ele->trackMomentumAtVtx ().R () ;
00090 double piMpoOpi = (pin - ele->trackMomentumOut ().R ()) / pin ;
00091 double E5x5OPout = E5x5/ele->trackMomentumOut ().R () ;
00092 double E3x3OPin = E3x3/pin;
00093 double E3x3OE5x5 = E3x3/E5x5;
00094 double EseedOPout = ele->eSeedClusterOverPout () ;
00095 double EoPin = ele->eSuperClusterOverP () ;
00096
00097 if ( piMpoOpi > PinMPoutOPinMin_ && piMpoOpi < PinMPoutOPinMax_ &&
00098 EseedOPout > ESeedOPoutMin_ && EseedOPout < ESeedOPoutMax_ &&
00099 EoPin > ESCOPinMin_ && EoPin < ESCOPinMax_ &&
00100 E5x5OPout > E5x5OPoutMin_ && E5x5OPout < E5x5OPoutMax_ &&
00101 E3x3OPin > E3x3OPinMin_ && E3x3OPin < E3x3OPinMax_ &&
00102 E3x3OE5x5 > E3x3OE5x5Min_ && E3x3OE5x5 < E3x3OE5x5Max_)
00103 {
00104 selected_.push_back( & (*ele) );
00105 }
00106 }
00107
00108 return ;
00109 }
00110
00111
00112
00113
00114
00115 SingleEleCalibSelector::~SingleEleCalibSelector()
00116 {}
00117
00118
00119
00120
00121
00122
00123 DetId SingleEleCalibSelector::findMaxHit(const std::vector<DetId> & v1,
00124 const EBRecHitCollection* EBhits,
00125 const EERecHitCollection* EEhits)
00126 {
00127 double currEnergy = 0. ;
00128 DetId maxHit ;
00129 for (std::vector<DetId>::const_iterator idsIt = v1.begin () ;
00130 idsIt != v1.end () ; ++idsIt)
00131 {
00132 if (idsIt->subdetId () == EcalBarrel)
00133 {
00134 EBRecHitCollection::const_iterator itrechit ;
00135 itrechit = EBhits->find (*idsIt) ;
00136 if (itrechit == EBhits->end () )
00137 {
00138 edm::LogInfo ("reading") << "[findMaxHit] rechit not found! " ;
00139 continue ;
00140 }
00141 if (itrechit->energy () > currEnergy)
00142 {
00143 currEnergy = itrechit->energy () ;
00144 maxHit= *idsIt ;
00145 }
00146 }
00147 else
00148 {
00149 EERecHitCollection::const_iterator itrechit ;
00150 itrechit = EEhits->find (*idsIt) ;
00151 if (itrechit == EEhits->end () )
00152 {
00153 edm::LogInfo ("reading")<< "[findMaxHit] rechit not found! " ;
00154 continue ;
00155 }
00156
00157 if (itrechit->energy () > currEnergy)
00158 {
00159 currEnergy=itrechit->energy () ;
00160 maxHit= *idsIt ;
00161 }
00162 }
00163 }
00164 return maxHit ;
00165 }
00166
00167
00168
00169 double SingleEleCalibSelector::EnergyNxN(const std::vector<DetId> & vNxN,
00170 const EBRecHitCollection* EBhits,
00171 const EERecHitCollection* EEhits)
00172 {
00173 double dummy = 0.;
00174 int window_size = vNxN.size();
00175 for (int ixtal = 0; ixtal < window_size; ixtal++){
00176 if (vNxN[ixtal].subdetId() == EcalBarrel)
00177 {
00178 EBRecHitCollection::const_iterator it_rechit;
00179 it_rechit = EBhits->find(vNxN[ixtal]);
00180 dummy+= it_rechit->energy();
00181 }
00182 else
00183 {
00184 EERecHitCollection::const_iterator it_rechit;
00185 it_rechit = EEhits->find(vNxN[ixtal]);
00186 dummy+= it_rechit->energy();
00187 }
00188 }
00189
00190 return dummy;
00191 }
00192