diff --git a/SimTracker/SiPhase2Digitizer/plugins/Phase2TrackerDigitizerAlgorithm.cc b/SimTracker/SiPhase2Digitizer/plugins/Phase2TrackerDigitizerAlgorithm.cc index 879acb7a07fa5..6eb02306ee240 100644 --- a/SimTracker/SiPhase2Digitizer/plugins/Phase2TrackerDigitizerAlgorithm.cc +++ b/SimTracker/SiPhase2Digitizer/plugins/Phase2TrackerDigitizerAlgorithm.cc @@ -72,7 +72,7 @@ Phase2TrackerDigitizerAlgorithm::Phase2TrackerDigitizerAlgorithm(const edm::Para GeVperElectron(3.61E-09), // 1 electron(3.61eV, 1keV(277e, mod 9/06 d.k. alpha2Order(conf_specific.getParameter("Alpha2Order")), // switch on/off of E.B effect addXtalk(conf_specific.getParameter("AddXTalk")), - interstripCoupling(conf_specific.getParameter("InterstripCoupling")), // Interstrip Coupling + interstripCoupling(conf_specific.getParameter("InterstripCoupling")), // Interstrip Coupling - Not used in PixelDigitizerAlgorithm Sigma0(conf_specific.getParameter("SigmaZero")), // Charge diffusion constant 7->3.7 SigmaCoeff(conf_specific.getParameter("SigmaCoeff")), // delta in the diffusion across the strip pitch diff --git a/SimTracker/SiPhase2Digitizer/plugins/Phase2TrackerDigitizerAlgorithm.h b/SimTracker/SiPhase2Digitizer/plugins/Phase2TrackerDigitizerAlgorithm.h index e6c91e2c8c817..80b38f604791e 100644 --- a/SimTracker/SiPhase2Digitizer/plugins/Phase2TrackerDigitizerAlgorithm.h +++ b/SimTracker/SiPhase2Digitizer/plugins/Phase2TrackerDigitizerAlgorithm.h @@ -108,7 +108,7 @@ class Phase2TrackerDigitizerAlgorithm { //-- drift const bool alpha2Order; // Switch on/off of E.B effect const bool addXtalk; - const float interstripCoupling; + const float interstripCoupling; const float Sigma0; //=0.0007 // Charge diffusion in microns for 300 micron Si const float SigmaCoeff; // delta in the diffusion across the strip pitch diff --git a/SimTracker/SiPhase2Digitizer/plugins/PixelDigitizerAlgorithm.cc b/SimTracker/SiPhase2Digitizer/plugins/PixelDigitizerAlgorithm.cc index 7b73624b1dd41..fb4cb14c258af 100644 --- a/SimTracker/SiPhase2Digitizer/plugins/PixelDigitizerAlgorithm.cc +++ b/SimTracker/SiPhase2Digitizer/plugins/PixelDigitizerAlgorithm.cc @@ -63,7 +63,11 @@ void PixelDigitizerAlgorithm::init(const edm::EventSetup& es) { PixelDigitizerAlgorithm::PixelDigitizerAlgorithm(const edm::ParameterSet& conf) : Phase2TrackerDigitizerAlgorithm(conf.getParameter("AlgorithmCommon"), - conf.getParameter("PixelDigitizerAlgorithm")) + conf.getParameter("PixelDigitizerAlgorithm")), + odd_row_interchannelCoupling_next_row(conf.getParameter("Odd_row_interchannelCoupling_next_row")), + even_row_interchannelCoupling_next_row(conf.getParameter("Even_row_interchannelCoupling_next_row")), + odd_column_interchannelCoupling_next_column(conf.getParameter("Odd_column_interchannelCoupling_next_column")), + even_column_interchannelCoupling_next_column(conf.getParameter("Even_column_interchannelCoupling_next_column")) { pixelFlag = true; LogInfo("PixelDigitizerAlgorithm") << "Algorithm constructed " @@ -129,25 +133,49 @@ void PixelDigitizerAlgorithm::add_cross_talk(const Phase2TrackerGeomDetUnit* pix signal_map_type signalNew; const Phase2TrackerTopology* topol = &pixdet->specificTopology(); int numRows = topol->nrows(); + int numColumns = topol->ncolumns(); for (auto & s : theSignal) { float signalInElectrons = s.second.ampl(); // signal in electrons std::pair hitChan; hitChan = PixelDigi::channelToPixel(s.first); - float signalInElectrons_Xtalk = signalInElectrons * interstripCoupling; - //subtract the charge which will be shared - s.second.set(signalInElectrons-signalInElectrons_Xtalk); + float signalInElectrons_odd_row_Xtalk_next_row = signalInElectrons * odd_row_interchannelCoupling_next_row; + float signalInElectrons_even_row_Xtalk_next_row = signalInElectrons * even_row_interchannelCoupling_next_row; + float signalInElectrons_odd_column_Xtalk_next_column = signalInElectrons * odd_column_interchannelCoupling_next_column; + float signalInElectrons_even_column_Xtalk_next_column = signalInElectrons * even_column_interchannelCoupling_next_column; - if (hitChan.first != 0) { + //subtract the charge which will be shared + s.second.set(signalInElectrons-signalInElectrons_odd_row_Xtalk_next_row-signalInElectrons_even_row_Xtalk_next_row-signalInElectrons_odd_column_Xtalk_next_column-signalInElectrons_even_column_Xtalk_next_column); + + if (hitChan.first != 0) { std::pair XtalkPrev = std::pair(hitChan.first-1, hitChan.second); - int chanXtalkPrev = PixelDigi::pixelToChannel(XtalkPrev.first, XtalkPrev.second); - signalNew.insert(std::pair(chanXtalkPrev, DigitizerUtility::Amplitude(signalInElectrons_Xtalk, nullptr, -1.0))); + int chanXtalkPrev = (pixelFlag) ? PixelDigi::pixelToChannel(XtalkPrev.first, XtalkPrev.second) + : Phase2TrackerDigi::pixelToChannel(XtalkPrev.first, XtalkPrev.second); + if (hitChan.first % 2 == 1) signalNew.insert(std::pair(chanXtalkPrev, DigitizerUtility::Amplitude(signalInElectrons_even_row_Xtalk_next_row, nullptr, -1.0))); + else signalNew.insert(std::pair(chanXtalkPrev, DigitizerUtility::Amplitude(signalInElectrons_odd_row_Xtalk_next_row, nullptr, -1.0))); } if (hitChan.first < (numRows-1)) { std::pair XtalkNext = std::pair(hitChan.first+1, hitChan.second); - int chanXtalkNext = PixelDigi::pixelToChannel(XtalkNext.first, XtalkNext.second); - signalNew.insert(std::pair(chanXtalkNext, DigitizerUtility::Amplitude(signalInElectrons_Xtalk, nullptr, -1.0))); + int chanXtalkNext = (pixelFlag) ? PixelDigi::pixelToChannel(XtalkNext.first, XtalkNext.second) + : Phase2TrackerDigi::pixelToChannel(XtalkNext.first, XtalkNext.second); + if (hitChan.first % 2 == 1) signalNew.insert(std::pair(chanXtalkNext, DigitizerUtility::Amplitude(signalInElectrons_odd_row_Xtalk_next_row, nullptr, -1.0))); + else signalNew.insert(std::pair(chanXtalkNext, DigitizerUtility::Amplitude(signalInElectrons_even_row_Xtalk_next_row, nullptr, -1.0))); + } + + if (hitChan.second != 0) { + std::pair XtalkPrev = std::pair(hitChan.first, hitChan.second-1); + int chanXtalkPrev = (pixelFlag) ? PixelDigi::pixelToChannel(XtalkPrev.first, XtalkPrev.second) + : Phase2TrackerDigi::pixelToChannel(XtalkPrev.first, XtalkPrev.second); + if (hitChan.second % 2 == 1) signalNew.insert(std::pair(chanXtalkPrev, DigitizerUtility::Amplitude(signalInElectrons_even_column_Xtalk_next_column, nullptr, -1.0))); + else signalNew.insert(std::pair(chanXtalkPrev, DigitizerUtility::Amplitude(signalInElectrons_odd_column_Xtalk_next_column, nullptr, -1.0))); + } + if (hitChan.second < (numColumns-1)) { + std::pair XtalkNext = std::pair(hitChan.first, hitChan.second+1); + int chanXtalkNext = (pixelFlag) ? PixelDigi::pixelToChannel(XtalkNext.first, XtalkNext.second) + : Phase2TrackerDigi::pixelToChannel(XtalkNext.first, XtalkNext.second); + if (hitChan.second % 2 == 1) signalNew.insert(std::pair(chanXtalkNext, DigitizerUtility::Amplitude(signalInElectrons_odd_column_Xtalk_next_column, nullptr, -1.0))); + else signalNew.insert(std::pair(chanXtalkNext, DigitizerUtility::Amplitude(signalInElectrons_even_column_Xtalk_next_column, nullptr, -1.0))); } } for (auto const & l : signalNew) { @@ -161,3 +189,4 @@ void PixelDigitizerAlgorithm::add_cross_talk(const Phase2TrackerGeomDetUnit* pix } } + diff --git a/SimTracker/SiPhase2Digitizer/plugins/PixelDigitizerAlgorithm.h b/SimTracker/SiPhase2Digitizer/plugins/PixelDigitizerAlgorithm.h index 7879fca742508..8141d62a32c12 100644 --- a/SimTracker/SiPhase2Digitizer/plugins/PixelDigitizerAlgorithm.h +++ b/SimTracker/SiPhase2Digitizer/plugins/PixelDigitizerAlgorithm.h @@ -23,5 +23,10 @@ class PixelDigitizerAlgorithm: public Phase2TrackerDigitizerAlgorithm { const Phase2TrackerGeomDetUnit* pixdet, const GlobalVector& bfield) override; virtual void add_cross_talk(const Phase2TrackerGeomDetUnit* pixdet) override; + // Addition four xtalk-related parameters to PixelDigitizerAlgorithm specific parameters initialized in Phase2TrackerDigitizerAlgorithm + const double odd_row_interchannelCoupling_next_row; + const double even_row_interchannelCoupling_next_row; + const double odd_column_interchannelCoupling_next_column; + const double even_column_interchannelCoupling_next_column; }; #endif diff --git a/SimTracker/SiPhase2Digitizer/python/Phase2TrackerMonitorDigi_cff.py b/SimTracker/SiPhase2Digitizer/python/Phase2TrackerMonitorDigi_cff.py index 2db6ffc235e85..8ea46d85a9e2c 100644 --- a/SimTracker/SiPhase2Digitizer/python/Phase2TrackerMonitorDigi_cff.py +++ b/SimTracker/SiPhase2Digitizer/python/Phase2TrackerMonitorDigi_cff.py @@ -13,6 +13,13 @@ Nbins = cms.int32(200), xmin = cms.double(0.0), xmax = cms.double(2000.)) +pixDigiMon.ChargeXYMapH = cms.PSet( + Nxbins = cms.int32(450), + xmin = cms.double(0.5), + xmax = cms.double(450.5), + Nybins = cms.int32(1350), + ymin = cms.double(0.5), + ymax = cms.double(1350.5)) pixDigiMon.PositionOfDigisH = cms.PSet( Nxbins = cms.int32(1350), xmin = cms.double(0.5), diff --git a/SimTracker/SiPhase2Digitizer/python/Phase2TrackerMonitorDigi_cfi.py b/SimTracker/SiPhase2Digitizer/python/Phase2TrackerMonitorDigi_cfi.py index 4db27dbbea120..abe62b6036c52 100644 --- a/SimTracker/SiPhase2Digitizer/python/Phase2TrackerMonitorDigi_cfi.py +++ b/SimTracker/SiPhase2Digitizer/python/Phase2TrackerMonitorDigi_cfi.py @@ -23,6 +23,14 @@ xmin = cms.double(-0.0001), xmax = cms.double(0.005) ), + ChargeXYMapH = cms.PSet( + Nxbins = cms.int32(450), + xmin = cms.double(0.5), + xmax = cms.double(450.5), + Nybins = cms.int32(1350), + ymin = cms.double(0.5), + ymax = cms.double(1350.5) + ), PositionOfDigisH = cms.PSet( Nxbins = cms.int32(1016), xmin = cms.double(0.5), diff --git a/SimTracker/SiPhase2Digitizer/python/phase2TrackerDigitizer_cfi.py b/SimTracker/SiPhase2Digitizer/python/phase2TrackerDigitizer_cfi.py index 629d82d5ccef0..82a49ed2b895d 100644 --- a/SimTracker/SiPhase2Digitizer/python/phase2TrackerDigitizer_cfi.py +++ b/SimTracker/SiPhase2Digitizer/python/phase2TrackerDigitizer_cfi.py @@ -19,6 +19,10 @@ ), # Specific parameters #Pixel Digitizer Algorithm + Odd_row_interchannelCoupling_next_row = cms.double(0.10), #D.B. + Even_row_interchannelCoupling_next_row = cms.double(0.01), #D.B. + Odd_column_interchannelCoupling_next_column = cms.double(0.01), #D.B. + Even_column_interchannelCoupling_next_column = cms.double(0.01), #D.B. PixelDigitizerAlgorithm = cms.PSet( ElectronPerAdc = cms.double(600.0), ReadoutNoiseInElec = cms.double(0.0), @@ -38,7 +42,7 @@ Alpha2Order = cms.bool(True), #D.B.: second order effect, does not switch off magnetic field as described AddNoise = cms.bool(False), AddXTalk = cms.bool(True), #D.B. - InterstripCoupling = cms.double(0.05), #D.B. + InterstripCoupling = cms.double(0.0), #D.B. # No need to be used in PixelDigitizerAlgorithm SigmaZero = cms.double(0.00037), #D.B.: 3.7um spread for 300um-thick sensor, renormalized in digitizerAlgo SigmaCoeff = cms.double(1.80), #D.B.: to be confirmed with simulations in CMSSW_6.X ClusterWidth = cms.double(3), #D.B.: this is used as number of sigmas for charge collection (3=+-3sigmas) diff --git a/SimTracker/SiPhase2Digitizer/test/Phase2TrackerMonitorDigi.cc b/SimTracker/SiPhase2Digitizer/test/Phase2TrackerMonitorDigi.cc index a132f9ba51fba..758df7217c9b8 100644 --- a/SimTracker/SiPhase2Digitizer/test/Phase2TrackerMonitorDigi.cc +++ b/SimTracker/SiPhase2Digitizer/test/Phase2TrackerMonitorDigi.cc @@ -145,6 +145,7 @@ void Phase2TrackerMonitorDigi::fillITPixelDigiHistos(const edm::HandleFill(col, row, adc); local_mes.PositionOfDigis->Fill(row+1, col+1); if (local_mes.ChargeOfDigis) local_mes.ChargeOfDigis->Fill(adc); if (row_last == -1 ) { @@ -425,7 +426,18 @@ void Phase2TrackerMonitorDigi::bookLayerHistos(DQMStore::IBooker & ibooker, unsi local_mes.EtaOccupancyProfP = ibooker.bookProfile(HistoName.str(), HistoName.str(), EtaParameters.getParameter("Nbins"),EtaParameters.getParameter("xmin"),EtaParameters.getParameter("xmax"), Parameters.getParameter("xmin"),Parameters.getParameter("xmax"),""); - + + Parameters = config_.getParameter("ChargeXYMapH"); + HistoName.str(""); + HistoName << "ChargeXYMap_" << fname2.str().c_str(); + local_mes.ChargeXYMap = ibooker.book2D(HistoName.str(), HistoName.str(), + Parameters.getParameter("Nxbins"), + Parameters.getParameter("xmin"), + Parameters.getParameter("xmax"), + Parameters.getParameter("Nybins"), + Parameters.getParameter("ymin"), + Parameters.getParameter("ymax")); + Parameters = config_.getParameter("PositionOfDigisH"); HistoName.str(""); HistoName << "PositionOfDigis_" << fname2.str().c_str(); diff --git a/SimTracker/SiPhase2Digitizer/test/Phase2TrackerMonitorDigi.h b/SimTracker/SiPhase2Digitizer/test/Phase2TrackerMonitorDigi.h index 979680780e9af..485daac4fab5f 100644 --- a/SimTracker/SiPhase2Digitizer/test/Phase2TrackerMonitorDigi.h +++ b/SimTracker/SiPhase2Digitizer/test/Phase2TrackerMonitorDigi.h @@ -33,6 +33,7 @@ class Phase2TrackerMonitorDigi : public DQMEDAnalyzer{ MonitorElement* NumberOfDigisPerDet; MonitorElement* DigiOccupancyP; MonitorElement* DigiOccupancyS; + MonitorElement* ChargeXYMap; MonitorElement* PositionOfDigis; MonitorElement* ChargeOfDigis; MonitorElement* ChargeOfDigisVsWidth;