diff --git a/InnerDetector/InDetConditions/SiLorentzAngleSvc/SiLorentzAngleSvc/SiLorentzAngleSvc.h b/InnerDetector/InDetConditions/SiLorentzAngleSvc/SiLorentzAngleSvc/SiLorentzAngleSvc.h index a30c4b1d19ac9fc716b2d86b1f579479d12d6260..8b8fbbd8b2b0ddab67a90924cf2b83c1dc743ae7 100644 --- a/InnerDetector/InDetConditions/SiLorentzAngleSvc/SiLorentzAngleSvc/SiLorentzAngleSvc.h +++ b/InnerDetector/InDetConditions/SiLorentzAngleSvc/SiLorentzAngleSvc/SiLorentzAngleSvc.h @@ -19,7 +19,7 @@ #include "AthenaBaseComps/AthService.h" #include "AthenaKernel/IOVSvcDefs.h" #include "StoreGate/DataHandle.h" -#include "SiPropertiesSvc/SiliconProperties.h" +#include "SiPropertiesSvc/ISiPropertiesSvc.h" // Amg #include "GeoPrimitives/GeoPrimitives.h" @@ -148,6 +148,7 @@ private: bool m_isPixel; InDet::SiliconProperties m_siProperties; + ServiceHandle<ISiPropertiesSvc> m_siPropertiesSvc; const InDetDD::SiDetectorManager * m_detManager; std::vector<double> m_lorentzShift; diff --git a/InnerDetector/InDetConditions/SiLorentzAngleSvc/python/LorentzAngleSvcSetup.py b/InnerDetector/InDetConditions/SiLorentzAngleSvc/python/LorentzAngleSvcSetup.py index 3f85d0bdf36427e022e1b5988701817611100e7f..7407210af49215db5ba1409906e32a2f50db0ac0 100644 --- a/InnerDetector/InDetConditions/SiLorentzAngleSvc/python/LorentzAngleSvcSetup.py +++ b/InnerDetector/InDetConditions/SiLorentzAngleSvc/python/LorentzAngleSvcSetup.py @@ -48,16 +48,19 @@ class LorentzAngleSvcSetup: from AthenaCommon.DetFlags import DetFlags + from SiPropertiesSvc.SiPropertiesSvcConf import SiPropertiesSvc + ## ## Pixel ## if ( DetFlags.detdescr.pixel_on() ): from PixelLorentzAngleSvcSetup import pixelLorentzAngleSvcSetup - self.pixel = pixelLorentzAngleSvcSetup.PixelLorentzAngleSvc self.pixelSiliconConditionsSvc = pixelLorentzAngleSvcSetup.PixelSiliconConditionsSvc self.PixelSiliconConditionsSvc = pixelLorentzAngleSvcSetup.PixelSiliconConditionsSvc + self.pixelSiPropertiesSvc = pixelLorentzAngleSvcSetup.PixelSiPropertiesSvc + self.PixelSiPropertiesSvc = pixelLorentzAngleSvcSetup.PixelSiPropertiesSvc ## ## SCT @@ -69,6 +72,8 @@ class LorentzAngleSvcSetup: self.sct = sctLorentzAngleSvcSetup.SCTLorentzAngleSvc self.sctSiliconConditionsSvc = sctLorentzAngleSvcSetup.SCT_SiliconConditionsSvc self.SCT_SiliconConditionsSvc = sctLorentzAngleSvcSetup.SCT_SiliconConditionsSvc + self.sctSiPropertiesSvc = sctLorentzAngleSvcSetup.SCT_SiPropertiesSvc + self.SCT_SiPropertiesSvc = sctLorentzAngleSvcSetup.SCT_SiPropertiesSvc # Force the Lorentz angle sercive to use SiliconConditions service (which are assumed to use the DB) # Default is to decide based on GeoModel. diff --git a/InnerDetector/InDetConditions/SiLorentzAngleSvc/python/PixelLorentzAngleSvcSetup.py b/InnerDetector/InDetConditions/SiLorentzAngleSvc/python/PixelLorentzAngleSvcSetup.py index de2dcbeb1b5835aa9cd3994ac2108b81bf547c5d..d263ae4affa9c410e4b91696735959ae8f76535c 100644 --- a/InnerDetector/InDetConditions/SiLorentzAngleSvc/python/PixelLorentzAngleSvcSetup.py +++ b/InnerDetector/InDetConditions/SiLorentzAngleSvc/python/PixelLorentzAngleSvcSetup.py @@ -40,9 +40,8 @@ class PixelLorentzAngleSvcSetup: if hasattr(svcMgr,'PixelLorentzAngleSvc'): pixelLorentzAngleSvc = svcMgr.PixelLorentzAngleSvc else : - pixelLorentzAngleSvc = SiLorentzAngleSvc(name="PixelLorentzAngleSvc", - DetectorName="Pixel") - svcMgr+=pixelLorentzAngleSvc + pixelLorentzAngleSvc = SiLorentzAngleSvc(name="PixelLorentzAngleSvc",DetectorName="Pixel") + svcMgr+=pixelLorentzAngleSvc # Init PixelSiliconConditionsSvc if hasattr(svcMgr,'PixelSiliconConditionsSvc'): @@ -54,11 +53,16 @@ class PixelLorentzAngleSvcSetup: pixelSiliconConditionsSvc.DepletionVoltage=10.0 + from SiPropertiesSvc.SiPropertiesSvcConf import SiPropertiesSvc + pixelSiPropertiesSvc=SiPropertiesSvc(name="PixelSiPropertiesSvc",DetectorName="Pixel",SiConditionsServices=pixelSiliconConditionsSvc) + svcMgr+=pixelSiPropertiesSvc + # Pass the silicon conditions services to the Lorentz angle service # Also make sure UseMagFieldTool is True as AtlasGeoModel sets this to False # if loaded first. pixelLorentzAngleSvc.UseMagFieldSvc = True pixelLorentzAngleSvc.SiConditionsServices = pixelSiliconConditionsSvc + pixelLorentzAngleSvc.SiPropertiesSvc = pixelSiPropertiesSvc #pixelLorentzAngleSvc.CorrectionFactor = 0.900 #Load Correction factor from database from IOVDbSvc.CondDB import conddb @@ -75,7 +79,10 @@ class PixelLorentzAngleSvcSetup: self.PixelLorentzAngleSvc = pixelLorentzAngleSvc self.pixelSiliconConditionsSvc = pixelSiliconConditionsSvc self.PixelSiliconConditionsSvc = pixelSiliconConditionsSvc + self.pixelSiPropertiesSvc = pixelSiPropertiesSvc + self.PixelSiPropertiesSvc = pixelSiPropertiesSvc + self.PixelSiPropertiesSvc.UseConditionsDB = True # Force the Lorentz angle sercive to use SiliconConditions service (which are assumed to use the DB) # Default is to decide based on GeoModel. diff --git a/InnerDetector/InDetConditions/SiLorentzAngleSvc/python/SCTLorentzAngleSvcSetup.py b/InnerDetector/InDetConditions/SiLorentzAngleSvc/python/SCTLorentzAngleSvcSetup.py index 7a8f67d84907a8f1955387cbdfc112565ad0baa6..1a9fbbc0e86156d624755f918702ad5744f7c96c 100644 --- a/InnerDetector/InDetConditions/SiLorentzAngleSvc/python/SCTLorentzAngleSvcSetup.py +++ b/InnerDetector/InDetConditions/SiLorentzAngleSvc/python/SCTLorentzAngleSvcSetup.py @@ -48,10 +48,8 @@ class SCTLorentzAngleSvcSetup: if hasattr(svcMgr,'SCTLorentzAngleSvc'): sctLorentzAngleSvc = svcMgr.SCTLorentzAngleSvc else : - sctLorentzAngleSvc = SiLorentzAngleSvc(name="SCTLorentzAngleSvc", - DetectorName="SCT") - svcMgr+=sctLorentzAngleSvc - + sctLorentzAngleSvc = SiLorentzAngleSvc(name="SCTLorentzAngleSvc",DetectorName="SCT") + svcMgr+=sctLorentzAngleSvc # Init PixelSiliconConditionsSvc if hasattr(svcMgr,'SCT_SiliconConditionsSvc'): @@ -61,16 +59,24 @@ class SCTLorentzAngleSvcSetup: sctSiliconConditionsSvc=SCT_SiliconConditionsSvc() svcMgr+=sctSiliconConditionsSvc + from SiPropertiesSvc.SiPropertiesSvcConf import SiPropertiesSvc + sctSiPropertiesSvc=SiPropertiesSvc(name="SCT_SiPropertiesSvc",DetectorName="SCT",SiConditionsServices=sctSiliconConditionsSvc) + svcMgr+=sctSiPropertiesSvc + # Pass the silicon conditions services to the Lorentz angle service # Also make sure UseMagFieldTool is True as AtlasGeoModel sets this to False # if loaded first. sctLorentzAngleSvc.UseMagFieldSvc = True sctLorentzAngleSvc.SiConditionsServices = sctSiliconConditionsSvc + sctLorentzAngleSvc.SiPropertiesSvc = sctSiPropertiesSvc self.SCTLorentzAngleSvc = sctLorentzAngleSvc self.sctSiliconConditionsSvc = sctSiliconConditionsSvc self.SCT_SiliconConditionsSvc = sctSiliconConditionsSvc + self.sctSiPropertiesSvc = sctSiPropertiesSvc + self.SCT_SiPropertiesSvc = sctSiPropertiesSvc + self.SCT_SiPropertiesSvc.UseConditionsDB = True # Force the Lorentz angle sercive to use SiliconConditions service (which are assumed to use the DB) # Default is to decide based on GeoModel. diff --git a/InnerDetector/InDetConditions/SiLorentzAngleSvc/src/SiLorentzAngleSvc.cxx b/InnerDetector/InDetConditions/SiLorentzAngleSvc/src/SiLorentzAngleSvc.cxx index b0765bc1eefd24f75b0164b3c61271168210005d..c52362a86e88605931e986a0ca446799a39f3a35 100644 --- a/InnerDetector/InDetConditions/SiLorentzAngleSvc/src/SiLorentzAngleSvc.cxx +++ b/InnerDetector/InDetConditions/SiLorentzAngleSvc/src/SiLorentzAngleSvc.cxx @@ -25,6 +25,7 @@ SiLorentzAngleSvc::SiLorentzAngleSvc( const std::string& name, ISvcLocator* pSvc AthService(name, pSvcLocator), m_pixelDefaults(false), m_sctDefaults(false), + m_siPropertiesSvc("SiPropertiesSvc",name), m_siConditionsSvc("PixelSiliconConditionsSvc", name), m_magFieldSvc("AtlasFieldSvc", name), m_detStore("StoreGateSvc/DetectorStore", name), @@ -37,6 +38,7 @@ SiLorentzAngleSvc::SiLorentzAngleSvc( const std::string& name, ISvcLocator* pSvc m_bfieldFolders.push_back("/GLOBAL/BField/Map"); m_bfieldFolders.push_back("/EXT/DCS/MAGNETS/SENSORDATA"); + declareProperty("SiPropertiesSvc",m_siPropertiesSvc,"SiPropertiesSvc"); declareProperty("SiConditionsServices", m_siConditionsSvc); declareProperty("DetectorName", m_detectorName="Pixel", "Detector name (Pixel or SCT)"); // Temperature and voltages from job options only used if SiConditionsServices is None or @@ -72,6 +74,8 @@ StatusCode SiLorentzAngleSvc::initialize() { ATH_MSG_INFO( "SiLorentzAngleSvc Initialized" ); + CHECK(m_siPropertiesSvc.retrieve()); + // Detector store CHECK(m_detStore.retrieve()); @@ -430,9 +434,19 @@ void SiLorentzAngleSvc::updateCache(const IdentifierHash & elementHash, const Am double meanElectricField = 0; if (depletionDepth) { meanElectricField = biasVoltage / depletionDepth; } - double mobility = 0; - m_siProperties.setConditions(temperature, meanElectricField); - mobility = m_siProperties.signedHallMobility(element->carrierType()); + const InDet::SiliconProperties &siProperties = m_siPropertiesSvc->getSiProperties(elementHash); + double mobility = siProperties.signedHallMobility(element->carrierType()); + + // should be removed in rel.22 + if (m_sctDefaults && !m_isPixel) { + m_siProperties.setConditions(temperature, meanElectricField); + mobility = m_siProperties.signedHallMobility(element->carrierType()); + } + if (m_pixelDefaults && m_isPixel) { + m_siProperties.setConditions(temperature, meanElectricField); + mobility = m_siProperties.signedHallMobility(element->carrierType()); + } + // Get magnetic field. This first checks that field cache is valid. const Amg::Vector3D& magneticField = getMagneticField(elementHash, locPos, useLocPos); diff --git a/InnerDetector/InDetConditions/SiPropertiesSvc/SiPropertiesSvc/SiPropertiesSvc.h b/InnerDetector/InDetConditions/SiPropertiesSvc/SiPropertiesSvc/SiPropertiesSvc.h index 69efba3586a6d943bf206706393a7e7668458182..cb26af739ae750c6a26e9e92a6e0bc7dc2326d7c 100644 --- a/InnerDetector/InDetConditions/SiPropertiesSvc/SiPropertiesSvc/SiPropertiesSvc.h +++ b/InnerDetector/InDetConditions/SiPropertiesSvc/SiPropertiesSvc/SiPropertiesSvc.h @@ -66,6 +66,8 @@ private: // Properties double m_temperatureMin; double m_temperatureMax; + double m_electronSaturationVelocity; + double m_holeSaturationVelocity; std::string m_detectorName; ServiceHandle<ISiliconConditionsSvc> m_siConditionsSvc; ServiceHandle<StoreGateSvc> m_detStore; diff --git a/InnerDetector/InDetConditions/SiPropertiesSvc/SiPropertiesSvc/SiliconProperties.h b/InnerDetector/InDetConditions/SiPropertiesSvc/SiPropertiesSvc/SiliconProperties.h index 8417aa06c98d237277f123c66707bc7f82e4b793..e9a4901ed06e6be06feb8dbbe658ed809abc6e5c 100755 --- a/InnerDetector/InDetConditions/SiPropertiesSvc/SiPropertiesSvc/SiliconProperties.h +++ b/InnerDetector/InDetConditions/SiPropertiesSvc/SiPropertiesSvc/SiliconProperties.h @@ -36,6 +36,8 @@ public: double holeHallMobility() const; double electronDiffusionConstant() const; double holeDiffusionConstant() const; + double electronSaturationVelocity() const; + double holeSaturationVelocity() const; double electronHolePairsPerEnergy() const; @@ -66,6 +68,8 @@ public: void setHoleHallMobility(double mobility); void setElectronDiffusionConstant(double diffusionConstant); void setHoleDiffusionConstant(double diffusionConstant); + void setElectronSaturationVelocity(double electronSaturationVelocity); + void setHoleSaturationVelocity(double holeSaturationVelocity); void setElectronHolePairsPerEnergy(double ehPairsPerEnergy); private: @@ -75,6 +79,8 @@ private: double m_holeHallMobility; double m_electronDiffusionConstant; double m_holeDiffusionConstant; + double m_electronSaturationVelocity; + double m_holeSaturationVelocity; double m_ehPairsPerEnergy; bool m_override; // signal that quantities are overriden and recalculation are disabled. diff --git a/InnerDetector/InDetConditions/SiPropertiesSvc/src/SiPropertiesSvc.cxx b/InnerDetector/InDetConditions/SiPropertiesSvc/src/SiPropertiesSvc.cxx index 42d813129512a9be6bfe37969c4e50a0d7c9a1f7..8a53b7451f16eeef08b9d0f08f68c7c24455cb64 100644 --- a/InnerDetector/InDetConditions/SiPropertiesSvc/src/SiPropertiesSvc.cxx +++ b/InnerDetector/InDetConditions/SiPropertiesSvc/src/SiPropertiesSvc.cxx @@ -21,8 +21,10 @@ const double DEFAULTTEMPERATURE = -7; // Degree C const double DEFAULTDEPLVOLTAGE = 70; // Volt const double DEFAULTBIASVOLTAGE = 150; // Volt -SiPropertiesSvc::SiPropertiesSvc( const std::string& name, ISvcLocator* pSvcLocator ) : +SiPropertiesSvc::SiPropertiesSvc( const std::string& name, ISvcLocator* pSvcLocator ): AthService(name, pSvcLocator), + m_electronSaturationVelocity(1.53e9), + m_holeSaturationVelocity(1.62e8), m_siConditionsSvc("PixelSiliconConditionsSvc", name), m_detStore("StoreGateSvc/DetectorStore", name), m_conditionsSvcValid(false), @@ -30,69 +32,42 @@ SiPropertiesSvc::SiPropertiesSvc( const std::string& name, ISvcLocator* pSvcLoca { declareProperty("TemperatureMin",m_temperatureMin = -80., "Minimum temperature allowed in Celcius."); declareProperty("TemperatureMax",m_temperatureMax = 100., "Maximum temperature allowed in Celcius."); + declareProperty("ElectronSaturationVelocity", m_electronSaturationVelocity = 1.53e9, "Electron Saturation Velocity [cm/s]"); + declareProperty("HoleSaturationVelocity", m_holeSaturationVelocity = 1.62e8, "Hole Saturation Velocity [cm/s]"); declareProperty("SiConditionsServices", m_siConditionsSvc); declareProperty("DetectorName", m_detectorName="Pixel"); + declareProperty("UseConditionsDB", m_conditionsSvcValid=true); } SiPropertiesSvc::~SiPropertiesSvc() {} -StatusCode -SiPropertiesSvc::initialize() -{ - msg(MSG::INFO) << "SiPropertiesSvc Initialized" << endreq; - - StatusCode sc = AthService::initialize(); - if (sc.isFailure()) { - msg(MSG::FATAL) << "Unable to initialize the service!" << endreq; - return sc; - } - - if (m_detectorName != "Pixel" && m_detectorName != "SCT") { - msg(MSG::FATAL) << "Invalid detector name: " << m_detectorName << ". Must be Pixel or SCT." << endreq; +StatusCode SiPropertiesSvc::initialize() { + ATH_MSG_INFO("SiPropertiesSvc Initialized"); + + CHECK(AthService::initialize()); + + if (m_detectorName!="Pixel" && m_detectorName!="SCT") { + ATH_MSG_FATAL("Invalid detector name: " << m_detectorName << ". Must be Pixel or SCT."); return StatusCode::FAILURE; } // Get conditions summary service. - m_conditionsSvcValid = false; - sc = m_siConditionsSvc.retrieve(); - if (sc.isFailure()) { - msg(MSG::FATAL) << "Unable to to retrieve Conditions Summary Service" << endreq; - return StatusCode::FAILURE; - } else { - msg(MSG::INFO) << "SiPropertiesSvc successfully loaded Conditions Summary Service." << endreq; - m_conditionsSvcValid = true; + if (m_conditionsSvcValid) { + CHECK(m_siConditionsSvc.retrieve()); } - + // Detector store - sc = m_detStore.retrieve(); - if (sc.isFailure()) { - msg(MSG::FATAL) << "DetectorStore service not found !" << endreq; - return StatusCode::FAILURE; - } + CHECK(m_detStore.retrieve()); // Get the detector manager - m_detStore->retrieve(m_detManager, m_detectorName); - if (sc.isFailure()) { - msg(MSG::FATAL) << "Could not find the detector manager: " << m_detectorName << " !" << endreq; - return StatusCode::FAILURE; - } - - if (m_conditionsSvcValid) { - if (m_siConditionsSvc->hasCallBack()) { - //Register callback. To be triggered after SiConditionsSvc's callback, - msg(MSG::INFO) << "Registering callback." << endreq; - sc = m_detStore->regFcn(&ISiliconConditionsSvc::callBack, &*m_siConditionsSvc, - &ISiPropertiesSvc::callBack, dynamic_cast<ISiPropertiesSvc *>(this), - true); - if (sc.isFailure()) { - msg(MSG::ERROR) << "Could not register callback." << endreq; - return sc; - } - } else { - msg(MSG::DEBUG) << "Conditions Summary Service has no callback." << endreq; - } + CHECK(m_detStore->retrieve(m_detManager,m_detectorName)); + + //Register callback. To be triggered after SiConditionsSvc's callback, + if (m_siConditionsSvc->hasCallBack()) { + ATH_MSG_INFO("Registering callback."); + CHECK(m_detStore->regFcn(&ISiliconConditionsSvc::callBack,&*m_siConditionsSvc,&ISiPropertiesSvc::callBack,dynamic_cast<ISiPropertiesSvc *>(this),true)); } bool isPixel = (m_detectorName == "Pixel"); @@ -102,18 +77,13 @@ SiPropertiesSvc::initialize() if (isPixel) { // Pixel const PixelID * idHelper; - if (m_detStore->retrieve(idHelper, "PixelID").isFailure()) { - msg(MSG::FATAL) << "Could not get Pixel ID helper" << endreq; - return StatusCode::FAILURE; - } + CHECK(m_detStore->retrieve(idHelper,"PixelID")); maxHash = idHelper->wafer_hash_max(); - } else { + } + else { // SCT const SCT_ID * idHelper; - if (m_detStore->retrieve(idHelper, "SCT_ID").isFailure()) { - msg(MSG::FATAL) << "Could not get SCT ID helper" << endreq; - return StatusCode::FAILURE; - } + CHECK(m_detStore->retrieve(idHelper,"SCT_ID")); maxHash = idHelper->wafer_hash_max(); } @@ -123,41 +93,13 @@ SiPropertiesSvc::initialize() //m_outOfRangeWarning.resize(maxHash); // initialized to false return StatusCode::SUCCESS; - } -StatusCode -SiPropertiesSvc::finalize() -{ - // Count number of modules that produced out of range errors. - //int count = std::count(m_outOfRangeWarning.begin(),m_outOfRangeWarning.end(),true); - - //if (count > 0) { - //if (count > m_outOfRangeWarningThresh) { - //if (count == 1) { - //if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "There was 1 detector element returning an invalid temperature. Temperature was set to " - // << m_temperature << " C for this detector element." << endreq; - //} else { - //if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "There were " << count - // << " detector elements returning an invalid temperature. Temperature was set to " - // << m_temperature << " C for these detector elements." << endreq; - //} - //} else { - //if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Number of detector elements returning invalid temperature: " << count << endreq; - //} - //} - +StatusCode SiPropertiesSvc::finalize() { return StatusCode::SUCCESS; } -// Query the interfaces. -// Input: riid, Requested interface ID -// ppvInterface, Pointer to requested interface -// Return: StatusCode indicating SUCCESS or FAILURE. -// N.B. Don't forget to release the interface after use!!! -StatusCode -SiPropertiesSvc::queryInterface(const InterfaceID& riid, void** ppvInterface) -{ +StatusCode SiPropertiesSvc::queryInterface(const InterfaceID& riid, void** ppvInterface) { if ( ISiPropertiesSvc::interfaceID().versionMatch(riid) ) { *ppvInterface = dynamic_cast<ISiPropertiesSvc *>(this); } else { @@ -169,26 +111,21 @@ SiPropertiesSvc::queryInterface(const InterfaceID& riid, void** ppvInterface) } -StatusCode -SiPropertiesSvc::callBack(IOVSVC_CALLBACK_ARGS) -{ - if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Callback called." << endreq; +StatusCode SiPropertiesSvc::callBack(IOVSVC_CALLBACK_ARGS) { + if (msgLvl(MSG::DEBUG)) { + ATH_MSG_DEBUG("Callback called."); + } invalidateCache(); return StatusCode::SUCCESS; } -const InDet::SiliconProperties & -SiPropertiesSvc::getSiProperties(const IdentifierHash & elementHash){ +const InDet::SiliconProperties & SiPropertiesSvc::getSiProperties(const IdentifierHash & elementHash) { if (!valid(elementHash)) updateCache(elementHash); return m_propertiesCache[elementHash]; } -void -SiPropertiesSvc::updateCache(const IdentifierHash & elementHash) -{ - +void SiPropertiesSvc::updateCache(const IdentifierHash & elementHash) { const InDetDD::SiDetectorElement * element = m_detManager->getDetectorElement(elementHash); - double temperature; double deplVoltage; double biasVoltage; @@ -208,19 +145,14 @@ SiPropertiesSvc::updateCache(const IdentifierHash & elementHash) //if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Invalid temperature: " << temperatureC << " C. " // << "Setting to " << DEFAULTTEMPERATURE << " C." // << endreq; - // temperature = m_temperature + 273.15; - - if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Invalid temperature: " - << temperatureC << " C. " - << "Setting to " << DEFAULTTEMPERATURE << " C. " - << "Detector element hash: " << elementHash - << endreq; - + // temperature = m_temperature + 273.15; + if (msgLvl(MSG::DEBUG)) { + ATH_MSG_DEBUG("Invalid temperature: " << temperatureC << " C. " << "Setting to " << DEFAULTTEMPERATURE << " C. " << "Detector element hash: " << elementHash); + } temperature = DEFAULTTEMPERATURE + 273.15; } - // Calculate depletion depth. If biasVoltage is less than depletionVoltage // the detector is not fully depleted and we need to take this into account. // We take absolute values just in case voltages are signed . @@ -232,37 +164,33 @@ SiPropertiesSvc::updateCache(const IdentifierHash & elementHash) double meanElectricField = 0; if (depletionDepth) meanElectricField = biasVoltage / depletionDepth; + // Change saturation velocity + m_propertiesCache[elementHash].setElectronSaturationVelocity(m_electronSaturationVelocity*CLHEP::cm/CLHEP::s); + m_propertiesCache[elementHash].setHoleSaturationVelocity(m_holeSaturationVelocity*CLHEP::cm/CLHEP::s); + m_propertiesCache[elementHash].setConditions(temperature, meanElectricField); m_cacheValid[elementHash] = true; - if (msgLvl(MSG::VERBOSE)) { - msg(MSG::VERBOSE) << "Temperature (C), bias voltage, depletion voltage: " - << temperature - 273.15 << ", " - << biasVoltage/CLHEP::volt << ", " - << deplVoltage/CLHEP::volt << endreq; + ATH_MSG_VERBOSE("Temperature (C), bias voltage, depletion voltage: " << temperature - 273.15 << ", " << biasVoltage/CLHEP::volt << ", " << deplVoltage/CLHEP::volt); double hallMobility = m_propertiesCache[elementHash].signedHallMobility(element->carrierType()); double driftMobility = m_propertiesCache[elementHash].driftMobility(element->carrierType()); double ehPairsPerEnergy = m_propertiesCache[elementHash].electronHolePairsPerEnergy(); double diffConst = m_propertiesCache[elementHash].diffusionConstant(element->carrierType()); - msg(MSG::VERBOSE) << "Signed Mobility (cm2/V/s): " << hallMobility/(CLHEP::cm2/CLHEP::volt/CLHEP::s) << endreq; - msg(MSG::VERBOSE) << "Drift Mobility (cm2/V/s): " << driftMobility/(CLHEP::cm2/CLHEP::volt/CLHEP::s) << endreq; - msg(MSG::VERBOSE) << "eh pairs per eV: " << ehPairsPerEnergy/(1./CLHEP::eV) << endreq; - msg(MSG::VERBOSE) << "Diffusion constant (cm2/s): " << diffConst/(CLHEP::cm2/CLHEP::s) << endreq; + ATH_MSG_VERBOSE("Signed Mobility (cm2/V/s): " << hallMobility/(CLHEP::cm2/CLHEP::volt/CLHEP::s)); + ATH_MSG_VERBOSE("Drift Mobility (cm2/V/s): " << driftMobility/(CLHEP::cm2/CLHEP::volt/CLHEP::s)); + ATH_MSG_VERBOSE("eh pairs per eV: " << ehPairsPerEnergy/(1./CLHEP::eV)); + ATH_MSG_VERBOSE("Diffusion constant (cm2/s): " << diffConst/(CLHEP::cm2/CLHEP::s)); } - } -void -SiPropertiesSvc::invalidateCache() -{ +void SiPropertiesSvc::invalidateCache() { // Invalidate all caches. std::fill(m_cacheValid.begin(), m_cacheValid.end(), false); } -bool -SiPropertiesSvc::valid(const IdentifierHash & elementHash){ +bool SiPropertiesSvc::valid(const IdentifierHash & elementHash) { //if (msgLvl(MSG::VERBOSE) msg(MSG::VERBOSE) << "Cache valid = " << m_cacheValid[elementHash] << endreq; return m_cacheValid[elementHash]; } diff --git a/InnerDetector/InDetConditions/SiPropertiesSvc/src/SiliconProperties.cxx b/InnerDetector/InDetConditions/SiPropertiesSvc/src/SiliconProperties.cxx index 5527fd40f911e09c1be8d3d833a7cf147b7bd2b8..242d049cec93debac8f7527f48ad3fcd2df67bbf 100755 --- a/InnerDetector/InDetConditions/SiPropertiesSvc/src/SiliconProperties.cxx +++ b/InnerDetector/InDetConditions/SiPropertiesSvc/src/SiliconProperties.cxx @@ -6,6 +6,7 @@ #include "CLHEP/Units/PhysicalConstants.h" #include <cmath> +#include <iostream> namespace InDet { @@ -39,8 +40,6 @@ const double holeBeta_exp = 0.17; const double temperatureZero = 273.15 * CLHEP::kelvin; - - SiliconProperties::SiliconProperties() : m_electronDriftMobility(0), m_holeDriftMobility(0), @@ -48,11 +47,12 @@ SiliconProperties::SiliconProperties() m_holeHallMobility(0), m_electronDiffusionConstant(0), m_holeDiffusionConstant(0), + m_electronSaturationVelocity(0), + m_holeSaturationVelocity(0), m_ehPairsPerEnergy(s_ehPairsPerEnergyDefault), m_override(false) {} - SiliconProperties::SiliconProperties(double temperature, double electricField) : m_electronDriftMobility(0), m_holeDriftMobility(0), @@ -60,15 +60,19 @@ SiliconProperties::SiliconProperties(double temperature, double electricField) m_holeHallMobility(0), m_electronDiffusionConstant(0), m_holeDiffusionConstant(0), + m_electronSaturationVelocity(0), + m_holeSaturationVelocity(0), m_ehPairsPerEnergy(s_ehPairsPerEnergyDefault), m_override(false) { setConditions(temperature, electricField); } -void -SiliconProperties::setConditions(double temperature, double electricField) -{ +void SiliconProperties::setConditions(double temperature, double electricField) { + + if (m_electronSaturationVelocity==0.0) { m_electronSaturationVelocity=elecV_sat_0; } + if (m_holeSaturationVelocity==0.0) { m_holeSaturationVelocity=holeV_sat_0; } + if (!m_override) { m_electronDriftMobility = calcElectronDriftMobility(temperature, electricField); m_holeDriftMobility = calcHoleDriftMobility(temperature, electricField); @@ -79,9 +83,7 @@ SiliconProperties::setConditions(double temperature, double electricField) } } -double -SiliconProperties::driftMobility(CarrierType carrierType) const -{ +double SiliconProperties::driftMobility(CarrierType carrierType) const { if (carrierType == holes) { return holeDriftMobility(); } else { @@ -89,9 +91,7 @@ SiliconProperties::driftMobility(CarrierType carrierType) const } } -double -SiliconProperties::hallMobility(CarrierType carrierType) const -{ +double SiliconProperties::hallMobility(CarrierType carrierType) const { if (carrierType == holes) { return holeHallMobility(); } else { @@ -99,9 +99,7 @@ SiliconProperties::hallMobility(CarrierType carrierType) const } } -double -SiliconProperties::diffusionConstant(CarrierType carrierType) const -{ +double SiliconProperties::diffusionConstant(CarrierType carrierType) const { if (carrierType == holes) { return holeDiffusionConstant(); } else { @@ -109,15 +107,11 @@ SiliconProperties::diffusionConstant(CarrierType carrierType) const } } -double -SiliconProperties::charge(CarrierType carrierType) const -{ +double SiliconProperties::charge(CarrierType carrierType) const { return (carrierType == holes) ? +1 : -1; } -double -SiliconProperties::signedHallMobility(CarrierType carrierType) const -{ +double SiliconProperties::signedHallMobility(CarrierType carrierType) const { if (carrierType == holes) { return holeHallMobility(); } else { @@ -126,151 +120,125 @@ SiliconProperties::signedHallMobility(CarrierType carrierType) const } -double -SiliconProperties::calcElectronHallFactor(double temperature) const -{ +double SiliconProperties::calcElectronHallFactor(double temperature) const { // Equation from ATL-INDET-2001-004 return elecHallFactZero + elecHallFact_drdt * (temperature - temperatureZero); } -double -SiliconProperties::calcHoleHallFactor(double temperature) const -{ +double SiliconProperties::calcHoleHallFactor(double temperature) const { // Equation from ATL-INDET-2001-004 return holeHallFactZero + holeHallFact_drdt * (temperature - temperatureZero); } // driftMobility -double -SiliconProperties::calcDriftMobility(double electricField, double electricField_critical, - double saturationVelocity, double beta) const -{ +double SiliconProperties::calcDriftMobility(double electricField, double electricField_critical, double saturationVelocity, double beta) const { // Equation from ATL-INDET-2001-004 return saturationVelocity / electricField_critical / pow(std::abs(1. + pow(std::abs(electricField/electricField_critical), beta)), 1./beta); } -double -SiliconProperties::calcElectronDriftMobility(double temperature, double electricField) const -{ +double SiliconProperties::calcElectronDriftMobility(double temperature, double electricField) const { // Equations from ATL-INDET-2001-004 - double saturationVelocity = elecV_sat_0 * pow(temperature, elecV_sat_exp); +// double saturationVelocity = elecV_sat_0 * pow(temperature, elecV_sat_exp); + double saturationVelocity = m_electronSaturationVelocity*pow(temperature, elecV_sat_exp); double electricField_critical = elecE_crit_0 * pow(temperature, elecE_crit_exp); double beta = elecBeta_0 * pow(temperature, elecBeta_exp); - return calcDriftMobility(electricField, electricField_critical, saturationVelocity, beta); } -double -SiliconProperties::calcHoleDriftMobility(double temperature, double electricField) const -{ +double SiliconProperties::calcHoleDriftMobility(double temperature, double electricField) const { // Equations from ATL-INDET-2001-004 - double saturationVelocity = holeV_sat_0 * pow(temperature, holeV_sat_exp); +// double saturationVelocity = holeV_sat_0 * pow(temperature, holeV_sat_exp); + double saturationVelocity = m_holeSaturationVelocity*pow(temperature, holeV_sat_exp); double electricField_critical = holeE_crit_0 * pow(temperature, holeE_crit_exp); double beta = holeBeta_0 * pow(temperature, holeBeta_exp); - return calcDriftMobility(electricField, electricField_critical, saturationVelocity, beta); } -double -SiliconProperties::calcDiffusionConstant(double temperature, double mobility) const -{ +double SiliconProperties::calcDiffusionConstant(double temperature, double mobility) const { // Einstein's relationship (in many text books) return -CLHEP::k_Boltzmann * temperature / CLHEP::electron_charge * mobility; // CLHEP::k_Boltzmann and CLHEP::electron_charge - // are defined in CLHEP/PhysicalConstants.h } -double -SiliconProperties::electronDriftMobility() const -{ +double SiliconProperties::electronDriftMobility() const { return m_electronDriftMobility; } -double -SiliconProperties::holeDriftMobility() const -{ +double SiliconProperties::holeDriftMobility() const { return m_holeDriftMobility; } -double -SiliconProperties::electronHallMobility() const -{ +double SiliconProperties::electronHallMobility() const { return m_electronHallMobility; } -double -SiliconProperties::holeHallMobility() const -{ +double SiliconProperties::holeHallMobility() const { return m_holeHallMobility; } -double -SiliconProperties::electronDiffusionConstant() const -{ +double SiliconProperties::electronDiffusionConstant() const { return m_electronDiffusionConstant; } -double -SiliconProperties::holeDiffusionConstant() const -{ +double SiliconProperties::holeDiffusionConstant() const { return m_holeDiffusionConstant; } -void -SiliconProperties::setElectronDriftMobility(double mobility) -{ +double SiliconProperties::electronSaturationVelocity() const { + return m_electronSaturationVelocity; +} + +double SiliconProperties::holeSaturationVelocity() const { + return m_holeSaturationVelocity; +} + +void SiliconProperties::setElectronDriftMobility(double mobility) { m_override = true; m_electronDriftMobility = mobility; } - -void -SiliconProperties::setHoleDriftMobility(double mobility) -{ +void SiliconProperties::setHoleDriftMobility(double mobility) { m_override = true; m_holeDriftMobility = mobility; } -void -SiliconProperties::setElectronHallMobility(double mobility) -{ +void SiliconProperties::setElectronHallMobility(double mobility) { m_override = true; m_electronHallMobility = mobility; } -void -SiliconProperties::setHoleHallMobility(double mobility) -{ +void SiliconProperties::setHoleHallMobility(double mobility) { m_override = true; m_holeHallMobility = mobility; } - -void -SiliconProperties::setElectronDiffusionConstant(double diffusionConstant) -{ +void SiliconProperties::setElectronDiffusionConstant(double diffusionConstant) { m_override = true; m_electronDiffusionConstant = diffusionConstant; } -void -SiliconProperties::setHoleDiffusionConstant(double diffusionConstant) -{ +void SiliconProperties::setHoleDiffusionConstant(double diffusionConstant) { m_override = true; m_holeDiffusionConstant = diffusionConstant; } -void -SiliconProperties::setElectronHolePairsPerEnergy(double ehPairsPerEnergy) -{ - m_ehPairsPerEnergy = ehPairsPerEnergy; +void SiliconProperties::setElectronSaturationVelocity(double electronSaturationVelocity) { + m_electronSaturationVelocity = electronSaturationVelocity; } +void SiliconProperties::setHoleSaturationVelocity(double holeSaturationVelocity) { + m_holeSaturationVelocity = holeSaturationVelocity; +} -double SiliconProperties::electronHolePairsPerEnergy() const -{ +void SiliconProperties::setElectronHolePairsPerEnergy(double ehPairsPerEnergy) { + m_ehPairsPerEnergy = ehPairsPerEnergy; +} + +double SiliconProperties::electronHolePairsPerEnergy() const { return m_ehPairsPerEnergy; } + + } // namespace InDetDD