#include <DDHCalTBCableAlgo.h>
Public Member Functions | |
DDHCalTBCableAlgo () | |
void | execute (DDCompactView &cpv) |
void | initialize (const DDNumericArguments &nArgs, const DDVectorArguments &vArgs, const DDMapArguments &mArgs, const DDStringArguments &sArgs, const DDStringVectorArguments &vsArgs) |
virtual | ~DDHCalTBCableAlgo () |
Private Attributes | |
std::string | absMat |
double | gap2 |
std::string | genMat |
std::string | idName |
std::string | idNameSpace |
double | length1 |
double | length2 |
int | nhalf |
int | nsectors |
int | nsectortot |
double | rin |
std::vector< double > | rmax |
std::string | rotns |
std::vector< double > | theta |
double | thick |
double | width1 |
double | width2 |
std::vector< double > | zoff |
Definition at line 10 of file DDHCalTBCableAlgo.h.
DDHCalTBCableAlgo::DDHCalTBCableAlgo | ( | ) |
DDHCalTBCableAlgo::~DDHCalTBCableAlgo | ( | ) | [virtual] |
Definition at line 25 of file DDHCalTBCableAlgo.cc.
{}
void DDHCalTBCableAlgo::execute | ( | DDCompactView & | cpv | ) |
Definition at line 71 of file DDHCalTBCableAlgo.cc.
References absMat, alpha, DDSolidFactory::box(), funct::cos(), dbl_to_string(), DDBase< N, C >::ddname(), DDrot(), DDSplit(), first, gap2, genMat, i, idName, idNameSpace, length1, length2, LogDebug, AlCaRecoCosmics_cfg::name, DDBase< N, C >::name(), nhalf, nsectors, nsectortot, dbtoconf::parent, phi, pi, DDSolidFactory::polyhedra(), DDCompactView::position(), rin, rmax, rotns, edm::second(), funct::sin(), funct::tan(), theta, thick, DDSolidFactory::trap(), width1, width2, and zoff.
{ LogDebug("HCalGeom") << "==>> Constructing DDHCalTBCableAlgo..."; unsigned int i=0; double alpha = CLHEP::pi/nsectors; double dphi = nsectortot*CLHEP::twopi/nsectors; double zstep0 = zoff[1]+rmax[1]*tan(theta[1])+(rin-rmax[1])*tan(theta[2]); double zstep1 = zstep0+thick/cos(theta[2]); double zstep2 = zoff[3]; double rstep0 = rin + (zstep2-zstep1)/tan(theta[2]); double rstep1 = rin + (zstep1-zstep0)/tan(theta[2]); vector<double> pgonZ; pgonZ.push_back(zstep0); pgonZ.push_back(zstep1); pgonZ.push_back(zstep2); pgonZ.push_back(zstep2+thick/cos(theta[2])); vector<double> pgonRmin; pgonRmin.push_back(rin); pgonRmin.push_back(rin); pgonRmin.push_back(rstep0); pgonRmin.push_back(rmax[2]); vector<double> pgonRmax; pgonRmax.push_back(rin); pgonRmax.push_back(rstep1); pgonRmax.push_back(rmax[2]); pgonRmax.push_back(rmax[2]); string name("Null"); DDSolid solid; solid = DDSolidFactory::polyhedra(DDName(idName, idNameSpace), nsectortot, -alpha, dphi, pgonZ, pgonRmin, pgonRmax); LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: " << DDName(idName,idNameSpace) << " Polyhedra made of " << genMat << " with " << nsectortot << " sectors from " << -alpha/CLHEP::deg << " to " << (-alpha+dphi)/CLHEP::deg << " and with " << pgonZ.size() << " sections"; for (i = 0; i <pgonZ.size(); i++) LogDebug("HCalGeom") << "\t\tZ = " << pgonZ[i] << "\tRmin = " << pgonRmin[i] << "\tRmax = " << pgonRmax[i]; DDName matname(DDSplit(genMat).first, DDSplit(genMat).second); DDMaterial matter(matname); DDLogicalPart genlogic(solid.ddname(), matter, solid); DDName parentName = parent().name(); DDTranslation r0(0.0, 0.0, 0.0); DDRotation rot; cpv.position(DDName(idName, idNameSpace), parentName, 1, r0, rot); LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: " << DDName(idName,idNameSpace) << " number 1 positioned " << "in " << parentName << " at " << r0 << " with "<<rot; if (nhalf != 1) { rot = DDRotation(DDName("180D", rotns)); cpv.position(DDName(idName, idNameSpace), parentName, 2, r0, rot); LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: " << DDName(idName,idNameSpace) <<" number 2 positioned" << "in " << parentName << " at " << r0 << " with " << rot; } //Construct sector (from -alpha to +alpha) name = idName + "Module"; LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: " << DDName(name,idNameSpace) << " Polyhedra made of " << genMat << " with 1 sector from " <<-alpha/CLHEP::deg << " to " << alpha/CLHEP::deg << " and with " << pgonZ.size() << " sections"; for (i = 0; i < pgonZ.size(); i++) LogDebug("HCalGeom") << "\t\tZ = " << pgonZ[i] << "\tRmin = " << pgonRmin[i] << "\tRmax = " << pgonRmax[i]; solid = DDSolidFactory::polyhedra(DDName(name, idNameSpace), 1, -alpha, 2*alpha, pgonZ, pgonRmin, pgonRmax); DDLogicalPart seclogic(solid.ddname(), matter, solid); for (int ii=0; ii<nsectortot; ii++) { double phi = ii*2*alpha; double phideg = phi/CLHEP::deg; DDRotation rotation; string rotstr("NULL"); if (phideg != 0) { rotstr = "R"; if (phideg < 100) rotstr = "R0"; rotstr = rotstr + dbl_to_string(phideg); rotation = DDRotation(DDName(rotstr, rotns)); if (!rotation) { LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: Creating a new " << "rotation " << rotstr << "\t90," << phideg << ", 90, " << (phideg+90) << ", 0, 0"; rotation = DDrot(DDName(rotstr, idNameSpace), 90*CLHEP::deg, phideg*CLHEP::deg, 90*CLHEP::deg, (90+phideg)*CLHEP::deg, 0*CLHEP::deg, 0*CLHEP::deg); } } cpv.position(seclogic, genlogic, ii+1, DDTranslation(0.0, 0.0, 0.0), rotation); LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: " << seclogic.name() << " number " << ii+1 << " positioned in " << genlogic.name() << " at (0,0,0) with " << rotation; } //Now a trapezoid of air double rinl = pgonRmin[0] + thick * sin(theta[2]); double routl = pgonRmax[2] - thick * sin(theta[2]); double dx1 = rinl * tan(alpha); double dx2 = 0.90 * routl * tan(alpha); double dy = 0.50 * thick; double dz = 0.50 * (routl -rinl); name = idName + "Trap"; solid = DDSolidFactory::trap(DDName(name, idNameSpace), dz, 0, 0, dy, dx1, dx1, 0, dy, dx2, dx2, 0); LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: " << solid.name() <<" Trap made of " << genMat << " of dimensions " << dz << ", 0, 0, " << dy << ", " << dx1 << ", " << dx1 << ", 0, " << dy << ", " << dx2 << ", " << dx2 <<", 0"; DDLogicalPart glog(solid.ddname(), matter, solid); string rotstr = name; LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: Creating a new rotation: " << rotstr << "\t90, 270, " << (180-theta[2]/CLHEP::deg) << ", 0, " << (90-theta[2]/CLHEP::deg) << ", 0"; rot = DDrot(DDName(rotstr, idNameSpace), 90*CLHEP::deg, 270*CLHEP::deg, 180*CLHEP::deg-theta[2], 0, 90*CLHEP::deg-theta[2], 0); DDTranslation r1(0.5*(rinl+routl), 0, 0.5*(pgonZ[1]+pgonZ[2])); cpv.position(glog, seclogic, 1, r1, rot); LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: " << glog.name() << " number 1 positioned in " << seclogic.name() << " at " << r1 << " with " << rot; //Now the cable of type 1 name = idName + "Cable1"; double phi = atan((dx2-dx1)/(2*dz)); double xmid = 0.5*(dx1+dx2)-1.0; solid = DDSolidFactory::box(DDName(name, idNameSpace), 0.5*width1, 0.5*thick, 0.5*length1); LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: " << solid.name() << " Box made of " << absMat << " of dimension " << 0.5*width1 << ", " << 0.5*thick << ", " << 0.5*length1; DDName absname(DDSplit(absMat).first, DDSplit(absMat).second); DDMaterial absmatter(absname); DDLogicalPart cablog1(solid.ddname(), absmatter, solid); rotstr = idName + "Left"; LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: Creating a new rotation " << rotstr << "\t" << (90+phi/CLHEP::deg) << "," << 0 << "," << 90 << "," << 90 << "," << phi/CLHEP::deg << "," << 0; DDRotation rot2 = DDrot(DDName(rotstr, idNameSpace), 90*CLHEP::deg+phi, 0.0, 90*CLHEP::deg, 90*CLHEP::deg, phi, 0.0); DDTranslation r2((xmid-0.5*width1*cos(phi)), 0, 0); cpv.position(cablog1, glog, 1, r2, rot2); LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: " << cablog1.name() << " number 1 positioned in " << glog.name() << " at " << r2 << " with " << rot2; rotstr = idName + "Right"; LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: Creating a new rotation " << rotstr << "\t" << (90-phi/CLHEP::deg) << ", 0, 90, 90, " << -phi/CLHEP::deg << ", 0"; DDRotation rot3 = DDrot(DDName(rotstr, idNameSpace), 90*CLHEP::deg-phi, 0*CLHEP::deg, 90*CLHEP::deg, 90*CLHEP::deg, -phi, 0*CLHEP::deg); DDTranslation r3(-(xmid-0.5*width1*cos(phi)), 0, 0); cpv.position(cablog1, glog, 2, r3, rot3); LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: " << cablog1.name() << " number 2 positioned in " << glog.name() << " at " << r3 << " with " << rot3; //Now the cable of type 2 name = idName + "Cable2"; solid = DDSolidFactory::box(DDName(name, idNameSpace), 0.5*width2, 0.5*thick, 0.5*length2); LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: " << solid.name() << " Box made of " << absMat << " of dimension " << 0.5*width2 << ", " << 0.5*thick << ", "<<0.5*length2; DDLogicalPart cablog2(solid.ddname(), absmatter, solid); double xpos = 0.5*(width2+gap2); cpv.position(cablog2, glog, 1, DDTranslation(xpos, 0.0, 0.0), DDRotation()); LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: " << cablog2.name() << " number 1 positioned in " << glog.name() << " at (" << xpos << ", 0, 0) with no rotation"; cpv.position(cablog2, glog, 2, DDTranslation(-xpos, 0.0, 0.0), DDRotation()); LogDebug("HCalGeom") << "DDHCalTBCableAlgo test: " << cablog2.name() << " number 2 positioned in " << glog.name() << " at (" <<-xpos << ", 0, 0) with no rotation"; LogDebug("HCalGeom") << "<<== End of DDHCalTBCableAlgo construction ..."; }
void DDHCalTBCableAlgo::initialize | ( | const DDNumericArguments & | nArgs, |
const DDVectorArguments & | vArgs, | ||
const DDMapArguments & | mArgs, | ||
const DDStringArguments & | sArgs, | ||
const DDStringVectorArguments & | vsArgs | ||
) |
Definition at line 28 of file DDHCalTBCableAlgo.cc.
References absMat, gap2, genMat, i, idName, idNameSpace, length1, length2, LogDebug, nhalf, DDCurrentNamespace::ns(), nsectors, nsectortot, dbtoconf::parent, rin, rmax, rotns, theta, thick, width1, width2, and zoff.
{ genMat = sArgs["MaterialName"]; nsectors = int (nArgs["NSector"]); nsectortot = int (nArgs["NSectorTot"]); nhalf = int (nArgs["NHalf"]); rin = nArgs["RIn"]; theta = vArgs["Theta"]; rmax = vArgs["RMax"]; zoff = vArgs["ZOff"]; absMat = sArgs["AbsMatName"]; thick = nArgs["Thickness"]; width1 = nArgs["Width1"]; length1 = nArgs["Length1"]; width2 = nArgs["Width2"]; length2 = nArgs["Length2"]; gap2 = nArgs["Gap2"]; LogDebug("HCalGeom") << "DDHCalTBCableAlgo debug: General material " << genMat << "\tSectors " << nsectors << ", " << nsectortot << "\tHalves " << nhalf << "\tRin " <<rin; for (unsigned int i = 0; i < theta.size(); i++) LogDebug("HCalGeom") << "\t" << i << " Theta " << theta[i] << " rmax " << rmax[i] << " zoff " << zoff[i]; LogDebug("HCalGeom") << "\tCable mockup made of " << absMat << "\tThick " << thick << "\tLength and width " << length1 << ", " << width1 <<" and " << length2 << ", " << width2 << " Gap " << gap2; idName = sArgs["MotherName"]; idNameSpace = DDCurrentNamespace::ns(); rotns = sArgs["RotNameSpace"]; DDName parentName = parent().name(); LogDebug("HCalGeom") << "DDHCalTBCableAlgo debug: Parent " << parentName << " idName " << idName << " NameSpace " << idNameSpace << " for solids etc. and " << rotns << " for rotations"; }
std::string DDHCalTBCableAlgo::absMat [private] |
Definition at line 34 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
double DDHCalTBCableAlgo::gap2 [private] |
Definition at line 38 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
std::string DDHCalTBCableAlgo::genMat [private] |
Definition at line 26 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
std::string DDHCalTBCableAlgo::idName [private] |
Definition at line 40 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
std::string DDHCalTBCableAlgo::idNameSpace [private] |
Definition at line 41 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
double DDHCalTBCableAlgo::length1 [private] |
Definition at line 36 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
double DDHCalTBCableAlgo::length2 [private] |
Definition at line 37 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
int DDHCalTBCableAlgo::nhalf [private] |
Definition at line 29 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
int DDHCalTBCableAlgo::nsectors [private] |
Definition at line 27 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
int DDHCalTBCableAlgo::nsectortot [private] |
Definition at line 28 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
double DDHCalTBCableAlgo::rin [private] |
Definition at line 30 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
std::vector<double> DDHCalTBCableAlgo::rmax [private] |
Definition at line 32 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
std::string DDHCalTBCableAlgo::rotns [private] |
Definition at line 42 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
std::vector<double> DDHCalTBCableAlgo::theta [private] |
Definition at line 31 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
double DDHCalTBCableAlgo::thick [private] |
Definition at line 35 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
double DDHCalTBCableAlgo::width1 [private] |
Definition at line 36 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
double DDHCalTBCableAlgo::width2 [private] |
Definition at line 37 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().
std::vector<double> DDHCalTBCableAlgo::zoff [private] |
Definition at line 33 of file DDHCalTBCableAlgo.h.
Referenced by execute(), and initialize().