diff --git a/DDCore/src/AlignmentsCalculator.cpp.old b/DDCore/src/AlignmentsCalculator.cpp.old deleted file mode 100644 index 682f1345954b25ec0173b025457a1e3e4ee415f2..0000000000000000000000000000000000000000 --- a/DDCore/src/AlignmentsCalculator.cpp.old +++ /dev/null @@ -1,291 +0,0 @@ -//========================================================================== -// AIDA Detector description implementation -//-------------------------------------------------------------------------- -// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) -// All rights reserved. -// -// For the licensing terms see $DD4hepINSTALL/LICENSE. -// For the list of contributors see $DD4hepINSTALL/doc/CREDITS. -// -// Author : M.Frank -// -//========================================================================== - -// Framework include files -#include "DD4hep/AlignmentsCalculator.h" -#include "DD4hep/Printout.h" -#include "DD4hep/Conditions.h" -#include "DD4hep/ConditionsMap.h" -#include "DD4hep/InstanceCount.h" -#include "DD4hep/MatrixHelpers.h" -#include "DD4hep/detail/AlignmentsInterna.h" - -using namespace dd4hep; -using namespace dd4hep::align; -typedef AlignmentsCalculator::Result Result; - -/// Namespace for the AIDA detector description toolkit -namespace dd4hep { - - /// Namespace for the alignment part of the AIDA detector description toolkit - namespace align { - - /// Anonymous implementation classes - namespace { - static Delta identity_delta; - - /// Alignment calculator. - /** - * Uses internally the conditions mechanism to calculator the alignment conditions. - * - * \author M.Frank - * \version 1.0 - * \ingroup DD4HEP_ALIGNMENTS - */ - class Calculator { - public: - class Entry; - class Context; - - public: - /// Initializing constructor - Calculator() = default; - /// Default destructor - ~Calculator() = default; - /// Compute the alignment delta for one detector element and it's alignment condition - void computeDelta(const Delta& delta, TGeoHMatrix& tr_delta) const; - /// Compute the transformation from the closest detector element of the alignment to the world system - Result to_world(Context& context, DetElement det, TGeoHMatrix& mat) const; - /// Compute all alignment conditions of the lower levels - Result compute(Context& context, Entry& entry) const; - /// Resolve child dependencies for a given context - void resolve(Context& context, DetElement child) const; - }; - - class Calculator::Entry { - public: - DetElement::Object* det = 0; - const Delta* delta = 0; - AlignmentCondition::Object* cond = 0; - unsigned char key = 0, valid = 0, created = 0, _pad[1]; - Entry(DetElement d, const Delta* del) : det(d.ptr()), delta(del), key(d.key()) {} - }; - - class Calculator::Context { - public: - struct PathOrdering { - bool operator()(const DetElement& a, const DetElement& b) const - { return a.path() < b.path(); } - }; - typedef std::map<DetElement,size_t,PathOrdering> DetectorMap; - typedef std::map<unsigned int,size_t> Keys; - typedef std::vector<Entry> Entries; - - DetectorMap detectors; - Keys keys; - Entries entries; - ConditionsMap& mapping; - Context(ConditionsMap& m) : mapping(m) { - InstanceCount::increment(this); - } - ~Context() { - InstanceCount::decrement(this); - } - void insert(DetElement det, const Delta* delta) { - if ( det.isValid() ) { - Entry entry(det,delta); - detectors.insert(std::make_pair(det, entries.size())); - keys.insert(std::make_pair(entry.key, entries.size())); - entries.insert(entries.end(), entry); - return; - } - except("AlignContext","Failed to add entry: invalid detector handle!"); - } - }; - } - } /* End namespace align */ -} /* End namespace dd4hep */ - -static PrintLevel s_PRINT = WARNING; -//static PrintLevel s_PRINT = INFO; - -Result Calculator::to_world(Context& context, - DetElement det, - TGeoHMatrix& delta_to_world) const -{ - Result result; - DetElement par = det.parent(); - - while( par.isValid() ) { - // Mapping creation mode: - // If we find that the parent also got updated, directly take this transformation. - // Since we compute top-down, it is already valid! - Context::Keys::const_iterator i = context.keys.find(par.key()); - if ( i != context.keys.end() ) { - Entry& e = context.entries[(*i).second]; - // The parent entry is (not yet) valid. need to compute it first - if ( 0 == e.valid ) { - result += compute(context, e); - } - AlignmentCondition cond(e.cond); - AlignmentData& align(cond.data()); - if ( s_PRINT <= INFO ) { - ::printf("Multiply-left ALIGNMENT %s:", det.path().c_str()); delta_to_world.Print(); - ::printf(" with ALIGN(world) %s :", par.path().c_str()); align.worldDelta.Print(); - } - delta_to_world.MultiplyLeft(&align.worldDelta); - if ( s_PRINT <= INFO ) { - ::printf(" Result :"); delta_to_world.Print(); - } - ++result.computed; - return result; - } - // Mapping update mode: - // Check if there is already a transformation in the cache. If yes, take it. - // We assume it is a good one, because higher level changes are already processed. - AlignmentCondition cond = context.mapping.get(par,Keys::alignmentKey); - if ( cond.isValid() ) { - AlignmentData& align(cond.data()); - if ( s_PRINT <= INFO ) { - ::printf("Multiply-left ALIGNMENT %s:", det.path().c_str()); delta_to_world.Print(); - ::printf(" with ALIGN(world) %s :", par.path().c_str()); align.worldDelta.Print(); - } - delta_to_world.MultiplyLeft(&align.worldDelta); - if ( s_PRINT <= INFO ) { - ::printf(" Result :"); delta_to_world.Print(); - } - ++result.computed; - return result; - } - // There is no special alignment for this detector element. - // Hence to nominal (relative) transformation to the parent is valid - if ( s_PRINT <= INFO ) { - ::printf("Multiply-left ALIGNMENT %s:", det.path().c_str()); delta_to_world.Print(); - ::printf(" with NOMINAL(det) %s :", par.path().c_str()); - par.nominal().detectorTransformation().Print(); - } - delta_to_world.MultiplyLeft(&par.nominal().detectorTransformation()); - if ( s_PRINT <= INFO ) { - ::printf(" Result :"); delta_to_world.Print(); - } - par = par.parent(); - } - ++result.computed; - return result; -} - -/// Compute the alignment delta for one detector element and it's alignment condition -void Calculator::computeDelta(const Delta& delta, - TGeoHMatrix& tr_delta) const -{ - const Position& pos = delta.translation; - const Translation3D& piv = delta.pivot; - const RotationZYX& rot = delta.rotation; - - switch(delta.flags) { - case Delta::HAVE_TRANSLATION+Delta::HAVE_ROTATION+Delta::HAVE_PIVOT: - detail::matrix::_transform(tr_delta, Transform3D(Translation3D(pos)*piv*rot*(piv.Inverse()))); - break; - case Delta::HAVE_TRANSLATION+Delta::HAVE_ROTATION: - detail::matrix::_transform(tr_delta, Transform3D(rot,pos)); - break; - case Delta::HAVE_ROTATION+Delta::HAVE_PIVOT: - detail::matrix::_transform(tr_delta, Transform3D(piv*rot*(piv.Inverse()))); - break; - case Delta::HAVE_ROTATION: - detail::matrix::_transform(tr_delta, rot); - break; - case Delta::HAVE_TRANSLATION: - detail::matrix::_transform(tr_delta, pos); - break; - default: - break; - } -} - -/// Compute all alignment conditions of the lower levels -Result Calculator::compute(Context& context, Entry& e) const { - Result result; - DetElement det = e.det; - - if ( e.valid == 1 ) { - printout(DEBUG,"ComputeAlignment","================ IGNORE %s (already valid)",det.path().c_str()); - return result; - } - AlignmentCondition c = context.mapping.get(e.det, Keys::alignmentKey); - AlignmentCondition cond = c.isValid() ? c : AlignmentCondition("alignment"); - AlignmentData& align = cond.data(); - const Delta* delta = e.delta ? e.delta : &identity_delta; - TGeoHMatrix tr_delta; - - printout(DEBUG,"ComputeAlignment", - "============================== Compute transformation of %s",det.path().c_str()); - e.valid = 1; - e.cond = cond.ptr(); - computeDelta(*delta, tr_delta); - align.delta = *delta; - align.worldDelta = tr_delta; - result += to_world(context, det, align.worldDelta); - align.worldTrafo = det.nominal().worldTransformation()*align.worldDelta; - align.detectorTrafo = det.nominal().detectorTransformation()*tr_delta; - align.trToWorld = detail::matrix::_transform(&align.worldDelta); - // Update mapping if the condition is freshly created - if ( !c.isValid() ) { - e.created = 1; - cond->hash = ConditionKey(e.det,Keys::alignmentKey).hash; - context.mapping.insert(e.det, Keys::alignmentKey, cond); - } - if ( s_PRINT <= INFO ) { - printout(INFO,"ComputeAlignment","Level:%d Path:%s DetKey:%08X: Cond:%s key:%16llX", - det.level(), det.path().c_str(), det.key(), - yes_no(e.delta != 0), (long long int)cond.key()); - if ( s_PRINT <= DEBUG ) { - ::printf("DetectorTrafo: '%s' -> '%s' ",det.path().c_str(), det.parent().path().c_str()); - det.nominal().detectorTransformation().Print(); - ::printf("Delta: '%s' ",det.path().c_str()); tr_delta.Print(); - ::printf("World-Delta: '%s' ",det.path().c_str()); align.worldDelta.Print(); - ::printf("Nominal: '%s' ",det.path().c_str()); det.nominal().worldTransformation().Print(); - ::printf("Result: '%s' ",det.path().c_str()); align.worldTrafo.Print(); - } - } - return result; -} - -/// Resolve child dependencies for a given context -void Calculator::resolve(Context& context, DetElement detector) const { - auto children = detector.children(); - auto item = context.detectors.find(detector); - if ( item == context.detectors.end() ) context.insert(detector,0); - for(const auto& c : children ) - resolve(context, c.second); -} - -/// Compute all alignment conditions of the internal dependency list -Result AlignmentsCalculator::compute(const std::map<DetElement, Delta>& deltas, - ConditionsMap& alignments) const -{ - Result result; - Calculator obj; - Calculator::Context context(alignments); - // This is a tricky one. We absolutely need the detector elements ordered - // by their depth aka. the distance to /world. - // Unfortunately one cannot use the raw pointer of the DetElement here, - // But has to insert them in a map which is ordered by the DetElement path. - // - // Otherwise memory randomization gives us the wrong order and the - // corrections are calculated in the wrong order ie. not top -> down the - // hierarchy, but in "some" order depending on the pointer values! - // - std::map<DetElement,Delta,Calculator::Context::PathOrdering> ordered_deltas; - - for( const auto& i : deltas ) - ordered_deltas.insert(i); - - for( const auto& i : ordered_deltas ) - context.insert(i.first, &(i.second)); - for( const auto& i : ordered_deltas ) - obj.resolve(context,i.first); - for( auto& i : context.entries ) - result += obj.compute(context, i); - return result; -}