CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/RecoLocalCalo/HcalRecProducers/src/HcalSimpleReconstructor.cc

Go to the documentation of this file.
00001 #include "HcalSimpleReconstructor.h"
00002 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
00003 #include "DataFormats/HcalRecHit/interface/HcalRecHitCollections.h"
00004 #include "DataFormats/Common/interface/EDCollection.h"
00005 #include "DataFormats/Common/interface/Handle.h"
00006 #include "FWCore/Framework/interface/Selector.h"
00007 #include "FWCore/Framework/interface/ESHandle.h"
00008 #include "FWCore/Framework/interface/EventSetup.h"
00009 #include "CalibFormats/HcalObjects/interface/HcalCoderDb.h"
00010 #include "CalibFormats/HcalObjects/interface/HcalCalibrations.h"
00011 #include "CalibFormats/HcalObjects/interface/HcalDbService.h"
00012 #include "CalibFormats/HcalObjects/interface/HcalDbRecord.h"
00013 
00014 #include <iostream>
00015     
00016 HcalSimpleReconstructor::HcalSimpleReconstructor(edm::ParameterSet const& conf):
00017   reco_(conf.getParameter<bool>("correctForTimeslew"),
00018         conf.getParameter<bool>("correctForPhaseContainment"),conf.getParameter<double>("correctionPhaseNS")),
00019   det_(DetId::Hcal),
00020   inputLabel_(conf.getParameter<edm::InputTag>("digiLabel")),
00021   dropZSmarkedPassed_(conf.getParameter<bool>("dropZSmarkedPassed")),
00022   firstSample_(conf.getParameter<int>("firstSample")),
00023   samplesToAdd_(conf.getParameter<int>("samplesToAdd")),
00024   tsFromDB_(conf.getParameter<bool>("tsFromDB"))
00025 {
00026 
00027   std::string subd=conf.getParameter<std::string>("Subdetector");
00028   if (!strcasecmp(subd.c_str(),"HBHE")) {
00029     subdet_=HcalBarrel;
00030     produces<HBHERecHitCollection>();
00031   } else if (!strcasecmp(subd.c_str(),"HO")) {
00032     subdet_=HcalOuter;
00033     produces<HORecHitCollection>();
00034   } else if (!strcasecmp(subd.c_str(),"HF")) {
00035     subdet_=HcalForward;
00036     produces<HFRecHitCollection>();
00037   } else {
00038     std::cout << "HcalSimpleReconstructor is not associated with a specific subdetector!" << std::endl;
00039   }       
00040   
00041 }
00042 
00043 HcalSimpleReconstructor::~HcalSimpleReconstructor() { }
00044 
00045 void HcalSimpleReconstructor::beginRun(edm::Run&r, edm::EventSetup const & es){
00046 
00047     edm::ESHandle<HcalRecoParams> p;
00048     es.get<HcalRecoParamsRcd>().get(p);
00049     paramTS = new HcalRecoParams(*p.product());
00050 
00051 }
00052 
00053 void HcalSimpleReconstructor::endRun(edm::Run&r, edm::EventSetup const & es){
00054   if (paramTS) delete paramTS;
00055 }
00056 
00057 
00058 
00059 
00060 void HcalSimpleReconstructor::produce(edm::Event& e, const edm::EventSetup& eventSetup)
00061 {
00062   // get conditions
00063   edm::ESHandle<HcalDbService> conditions;
00064   eventSetup.get<HcalDbRecord>().get(conditions);
00065   const HcalQIEShape* shape = conditions->getHcalShape (); // this one is generic
00066 
00067   // HACK related to HB- corrections
00068   if(e.isRealData()) reco_.setForData();
00069  
00070   
00071   if (det_==DetId::Hcal) {
00072     if (subdet_==HcalBarrel || subdet_==HcalEndcap) {
00073       edm::Handle<HBHEDigiCollection> digi;
00074       
00075       e.getByLabel(inputLabel_,digi);
00076       
00077       // create empty output
00078       std::auto_ptr<HBHERecHitCollection> rec(new HBHERecHitCollection);
00079       rec->reserve(digi->size());
00080       // run the algorithm
00081       int toaddMem = 0;
00082       int first = firstSample_;
00083       int toadd = samplesToAdd_;
00084       HBHEDigiCollection::const_iterator i;
00085       for (i=digi->begin(); i!=digi->end(); i++) {
00086         HcalDetId cell = i->id();
00087         DetId detcell=(DetId)cell;
00088         // rof 27.03.09: drop ZS marked and passed digis:
00089         if (dropZSmarkedPassed_)
00090           if (i->zsMarkAndPass()) continue;
00091 
00092         const HcalCalibrations& calibrations=conditions->getHcalCalibrations(cell);
00093         const HcalQIECoder* channelCoder = conditions->getHcalCoder (cell);
00094         HcalCoderDb coder (*channelCoder, *shape);
00095 
00096         //>>> firstSample & samplesToAdd
00097         if(tsFromDB_) {
00098           const HcalRecoParam* param_ts = paramTS->getValues(detcell.rawId());
00099           first = param_ts->firstSample();    
00100           toadd = param_ts->samplesToAdd();
00101         }    
00102         if(toaddMem != toadd) {
00103           reco_.initPulseCorr(toadd);
00104           toaddMem = toadd;
00105         }
00106 
00107         rec->push_back(reco_.reconstruct(*i,first,toadd,coder,calibrations));
00108 
00109       }
00110       // return result
00111       e.put(rec);
00112     } else if (subdet_==HcalOuter) {
00113       edm::Handle<HODigiCollection> digi;
00114       e.getByLabel(inputLabel_,digi);
00115       
00116       // create empty output
00117       std::auto_ptr<HORecHitCollection> rec(new HORecHitCollection);
00118       rec->reserve(digi->size());
00119       // run the algorithm
00120       int toaddMem = 0;
00121       int first = firstSample_;
00122       int toadd = samplesToAdd_;
00123       HODigiCollection::const_iterator i;
00124       for (i=digi->begin(); i!=digi->end(); i++) {
00125         HcalDetId cell = i->id();
00126         DetId detcell=(DetId)cell;
00127         // rof 27.03.09: drop ZS marked and passed digis:
00128         if (dropZSmarkedPassed_)
00129           if (i->zsMarkAndPass()) continue;
00130 
00131         const HcalCalibrations& calibrations=conditions->getHcalCalibrations(cell);
00132         const HcalQIECoder* channelCoder = conditions->getHcalCoder (cell);
00133         HcalCoderDb coder (*channelCoder, *shape);
00134        
00135 
00136         //>>> firstSample & samplesToAdd
00137         if(tsFromDB_) {
00138           const HcalRecoParam* param_ts = paramTS->getValues(detcell.rawId());
00139           first = param_ts->firstSample();    
00140           toadd = param_ts->samplesToAdd();    
00141         }
00142         if(toaddMem != toadd) {
00143           reco_.initPulseCorr(toadd);
00144           toaddMem = toadd;
00145         }
00146 
00147         rec->push_back(reco_.reconstruct(*i,first,toadd,coder,calibrations));
00148       }
00149       // return result
00150       e.put(rec);    
00151     } else if (subdet_==HcalForward) {
00152       edm::Handle<HFDigiCollection> digi;
00153       e.getByLabel(inputLabel_,digi);
00154       
00155       // create empty output
00156       std::auto_ptr<HFRecHitCollection> rec(new HFRecHitCollection);
00157       rec->reserve(digi->size());
00158       // run the algorithm
00159       int toaddMem = 0;
00160       int first = firstSample_;
00161       int toadd = samplesToAdd_;
00162       HFDigiCollection::const_iterator i;
00163       for (i=digi->begin(); i!=digi->end(); i++) {
00164         HcalDetId cell = i->id();        
00165         DetId detcell=(DetId)cell;
00166         // rof 27.03.09: drop ZS marked and passed digis:
00167         if (dropZSmarkedPassed_)
00168           if (i->zsMarkAndPass()) continue;
00169  
00170         const HcalCalibrations& calibrations=conditions->getHcalCalibrations(cell);
00171         const HcalQIECoder* channelCoder = conditions->getHcalCoder (cell);
00172         HcalCoderDb coder (*channelCoder, *shape);
00173 
00174         //>>> firstSample & samplesToAdd
00175         if(tsFromDB_) {
00176           const HcalRecoParam* param_ts = paramTS->getValues(detcell.rawId());
00177           first = param_ts->firstSample();    
00178           toadd = param_ts->samplesToAdd();    
00179         }
00180         if(toaddMem != toadd) {
00181           reco_.initPulseCorr(toadd);
00182           toaddMem = toadd;
00183         }
00184 
00185         rec->push_back(reco_.reconstruct(*i,first,toadd,coder,calibrations));
00186       }
00187       // return result
00188       e.put(rec);     
00189     } else if (subdet_==HcalOther && subdetOther_==HcalCalibration) {
00190       edm::Handle<HcalCalibDigiCollection> digi;
00191       e.getByLabel(inputLabel_,digi);
00192       
00193       // create empty output
00194       std::auto_ptr<HcalCalibRecHitCollection> rec(new HcalCalibRecHitCollection);
00195       rec->reserve(digi->size());
00196       // run the algorithm
00197       int toaddMem = 0;
00198       int first = firstSample_;
00199       int toadd = samplesToAdd_;
00200       HcalCalibDigiCollection::const_iterator i;
00201       for (i=digi->begin(); i!=digi->end(); i++) {
00202         HcalCalibDetId cell = i->id();    
00203         DetId detcell=(DetId)cell;
00204         // rof 27.03.09: drop ZS marked and passed digis:
00205         if (dropZSmarkedPassed_)
00206           if (i->zsMarkAndPass()) continue;
00207 
00208         const HcalCalibrations& calibrations=conditions->getHcalCalibrations(cell);
00209         const HcalQIECoder* channelCoder = conditions->getHcalCoder (cell);
00210         HcalCoderDb coder (*channelCoder, *shape);
00211 
00212         //>>> firstSample & samplesToAdd
00213         if(tsFromDB_) {
00214           const HcalRecoParam* param_ts = paramTS->getValues(detcell.rawId());
00215           first = param_ts->firstSample();    
00216           toadd = param_ts->samplesToAdd();    
00217         }
00218         if(toaddMem != toadd) {
00219           reco_.initPulseCorr(toadd);
00220           toaddMem = toadd;
00221         }
00222 
00223         rec->push_back(reco_.reconstruct(*i,first,toadd,coder,calibrations));
00224       }
00225       // return result
00226       e.put(rec);     
00227     }
00228   } 
00229 }