CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_0/src/RecoEcal/EgammaCoreTools/src/EcalClusterLazyTools.cc

Go to the documentation of this file.
00001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00002 
00003 #include "RecoEcal/EgammaCoreTools/interface/EcalClusterLazyTools.h"
00004 #include "RecoEcal/EgammaCoreTools/interface/EcalClusterTools.h"
00005 
00006 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00007 #include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
00008 
00009 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00010 #include "Geometry/CaloTopology/interface/CaloTopology.h"
00011 #include "Geometry/Records/interface/CaloGeometryRecord.h"
00012 #include "Geometry/CaloEventSetup/interface/CaloTopologyRecord.h"
00013 
00014 #include "CondFormats/DataRecord/interface/EcalIntercalibConstantsRcd.h"
00015 #include "CondFormats/DataRecord/interface/EcalADCToGeVConstantRcd.h"
00016 #include "CalibCalorimetry/EcalLaserCorrection/interface/EcalLaserDbRecord.h"
00017 
00018 #include "CommonTools/Utils/interface/StringToEnumValue.h"
00019 #include "RecoLocalCalo/EcalRecAlgos/interface/EcalSeverityLevelAlgoRcd.h"
00020 #include "RecoLocalCalo/EcalRecAlgos/interface/EcalSeverityLevelAlgo.h"
00021 
00022 //EcalClusterLazyTools::EcalClusterLazyTools( const edm::Event &ev, const edm::EventSetup &es, edm::InputTag redEBRecHits, edm::InputTag redEERecHits,const edm::ParameterSet& config )
00023 EcalClusterLazyTools::EcalClusterLazyTools( const edm::Event &ev, const edm::EventSetup &es, edm::InputTag redEBRecHits, edm::InputTag redEERecHits)
00024 {
00025         getGeometry( es );
00026         getTopology( es );
00027         getEBRecHits( ev, redEBRecHits );
00028         getEERecHits( ev, redEERecHits );
00029         getIntercalibConstants( es );
00030         getADCToGeV ( es );
00031         getLaserDbService ( es );
00032 
00033   //AA
00034   //Flags and Severities to be excluded from photon calculations
00035 /*
00036   const std::vector<std::string> flagnames = 
00037     config.getParameter<std::vector<std::string> >("RecHitFlagToBeExcluded");
00038 
00039   flagsexcl_= 
00040     StringToEnumValue<EcalRecHit::Flags>(flagnames);
00041 
00042   const std::vector<std::string> severitynames = 
00043     config.getParameter<std::vector<std::string> >("RecHitSeverityToBeExcluded");
00044 
00045   severitiesexcl_= 
00046     StringToEnumValue<EcalSeverityLevel::SeverityLevel>(severitynames);
00047   //AA
00048 
00049   //AA
00050 */
00051   //Get the severity level object
00052 //  edm::ESHandle<EcalSeverityLevelAlgo> sevLv;
00053 //  es.get<EcalSeverityLevelAlgoRcd>().get(sevLv);
00054   //
00055 
00056 }
00057 
00058 EcalClusterLazyTools::EcalClusterLazyTools( const edm::Event &ev, const edm::EventSetup &es, edm::InputTag redEBRecHits, edm::InputTag redEERecHits,const edm::ParameterSet& config)
00059 {
00060         getGeometry( es );
00061         getTopology( es );
00062         getEBRecHits( ev, redEBRecHits );
00063         getEERecHits( ev, redEERecHits );
00064         getIntercalibConstants( es );
00065         getADCToGeV ( es );
00066         getLaserDbService ( es );
00067 
00068 //  edm::ESHandle<EcalSeverityLevelAlgo> sevLv;
00069 //  es.get<EcalSeverityLevelAlgoRcd>().get(sevLv);
00070 
00071 }
00072 
00073 
00074 EcalClusterLazyTools::~EcalClusterLazyTools()
00075 {
00076 }
00077 
00078 
00079 
00080 void EcalClusterLazyTools::getGeometry( const edm::EventSetup &es )
00081 {
00082         edm::ESHandle<CaloGeometry> pGeometry;
00083         es.get<CaloGeometryRecord>().get(pGeometry);
00084         geometry_ = pGeometry.product();
00085 }
00086 
00087 
00088 
00089 void EcalClusterLazyTools::getTopology( const edm::EventSetup &es )
00090 {
00091         edm::ESHandle<CaloTopology> pTopology;
00092         es.get<CaloTopologyRecord>().get(pTopology);
00093         topology_ = pTopology.product();
00094 }
00095 
00096 
00097 
00098 void EcalClusterLazyTools::getEBRecHits( const edm::Event &ev, edm::InputTag redEBRecHits )
00099 {
00100         edm::Handle< EcalRecHitCollection > pEBRecHits;
00101         ev.getByLabel( redEBRecHits, pEBRecHits );
00102         ebRecHits_ = pEBRecHits.product();
00103 }
00104 
00105 
00106 
00107 void EcalClusterLazyTools::getEERecHits( const edm::Event &ev, edm::InputTag redEERecHits )
00108 {
00109         edm::Handle< EcalRecHitCollection > pEERecHits;
00110         ev.getByLabel( redEERecHits, pEERecHits );
00111         eeRecHits_ = pEERecHits.product();
00112 }
00113 
00114 
00115 
00116 void EcalClusterLazyTools::getIntercalibConstants( const edm::EventSetup &es )
00117 {
00118   // get IC's
00119   es.get<EcalIntercalibConstantsRcd>().get(ical);
00120   icalMap = ical->getMap();
00121 }
00122 
00123 
00124 
00125 void EcalClusterLazyTools::getADCToGeV( const edm::EventSetup &es )
00126 {
00127   // get ADCtoGeV
00128   es.get<EcalADCToGeVConstantRcd>().get(agc);
00129 }
00130 
00131 
00132 
00133 void EcalClusterLazyTools::getLaserDbService     ( const edm::EventSetup &es ){
00134   // transp corrections
00135   es.get<EcalLaserDbRecord>().get(laser);
00136 }
00137 
00138 
00139 const EcalRecHitCollection * EcalClusterLazyTools::getEcalRecHitCollection( const reco::BasicCluster &cluster )
00140 {
00141         if ( cluster.size() == 0 ) {
00142                 throw cms::Exception("InvalidCluster") << "The cluster has no crystals!";
00143         }
00144         DetId id = (cluster.hitsAndFractions()[0]).first; // size is by definition > 0 -- FIXME??
00145         const EcalRecHitCollection *recHits = 0;
00146         if ( id.subdetId() == EcalBarrel ) {
00147                 recHits = ebRecHits_;
00148         } else if ( id.subdetId() == EcalEndcap ) {
00149                 recHits = eeRecHits_;
00150         } else {
00151                 throw cms::Exception("InvalidSubdetector") << "The subdetId() " << id.subdetId() << " does not correspond to EcalBarrel neither EcalEndcap";
00152         }
00153         return recHits;
00154 }
00155 
00156 
00157 
00158 float EcalClusterLazyTools::e1x3( const reco::BasicCluster &cluster )
00159 {
00160         return EcalClusterTools::e1x3( cluster, getEcalRecHitCollection(cluster), topology_ );
00161 }
00162 
00163 
00164 float EcalClusterLazyTools::e1x3( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00165 {
00166         return EcalClusterTools::e1x3( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00167 }
00168 
00169 
00170 
00171 float EcalClusterLazyTools::e3x1( const reco::BasicCluster &cluster )
00172 {
00173         return EcalClusterTools::e3x1( cluster, getEcalRecHitCollection(cluster), topology_ );
00174 }
00175 
00176 float EcalClusterLazyTools::e3x1( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00177 {
00178         return EcalClusterTools::e3x1( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00179 }
00180 
00181 
00182 float EcalClusterLazyTools::e1x5( const reco::BasicCluster &cluster )
00183 {
00184         return EcalClusterTools::e1x5( cluster, getEcalRecHitCollection(cluster), topology_ );
00185 }
00186 
00187 float EcalClusterLazyTools::e1x5( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00188 {
00189         return EcalClusterTools::e1x5( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00190 }
00191 
00192 
00193 
00194 float EcalClusterLazyTools::e5x1( const reco::BasicCluster &cluster )
00195 {
00196   return EcalClusterTools::e5x1( cluster, getEcalRecHitCollection(cluster), topology_ );
00197         }
00198 
00199 float EcalClusterLazyTools::e5x1( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00200 {
00201   return EcalClusterTools::e5x1( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00202         }
00203 
00204 
00205 float EcalClusterLazyTools::e2x2( const reco::BasicCluster &cluster )
00206 {
00207         return EcalClusterTools::e2x2( cluster, getEcalRecHitCollection(cluster), topology_ );
00208 }
00209 
00210 float EcalClusterLazyTools::e2x2( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00211 {
00212         return EcalClusterTools::e2x2( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00213 }
00214 
00215 
00216 float EcalClusterLazyTools::e3x2( const reco::BasicCluster &cluster )
00217 {
00218         return EcalClusterTools::e3x2( cluster, getEcalRecHitCollection(cluster), topology_ );
00219 }
00220 
00221 float EcalClusterLazyTools::e3x2( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00222 {
00223         return EcalClusterTools::e3x2( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00224 }
00225 
00226 
00227 float EcalClusterLazyTools::e3x3( const reco::BasicCluster &cluster )
00228 {
00229         return EcalClusterTools::e3x3( cluster, getEcalRecHitCollection(cluster), topology_ );
00230 }
00231 
00232 float EcalClusterLazyTools::e3x3( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00233 {
00234         return EcalClusterTools::e3x3( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00235 }
00236 
00237 
00238 float EcalClusterLazyTools::e4x4( const reco::BasicCluster &cluster )
00239 {
00240         return EcalClusterTools::e4x4( cluster, getEcalRecHitCollection(cluster), topology_ );
00241 }
00242 
00243 float EcalClusterLazyTools::e4x4( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00244 {
00245         return EcalClusterTools::e4x4( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00246 }
00247 
00248 
00249 float EcalClusterLazyTools::e5x5( const reco::BasicCluster &cluster )
00250 {
00251         return EcalClusterTools::e5x5( cluster, getEcalRecHitCollection(cluster), topology_ );
00252 }
00253 
00254 float EcalClusterLazyTools::e5x5( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00255 {
00256         return EcalClusterTools::e5x5( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00257 }
00258 
00259 
00260 float EcalClusterLazyTools::e2x5Right( const reco::BasicCluster &cluster )
00261 {
00262         return EcalClusterTools::e2x5Right( cluster, getEcalRecHitCollection(cluster), topology_ );
00263 }
00264 
00265 float EcalClusterLazyTools::e2x5Right( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00266 {
00267         return EcalClusterTools::e2x5Right( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00268 }
00269 
00270 
00271 float EcalClusterLazyTools::e2x5Left( const reco::BasicCluster &cluster )
00272 {
00273         return EcalClusterTools::e2x5Left( cluster, getEcalRecHitCollection(cluster), topology_ );
00274 }
00275 
00276 float EcalClusterLazyTools::e2x5Left( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00277 {
00278         return EcalClusterTools::e2x5Left( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00279 }
00280 
00281 
00282 float EcalClusterLazyTools::e2x5Top( const reco::BasicCluster &cluster )
00283 {
00284         return EcalClusterTools::e2x5Top( cluster, getEcalRecHitCollection(cluster), topology_ );
00285 }
00286 
00287 float EcalClusterLazyTools::e2x5Top( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00288 {
00289         return EcalClusterTools::e2x5Top( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00290 }
00291 
00292 
00293 float EcalClusterLazyTools::e2x5Bottom( const reco::BasicCluster &cluster )
00294 {
00295         return EcalClusterTools::e2x5Bottom( cluster, getEcalRecHitCollection(cluster), topology_ );
00296 }
00297 
00298 float EcalClusterLazyTools::e2x5Bottom( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00299 {
00300         return EcalClusterTools::e2x5Bottom( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00301 }
00302 
00303 // Energy in 2x5 strip containing the max crystal.
00304 float EcalClusterLazyTools::e2x5Max( const reco::BasicCluster &cluster )
00305 {
00306         return EcalClusterTools::e2x5Max( cluster, getEcalRecHitCollection(cluster), topology_ );
00307 }
00308 
00309 float EcalClusterLazyTools::e2x5Max( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00310 {
00311         return EcalClusterTools::e2x5Max( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00312 }
00313 
00314 
00315 float EcalClusterLazyTools::eLeft( const reco::BasicCluster &cluster )
00316 {
00317         return EcalClusterTools::eLeft( cluster, getEcalRecHitCollection(cluster), topology_ );
00318 }
00319 
00320 float EcalClusterLazyTools::eLeft( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00321 {
00322         return EcalClusterTools::eLeft( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00323 }
00324 
00325 
00326 float EcalClusterLazyTools::eRight( const reco::BasicCluster &cluster )
00327 {
00328         return EcalClusterTools::eRight( cluster, getEcalRecHitCollection(cluster), topology_ );
00329 }
00330 
00331 float EcalClusterLazyTools::eRight( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00332 {
00333         return EcalClusterTools::eRight( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00334 }
00335 
00336 
00337 float EcalClusterLazyTools::eTop( const reco::BasicCluster &cluster )
00338 {
00339         return EcalClusterTools::eTop( cluster, getEcalRecHitCollection(cluster), topology_ );
00340 }
00341 
00342 float EcalClusterLazyTools::eTop( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00343 {
00344         return EcalClusterTools::eTop( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00345 }
00346 
00347 
00348 float EcalClusterLazyTools::eBottom( const reco::BasicCluster &cluster )
00349 {
00350         return EcalClusterTools::eBottom( cluster, getEcalRecHitCollection(cluster), topology_ );
00351 }
00352 
00353 float EcalClusterLazyTools::eBottom( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00354 {
00355         return EcalClusterTools::eBottom( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv );
00356 }
00357 
00358 
00359 float EcalClusterLazyTools::eMax( const reco::BasicCluster &cluster )
00360 {
00361         return EcalClusterTools::eMax( cluster, getEcalRecHitCollection(cluster) );
00362 }
00363 
00364 float EcalClusterLazyTools::eMax( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00365 {
00366         return EcalClusterTools::eMax( cluster, getEcalRecHitCollection(cluster), flagsexcl, severitiesexcl, sevLv );
00367 }
00368 
00369 
00370 float EcalClusterLazyTools::e2nd( const reco::BasicCluster &cluster )
00371 {
00372         return EcalClusterTools::e2nd( cluster, getEcalRecHitCollection(cluster) );
00373 }
00374 
00375 float EcalClusterLazyTools::e2nd( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00376 {
00377         return EcalClusterTools::e2nd( cluster, getEcalRecHitCollection(cluster), flagsexcl, severitiesexcl, sevLv );
00378 }
00379 
00380 std::pair<DetId, float> EcalClusterLazyTools::getMaximum( const reco::BasicCluster &cluster )
00381 {
00382         return EcalClusterTools::getMaximum( cluster, getEcalRecHitCollection(cluster) );
00383 }
00384 
00385 std::pair<DetId, float> EcalClusterLazyTools::getMaximum( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00386 {
00387         return EcalClusterTools::getMaximum( cluster, getEcalRecHitCollection(cluster), flagsexcl, severitiesexcl, sevLv );
00388 }
00389 
00390 
00391 std::vector<float> EcalClusterLazyTools::energyBasketFractionEta( const reco::BasicCluster &cluster )
00392 {
00393         return EcalClusterTools::energyBasketFractionEta( cluster, getEcalRecHitCollection(cluster) );
00394 }
00395 
00396 std::vector<float> EcalClusterLazyTools::energyBasketFractionEta( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00397 {
00398         return EcalClusterTools::energyBasketFractionEta( cluster, getEcalRecHitCollection(cluster), flagsexcl, severitiesexcl, sevLv );
00399 }
00400 
00401 
00402 std::vector<float> EcalClusterLazyTools::energyBasketFractionPhi( const reco::BasicCluster &cluster )
00403 {
00404         return EcalClusterTools::energyBasketFractionPhi( cluster, getEcalRecHitCollection(cluster) );
00405 }
00406 
00407 std::vector<float> EcalClusterLazyTools::energyBasketFractionPhi( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00408 {
00409         return EcalClusterTools::energyBasketFractionPhi( cluster, getEcalRecHitCollection(cluster), flagsexcl, severitiesexcl, sevLv );
00410 }
00411 
00412 
00413 std::vector<float> EcalClusterLazyTools::lat( const reco::BasicCluster &cluster, bool logW, float w0 )
00414 {
00415         return EcalClusterTools::lat( cluster, getEcalRecHitCollection(cluster), geometry_, logW, w0 );
00416 }
00417 
00418 //std::vector<float> EcalClusterLazyTools::lat( const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv, bool logW, float w0 )
00419 //{
00420 //        return EcalClusterTools::lat( cluster, getEcalRecHitCollection(cluster), geometry_,flagsexcl, severitiesexcl, sevLv, logW, w0 );
00421 //} 
00422 
00423 
00424 std::vector<float> EcalClusterLazyTools::covariances(const reco::BasicCluster &cluster, float w0 )
00425 {
00426         return EcalClusterTools::covariances( cluster, getEcalRecHitCollection(cluster), topology_, geometry_, w0 );
00427 }
00428 
00429 std::vector<float> EcalClusterLazyTools::covariances(const reco::BasicCluster &cluster,std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv, float w0 )
00430 {
00431         return EcalClusterTools::covariances( cluster, getEcalRecHitCollection(cluster), topology_, geometry_, flagsexcl, severitiesexcl, sevLv, w0 );
00432 }
00433 
00434 std::vector<float> EcalClusterLazyTools::localCovariances(const reco::BasicCluster &cluster, float w0 )
00435 {
00436         return EcalClusterTools::localCovariances( cluster, getEcalRecHitCollection(cluster), topology_, w0 );
00437 }
00438 
00439 std::vector<float> EcalClusterLazyTools::localCovariances(const reco::BasicCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv, float w0 )
00440 {
00441         return EcalClusterTools::localCovariances( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv, w0 );
00442 }
00443 
00444 std::vector<float> EcalClusterLazyTools::scLocalCovariances(const reco::SuperCluster &cluster, float w0 )
00445 {
00446         return EcalClusterTools::scLocalCovariances( cluster, getEcalRecHitCollection(cluster), topology_, w0 );
00447 }
00448 
00449 std::vector<float> EcalClusterLazyTools::scLocalCovariances(const reco::SuperCluster &cluster, std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv, float w0 )
00450 {
00451         return EcalClusterTools::scLocalCovariances( cluster, getEcalRecHitCollection(cluster), topology_, flagsexcl, severitiesexcl, sevLv, w0 );
00452 }
00453 
00454 double EcalClusterLazyTools::zernike20( const reco::BasicCluster &cluster, double R0, bool logW, float w0 )
00455 {
00456         return EcalClusterTools::zernike20( cluster, getEcalRecHitCollection(cluster), geometry_, R0, logW, w0 );
00457 }
00458 
00459 
00460 double EcalClusterLazyTools::zernike42( const reco::BasicCluster &cluster, double R0, bool logW, float w0 )
00461 {
00462         return EcalClusterTools::zernike42( cluster, getEcalRecHitCollection(cluster), geometry_, R0, logW, w0 );
00463 }
00464 
00465 std::vector<DetId> EcalClusterLazyTools::matrixDetId( DetId id, int ixMin, int ixMax, int iyMin, int iyMax )
00466 {
00467         return EcalClusterTools::matrixDetId( topology_, id, ixMin, ixMax, iyMin, iyMax );
00468 }
00469 
00470 float EcalClusterLazyTools::matrixEnergy( const reco::BasicCluster &cluster, DetId id, int ixMin, int ixMax, int iyMin, int iyMax )
00471 {
00472   return EcalClusterTools::matrixEnergy( cluster, getEcalRecHitCollection(cluster), topology_, id, ixMin, ixMax, iyMin, iyMax );
00473 }
00474 
00475 float EcalClusterLazyTools::matrixEnergy( const reco::BasicCluster &cluster, DetId id, int ixMin, int ixMax, int iyMin, int iyMax,std::vector<int> flagsexcl, std::vector<int> severitiesexcl, const EcalSeverityLevelAlgo *sevLv )
00476 {
00477   return EcalClusterTools::matrixEnergy( cluster, getEcalRecHitCollection(cluster), topology_, id, ixMin, ixMax, iyMin, iyMax, flagsexcl, severitiesexcl, sevLv );
00478 }
00479 
00480 
00481 // get time of basic cluster seed crystal 
00482 float EcalClusterLazyTools::BasicClusterSeedTime(const reco::BasicCluster &cluster)
00483 {
00484   
00485   const EcalRecHitCollection *recHits = getEcalRecHitCollection( cluster );
00486   
00487   DetId id = cluster.seed();
00488   EcalRecHitCollection::const_iterator theSeedHit = recHits->find (id);
00489   //  std::cout << "the seed of the BC has time: " 
00490   //<< (*theSeedHit).time() 
00491   //<< "and energy: " << (*theSeedHit).energy() << " collection size: " << recHits->size() 
00492   //<< "\n" <<std::endl; // GF debug
00493   
00494   return (*theSeedHit).time();
00495 }
00496 
00497 
00498 // error-weighted average of time from constituents of basic cluster 
00499 float EcalClusterLazyTools::BasicClusterTime(const reco::BasicCluster &cluster, const edm::Event &ev)
00500 {
00501   
00502   std::vector<std::pair<DetId, float> > clusterComponents = (cluster).hitsAndFractions() ;
00503   //std::cout << "BC has this many components: " << clusterComponents.size() << std::endl; // GF debug
00504   
00505   const EcalRecHitCollection *recHits = getEcalRecHitCollection( cluster );
00506   //std::cout << "BasicClusterClusterTime - rechits are this many: " << recHits->size() << std::endl; // GF debug
00507   
00508   
00509   float weightedTsum   = 0;
00510   float sumOfWeights   = 0;
00511   
00512   for (std::vector<std::pair<DetId, float> >::const_iterator detitr = clusterComponents.begin(); detitr != clusterComponents.end(); detitr++ )
00513     {
00514       //      EcalRecHitCollection::const_iterator theSeedHit = recHits->find (id); // trash this
00515       EcalRecHitCollection::const_iterator oneHit = recHits->find( (detitr -> first) ) ;
00516       
00517       // in order to get back the ADC counts from the recHit energy, three ingredients are necessary:
00518       // 1) get laser correction coefficient
00519       float lasercalib = 1.;
00520       lasercalib = laser->getLaserCorrection( detitr->first, ev.time());
00521       // 2) get intercalibration
00522       EcalIntercalibConstantMap::const_iterator icalit = icalMap.find(detitr->first);
00523       EcalIntercalibConstant icalconst = 1.;
00524       if( icalit!=icalMap.end() ) {
00525         icalconst = (*icalit);
00526         // std::cout << "icalconst set to: " << icalconst << std::endl;
00527       } else {
00528         edm::LogError("EcalClusterLazyTools") << "No intercalib const found for xtal "  << (detitr->first).rawId() << "bailing out";
00529         assert(0);
00530       }
00531       // 3) get adc2GeV
00532       float adcToGeV = 1.;
00533       if       ( (detitr -> first).subdetId() == EcalBarrel )  adcToGeV = float(agc->getEBValue());
00534       else if  ( (detitr -> first).subdetId() == EcalEndcap )  adcToGeV = float(agc->getEEValue());
00535             float adc = 2.;
00536       if (icalconst>0 && lasercalib>0 && adcToGeV>0)  adc= (*oneHit).energy()/(icalconst*lasercalib*adcToGeV);
00537 
00538       // don't consider recHits with too little amplitude; take sigma_noise_total into account
00539       if( (detitr -> first).subdetId() == EcalBarrel  &&  adc< (1.1*20) ) continue;
00540       if( (detitr -> first).subdetId() == EcalEndcap  &&  adc< (2.2*20) ) continue;
00541 
00542       // count only on rechits whose error is trusted by the method (ratio)
00543       if(! (*oneHit).isTimeErrorValid()) continue;
00544 
00545       float timeError    = (*oneHit).timeError();
00546       // the constant used to build timeError is largely over-estimated ; remove in quadrature 0.6 and add 0.15 back.
00547       // could be prettier if value of constant term was changed at recHit production level
00548       if (timeError>0.6) timeError = sqrt( timeError*timeError - 0.6*0.6 + 0.15*0.15);
00549       else               timeError = sqrt( timeError*timeError           + 0.15*0.15);
00550 
00551       // do the error weighting
00552       weightedTsum += (*oneHit).time() / (timeError*timeError);
00553       sumOfWeights += 1. / (timeError*timeError);
00554 
00555     }
00556   
00557   // what if no crytal is available for weighted average?
00558   if     ( sumOfWeights ==0 )  return -999;
00559   else   return ( weightedTsum / sumOfWeights);
00560 
00561 }
00562 
00563 
00564 // get BasicClusterSeedTime of the seed basic cluser of the supercluster
00565 float EcalClusterLazyTools::SuperClusterSeedTime(const reco::SuperCluster &cluster){
00566 
00567   return BasicClusterSeedTime ( (*cluster.seed()) );
00568 
00569 }
00570 
00571 
00572 // get BasicClusterTime of the seed basic cluser of the supercluster
00573 float EcalClusterLazyTools::SuperClusterTime(const reco::SuperCluster &cluster, const edm::Event &ev){
00574   
00575   return BasicClusterTime ( (*cluster.seed()) , ev);
00576 
00577 }