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
00068 edm::ESHandle<HcalDbService> conditions;
00069 eventSetup.get<HcalDbRecord>().get(conditions);
00070 const HcalQIEShape* shape = conditions->getHcalShape ();
00071
00072
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
00083 std::auto_ptr<HBHERecHitCollection> rec(new HBHERecHitCollection);
00084 rec->reserve(digi->size());
00085
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
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
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
00116 e.put(rec);
00117 } else if (subdet_==HcalOuter) {
00118 edm::Handle<HODigiCollection> digi;
00119 e.getByLabel(inputLabel_,digi);
00120
00121
00122 std::auto_ptr<HORecHitCollection> rec(new HORecHitCollection);
00123 rec->reserve(digi->size());
00124
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
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
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
00155 e.put(rec);
00156 } else if (subdet_==HcalForward) {
00157 edm::Handle<HFDigiCollection> digi;
00158 e.getByLabel(inputLabel_,digi);
00159
00160
00161 std::auto_ptr<HFRecHitCollection> rec(new HFRecHitCollection);
00162 rec->reserve(digi->size());
00163
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
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
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
00193 e.put(rec);
00194 } else if (subdet_==HcalOther && subdetOther_==HcalCalibration) {
00195 edm::Handle<HcalCalibDigiCollection> digi;
00196 e.getByLabel(inputLabel_,digi);
00197
00198
00199 std::auto_ptr<HcalCalibRecHitCollection> rec(new HcalCalibRecHitCollection);
00200 rec->reserve(digi->size());
00201
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
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
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
00231 e.put(rec);
00232 }
00233 }
00234 }