File indexing completed on 2024-04-06 12:15:22
0001 #include "DD4hep/DetFactoryHelper.h"
0002 #include "DataFormats/Math/interface/CMSUnits.h"
0003 #include "DetectorDescription/DDCMS/interface/DDPlugins.h"
0004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0005
0006 using namespace std;
0007 using namespace dd4hep;
0008 using namespace cms;
0009 using namespace cms_units::operators;
0010
0011 static long algorithm(Detector& , cms::DDParsingContext& ctxt, xml_h e) {
0012 cms::DDNamespace ns(ctxt, e, true);
0013 DDAlgoArguments args(ctxt, e);
0014 Volume mother = ns.volume(args.parentName());
0015 vector<string> moduleName = args.value<vector<string> >("ModuleName");
0016 string iccName = args.value<string>("ICCName");
0017 int number = args.value<int>("Number");
0018 double startAngle = args.value<double>("StartAngle");
0019 double rModule = args.value<double>("ModuleR");
0020 vector<double> zModule = args.value<vector<double> >("ModuleZ");
0021 double rICC = args.value<double>("ICCR");
0022 double sICC = args.value<double>("ICCShift");
0023 vector<double> zICC = args.value<vector<double> >("ICCZ");
0024
0025 edm::LogVerbatim("TIDGeom") << "Parent " << mother.name() << "\tModule " << moduleName[0] << ", " << moduleName[1]
0026 << "\tICC " << iccName << "\tNameSpace " << ns.name();
0027 edm::LogVerbatim("TIDGeom") << "Parameters for positioning--"
0028 << " StartAngle " << convertRadToDeg(startAngle) << " Copy Numbers " << number
0029 << " Modules at R " << rModule << " Z " << zModule[0] << ", " << zModule[1]
0030 << " ICCs at R " << rICC << " Z " << zICC[0] << ", " << zICC[1];
0031 double theta = 90._deg;
0032 double phiy = 0._deg;
0033 double dphi = 2_pi / number;
0034
0035
0036 Volume icc = ns.volume(iccName);
0037 Volume mod0 = ns.volume(moduleName[0]);
0038 Volume mod1 = ns.volume(moduleName[1]);
0039 for (int i = 0; i < number; i++) {
0040
0041 double phiz = startAngle + i * dphi;
0042 double xpos = rModule * cos(phiz);
0043 double ypos = rModule * sin(phiz);
0044 double zpos, thetay, phix;
0045 Volume module;
0046 if (i % 2 == 0) {
0047 phix = phiz + 90._deg;
0048 thetay = 0._deg;
0049 zpos = zModule[0];
0050 module = mod0;
0051 } else {
0052 phix = phiz - 90._deg;
0053 thetay = 180._deg;
0054 zpos = zModule[1];
0055 module = mod1;
0056 }
0057
0058
0059 phix = phix - 180._deg;
0060 thetay = thetay + 180._deg;
0061
0062 Position trmod(xpos, ypos, zpos);
0063 Rotation3D rotation = makeRotation3D(theta, phix, thetay, phiy, theta, phiz);
0064
0065 mother.placeVolume(module, i + 1, Transform3D(rotation, trmod));
0066 edm::LogVerbatim("TIDGeom") << module.name() << " number " << i + 1 << " positioned in " << mother.name() << " at "
0067 << trmod << " with " << rotation;
0068
0069 if (i % 2 == 0) {
0070 zpos = zICC[0];
0071 xpos = rICC * cos(phiz) + sICC * sin(phiz);
0072 ypos = rICC * sin(phiz) - sICC * cos(phiz);
0073 } else {
0074 zpos = zICC[1];
0075 xpos = rICC * cos(phiz) - sICC * sin(phiz);
0076 ypos = rICC * sin(phiz) + sICC * cos(phiz);
0077 }
0078
0079 Position tricc(xpos, ypos, zpos);
0080 mother.placeVolume(icc, i + 1, Transform3D(rotation, tricc));
0081 edm::LogVerbatim("TIDGeom") << icc.name() << " number " << i + 1 << " positioned in " << mother.name() << " at "
0082 << tricc << " with " << rotation;
0083 }
0084 return 1;
0085 }
0086
0087
0088 DECLARE_DDCMS_DETELEMENT(DDCMS_track_DDTIDRingAlgo, algorithm)