diff --git a/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser01.py b/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser01.py index 675f61f5b77cea6bc6fac3c42eb01f17bfc492b8..00f4b9c37cce80a4ca7cb4c669f48d102a199fd4 100644 --- a/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser01.py +++ b/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser01.py @@ -5,7 +5,7 @@ import sys from AthenaCommon.Constants import VERBOSE, INFO from AthenaConfiguration.ComponentFactory import CompFactory -def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", **kwargs): +def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", alignmentConstants={}, **kwargs): # Initialize GeoModel from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg @@ -32,7 +32,12 @@ def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", **kwargs): PoolContainerPrefix="ConditionsContainer", TopLevelContainerName = "<type>", SubLevelBranchName= "<key>" ) - kwargs.setdefault("AlignDbTool", CompFactory.TrackerAlignDBTool("AlignDbTool", OutputTool = outputTool, OutputLevel=VERBOSE)) + + trackerAlignDBTool = CompFactory.TrackerAlignDBTool("AlignDbTool", OutputTool = outputTool, + OutputLevel=VERBOSE, + AlignmentConstants = {}) + kwargs.setdefault("AlignDbTool", trackerAlignDBTool) + trackerAlignDBTool.AlignmentConstants = alignmentConstants a.addEventAlgo(WriteAlignmentAlg(name, **kwargs)) return a @@ -53,6 +58,10 @@ if __name__ == "__main__": ConfigFlags.IOVDb.DBConnection = "sqlite://;schema=" + ConfigFlags.GeoModel.FaserVersion + "_ALLP200.db;dbname=OFLP200" ConfigFlags.GeoModel.Align.Disable = True # Hack to avoid loading alignment when we want to create it from scratch ConfigFlags.addFlag("WriteAlignment.PoolFileName", ConfigFlags.GeoModel.FaserVersion + "_Align.pool.root") + +# Parse flags from command line and lock + ConfigFlags.addFlag("AlignDbTool.AlignmentConstants", {}) + ConfigFlags.fillFromArgs(sys.argv[1:]) ConfigFlags.lock() # Configure components @@ -60,7 +69,7 @@ if __name__ == "__main__": acc = MainServicesCfg(ConfigFlags) # Set things up to create a conditions DB with neutral Tracker alignment transforms - acc.merge(WriteAlignmentCfg(ConfigFlags, ValidRunStart=1, ValidEvtStart=0, ValidRunEnd=9999999, ValidEvtEnd=9999999, CondTag=ConfigFlags.GeoModel.FaserVersion.replace("FASER", "TRACKER-ALIGN"))) + acc.merge(WriteAlignmentCfg(ConfigFlags, alignmentConstants=ConfigFlags.AlignDbTool.AlignmentConstants, ValidRunStart=1, ValidEvtStart=0, ValidRunEnd=9999999, ValidEvtEnd=9999999, CondTag=ConfigFlags.GeoModel.FaserVersion.replace("FASER", "TRACKER-ALIGN"), )) # Configure verbosity # ConfigFlags.dump() @@ -71,3 +80,4 @@ if __name__ == "__main__": # Execute and finish sys.exit(int(acc.run(maxEvents=1).isFailure())) + diff --git a/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser02.py b/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser02.py index b05c15632415e873e301a08d9f63332175ebfe20..2e944e3fc88b76d6794a7df7b9ce4469fc763d51 100644 --- a/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser02.py +++ b/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser02.py @@ -5,7 +5,7 @@ import sys from AthenaCommon.Constants import VERBOSE, INFO from AthenaConfiguration.ComponentFactory import CompFactory -def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", **kwargs): +def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", alignmentConstants={}, **kwargs): # Initialize GeoModel from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg @@ -32,7 +32,12 @@ def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", **kwargs): PoolContainerPrefix="ConditionsContainer", TopLevelContainerName = "<type>", SubLevelBranchName= "<key>" ) - kwargs.setdefault("AlignDbTool", CompFactory.TrackerAlignDBTool("AlignDbTool", OutputTool = outputTool, OutputLevel=VERBOSE)) + + trackerAlignDBTool = CompFactory.TrackerAlignDBTool("AlignDbTool", OutputTool = outputTool, + OutputLevel=VERBOSE, + AlignmentConstants = {}) + kwargs.setdefault("AlignDbTool", trackerAlignDBTool) + trackerAlignDBTool.AlignmentConstants = alignmentConstants a.addEventAlgo(WriteAlignmentAlg(name, **kwargs)) return a @@ -53,6 +58,10 @@ if __name__ == "__main__": ConfigFlags.IOVDb.DBConnection = "sqlite://;schema=" + ConfigFlags.GeoModel.FaserVersion + "_ALLP200.db;dbname=OFLP200" ConfigFlags.GeoModel.Align.Disable = True # Hack to avoid loading alignment when we want to create it from scratch ConfigFlags.addFlag("WriteAlignment.PoolFileName", ConfigFlags.GeoModel.FaserVersion + "_Align.pool.root") + +# Parse flags from command line and lock + ConfigFlags.addFlag("AlignDbTool.AlignmentConstants", {}) + ConfigFlags.fillFromArgs(sys.argv[1:]) ConfigFlags.lock() # Configure components @@ -60,7 +69,7 @@ if __name__ == "__main__": acc = MainServicesCfg(ConfigFlags) # Set things up to create a conditions DB with neutral Tracker alignment transforms - acc.merge(WriteAlignmentCfg(ConfigFlags, ValidRunStart=1, ValidEvtStart=0, ValidRunEnd=9999999, ValidEvtEnd=9999999, CondTag=ConfigFlags.GeoModel.FaserVersion.replace("FASER", "TRACKER-ALIGN"))) + acc.merge(WriteAlignmentCfg(ConfigFlags, alignmentConstants=ConfigFlags.AlignDbTool.AlignmentConstants, ValidRunStart=1, ValidEvtStart=0, ValidRunEnd=9999999, ValidEvtEnd=9999999, CondTag=ConfigFlags.GeoModel.FaserVersion.replace("FASER", "TRACKER-ALIGN"), )) # Configure verbosity # ConfigFlags.dump() diff --git a/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_FaserTB00.py b/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_FaserTB00.py index d57092f2dd8b8c1dcb3bd6568fdb3dac636d3cf2..84fb1b02e855907c7c525c64498b7d4d8b015f18 100644 --- a/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_FaserTB00.py +++ b/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_FaserTB00.py @@ -5,7 +5,7 @@ import sys from AthenaCommon.Constants import VERBOSE, INFO from AthenaConfiguration.ComponentFactory import CompFactory -def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", **kwargs): +def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", alignmentConstants={}, **kwargs): # Initialize GeoModel from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg @@ -32,7 +32,12 @@ def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", **kwargs): PoolContainerPrefix="ConditionsContainer", TopLevelContainerName = "<type>", SubLevelBranchName= "<key>" ) - kwargs.setdefault("AlignDbTool", CompFactory.TrackerAlignDBTool("AlignDbTool", OutputTool = outputTool, OutputLevel=VERBOSE)) + + trackerAlignDBTool = CompFactory.TrackerAlignDBTool("AlignDbTool", OutputTool = outputTool, + OutputLevel=VERBOSE, + AlignmentConstants = {}) + kwargs.setdefault("AlignDbTool", trackerAlignDBTool) + trackerAlignDBTool.AlignmentConstants = alignmentConstants a.addEventAlgo(WriteAlignmentAlg(name, **kwargs)) return a @@ -53,6 +58,10 @@ if __name__ == "__main__": ConfigFlags.IOVDb.DBConnection = "sqlite://;schema=" + ConfigFlags.GeoModel.FaserVersion + "_ALLP200.db;dbname=OFLP200" ConfigFlags.GeoModel.Align.Disable = True # Hack to avoid loading alignment when we want to create it from scratch ConfigFlags.addFlag("WriteAlignment.PoolFileName", ConfigFlags.GeoModel.FaserVersion + "_Align.pool.root") + +# Parse flags from command line and lock + ConfigFlags.addFlag("AlignDbTool.AlignmentConstants", {}) + ConfigFlags.fillFromArgs(sys.argv[1:]) ConfigFlags.lock() # Configure components @@ -60,7 +69,7 @@ if __name__ == "__main__": acc = MainServicesCfg(ConfigFlags) # Set things up to create a conditions DB with neutral Tracker alignment transforms - acc.merge(WriteAlignmentCfg(ConfigFlags, ValidRunStart=1, ValidEvtStart=0, ValidRunEnd=9999999, ValidEvtEnd=9999999, CondTag=ConfigFlags.GeoModel.FaserVersion.replace("FASER", "TRACKER-ALIGN"))) + acc.merge(WriteAlignmentCfg(ConfigFlags, alignmentConstants=ConfigFlags.AlignDbTool.AlignmentConstants, ValidRunStart=1, ValidEvtStart=0, ValidRunEnd=9999999, ValidEvtEnd=9999999, CondTag=ConfigFlags.GeoModel.FaserVersion.replace("FASER", "TRACKER-ALIGN"), )) # Configure verbosity # ConfigFlags.dump() diff --git a/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.cxx b/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.cxx index 77714ac0974d54b0f6292a74a174cc86a6c7cf29..4483eb5b4cd52b31aa70cb915ba6500641297685 100644 --- a/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.cxx +++ b/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.cxx @@ -1,6 +1,6 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + */ // TrackerAlignDBTool.cxx // AlgTool to manage the SCT AlignableTransforms in the conditions store @@ -12,6 +12,9 @@ #include "AthenaPoolUtilities/CondAttrListCollection.h" #include "AthenaPoolUtilities/AthenaAttributeList.h" +#include <string> +#include <set> +#include <exception> #include <fstream> #include <iostream> @@ -35,16 +38,16 @@ #define TRACKER_ALIGN "/Tracker/Align" TrackerAlignDBTool::TrackerAlignDBTool(const std::string& type, - const std::string& name, const IInterface* parent) + const std::string& name, const IInterface* parent) : AthAlgTool(type,name,parent), - p_toolsvc("ToolSvc",name), - m_sctid(nullptr), - m_sctman(nullptr), - m_par_scttwoside(false), - m_par_dbroot( TRACKER_ALIGN ), - m_par_dbkey( TRACKER_ALIGN ), - m_dynamicDB(false), - m_forceUserDBConfig(false) + p_toolsvc("ToolSvc",name), + m_sctid(nullptr), + m_sctman(nullptr), + m_par_scttwoside(false), + m_par_dbroot( TRACKER_ALIGN ), + m_par_dbkey( TRACKER_ALIGN ), + m_dynamicDB(false), + m_forceUserDBConfig(false) { declareInterface<ITrackerAlignDBTool>(this); declareProperty("IToolSvc", p_toolsvc); @@ -59,76 +62,76 @@ TrackerAlignDBTool::~TrackerAlignDBTool() StatusCode TrackerAlignDBTool::initialize() { - - ATH_MSG_DEBUG("initializing"); - - m_alignobjs.clear(); - m_alignchans.clear(); - int ndet {0}; - // get storegate access to conditions store - ATH_CHECK(detStore().retrieve()); + ATH_MSG_DEBUG("initializing"); - ATH_CHECK( p_toolsvc.retrieve() ); + m_alignobjs.clear(); + m_alignchans.clear(); + int ndet {0}; - // attempt to get ID helpers from detector store - // (relying on GeoModel to put them) + // get storegate access to conditions store + ATH_CHECK(detStore().retrieve()); - ATH_CHECK(detStore()->retrieve(m_sctman,"SCT")); + ATH_CHECK( p_toolsvc.retrieve() ); - if (m_sctman->m_alignfoldertype == TrackerDD::static_run1 && - !m_forceUserDBConfig) - { - m_par_dbroot = "/Tracker/Align"; - m_dynamicDB = false; - } - else if (m_sctman->m_alignfoldertype == TrackerDD::timedependent_run2 && - !m_forceUserDBConfig) - { - m_par_dbroot = "/Tracker/AlignL3"; - m_dynamicDB = true; - } - m_par_dbkey = m_par_dbroot; + // attempt to get ID helpers from detector store + // (relying on GeoModel to put them) + + ATH_CHECK(detStore()->retrieve(m_sctman,"SCT")); - ATH_CHECK(detStore()->retrieve(m_sctid)); + if (m_sctman->m_alignfoldertype == TrackerDD::static_run1 && + !m_forceUserDBConfig) + { + m_par_dbroot = "/Tracker/Align"; + m_dynamicDB = false; + } + else if (m_sctman->m_alignfoldertype == TrackerDD::timedependent_run2 && + !m_forceUserDBConfig) + { + m_par_dbroot = "/Tracker/AlignL3"; + m_dynamicDB = true; + } + m_par_dbkey = m_par_dbroot; - // setup list of alignable transforms from geometry - int chan[3]; - int TransfLevel_low = 0; // depending on alignfolder sheme; 0 for old, 2 for new - if (m_dynamicDB) TransfLevel_low = 2; + ATH_CHECK(detStore()->retrieve(m_sctid)); - for (int i=0;i<3;++i) chan[i]=100*i; + // setup list of alignable transforms from geometry + int chan[3]; + int TransfLevel_low = 0; // depending on alignfolder sheme; 0 for old, 2 for new + if (m_dynamicDB) TransfLevel_low = 2; - std::string man_name; - for (const TrackerDD::SiDetectorElement* element : *(m_sctman->getDetectorElementCollection())) + for (int i=0;i<3;++i) chan[i]=100*i; + + std::string man_name; + for (const TrackerDD::SiDetectorElement* element : *(m_sctman->getDetectorElementCollection())) + { + if (element!=0) { - if (element!=0) - { - const Identifier ident=element->identify(); - int station, layer, eta, phi, side; - if (idToDetSet(ident, station, layer, eta, phi, side)) - { - std::string level[3]; - for (int i=TransfLevel_low; i<3; ++i) - { - m_stations.insert(station); - level[i]=dirkey(station, layer, 1+i, phi); - // add this to list if not seen already - std::vector<std::string>::const_iterator ix = - find(m_alignobjs.begin(), m_alignobjs.end(), level[i]); - if (ix==m_alignobjs.end()) - { - m_alignobjs.push_back(level[i]); - m_alignchans.push_back(chan[i]++); - } - } - ++ndet; - } - else - { - ATH_MSG_ERROR("Error translating element identifier." ); - } - } + const Identifier ident=element->identify(); + int station, layer, eta, phi, side; + if (idToDetSet(ident, station, layer, eta, phi, side)) + { + std::string level[3]; + for (int i=TransfLevel_low; i<3; ++i) + { + m_stations.insert(station); + level[i]=dirkey(station, layer, 1+i, phi); + // add this to list if not seen already + std::vector<std::string>::const_iterator ix = + find(m_alignobjs.begin(), m_alignobjs.end(), level[i]); + if (ix==m_alignobjs.end()) + { + m_alignobjs.push_back(level[i]); + m_alignchans.push_back(chan[i]++); + } + } + ++ndet; + } + else + { + ATH_MSG_ERROR("Error translating element identifier." ); + } + } } ATH_CHECK(m_outputTool.retrieve()); @@ -136,12 +139,12 @@ StatusCode TrackerAlignDBTool::initialize() { ATH_MSG_DEBUG( "Database root folder " << m_par_dbroot ); ATH_MSG_DEBUG( "Geometry initialisation sees " << ndet << - " SCT modules giving " << m_alignobjs.size() << " alignment keys" ); + " SCT modules giving " << m_alignobjs.size() << " alignment keys" ); ATH_MSG_DEBUG("Keys/channels are:"); - + for (unsigned int i=0; i < m_alignobjs.size(); ++i) ATH_MSG_DEBUG( " " << m_alignobjs[i] << " [" << m_alignchans[i] << "]" ); - + } return StatusCode::SUCCESS; @@ -155,7 +158,7 @@ StatusCode TrackerAlignDBTool::finalize() StatusCode TrackerAlignDBTool::createDB() const { - + ATH_MSG_DEBUG("createDB method called"); AlignableTransform* pat = nullptr; @@ -167,8 +170,8 @@ StatusCode TrackerAlignDBTool::createDB() const if (detStore()->contains<AlignableTransformContainer>(m_par_dbroot)) { - ATH_MSG_WARNING("createDB: AlignableTransformContainer already exists" ); - return StatusCode::FAILURE; + ATH_MSG_WARNING("createDB: AlignableTransformContainer already exists" ); + return StatusCode::FAILURE; } // put them in a collection /Indet/Align @@ -187,7 +190,7 @@ StatusCode TrackerAlignDBTool::createDB() const } // record collection in SG - + ATH_CHECK( detStore()->record(patc, m_par_dbroot) ); ATH_MSG_DEBUG( "Collection has size " << patc->size() ); @@ -195,78 +198,133 @@ StatusCode TrackerAlignDBTool::createDB() const std::vector<std::string> level2; for (const TrackerDD::SiDetectorElement* element : *(m_sctman->getDetectorElementCollection()) ) { - if (element != 0) + if (element != 0) + { + const Identifier ident = element->identify(); + std::string key = dirkey(ident,3); + // do not produce AlignableTrasnforms for SCT side 1 if option set + if (!(m_sctid->side(ident)==1) || m_par_scttwoside) { - const Identifier ident = element->identify(); - std::string key = dirkey(ident,3); - // do not produce AlignableTrasnforms for SCT side 1 if option set - if (!(m_sctid->side(ident)==1) || m_par_scttwoside) - { - if ((pat=getTransPtr(key))) - { - pat->add(ident,Amg::EigenTransformToCLHEP( Amg::Transform3D::Identity() ) ); - } - else - { - ATH_MSG_ERROR( "Cannot retrieve AlignableTransform for key " << key ); - } - // add level 2 transform if needed - do this the first time a module - // for this level 3 key is seen - std::vector<std::string>::const_iterator ix= - find(level2.begin(),level2.end(),key); - if (ix==level2.end()) - { - level2.push_back(key); - // construct identifier of level 2 transform - Identifier ident2; - ident2=m_sctid->wafer_id(m_sctid->station(ident), - m_sctid->layer(ident), - 0, 0, 0); - std::string key2 = dirkey(ident, 2); - if ((pat = getTransPtr(key2))) - { - pat->add(ident2, - Amg::EigenTransformToCLHEP( Amg::Transform3D::Identity() ) ); - } - else - { - ATH_MSG_ERROR( "Cannot retrieve AlignableTransform for key " << key2 ); - } - } - } + if ((pat=getTransPtr(key))) + { + const auto iStation = m_sctid->station(ident); + const auto iLayer = m_sctid->layer(ident); + const auto iModuleEta = m_sctid->eta_module(ident); + const auto iModulePhi = m_sctid->phi_module(ident); + int iModule = iModulePhi; + if (iModuleEta < 0) iModule +=4; + + const auto buildKey = [](auto iStation, auto iLayer, auto iModule) { + std::stringstream ss; + ss << iStation << iLayer << iModule; + return ss.str(); + }; + + const auto key = buildKey(iStation, iLayer, iModule); + if (not (m_alignment.find(key) == m_alignment.end())) { + const std::vector<double> c = m_alignment.value().find(key)->second; + ATH_MSG_VERBOSE("Applying correction for " << key); + ATH_MSG_VERBOSE(c[0] << " " << c[1] << " " << c[2] << " " << c[3] << " " << c[4] << " " << c[5]); + Amg::Translation3D newtranslation(c[0], c[1], c[2]); + Amg::Transform3D alignment = newtranslation * Amg::RotationMatrix3D::Identity(); + alignment *= Amg::AngleAxis3D(c[5], Amg::Vector3D(0.,0.,1.)); + alignment *= Amg::AngleAxis3D(c[4], Amg::Vector3D(0.,1.,0.)); + alignment *= Amg::AngleAxis3D(c[3], Amg::Vector3D(1.,0.,0.)); + + pat->add(ident, Amg::EigenTransformToCLHEP(alignment)); + } else { + ATH_MSG_VERBOSE("No correction given for " << key); + } + } + else + { + ATH_MSG_ERROR( "Cannot retrieve AlignableTransform for key " << key ); + } + // add level 2 transform if needed - do this the first time a module + // for this level 3 key is seen + std::vector<std::string>::const_iterator ix= + find(level2.begin(),level2.end(),key); + if (ix==level2.end()) + { + level2.push_back(key); + // construct identifier of level 2 transform + Identifier ident2; + ident2=m_sctid->wafer_id(m_sctid->station(ident), + m_sctid->layer(ident), + 0, 0, 0); + std::string key2 = dirkey(ident, 2); + if ((pat = getTransPtr(key2))) + { + auto iStation = m_sctid->station(ident); + auto iLayer = m_sctid->layer(ident); + + const auto buildKey = [](auto iStation, auto iLayer) { + std::stringstream ss; + ss << iStation << iLayer; + return ss.str(); + }; + + const auto key = buildKey(iStation, iLayer); + if (not (m_alignment.find(key) == m_alignment.end())) { + const std::vector<double> c = m_alignment.value().find(key)->second; + ATH_MSG_VERBOSE("Applying correction for " << key); + ATH_MSG_VERBOSE(c[0] << " " << c[1] << " " << c[2] << " " << c[3] << " " << c[4] << " " << c[5]); + Amg::Translation3D newtranslation(c[0], c[1], c[2]); + Amg::Transform3D alignment = newtranslation * Amg::RotationMatrix3D::Identity(); + alignment *= Amg::AngleAxis3D(c[5], Amg::Vector3D(0.,0.,1.)); + alignment *= Amg::AngleAxis3D(c[4], Amg::Vector3D(0.,1.,0.)); + alignment *= Amg::AngleAxis3D(c[3], Amg::Vector3D(1.,0.,0.)); + + pat->add(ident2, Amg::EigenTransformToCLHEP(alignment)); + } else { + ATH_MSG_VERBOSE("No correction given for " << key); + } + } + else + { + ATH_MSG_ERROR( "Cannot retrieve AlignableTransform for key " << key2 ); + } + } } } + } - // create the global object with positions for the stations - Identifier ident1; - std::string key1 = dirkey(ident1, 1); - if ((pat = getTransPtr(key1))) - { - Amg::Transform3D globshift; - globshift.setIdentity(); - for (int station : m_stations) - { - ident1 = m_sctid->wafer_id(station, 0, 0, 0, 0); - pat->add(ident1, Amg::EigenTransformToCLHEP(globshift)); - } - } - else + // create the global object with positions for the stations + Identifier ident1; + std::string key1 = dirkey(ident1, 1); + if ((pat = getTransPtr(key1))) + { + // Amg::Translation3D translation(0.1,0.2,0.3); + //Amg::Transform3D globshift=translation*Amg::RotationMatrix3D::Identity(); + //std::cout<<"rotation"<<std::endl; + //std::cout<<globshift.rotation()(0,0)<<" , "<<globshift.rotation()(1,1)<<" , "<<globshift.rotation()(2,2)<<std::endl; + //std::cout<<"translation"<<std::endl; + //std::cout<<globshift.translation()(0,0)<<" , "<<globshift.translation()(1,1)<<" , "<<globshift.translation()(2,2)<<std::endl; + Amg::Transform3D globshift; + globshift.setIdentity(); + for (int station : m_stations) { - ATH_MSG_ERROR( "Cannot retrieve AlignableTransform for key " << key1 ); - } + ident1 = m_sctid->wafer_id(station, 0, 0, 0, 0); + pat->add(ident1, Amg::EigenTransformToCLHEP(globshift)); + } + } + else + { + ATH_MSG_ERROR( "Cannot retrieve AlignableTransform for key " << key1 ); + } - // sort the created objects (in case, usually come out sorted from GeoModel) - ATH_CHECK(sortTrans()); - // list out size of all created objects - ATH_MSG_DEBUG( "Dumping size of created AlignableTransform objects"); - for (unsigned int i = 0; i < m_alignobjs.size(); ++i) - if ((pat = getTransPtr(m_alignobjs[i]))) pat->print(); + // sort the created objects (in case, usually come out sorted from GeoModel) + ATH_CHECK(sortTrans()); + // list out size of all created objects + ATH_MSG_DEBUG( "Dumping size of created AlignableTransform objects"); + for (unsigned int i = 0; i < m_alignobjs.size(); ++i) + if ((pat = getTransPtr(m_alignobjs[i]))) pat->print(); - return StatusCode::SUCCESS; + return StatusCode::SUCCESS; } bool TrackerAlignDBTool::idToDetSet(const Identifier ident, int& station, - int& layer, int& eta, int& phi, int& side) const + int& layer, int& eta, int& phi, int& side) const { // transform Identifier to list of integers specifiying station,layer // eta, phi, side @@ -280,7 +338,7 @@ bool TrackerAlignDBTool::idToDetSet(const Identifier ident, int& station, } std::string TrackerAlignDBTool::dirkey(const Identifier& ident, - const int level) const + const int level) const { // given SCT identifier, and level (1, 2 or 3) return // directory key name for associated alignment data @@ -290,9 +348,9 @@ std::string TrackerAlignDBTool::dirkey(const Identifier& ident, } std::string TrackerAlignDBTool::dirkey(const int station, - const int layer, - const int level, - const int ) const + const int layer, + const int level, + const int ) const { // channel info and level (1,2 or 3) return // directory key name for associated alignment data @@ -307,17 +365,17 @@ std::string TrackerAlignDBTool::dirkey(const int station, { result << m_par_dbkey << "/" ; } - + if (level==1) { result << "Stations"; } else { if (level==2) result << "Planes"; if (level==3) { - if (station == 3 ) result << "Downstream"; - if (station == 2 ) result << "Central"; - if (station == 1 ) result << "Upstream"; - if (station == 0 ) result << "Interface"; - result << 1+layer; + if (station == 3 ) result << "Downstream"; + if (station == 2 ) result << "Central"; + if (station == 1 ) result << "Upstream"; + if (station == 0 ) result << "Interface"; + result << 1+layer; } } return result.str(); @@ -327,7 +385,7 @@ std::string TrackerAlignDBTool::dirkey(const int station, // const int layer,const int ring, const int sector, // const float rphidisp, const float rdisp, const float zdisp, // const int syst, const int level, const int skip) const { - + // ATH_MSG_DEBUG( "dispGroup called: level " << level << " syst " << syst); // int nmod=0; // // random number service @@ -438,7 +496,7 @@ std::string TrackerAlignDBTool::dirkey(const int station, // } // // update, adding to any existing shift // if (update) { - + // Amg::Transform3D shift = Amg::Translation3D(xd,yd,zd) * Amg::RotationMatrix3D::Identity(); // pat->tweak(ident2,Amg::EigenTransformToCLHEP(shift)); // ATH_MSG_VERBOSE( "Updated module " << mdet << "," << mbec @@ -495,13 +553,13 @@ std::string TrackerAlignDBTool::dirkey(const int station, // bool InDetAlignDBTool::setTrans(const Identifier& ident, const int level, // const Amg::Vector3D& translate, double alpha, double beta, double gamma) const // { - + // Amg::Translation3D newtranslation(translate); // Amg::Transform3D newtrans = newtranslation * Amg::RotationMatrix3D::Identity(); // newtrans *= Amg::AngleAxis3D(gamma, Amg::Vector3D(0.,0.,1.)); // newtrans *= Amg::AngleAxis3D(beta, Amg::Vector3D(0.,1.,0.)); // newtrans *= Amg::AngleAxis3D(alpha, Amg::Vector3D(1.,0.,0.)); - + // return setTrans(ident, level, newtrans); // } @@ -543,13 +601,13 @@ std::string TrackerAlignDBTool::dirkey(const int station, // bool InDetAlignDBTool::tweakTrans(const Identifier& ident, const int level, // const Amg::Vector3D& translate, double alpha, double beta, double gamma) const // { - + // Amg::Translation3D newtranslation(translate); // Amg::Transform3D newtrans = newtranslation * Amg::RotationMatrix3D::Identity(); // newtrans *= Amg::AngleAxis3D(gamma, Amg::Vector3D(0.,0.,1.)); // newtrans *= Amg::AngleAxis3D(beta, Amg::Vector3D(0.,1.,0.)); // newtrans *= Amg::AngleAxis3D(alpha, Amg::Vector3D(1.,0.,0.)); - + // return tweakTrans(ident, level, newtrans); // } @@ -586,7 +644,7 @@ std::string TrackerAlignDBTool::dirkey(const int station, // /** get cumulative L1, L2, L3 trafo for (L3-) module */ // Amg::Transform3D InDetAlignDBTool::getTransL123( const Identifier& ident ) const { - + // Amg::Transform3D result ; // InDetDD::SiDetectorElement* element = m_pixman->getDetectorElement( ident ) ; // if( !element ) { @@ -623,14 +681,14 @@ std::string TrackerAlignDBTool::dirkey(const int station, // } StatusCode TrackerAlignDBTool::outputObjs() const { - + ATH_MSG_DEBUG( "Output AlignableTranform objects to stream" << m_outputTool ); // get the AthenaOutputStream tool -// IAthenaOutputStreamTool* optool {nullptr}; + // IAthenaOutputStreamTool* optool {nullptr}; + + // ATH_CHECK(p_toolsvc->retrieveTool("AthenaOutputStreamTool", m_par_condstream, optool)); -// ATH_CHECK(p_toolsvc->retrieveTool("AthenaOutputStreamTool", m_par_condstream, optool)); - -// ATH_CHECK(optool->connectOutput("myAlignFile.pool.root")); + // ATH_CHECK(optool->connectOutput("myAlignFile.pool.root")); ATH_CHECK(m_outputTool->connectOutput()); // construct list of objects to be written out, either @@ -638,13 +696,13 @@ StatusCode TrackerAlignDBTool::outputObjs() const { int npairs=1; IAthenaOutputStreamTool::TypeKeyPairs typekeys(npairs); typekeys[0]= - IAthenaOutputStreamTool::TypeKeyPair("AlignableTransformContainer", - m_par_dbroot); + IAthenaOutputStreamTool::TypeKeyPair("AlignableTransformContainer", + m_par_dbroot); if (!(detStore()->contains<AlignableTransformContainer>(m_par_dbroot))) ATH_MSG_ERROR( - "Expected " << m_par_dbroot << " object not found" ); + "Expected " << m_par_dbroot << " object not found" ); // write objects to stream -// ATH_CHECK(optool->streamObjects(typekeys, "myAlignFile.pool.root")); + // ATH_CHECK(optool->streamObjects(typekeys, "myAlignFile.pool.root")); ATH_CHECK(m_outputTool->streamObjects(typekeys)); // commit output @@ -654,10 +712,10 @@ StatusCode TrackerAlignDBTool::outputObjs() const { } StatusCode TrackerAlignDBTool::fillDB(const std::string tag, - const unsigned int run1, const unsigned int event1, - const unsigned int run2, const unsigned int event2) const + const unsigned int run1, const unsigned int event1, + const unsigned int run2, const unsigned int event2) const { - + ATH_MSG_DEBUG( "fillDB: Data tag " << tag ); ATH_MSG_DEBUG( "Run/evt1 [" << run1 << "," << event1 << "]" ); ATH_MSG_DEBUG( "Run/evt2 [" << run2 << "," << event2 << "]" ); @@ -669,7 +727,7 @@ StatusCode TrackerAlignDBTool::fillDB(const std::string tag, // loop over all AlignableTransform objects created earlier and save them ATH_CHECK(regsvc->registerIOV( - "AlignableTransformContainer",m_par_dbroot, tag, run1, run2, event1, event2)); + "AlignableTransformContainer",m_par_dbroot, tag, run1, run2, event1, event2)); ATH_MSG_DEBUG( "Stored AlignableTransform object " << m_par_dbroot ); ATH_MSG_DEBUG( " Wrote one AlignableTransformContainer objects to conditions database" ); @@ -678,12 +736,12 @@ StatusCode TrackerAlignDBTool::fillDB(const std::string tag, StatusCode TrackerAlignDBTool::printDB(const int level) const { - + ATH_MSG_DEBUG("Printout TrackerAlign database contents, detail level" << level ); for (std::vector<std::string>::const_iterator iobj = m_alignobjs.begin(); - iobj != m_alignobjs.end(); - ++iobj) + iobj != m_alignobjs.end(); + ++iobj) { const AlignableTransform* pat; if ((pat = cgetTransPtr(*iobj))) @@ -691,31 +749,31 @@ StatusCode TrackerAlignDBTool::printDB(const int level) const ATH_MSG_DEBUG( "AlignableTransform object " << *iobj ); int nobj = 0; for (AlignableTransform::AlignTransMem_citr cit = pat->begin(); - cit!=pat->end(); - ++cit) + cit!=pat->end(); + ++cit) { - const Identifier& ident = cit->identify(); - const Amg::Transform3D& trans = Amg::CLHEPTransformToEigen( cit->transform() ); - Amg::Vector3D shift = trans.translation(); - //Amg::RotationMatrix3D rot=trans.rotation(); - int station, layer, eta, phi, side; - if (idToDetSet(ident, station, layer, eta, phi, side)) - { - if (level > 1) - { - double alpha, beta, gamma; - extractAlphaBetaGamma(trans, alpha, beta, gamma); - ATH_MSG_DEBUG( "Tracker [" << station << "," << layer << - "," << eta << "," << phi << "," << side << "] Trans:(" << - shift.x() << "," << shift.y() << "," << shift.z() << ") Rot:{" - << alpha << "," << beta << "," << gamma << "}"); - } - ++nobj; - } - else - { - ATH_MSG_ERROR("Unknown identifier in AlignableTransform" ); - } + const Identifier& ident = cit->identify(); + const Amg::Transform3D& trans = Amg::CLHEPTransformToEigen( cit->transform() ); + Amg::Vector3D shift = trans.translation(); + //Amg::RotationMatrix3D rot=trans.rotation(); + int station, layer, eta, phi, side; + if (idToDetSet(ident, station, layer, eta, phi, side)) + { + if (level > 1) + { + double alpha, beta, gamma; + extractAlphaBetaGamma(trans, alpha, beta, gamma); + ATH_MSG_DEBUG( "Tracker [" << station << "," << layer << + "," << eta << "," << phi << "," << side << "] Trans:(" << + shift.x() << "," << shift.y() << "," << shift.z() << ") Rot:{" + << alpha << "," << beta << "," << gamma << "}"); + } + ++nobj; + } + else + { + ATH_MSG_ERROR("Unknown identifier in AlignableTransform" ); + } } ATH_MSG_DEBUG( "Object contains " << nobj << " transforms" ); } @@ -731,28 +789,28 @@ StatusCode TrackerAlignDBTool::printDB(const int level) const AlignableTransform* TrackerAlignDBTool::getTransPtr(const std::string key) const { - // look in collection to retrieve pointer to AlignableTransform object of - // given key and return it, return 0 if not collection or key value not found - AlignableTransformContainer* patc; - AlignableTransform* pat {nullptr}; + // look in collection to retrieve pointer to AlignableTransform object of + // given key and return it, return 0 if not collection or key value not found + AlignableTransformContainer* patc; + AlignableTransform* pat {nullptr}; - if(detStore()->retrieve(patc,m_par_dbroot ).isFailure()) - { + if(detStore()->retrieve(patc,m_par_dbroot ).isFailure()) + { ATH_MSG_ERROR("Unable to retrieve alignment container from DetStore."); return nullptr; - } + } - for (DataVector<AlignableTransform>::iterator dva=patc->begin(); - dva!=patc->end();++dva) - { - if ((*dva)->tag()==key) + for (DataVector<AlignableTransform>::iterator dva=patc->begin(); + dva!=patc->end();++dva) { - pat=*dva; - break; + if ((*dva)->tag()==key) + { + pat=*dva; + break; + } } + return pat; } - return pat; -} const AlignableTransform* TrackerAlignDBTool::cgetTransPtr(const std::string key) const { @@ -764,18 +822,18 @@ const AlignableTransform* TrackerAlignDBTool::cgetTransPtr(const std::string key if(detStore()->retrieve(patc, m_par_dbroot ).isFailure()) { - ATH_MSG_ERROR("Unable to retrieve alignment container from DetStore."); - return nullptr; + ATH_MSG_ERROR("Unable to retrieve alignment container from DetStore."); + return nullptr; } for (DataVector<AlignableTransform>::const_iterator dva=patc->begin(); - dva!=patc->end(); - ++dva) + dva!=patc->end(); + ++dva) { if ((*dva)->tag() == key) { - pat=*dva; - break; + pat=*dva; + break; } } return pat; @@ -784,7 +842,7 @@ const AlignableTransform* TrackerAlignDBTool::cgetTransPtr(const std::string key StatusCode TrackerAlignDBTool::sortTrans() const { // loop through all the AlignableTransform objects and sort them - + ATH_MSG_DEBUG( "Sorting all AlignableTransforms in TDS" ); AlignableTransform* pat; // use cget and a const cast to allow containers that have been read in @@ -796,7 +854,7 @@ StatusCode TrackerAlignDBTool::sortTrans() const } void TrackerAlignDBTool::extractAlphaBetaGamma(const Amg::Transform3D & trans, - double& alpha, double& beta, double &gamma) const + double& alpha, double& beta, double &gamma) const { double siny = trans(0,2); beta = asin(siny); @@ -832,14 +890,14 @@ void TrackerAlignDBTool::extractAlphaBetaGamma(const Amg::Transform3D & trans, // idToDetSet(ident,det,bec,layer,ring,sector,side); // const unsigned int DBident=det*10000+2*bec*1000+layer*100+ring*10+sector; // // so far not a very fancy DB identifier, but seems elaborate enough for this simple structure - + // if (StatusCode::SUCCESS==detStore()->retrieve(atrlistcol1,key)) { // // loop over objects in collection // //atrlistcol1->dump(); // atrlistcol2 = const_cast<CondAttrListCollection*>(atrlistcol1); // if (atrlistcol2!=0){ // for (CondAttrListCollection::const_iterator citr=atrlistcol2->begin(); citr!=atrlistcol2->end();++citr) { - + // const coral::AttributeList& atrlist=citr->second; // coral::AttributeList& atrlist2 = const_cast<coral::AttributeList&>(atrlist); @@ -865,7 +923,7 @@ void TrackerAlignDBTool::extractAlphaBetaGamma(const Amg::Transform3D & trans, // oldtrans *= Amg::AngleAxis3D(atrlist2["Rz"].data<float>()*CLHEP::mrad, Amg::Vector3D(0.,0.,1.)); // oldtrans *= Amg::AngleAxis3D(atrlist2["Ry"].data<float>()*CLHEP::mrad, Amg::Vector3D(0.,1.,0.)); // oldtrans *= Amg::AngleAxis3D(atrlist2["Rx"].data<float>()*CLHEP::mrad, Amg::Vector3D(1.,0.,0.)); - + // // get the new transform // Amg::Transform3D newtrans = trans*oldtrans; @@ -880,7 +938,7 @@ void TrackerAlignDBTool::extractAlphaBetaGamma(const Amg::Transform3D & trans, // atrlist2["Rx"].data<float>() = alpha/CLHEP::mrad ; // atrlist2["Ry"].data<float>() = beta/CLHEP::mrad ; // atrlist2["Rz"].data<float>() = gamma/CLHEP::mrad ; - + // result = true; // msg(MSG::DEBUG) << "Tweak New global DB -- channel: " << citr->first // << " ,det: " << atrlist2["det"].data<int>() @@ -894,7 +952,7 @@ void TrackerAlignDBTool::extractAlphaBetaGamma(const Amg::Transform3D & trans, // << " ,Rx: " << atrlist2["Rx"].data<float>() // << " ,Ry: " << atrlist2["Ry"].data<float>() // << " ,Rz: " << atrlist2["Rz"].data<float>() << endmsg; - + // } // } // } diff --git a/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.h b/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.h index 2c82c20a10baffab0b01d6c00af036b6adabaa11..6ee1a190427d31b683aa946fe54726e8b04079ba 100644 --- a/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.h +++ b/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.h @@ -186,6 +186,8 @@ class TrackerAlignDBTool: virtual public ITrackerAlignDBTool, public AthAlgTool bool m_dynamicDB; bool m_forceUserDBConfig; std::set<int> m_stations; + Gaudi::Property<std::map<std::string, std::vector<double>>> m_alignment{ this, "AlignmentConstants", {}, "Alignment constants."}; + mutable ToolHandle<IAthenaOutputStreamTool> m_outputTool { this, "OutputTool", "AthenaOutputStreamTool/CondStream1"} ;