diff --git a/CalibFormats/CaloObjects/src/CaloTSamples.cc b/CalibFormats/CaloObjects/src/CaloTSamples.cc index 394eae1f38f60..b293d5c5de85c 100644 --- a/CalibFormats/CaloObjects/src/CaloTSamples.cc +++ b/CalibFormats/CaloObjects/src/CaloTSamples.cc @@ -1,7 +1,9 @@ -#include "CalibFormats/CaloObjects/interface/CaloTSamples.icc" #include "CalibFormats/CaloObjects/interface/CaloTSamplesBase.icc" +#include "CalibFormats/CaloObjects/interface/CaloTSamples.icc" +#include "CondFormats/EcalObjects/interface/EcalConstants.h" template class CaloTSamplesBase; -template class CaloTSamples; +template class CaloTSamples; template class CaloTSamples; +template class CaloTSamples; diff --git a/CondFormats/DataRecord/interface/EcalCATIAGainRatiosRcd.h b/CondFormats/DataRecord/interface/EcalCATIAGainRatiosRcd.h new file mode 100644 index 0000000000000..a05b14aa67d07 --- /dev/null +++ b/CondFormats/DataRecord/interface/EcalCATIAGainRatiosRcd.h @@ -0,0 +1,6 @@ +#ifndef CondFormats_DataRecord_EcalCATIAGainRatiosRcd_H +#define CondFormats_DataRecord_EcalCATIAGainRatiosRcd_H + +#include "FWCore/Framework/interface/EventSetupRecordImplementation.h" +class EcalCATIAGainRatiosRcd : public edm::eventsetup::EventSetupRecordImplementation {}; +#endif diff --git a/CondFormats/DataRecord/interface/EcalLiteDTUPedestalsRcd.h b/CondFormats/DataRecord/interface/EcalLiteDTUPedestalsRcd.h new file mode 100644 index 0000000000000..44cd477b836ef --- /dev/null +++ b/CondFormats/DataRecord/interface/EcalLiteDTUPedestalsRcd.h @@ -0,0 +1,6 @@ +#ifndef CondFormats_DataRecord_EcalLiteDTUPedestalsRcd_h +#define CondFormats_DataRecord_EcalLiteDTUPedestalsRcd_h + +#include "FWCore/Framework/interface/EventSetupRecordImplementation.h" +class EcalLiteDTUPedestalsRcd : public edm::eventsetup::EventSetupRecordImplementation {}; +#endif diff --git a/CondFormats/DataRecord/src/EcalCATIAGainRatiosRcd.cc b/CondFormats/DataRecord/src/EcalCATIAGainRatiosRcd.cc new file mode 100644 index 0000000000000..d59977b155288 --- /dev/null +++ b/CondFormats/DataRecord/src/EcalCATIAGainRatiosRcd.cc @@ -0,0 +1,4 @@ +#include "CondFormats/DataRecord/interface/EcalCATIAGainRatiosRcd.h" +#include "FWCore/Framework/interface/eventsetuprecord_registration_macro.h" + +EVENTSETUP_RECORD_REG(EcalCATIAGainRatiosRcd); diff --git a/CondFormats/DataRecord/src/EcalLiteDTUPedestalsRcd.cc b/CondFormats/DataRecord/src/EcalLiteDTUPedestalsRcd.cc new file mode 100644 index 0000000000000..ca644efc17fa3 --- /dev/null +++ b/CondFormats/DataRecord/src/EcalLiteDTUPedestalsRcd.cc @@ -0,0 +1,4 @@ +#include "CondFormats/DataRecord/interface/EcalLiteDTUPedestalsRcd.h" +#include "FWCore/Framework/interface/eventsetuprecord_registration_macro.h" + +EVENTSETUP_RECORD_REG(EcalLiteDTUPedestalsRcd); diff --git a/CondFormats/EcalObjects/interface/EcalCATIAGainRatios.h b/CondFormats/EcalObjects/interface/EcalCATIAGainRatios.h new file mode 100644 index 0000000000000..56ba116355817 --- /dev/null +++ b/CondFormats/EcalObjects/interface/EcalCATIAGainRatios.h @@ -0,0 +1,10 @@ +#ifndef CondFormats_EcalObjects_EcalCATIAGainRatios_h +#define CondFormats_EcalObjects_EcalCATIAGainRatios_h + +#include "CondFormats/EcalObjects/interface/EcalCondObjectContainer.h" + +typedef float EcalCATIAGainRatio; +typedef EcalFloatCondObjectContainer EcalCATIAGainRatioMap; +typedef EcalCATIAGainRatioMap EcalCATIAGainRatios; + +#endif diff --git a/CondFormats/EcalObjects/interface/EcalConstants.h b/CondFormats/EcalObjects/interface/EcalConstants.h new file mode 100644 index 0000000000000..3d478730ddad9 --- /dev/null +++ b/CondFormats/EcalObjects/interface/EcalConstants.h @@ -0,0 +1,31 @@ +//Namespaces for Phase1 and Phase2 +#ifndef CondFormats_EcalObject_EcalConstants_h +#define CondFormats_EcalObject_EcalConstants_h + +class ecalPh2 { +public: + static constexpr double Samp_Period = 6.25; + static constexpr unsigned int NGAINS = 2; + static constexpr float gains[NGAINS] = {10., 1.}; + static constexpr unsigned int gainId1 = 1; + static constexpr unsigned int gainId10 = 0; + static constexpr unsigned int sampleSize = 16; + static constexpr unsigned int NBITS = 12; // number of available bits + static constexpr unsigned int MAXADC = (1 << NBITS) - 1; // 2^12 -1, adc max range + static constexpr unsigned int kEBChannels = 61200; + static constexpr double maxEneEB = 2000.; + static constexpr unsigned int kNOffsets = 2000; + static constexpr unsigned int kAdcMask = 0xFFF; + static constexpr unsigned int kGainIdMask = 0x3; + +}; // namespace ecalPh2 + +class ecalPh1 { +public: + static constexpr double Samp_Period = 25.; + static constexpr unsigned int NGAINS = 4; + static constexpr float gains[NGAINS] = {0., 12., 6., 1.}; + static constexpr unsigned int sampleSize = 10; + static constexpr unsigned int kNOffsets = 2000; +}; // namespace ecalPh1 +#endif diff --git a/CondFormats/EcalObjects/interface/EcalLiteDTUPedestals.h b/CondFormats/EcalObjects/interface/EcalLiteDTUPedestals.h new file mode 100644 index 0000000000000..4c505cc05e627 --- /dev/null +++ b/CondFormats/EcalObjects/interface/EcalLiteDTUPedestals.h @@ -0,0 +1,39 @@ +#ifndef CondFormats_EcalObject_EcalLiteDTUPedestals_h +#define CondFormats_EcalObject_EcalLiteDTUPedestals_h + +#include "CondFormats/Serialization/interface/Serializable.h" +#include "CondFormats/EcalObjects/interface/EcalCondObjectContainer.h" +#include "CondFormats/EcalObjects/interface/EcalConstants.h" + +class EcalLiteDTUPedestals { +public: + int setMean(unsigned int i, float value) { + if (i >= ecalPh2::NGAINS) + return -1; + else + meanarray[i] = value; + return 1; + } + + int setRMS(unsigned int i, float value) { + if (i >= ecalPh2::NGAINS) + return -1; + else + rmsarray[i] = value; + return 1; + } + + float mean(unsigned int i) const { return meanarray[i]; } + + float rms(unsigned int i) const { return rmsarray[i]; } + +private: + float meanarray[ecalPh2::NGAINS] = {13., 8.}; + float rmsarray[ecalPh2::NGAINS] = {2.8, 1.2}; + COND_SERIALIZABLE; +}; + +typedef EcalCondObjectContainer EcalLiteDTUPedestalsMap; +typedef EcalLiteDTUPedestalsMap::const_iterator EcalLiteDTUPedestalsMapIterator; + +#endif diff --git a/CondFormats/EcalObjects/src/SerializationManual.h b/CondFormats/EcalObjects/src/SerializationManual.h index 5efd2ebcc7440..2f6158477b05d 100644 --- a/CondFormats/EcalObjects/src/SerializationManual.h +++ b/CondFormats/EcalObjects/src/SerializationManual.h @@ -4,6 +4,7 @@ COND_SERIALIZATION_INSTANTIATE(EcalCondObjectContainer); COND_SERIALIZATION_INSTANTIATE(EcalCondObjectContainer); COND_SERIALIZATION_INSTANTIATE(EcalCondObjectContainer); +COND_SERIALIZATION_INSTANTIATE(EcalCondObjectContainer); COND_SERIALIZATION_INSTANTIATE(EcalCondObjectContainer); COND_SERIALIZATION_INSTANTIATE(EcalCondObjectContainer); COND_SERIALIZATION_INSTANTIATE(EcalCondObjectContainer); diff --git a/CondFormats/EcalObjects/src/T_EventSetup_EcalLiteDTUPedestals.cc b/CondFormats/EcalObjects/src/T_EventSetup_EcalLiteDTUPedestals.cc new file mode 100644 index 0000000000000..75bcfb76d8b96 --- /dev/null +++ b/CondFormats/EcalObjects/src/T_EventSetup_EcalLiteDTUPedestals.cc @@ -0,0 +1,4 @@ +#include "CondFormats/EcalObjects/interface/EcalLiteDTUPedestals.h" +#include "FWCore/Utilities/interface/typelookup.h" + +TYPELOOKUP_DATA_REG(EcalLiteDTUPedestalsMap); diff --git a/CondFormats/EcalObjects/src/classes.h b/CondFormats/EcalObjects/src/classes.h index 265320eb1ddea..2c40d0319ff6b 100644 --- a/CondFormats/EcalObjects/src/classes.h +++ b/CondFormats/EcalObjects/src/classes.h @@ -1,4 +1,4 @@ - +#include #include "CondFormats/EcalObjects/interface/EcalCondObjectContainer.h" #include "CondFormats/EcalObjects/interface/EcalCondTowerObjectContainer.h" #include "CondFormats/EcalObjects/interface/EcalPedestals.h" @@ -64,7 +64,9 @@ #include "CondFormats/EcalObjects/interface/EcalTPGSpike.h" #include "CondFormats/EcalObjects/interface/EcalSRSettings.h" #include "CondFormats/EcalObjects/interface/EcalSimPulseShape.h" -#include +//ECAL PH2: +#include "CondFormats/EcalObjects/interface/EcalLiteDTUPedestals.h" +#include "CondFormats/EcalObjects/interface/EcalCATIAGainRatios.h" namespace CondFormats_EcalObjects { struct dictionary { @@ -93,6 +95,11 @@ namespace CondFormats_EcalObjects { EcalContainer ec_ebDetId_ecalPedestal; EcalCondObjectContainer pedmap; //typedef EcalPedestals + //ECAL PH2: + std::vector v_ecalDTUPedestals; + EcalContainer ec_ebDetId_ecalLiteDTUPedestals; + EcalCondObjectContainer pedmapDTU; //typedef EcalPedestals + std::vector v_ecalTPGCrystalStatusCode; EcalContainer ec_eeDetId_ecalTPGCrystalStatusCode; EcalContainer ec_ebDetId_ecalTPGCrystalStatusCode; diff --git a/CondFormats/EcalObjects/src/classes_def.xml b/CondFormats/EcalObjects/src/classes_def.xml index 67d8101caa54e..c5cc8af4e828b 100644 --- a/CondFormats/EcalObjects/src/classes_def.xml +++ b/CondFormats/EcalObjects/src/classes_def.xml @@ -82,6 +82,14 @@ + + + + + + + + diff --git a/CondFormats/EcalObjects/xml/EcalChannelStatus_default.xml b/CondFormats/EcalObjects/xml/EcalChannelStatus_default.xml deleted file mode 100644 index be8eb21c4833a..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalChannelStatus_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalCondObjectContainer_default.xml b/CondFormats/EcalObjects/xml/EcalCondObjectContainer_default.xml deleted file mode 100644 index 87fe5b5319af5..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalCondObjectContainer_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalFunctionParameters_default.xml b/CondFormats/EcalObjects/xml/EcalFunctionParameters_default.xml deleted file mode 100644 index ca45832b26b28..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalFunctionParameters_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalGainRatios_default.xml b/CondFormats/EcalObjects/xml/EcalGainRatios_default.xml deleted file mode 100644 index 050c65b234fbb..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalGainRatios_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalLaserAPDPNRatios_default.xml b/CondFormats/EcalObjects/xml/EcalLaserAPDPNRatios_default.xml deleted file mode 100644 index 86d9162ad5b94..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalLaserAPDPNRatios_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalMappingElectronics_default.xml b/CondFormats/EcalObjects/xml/EcalMappingElectronics_default.xml deleted file mode 100644 index a3a56a29dd255..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalMappingElectronics_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalPedestals_default.xml b/CondFormats/EcalObjects/xml/EcalPedestals_default.xml deleted file mode 100644 index d2903c54b44af..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalPedestals_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalTBWeights_default.xml b/CondFormats/EcalObjects/xml/EcalTBWeights_default.xml deleted file mode 100644 index 1f5abd1eb0169..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalTBWeights_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalTPGCrystalStatus_default.xml b/CondFormats/EcalObjects/xml/EcalTPGCrystalStatus_default.xml deleted file mode 100644 index 488b062cd4a85..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalTPGCrystalStatus_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalTPGFineGrainEBGroup_default.xml b/CondFormats/EcalObjects/xml/EcalTPGFineGrainEBGroup_default.xml deleted file mode 100644 index 22c373b740e71..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalTPGFineGrainEBGroup_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalTPGFineGrainEBIdMap_default.xml b/CondFormats/EcalObjects/xml/EcalTPGFineGrainEBIdMap_default.xml deleted file mode 100644 index 4ae8fd7ecbd3a..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalTPGFineGrainEBIdMap_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalTPGFineGrainStripEE_default.xml b/CondFormats/EcalObjects/xml/EcalTPGFineGrainStripEE_default.xml deleted file mode 100644 index b7fbf86260d3a..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalTPGFineGrainStripEE_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalTPGLinearizationConst_default.xml b/CondFormats/EcalObjects/xml/EcalTPGLinearizationConst_default.xml deleted file mode 100644 index 7e9ecb55e00e5..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalTPGLinearizationConst_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalTPGLutGroupIdMap_default.xml b/CondFormats/EcalObjects/xml/EcalTPGLutGroupIdMap_default.xml deleted file mode 100644 index 35af296d524ae..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalTPGLutGroupIdMap_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalTPGLutGroup_default.xml b/CondFormats/EcalObjects/xml/EcalTPGLutGroup_default.xml deleted file mode 100644 index e6bc278f03428..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalTPGLutGroup_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalTPGPedestals_default.xml b/CondFormats/EcalObjects/xml/EcalTPGPedestals_default.xml deleted file mode 100644 index 91127f56fbcca..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalTPGPedestals_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalTPGTowerStatus_default.xml b/CondFormats/EcalObjects/xml/EcalTPGTowerStatus_default.xml deleted file mode 100644 index 9bb3ad24d8826..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalTPGTowerStatus_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalTPGWeightGroup_default.xml b/CondFormats/EcalObjects/xml/EcalTPGWeightGroup_default.xml deleted file mode 100644 index 07eecbee3c3da..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalTPGWeightGroup_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalTPGWeightIdMap_default.xml b/CondFormats/EcalObjects/xml/EcalTPGWeightIdMap_default.xml deleted file mode 100644 index 1c4a0d9ec30a3..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalTPGWeightIdMap_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/CondFormats/EcalObjects/xml/EcalWeightXtalGroups_default.xml b/CondFormats/EcalObjects/xml/EcalWeightXtalGroups_default.xml deleted file mode 100644 index 13d0159cb6d83..0000000000000 --- a/CondFormats/EcalObjects/xml/EcalWeightXtalGroups_default.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/DataFormats/EcalDigi/interface/EBDataFrame.h b/DataFormats/EcalDigi/interface/EBDataFrame.h index cb6ded7d25a82..89c6e97da5419 100644 --- a/DataFormats/EcalDigi/interface/EBDataFrame.h +++ b/DataFormats/EcalDigi/interface/EBDataFrame.h @@ -3,6 +3,7 @@ #include "DataFormats/EcalDetId/interface/EBDetId.h" #include "DataFormats/EcalDigi/interface/EcalDataFrame.h" +#include "DataFormats/EcalDigi/interface/EcalDataFrame_Ph2.h" #include /** \class EBDataFrame diff --git a/DataFormats/EcalDigi/interface/EcalDataFrame_Ph2.h b/DataFormats/EcalDigi/interface/EcalDataFrame_Ph2.h new file mode 100644 index 0000000000000..6e42cbbbee909 --- /dev/null +++ b/DataFormats/EcalDigi/interface/EcalDataFrame_Ph2.h @@ -0,0 +1,38 @@ +#ifndef DataFormats_EcalDigi_EcalDataFrame_Ph2_h +#define DataFormats_EcalDigi_EcalDataFrame_Ph2_h +#include "DataFormats/EcalDigi/interface/EcalLiteDTUSample.h" +#include "DataFormats/DetId/interface/DetId.h" +#include "DataFormats/Common/interface/DataFrame.h" +#include "CondFormats/EcalObjects/interface/EcalConstants.h" + +/** \class EcalDataFrame_Ph2 + +*/ +class EcalDataFrame_Ph2 { +public: + EcalDataFrame_Ph2() {} + EcalDataFrame_Ph2(edm::DataFrame const& iframe) : m_data(iframe) {} + + virtual ~EcalDataFrame_Ph2() {} + + DetId id() const { return m_data.id(); } + + int size() const { return m_data.size(); } + + EcalLiteDTUSample operator[](int i) const { return m_data[i]; } + EcalLiteDTUSample sample(int i) const { return m_data[i]; } + + // FIXME (shall we throw??) + void setSize(int) {} + void setSample(int i, EcalLiteDTUSample sam) { m_data[i] = sam; } + + static constexpr int MAXSAMPLES = ecalPh2::sampleSize; + + edm::DataFrame const& frame() const { return m_data; } + edm::DataFrame& frame() { return m_data; } + +private: + edm::DataFrame m_data; +}; + +#endif diff --git a/DataFormats/EcalDigi/interface/EcalDigiCollections.h b/DataFormats/EcalDigi/interface/EcalDigiCollections.h index 3a117d2cc908a..49b7042bde065 100644 --- a/DataFormats/EcalDigi/interface/EcalDigiCollections.h +++ b/DataFormats/EcalDigi/interface/EcalDigiCollections.h @@ -18,6 +18,29 @@ #include "DataFormats/DetId/interface/DetId.h" #include "DataFormats/EcalDetId/interface/EcalSubdetector.h" #include "DataFormats/Common/interface/DataFrameContainer.h" +#include "CondFormats/EcalObjects/interface/EcalConstants.h" + +class EcalDigiCollectionPh2 : public edm::DataFrameContainer { +public: + typedef edm::DataFrameContainer::size_type size_type; + static const size_type MAXSAMPLES = ecalPh2::sampleSize; + explicit EcalDigiCollectionPh2(size_type istride = MAXSAMPLES, int isubdet = 0) + : edm::DataFrameContainer(istride, isubdet) {} + void swap(DataFrameContainer& other) { this->DataFrameContainer::swap(other); } +}; + +class EBDigiCollectionPh2 : public EcalDigiCollectionPh2 { +public: + typedef edm::DataFrameContainer::size_type size_type; + typedef EBDataFrame Digi; + typedef Digi::key_type DetId; + + EBDigiCollectionPh2(size_type istride = MAXSAMPLES) : EcalDigiCollectionPh2(istride, EcalBarrel) {} + void swap(EBDigiCollectionPh2& other) { this->EcalDigiCollectionPh2::swap(other); } + void push_back(const Digi& digi) { DataFrameContainer::push_back(digi.id(), digi.frame().begin()); } + void push_back(id_type iid) { DataFrameContainer::push_back(iid); } + void push_back(id_type iid, data_type const* idata) { DataFrameContainer::push_back(iid, idata); } +}; class EcalDigiCollection : public edm::DataFrameContainer { public: @@ -89,6 +112,10 @@ inline void swap(EEDigiCollection& lhs, EEDigiCollection& rhs) { lhs.swap(rhs); inline void swap(ESDigiCollection& lhs, ESDigiCollection& rhs) { lhs.swap(rhs); } +inline void swap(EcalDigiCollectionPh2& lhs, EcalDigiCollectionPh2& rhs) { lhs.swap(rhs); } + +inline void swap(EBDigiCollectionPh2& lhs, EBDigiCollectionPh2& rhs) { lhs.swap(rhs); } + typedef edm::SortedCollection EcalTimeDigiCollection; typedef edm::SortedCollection EcalTrigPrimDigiCollection; typedef edm::SortedCollection EcalEBTrigPrimDigiCollection; diff --git a/DataFormats/EcalDigi/interface/EcalLiteDTUSample.h b/DataFormats/EcalDigi/interface/EcalLiteDTUSample.h new file mode 100644 index 0000000000000..e359e3438d963 --- /dev/null +++ b/DataFormats/EcalDigi/interface/EcalLiteDTUSample.h @@ -0,0 +1,47 @@ +#ifndef DataFormats_EcalDigi_EcalLiteDTUSample_h +#define DataFormats_EcalDigi_EcalLiteDTUSample_h + +#include +#include +#include "CondFormats/EcalObjects/interface/EcalConstants.h" + +namespace ecalLiteDTU { + typedef uint16_t sample_type; + + /// get the ADC sample (12 bits) + constexpr int adc(sample_type sample) { return sample & ecalPh2::kAdcMask; } + /// get the gainId (2 bits) + constexpr int gainId(sample_type sample) { return (sample >> ecalPh2::NBITS) & ecalPh2::kGainIdMask; } + constexpr sample_type pack(int adc, int gainId) { + return (adc & ecalPh2::kAdcMask) | ((gainId & ecalPh2::kGainIdMask) << ecalPh2::NBITS); + } +} // namespace ecalLiteDTU + +/** \class EcalLiteDTUSample + * Simple container packer/unpacker for a single sample from the Lite_CATIA electronics + * + * + */ +class EcalLiteDTUSample { +public: + EcalLiteDTUSample() { theSample = 0; } + EcalLiteDTUSample(uint16_t data) { theSample = data; } + EcalLiteDTUSample(int adc, int gainId); + + /// get the raw word + uint16_t raw() const { return theSample; } + /// get the ADC sample (12 bits) + int adc() const { return theSample & ecalPh2::kAdcMask; } + /// get the gainId (2 bits) + int gainId() const { return (theSample >> ecalPh2::NBITS) & ecalPh2::kGainIdMask; } + /// for streaming + uint16_t operator()() const { return theSample; } + operator uint16_t() const { return theSample; } + +private: + uint16_t theSample; +}; + +std::ostream& operator<<(std::ostream&, const EcalLiteDTUSample&); + +#endif diff --git a/DataFormats/EcalDigi/src/EcalLiteDTUSample.cc b/DataFormats/EcalDigi/src/EcalLiteDTUSample.cc new file mode 100644 index 0000000000000..bb036f3472054 --- /dev/null +++ b/DataFormats/EcalDigi/src/EcalLiteDTUSample.cc @@ -0,0 +1,11 @@ +#include "DataFormats/EcalDigi/interface/EcalLiteDTUSample.h" +#include + +EcalLiteDTUSample::EcalLiteDTUSample(int adc, int gainId) { + theSample = (adc & ecalPh2::kAdcMask) | ((gainId & ecalPh2::kGainIdMask) << ecalPh2::NBITS); +} + +std::ostream& operator<<(std::ostream& s, const EcalLiteDTUSample& samp) { + s << "ADC=" << samp.adc() << ", gainId=" << samp.gainId(); + return s; +} diff --git a/DataFormats/EcalDigi/src/classes_def.xml b/DataFormats/EcalDigi/src/classes_def.xml index cd9b32c91ae11..9c40edacab4db 100644 --- a/DataFormats/EcalDigi/src/classes_def.xml +++ b/DataFormats/EcalDigi/src/classes_def.xml @@ -72,6 +72,13 @@ + + + + + + + @@ -91,6 +98,8 @@ + + diff --git a/GeneratorInterface/Pythia6Interface/test/Py6HadFilter_cfg.py b/GeneratorInterface/Pythia6Interface/test/Py6HadFilter_cfg.py deleted file mode 100644 index 06cf1b1b42b3b..0000000000000 --- a/GeneratorInterface/Pythia6Interface/test/Py6HadFilter_cfg.py +++ /dev/null @@ -1,60 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -from Configuration.Generator.PythiaUESettings_cfi import * - -process = cms.Process("TEST") -process.load("FWCore.Framework.test.cmsExceptionsFatal_cff") -process.load("SimGeneral.HepPDTESSource.pythiapdt_cfi") -#process.load("SimGeneral.HepPDTESSource.pdt_cfi") - -process.load("Configuration.StandardSequences.Services_cff") - -process.RandomNumberGeneratorService = cms.Service("RandomNumberGeneratorService", - generator = cms.PSet( - initialSeed = cms.untracked.uint32(123456789), - engineName = cms.untracked.string('HepJamesRandom') - ) -) - -process.randomEngineStateProducer = cms.EDProducer("RandomEngineStateProducer") - -# The following three lines reduce the clutter of repeated printouts -# of the same exception message. -process.load("FWCore.MessageLogger.MessageLogger_cfi") -process.MessageLogger.destinations = ['cerr'] -process.MessageLogger.statistics = [] -process.MessageLogger.fwkJobReports = [] - -process.maxEvents = cms.untracked.PSet(input = cms.untracked.int32(50)) - -process.source = cms.Source("LHESource", - fileNames = cms.untracked.vstring('file:ttbar_5flavours_xqcut20_10TeV.lhe') -) - -process.generator = cms.EDFilter("Pythia6HadronizerFilter", - pythiaHepMCVerbosity = cms.untracked.bool(True), - maxEventsToPrint = cms.untracked.int32(0), - pythiaPylistVerbosity = cms.untracked.int32(1), - comEnergy = cms.double(10000.0), - PythiaParameters = cms.PSet( - pythiaUESettingsBlock, - processParameters = cms.vstring('MSEL=0 ! User defined processes', - 'PMAS(5,1)=4.4 ! b quark mass', - 'PMAS(6,1)=172.4 ! t quark mass', - 'MSTJ(1)=1 ! Fragmentation/hadronization on or off', - 'MSTP(61)=1 ! Parton showering on or off'), - # This is a vector of ParameterSet names to be read, in this order - parameterSets = cms.vstring('pythiaUESettings', - 'processParameters') - ) -) - -process.GEN = cms.OutputModule("PoolOutputModule", - fileName = cms.untracked.string('TestTTbar.root') -) - -process.p = cms.Path(process.generator) -process.p1 = cms.Path(process.randomEngineStateProducer) -process.outpath = cms.EndPath(process.GEN) - -process.schedule = cms.Schedule(process.p, process.p1, process.outpath) diff --git a/HeavyFlavorAnalysis/Skimming/plugins/Tau3MuSkim.h b/HeavyFlavorAnalysis/Skimming/plugins/Tau3MuSkim.h deleted file mode 100644 index f83574fd5f7c5..0000000000000 --- a/HeavyFlavorAnalysis/Skimming/plugins/Tau3MuSkim.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef TAU3MUSKIM -#define TAU3MUSKIM - -// system include files -#include - -// user include files -#include "FWCore/Framework/interface/Frameworkfwd.h" -#include "FWCore/Framework/interface/EDFilter.h" -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/Framework/interface/MakerMacros.h" - -#include "FWCore/ParameterSet/interface/ParameterSet.h" - -// -// class declaration -// - -class Tau3MuReco; - -class Tau3MuSkim : public edm::EDFilter { -public: - explicit Tau3MuSkim(const edm::ParameterSet&); - ~Tau3MuSkim() override; - -private: - void beginJob() override; - bool filter(edm::Event&, const edm::EventSetup&) override; - void endJob() override; - - // ----------member data --------------------------- - Tau3MuReco* m_Tau3MuReco; -}; - -#endif diff --git a/RecoJets/Configuration/python/RecoJets_EventContent_cff.py b/RecoJets/Configuration/python/RecoJets_EventContent_cff.py index c1bd0d76dec5b..2812077fef52b 100644 --- a/RecoJets/Configuration/python/RecoJets_EventContent_cff.py +++ b/RecoJets/Configuration/python/RecoJets_EventContent_cff.py @@ -6,37 +6,14 @@ 'keep *_ak4CaloJets_rho_*', 'keep *_ak4CaloJets_sigma_*', 'keep *_ak4PFJetsCHS_*_*', + 'keep floatedmValueMap_puppi_*_*', 'keep *_ak4PFJetsPuppi_*_*', 'keep *_ak8PFJetsPuppi_*_*', 'keep *_ak8PFJetsPuppiSoftDrop_*_*', - 'keep recoPFJets_ak4PFJets_*_*', - 'keep *_ak4PFJets_rho_*', - 'keep *_ak4PFJets_sigma_*', - 'keep *_JetPlusTrackZSPCorJetAntiKt4_*_*', - 'keep *_caloTowers_*_*', - 'keep *_CastorTowerReco_*_*', - 'keep *_ak4JetTracksAssociatorAtVertex_*_*', - 'keep *_ak4JetTracksAssociatorAtVertexPF_*_*', - 'keep *_ak4JetTracksAssociatorExplicit_*_*', - 'keep *_ak4JetExtender_*_*', - 'keep *_ak4JetID_*_*', - 'keep recoBasicJets_ak5CastorJets_*_*', - 'keep *_ak5CastorJets_rho_*', - 'keep *_ak5CastorJets_sigma_*', - 'keep *_ak5CastorJetID_*_*', - 'keep recoBasicJets_ak7CastorJets_*_*', - 'keep *_ak7CastorJets_rho_*', - 'keep *_ak7CastorJets_sigma_*', - 'keep *_ak7CastorJetID_*_*', - 'keep *_fixedGridRhoAll_*_*', - 'keep *_fixedGridRhoFastjetAll_*_*', - 'keep *_fixedGridRhoFastjetAllTmp_*_*', - 'keep *_fixedGridRhoFastjetCentral_*_*', - 'keep *_fixedGridRhoFastjetAllCalo_*_*', - 'keep *_fixedGridRhoFastjetCentralCalo_*_*', - 'keep *_fixedGridRhoFastjetCentralChargedPileUp_*_*', - 'keep *_fixedGridRhoFastjetCentralNeutral_*_*', + 'keep *_ak8PFJetsCHS_*_*', + 'keep *_ak8PFJetsCHSSoftDrop_*_*', + 'keep *_cmsTopTagPFJetsCHS_*_*', 'keep *_ak8PFJetsPuppiSoftDropMass_*_*' ) ) diff --git a/SimCalorimetry/Configuration/python/ecalDigiSequence_cff.py b/SimCalorimetry/Configuration/python/ecalDigiSequence_cff.py index c8250bc348ae8..c6d368f3569b2 100644 --- a/SimCalorimetry/Configuration/python/ecalDigiSequence_cff.py +++ b/SimCalorimetry/Configuration/python/ecalDigiSequence_cff.py @@ -18,8 +18,14 @@ premix_stage1.toReplaceWith(ecalDigiTask, ecalDigiTask.copyAndExclude([simEcalPreshowerDigis])) from SimCalorimetry.EcalEBTrigPrimProducers.ecalEBTriggerPrimitiveDigis_cff import * -_phase2_ecalDigiTask = ecalDigiTask.copy() -_phase2_ecalDigiTask.add(simEcalEBTriggerPrimitiveDigis) + +#DARIO COMMENTED: +#_phase2_ecalDigiTask = ecalDigiTask.copy() +#_phase2_ecalDigiTask.add(simEcalEBTriggerPrimitiveDigis) + +#DARIO ADDED: +#_phase2_ecalDigiTask = cms.Task(simEcalDigis) +_phase2_ecalDigiTask = cms.Task() from Configuration.Eras.Modifier_phase2_common_cff import phase2_common phase2_common.toReplaceWith(ecalDigiTask,_phase2_ecalDigiTask) diff --git a/SimCalorimetry/EcalSelectiveReadoutProducers/python/ecalDigis_cfi.py b/SimCalorimetry/EcalSelectiveReadoutProducers/python/ecalDigis_cfi.py index 094977444b01f..a0059c85f17e3 100644 --- a/SimCalorimetry/EcalSelectiveReadoutProducers/python/ecalDigis_cfi.py +++ b/SimCalorimetry/EcalSelectiveReadoutProducers/python/ecalDigis_cfi.py @@ -38,6 +38,7 @@ trigPrimCollection = cms.string(''), #switch to run w/o trigger primitive. For debug use only + trigPrimBypass = cms.bool(False), # Mode selection for "Trig bypass" mode @@ -72,6 +73,80 @@ defaultTtf = cms.int32(4) ) + +_simEcalDigisPh2 = cms.EDProducer("EcalSelectiveReadoutProducer", + # Label of input EB and EE digi collections + digiProducer = cms.string('simEcalUnsuppressedDigis'), + + # Instance name of input EB digi collections + EBdigiCollection = cms.string(''), + + # Instance name of input EB digi collections + EEdigiCollection = cms.string(''), + + # Instance name of output EB SR flags collection + EBSrFlagCollection = cms.string('ebSrFlags'), + + # Instance name of output EE SR flags collection + EESrFlagCollection = cms.string('eeSrFlags'), + + # Instance name of output EB digis collection + EBSRPdigiCollection = cms.string('ebDigis'), + + # Instance name of output EE digis collection + EESRPdigiCollection = cms.string('eeDigis'), + + # Switch for reading SRP settings from condition database + configFromCondDB = cms.bool(True), + + # Switch to turn off SRP altogether using special DB payload + UseFullReadout = cms.bool(False), + + # ES label? + # NZSLabel = cms.ESInputTag(' '), + + # Label name of input ECAL trigger primitive collection + trigPrimProducer = cms.string('simEcalTriggerPrimitiveDigis'), + + # Instance name of ECAL trigger primitive collection + trigPrimCollection = cms.string(''), + + #switch to run w/o trigger primitive. For debug use only + trigPrimBypass = cms.bool(True), + + # Mode selection for "Trig bypass" mode + # 0: TT thresholds applied on sum of crystal Et's + # 1: TT thresholds applies on compressed Et from Trigger primitive + # @ee trigPrimByPass_ switch + trigPrimBypassMode = cms.int32(0), + + #for debug mode only: + trigPrimBypassLTH = cms.double(1.0), + + #for debug mode only: + trigPrimBypassHTH = cms.double(1.0), + + #for debug mode only + trigPrimBypassWithPeakFinder = cms.bool(True), + + #number of events whose TT and SR flags must be dumped (for debug purpose): + dumpFlags = cms.untracked.int32(0), + + #logical flag to write out SrFlags + writeSrFlags = cms.untracked.bool(True), + + #switch to apply selective readout decision on the digis and produce + #the "suppressed" digis + produceDigis = cms.untracked.bool(True), + + #Trigger Tower Flag to use when a flag is not found from the input + #Trigger Primitive collection. Must be one of the following values: + # 0: low interest, 1: mid interest, 3: high interest + # 4: forced low interest, 5: forced mid interest, 7: forced high interest + defaultTtf = cms.int32(4) +) + + # Turn off SR in Ecal for premixing stage1 from Configuration.ProcessModifiers.premix_stage1_cff import premix_stage1 premix_stage1.toModify(simEcalDigis, UseFullReadout = True) diff --git a/SimCalorimetry/EcalSimAlgos/interface/EBHitResponse.h b/SimCalorimetry/EcalSimAlgos/interface/EBHitResponse.h index 80699d98f24a7..0455558478f4d 100644 --- a/SimCalorimetry/EcalSimAlgos/interface/EBHitResponse.h +++ b/SimCalorimetry/EcalSimAlgos/interface/EBHitResponse.h @@ -4,6 +4,7 @@ #include "CalibFormats/CaloObjects/interface/CaloTSamples.h" #include "SimCalorimetry/EcalSimAlgos/interface/EcalHitResponse.h" #include "CondFormats/EcalObjects/interface/EcalIntercalibConstantsMC.h" +#include "CondFormats/EcalObjects/interface/EcalConstants.h" class APDSimParameters; @@ -11,21 +12,24 @@ namespace CLHEP { class HepRandomEngine; } -class EBHitResponse : public EcalHitResponse { +template +class EBHitResponseImpl : public EcalHitResponse { public: - typedef CaloTSamples EBSamples; + typedef CaloTSamples EBSamples; typedef std::vector VecD; - enum { kNOffsets = 2000 }; + static constexpr size_t kNOffsets = constset::kNOffsets; - EBHitResponse(const CaloVSimParameterMap* parameterMap, - const CaloVShape* shape, - bool apdOnly, - const APDSimParameters* apdPars, - const CaloVShape* apdShape); + static constexpr double kSamplePeriod = constset::Samp_Period; - ~EBHitResponse() override; + EBHitResponseImpl(const CaloVSimParameterMap* parameterMap, + const CaloVShape* shape, + bool apdOnly, + const APDSimParameters* apdPars = nullptr, + const CaloVShape* apdShape = nullptr); + + ~EBHitResponseImpl() override; void initialize(CLHEP::HepRandomEngine*); @@ -58,6 +62,8 @@ class EBHitResponse : public EcalHitResponse { void putAPDSignal(const DetId& detId, double npe, double time); + void putAnalogSignal(const PCaloHit& inputHit, CLHEP::HepRandomEngine*) override; + private: const VecD& offsets() const { return m_timeOffVec; } @@ -95,4 +101,8 @@ class EBHitResponse : public EcalHitResponse { bool m_isInitialized; }; + +typedef EBHitResponseImpl EBHitResponse; +typedef EBHitResponseImpl EBHitResponse_Ph2; +#include "EBHitResponse.icc" #endif diff --git a/SimCalorimetry/EcalSimAlgos/src/EBHitResponse.cc b/SimCalorimetry/EcalSimAlgos/interface/EBHitResponse.icc similarity index 65% rename from SimCalorimetry/EcalSimAlgos/src/EBHitResponse.cc rename to SimCalorimetry/EcalSimAlgos/interface/EBHitResponse.icc index c500007a729eb..a416605d67bfc 100644 --- a/SimCalorimetry/EcalSimAlgos/src/EBHitResponse.cc +++ b/SimCalorimetry/EcalSimAlgos/interface/EBHitResponse.icc @@ -4,6 +4,7 @@ #include "SimCalorimetry/CaloSimAlgos/interface/CaloSimParameters.h" #include "SimCalorimetry/CaloSimAlgos/interface/CaloVHitFilter.h" #include "SimCalorimetry/CaloSimAlgos/interface/CaloVShape.h" +#include "SimCalorimetry/CaloSimAlgos/interface/CaloVHitCorrection.h" #include "Geometry/CaloGeometry/interface/CaloGenericDetId.h" #include "CLHEP/Random/RandPoissonQ.h" #include "CLHEP/Random/RandGaussQ.h" @@ -12,11 +13,12 @@ #include "FWCore/Utilities/interface/isFinite.h" #include "FWCore/Utilities/interface/Exception.h" -EBHitResponse::EBHitResponse(const CaloVSimParameterMap* parameterMap, - const CaloVShape* shape, - bool apdOnly, - const APDSimParameters* apdPars = nullptr, - const CaloVShape* apdShape = nullptr) +template +EBHitResponseImpl::EBHitResponseImpl(const CaloVSimParameterMap* parameterMap, + const CaloVShape* shape, + bool apdOnly, + const APDSimParameters* apdPars, + const CaloVShape* apdShape) : EcalHitResponse(parameterMap, shape), @@ -51,34 +53,35 @@ EBHitResponse::EBHitResponse(const CaloVSimParameterMap* parameterMap, } } -EBHitResponse::~EBHitResponse() {} +template +EBHitResponseImpl::~EBHitResponseImpl() {} -void EBHitResponse::initialize(CLHEP::HepRandomEngine* engine) { +template +void EBHitResponseImpl::initialize(CLHEP::HepRandomEngine* engine) { m_isInitialized = true; for (unsigned int i(0); i != kNOffsets; ++i) { m_timeOffVec[i] += CLHEP::RandGaussQ::shoot(engine, 0, apdParameters()->timeOffWidth()); } } -const APDSimParameters* EBHitResponse::apdParameters() const { +template +const APDSimParameters* EBHitResponseImpl::apdParameters() const { assert(nullptr != m_apdPars); return m_apdPars; } -const CaloVShape* EBHitResponse::apdShape() const { +template +const CaloVShape* EBHitResponseImpl::apdShape() const { assert(nullptr != m_apdShape); return m_apdShape; } -void EBHitResponse::putAPDSignal(const DetId& detId, double npe, double time) { +template +void EBHitResponseImpl::putAPDSignal(const DetId& detId, double npe, double time) { const CaloSimParameters& parameters(*params(detId)); const double energyFac(1. / parameters.simHitToPhotoelectrons(detId)); - // std::cout<<"******** Input APD Npe="< +void EBHitResponseImpl::setIntercal(const EcalIntercalibConstantsMC* ical) { + m_intercal = ical; +} -void EBHitResponse::findIntercalibConstant(const DetId& detId, double& icalconst) const { +template +void EBHitResponseImpl::findIntercalibConstant(const DetId& detId, double& icalconst) const { EcalIntercalibConstantMC thisconst(1.); if (nullptr == m_intercal) { @@ -148,7 +180,8 @@ void EBHitResponse::findIntercalibConstant(const DetId& detId, double& icalconst icalconst = thisconst; } -void EBHitResponse::initializeHits() { +template +void EBHitResponseImpl::initializeHits() { if (!index().empty()) blankOutUsedSamples(); @@ -160,7 +193,8 @@ void EBHitResponse::initializeHits() { } } -void EBHitResponse::finalizeHits() { +template +void EBHitResponseImpl::finalizeHits() { const unsigned int bSize(EBDetId::kSizeForDenseIndexing); if (apdParameters()->addToBarrel() || m_apdOnly) { for (unsigned int i(0); i != bSize; ++i) { @@ -175,7 +209,8 @@ void EBHitResponse::finalizeHits() { } } -void EBHitResponse::add(const PCaloHit& hit, CLHEP::HepRandomEngine* engine) { +template +void EBHitResponseImpl::add(const PCaloHit& hit, CLHEP::HepRandomEngine* engine) { if (!edm::isNotFinite(hit.time()) && (nullptr == hitFilter() || hitFilter()->accepts(hit))) { int iddepth = (hit.depth() & PCaloHit::kEcalDepthIdMask); if (0 == iddepth) // for now take only nonAPD hits @@ -194,7 +229,8 @@ void EBHitResponse::add(const PCaloHit& hit, CLHEP::HepRandomEngine* engine) { } } -void EBHitResponse::run(MixCollection& hits, CLHEP::HepRandomEngine* engine) { +template +void EBHitResponseImpl::run(MixCollection& hits, CLHEP::HepRandomEngine* engine) { if (!index().empty()) blankOutUsedSamples(); @@ -240,16 +276,37 @@ void EBHitResponse::run(MixCollection& hits, CLHEP::HepRandomEngine* e } } -unsigned int EBHitResponse::samplesSize() const { return m_vSam.size(); } +template +unsigned int EBHitResponseImpl::samplesSize() const { + return m_vSam.size(); +} -unsigned int EBHitResponse::samplesSizeAll() const { return m_vSam.size(); } +template +unsigned int EBHitResponseImpl::samplesSizeAll() const { + return m_vSam.size(); +} -const EcalHitResponse::EcalSamples* EBHitResponse::operator[](unsigned int i) const { return &m_vSam[i]; } +template +const EcalHitResponse::EcalSamples* EBHitResponseImpl::operator[](unsigned int i) const { + return &m_vSam[i]; +} -EcalHitResponse::EcalSamples* EBHitResponse::operator[](unsigned int i) { return &m_vSam[i]; } +template +EcalHitResponse::EcalSamples* EBHitResponseImpl::operator[](unsigned int i) { + return &m_vSam[i]; +} -EcalHitResponse::EcalSamples* EBHitResponse::vSam(unsigned int i) { return &m_vSam[i]; } +template +EcalHitResponse::EcalSamples* EBHitResponseImpl::vSam(unsigned int i) { + return &m_vSam[i]; +} -EcalHitResponse::EcalSamples* EBHitResponse::vSamAll(unsigned int i) { return &m_vSam[i]; } +template +EcalHitResponse::EcalSamples* EBHitResponseImpl::vSamAll(unsigned int i) { + return &m_vSam[i]; +} -const EcalHitResponse::EcalSamples* EBHitResponse::vSamAll(unsigned int i) const { return &m_vSam[i]; } +template +const EcalHitResponse::EcalSamples* EBHitResponseImpl::vSamAll(unsigned int i) const { + return &m_vSam[i]; +} diff --git a/SimCalorimetry/EcalSimAlgos/interface/EcalBaseSignalGenerator.h b/SimCalorimetry/EcalSimAlgos/interface/EcalBaseSignalGenerator.h index 19c7f6f3f6c0b..d5c307f3939f5 100644 --- a/SimCalorimetry/EcalSimAlgos/interface/EcalBaseSignalGenerator.h +++ b/SimCalorimetry/EcalSimAlgos/interface/EcalBaseSignalGenerator.h @@ -3,7 +3,6 @@ #include "SimCalorimetry/CaloSimAlgos/interface/CaloVNoiseSignalGenerator.h" #include "SimCalorimetry/EcalSimAlgos/interface/EcalSimParameterMap.h" -class EcalElectronicsSim; class EcalBaseSignalGenerator : public CaloVNoiseSignalGenerator { public: diff --git a/SimCalorimetry/EcalSimAlgos/interface/EcalCoder.h b/SimCalorimetry/EcalSimAlgos/interface/EcalCoder.h index ec60ac2f2af2a..6232f4a3fff43 100644 --- a/SimCalorimetry/EcalSimAlgos/interface/EcalCoder.h +++ b/SimCalorimetry/EcalSimAlgos/interface/EcalCoder.h @@ -1,6 +1,5 @@ - -#ifndef EcalSimAlgos_EcalCoder_h -#define EcalSimAlgos_EcalCoder_h 1 +#ifndef SimCalorimetry_EcalSimAlgos_EcalCoder_h +#define SimCalorimetry_EcalSimAlgos_EcalCoder_h #include "CalibFormats/CaloObjects/interface/CaloTSamples.h" #include "CondFormats/EcalObjects/interface/EcalPedestals.h" diff --git a/SimCalorimetry/EcalSimAlgos/interface/EcalCorrelatedNoiseMatrix.h b/SimCalorimetry/EcalSimAlgos/interface/EcalCorrelatedNoiseMatrix.h index e2239f4da5048..cb13bec15863f 100644 --- a/SimCalorimetry/EcalSimAlgos/interface/EcalCorrelatedNoiseMatrix.h +++ b/SimCalorimetry/EcalSimAlgos/interface/EcalCorrelatedNoiseMatrix.h @@ -3,7 +3,8 @@ #include "DataFormats/Math/interface/Error.h" #include "CalibFormats/CaloObjects/interface/CaloSamples.h" +#include "CondFormats/EcalObjects/interface/EcalConstants.h" -typedef math::ErrorD::type EcalCorrMatrix; - +typedef math::ErrorD::type EcalCorrMatrix; +typedef math::ErrorD::type EcalCorrMatrix_Ph2; #endif diff --git a/SimCalorimetry/EcalSimAlgos/interface/EcalDigitizerTraits.h b/SimCalorimetry/EcalSimAlgos/interface/EcalDigitizerTraits.h index f5565cc5d9cfd..31aa28a4f04e3 100644 --- a/SimCalorimetry/EcalSimAlgos/interface/EcalDigitizerTraits.h +++ b/SimCalorimetry/EcalSimAlgos/interface/EcalDigitizerTraits.h @@ -2,6 +2,8 @@ #define EcalSimAlgos_EcalDigitizerTraits_h #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EcalCoder.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EcalLiteDTUCoder.h" #include "SimCalorimetry/EcalSimAlgos/interface/EcalElectronicsSim.h" #include "SimCalorimetry/EcalSimAlgos/interface/ESElectronicsSimFast.h" #include "SimCalorimetry/EcalSimAlgos/interface/ESElectronicsSim.h" @@ -10,6 +12,7 @@ #include "DataFormats/EcalDigi/interface/EcalDataFrame.h" #include "DataFormats/EcalDigi/interface/EBDataFrame.h" #include "DataFormats/EcalDigi/interface/EEDataFrame.h" +#include "DataFormats/EcalDigi/interface/EcalDataFrame_Ph2.h" class EcalHitResponse; @@ -20,9 +23,8 @@ class EBDigitizerTraits { /// the dataframes typedef EBDataFrame Digi; /// the electronics simulation - typedef EcalElectronicsSim ElectronicsSim; - typedef CaloTSamples EcalSamples; + typedef EcalElectronicsSim ElectronicsSim; static void fix(Digi& digi, edm::DataFrame df){}; }; @@ -34,9 +36,8 @@ class EEDigitizerTraits { /// the dataframes typedef EEDataFrame Digi; /// the electronics simulation - typedef EcalElectronicsSim ElectronicsSim; - typedef CaloTSamples EcalSamples; + typedef EcalElectronicsSim ElectronicsSim; static void fix(Digi& digi, edm::DataFrame df) {} }; @@ -75,4 +76,17 @@ class ESOldDigitizerTraits { // typedef CaloTSamples EcalSamples ; }; +class EBDigitizerTraits_Ph2 { +public: + /// the digis collection + typedef EBDigiCollectionPh2 DigiCollection; + /// the dataframes + typedef EcalDataFrame_Ph2 Digi; + /// the electronics simulation + typedef CaloTSamples EcalSamples; + typedef EcalElectronicsSim ElectronicsSim; + + static void fix(Digi& digi, edm::DataFrame df){}; +}; + #endif diff --git a/SimCalorimetry/EcalSimAlgos/interface/EcalElectronicsSim.h b/SimCalorimetry/EcalSimAlgos/interface/EcalElectronicsSim.h index 73f159b2644be..c92221e031c76 100644 --- a/SimCalorimetry/EcalSimAlgos/interface/EcalElectronicsSim.h +++ b/SimCalorimetry/EcalSimAlgos/interface/EcalElectronicsSim.h @@ -1,11 +1,10 @@ #ifndef EcalSimAlgos_EcalElectronicsSim_h -#define EcalSimAlgos_EcalElectronicsSim_h 1 +#define EcalSimAlgos_EcalElectronicsSim_h -#include "CalibFormats/CaloObjects/interface/CaloTSamples.h" #include "SimCalorimetry/CaloSimAlgos/interface/CaloVNoiseSignalGenerator.h" +#include "CLHEP/Random/RandGaussQ.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EcalSimParameterMap.h" -class EcalCoder; -class EcalDataFrame; class EcalSimParameterMap; namespace CLHEP { @@ -17,19 +16,22 @@ namespace CLHEP { * */ +template class EcalElectronicsSim { public: - typedef CaloTSamples EcalSamples; - EcalElectronicsSim(const EcalSimParameterMap* parameterMap, - EcalCoder* coder, + CoderType* coder, bool applyConstantTerm, - double rmsConstantTerm); - - ~EcalElectronicsSim(); + double rmsConstantTerm) + : m_simMap(parameterMap), m_theCoder(coder), m_thisCT(rmsConstantTerm), m_applyConstantTerm(applyConstantTerm) {} /// from EcalSamples to EcalDataFrame - void analogToDigital(CLHEP::HepRandomEngine*, EcalSamples& clf, EcalDataFrame& df) const; + + void analogToDigital(CLHEP::HepRandomEngine* engine, SamplesType& clf, DataFrameType& df) const { + // input signal is in pe. Converted in GeV + amplify(clf, engine); + m_theCoder->analogToDigital(engine, clf, df); + } void newEvent() {} @@ -39,7 +41,14 @@ class EcalElectronicsSim { private: /// input signal is in pe. Converted in GeV - void amplify(EcalSamples& clf, CLHEP::HepRandomEngine*) const; + void amplify(SamplesType& clf, CLHEP::HepRandomEngine* engine) const { + const double fac(m_simMap->simParameters(clf.id()).photoelectronsToAnalog()); + if (m_applyConstantTerm) { + clf *= fac * CLHEP::RandGaussQ::shoot(engine, 1.0, m_thisCT); + } else { + clf *= fac; + } + } /// map of parameters @@ -47,7 +56,7 @@ class EcalElectronicsSim { const CaloVNoiseSignalGenerator* theNoiseSignalGenerator; - EcalCoder* m_theCoder; + CoderType* m_theCoder; const double m_thisCT; const bool m_applyConstantTerm; diff --git a/SimCalorimetry/EcalSimAlgos/interface/EcalHitResponse.h b/SimCalorimetry/EcalSimAlgos/interface/EcalHitResponse.h index 925080ee2539d..21fcf61525475 100644 --- a/SimCalorimetry/EcalSimAlgos/interface/EcalHitResponse.h +++ b/SimCalorimetry/EcalSimAlgos/interface/EcalHitResponse.h @@ -8,6 +8,7 @@ #include "SimDataFormats/CaloHit/interface/PCaloHit.h" #include "CalibCalorimetry/EcalLaserCorrection/interface/EcalLaserDbService.h" #include "DataFormats/Provenance/interface/Timestamp.h" +#include "CondFormats/EcalObjects/interface/EcalConstants.h" #include #include @@ -33,12 +34,12 @@ class EcalHitResponse { typedef std::unordered_map CalibCache; - enum { BUNCHSPACE = 25 }; - EcalHitResponse(const CaloVSimParameterMap* parameterMap, const CaloVShape* shape); virtual ~EcalHitResponse(); + const float kSamplePeriod = ecalPh1::Samp_Period; + void setBunchRange(int minBunch, int maxBunch); void setGeometry(const CaloSubdetectorGeometry* geometry); @@ -116,7 +117,6 @@ class EcalHitResponse { const CaloVHitFilter* hitFilter() const; -private: const CaloVSimParameterMap* m_parameterMap; const CaloVShape* m_shape; const CaloVHitCorrection* m_hitCorrection; @@ -125,6 +125,7 @@ class EcalHitResponse { const CaloSubdetectorGeometry* m_geometry; const EcalLaserDbService* m_lasercals; +private: int m_minBunch; int m_maxBunch; double m_phaseShift; diff --git a/SimCalorimetry/EcalSimAlgos/interface/EcalLiteDTUCoder.h b/SimCalorimetry/EcalSimAlgos/interface/EcalLiteDTUCoder.h new file mode 100644 index 0000000000000..5aeab7bd3846b --- /dev/null +++ b/SimCalorimetry/EcalSimAlgos/interface/EcalLiteDTUCoder.h @@ -0,0 +1,75 @@ +#ifndef SimCalorimetry_EcalSimAlgos_EcalLiteDTUCoder_h +#define SimCalorimetry_EcalSimAlgos_EcalLiteDTUCoder_h + +#include "CalibFormats/CaloObjects/interface/CaloTSamples.h" +#include "CondFormats/EcalObjects/interface/EcalLiteDTUPedestals.h" +#include "CondFormats/EcalObjects/interface/EcalIntercalibConstantsMC.h" +#include "CondFormats/EcalObjects/interface/EcalCATIAGainRatios.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EcalCorrelatedNoiseMatrix.h" +#include "CondFormats/EcalObjects/interface/EcalConstants.h" + +template +class CorrelatedNoisifier; +class EcalLiteDTUSample; +class EcalDataFrame_Ph2; +class DetId; +class EcalLiteDTUPed; + +#include + +namespace CLHEP { + class HepRandomEngine; +} + +class EcalLiteDTUCoder { +public: + typedef CaloTSamples EcalSamples; + + typedef CorrelatedNoisifier Noisifier; + + /// ctor + EcalLiteDTUCoder(bool addNoise, bool PreMix1, Noisifier* ebCorrNoise0, Noisifier* ebCorrNoise1 = nullptr); + + /// dtor + virtual ~EcalLiteDTUCoder(); + + /// can be fetched every event from the EventSetup + void setPedestals(const EcalLiteDTUPedestalsMap* pedestals); + + void setGainRatios(float gainRatios); + + void setFullScaleEnergy(double EBscale); + + void setIntercalibConstants(const EcalIntercalibConstantsMC* ical); + + /// from EcalSamples to EcalDataFrame_Ph2 + virtual void analogToDigital(CLHEP::HepRandomEngine*, const EcalSamples& clf, EcalDataFrame_Ph2& df) const; + +private: + /// limit on the energy scale due to the electronics range + double fullScaleEnergy(const DetId& did) const; + + /// produce the pulse-shape + void encode(const EcalSamples& ecalSamples, EcalDataFrame_Ph2& df, CLHEP::HepRandomEngine*) const; + + void findPedestal(const DetId& detId, int gainId, double& pedestal, double& width) const; + + void findGains(const DetId& detId, float theGains[]) const; + + void findIntercalibConstant(const DetId& detId, double& icalconst) const; + + const EcalLiteDTUPedestalsMap* m_peds; + + float m_gainRatios; // the electronics gains + + const EcalIntercalibConstantsMC* m_intercals; //record specific for simulation of gain variation in MC + + double m_maxEneEB; // max attainable energy in the ecal barrel + + bool m_addNoise; // whether add noise to the pedestals and the gains + bool m_PreMix1; // Follow necessary steps for PreMixing input + + const Noisifier* m_ebCorrNoise[ecalPh2::NGAINS]; +}; + +#endif diff --git a/SimCalorimetry/EcalSimAlgos/src/EcalCorrelatedNoiseMatrix.cc b/SimCalorimetry/EcalSimAlgos/src/EcalCorrelatedNoiseMatrix.cc index 20d9745aacfb3..02f7e1741a3ca 100644 --- a/SimCalorimetry/EcalSimAlgos/src/EcalCorrelatedNoiseMatrix.cc +++ b/SimCalorimetry/EcalSimAlgos/src/EcalCorrelatedNoiseMatrix.cc @@ -2,7 +2,12 @@ #include "SimGeneral/NoiseGenerators/interface/CorrelatedNoisifier.icc" template class CorrelatedNoisifier; +template class CorrelatedNoisifier; template void CorrelatedNoisifier::noisify(CaloSamples&, CLHEP::HepRandomEngine*, const std::vector* rangau) const; + +template void CorrelatedNoisifier::noisify(CaloSamples&, + CLHEP::HepRandomEngine*, + const std::vector* rangau) const; diff --git a/SimCalorimetry/EcalSimAlgos/src/EcalDigitizers.cc b/SimCalorimetry/EcalSimAlgos/src/EcalDigitizers.cc index 4c3dc081c69bc..f8ed56952ed27 100644 --- a/SimCalorimetry/EcalSimAlgos/src/EcalDigitizers.cc +++ b/SimCalorimetry/EcalSimAlgos/src/EcalDigitizers.cc @@ -4,3 +4,5 @@ template class EcalTDigitizer; template class EcalTDigitizer; template class EcalTDigitizer; + +template class EcalTDigitizer; diff --git a/SimCalorimetry/EcalSimAlgos/src/EcalElectronicsSim.cc b/SimCalorimetry/EcalSimAlgos/src/EcalElectronicsSim.cc deleted file mode 100644 index 35e7ec36d9ffa..0000000000000 --- a/SimCalorimetry/EcalSimAlgos/src/EcalElectronicsSim.cc +++ /dev/null @@ -1,37 +0,0 @@ -#include "SimCalorimetry/EcalSimAlgos/interface/EcalElectronicsSim.h" -#include "SimCalorimetry/EcalSimAlgos/interface/EcalCoder.h" -#include "SimCalorimetry/EcalSimAlgos/interface/EcalSimParameterMap.h" - -#include "CLHEP/Random/RandGaussQ.h" - -#include -#include -#include -#include -#include - -EcalElectronicsSim::EcalElectronicsSim(const EcalSimParameterMap* parameterMap, - EcalCoder* coder, - bool applyConstantTerm, - double rmsConstantTerm) - : m_simMap(parameterMap), m_theCoder(coder), m_thisCT(rmsConstantTerm), m_applyConstantTerm(applyConstantTerm) {} - -EcalElectronicsSim::~EcalElectronicsSim() {} - -void EcalElectronicsSim::analogToDigital(CLHEP::HepRandomEngine* engine, - EcalElectronicsSim::EcalSamples& clf, - EcalDataFrame& df) const { - //PG input signal is in pe. Converted in GeV - amplify(clf, engine); - - m_theCoder->analogToDigital(engine, clf, df); -} - -void EcalElectronicsSim::amplify(EcalElectronicsSim::EcalSamples& clf, CLHEP::HepRandomEngine* engine) const { - const double fac(m_simMap->simParameters(clf.id()).photoelectronsToAnalog()); - if (m_applyConstantTerm) { - clf *= fac * CLHEP::RandGaussQ::shoot(engine, 1.0, m_thisCT); - } else { - clf *= fac; - } -} diff --git a/SimCalorimetry/EcalSimAlgos/src/EcalHitResponse.cc b/SimCalorimetry/EcalSimAlgos/src/EcalHitResponse.cc index b86a7f949a051..02b9e45f8ce34 100644 --- a/SimCalorimetry/EcalSimAlgos/src/EcalHitResponse.cc +++ b/SimCalorimetry/EcalSimAlgos/src/EcalHitResponse.cc @@ -145,7 +145,7 @@ void EcalHitResponse::putAnalogSignal(const PCaloHit& hit, CLHEP::HepRandomEngin const double jitter(time - timeOfFlight(detId)); const double tzero = (shape()->timeToRise() + parameters->timePhase() - jitter - - BUNCHSPACE * (parameters->binOfMaximum() - m_phaseShift)); + kSamplePeriod * (parameters->binOfMaximum() - m_phaseShift)); double binTime(tzero); EcalSamples& result(*findSignal(detId)); @@ -154,7 +154,7 @@ void EcalHitResponse::putAnalogSignal(const PCaloHit& hit, CLHEP::HepRandomEngin for (unsigned int bin(0); bin != rsize; ++bin) { result[bin] += (*shape())(binTime)*signal; - binTime += BUNCHSPACE; + binTime += kSamplePeriod; } } diff --git a/SimCalorimetry/EcalSimAlgos/src/EcalLiteDTUCoder.cc b/SimCalorimetry/EcalSimAlgos/src/EcalLiteDTUCoder.cc new file mode 100644 index 0000000000000..0e65a14ef9366 --- /dev/null +++ b/SimCalorimetry/EcalSimAlgos/src/EcalLiteDTUCoder.cc @@ -0,0 +1,177 @@ +#include "SimCalorimetry/EcalSimAlgos/interface/EcalLiteDTUCoder.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "SimGeneral/NoiseGenerators/interface/CorrelatedNoisifier.h" +#include "DataFormats/EcalDigi/interface/EcalLiteDTUSample.h" +#include "DataFormats/EcalDigi/interface/EcalDataFrame_Ph2.h" + +#include "CondFormats/EcalObjects/interface/EcalConstants.h" + +#include + +EcalLiteDTUCoder::EcalLiteDTUCoder(bool addNoise, + bool PreMix1, + EcalLiteDTUCoder::Noisifier* ebCorrNoise0, + EcalLiteDTUCoder::Noisifier* ebCorrNoise1) + : m_peds(nullptr), + m_gainRatios(0), + m_intercals(nullptr), + m_maxEneEB(ecalPh2::maxEneEB), // Maximum for CATIA: LSB gain 10: 0.048 MeV + m_addNoise(addNoise), + m_PreMix1(PreMix1) + +{ + m_ebCorrNoise[0] = ebCorrNoise0; + m_ebCorrNoise[1] = ebCorrNoise1; +} + +EcalLiteDTUCoder::~EcalLiteDTUCoder() {} + +void EcalLiteDTUCoder::setFullScaleEnergy(double EBscale) { m_maxEneEB = ecalPh2::maxEneEB; } + +void EcalLiteDTUCoder::setPedestals(const EcalLiteDTUPedestalsMap* pedestals) { m_peds = pedestals; } + +void EcalLiteDTUCoder::setGainRatios(float gainRatios) { m_gainRatios = gainRatios; } + +void EcalLiteDTUCoder::setIntercalibConstants(const EcalIntercalibConstantsMC* ical) { m_intercals = ical; } + +double EcalLiteDTUCoder::fullScaleEnergy(const DetId& detId) const { return m_maxEneEB; } + +void EcalLiteDTUCoder::analogToDigital(CLHEP::HepRandomEngine* engine, + const EcalSamples& clf, + EcalDataFrame_Ph2& df) const { + df.setSize(clf.size()); + encode(clf, df, engine); +} + +void EcalLiteDTUCoder::encode(const EcalSamples& ecalSamples, + EcalDataFrame_Ph2& df, + CLHEP::HepRandomEngine* engine) const { + const int nSamples(ecalSamples.size()); + + DetId detId = ecalSamples.id(); + double Emax = fullScaleEnergy(detId); + + //N Gains set to 2 in the .h + double pedestals[ecalPh2::NGAINS]; + double widths[ecalPh2::NGAINS]; + double LSB[ecalPh2::NGAINS]; + double trueRMS[ecalPh2::NGAINS]; + int nSaturatedSamples = 0; + double icalconst = 1.; + findIntercalibConstant(detId, icalconst); + + for (unsigned int igain(0); igain < ecalPh2::NGAINS; ++igain) { + // fill in the pedestal and width + findPedestal(detId, igain, pedestals[igain], widths[igain]); + // insert an absolute value in the trueRMS + trueRMS[igain] = std::sqrt(std::abs(widths[igain] * widths[igain] - 1. / 12.)); + + LSB[igain] = Emax / (ecalPh2::MAXADC * ecalPh2::gains[igain]); + } + + CaloSamples noiseframe[ecalPh2::NGAINS] = { + CaloSamples(detId, nSamples), + CaloSamples(detId, nSamples), + }; + + const Noisifier* noisy[ecalPh2::NGAINS] = {m_ebCorrNoise[0], m_ebCorrNoise[1]}; + + if (m_addNoise) { + for (unsigned int ig = 0; ig < ecalPh2::NGAINS; ++ig) { + noisy[ig]->noisify(noiseframe[ig], engine); + } + } + + std::vector> adctrace(nSamples); + int firstSaturatedSample[ecalPh2::NGAINS] = {0, 0}; + + for (int i(0); i != nSamples; ++i) + adctrace[i].resize(ecalPh2::NGAINS); + + for (unsigned int igain = 0; igain < ecalPh2::NGAINS; ++igain) { + for (int i(0); i != nSamples; ++i) { + adctrace[i][igain] = -1; + } + } + + // fill ADC trace in gain 0 (x10) and gain 1 (x1) + for (unsigned int igain = 0; igain < ecalPh2::NGAINS; ++igain) { + for (int i(0); i != nSamples; ++i) { + double asignal = 0; + if (!m_PreMix1) { + asignal = pedestals[igain] + ecalSamples[i] / (LSB[igain] * icalconst) + trueRMS[igain] * noiseframe[igain][i]; + //Analog signal value for each sample in ADC. + //It is corrected by the intercalibration constants + + } else { + // no noise nor pedestal when premixing + asignal = ecalSamples[i] / (LSB[igain] * icalconst); + } + int isignal = asignal; + + unsigned int adc = asignal - (double)isignal < 0.5 ? isignal : isignal + 1; + // gain 0 (x10) channel is saturated, readout will use gain 1 (x10), but I count the number of saturated samples + if (adc > ecalPh2::MAXADC) { + adc = ecalPh2::MAXADC; + if (nSaturatedSamples == 0) + firstSaturatedSample[igain] = i; + nSaturatedSamples++; + } + adctrace[i][igain] = adc; + } + if (nSaturatedSamples == 0) { + break; // gain 0 (x10) is not saturated, so don't bother with gain 1 + } + } // for igain + + int igain = 0; + + //Limits of gain 1: + //The Lite DTU sends 5 samples before the saturating one, and 10 after with gain 1. + //we put the maximum in bin 5, but could happen that the system saturates before. + + int previousSaturatedSamples = 5; + int nextSaturatedSamples = 10; + int startingLowerGainSample = 0; + int endingLowerGainSample = (firstSaturatedSample[0] + nextSaturatedSamples + (nSaturatedSamples)); + + if (nSaturatedSamples != 0 and (firstSaturatedSample[0] - previousSaturatedSamples) < 0) { + startingLowerGainSample = 0; + } else { + startingLowerGainSample = (firstSaturatedSample[0] - previousSaturatedSamples); + } + + //Setting values to the samples: + for (int j = 0; j < nSamples; ++j) { + if (nSaturatedSamples != 0 and j >= startingLowerGainSample and j < endingLowerGainSample) { + igain = 1; + } else { + igain = 0; + } + df.setSample(j, EcalLiteDTUSample(adctrace[j][igain], igain)); + if (nSaturatedSamples != 0) { + } + } +} + +void EcalLiteDTUCoder::findPedestal(const DetId& detId, int gainId, double& ped, double& width) const { + EcalLiteDTUPedestalsMap::const_iterator itped = m_peds->getMap().find(detId); + ped = (*itped).mean(gainId); + width = (*itped).rms(gainId); + + LogDebug("EcalLiteDTUCoder") << "Pedestals for " << detId.rawId() << " gain range " << gainId << " : \n" + << "Mean = " << ped << " rms = " << width; +} + +void EcalLiteDTUCoder::findIntercalibConstant(const DetId& detId, double& icalconst) const { + EcalIntercalibConstantMC thisconst = 1.; + // find intercalib constant for this xtal + const EcalIntercalibConstantMCMap& icalMap = m_intercals->getMap(); + EcalIntercalibConstantMCMap::const_iterator icalit = icalMap.find(detId); + + thisconst = (*icalit); + if (icalconst == 0.) + thisconst = 1.; + + icalconst = thisconst; +} diff --git a/SimCalorimetry/EcalSimProducers/interface/EcalDigiProducer.h b/SimCalorimetry/EcalSimProducers/interface/EcalDigiProducer.h index 133852c53dfa4..e54f8332d7570 100644 --- a/SimCalorimetry/EcalSimProducers/interface/EcalDigiProducer.h +++ b/SimCalorimetry/EcalSimProducers/interface/EcalDigiProducer.h @@ -2,10 +2,12 @@ #define SimCalorimetry_EcalSimProducers_EcalDigiProducer_h #include "DataFormats/Math/interface/Error.h" +#include "CalibFormats/CaloObjects/interface/CaloTSamples.h" #include "FWCore/Framework/interface/ProducesCollector.h" #include "SimCalorimetry/EcalSimAlgos/interface/APDShape.h" #include "SimCalorimetry/EcalSimAlgos/interface/EBShape.h" #include "SimCalorimetry/EcalSimAlgos/interface/EEShape.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EcalElectronicsSim.h" #include "SimCalorimetry/EcalSimAlgos/interface/ESElectronicsSim.h" #include "SimCalorimetry/EcalSimAlgos/interface/ESShape.h" #include "SimCalorimetry/EcalSimAlgos/interface/EcalCorrelatedNoiseMatrix.h" @@ -16,6 +18,7 @@ #include "SimCalorimetry/EcalSimAlgos/interface/EcalTDigitizer.h" #include "SimGeneral/MixingModule/interface/DigiAccumulatorMixMod.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EBHitResponse.h" #include typedef EcalTDigitizer EBDigitizer; @@ -25,13 +28,11 @@ typedef CaloTDigitizer ESOldDigitizer; class ESDigitizer; class APDSimParameters; -class EBHitResponse; class EEHitResponse; class ESHitResponse; class CaloHitResponse; class EcalSimParameterMap; class EcalCoder; -class EcalElectronicsSim; class ESElectronicsSim; class ESElectronicsSimFast; class EcalBaseSignalGenerator; @@ -141,10 +142,13 @@ class EcalDigiProducer : public DigiAccumulatorMixMod { std::unique_ptr m_BarrelDigitizer; std::unique_ptr m_EndcapDigitizer; - std::unique_ptr m_ElectronicsSim; + typedef CaloTSamples EcalSamples; + + typedef EcalElectronicsSim EcalElectronicsSim_Ph1; + std::unique_ptr m_ElectronicsSim; std::unique_ptr m_Coder; - std::unique_ptr m_APDElectronicsSim; + std::unique_ptr m_APDElectronicsSim; std::unique_ptr m_APDCoder; const CaloGeometry *m_Geometry; diff --git a/SimCalorimetry/EcalSimProducers/interface/EcalDigiProducer_Ph2.h b/SimCalorimetry/EcalSimProducers/interface/EcalDigiProducer_Ph2.h new file mode 100644 index 0000000000000..e62df03b61a31 --- /dev/null +++ b/SimCalorimetry/EcalSimProducers/interface/EcalDigiProducer_Ph2.h @@ -0,0 +1,121 @@ +#ifndef SimCalorimetry_EcalSimProducers_EcalDigiProducer_Ph2_h +#define SimCalorimetry_EcalSimProducers_EcalDigiProducer_Ph2_h + +#include "SimCalorimetry/EcalSimAlgos/interface/APDShape.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EBShape.h" +#include "DataFormats/Math/interface/Error.h" +#include "FWCore/Framework/interface/ProducesCollector.h" +#include "SimGeneral/NoiseGenerators/interface/CorrelatedNoisifier.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EcalCorrelatedNoiseMatrix.h" +#include "SimCalorimetry/CaloSimAlgos/interface/CaloTDigitizer.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EcalTDigitizer.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EcalDigitizerTraits.h" +#include "SimGeneral/MixingModule/interface/DigiAccumulatorMixMod.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EBHitResponse.h" +#include + +class APDSimParameters; +class CaloHitResponse; +class EcalSimParameterMap; +class EcalLiteDTUCoder; + +class EcalBaseSignalGenerator; +class CaloGeometry; +class EBDigiCollectionPh2; +class PileUpEventPrincipal; + +namespace edm { + class ConsumesCollector; + class ProducerBase; + class Event; + class EventSetup; + template + class Handle; + class ParameterSet; + class StreamID; +} // namespace edm + +namespace CLHEP { + class HepRandomEngine; +} + +class EcalDigiProducer_Ph2 : public DigiAccumulatorMixMod { +public: + typedef EcalTDigitizer EBDigitizer_Ph2; + typedef EBDigitizerTraits_Ph2::ElectronicsSim EcalElectronicsSim_Ph2; + + EcalDigiProducer_Ph2(const edm::ParameterSet& params, + edm::ProducesCollector producesCollector, + edm::ConsumesCollector& iC); + EcalDigiProducer_Ph2(const edm::ParameterSet& params, edm::ConsumesCollector& iC); + ~EcalDigiProducer_Ph2() override; + + void initializeEvent(edm::Event const& e, edm::EventSetup const& c) override; + void accumulate(edm::Event const& e, edm::EventSetup const& c) override; + void accumulate(PileUpEventPrincipal const& e, edm::EventSetup const& c, edm::StreamID const&) override; + void finalizeEvent(edm::Event& e, edm::EventSetup const& c) override; + void beginLuminosityBlock(edm::LuminosityBlock const& lumi, edm::EventSetup const& setup) override; + void beginRun(edm::Run const& run, edm::EventSetup const& setup) override; + + void setEBNoiseSignalGenerator(EcalBaseSignalGenerator* noiseGenerator); + +private: + virtual void cacheEBDigis(const EBDigiCollectionPh2* ebDigiPtr) const {} + + typedef edm::Handle > HitsHandle; + void accumulateCaloHits(HitsHandle const& ebHandle, int bunchCrossing); + + void checkGeometry(const edm::EventSetup& eventSetup); + + void updateGeometry(); + + void checkCalibrations(const edm::Event& event, const edm::EventSetup& eventSetup); + + APDShape m_APDShape; + EBShape m_EBShape; + + const std::string m_EBdigiCollection; + const std::string m_hitsProducerTag; + + bool m_useLCcorrection; + + const bool m_apdSeparateDigi; + + const double m_EBs25notCont; + + const unsigned int m_readoutFrameSize; + +protected: + std::unique_ptr m_ParameterMap; + +private: + const std::string m_apdDigiTag; + std::unique_ptr m_apdParameters; + + std::unique_ptr m_APDResponse; + +protected: + std::unique_ptr m_EBResponse; + +private: + const bool m_PreMix1; + const bool m_PreMix2; + + std::unique_ptr m_APDDigitizer; + std::unique_ptr m_BarrelDigitizer; + + std::unique_ptr m_ElectronicsSim; + std::unique_ptr m_Coder; + + typedef CaloTSamples EcalSamples_Ph2; + std::unique_ptr > m_APDElectronicsSim; + std::unique_ptr m_APDCoder; + + const CaloGeometry* m_Geometry; + + std::array >, 2> m_EBCorrNoise; + + CLHEP::HepRandomEngine* randomEngine_ = nullptr; +}; + +#endif diff --git a/SimCalorimetry/EcalSimProducers/interface/EcalTimeDigiProducer.h b/SimCalorimetry/EcalSimProducers/interface/EcalTimeDigiProducer.h index f54cc7106b631..5bd90ff357fed 100644 --- a/SimCalorimetry/EcalSimProducers/interface/EcalTimeDigiProducer.h +++ b/SimCalorimetry/EcalSimProducers/interface/EcalTimeDigiProducer.h @@ -40,26 +40,21 @@ class EcalTimeDigiProducer : public DigiAccumulatorMixMod { private: typedef edm::Handle> HitsHandle; - void accumulateCaloHits(HitsHandle const &ebHandle, HitsHandle const &eeHandle, int bunchCrossing); + void accumulateCaloHits(HitsHandle const &ebHandle, int bunchCrossing); void checkGeometry(const edm::EventSetup &eventSetup); void updateGeometry(); const std::string m_EBdigiCollection; - const std::string m_EEdigiCollection; const edm::InputTag m_hitsProducerTagEB; - const edm::InputTag m_hitsProducerTagEE; const edm::EDGetTokenT> m_hitsProducerTokenEB; - const edm::EDGetTokenT> m_hitsProducerTokenEE; private: int m_timeLayerEB; - int m_timeLayerEE; const CaloGeometry *m_Geometry; EcalTimeMapDigitizer *m_BarrelDigitizer; - EcalTimeMapDigitizer *m_EndcapDigitizer; }; #endif diff --git a/SimCalorimetry/EcalSimProducers/plugins/EcalLiteDTUPedestalsESProducer.cc b/SimCalorimetry/EcalSimProducers/plugins/EcalLiteDTUPedestalsESProducer.cc new file mode 100644 index 0000000000000..72376343c11cf --- /dev/null +++ b/SimCalorimetry/EcalSimProducers/plugins/EcalLiteDTUPedestalsESProducer.cc @@ -0,0 +1,63 @@ +#include +#include +#include "FWCore/Framework/interface/ModuleFactory.h" +#include "FWCore/Framework/interface/ESProducer.h" +#include "FWCore/Framework/interface/ESProductHost.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "CondFormats/DataRecord/interface/EcalLiteDTUPedestalsRcd.h" +#include "CondFormats/EcalObjects/interface/EcalLiteDTUPedestals.h" +#include "CondFormats/EcalObjects/src/classes.h" +#include "CondFormats/EcalObjects/interface/EcalConstants.h" + +// +// class declaration +// + +class EcalLiteDTUPedestalsESProducer : public edm::ESProducer { +public: + EcalLiteDTUPedestalsESProducer(const edm::ParameterSet& p); + + typedef std::unique_ptr ReturnType; + + ReturnType produce(const EcalLiteDTUPedestalsRcd& iRecord); + +private: + double meanPedestalsGain10_; + double rmsPedestalsGain10_; + double meanPedestalsGain1_; + double rmsPedestalsGain1_; +}; + +using namespace edm; + +EcalLiteDTUPedestalsESProducer::EcalLiteDTUPedestalsESProducer(const edm::ParameterSet& p) { + std::string myname = p.getParameter("ComponentName"); + meanPedestalsGain10_ = p.getParameter("MeanPedestalsGain10"); + rmsPedestalsGain10_ = p.getParameter("RMSPedestalsGain10"); + meanPedestalsGain1_ = p.getParameter("MeanPedestalsGain1"); + rmsPedestalsGain1_ = p.getParameter("RMSPedestalsGain1"); + setWhatProduced(this); +} +//// +EcalLiteDTUPedestalsESProducer::ReturnType EcalLiteDTUPedestalsESProducer::produce( + const EcalLiteDTUPedestalsRcd& iRecord) { + auto prod = std::make_unique(); + + for (unsigned int iChannel = 0; iChannel < ecalPh2::kEBChannels; iChannel++) { + EBDetId myEBDetId = EBDetId::unhashIndex(iChannel); + EcalLiteDTUPedestals ped; + ped.setMean(0, meanPedestalsGain10_); + ped.setRMS(0, rmsPedestalsGain10_); + + ped.setMean(1, meanPedestalsGain1_); + ped.setRMS(1, rmsPedestalsGain1_); + + prod->insert(std::make_pair(myEBDetId, ped)); + } + + return prod; +} + +//Define this as a plug-in +DEFINE_FWK_EVENTSETUP_MODULE(EcalLiteDTUPedestalsESProducer); diff --git a/SimCalorimetry/EcalSimProducers/plugins/SealModule.cc b/SimCalorimetry/EcalSimProducers/plugins/SealModule.cc index 43a5ed18e678d..8dd6a263419bd 100644 --- a/SimCalorimetry/EcalSimProducers/plugins/SealModule.cc +++ b/SimCalorimetry/EcalSimProducers/plugins/SealModule.cc @@ -1,7 +1,8 @@ #include "FWCore/Framework/interface/MakerMacros.h" #include "SimCalorimetry/EcalSimProducers/interface/EcalDigiProducer.h" +#include "SimCalorimetry/EcalSimProducers/interface/EcalDigiProducer_Ph2.h" #include "SimCalorimetry/EcalSimProducers/interface/EcalTimeDigiProducer.h" #include "SimGeneral/MixingModule/interface/DigiAccumulatorMixModFactory.h" - DEFINE_DIGI_ACCUMULATOR(EcalDigiProducer); +DEFINE_DIGI_ACCUMULATOR(EcalDigiProducer_Ph2); DEFINE_DIGI_ACCUMULATOR(EcalTimeDigiProducer); diff --git a/SimCalorimetry/EcalSimProducers/python/ecalDigiParameters_Ph2_cff.py b/SimCalorimetry/EcalSimProducers/python/ecalDigiParameters_Ph2_cff.py new file mode 100644 index 0000000000000..d692fd21de0e9 --- /dev/null +++ b/SimCalorimetry/EcalSimProducers/python/ecalDigiParameters_Ph2_cff.py @@ -0,0 +1,23 @@ +import FWCore.ParameterSet.Config as cms + +ecal_digi_parameters = cms.PSet( + EBdigiCollectionPh2 = cms.string(''), + UseLCcorrection = cms.untracked.bool(True), + + #NOTE: Phase2 noise correlation matrices with fake numbers to simply test the code flow. + + EBCorrNoiseMatrixG10Ph2 = cms.vdouble ( + 1.00000, 0.71073, 0.55721, 0.46089, 0.40449, + 0.35931, 0.33924, 0.32439, 0.31581, 0.30481, 0.40449,0.40449,0.40449,0.40449,0.40449,0.40449) , + + EBCorrNoiseMatrixG01Ph2 = cms.vdouble ( + 1.00000, 0.73354, 0.64442, 0.58851, 0.55425, + 0.53082, 0.51916, 0.51097, 0.50732, 0.50409, 0.40449,0.40449,0.40449,0.40449,0.40449,0.40449) , + + EcalPreMixStage1 = cms.bool(False), + EcalPreMixStage2 = cms.bool(False) + +) + +from Configuration.ProcessModifiers.premix_stage1_cff import premix_stage1 +premix_stage1.toModify(ecal_digi_parameters, EcalPreMixStage1 = True) diff --git a/SimCalorimetry/EcalSimProducers/python/ecalElectronicsSim_Ph2_cff.py b/SimCalorimetry/EcalSimProducers/python/ecalElectronicsSim_Ph2_cff.py new file mode 100644 index 0000000000000..be96c1118914f --- /dev/null +++ b/SimCalorimetry/EcalSimProducers/python/ecalElectronicsSim_Ph2_cff.py @@ -0,0 +1,13 @@ +import FWCore.ParameterSet.Config as cms + +ecal_electronics_sim = cms.PSet( + doENoise = cms.bool(True), + ConstantTerm = cms.double(0.003), + applyConstantTerm = cms.bool(True) +) + +from Configuration.ProcessModifiers.premix_stage1_cff import premix_stage1 +premix_stage1.toModify(ecal_electronics_sim, + doENoise = False, + applyConstantTerm = False, +) diff --git a/SimCalorimetry/EcalSimProducers/python/ecalSimParameterMap_cff.py b/SimCalorimetry/EcalSimProducers/python/ecalSimParameterMap_cff.py index e265e6ea80c6c..e7aec76c9163a 100644 --- a/SimCalorimetry/EcalSimProducers/python/ecalSimParameterMap_cff.py +++ b/SimCalorimetry/EcalSimProducers/python/ecalSimParameterMap_cff.py @@ -2,7 +2,6 @@ ecal_sim_parameter_map = cms.PSet( photoelectronsToAnalogEndcap = cms.double(0.000555555), - readoutFrameSize = cms.int32(10), binOfMaximum = cms.int32(6), simHitToPhotoelectronsEndcap = cms.double(1800.0), samplingFactor = cms.double(1.0), @@ -10,7 +9,16 @@ simHitToPhotoelectronsBarrel = cms.double(2250.0), syncPhase = cms.bool(True), doPhotostatistics = cms.bool(True), - photoelectronsToAnalogBarrel = cms.double(0.000444444), - timeDependent = cms.bool(False) + photoelectronsToAnalogBarrel = cms.double(0.000444444) +) + +ecal_sim_parameter_map_ph2 = cms.PSet( + binOfMaximum = cms.int32(6), + samplingFactor = cms.double(1.0), + timePhase = cms.double(0.0), + simHitToPhotoelectronsBarrel = cms.double(2250.0), + syncPhase = cms.bool(True), + doPhotostatistics = cms.bool(True), + photoelectronsToAnalogBarrel = cms.double(0.000444444) ) diff --git a/SimCalorimetry/EcalSimProducers/python/esCATIAGainProducer_cfi.py b/SimCalorimetry/EcalSimProducers/python/esCATIAGainProducer_cfi.py new file mode 100644 index 0000000000000..83f9d520655fe --- /dev/null +++ b/SimCalorimetry/EcalSimProducers/python/esCATIAGainProducer_cfi.py @@ -0,0 +1,12 @@ +import FWCore.ParameterSet.Config as cms + +EcalCATIAGainRatiosRcd = cms.ESSource("EmptyESSource", + recordName = cms.string("EcalCATIAGainRatiosRcd"), + firstValid = cms.vuint32(1), + iovIsRunNotTime = cms.bool(True) + ) + +EcalCATIAGainRatios = cms.ESProducer("EcalCATIAGainRatiosESProducer", + ComponentName = cms.string('EcalCatiaGainProducer'), + CATIAGainRatio = cms.double(10.)) + diff --git a/SimCalorimetry/EcalSimProducers/python/esEcalLiteDTUPedestalsProducer_cfi.py b/SimCalorimetry/EcalSimProducers/python/esEcalLiteDTUPedestalsProducer_cfi.py new file mode 100644 index 0000000000000..e34957bb7baac --- /dev/null +++ b/SimCalorimetry/EcalSimProducers/python/esEcalLiteDTUPedestalsProducer_cfi.py @@ -0,0 +1,16 @@ +import FWCore.ParameterSet.Config as cms + +EcalLiteDTUPedestalsRcd = cms.ESSource("EmptyESSource", + recordName = cms.string("EcalLiteDTUPedestalsRcd"), + firstValid = cms.vuint32(1), + iovIsRunNotTime = cms.bool(True) + ) + +EcalLiteDTUPedestals = cms.ESProducer( + "EcalLiteDTUPedestalsESProducer", + ComponentName = cms.string('EcalLiteDTUPedestalProducer'), + MeanPedestalsGain10 = cms.double(12), + RMSPedestalsGain10 = cms.double(2.5), + MeanPedestalsGain1 = cms.double(12.), + RMSPedestalsGain1 = cms.double(2.) +) diff --git a/SimCalorimetry/EcalSimProducers/src/EcalDigiProducer.cc b/SimCalorimetry/EcalSimProducers/src/EcalDigiProducer.cc index 250a823c52e02..6ba2c8e9e87f2 100644 --- a/SimCalorimetry/EcalSimProducers/src/EcalDigiProducer.cc +++ b/SimCalorimetry/EcalSimProducers/src/EcalDigiProducer.cc @@ -81,7 +81,7 @@ EcalDigiProducer::EcalDigiProducer(const edm::ParameterSet ¶ms, edm::Consume m_EBs25notCont(params.getParameter("EBs25notContainment")), m_EEs25notCont(params.getParameter("EEs25notContainment")), - m_readoutFrameSize(params.getParameter("readoutFrameSize")), + m_readoutFrameSize(ecalPh1::sampleSize), m_ParameterMap(new EcalSimParameterMap(params.getParameter("simHitToPhotoelectronsBarrel"), params.getParameter("simHitToPhotoelectronsEndcap"), params.getParameter("photoelectronsToAnalogBarrel"), @@ -237,7 +237,7 @@ EcalDigiProducer::EcalDigiProducer(const edm::ParameterSet ¶ms, edm::Consume m_EECorrNoise[2].get())); m_ElectronicsSim.reset( - new EcalElectronicsSim(m_ParameterMap.get(), m_Coder.get(), applyConstantTerm, rmsConstantTerm)); + new EcalElectronicsSim_Ph1(m_ParameterMap.get(), m_Coder.get(), applyConstantTerm, rmsConstantTerm)); if (m_apdSeparateDigi) { m_APDCoder.reset(new EcalCoder(false, @@ -250,7 +250,7 @@ EcalDigiProducer::EcalDigiProducer(const edm::ParameterSet ¶ms, edm::Consume m_EECorrNoise[2].get())); m_APDElectronicsSim.reset( - new EcalElectronicsSim(m_ParameterMap.get(), m_APDCoder.get(), applyConstantTerm, rmsConstantTerm)); + new EcalElectronicsSim_Ph1(m_ParameterMap.get(), m_APDCoder.get(), applyConstantTerm, rmsConstantTerm)); m_APDDigitizer.reset(new EBDigitizer(m_APDResponse.get(), m_APDElectronicsSim.get(), false)); } diff --git a/SimCalorimetry/EcalSimProducers/src/EcalDigiProducer_Ph2.cc b/SimCalorimetry/EcalSimProducers/src/EcalDigiProducer_Ph2.cc new file mode 100644 index 0000000000000..7bb6f28db429a --- /dev/null +++ b/SimCalorimetry/EcalSimProducers/src/EcalDigiProducer_Ph2.cc @@ -0,0 +1,338 @@ +#include "FWCore/Framework/interface/Event.h" +#include "SimCalorimetry/EcalSimProducers/interface/EcalDigiProducer_Ph2.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EBHitResponse.h" +#include "SimCalorimetry/CaloSimAlgos/interface/CaloHitResponse.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EcalSimParameterMap.h" +#include "SimCalorimetry/EcalSimAlgos/interface/APDSimParameters.h" +#include "DataFormats/EcalDigi/interface/EcalDigiCollections.h" +#include "SimCalorimetry/EcalSimAlgos/interface/EcalLiteDTUCoder.h" +#include "Geometry/CaloGeometry/interface/CaloGeometry.h" +#include "CalibFormats/CaloObjects/interface/CaloSamples.h" +#include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h" +#include "FWCore/Framework/interface/ESHandle.h" +#include "DataFormats/Common/interface/Handle.h" +#include "FWCore/Framework/interface/ConsumesCollector.h" +#include "FWCore/Framework/interface/ProducerBase.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/LuminosityBlock.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "FWCore/Utilities/interface/Exception.h" +#include "FWCore/Utilities/interface/RandomNumberGenerator.h" +#include "FWCore/Utilities/interface/StreamID.h" +#include "SimGeneral/MixingModule/interface/PileUpEventPrincipal.h" +#include "SimDataFormats/CaloHit/interface/PCaloHit.h" +#include "Geometry/Records/interface/CaloGeometryRecord.h" +#include "CondFormats/EcalObjects/interface/EcalLiteDTUPedestals.h" +#include "CondFormats/DataRecord/interface/EcalLiteDTUPedestalsRcd.h" +#include "CondFormats/EcalObjects/interface/EcalIntercalibConstantsMC.h" +#include "CondFormats/DataRecord/interface/EcalIntercalibConstantsMCRcd.h" +#include "CalibCalorimetry/EcalLaserCorrection/interface/EcalLaserDbService.h" +#include "CalibCalorimetry/EcalLaserCorrection/interface/EcalLaserDbRecord.h" +#include "CondFormats/EcalObjects/interface/EcalADCToGeVConstant.h" +#include "CondFormats/DataRecord/interface/EcalADCToGeVConstantRcd.h" + +#include "CondFormats/EcalObjects/interface/EcalCATIAGainRatios.h" +#include "CondFormats/DataRecord/interface/EcalCATIAGainRatiosRcd.h" +//*****************************************// +//Ecal Digi Producer for PhaseII data format +//Removed EE and ES +//Moved to EBDigiCollectionPh2 +//Moved to 2 Gains instead of 3, and from 10 to 16 ecal digi samples +//This producer calls the EcalLiteDTUCoder, the PhaseII noise matrices and the EcalLiteDTUPedestals +//*****************************************// +EcalDigiProducer_Ph2::EcalDigiProducer_Ph2(const edm::ParameterSet& params, + edm::ProducesCollector producesCollector, + edm::ConsumesCollector& iC) + : EcalDigiProducer_Ph2(params, iC) { + if (m_apdSeparateDigi) + producesCollector.produces(m_apdDigiTag); + + producesCollector.produces(m_EBdigiCollection); +} + +// version for Pre-Mixing, for use outside of MixingModule +EcalDigiProducer_Ph2::EcalDigiProducer_Ph2(const edm::ParameterSet& params, edm::ConsumesCollector& iC) + : DigiAccumulatorMixMod(), + m_APDShape(true), + m_EBShape(true), + + m_EBdigiCollection(params.getParameter("EBdigiCollectionPh2")), + + m_hitsProducerTag(params.getParameter("hitsProducer")), + m_useLCcorrection(params.getUntrackedParameter("UseLCcorrection")), + m_apdSeparateDigi(params.getParameter("apdSeparateDigi")), + + m_EBs25notCont(params.getParameter("EBs25notContainment")), + + m_readoutFrameSize(ecalPh2::sampleSize), + + m_ParameterMap(std::make_unique(params.getParameter("simHitToPhotoelectronsBarrel"), + 0, // endcap parameters not needed + params.getParameter("photoelectronsToAnalogBarrel"), + 0, + params.getParameter("samplingFactor"), + params.getParameter("timePhase"), + m_readoutFrameSize, + params.getParameter("binOfMaximum"), + params.getParameter("doPhotostatistics"), + params.getParameter("syncPhase"))), + + m_apdDigiTag(params.getParameter("apdDigiTag")), + m_apdParameters(std::make_unique(params.getParameter("apdAddToBarrel"), + m_apdSeparateDigi, + params.getParameter("apdSimToPELow"), + params.getParameter("apdSimToPEHigh"), + params.getParameter("apdTimeOffset"), + params.getParameter("apdTimeOffWidth"), + params.getParameter("apdDoPEStats"), + m_apdDigiTag, + params.getParameter>("apdNonlParms"))), + + m_APDResponse(!m_apdSeparateDigi + ? nullptr + : std::make_unique( + m_ParameterMap.get(), &m_EBShape, true, m_apdParameters.get(), &m_APDShape)), + + m_EBResponse(std::make_unique(m_ParameterMap.get(), + &m_EBShape, + false, // barrel + m_apdParameters.get(), + &m_APDShape)), + + m_PreMix1(params.getParameter("EcalPreMixStage1")), + m_PreMix2(params.getParameter("EcalPreMixStage2")), + + m_APDDigitizer(nullptr), + m_BarrelDigitizer(nullptr), + m_ElectronicsSim(nullptr), + m_Coder(nullptr), + m_APDElectronicsSim(nullptr), + m_APDCoder(nullptr), + m_Geometry(nullptr), + m_EBCorrNoise({{nullptr, nullptr}}) + +{ + iC.consumes>(edm::InputTag(m_hitsProducerTag, "EcalHitsEB")); + + const std::vector ebCorMatG10Ph2 = params.getParameter>("EBCorrNoiseMatrixG10Ph2"); + const std::vector ebCorMatG01Ph2 = params.getParameter>("EBCorrNoiseMatrixG01Ph2"); + + const bool applyConstantTerm = params.getParameter("applyConstantTerm"); + const double rmsConstantTerm = params.getParameter("ConstantTerm"); + + const bool addNoise = params.getParameter("doENoise"); + const bool cosmicsPhase = params.getParameter("cosmicsPhase"); + const double cosmicsShift = params.getParameter("cosmicsShift"); + + // further phase for cosmics studies + if (cosmicsPhase) { + m_EBResponse->setPhaseShift(1. + cosmicsShift); + } + + EcalCorrMatrix_Ph2 ebMatrix[2]; + const double errorCorrelation = 1.e-7; + assert(ebCorMatG10Ph2.size() == m_readoutFrameSize); + assert(ebCorMatG01Ph2.size() == m_readoutFrameSize); + + assert(errorCorrelation > std::abs(ebCorMatG10Ph2[0] - 1.0)); + assert(errorCorrelation > std::abs(ebCorMatG01Ph2[0] - 1.0)); + + for (unsigned int row(0); row != m_readoutFrameSize; ++row) { + assert(0 == row || 1. >= ebCorMatG10Ph2[row]); + assert(0 == row || 1. >= ebCorMatG01Ph2[row]); + + for (unsigned int column(0); column <= row; ++column) { + const unsigned int index(row - column); + ebMatrix[0](row, column) = ebCorMatG10Ph2[index]; + ebMatrix[1](row, column) = ebCorMatG01Ph2[index]; + } + } + m_EBCorrNoise[0] = std::make_unique>(ebMatrix[0]); + m_EBCorrNoise[1] = std::make_unique>(ebMatrix[1]); + m_Coder = std::make_unique(addNoise, m_PreMix1, m_EBCorrNoise[0].get(), m_EBCorrNoise[1].get()); + m_ElectronicsSim = + std::make_unique(m_ParameterMap.get(), m_Coder.get(), applyConstantTerm, rmsConstantTerm); + + if (m_apdSeparateDigi) { + m_APDCoder = std::make_unique(false, m_PreMix1, m_EBCorrNoise[0].get(), m_EBCorrNoise[1].get()); + + m_APDElectronicsSim = std::make_unique( + m_ParameterMap.get(), m_APDCoder.get(), applyConstantTerm, rmsConstantTerm); + + m_APDDigitizer = std::make_unique(m_APDResponse.get(), m_APDElectronicsSim.get(), false); + } + + m_BarrelDigitizer = std::make_unique(m_EBResponse.get(), m_ElectronicsSim.get(), addNoise); +} + +EcalDigiProducer_Ph2::~EcalDigiProducer_Ph2() {} + +void EcalDigiProducer_Ph2::initializeEvent(edm::Event const& event, edm::EventSetup const& eventSetup) { + edm::Service rng; + randomEngine_ = &rng->getEngine(event.streamID()); + + checkGeometry(eventSetup); + checkCalibrations(event, eventSetup); + + m_BarrelDigitizer->initializeHits(); + if (m_apdSeparateDigi) { + m_APDDigitizer->initializeHits(); + } +} + +void EcalDigiProducer_Ph2::accumulateCaloHits(HitsHandle const& ebHandle, int bunchCrossing) { + if (ebHandle.isValid()) { + m_BarrelDigitizer->add(*ebHandle.product(), bunchCrossing, randomEngine_); + + if (m_apdSeparateDigi) { + m_APDDigitizer->add(*ebHandle.product(), bunchCrossing, randomEngine_); + } + } +} + +void EcalDigiProducer_Ph2::accumulate(edm::Event const& e, edm::EventSetup const& eventSetup) { + // Step A: Get Inputs + edm::Handle> ebHandle; + + m_EBShape.setEventSetup(eventSetup); // need to set the eventSetup here, otherwise pre-mixing module will not wrk + m_APDShape.setEventSetup(eventSetup); // + edm::InputTag ebTag(m_hitsProducerTag, "EcalHitsEB"); + e.getByLabel(ebTag, ebHandle); + + accumulateCaloHits(ebHandle, 0); +} + +void EcalDigiProducer_Ph2::accumulate(PileUpEventPrincipal const& e, + edm::EventSetup const& eventSetup, + edm::StreamID const& streamID) { + // Step A: Get Inputs + edm::Handle> ebHandle; + + edm::InputTag ebTag(m_hitsProducerTag, "EcalHitsEB"); + e.getByLabel(ebTag, ebHandle); + + accumulateCaloHits(ebHandle, e.bunchCrossing()); +} + +void EcalDigiProducer_Ph2::finalizeEvent(edm::Event& event, edm::EventSetup const& eventSetup) { + // Step B: Create empty output + std::unique_ptr apdResult(nullptr); + std::unique_ptr barrelResult = std::make_unique(); + if (m_apdSeparateDigi) { + apdResult = std::make_unique(); + } + // run the algorithm + + m_BarrelDigitizer->run(*barrelResult, randomEngine_); + cacheEBDigis(&*barrelResult); + + edm::LogInfo("DigiInfo") << "EB Digis: " << barrelResult->size(); + + if (m_apdSeparateDigi) { + m_APDDigitizer->run(*apdResult, randomEngine_); + edm::LogInfo("DigiInfo") << "APD Digis: " << apdResult->size(); + } + + // Step D: Put outputs into event + + event.put(std::move(barrelResult), m_EBdigiCollection); + + randomEngine_ = nullptr; // to prevent access outside event +} + +void EcalDigiProducer_Ph2::beginLuminosityBlock(edm::LuminosityBlock const& lumi, edm::EventSetup const& setup) { + edm::Service rng; + if (!rng.isAvailable()) { + throw cms::Exception("Configuration") << "RandomNumberGenerator service is not available.\n" + "You must add the service in the configuration file\n" + "or remove the module that requires it."; + } + CLHEP::HepRandomEngine* engine = &rng->getEngine(lumi.index()); + + if (nullptr != m_APDResponse) + m_APDResponse->initialize(engine); + m_EBResponse->initialize(engine); +} + +void EcalDigiProducer_Ph2::checkCalibrations(const edm::Event& event, const edm::EventSetup& eventSetup) { + // Pedestals from event setup + + edm::ESHandle dbPed; + eventSetup.get().get(dbPed); + const EcalLiteDTUPedestalsMap* pedestals(dbPed.product()); + + m_Coder->setPedestals(pedestals); + if (nullptr != m_APDCoder) + m_APDCoder->setPedestals(pedestals); + + // Ecal Intercalibration Constants + edm::ESHandle pIcal; + eventSetup.get().get(pIcal); + const EcalIntercalibConstantsMC* ical(pIcal.product()); + + m_Coder->setIntercalibConstants(ical); + if (nullptr != m_APDCoder) + m_APDCoder->setIntercalibConstants(ical); + + m_EBResponse->setIntercal(ical); + if (nullptr != m_APDResponse) + m_APDResponse->setIntercal(ical); + + // Ecal LaserCorrection Constants + edm::ESHandle laser; + eventSetup.get().get(laser); + const edm::TimeValue_t eventTimeValue = event.time().value(); + + m_EBResponse->setEventTime(eventTimeValue); + m_EBResponse->setLaserConstants(laser.product(), m_useLCcorrection); + + // ADC -> GeV Scale + edm::ESHandle pAgc; + eventSetup.get().get(pAgc); + const EcalADCToGeVConstant* agc = pAgc.product(); + + m_Coder->setGainRatios(ecalPh2::gains[0] / ecalPh2::gains[1]); + if (nullptr != m_APDCoder) + m_APDCoder->setGainRatios(ecalPh2::gains[0] / ecalPh2::gains[1]); + + const double EBscale((agc->getEBValue()) * ecalPh2::gains[1] * (ecalPh2::MAXADC)*m_EBs25notCont); + + LogDebug("EcalDigi") << " GeV/ADC = " << agc->getEBValue() << "\n" + << " notCont = " << m_EBs25notCont << "\n" + << " saturation for EB = " << EBscale << ", " << m_EBs25notCont; + + m_Coder->setFullScaleEnergy(EBscale); + if (nullptr != m_APDCoder) + m_APDCoder->setFullScaleEnergy(EBscale); +} + +void EcalDigiProducer_Ph2::checkGeometry(const edm::EventSetup& eventSetup) { + // TODO find a way to avoid doing this every event + edm::ESHandle hGeometry; + eventSetup.get().get(hGeometry); + + const CaloGeometry* pGeometry = &*hGeometry; + + if (pGeometry != m_Geometry) { + m_Geometry = pGeometry; + updateGeometry(); + } +} + +void EcalDigiProducer_Ph2::updateGeometry() { + if (nullptr != m_APDResponse) + m_APDResponse->setGeometry(m_Geometry->getSubdetectorGeometry(DetId::Ecal, EcalBarrel)); + m_EBResponse->setGeometry(m_Geometry->getSubdetectorGeometry(DetId::Ecal, EcalBarrel)); +} + +void EcalDigiProducer_Ph2::setEBNoiseSignalGenerator(EcalBaseSignalGenerator* noiseGenerator) { + m_BarrelDigitizer->setNoiseSignalGenerator(noiseGenerator); +} + +void EcalDigiProducer_Ph2::beginRun(edm::Run const& run, edm::EventSetup const& setup) { + m_EBShape.setEventSetup(setup); + m_APDShape.setEventSetup(setup); +} diff --git a/SimCalorimetry/EcalSimProducers/src/EcalTimeDigiProducer.cc b/SimCalorimetry/EcalSimProducers/src/EcalTimeDigiProducer.cc index c6f7f9268bf80..2be3d9f5c9f8f 100644 --- a/SimCalorimetry/EcalSimProducers/src/EcalTimeDigiProducer.cc +++ b/SimCalorimetry/EcalSimProducers/src/EcalTimeDigiProducer.cc @@ -1,17 +1,12 @@ #include "FWCore/Framework/interface/Event.h" #include "SimCalorimetry/EcalSimAlgos/interface/EcalTimeMapDigitizer.h" #include "SimCalorimetry/EcalSimProducers/interface/EcalTimeDigiProducer.h" - #include "CalibFormats/CaloObjects/interface/CaloSamples.h" - #include "Geometry/CaloGeometry/interface/CaloGeometry.h" #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h" -#include "Geometry/EcalAlgo/interface/EcalEndcapGeometry.h" #include "Geometry/Records/interface/CaloGeometryRecord.h" - #include "DataFormats/Common/interface/Handle.h" #include "FWCore/Framework/interface/ESHandle.h" - #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/EventSetup.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" @@ -25,27 +20,20 @@ EcalTimeDigiProducer::EcalTimeDigiProducer(const edm::ParameterSet ¶ms, edm::ConsumesCollector &sumes) : DigiAccumulatorMixMod(), m_EBdigiCollection(params.getParameter("EBtimeDigiCollection")), - m_EEdigiCollection(params.getParameter("EEtimeDigiCollection")), m_hitsProducerTagEB(params.getParameter("hitsProducerEB")), - m_hitsProducerTagEE(params.getParameter("hitsProducerEE")), m_hitsProducerTokenEB(sumes.consumes>(m_hitsProducerTagEB)), - m_hitsProducerTokenEE(sumes.consumes>(m_hitsProducerTagEE)), m_timeLayerEB(params.getParameter("timeLayerBarrel")), - m_timeLayerEE(params.getParameter("timeLayerEndcap")), m_Geometry(nullptr) { producesCollector.produces(m_EBdigiCollection); - producesCollector.produces(m_EEdigiCollection); m_BarrelDigitizer = new EcalTimeMapDigitizer(EcalBarrel); - m_EndcapDigitizer = new EcalTimeMapDigitizer(EcalEndcap); #ifdef ecal_time_debug - std::cout << "[EcalTimeDigiProducer]::Create EB " << m_EBdigiCollection << " and EE " << m_EEdigiCollection - << " collections and digitizers" << std::endl; + std::cout << "[EcalTimeDigiProducer]::Create EB " << m_EBdigiCollection << " " + << " collection and digitizer" << std::endl; #endif m_BarrelDigitizer->setTimeLayerId(m_timeLayerEB); - m_EndcapDigitizer->setTimeLayerId(m_timeLayerEE); } EcalTimeDigiProducer::~EcalTimeDigiProducer() {} @@ -55,21 +43,14 @@ void EcalTimeDigiProducer::initializeEvent(edm::Event const &event, edm::EventSe // checkCalibrations( event, eventSetup ); // here the methods to clean the maps m_BarrelDigitizer->initializeMap(); - m_EndcapDigitizer->initializeMap(); } -void EcalTimeDigiProducer::accumulateCaloHits(HitsHandle const &ebHandle, - HitsHandle const &eeHandle, - int bunchCrossing) { +void EcalTimeDigiProducer::accumulateCaloHits(HitsHandle const &ebHandle, int bunchCrossing) { // accumulate the simHits and do the averages in a given layer per bunch // crossing if (ebHandle.isValid()) { m_BarrelDigitizer->add(*ebHandle.product(), bunchCrossing); } - - if (eeHandle.isValid()) { - m_EndcapDigitizer->add(*eeHandle.product(), bunchCrossing); - } } void EcalTimeDigiProducer::accumulate(edm::Event const &e, edm::EventSetup const &eventSetup) { @@ -77,14 +58,11 @@ void EcalTimeDigiProducer::accumulate(edm::Event const &e, edm::EventSetup const edm::Handle> ebHandle; e.getByToken(m_hitsProducerTokenEB, ebHandle); - edm::Handle> eeHandle; - e.getByToken(m_hitsProducerTokenEE, eeHandle); - #ifdef ecal_time_debug std::cout << "[EcalTimeDigiProducer]::Accumulate Hits HS event" << std::endl; #endif - accumulateCaloHits(ebHandle, eeHandle, 0); + accumulateCaloHits(ebHandle, 0); } void EcalTimeDigiProducer::accumulate(PileUpEventPrincipal const &e, @@ -93,18 +71,14 @@ void EcalTimeDigiProducer::accumulate(PileUpEventPrincipal const &e, edm::Handle> ebHandle; e.getByLabel(m_hitsProducerTagEB, ebHandle); - edm::Handle> eeHandle; - e.getByLabel(m_hitsProducerTagEE, eeHandle); - #ifdef ecal_time_debug std::cout << "[EcalTimeDigiProducer]::Accumulate Hits for BC " << e.bunchCrossing() << std::endl; #endif - accumulateCaloHits(ebHandle, eeHandle, e.bunchCrossing()); + accumulateCaloHits(ebHandle, e.bunchCrossing()); } void EcalTimeDigiProducer::finalizeEvent(edm::Event &event, edm::EventSetup const &eventSetup) { - std::unique_ptr barrelResult(new EcalTimeDigiCollection()); - std::unique_ptr endcapResult(new EcalTimeDigiCollection()); + std::unique_ptr barrelResult = std::make_unique(); #ifdef ecal_time_debug std::cout << "[EcalTimeDigiProducer]::finalizeEvent" << std::endl; @@ -119,20 +93,11 @@ void EcalTimeDigiProducer::finalizeEvent(edm::Event &event, edm::EventSetup cons edm::LogInfo("TimeDigiInfo") << "EB time Digis: " << barrelResult->size(); - m_EndcapDigitizer->run(*endcapResult); - -#ifdef ecal_time_debug - std::cout << "[EcalTimeDigiProducer]::EE Digi size " << endcapResult->size() << std::endl; -#endif - - edm::LogInfo("TimeDigiInfo") << "EE Digis: " << endcapResult->size(); - #ifdef ecal_time_debug - std::cout << "[EcalTimeDigiProducer]::putting collections into the event " << std::endl; + std::cout << "[EcalTimeDigiProducer]::putting EcalTimeDigiCollection into the event " << std::endl; #endif event.put(std::move(barrelResult), m_EBdigiCollection); - event.put(std::move(endcapResult), m_EEdigiCollection); } void EcalTimeDigiProducer::checkGeometry(const edm::EventSetup &eventSetup) { @@ -150,5 +115,4 @@ void EcalTimeDigiProducer::checkGeometry(const edm::EventSetup &eventSetup) { void EcalTimeDigiProducer::updateGeometry() { m_BarrelDigitizer->setGeometry(m_Geometry->getSubdetectorGeometry(DetId::Ecal, EcalBarrel)); - m_EndcapDigitizer->setGeometry(m_Geometry->getSubdetectorGeometry(DetId::Ecal, EcalEndcap)); } diff --git a/SimCalorimetry/EcalSimProducers/test/SingleElectron_cfi_py_GEN_IDEAL_withECALDigi_Ph1.py b/SimCalorimetry/EcalSimProducers/test/SingleElectron_cfi_py_GEN_IDEAL_withECALDigi_Ph1.py new file mode 100644 index 0000000000000..3328646be4c20 --- /dev/null +++ b/SimCalorimetry/EcalSimProducers/test/SingleElectron_cfi_py_GEN_IDEAL_withECALDigi_Ph1.py @@ -0,0 +1,168 @@ +# Auto generated configuration file +# using: +# Revision: 1.19 +# Source: /local/reps/CMSSW/CMSSW/Configuration/Applications/python/ConfigBuilder.py,v +# with command line options: SingleElectronPt10_pythia8_cfi.py -s GEN,SIM,DIGI --conditions auto:mc --datatier GEN-SIM-RAW --eventcontent RECOSIM -n 10 --no_exec --python_filename SingleElectronPt10_cfi_py_GEN_IDEAL.py +import FWCore.ParameterSet.Config as cms + +from Configuration.StandardSequences.Eras import eras + +process = cms.Process('DIGI')#,eras.phase2_common) + +# import of standard configurations +process.load('Configuration.StandardSequences.Services_cff') +process.load('SimGeneral.HepPDTESSource.pythiapdt_cfi') +process.load('FWCore.MessageService.MessageLogger_cfi') +process.load('Configuration.EventContent.EventContent_cff') +process.load('SimGeneral.MixingModule.mixNoPU_cfi') +process.load('Configuration.StandardSequences.GeometryRecoDB_cff') +process.load('Configuration.Geometry.GeometrySimDB_cff') +process.load('Configuration.StandardSequences.MagneticField_cff') +process.load('Configuration.StandardSequences.Generator_cff') +process.load('IOMC.EventVertexGenerators.VtxSmearedRealistic50ns13TeVCollision_cfi') +process.load('GeneratorInterface.Core.genFilterSummary_cff') +process.load('Configuration.StandardSequences.SimIdeal_cff') +process.load('Configuration.StandardSequences.Digi_cff') +process.load('Configuration.StandardSequences.EndOfProcess_cff') +process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff') + +process.maxEvents = cms.untracked.PSet( + input = cms.untracked.int32(1) +) + +# Input source +process.source = cms.Source("EmptySource") + +process.options = cms.untracked.PSet( + SkipEvent = cms.untracked.vstring('ProductNotFound') +) + + +# Production Info +process.configurationMetadata = cms.untracked.PSet( + annotation = cms.untracked.string('SingleElectronPt10_pythia8_cfi.py nevts:10'), + name = cms.untracked.string('Applications'), + version = cms.untracked.string('$Revision: 1.19 $') +) + +# Output definition + +process.RECOSIMoutput = cms.OutputModule("PoolOutputModule", + SelectEvents = cms.untracked.PSet( + SelectEvents = cms.vstring('generation_step') + ), + dataset = cms.untracked.PSet( + dataTier = cms.untracked.string('GEN-SIM-RAW'), + filterName = cms.untracked.string('') + ), + fileName = cms.untracked.string('SingleElectronPt10_pythia8_cfi_py_GEN_SIM_DIGI_Pt10_Ph1.root'), +# outputCommands = process.RECOSIMEventContent.outputCommands, + outputCommands = cms.untracked.vstring('keep *', + 'drop *_mix_*_*'), + splitLevel = cms.untracked.int32(1) +) + +#process.RECOSIMoutput.outputCommands.append('keep EBDigiCollection_ecalDigis_*_*') + + + +# Additional output definition + + +# Other statements +process.genstepfilter.triggerConditions=cms.vstring("generation_step") +from Configuration.AlCa.GlobalTag import GlobalTag +process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:mc', '') + +process.generator = cms.EDFilter("Pythia8PtGun", + PGunParameters = cms.PSet( + AddAntiParticle = cms.bool(True), + MaxEta = cms.double(1.43), + MaxPhi = cms.double(3.14159265359), + #MaxPt = cms.double(300.01), + MaxPt = cms.double(1110.01), + MinEta = cms.double(1.42), + MinPhi = cms.double(-3.14159265359), + #MinPt = cms.double(299.99), + MinPt = cms.double(1109.99), + ParticleID = cms.vint32(11) + ), + PythiaParameters = cms.PSet( + parameterSets = cms.vstring() + ), + Verbosity = cms.untracked.int32(0), + firstRun = cms.untracked.uint32(1), + psethack = cms.string('single electron pt 10') +) + + +# Path and EndPath definitions +process.generation_step = cms.Path(process.pgen) +process.simulation_step = cms.Path(process.psim) +process.digitisation_step = cms.Path(process.pdigi) +process.genfiltersummary_step = cms.EndPath(process.genFilterSummary) +process.endjob_step = cms.EndPath(process.endOfProcess) +process.RECOSIMoutput_step = cms.EndPath(process.RECOSIMoutput) + + + +##CondCore.CondDB.CondDB_cfi +#from CondCore.DBCommon.CondDBSetup_cfi import * +##from CondCore.CondDB.CondDB_cfi import * +#process.ecalConditions = cms.ESSource("PoolDBESSource", CondDBSetup, +# connect = cms.string('frontier://FrontierProd/CMS_COND_31X_ECAL'), +# #connect = cms.string('oracle://cms_orcoff_prep/CMS_COND_ECAL'), +# #authpath = cms.string('/afs/cern.ch/cms/DB/conddb'), +# connect = cms.string('sqlite_file:/afs/cern.ch/user/d/dsoldi/work/CMS/CMSEcal_Phase2_Ultimate/CMSSW_10_6_1/src/SimCalorimetry/EcalSimProducers/test/simPulseShapePhaseII.db'), +# +# toGet = cms.VPSet( # overide Global Tag use EcalTBWeights_EBEE_offline +# cms.PSet( +# record = cms.string('EcalSimPulseShapeRcd') , +# tag = cms.string('EcalSimPulseShape_default_mc') +# ) +# ) +#) +#process.es_prefer_ecalPulseShape = cms.ESPrefer("PoolDBESSource","ecalConditions") +# +#process.EcalCATIAGainRatiosESProducer = cms.ESProducer( +# "EcalCATIAGainRatiosESProducer", +# ComponentName = cms.string('testGainProducer') +#) +# +#process.EcalLiteDTUPedestalsESProducer = cms.ESProducer( +# "EcalLiteDTUPedestalsESProducer", +# ComponentName = cms.string('testPedestalProducer') +#) + +#LOGGER: +process.MessageLogger.cout = cms.untracked.PSet( + threshold = cms.untracked.string("DEBUG"), + default = cms.untracked.PSet( limit = cms.untracked.int32(0) ), + FwkReport = cms.untracked.PSet( limit = cms.untracked.int32(-1) ), +) + + +#process.es_prefer_EcalCATIAGainRatioESProducer = cms.ESPrefer("EcalCATIAGainRatioESProducer","EcalCATIAGainRatioESProducer") + +# Schedule definition +process.schedule = cms.Schedule(process.generation_step,process.genfiltersummary_step,process.simulation_step,process.digitisation_step,process.endjob_step,process.RECOSIMoutput_step) +from PhysicsTools.PatAlgos.tools.helpers import associatePatAlgosToolsTask +associatePatAlgosToolsTask(process) +# filter all path with the production filter sequence +for path in process.paths: + getattr(process,path)._seq = process.generator * getattr(process,path)._seq + + +# Customisation from command line + +# Add early deletion of temporary data products to reduce peak memory need +from Configuration.StandardSequences.earlyDeleteSettings_cff import customiseEarlyDelete +process = customiseEarlyDelete(process) +# End adding early deletion + + + + + + + diff --git a/SimCalorimetry/EcalSimProducers/test/SingleElectron_cfi_py_GEN_IDEAL_withECALDigi_newshape.py b/SimCalorimetry/EcalSimProducers/test/SingleElectron_cfi_py_GEN_IDEAL_withECALDigi_newshape.py new file mode 100644 index 0000000000000..a5a87a3898a60 --- /dev/null +++ b/SimCalorimetry/EcalSimProducers/test/SingleElectron_cfi_py_GEN_IDEAL_withECALDigi_newshape.py @@ -0,0 +1,171 @@ +# Auto generated configuration file +# using: +# Revision: 1.19 +# Source: /local/reps/CMSSW/CMSSW/Configuration/Applications/python/ConfigBuilder.py,v +# with command line options: SingleElectronPt10_pythia8_cfi.py -s GEN,SIM,DIGI --conditions auto:mc --datatier GEN-SIM-RAW --eventcontent RECOSIM -n 10 --no_exec --python_filename SingleElectronPt10_cfi_py_GEN_IDEAL.py +import FWCore.ParameterSet.Config as cms + +from Configuration.StandardSequences.Eras import eras + +process = cms.Process('DIGI',eras.phase2_common) + +# import of standard configurations +process.load('Configuration.StandardSequences.Services_cff') +process.load('SimGeneral.HepPDTESSource.pythiapdt_cfi') +process.load('FWCore.MessageService.MessageLogger_cfi') +process.load('SimCalorimetry.EcalSimProducers.esCATIAGainProducer_cfi') +process.load('SimCalorimetry.EcalSimProducers.esEcalLiteDTUPedestalsProducer_cfi') +process.load('Configuration.EventContent.EventContent_cff') +process.load('SimGeneral.MixingModule.mixNoPU_Ph2_cfi') +process.load('Configuration.StandardSequences.GeometryRecoDB_cff') +process.load('Configuration.Geometry.GeometrySimDB_cff') +process.load('Configuration.StandardSequences.MagneticField_cff') +process.load('Configuration.StandardSequences.Generator_cff') +process.load('IOMC.EventVertexGenerators.VtxSmearedRealistic50ns13TeVCollision_cfi') +process.load('Calibration.EcalCalibAlgos.ecalPedestalPCLHarvester_cfi') +process.load('GeneratorInterface.Core.genFilterSummary_cff') +process.load('Configuration.StandardSequences.SimIdeal_cff') +process.load('Configuration.StandardSequences.Digi_Ph2_cff') +process.load('Configuration.StandardSequences.EndOfProcess_cff') +process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff') + +process.maxEvents = cms.untracked.PSet( + input = cms.untracked.int32(3) +) + +# Input source +process.source = cms.Source("EmptySource") + +process.options = cms.untracked.PSet( + SkipEvent = cms.untracked.vstring('ProductNotFound') +) + + +# Production Info +process.configurationMetadata = cms.untracked.PSet( + annotation = cms.untracked.string('SingleElectronPt10_pythia8_cfi.py nevts:10'), + name = cms.untracked.string('Applications'), + version = cms.untracked.string('$Revision: 1.19 $') +) + +# Output definition + +process.RECOSIMoutput = cms.OutputModule("PoolOutputModule", + SelectEvents = cms.untracked.PSet( + SelectEvents = cms.vstring('generation_step') + ), + dataset = cms.untracked.PSet( + dataTier = cms.untracked.string('GEN-SIM-RAW'), + filterName = cms.untracked.string('') + ), + fileName = cms.untracked.string('SingleElectronPt10_pythia8_cfi_py_GEN_SIM_DIGI_Pt10.root'), +# outputCommands = process.RECOSIMEventContent.outputCommands, + outputCommands = cms.untracked.vstring('keep *', + 'drop *_mix_*_*'), + splitLevel = cms.untracked.int32(1) +) + +#process.RECOSIMoutput.outputCommands.append('keep EBDigiCollection_ecalDigis_*_*') + + + +# Additional output definition + + +# Other statements +process.genstepfilter.triggerConditions=cms.vstring("generation_step") +from Configuration.AlCa.GlobalTag import GlobalTag +process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:mc', '') + +process.generator = cms.EDFilter("Pythia8PtGun", + PGunParameters = cms.PSet( + AddAntiParticle = cms.bool(True), + MaxEta = cms.double(1.43), + MaxPhi = cms.double(3.14159265359), + #MaxPt = cms.double(300.01), + MaxPt = cms.double(10.01), + MinEta = cms.double(1.42), + MinPhi = cms.double(-3.14159265359), + #MinPt = cms.double(299.99), + MinPt = cms.double(9.99), + ParticleID = cms.vint32(11) + ), + PythiaParameters = cms.PSet( + parameterSets = cms.vstring() + ), + Verbosity = cms.untracked.int32(0), + firstRun = cms.untracked.uint32(1), + psethack = cms.string('single electron pt 10') +) + + +# Path and EndPath definitions +process.generation_step = cms.Path(process.pgen) +process.simulation_step = cms.Path(process.psim) +process.digitisation_step = cms.Path(process.pdigi) +process.genfiltersummary_step = cms.EndPath(process.genFilterSummary) +process.endjob_step = cms.EndPath(process.endOfProcess) +process.RECOSIMoutput_step = cms.EndPath(process.RECOSIMoutput) + + + +#CondCore.CondDB.CondDB_cfi +from CondCore.DBCommon.CondDBSetup_cfi import * +#from CondCore.CondDB.CondDB_cfi import * +process.ecalConditions = cms.ESSource("PoolDBESSource", CondDBSetup, + #connect = cms.string('frontier://FrontierProd/CMS_COND_31X_ECAL'), + #connect = cms.string('oracle://cms_orcoff_prep/CMS_COND_ECAL'), + #authpath = cms.string('/afs/cern.ch/cms/DB/conddb'), + connect = cms.string('sqlite_file:SimCalorimetry/EcalSimProducers/test/simPulseShapePhaseII.db'), + + toGet = cms.VPSet( # overide Global Tag use EcalTBWeights_EBEE_offline + cms.PSet( + record = cms.string('EcalSimPulseShapeRcd') , + tag = cms.string('EcalSimPulseShape_default_mc') + ) + ) +) +process.es_prefer_ecalPulseShape = cms.ESPrefer("PoolDBESSource","ecalConditions") + +process.EcalCATIAGainRatiosESProducer = cms.ESProducer( + "EcalCATIAGainRatiosESProducer", + ComponentName = cms.string('testGainProducer') +) + +process.EcalLiteDTUPedestalsESProducer = cms.ESProducer( + "EcalLiteDTUPedestalsESProducer", + ComponentName = cms.string('testPedestalProducer') +) + +#LOGGER: +process.MessageLogger.cout = cms.untracked.PSet( + threshold = cms.untracked.string("DEBUG"), + default = cms.untracked.PSet( limit = cms.untracked.int32(0) ), + FwkReport = cms.untracked.PSet( limit = cms.untracked.int32(-1) ), +) + + +#process.es_prefer_EcalCATIAGainRatioESProducer = cms.ESPrefer("EcalCATIAGainRatioESProducer","EcalCATIAGainRatioESProducer") + +# Schedule definition +process.schedule = cms.Schedule(process.generation_step,process.genfiltersummary_step,process.simulation_step,process.digitisation_step,process.endjob_step,process.RECOSIMoutput_step) +from PhysicsTools.PatAlgos.tools.helpers import associatePatAlgosToolsTask +associatePatAlgosToolsTask(process) +# filter all path with the production filter sequence +for path in process.paths: + getattr(process,path)._seq = process.generator * getattr(process,path)._seq + + +# Customisation from command line + +# Add early deletion of temporary data products to reduce peak memory need +from Configuration.StandardSequences.earlyDeleteSettings_cff import customiseEarlyDelete +process = customiseEarlyDelete(process) +# End adding early deletion + + + + + + + diff --git a/SimCalorimetry/EcalSimProducers/test/testSingleElectronPt1000_pythia8_cfi_GEN_SIM_DIG_Phase2.py b/SimCalorimetry/EcalSimProducers/test/testSingleElectronPt1000_pythia8_cfi_GEN_SIM_DIG_Phase2.py new file mode 100644 index 0000000000000..13673e4606dfb --- /dev/null +++ b/SimCalorimetry/EcalSimProducers/test/testSingleElectronPt1000_pythia8_cfi_GEN_SIM_DIG_Phase2.py @@ -0,0 +1,160 @@ +# Auto generated configuration file +# using: +# Revision: 1.19 +# Source: /local/reps/CMSSW/CMSSW/Configuration/Applications/python/ConfigBuilder.py,v +# with command line options: SingleElectronPt1000_pythia8_cfi --conditions auto:phase2_realistic_T14 -n 10 --era Phase2C8 --eventcontent RECOSIM --relval 9000,50 -s GEN,SIM,DIGI --datatier GEN-SIM --beamspot HLLHC --geometry Extended2026D41 --fileout file:step1.root +import FWCore.ParameterSet.Config as cms + +from Configuration.Eras.Era_Phase2C8_cff import Phase2C8 + +process = cms.Process('DIGI',Phase2C8) + +# import of standard configurations +process.load('Configuration.StandardSequences.Services_cff') +process.load('SimGeneral.HepPDTESSource.pythiapdt_cfi') +process.load('FWCore.MessageService.MessageLogger_cfi') +process.load('Configuration.EventContent.EventContent_cff') +process.load('SimCalorimetry.EcalSimProducers.esCATIAGainProducer_cfi') +process.load('SimCalorimetry.EcalSimProducers.esEcalLiteDTUPedestalsProducer_cfi') +process.load('SimGeneral.MixingModule.mixNoPU_cfi') +process.load('Configuration.Geometry.GeometryExtended2026D41Reco_cff') +process.load('Configuration.Geometry.GeometryExtended2026D41_cff') +process.load('Configuration.StandardSequences.MagneticField_cff') +process.load('Configuration.StandardSequences.Generator_cff') +process.load('IOMC.EventVertexGenerators.VtxSmearedHLLHC_cfi') +process.load('GeneratorInterface.Core.genFilterSummary_cff') +process.load('Configuration.StandardSequences.SimIdeal_cff') +process.load('Configuration.StandardSequences.Digi_cff') +process.load('Configuration.StandardSequences.EndOfProcess_cff') +process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff') + +process.maxEvents = cms.untracked.PSet( + input = cms.untracked.int32(1), + output = cms.optional.untracked.allowed(cms.int32,cms.PSet) +) + +# Input source +process.source = cms.Source("EmptySource") + +process.options = cms.untracked.PSet( + FailPath = cms.untracked.vstring(), + IgnoreCompletely = cms.untracked.vstring(), + Rethrow = cms.untracked.vstring(), + SkipEvent = cms.untracked.vstring(), + allowUnscheduled = cms.obsolete.untracked.bool, + canDeleteEarly = cms.untracked.vstring(), + emptyRunLumiMode = cms.obsolete.untracked.string, + eventSetup = cms.untracked.PSet( + forceNumberOfConcurrentIOVs = cms.untracked.PSet( + + ), + numberOfConcurrentIOVs = cms.untracked.uint32(1) + ), + fileMode = cms.untracked.string('FULLMERGE'), + forceEventSetupCacheClearOnNewRun = cms.untracked.bool(False), + makeTriggerResults = cms.obsolete.untracked.bool, + numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(1), + numberOfConcurrentRuns = cms.untracked.uint32(1), + numberOfStreams = cms.untracked.uint32(0), + numberOfThreads = cms.untracked.uint32(1), + printDependencies = cms.untracked.bool(False), + sizeOfStackForThreadsInKB = cms.optional.untracked.uint32, + throwIfIllegalParameter = cms.untracked.bool(True), + wantSummary = cms.untracked.bool(False) +) + +# Production Info +process.configurationMetadata = cms.untracked.PSet( + annotation = cms.untracked.string('SingleElectronPt1000_pythia8_cfi nevts:10'), + name = cms.untracked.string('Applications'), + version = cms.untracked.string('$Revision: 1.19 $') +) + +# Output definition + +process.RECOSIMoutput = cms.OutputModule("PoolOutputModule", + SelectEvents = cms.untracked.PSet( + SelectEvents = cms.vstring('generation_step') + ), + dataset = cms.untracked.PSet( + dataTier = cms.untracked.string('GEN-SIM'), + filterName = cms.untracked.string('') + ), + fileName = cms.untracked.string('file:step1.root'), +# outputCommands = process.RECOSIMEventContent.outputCommands, + outputCommands = cms.untracked.vstring('keep *', + 'drop *_mix_*_*'), + splitLevel = cms.untracked.int32(0) +) + +# Additional output definition + +# Other statements +process.genstepfilter.triggerConditions=cms.vstring("generation_step") +from Configuration.AlCa.GlobalTag import GlobalTag +process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:phase2_realistic_T14', '') + +process.generator = cms.EDFilter("Pythia8PtGun", + PGunParameters = cms.PSet( + AddAntiParticle = cms.bool(True), + MaxEta = cms.double(2.5), + MaxPhi = cms.double(3.14159265359), + MaxPt = cms.double(1000.01), + MinEta = cms.double(-2.5), + MinPhi = cms.double(-3.14159265359), + MinPt = cms.double(999.99), + ParticleID = cms.vint32(11) + ), + PythiaParameters = cms.PSet( + parameterSets = cms.vstring() + ), + Verbosity = cms.untracked.int32(0), + firstRun = cms.untracked.uint32(1), + psethack = cms.string('single electron pt 1000') +) + + +# Path and EndPath definitions +process.generation_step = cms.Path(process.pgen) +process.simulation_step = cms.Path(process.psim) +process.digitisation_step = cms.Path(process.pdigi) +process.genfiltersummary_step = cms.EndPath(process.genFilterSummary) +process.endjob_step = cms.EndPath(process.endOfProcess) +process.RECOSIMoutput_step = cms.EndPath(process.RECOSIMoutput) + +# Schedule definition +process.schedule = cms.Schedule(process.generation_step,process.genfiltersummary_step,process.simulation_step,process.digitisation_step,process.endjob_step,process.RECOSIMoutput_step) +from PhysicsTools.PatAlgos.tools.helpers import associatePatAlgosToolsTask +associatePatAlgosToolsTask(process) +# filter all path with the production filter sequence +for path in process.paths: + getattr(process,path).insert(0, process.generator) + + +# Customisation from command line +process.EcalCATIAGainRatiosESProducer = cms.ESProducer( + "EcalCATIAGainRatiosESProducer", + ComponentName = cms.string('testGainProducer'), +) + +process.EcalLiteDTUPedestalsESProducer = cms.ESProducer( + "EcalLiteDTUPedestalsESProducer", + ComponentName = cms.string('testPedestalProducer') +) + +from CondCore.DBCommon.CondDBSetup_cfi import * +process.ecalConditions = cms.ESSource("PoolDBESSource", CondDBSetup, + connect = cms.string('sqlite_file:../SimCalorimetry/EcalSimProducers/test/simPulseShapePhaseII.db'), + toGet = cms.VPSet( # overide Global Tag use EcalTBWeights_EBEE_offline + cms.PSet( + record = cms.string('EcalSimPulseShapeRcd') , + tag = cms.string('EcalSimPulseShape_default_mc') + ) + ) +) +process.es_prefer_ecalPulseShape = cms.ESPrefer("PoolDBESSource","ecalConditions") + +# Add early deletion of temporary data products to reduce peak memory need +from Configuration.StandardSequences.earlyDeleteSettings_cff import customiseEarlyDelete +process = customiseEarlyDelete(process) +# End adding early deletion diff --git a/SimGeneral/MixingModule/python/aliases_cfi.py b/SimGeneral/MixingModule/python/aliases_cfi.py index ab7507921b55c..511af5789932b 100644 --- a/SimGeneral/MixingModule/python/aliases_cfi.py +++ b/SimGeneral/MixingModule/python/aliases_cfi.py @@ -1,5 +1,4 @@ import FWCore.ParameterSet.Config as cms - simCastorDigis = cms.EDAlias( mix = cms.VPSet( cms.PSet(type = cms.string('CastorDataFramesSorted')) @@ -7,11 +6,20 @@ ) simEcalUnsuppressedDigis = cms.EDAlias( mix = cms.VPSet( - cms.PSet(type = cms.string('EBDigiCollection')), - cms.PSet(type = cms.string('EEDigiCollection')), - cms.PSet(type = cms.string('ESDigiCollection')) + cms.PSet(type = cms.string('EBDigiCollection')), + cms.PSet(type = cms.string('EEDigiCollection')), + cms.PSet(type = cms.string('ESDigiCollection')) ) ) + +from Configuration.Eras.Modifier_phase2_ecal_cff import phase2_ecal + +phase2_ecal.toModify(simEcalUnsuppressedDigis, + mix = cms.VPSet( + cms.PSet(type = cms.string('EBDigiCollectionPh2')) + ) +) + simHcalUnsuppressedDigis = cms.EDAlias( mix = cms.VPSet( cms.PSet(type = cms.string('HBHEDataFramesSorted')), @@ -22,13 +30,16 @@ cms.PSet(type = cms.string('QIE11DataFrameHcalDataFrameContainer')) ) ) + _pixelCommon = cms.VPSet( cms.PSet(type = cms.string('PixelDigiedmDetSetVector')), cms.PSet(type = cms.string('PixelDigiSimLinkedmDetSetVector')) ) + simSiPixelDigis = cms.EDAlias( mix = _pixelCommon ) + simSiStripDigis = cms.EDAlias( mix = cms.VPSet( cms.PSet(type = cms.string('SiStripDigiedmDetSetVector')), @@ -36,6 +47,7 @@ cms.PSet(type = cms.string('StripDigiSimLinkedmDetSetVector')) ) ) + simHGCalUnsuppressedDigis = cms.EDAlias( mix = cms.VPSet( cms.PSet( @@ -55,6 +67,7 @@ ), ) ) + simHFNoseUnsuppressedDigis = cms.EDAlias( mix = cms.VPSet( cms.PSet( @@ -66,9 +79,9 @@ ) simAPVsaturation = cms.EDAlias( - mix = cms.VPSet( - cms.PSet(type = cms.string('bool')) - ) + mix = cms.VPSet( + cms.PSet(type = cms.string('bool')) + ) ) from Configuration.Eras.Modifier_run3_common_cff import run3_common diff --git a/SimGeneral/MixingModule/python/ecalDigitizer_Ph2_cfi.py b/SimGeneral/MixingModule/python/ecalDigitizer_Ph2_cfi.py new file mode 100644 index 0000000000000..72bf5b4f60785 --- /dev/null +++ b/SimGeneral/MixingModule/python/ecalDigitizer_Ph2_cfi.py @@ -0,0 +1,28 @@ +import FWCore.ParameterSet.Config as cms + +from SimCalorimetry.EcalSimProducers.ecalDigiParameters_Ph2_cff import * +from SimCalorimetry.EcalSimProducers.apdSimParameters_cff import * +from SimCalorimetry.EcalSimProducers.ecalSimParameterMap_cff import * +from SimCalorimetry.EcalSimProducers.ecalElectronicsSim_Ph2_cff import * +from SimCalorimetry.EcalSimProducers.ecalNotContainmentSim_cff import * +from SimCalorimetry.EcalSimProducers.ecalCosmicsSim_cff import * + + +ecalDigitizer_Ph2 = cms.PSet( + ecal_digi_parameters, + apd_sim_parameters, + ecal_electronics_sim, + ecal_cosmics_sim, + ecal_sim_parameter_map_ph2, + ecal_notCont_sim, + hitsProducer = cms.string('g4SimHits'), + accumulatorType = cms.string("EcalDigiProducer_Ph2"), + makeDigiSimLinks = cms.untracked.bool(False) +) + +from Configuration.Eras.Modifier_fastSim_cff import fastSim +fastSim.toModify(ecalDigitizer_Ph2, hitsProducer = "fastSimProducer") + + +ecalDigitizer_Ph2.doEB = cms.bool(True) + diff --git a/SimGeneral/MixingModule/python/ecalDigitizer_cfi.py b/SimGeneral/MixingModule/python/ecalDigitizer_cfi.py index d52c937f94c10..e3936b2dc8703 100644 --- a/SimGeneral/MixingModule/python/ecalDigitizer_cfi.py +++ b/SimGeneral/MixingModule/python/ecalDigitizer_cfi.py @@ -8,6 +8,7 @@ from SimCalorimetry.EcalSimProducers.ecalNotContainmentSim_cff import * from SimCalorimetry.EcalSimProducers.ecalCosmicsSim_cff import * + ecalDigitizer = cms.PSet( ecal_digi_parameters, apd_sim_parameters, @@ -32,3 +33,9 @@ phase2_common.toModify( ecalDigitizer, doES = cms.bool(False) ) from Configuration.Eras.Modifier_phase2_hgcal_cff import phase2_hgcal phase2_hgcal.toModify( ecalDigitizer, doEE = cms.bool(False) ) + + +#phase 2 digitization +from Configuration.Eras.Modifier_phase2_ecal_cff import phase2_ecal +from SimGeneral.MixingModule.ecalDigitizer_Ph2_cfi import ecalDigitizer_Ph2 as _ecalDigitizer_Ph2 +phase2_ecal.toReplaceWith(ecalDigitizer,_ecalDigitizer_Ph2) diff --git a/Validation/MtdValidation/plugins/BtlRecoHarvester.cc b/Validation/MtdValidation/plugins/BtlRecoHarvester.cc new file mode 100644 index 0000000000000..39b6985b865b0 --- /dev/null +++ b/Validation/MtdValidation/plugins/BtlRecoHarvester.cc @@ -0,0 +1,123 @@ +#include + +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" + +#include "DQMServices/Core/interface/DQMEDHarvester.h" +#include "DQMServices/Core/interface/DQMStore.h" + +#include "DataFormats/ForwardDetId/interface/BTLDetId.h" + +class BtlRecoHarvester : public DQMEDHarvester { +public: + explicit BtlRecoHarvester(const edm::ParameterSet& iConfig); + ~BtlRecoHarvester() override; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +protected: + void dqmEndJob(DQMStore::IBooker&, DQMStore::IGetter&) override; + +private: + const std::string folder_; + + // --- Histograms + MonitorElement* meBtlEtaEff_; + MonitorElement* meBtlPhiEff_; + MonitorElement* meBtlPtEff_; +}; + +// ------------ constructor and destructor -------------- +BtlRecoHarvester::BtlRecoHarvester(const edm::ParameterSet& iConfig) + : folder_(iConfig.getParameter("folder")) {} + +BtlRecoHarvester::~BtlRecoHarvester() {} + +// ------------ endjob tasks ---------------------------- +void BtlRecoHarvester::dqmEndJob(DQMStore::IBooker& ibook, DQMStore::IGetter& igetter) { + // --- Get the monitoring histograms + MonitorElement* meTrackEffEtaTot = igetter.get(folder_ + "TrackEffEtaTot"); + MonitorElement* meTrackEffPhiTot = igetter.get(folder_ + "TrackEffPhiTot"); + MonitorElement* meTrackEffPtTot = igetter.get(folder_ + "TrackEffPtTot"); + MonitorElement* meTrackEffEtaMtd = igetter.get(folder_ + "TrackEffEtaMtd"); + MonitorElement* meTrackEffPhiMtd = igetter.get(folder_ + "TrackEffPhiMtd"); + MonitorElement* meTrackEffPtMtd = igetter.get(folder_ + "TrackEffPtMtd"); + + if (!meTrackEffEtaTot || !meTrackEffPhiTot || !meTrackEffPtTot || !meTrackEffEtaMtd || !meTrackEffPhiMtd || + !meTrackEffPtMtd) { + edm::LogError("BtlRecoHarvester") << "Monitoring histograms not found!" << std::endl; + return; + } + + // --- Book histograms + ibook.cd(folder_); + meBtlEtaEff_ = ibook.book1D("BtlEtaEff", + " Track Efficiency VS Eta;#eta;Efficiency", + meTrackEffEtaTot->getNbinsX(), + meTrackEffEtaTot->getTH1()->GetXaxis()->GetXmin(), + meTrackEffEtaTot->getTH1()->GetXaxis()->GetXmax()); + meBtlPhiEff_ = ibook.book1D("BtlPhiEff", + "Track Efficiency VS Phi;#phi;Efficiency [rad]", + meTrackEffPhiTot->getNbinsX(), + meTrackEffPhiTot->getTH1()->GetXaxis()->GetXmin(), + meTrackEffPhiTot->getTH1()->GetXaxis()->GetXmax()); + meBtlPtEff_ = ibook.book1D("BtlPtEff", + "Track Efficiency VS Pt;Pt;Efficiency [GeV]", + meTrackEffPtTot->getNbinsX(), + meTrackEffPtTot->getTH1()->GetXaxis()->GetXmin(), + meTrackEffPtTot->getTH1()->GetXaxis()->GetXmax()); + meBtlEtaEff_->getTH1()->SetMinimum(0.); + meBtlPhiEff_->getTH1()->SetMinimum(0.); + meBtlPtEff_->getTH1()->SetMinimum(0.); + + // --- Calculate efficiency + for (int ibin = 1; ibin <= meTrackEffEtaTot->getNbinsX(); ibin++) { + double eff = meTrackEffEtaMtd->getBinContent(ibin) / meTrackEffEtaTot->getBinContent(ibin); + double bin_err = sqrt((meTrackEffEtaMtd->getBinContent(ibin) * + (meTrackEffEtaTot->getBinContent(ibin) - meTrackEffEtaMtd->getBinContent(ibin))) / + pow(meTrackEffEtaTot->getBinContent(ibin), 3)); + if (meTrackEffEtaTot->getBinContent(ibin) == 0) { + eff = 0; + bin_err = 0; + } + meBtlEtaEff_->setBinContent(ibin, eff); + meBtlEtaEff_->setBinError(ibin, bin_err); + } + for (int ibin = 1; ibin <= meTrackEffPhiTot->getNbinsX(); ibin++) { + double eff = meTrackEffPhiMtd->getBinContent(ibin) / meTrackEffPhiTot->getBinContent(ibin); + double bin_err = sqrt((meTrackEffPhiMtd->getBinContent(ibin) * + (meTrackEffPhiTot->getBinContent(ibin) - meTrackEffPhiMtd->getBinContent(ibin))) / + pow(meTrackEffPhiTot->getBinContent(ibin), 3)); + if (meTrackEffPhiTot->getBinContent(ibin) == 0) { + eff = 0; + bin_err = 0; + } + meBtlPhiEff_->setBinContent(ibin, eff); + meBtlPhiEff_->setBinError(ibin, bin_err); + } + for (int ibin = 1; ibin <= meTrackEffPtTot->getNbinsX(); ibin++) { + double eff = meTrackEffPtMtd->getBinContent(ibin) / meTrackEffPtTot->getBinContent(ibin); + double bin_err = sqrt((meTrackEffPtMtd->getBinContent(ibin) * + (meTrackEffPtTot->getBinContent(ibin) - meTrackEffPtMtd->getBinContent(ibin))) / + pow(meTrackEffPtTot->getBinContent(ibin), 3)); + if (meTrackEffPtTot->getBinContent(ibin) == 0) { + eff = 0; + bin_err = 0; + } + meBtlPtEff_->setBinContent(ibin, eff); + meBtlPtEff_->setBinError(ibin, bin_err); + } +} + +// ------------ method fills 'descriptions' with the allowed parameters for the module ---------- +void BtlRecoHarvester::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + + desc.add("folder", "MTD/BTL/Reco/"); + + descriptions.add("btlRecoPostProcessor", desc); +} + +DEFINE_FWK_MODULE(BtlRecoHarvester); diff --git a/Validation/MtdValidation/plugins/BtlRecoValidation.cc b/Validation/MtdValidation/plugins/BtlRecoValidation.cc new file mode 100644 index 0000000000000..ae3e9bb85e9b6 --- /dev/null +++ b/Validation/MtdValidation/plugins/BtlRecoValidation.cc @@ -0,0 +1,219 @@ +#include + +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" + +#include "DQMServices/Core/interface/DQMEDAnalyzer.h" +#include "DQMServices/Core/interface/DQMStore.h" + +#include "DataFormats/Common/interface/ValidHandle.h" +#include "DataFormats/Math/interface/GeantUnits.h" +#include "DataFormats/ForwardDetId/interface/BTLDetId.h" +#include "DataFormats/FTLRecHit/interface/FTLRecHitCollections.h" +#include "DataFormats/FTLRecHit/interface/FTLClusterCollections.h" + +#include "DataFormats/Common/interface/Ptr.h" +#include "DataFormats/Common/interface/PtrVector.h" +#include "DataFormats/Common/interface/RefProd.h" +#include "DataFormats/Common/interface/Ref.h" +#include "DataFormats/Common/interface/RefVector.h" + +#include "DataFormats/TrackReco/interface/Track.h" +#include "DataFormats/TrackReco/interface/TrackFwd.h" +#include "DataFormats/GsfTrackReco/interface/GsfTrack.h" +#include "DataFormats/GsfTrackReco/interface/GsfTrackFwd.h" +#include "DataFormats/VertexReco/interface/Vertex.h" +#include "DataFormats/VertexReco/interface/VertexFwd.h" +#include "DataFormats/TrackerRecHit2D/interface/MTDTrackingRecHit.h" + +#include "Geometry/Records/interface/MTDDigiGeometryRecord.h" +#include "Geometry/Records/interface/MTDTopologyRcd.h" +#include "Geometry/MTDNumberingBuilder/interface/MTDTopology.h" +#include "Geometry/MTDGeometryBuilder/interface/MTDGeometry.h" +#include "Geometry/MTDGeometryBuilder/interface/ProxyMTDTopology.h" +#include "Geometry/MTDGeometryBuilder/interface/RectangularMTDTopology.h" + +class BtlRecoValidation : public DQMEDAnalyzer { +public: + explicit BtlRecoValidation(const edm::ParameterSet&); + ~BtlRecoValidation() override; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override; + + void analyze(const edm::Event&, const edm::EventSetup&) override; + + // ------------ member data ------------ + + const std::string folder_; + const float hitMinEnergy_; + const float trackMinEnergy_; + const float trackMinEta_; + + edm::EDGetTokenT btlRecCluToken_; + edm::EDGetTokenT btlRecTrackToken_; + edm::EDGetTokenT> RecVertexToken_; + + MonitorElement* meCluTime_; + MonitorElement* meCluEnergy_; + MonitorElement* meCluPhi_; + MonitorElement* meCluEta_; + MonitorElement* meCluHits_; + MonitorElement* meCluZvsPhi_; + MonitorElement* meTrackRPTime_; + MonitorElement* meTrackEffEtaTot_; + MonitorElement* meTrackEffPhiTot_; + MonitorElement* meTrackEffPtTot_; + MonitorElement* meTrackEffEtaMtd_; + MonitorElement* meTrackEffPhiMtd_; + MonitorElement* meTrackEffPtMtd_; + MonitorElement* meVerNumber_; + MonitorElement* meVerZ_; + MonitorElement* meVerTime_; +}; + +// ------------ constructor and destructor -------------- +BtlRecoValidation::BtlRecoValidation(const edm::ParameterSet& iConfig) + : folder_(iConfig.getParameter("folder")), + hitMinEnergy_(iConfig.getParameter("hitMinimumEnergy")), + trackMinEnergy_(iConfig.getParameter("trackMinimumEnergy")), + trackMinEta_(iConfig.getParameter("trackMinimumEta")) { + btlRecCluToken_ = consumes(iConfig.getParameter("inputTagC")); + btlRecTrackToken_ = consumes(iConfig.getParameter("inputTagT")); + RecVertexToken_ = consumes>(iConfig.getParameter("inputTagV")); +} + +BtlRecoValidation::~BtlRecoValidation() {} + +// ------------ method called for each event ------------ +void BtlRecoValidation::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) { + using namespace edm; + using namespace geant_units::operators; + using namespace std; + + edm::ESHandle geometryHandle; + iSetup.get().get(geometryHandle); + const MTDGeometry* geom = geometryHandle.product(); + + edm::ESHandle topologyHandle; + iSetup.get().get(topologyHandle); + + auto btlRecCluHandle = makeValid(iEvent.getHandle(btlRecCluToken_)); + auto btlRecTrackHandle = makeValid(iEvent.getHandle(btlRecTrackToken_)); + auto RecVertexHandle = makeValid(iEvent.getHandle(RecVertexToken_)); + + // --- Loop over the BTL RECO tracks --- + for (const auto& track : *btlRecTrackHandle) { + if (fabs(track.eta()) > trackMinEta_) + continue; + if (track.pt() < trackMinEnergy_) + continue; + + // --- all BTL tracks (with and without hit in MTD) --- + meTrackEffEtaTot_->Fill(track.eta()); + meTrackEffPhiTot_->Fill(track.phi()); + meTrackEffPtTot_->Fill(track.pt()); + + bool MTDBtl = false; + for (const auto hit : track.recHits()) { + MTDDetId Hit = hit->geographicalId(); + if ((Hit.det() == 6) && (Hit.subdetId() == 1) && (Hit.mtdSubDetector() == 1)) + MTDBtl = true; + } + + // --- keeping only tracks with last hit in MTD --- + if (MTDBtl == true) { + meTrackEffEtaMtd_->Fill(track.eta()); + meTrackEffPhiMtd_->Fill(track.phi()); + meTrackEffPtMtd_->Fill(track.pt()); + meTrackRPTime_->Fill(track.t0()); + } + } + + // --- Loop over the RECO vertices --- + int nv = 0; + for (const auto& v : *RecVertexHandle) { + if (v.isValid()) { + meVerZ_->Fill(v.z()); + meVerTime_->Fill(v.t()); + nv++; + } else + cout << "The vertex is not valid" << endl; + } + meVerNumber_->Fill(nv); + + // --- Loop over the BTL RECO clusters --- + for (const auto& DetSetClu : *btlRecCluHandle) { + for (const auto& cluster : DetSetClu) { + if (cluster.energy() < hitMinEnergy_) + continue; + BTLDetId cluId = cluster.id(); + DetId detIdObject(cluId); + const auto& genericDet = geom->idToDetUnit(detIdObject); + if (genericDet == nullptr) { + throw cms::Exception("BtlRecoValidation") + << "GeographicalID: " << std::hex << cluId << " is invalid!" << std::dec << std::endl; + } + + const ProxyMTDTopology& topoproxy = static_cast(genericDet->topology()); + const RectangularMTDTopology& topo = static_cast(topoproxy.specificTopology()); + + Local3DPoint local_point(cluster.x() * 5.7, cluster.y() * 0.3, 0.); + local_point = topo.pixelToModuleLocalPoint(local_point, cluId.row(topo.nrows()), cluId.column(topo.ncolumns())); + const auto& global_point = genericDet->toGlobal(local_point); + + meCluEnergy_->Fill(cluster.energy()); + meCluTime_->Fill(cluster.time()); + meCluPhi_->Fill(global_point.phi()); + meCluEta_->Fill(global_point.eta()); + meCluZvsPhi_->Fill(global_point.z(), global_point.phi()); + meCluHits_->Fill(cluster.size()); + } + } +} + +// ------------ method for histogram booking ------------ +void BtlRecoValidation::bookHistograms(DQMStore::IBooker& ibook, edm::Run const& run, edm::EventSetup const& iSetup) { + ibook.setCurrentFolder(folder_); + + // histogram booking + meCluTime_ = ibook.book1D("BtlCluTime", "BTL cluster time ToA;ToA [ns]", 250, 0, 25); + meCluEnergy_ = ibook.book1D("BtlCluEnergy", "BTL cluster energy;E_{RECO} [MeV]", 100, 0, 20); + meCluPhi_ = ibook.book1D("BtlCluPhi", "BTL cluster #phi;#phi_{RECO} [rad]", 100, -3.2, 3.2); + meCluEta_ = ibook.book1D("BtlCluEta", "BTL cluster #eta;#eta_{RECO}", 100, -1.6, 1.6); + meCluHits_ = ibook.book1D("BtlCluHitNumber", "BTL hits per cluster", 10, 0, 10); + meCluZvsPhi_ = ibook.book2D( + "BtlOccupancy", "BTL cluster Z vs #phi;Z_{RECO} [cm]; #phi_{RECO} [rad]", 100, -260., 260., 100, -3.2, 3.2); + meTrackEffEtaTot_ = ibook.book1D("TrackEffEtaTot", "Track efficiency vs eta D;#eta_{RECO}", 100, -1.6, 1.6); + meTrackEffPhiTot_ = ibook.book1D("TrackEffPhiTot", "Track efficiency vs phi D;#phi_{RECO} [rad]", 100, -3.2, 3.2); + meTrackEffPtTot_ = ibook.book1D("TrackEffPtTot", "Track efficiency vs pt D;pt_{RECO} [GeV]", 50, 0, 10); + meTrackEffEtaMtd_ = ibook.book1D("TrackEffEtaMtd", "Track efficiency vs eta N;#eta_{RECO}", 100, -1.6, 1.6); + meTrackEffPhiMtd_ = ibook.book1D("TrackEffPhiMtd", "Track efficiency vs phi N;#phi_{RECO} [rad]", 100, -3.2, 3.2); + meTrackEffPtMtd_ = ibook.book1D("TrackEffPtMtd", "Track efficiency vs pt N;pt_{RECO} [GeV]", 50, 0, 10); + meTrackRPTime_ = ibook.book1D("TrackRPTime", "Track t0 with respect to R.P.;t0 [ns]", 100, -10, 10); + meVerZ_ = ibook.book1D("VerZ", "RECO Vertex Z;Z_{RECO} [cm]", 180, -18, 18); + meVerTime_ = ibook.book1D("VerTime", "RECO Vertex Time;t0 [ns]", 100, -1, 1); + meVerNumber_ = ibook.book1D("VerNumber", "RECO Vertex Number", 100, 0, 500); +} + +// ------------ method fills 'descriptions' with the allowed parameters for the module ------------ + +void BtlRecoValidation::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + + desc.add("folder", "MTD/BTL/Reco"); + desc.add("inputTagC", edm::InputTag("mtdClusters", "FTLBarrel")); + desc.add("inputTagT", edm::InputTag("trackExtenderWithMTD", "")); + desc.add("inputTagV", edm::InputTag("offlinePrimaryVertices4D", "")); + desc.add("hitMinimumEnergy", 1.); // [MeV] + desc.add("trackMinimumEnergy", 1.); // [GeV] + desc.add("trackMinimumEta", 1.5); + + descriptions.add("btlReco", desc); +} + +DEFINE_FWK_MODULE(BtlRecoValidation); diff --git a/Validation/MtdValidation/plugins/EtlRecoHarvester.cc b/Validation/MtdValidation/plugins/EtlRecoHarvester.cc new file mode 100644 index 0000000000000..a5763815f2329 --- /dev/null +++ b/Validation/MtdValidation/plugins/EtlRecoHarvester.cc @@ -0,0 +1,189 @@ +#include + +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" + +#include "DQMServices/Core/interface/DQMEDHarvester.h" +#include "DQMServices/Core/interface/DQMStore.h" + +#include "DataFormats/ForwardDetId/interface/ETLDetId.h" + +class EtlRecoHarvester : public DQMEDHarvester { +public: + explicit EtlRecoHarvester(const edm::ParameterSet& iConfig); + ~EtlRecoHarvester() override; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +protected: + void dqmEndJob(DQMStore::IBooker&, DQMStore::IGetter&) override; + +private: + const std::string folder_; + + // --- Histograms + MonitorElement* meEtlEtaEff_[2]; + MonitorElement* meEtlPhiEff_[2]; + MonitorElement* meEtlPtEff_[2]; +}; + +// ------------ constructor and destructor -------------- +EtlRecoHarvester::EtlRecoHarvester(const edm::ParameterSet& iConfig) + : folder_(iConfig.getParameter("folder")) {} + +EtlRecoHarvester::~EtlRecoHarvester() {} + +// ------------ endjob tasks ---------------------------- +void EtlRecoHarvester::dqmEndJob(DQMStore::IBooker& ibook, DQMStore::IGetter& igetter) { + // --- Get the monitoring histograms + MonitorElement* meTrackEffEtaTotZneg = igetter.get(folder_ + "TrackEffEtaTotZneg"); + MonitorElement* meTrackEffPhiTotZneg = igetter.get(folder_ + "TrackEffPhiTotZneg"); + MonitorElement* meTrackEffPtTotZneg = igetter.get(folder_ + "TrackEffPtTotZneg"); + MonitorElement* meTrackEffEtaMtdZneg = igetter.get(folder_ + "TrackEffEtaMtdZneg"); + MonitorElement* meTrackEffPhiMtdZneg = igetter.get(folder_ + "TrackEffPhiMtdZneg"); + MonitorElement* meTrackEffPtMtdZneg = igetter.get(folder_ + "TrackEffPtMtdZneg"); + MonitorElement* meTrackEffEtaTotZpos = igetter.get(folder_ + "TrackEffEtaTotZpos"); + MonitorElement* meTrackEffPhiTotZpos = igetter.get(folder_ + "TrackEffPhiTotZpos"); + MonitorElement* meTrackEffPtTotZpos = igetter.get(folder_ + "TrackEffPtTotZpos"); + MonitorElement* meTrackEffEtaMtdZpos = igetter.get(folder_ + "TrackEffEtaMtdZpos"); + MonitorElement* meTrackEffPhiMtdZpos = igetter.get(folder_ + "TrackEffPhiMtdZpos"); + MonitorElement* meTrackEffPtMtdZpos = igetter.get(folder_ + "TrackEffPtMtdZpos"); + + if (!meTrackEffEtaTotZneg || !meTrackEffPhiTotZneg || !meTrackEffPtTotZneg || !meTrackEffEtaMtdZneg || + !meTrackEffPhiMtdZneg || !meTrackEffPtMtdZneg || !meTrackEffEtaTotZpos || !meTrackEffPhiTotZpos || + !meTrackEffPtTotZpos || !meTrackEffEtaMtdZpos || !meTrackEffPhiMtdZpos || !meTrackEffPtMtdZpos) { + edm::LogError("EtlRecoHarvester") << "Monitoring histograms not found!" << std::endl; + return; + } + + // --- Book histograms + ibook.cd(folder_); + meEtlEtaEff_[0] = ibook.book1D("EtlEtaEffZneg", + " Track Efficiency VS Eta (-Z);#eta;Efficiency", + meTrackEffEtaTotZneg->getNbinsX(), + meTrackEffEtaTotZneg->getTH1()->GetXaxis()->GetXmin(), + meTrackEffEtaTotZneg->getTH1()->GetXaxis()->GetXmax()); + meEtlPhiEff_[0] = ibook.book1D("EtlPhiEffZneg", + "Track Efficiency VS Phi (-Z);#phi [rad];Efficiency", + meTrackEffPhiTotZneg->getNbinsX(), + meTrackEffPhiTotZneg->getTH1()->GetXaxis()->GetXmin(), + meTrackEffPhiTotZneg->getTH1()->GetXaxis()->GetXmax()); + meEtlPtEff_[0] = ibook.book1D("EtlPtEffZneg", + "Track Efficiency VS Pt (-Z);Pt [GeV];Efficiency", + meTrackEffPtTotZneg->getNbinsX(), + meTrackEffPtTotZneg->getTH1()->GetXaxis()->GetXmin(), + meTrackEffPtTotZneg->getTH1()->GetXaxis()->GetXmax()); + meEtlEtaEff_[1] = ibook.book1D("EtlEtaEffZpos", + " Track Efficiency VS Eta (+Z);#eta;Efficiency", + meTrackEffEtaTotZpos->getNbinsX(), + meTrackEffEtaTotZpos->getTH1()->GetXaxis()->GetXmin(), + meTrackEffEtaTotZpos->getTH1()->GetXaxis()->GetXmax()); + meEtlPhiEff_[1] = ibook.book1D("EtlPhiEffZpos", + "Track Efficiency VS Phi (+Z);#phi [rad];Efficiency", + meTrackEffPhiTotZpos->getNbinsX(), + meTrackEffPhiTotZpos->getTH1()->GetXaxis()->GetXmin(), + meTrackEffPhiTotZpos->getTH1()->GetXaxis()->GetXmax()); + meEtlPtEff_[1] = ibook.book1D("EtlPtEffZpos", + "Track Efficiency VS Pt (+Z);Pt [GeV];Efficiency", + meTrackEffPtTotZpos->getNbinsX(), + meTrackEffPtTotZpos->getTH1()->GetXaxis()->GetXmin(), + meTrackEffPtTotZpos->getTH1()->GetXaxis()->GetXmax()); + meEtlEtaEff_[0]->getTH1()->SetMinimum(0.); + meEtlPhiEff_[0]->getTH1()->SetMinimum(0.); + meEtlPtEff_[0]->getTH1()->SetMinimum(0.); + meEtlEtaEff_[1]->getTH1()->SetMinimum(0.); + meEtlPhiEff_[1]->getTH1()->SetMinimum(0.); + meEtlPtEff_[1]->getTH1()->SetMinimum(0.); + + // --- Calculate efficiency + for (int ibin = 1; ibin <= meTrackEffEtaTotZneg->getNbinsX(); ibin++) { + double eff = meTrackEffEtaMtdZneg->getBinContent(ibin) / meTrackEffEtaTotZneg->getBinContent(ibin); + double bin_err = sqrt((meTrackEffEtaMtdZneg->getBinContent(ibin) * + (meTrackEffEtaTotZneg->getBinContent(ibin) - meTrackEffEtaMtdZneg->getBinContent(ibin))) / + pow(meTrackEffEtaTotZneg->getBinContent(ibin), 3)); + if (meTrackEffEtaTotZneg->getBinContent(ibin) == 0) { + eff = 0; + bin_err = 0; + } + meEtlEtaEff_[0]->setBinContent(ibin, eff); + meEtlEtaEff_[0]->setBinError(ibin, bin_err); + } + + for (int ibin = 1; ibin <= meTrackEffEtaTotZpos->getNbinsX(); ibin++) { + double eff = meTrackEffEtaMtdZpos->getBinContent(ibin) / meTrackEffEtaTotZpos->getBinContent(ibin); + double bin_err = sqrt((meTrackEffEtaMtdZpos->getBinContent(ibin) * + (meTrackEffEtaTotZpos->getBinContent(ibin) - meTrackEffEtaMtdZpos->getBinContent(ibin))) / + pow(meTrackEffEtaTotZpos->getBinContent(ibin), 3)); + if (meTrackEffEtaTotZpos->getBinContent(ibin) == 0) { + eff = 0; + bin_err = 0; + } + meEtlEtaEff_[1]->setBinContent(ibin, eff); + meEtlEtaEff_[1]->setBinError(ibin, bin_err); + } + + for (int ibin = 1; ibin <= meTrackEffPhiTotZneg->getNbinsX(); ibin++) { + double eff = meTrackEffPhiMtdZneg->getBinContent(ibin) / meTrackEffPhiTotZneg->getBinContent(ibin); + double bin_err = sqrt((meTrackEffPhiMtdZneg->getBinContent(ibin) * + (meTrackEffPhiTotZneg->getBinContent(ibin) - meTrackEffPhiMtdZneg->getBinContent(ibin))) / + pow(meTrackEffPhiTotZneg->getBinContent(ibin), 3)); + if (meTrackEffPhiTotZneg->getBinContent(ibin) == 0) { + eff = 0; + bin_err = 0; + } + meEtlPhiEff_[0]->setBinContent(ibin, eff); + meEtlPhiEff_[0]->setBinError(ibin, bin_err); + } + + for (int ibin = 1; ibin <= meTrackEffPhiTotZpos->getNbinsX(); ibin++) { + double eff = meTrackEffPhiMtdZpos->getBinContent(ibin) / meTrackEffPhiTotZpos->getBinContent(ibin); + double bin_err = sqrt((meTrackEffPhiMtdZpos->getBinContent(ibin) * + (meTrackEffPhiTotZpos->getBinContent(ibin) - meTrackEffPhiMtdZpos->getBinContent(ibin))) / + pow(meTrackEffPhiTotZpos->getBinContent(ibin), 3)); + if (meTrackEffPhiTotZpos->getBinContent(ibin) == 0) { + eff = 0; + bin_err = 0; + } + meEtlPhiEff_[1]->setBinContent(ibin, eff); + meEtlPhiEff_[1]->setBinError(ibin, bin_err); + } + + for (int ibin = 1; ibin <= meTrackEffPtTotZneg->getNbinsX(); ibin++) { + double eff = meTrackEffPtMtdZneg->getBinContent(ibin) / meTrackEffPtTotZneg->getBinContent(ibin); + double bin_err = sqrt((meTrackEffPtMtdZneg->getBinContent(ibin) * + (meTrackEffPtTotZneg->getBinContent(ibin) - meTrackEffPtMtdZneg->getBinContent(ibin))) / + pow(meTrackEffPtTotZneg->getBinContent(ibin), 3)); + if (meTrackEffPtTotZneg->getBinContent(ibin) == 0) { + eff = 0; + bin_err = 0; + } + meEtlPtEff_[0]->setBinContent(ibin, eff); + meEtlPtEff_[0]->setBinError(ibin, bin_err); + } + + for (int ibin = 1; ibin <= meTrackEffPtTotZpos->getNbinsX(); ibin++) { + double eff = meTrackEffPtMtdZpos->getBinContent(ibin) / meTrackEffPtTotZpos->getBinContent(ibin); + double bin_err = sqrt((meTrackEffPtMtdZpos->getBinContent(ibin) * + (meTrackEffPtTotZpos->getBinContent(ibin) - meTrackEffPtMtdZpos->getBinContent(ibin))) / + pow(meTrackEffPtTotZpos->getBinContent(ibin), 3)); + if (meTrackEffPtTotZpos->getBinContent(ibin) == 0) { + eff = 0; + bin_err = 0; + } + meEtlPtEff_[1]->setBinContent(ibin, eff); + meEtlPtEff_[1]->setBinError(ibin, bin_err); + } +} + +// ------------ method fills 'descriptions' with the allowed parameters for the module ---------- +void EtlRecoHarvester::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + + desc.add("folder", "MTD/ETL/Reco/"); + + descriptions.add("etlRecoPostProcessor", desc); +} + +DEFINE_FWK_MODULE(EtlRecoHarvester); diff --git a/Validation/MtdValidation/plugins/EtlRecoValidation.cc b/Validation/MtdValidation/plugins/EtlRecoValidation.cc new file mode 100644 index 0000000000000..31d0086612be5 --- /dev/null +++ b/Validation/MtdValidation/plugins/EtlRecoValidation.cc @@ -0,0 +1,244 @@ +#include + +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" + +#include "DQMServices/Core/interface/DQMEDAnalyzer.h" +#include "DQMServices/Core/interface/DQMStore.h" + +#include "DataFormats/Common/interface/ValidHandle.h" +#include "DataFormats/Math/interface/GeantUnits.h" +#include "DataFormats/ForwardDetId/interface/ETLDetId.h" +#include "DataFormats/FTLRecHit/interface/FTLRecHitCollections.h" +#include "DataFormats/FTLRecHit/interface/FTLClusterCollections.h" + +#include "DataFormats/Common/interface/Ptr.h" +#include "DataFormats/Common/interface/PtrVector.h" +#include "DataFormats/Common/interface/RefProd.h" +#include "DataFormats/Common/interface/Ref.h" +#include "DataFormats/Common/interface/RefVector.h" + +#include "DataFormats/TrackReco/interface/Track.h" +#include "DataFormats/TrackReco/interface/TrackFwd.h" +#include "DataFormats/GsfTrackReco/interface/GsfTrack.h" +#include "DataFormats/GsfTrackReco/interface/GsfTrackFwd.h" +#include "DataFormats/TrackerRecHit2D/interface/MTDTrackingRecHit.h" + +#include "Geometry/Records/interface/MTDDigiGeometryRecord.h" +#include "Geometry/Records/interface/MTDTopologyRcd.h" +#include "Geometry/MTDNumberingBuilder/interface/MTDTopology.h" +#include "Geometry/MTDGeometryBuilder/interface/MTDGeometry.h" +#include "Geometry/MTDGeometryBuilder/interface/ProxyMTDTopology.h" +#include "Geometry/MTDGeometryBuilder/interface/RectangularMTDTopology.h" + +class EtlRecoValidation : public DQMEDAnalyzer { +public: + explicit EtlRecoValidation(const edm::ParameterSet&); + ~EtlRecoValidation() override; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override; + + void analyze(const edm::Event&, const edm::EventSetup&) override; + + // ------------ member data ------------ + + const std::string folder_; + const float hitMinEnergy_; + const float trackMinEnergy_; + const float trackMinEta_; + const float trackMaxEta_; + + edm::EDGetTokenT etlRecCluToken_; + edm::EDGetTokenT etlRecTrackToken_; + + MonitorElement* meCluTime_[2]; + MonitorElement* meCluEnergy_[2]; + MonitorElement* meCluPhi_[2]; + MonitorElement* meCluEta_[2]; + MonitorElement* meCluHits_[2]; + MonitorElement* meCluZvsPhi_[2]; + MonitorElement* meTrackRPTime_[2]; + MonitorElement* meTrackEffEtaTot_[2]; + MonitorElement* meTrackEffPhiTot_[2]; + MonitorElement* meTrackEffPtTot_[2]; + MonitorElement* meTrackEffEtaMtd_[2]; + MonitorElement* meTrackEffPhiMtd_[2]; + MonitorElement* meTrackEffPtMtd_[2]; +}; + +// ------------ constructor and destructor -------------- +EtlRecoValidation::EtlRecoValidation(const edm::ParameterSet& iConfig) + : folder_(iConfig.getParameter("folder")), + hitMinEnergy_(iConfig.getParameter("hitMinimumEnergy")), + trackMinEnergy_(iConfig.getParameter("trackMinimumEnergy")), + trackMinEta_(iConfig.getParameter("trackMinimumEta")), + trackMaxEta_(iConfig.getParameter("trackMaximumEta")) { + etlRecCluToken_ = consumes(iConfig.getParameter("inputTagC")); + etlRecTrackToken_ = consumes(iConfig.getParameter("inputTagT")); +} + +EtlRecoValidation::~EtlRecoValidation() {} + +// ------------ method called for each event ------------ +void EtlRecoValidation::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) { + using namespace edm; + using namespace geant_units::operators; + using namespace std; + + edm::ESHandle geometryHandle; + iSetup.get().get(geometryHandle); + const MTDGeometry* geom = geometryHandle.product(); + + edm::ESHandle topologyHandle; + iSetup.get().get(topologyHandle); + + auto etlRecCluHandle = makeValid(iEvent.getHandle(etlRecCluToken_)); + auto etlRecTrackHandle = makeValid(iEvent.getHandle(etlRecTrackToken_)); + + // --- Loop over the ETL RECO tracks --- + for (const auto& track : *etlRecTrackHandle) { + if (track.pt() < trackMinEnergy_) + continue; + + // --- all ETL tracks (with and without hit in MTD) --- + if ((track.eta() < -trackMinEta_) && (track.eta() > -trackMaxEta_)) { + meTrackEffEtaTot_[0]->Fill(track.eta()); + meTrackEffPhiTot_[0]->Fill(track.phi()); + meTrackEffPtTot_[0]->Fill(track.pt()); + } + + if ((track.eta() > trackMinEta_) && (track.eta() < trackMaxEta_)) { + meTrackEffEtaTot_[1]->Fill(track.eta()); + meTrackEffPhiTot_[1]->Fill(track.phi()); + meTrackEffPtTot_[1]->Fill(track.pt()); + } + + bool MTDEtlZneg = false; + bool MTDEtlZpos = false; + for (const auto hit : track.recHits()) { + MTDDetId Hit = hit->geographicalId(); + if ((Hit.det() == 6) && (Hit.subdetId() == 1) && (Hit.mtdSubDetector() == 2) && (Hit.zside() == -1)) + MTDEtlZneg = true; + if ((Hit.det() == 6) && (Hit.subdetId() == 1) && (Hit.mtdSubDetector() == 2) && (Hit.zside() == 1)) + MTDEtlZpos = true; + } + + // --- keeping only tracks with last hit in MTD --- + if ((track.eta() < -trackMinEta_) && (track.eta() > -trackMaxEta_)) { + if (MTDEtlZneg == true) { + meTrackEffEtaMtd_[0]->Fill(track.eta()); + meTrackEffPhiMtd_[0]->Fill(track.phi()); + meTrackEffPtMtd_[0]->Fill(track.pt()); + meTrackRPTime_[0]->Fill(track.t0()); + } + } + if ((track.eta() > trackMinEta_) && (track.eta() < trackMaxEta_)) { + if (MTDEtlZpos == true) { + meTrackEffEtaMtd_[1]->Fill(track.eta()); + meTrackEffPhiMtd_[1]->Fill(track.phi()); + meTrackEffPtMtd_[1]->Fill(track.pt()); + meTrackRPTime_[1]->Fill(track.t0()); + } + } + } + + // --- Loop over the ETL RECO clusters --- + for (const auto& DetSetClu : *etlRecCluHandle) { + for (const auto& cluster : DetSetClu) { + if (cluster.energy() < hitMinEnergy_) + continue; + ETLDetId cluId = cluster.id(); + DetId detIdObject(cluId); + const auto& genericDet = geom->idToDetUnit(detIdObject); + if (genericDet == nullptr) { + throw cms::Exception("EtlRecoValidation") + << "GeographicalID: " << std::hex << cluId << " is invalid!" << std::dec << std::endl; + } + + const ProxyMTDTopology& topoproxy = static_cast(genericDet->topology()); + const RectangularMTDTopology& topo = static_cast(topoproxy.specificTopology()); + + Local3DPoint local_point(topo.localX(cluster.x()), topo.localY(cluster.y()), 0.); + const auto& global_point = genericDet->toGlobal(local_point); + + int idet = (cluId.zside() + 1) / 2; + + meCluEnergy_[idet]->Fill(cluster.energy()); + meCluTime_[idet]->Fill(cluster.time()); + meCluPhi_[idet]->Fill(global_point.phi()); + meCluEta_[idet]->Fill(global_point.eta()); + meCluZvsPhi_[idet]->Fill(global_point.x(), global_point.y()); + meCluHits_[idet]->Fill(cluster.size()); + } + } +} + +// ------------ method for histogram booking ------------ +void EtlRecoValidation::bookHistograms(DQMStore::IBooker& ibook, edm::Run const& run, edm::EventSetup const& iSetup) { + ibook.setCurrentFolder(folder_); + + // histogram booking + meCluTime_[0] = ibook.book1D("EtlCluTimeZneg", "ETL cluster ToA (-Z);ToA [ns]", 250, 0, 25); + meCluTime_[1] = ibook.book1D("EtlCluTimeZpos", "ETL cluster ToA (+Z);ToA [ns]", 250, 0, 25); + meCluEnergy_[0] = ibook.book1D("EtlCluEnergyZneg", "ETL cluster energy (-Z);E_{RECO} [MeV]", 100, 0, 10); + meCluEnergy_[1] = ibook.book1D("EtlCluEnergyZpos", "ETL cluster energy (+Z);E_{RECO} [MeV]", 100, 0, 10); + meCluPhi_[0] = ibook.book1D("EtlCluPhiZneg", "ETL cluster #phi (-Z);#phi_{RECO} [rad]", 100, -3.2, 3.2); + meCluPhi_[1] = ibook.book1D("EtlCluPhiZpos", "ETL cluster #phi (+Z);#phi_{RECO} [rad]", 100, -3.2, 3.2); + meCluEta_[0] = ibook.book1D("EtlCluEtaZneg", "ETL cluster #eta (-Z);#eta_{RECO}", 100, -3.2, -1.4); + meCluEta_[1] = ibook.book1D("EtlCluEtaZpos", "ETL cluster #eta (+Z);#eta_{RECO}", 100, 1.4, 3.2); + meCluHits_[0] = ibook.book1D("EtlCluHitNumberZneg", "ETL hits per cluster (-Z)", 10, 0, 10); + meCluHits_[1] = ibook.book1D("EtlCluHitNumberZpos", "ETL hits per cluster (+Z)", 10, 0, 10); + meCluZvsPhi_[0] = ibook.book2D( + "EtlOccupancyZneg", "ETL cluster X vs Y (-Z);X_{RECO} [cm]; Y_{RECO} [cm]", 100, -150., 150., 100, -150, 150); + meCluZvsPhi_[1] = ibook.book2D( + "EtlOccupancyZpos", "ETL cluster X vs Y (+Z);X_{RECO} [cm]; Y_{RECO} [cm]", 100, -150., 150., 100, -150, 150); + meTrackEffEtaTot_[0] = + ibook.book1D("TrackEffEtaTotZneg", "Track efficiency vs eta (Tot) (-Z);#eta_{RECO}", 100, -3.2, -1.4); + meTrackEffEtaTot_[1] = + ibook.book1D("TrackEffEtaTotZpos", "Track efficiency vs eta (Tot) (+Z);#eta_{RECO}", 100, 1.4, 3.2); + meTrackEffPhiTot_[0] = + ibook.book1D("TrackEffPhiTotZneg", "Track efficiency vs phi (Tot) (-Z);#phi_{RECO} [rad]", 100, -3.2, 3.2); + meTrackEffPhiTot_[1] = + ibook.book1D("TrackEffPhiTotZpos", "Track efficiency vs phi (Tot) (+Z);#phi_{RECO} [rad]", 100, -3.2, 3.2); + meTrackEffPtTot_[0] = + ibook.book1D("TrackEffPtTotZneg", "Track efficiency vs pt (Tot) (-Z);pt_{RECO} [GeV]", 50, 0, 10); + meTrackEffPtTot_[1] = + ibook.book1D("TrackEffPtTotZpos", "Track efficiency vs pt (Tot) (+Z);pt_{RECO} [GeV]", 50, 0, 10); + meTrackEffEtaMtd_[0] = + ibook.book1D("TrackEffEtaMtdZneg", "Track efficiency vs eta (Mtd) (-Z);#eta_{RECO}", 100, -3.2, -1.4); + meTrackEffEtaMtd_[1] = + ibook.book1D("TrackEffEtaMtdZpos", "Track efficiency vs eta (Mtd) (+Z);#eta_{RECO}", 100, 1.4, 3.2); + meTrackEffPhiMtd_[0] = + ibook.book1D("TrackEffPhiMtdZneg", "Track efficiency vs phi (Mtd) (-Z);#phi_{RECO} [rad]", 100, -3.2, 3.2); + meTrackEffPhiMtd_[1] = + ibook.book1D("TrackEffPhiMtdZpos", "Track efficiency vs phi (Mtd) (+Z);#phi_{RECO} [rad]", 100, -3.2, 3.2); + meTrackEffPtMtd_[0] = + ibook.book1D("TrackEffPtMtdZneg", "Track efficiency vs pt (Mtd) (-Z);pt_{RECO} [GeV]", 50, 0, 10); + meTrackEffPtMtd_[1] = + ibook.book1D("TrackEffPtMtdZpos", "Track efficiency vs pt (Mtd) (+Z);pt_{RECO} [GeV]", 50, 0, 10); + meTrackRPTime_[0] = ibook.book1D("TrackRPTimeZneg", "Track t0 with respect to R.P. (-Z);t0 [ns]", 100, -10, 10); + meTrackRPTime_[1] = ibook.book1D("TrackRPTimeZpos", "Track t0 with respect to R.P. (+Z);t0 [ns]", 100, -10, 10); +} + +// ------------ method fills 'descriptions' with the allowed parameters for the module ------------ + +void EtlRecoValidation::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc; + + desc.add("folder", "MTD/ETL/Reco"); + desc.add("inputTagC", edm::InputTag("mtdClusters", "FTLEndcap")); + desc.add("inputTagT", edm::InputTag("trackExtenderWithMTD", "")); + desc.add("hitMinimumEnergy", 1.); // [MeV] + desc.add("trackMinimumEnergy", 0.5); // [GeV] + desc.add("trackMinimumEta", 1.4); + desc.add("trackMaximumEta", 3.2); + + descriptions.add("etlReco", desc); +} + +DEFINE_FWK_MODULE(EtlRecoValidation);