00001 #ifndef RecoLocalCalo_EcalRecAlgos_EcalRecHitSimpleAlgo_HH 00002 #define RecoLocalCalo_EcalRecAlgos_EcalRecHitSimpleAlgo_HH 00003 00013 #include "RecoLocalCalo/EcalRecAlgos/interface/EcalRecHitAbsAlgo.h" 00014 #include "DataFormats/EcalDigi/interface/EcalDataFrame.h" 00015 #include "TMath.h" 00016 #include <iostream> 00017 00018 class EcalRecHitSimpleAlgo : public EcalRecHitAbsAlgo { 00019 public: 00020 // default ctor 00021 EcalRecHitSimpleAlgo() { 00022 adcToGeVConstant_ = -1; 00023 adcToGeVConstantIsSet_ = false; 00024 } 00025 00026 virtual void setADCToGeVConstant(const float& value) { 00027 adcToGeVConstant_ = value; 00028 adcToGeVConstantIsSet_ = true; 00029 } 00030 00031 00032 // destructor 00033 virtual ~EcalRecHitSimpleAlgo() { }; 00034 00036 virtual EcalRecHit makeRecHit(const EcalUncalibratedRecHit& uncalibRH, 00037 const float& intercalibConstant, 00038 const float& timeIntercalib = 0, 00039 const uint32_t& flags = 0) const { 00040 00041 if(!adcToGeVConstantIsSet_) { 00042 std::cout << "EcalRecHitSimpleAlgo::makeRecHit: adcToGeVConstant_ not set before calling this method!" << 00043 " will use -1 and produce bogus rechits!" << std::endl; 00044 } 00045 00046 float clockToNsConstant = 25; 00047 float energy = uncalibRH.amplitude()*adcToGeVConstant_*intercalibConstant; 00048 float time = uncalibRH.jitter() * clockToNsConstant + timeIntercalib; 00049 00050 EcalRecHit rh( uncalibRH.id(), energy, time ); 00051 rh.setChi2( uncalibRH.chi2() ); 00052 rh.setOutOfTimeEnergy( uncalibRH.outOfTimeEnergy() * adcToGeVConstant_ * intercalibConstant ); 00053 rh.setOutOfTimeChi2( uncalibRH.outOfTimeChi2() ); 00054 rh.setTimeError(uncalibRH.jitterErrorBits()); 00055 00056 // Now fill flags 00057 00058 bool good=true; 00059 00060 if ( uncalibRH.checkFlag(EcalUncalibratedRecHit::kLeadingEdgeRecovered) ){ 00061 rh.setFlag(EcalRecHit::kLeadingEdgeRecovered); 00062 good=false; 00063 } 00064 if ( uncalibRH.checkFlag(EcalUncalibratedRecHit::kSaturated) ) { 00065 // leading edge recovery failed - still keep the information 00066 // about the saturation and do not flag as dead 00067 rh.setFlag(EcalRecHit::kSaturated); 00068 good=false; 00069 } 00070 if( uncalibRH.isSaturated() ) { 00071 rh.setFlag(EcalRecHit::kSaturated); 00072 good=false; 00073 } 00074 if ( uncalibRH.checkFlag(EcalUncalibratedRecHit::kOutOfTime) ) { 00075 rh.setFlag(EcalRecHit::kOutOfTime) ; 00076 good=false; 00077 } 00078 if ( uncalibRH.checkFlag(EcalUncalibratedRecHit::kPoorReco) ) { 00079 rh.setFlag(EcalRecHit::kPoorReco); 00080 good=false; 00081 } 00082 if ( uncalibRH.checkFlag( EcalUncalibratedRecHit::kHasSwitchToGain6 ) ) { 00083 rh.setFlag(EcalRecHit::kHasSwitchToGain6); 00084 } 00085 if (uncalibRH.checkFlag( EcalUncalibratedRecHit::kHasSwitchToGain1 ) ) { 00086 rh.setFlag(EcalRecHit::kHasSwitchToGain1); 00087 } 00088 00089 if (good) rh.setFlag(EcalRecHit::kGood); 00090 return rh; 00091 } 00092 00093 private: 00094 float adcToGeVConstant_; 00095 bool adcToGeVConstantIsSet_; 00096 00097 }; 00098 #endif