diff --git a/DetectorDescription/RoiDescriptor/RoiDescriptor/RoiDescriptor.h b/DetectorDescription/RoiDescriptor/RoiDescriptor/RoiDescriptor.h index 79d99efe040858efee20e5ae74bd04b0ff19d120..56de195d20805e4fa778a7b833c35565e5052e9b 100644 --- a/DetectorDescription/RoiDescriptor/RoiDescriptor/RoiDescriptor.h +++ b/DetectorDescription/RoiDescriptor/RoiDescriptor/RoiDescriptor.h @@ -17,6 +17,7 @@ #include <iostream> #include "IRegionSelector/IRoiDescriptor.h" +#include "IRegionSelector/RoiUtil.h" /** diff --git a/DetectorDescription/RoiDescriptor/Root/RoiUtil.cxx b/DetectorDescription/RoiDescriptor/Root/RoiUtil.cxx index 716428607ce6a6da25341b76b3e7c83ec9385e25..e465b815ad10ac9b17a6c051124b6bc14eb91f12 100644 --- a/DetectorDescription/RoiDescriptor/Root/RoiUtil.cxx +++ b/DetectorDescription/RoiDescriptor/Root/RoiUtil.cxx @@ -11,6 +11,7 @@ // $Id: RoiUtil.cxx, v0.0 Sat 31 Oct 2015 09:54:33 CET sutt $ +#include "IRegionSelector/IRoiDescriptor.h" #include "IRegionSelector/RoiUtil.h" #include <cmath> @@ -143,3 +144,47 @@ double RoiUtil::zedcheck(double zed ) { } return zed; } + + +bool operator==( const IRoiDescriptor& roi0, const IRoiDescriptor& roi1 ) { + + /// trivial self comparison + if ( &roi0 == &roi1 ) return true; + + /// same compositness ? + if ( roi0.composite() != roi1.composite() ) return false; + + if ( !roi0.composite() ) { + /// not composite + + /// check full scan - all non-composite full scan rois are equivalent + if ( roi0.isFullscan() != roi1.isFullscan() ) return false; + if ( roi0.isFullscan() ) return true; + + /// check geometry + if ( std::fabs(roi0.zed() -roi1.zed() )>1e-7 ) return false; + if ( std::fabs(roi0.zedPlus() -roi1.zedPlus() )>1e-7 ) return false; + if ( std::fabs(roi0.zedMinus()-roi1.zedMinus())<1e-7 ) return false; + + if ( std::fabs(roi0.eta() -roi1.eta() )>1e-7 ) return false; + if ( std::fabs(roi0.etaPlus() -roi1.etaPlus() )>1e-7 ) return false; + if ( std::fabs(roi0.etaMinus()-roi1.etaMinus())>1e-7 ) return false; + + /// Fixme: naive phi differwnce - should test for the phi=pi boundary + /// for the case of very close angles but wrapped differently + if ( std::fabs(roi0.phi() -roi1.phi() ) >1e-7 ) return false; + if ( std::fabs(roi0.phiPlus() -roi1.phiPlus()) >1e-7 ) return false; + if ( std::fabs(roi0.phiMinus()-roi1.phiMinus())>1e-7 ) return false; + } + else { + /// check constituents + if ( roi0.size() != roi1.size() ) return false; + for ( unsigned i=roi0.size() ; i-- ; ) if ( !( *roi0.at(i) == *roi1.at(i) ) ) return false; + } + + return true; +} + + + +bool operator!=( const IRoiDescriptor& roi0, const IRoiDescriptor& roi1 ) { return !(roi0==roi1); }