CMS 3D CMS Logo

SymmetricLayerFinder.cc
Go to the documentation of this file.
1 #include "SymmetricLayerFinder.h"
7 
8 #include <functional>
9 #include <algorithm>
10 #include <cmath>
11 
12 using namespace std;
13 
14 
16 {
17  ConstFDLI middle = find_if( flc.begin(), flc.end(), not1(DetBelowZ(0)));
18 
19  FDLC leftLayers = FDLC( flc.begin(), middle);
20  FDLC rightLayers = FDLC( middle, flc.end());
21  vector<PairType> foundPairs;
22 
23  for ( FDLI i = leftLayers.begin(); i != leftLayers.end(); i++) {
24  const ForwardDetLayer* partner = mirrorPartner( *i, rightLayers);
25  //if ( partner == 0) throw DetLogicError("Assymmetric forward layers in Tracker");
26  if ( partner == nullptr) throw cms::Exception("SymmetricLayerFinder", "Assymmetric forward layers in Tracker");
27 
28  foundPairs.push_back( make_pair( *i, partner));
29  }
30 
31  // fill the map
32  for ( vector<PairType>::iterator ipair = foundPairs.begin();
33  ipair != foundPairs.end(); ipair++) {
34  theForwardMap[ipair->first] = ipair->second;
35  theForwardMap[ipair->second] = ipair->first;
36  }
37 }
38 
40  const FDLC& rightLayers)
41 {
42 
43  auto mirrorImage = [=]( const ForwardDetLayer* a) ->bool {
44  auto zdiff = a->position().z() + layer->position().z();
45  auto rdiff = a->specificSurface().innerRadius() -
46  layer->specificSurface().innerRadius();
47 
48  // equality based on z position and inner radius
49  return std::abs(zdiff) < 2.f && std::abs(rdiff) < 1.f; // units are cm
50  };
51 
52 
54  find_if( rightLayers.begin(), rightLayers.end(), mirrorImage);
55  if ( result == rightLayers.end()) return nullptr;
56  else return *result;
57 }
58 
61  FDLC result;
62  for ( ConstFDLI i = input.begin(); i != input.end(); i++) {
63  result.push_back( mirror(*i));
64  }
65  return result;
66 }
SymmetricLayerFinder(const FDLC &)
const ForwardDetLayer * mirror(const ForwardDetLayer *layer)
static std::string const input
Definition: EdmProvDump.cc:45
T z() const
Definition: PV3DBase.h:64
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const ForwardDetLayer * mirrorPartner(const ForwardDetLayer *layer, const FDLC &rightLayers)
virtual const BoundDisk & specificSurface() const final
virtual const Surface::PositionType & position() const
Returns position of the surface.
double a
Definition: hdecay.h:121
std::vector< const ForwardDetLayer * > FDLC
FDLC::const_iterator ConstFDLI