File indexing completed on 2024-04-06 12:15:27
0001 #include "Geometry/TrackerGeometryBuilder/interface/StripTopologyBuilder.h"
0002 #include "Geometry/CommonTopologies/interface/RectangularStripTopology.h"
0003 #include "Geometry/CommonTopologies/interface/TkRadialStripTopology.h"
0004 #include "DataFormats/GeometrySurface/interface/Bounds.h"
0005 #include "DataFormats/GeometrySurface/interface/TrapezoidalPlaneBounds.h"
0006
0007 StripTopologyBuilder::StripTopologyBuilder(void) : theAPVNumb(0.0) {}
0008
0009 StripTopology* StripTopologyBuilder::build(const Bounds* bs, double apvnumb, const std::string& part) {
0010 theAPVNumb = apvnumb;
0011
0012 StripTopology* result = nullptr;
0013 if (part == "barrel") {
0014 result = constructBarrel(bs->length(), bs->width());
0015 } else {
0016 const TrapezoidalPlaneBounds* topo = dynamic_cast<const TrapezoidalPlaneBounds*>(bs);
0017 if (topo) {
0018 int yAx = topo->yAxisOrientation();
0019 result = constructForward(bs->length(), bs->width(), bs->widthAtHalfLength(), yAx);
0020 }
0021 }
0022 return result;
0023 }
0024
0025 StripTopology* StripTopologyBuilder::constructBarrel(float length, float width) {
0026 int nstrip = int(128 * theAPVNumb);
0027 float pitch = width / nstrip;
0028
0029 return new RectangularStripTopology(nstrip, pitch, length);
0030 }
0031
0032 StripTopology* StripTopologyBuilder::constructForward(float length, float width, float widthAtHalf, int yAxOr) {
0033 int nstrip = int(128 * theAPVNumb);
0034 float rCross = widthAtHalf * length / (2 * (width - widthAtHalf));
0035 float aw = atan2(widthAtHalf / 2., static_cast<double>(rCross)) / (nstrip / 2);
0036 return new TkRadialStripTopology(nstrip, aw, length, rCross, yAxOr);
0037 }