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
00063 edm::ESHandle<HcalDbService> conditions;
00064 eventSetup.get<HcalDbRecord>().get(conditions);
00065 const HcalQIEShape* shape = conditions->getHcalShape ();
00066
00067
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
00078 std::auto_ptr<HBHERecHitCollection> rec(new HBHERecHitCollection);
00079 rec->reserve(digi->size());
00080
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
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
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
00111 e.put(rec);
00112 } else if (subdet_==HcalOuter) {
00113 edm::Handle<HODigiCollection> digi;
00114 e.getByLabel(inputLabel_,digi);
00115
00116
00117 std::auto_ptr<HORecHitCollection> rec(new HORecHitCollection);
00118 rec->reserve(digi->size());
00119
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
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
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
00150 e.put(rec);
00151 } else if (subdet_==HcalForward) {
00152 edm::Handle<HFDigiCollection> digi;
00153 e.getByLabel(inputLabel_,digi);
00154
00155
00156 std::auto_ptr<HFRecHitCollection> rec(new HFRecHitCollection);
00157 rec->reserve(digi->size());
00158
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
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
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
00188 e.put(rec);
00189 } else if (subdet_==HcalOther && subdetOther_==HcalCalibration) {
00190 edm::Handle<HcalCalibDigiCollection> digi;
00191 e.getByLabel(inputLabel_,digi);
00192
00193
00194 std::auto_ptr<HcalCalibRecHitCollection> rec(new HcalCalibRecHitCollection);
00195 rec->reserve(digi->size());
00196
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
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
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
00226 e.put(rec);
00227 }
00228 }
00229 }