Go to the documentation of this file.00001 using namespace std;
00002 #include "CastorSimpleReconstructor.h"
00003 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
00004 #include "DataFormats/HcalRecHit/interface/HcalRecHitCollections.h"
00005 #include "DataFormats/Common/interface/EDCollection.h"
00006 #include "DataFormats/Common/interface/Handle.h"
00007 #include "FWCore/Framework/interface/ESHandle.h"
00008 #include "FWCore/Framework/interface/EventSetup.h"
00009 #include "CalibFormats/CastorObjects/interface/CastorCoderDb.h"
00010 #include "CalibFormats/CastorObjects/interface/CastorCalibrations.h"
00011 #include "CalibFormats/CastorObjects/interface/CastorDbService.h"
00012 #include "CalibFormats/CastorObjects/interface/CastorDbRecord.h"
00013 #include "CondFormats/DataRecord/interface/CastorRecoParamsRcd.h"
00014 #include "CondFormats/CastorObjects/interface/CastorRecoParams.h"
00015 #include "CondFormats/CastorObjects/interface/CastorChannelQuality.h"
00016 #include "CondFormats/CastorObjects/interface/CastorChannelStatus.h"
00017 #include "CondFormats/DataRecord/interface/CastorChannelQualityRcd.h"
00018 #include "CondFormats/DataRecord/interface/CastorSaturationCorrsRcd.h"
00019 #include "CondFormats/CastorObjects/interface/CastorSaturationCorrs.h"
00020 #include "RecoLocalCalo/HcalRecAlgos/interface/HcalCaloFlagLabels.h"
00021
00022 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00023 #include <iostream>
00024
00025
00026 CastorSimpleReconstructor::CastorSimpleReconstructor(edm::ParameterSet const& conf):
00027 reco_(conf.getParameter<int>("firstSample"),conf.getParameter<int>("samplesToAdd"),conf.getParameter<bool>("correctForTimeslew"),
00028 conf.getParameter<bool>("correctForPhaseContainment"),conf.getParameter<double>("correctionPhaseNS")),
00029 det_(DetId::Hcal),
00030 inputLabel_(conf.getParameter<edm::InputTag>("digiLabel")),
00031 firstSample_(conf.getParameter<int>("firstSample")),
00032 samplesToAdd_(conf.getParameter<int>("samplesToAdd")),
00033 tsFromDB_(conf.getParameter<bool>("tsFromDB")),
00034 setSaturationFlag_(conf.getParameter<bool>("setSaturationFlag")),
00035 maxADCvalue_(conf.getParameter<int>("maxADCvalue")),
00036 doSaturationCorr_(conf.getParameter<bool>("doSaturationCorr"))
00037 {
00038 std::string subd=conf.getParameter<std::string>("Subdetector");
00039 if (!strcasecmp(subd.c_str(),"CASTOR")) {
00040 det_=DetId::Calo;
00041 subdet_=HcalCastorDetId::SubdetectorId;
00042 produces<CastorRecHitCollection>();
00043 } else {
00044 edm::LogWarning("CastorSimpleReconstructor") << "CastorSimpleReconstructor is not associated with CASTOR subdetector!" << std::endl;
00045 }
00046
00047 }
00048
00049 CastorSimpleReconstructor::~CastorSimpleReconstructor() {
00050 }
00051
00052 void CastorSimpleReconstructor::beginRun(edm::Run&r, edm::EventSetup const & es){
00053
00054
00055 }
00056 void CastorSimpleReconstructor::produce(edm::Event& e, const edm::EventSetup& eventSetup)
00057 {
00058
00059 edm::ESHandle<CastorDbService> conditions;
00060 eventSetup.get<CastorDbRecord>().get(conditions);
00061 const CastorQIEShape* shape = conditions->getCastorShape ();
00062
00063 CastorCalibrations calibrations;
00064
00065
00066 edm::ESHandle<CastorRecoParams> recoparams;
00067 if (tsFromDB_) {
00068 eventSetup.get<CastorRecoParamsRcd>().get(recoparams);
00069 if (!recoparams.isValid()) {
00070 tsFromDB_ = false;
00071 edm::LogWarning("CastorSimpleReconstructor") << "Could not handle the CastorRecoParamsRcd correctly, using parameters from cfg file from this event onwards... These parameters could be wrong for this run... please check" << std::endl;
00072 }
00073 }
00074
00075
00076 edm::ESHandle<CastorSaturationCorrs> satcorr;
00077 if (doSaturationCorr_) {
00078 eventSetup.get<CastorSaturationCorrsRcd>().get(satcorr);
00079 if (!satcorr.isValid()) {
00080 doSaturationCorr_ = false;
00081 edm::LogWarning("CastorSimpleReconstructor") << "Could not handle the CastorSaturationCorrsRcd correctly. We'll not try the saturation correction from this event onwards..." << std::endl;
00082 }
00083 }
00084
00085
00086 if (det_==DetId::Calo && subdet_==HcalCastorDetId::SubdetectorId) {
00087 edm::Handle<CastorDigiCollection> digi;
00088 e.getByLabel(inputLabel_,digi);
00089
00090
00091 std::auto_ptr<CastorRecHitCollection> rec(new CastorRecHitCollection);
00092
00093 CastorDigiCollection::const_iterator i;
00094 for (i=digi->begin(); i!=digi->end(); i++) {
00095 HcalCastorDetId cell = i->id();
00096 DetId detcell=(DetId)cell;
00097 const CastorCalibrations& calibrations=conditions->getCastorCalibrations(cell);
00098
00099 if (tsFromDB_) {
00100 const CastorRecoParam* param_ts = recoparams->getValues(detcell.rawId());
00101 reco_.resetTimeSamples(param_ts->firstSample(),param_ts->samplesToAdd());
00102 }
00103 const CastorQIECoder* channelCoder = conditions->getCastorCoder (cell);
00104 CastorCoderDb coder (*channelCoder, *shape);
00105
00106
00107 rec->push_back(reco_.reconstruct(*i,coder,calibrations));
00108
00109
00110 if (setSaturationFlag_) {
00111 reco_.checkADCSaturation(rec->back(),*i,maxADCvalue_);
00112
00113
00114 if (doSaturationCorr_ && rec->back().flagField(HcalCaloFlagLabels::ADCSaturationBit)) {
00115
00116 const CastorSaturationCorr* saturationCorr = satcorr->getValues(detcell.rawId());
00117 double satCorrConst = 1.;
00118 satCorrConst = saturationCorr->getValue();
00119 reco_.recoverADCSaturation(rec->back(),coder,calibrations,*i,maxADCvalue_,satCorrConst);
00120 }
00121 }
00122 }
00123
00124 e.put(rec);
00125 }
00126 }