CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_4_5_patch3/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   if (tsFromDB_==true)
00048     {
00049       edm::ESHandle<HcalRecoParams> p;
00050       es.get<HcalRecoParamsRcd>().get(p);
00051       paramTS = new HcalRecoParams(*p.product());
00052     }
00053 }
00054 
00055 void HcalSimpleReconstructor::endRun(edm::Run&r, edm::EventSetup const & es){
00056   if (tsFromDB_==true)
00057     {
00058       if (paramTS) delete paramTS;
00059     }
00060 }
00061 
00062 
00063 
00064 
00065 void HcalSimpleReconstructor::produce(edm::Event& e, const edm::EventSetup& eventSetup)
00066 {
00067   // get conditions
00068   edm::ESHandle<HcalDbService> conditions;
00069   eventSetup.get<HcalDbRecord>().get(conditions);
00070   const HcalQIEShape* shape = conditions->getHcalShape (); // this one is generic
00071 
00072   // HACK related to HB- corrections
00073   if(e.isRealData()) reco_.setForData();
00074  
00075   
00076   if (det_==DetId::Hcal) {
00077     if (subdet_==HcalBarrel || subdet_==HcalEndcap) {
00078       edm::Handle<HBHEDigiCollection> digi;
00079       
00080       e.getByLabel(inputLabel_,digi);
00081       
00082       // create empty output
00083       std::auto_ptr<HBHERecHitCollection> rec(new HBHERecHitCollection);
00084       rec->reserve(digi->size());
00085       // run the algorithm
00086       int toaddMem = 0;
00087       int first = firstSample_;
00088       int toadd = samplesToAdd_;
00089       HBHEDigiCollection::const_iterator i;
00090       for (i=digi->begin(); i!=digi->end(); i++) {
00091         HcalDetId cell = i->id();
00092         DetId detcell=(DetId)cell;
00093         // rof 27.03.09: drop ZS marked and passed digis:
00094         if (dropZSmarkedPassed_)
00095           if (i->zsMarkAndPass()) continue;
00096 
00097         const HcalCalibrations& calibrations=conditions->getHcalCalibrations(cell);
00098         const HcalQIECoder* channelCoder = conditions->getHcalCoder (cell);
00099         HcalCoderDb coder (*channelCoder, *shape);
00100 
00101         //>>> firstSample & samplesToAdd
00102         if(tsFromDB_) {
00103           const HcalRecoParam* param_ts = paramTS->getValues(detcell.rawId());
00104           first = param_ts->firstSample();    
00105           toadd = param_ts->samplesToAdd();
00106         }    
00107         if(toaddMem != toadd) {
00108           reco_.initPulseCorr(toadd);
00109           toaddMem = toadd;
00110         }
00111 
00112         rec->push_back(reco_.reconstruct(*i,first,toadd,coder,calibrations));
00113 
00114       }
00115       // return result
00116       e.put(rec);
00117     } else if (subdet_==HcalOuter) {
00118       edm::Handle<HODigiCollection> digi;
00119       e.getByLabel(inputLabel_,digi);
00120       
00121       // create empty output
00122       std::auto_ptr<HORecHitCollection> rec(new HORecHitCollection);
00123       rec->reserve(digi->size());
00124       // run the algorithm
00125       int toaddMem = 0;
00126       int first = firstSample_;
00127       int toadd = samplesToAdd_;
00128       HODigiCollection::const_iterator i;
00129       for (i=digi->begin(); i!=digi->end(); i++) {
00130         HcalDetId cell = i->id();
00131         DetId detcell=(DetId)cell;
00132         // rof 27.03.09: drop ZS marked and passed digis:
00133         if (dropZSmarkedPassed_)
00134           if (i->zsMarkAndPass()) continue;
00135 
00136         const HcalCalibrations& calibrations=conditions->getHcalCalibrations(cell);
00137         const HcalQIECoder* channelCoder = conditions->getHcalCoder (cell);
00138         HcalCoderDb coder (*channelCoder, *shape);
00139        
00140 
00141         //>>> firstSample & samplesToAdd
00142         if(tsFromDB_) {
00143           const HcalRecoParam* param_ts = paramTS->getValues(detcell.rawId());
00144           first = param_ts->firstSample();    
00145           toadd = param_ts->samplesToAdd();    
00146         }
00147         if(toaddMem != toadd) {
00148           reco_.initPulseCorr(toadd);
00149           toaddMem = toadd;
00150         }
00151 
00152         rec->push_back(reco_.reconstruct(*i,first,toadd,coder,calibrations));
00153       }
00154       // return result
00155       e.put(rec);    
00156     } else if (subdet_==HcalForward) {
00157       edm::Handle<HFDigiCollection> digi;
00158       e.getByLabel(inputLabel_,digi);
00159       
00160       // create empty output
00161       std::auto_ptr<HFRecHitCollection> rec(new HFRecHitCollection);
00162       rec->reserve(digi->size());
00163       // run the algorithm
00164       int toaddMem = 0;
00165       int first = firstSample_;
00166       int toadd = samplesToAdd_;
00167       HFDigiCollection::const_iterator i;
00168       for (i=digi->begin(); i!=digi->end(); i++) {
00169         HcalDetId cell = i->id();        
00170         DetId detcell=(DetId)cell;
00171         // rof 27.03.09: drop ZS marked and passed digis:
00172         if (dropZSmarkedPassed_)
00173           if (i->zsMarkAndPass()) continue;
00174  
00175         const HcalCalibrations& calibrations=conditions->getHcalCalibrations(cell);
00176         const HcalQIECoder* channelCoder = conditions->getHcalCoder (cell);
00177         HcalCoderDb coder (*channelCoder, *shape);
00178 
00179         //>>> firstSample & samplesToAdd
00180         if(tsFromDB_) {
00181           const HcalRecoParam* param_ts = paramTS->getValues(detcell.rawId());
00182           first = param_ts->firstSample();    
00183           toadd = param_ts->samplesToAdd();    
00184         }
00185         if(toaddMem != toadd) {
00186           reco_.initPulseCorr(toadd);
00187           toaddMem = toadd;
00188         }
00189 
00190         rec->push_back(reco_.reconstruct(*i,first,toadd,coder,calibrations));
00191       }
00192       // return result
00193       e.put(rec);     
00194     } else if (subdet_==HcalOther && subdetOther_==HcalCalibration) {
00195       edm::Handle<HcalCalibDigiCollection> digi;
00196       e.getByLabel(inputLabel_,digi);
00197       
00198       // create empty output
00199       std::auto_ptr<HcalCalibRecHitCollection> rec(new HcalCalibRecHitCollection);
00200       rec->reserve(digi->size());
00201       // run the algorithm
00202       int toaddMem = 0;
00203       int first = firstSample_;
00204       int toadd = samplesToAdd_;
00205       HcalCalibDigiCollection::const_iterator i;
00206       for (i=digi->begin(); i!=digi->end(); i++) {
00207         HcalCalibDetId cell = i->id();    
00208         DetId detcell=(DetId)cell;
00209         // rof 27.03.09: drop ZS marked and passed digis:
00210         if (dropZSmarkedPassed_)
00211           if (i->zsMarkAndPass()) continue;
00212 
00213         const HcalCalibrations& calibrations=conditions->getHcalCalibrations(cell);
00214         const HcalQIECoder* channelCoder = conditions->getHcalCoder (cell);
00215         HcalCoderDb coder (*channelCoder, *shape);
00216 
00217         //>>> firstSample & samplesToAdd
00218         if(tsFromDB_) {
00219           const HcalRecoParam* param_ts = paramTS->getValues(detcell.rawId());
00220           first = param_ts->firstSample();    
00221           toadd = param_ts->samplesToAdd();    
00222         }
00223         if(toaddMem != toadd) {
00224           reco_.initPulseCorr(toadd);
00225           toaddMem = toadd;
00226         }
00227 
00228         rec->push_back(reco_.reconstruct(*i,first,toadd,coder,calibrations));
00229       }
00230       // return result
00231       e.put(rec);     
00232     }
00233   } 
00234 }