Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 11:56:03

0001 //  COCOA class implementation file

0002 //Id:  OptOMOdifiedRhomboidPrism.cc

0003 //CAT: Model

0004 //

0005 //   History: v0.9 Dec 1999

0006 //   Pedro Arce

0007 
0008 #include "Alignment/CocoaModel/interface/OptOModifiedRhomboidPrism.h"
0009 #include "Alignment/CocoaModel/interface/LightRay.h"
0010 #include "Alignment/CocoaModel/interface/ALIPlane.h"
0011 #include "Alignment/CocoaModel/interface/Measurement.h"
0012 #include <iostream>
0013 #include <iomanip>
0014 #ifdef COCOA_VIS
0015 #include "Alignment/IgCocoaFileWriter/interface/IgCocoaFileMgr.h"
0016 #include "Alignment/CocoaVisMgr/interface/ALIColour.h"
0017 #endif
0018 #include "Alignment/CocoaDDLObjects/interface/CocoaSolidShapeBox.h"
0019 #include "Alignment/CocoaUtilities/interface/GlobalOptionMgr.h"
0020 
0021 using namespace CLHEP;
0022 
0023 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

0024 //@@ Detailed simulation of Reflection in Plate Splitter

0025 //@@ The software gets the plane of reflection as the forward splitter plane

0026 //@@ Then the beam is reflected in this plane.

0027 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

0028 void OptOModifiedRhomboidPrism::detailedDeviatesLightRay(LightRay& lightray) {
0029   if (ALIUtils::debug >= 2)
0030     std::cout << "$$$$$ LR: DETAILED DEVIATION IN MODIFIED RHOMBOID PRISM " << name() << std::endl;
0031 
0032   CLHEP::Hep3Vector XAxis(1., 0., 0.);
0033   CLHEP::HepRotation rmt = rmGlob();
0034   XAxis = rmt * XAxis;
0035   CLHEP::Hep3Vector YAxis(0., 1., 0.);
0036   YAxis = rmt * YAxis;
0037   CLHEP::Hep3Vector ZAxis(0., 0., 1.);
0038   ZAxis = rmt * ZAxis;
0039 
0040   ALIUtils::dump3v(XAxis, " x axis ");
0041   ALIUtils::dump3v(YAxis, " y axis ");
0042   ALIUtils::dump3v(ZAxis, " z axis ");
0043   if (ALIUtils::debug >= 5) {
0044     ALIUtils::dump3v(centreGlob(), " centre ");
0045   }
0046 
0047   if (ALIUtils::debug >= 2)
0048     std::cout << "$$$ LR: REFRACTION IN FORWARD PLATE " << std::endl;
0049   //---------- Get forward plate

0050   ALIPlane plate = getPlate(true, true);
0051   //---------- Refract in plate while entering

0052   ALIdouble refra_ind1 = 1.;
0053   ALIdouble refra_ind2 = findExtraEntryValueMustExist("refra_ind");
0054   lightray.refract(plate, refra_ind1, refra_ind2);
0055   if (ALIUtils::debug >= 2) {
0056     lightray.dumpData("LightRay after Refraction at entering: ");
0057   }
0058 
0059   if (ALIUtils::debug >= 2)
0060     std::cout << std::endl << "$$$ LR: REFLECTION IN FIRST PLATE " << std::endl;
0061   //---------- Get up plate rotated

0062   plate = getRotatedPlate(true);
0063   //---------- Reflect in plate

0064   lightray.reflect(plate);
0065 
0066   if (ALIUtils::debug >= 2)
0067     std::cout << std::endl << "$$$ LR: REFLECTION IN SECOND PLATE " << std::endl;
0068   //---------- Get up plate rotated

0069   plate = getRotatedPlate(false);
0070   //---------- Reflect in plate

0071   lightray.reflect(plate);
0072 
0073   if (ALIUtils::debug >= 2)
0074     std::cout << std::endl << "$$$ LR: REFRACTION IN BACKWARD PLATE " << std::endl;
0075   //---------- Get backward plate

0076   plate = getPlate(false, true);
0077   //---------- Refract in plate while exiting

0078   lightray.refract(plate, refra_ind2, refra_ind1);
0079 }
0080 
0081 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

0082 //@@ Detailed simulation of the light ray traversing

0083 //@@  The beam enters the prism, is refracted, traverses the prism and finally is again refracted when it exits:

0084 //@@ Get the intersection with the forward prism plane

0085 //@@ Refract the beam and propagate until it intersects the backward plane.

0086 //@@ Finally the beam is refracted again.

0087 //@@

0088 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

0089 void OptOModifiedRhomboidPrism::detailedTraversesLightRay(LightRay& lightray) {
0090   if (ALIUtils::debug >= 2)
0091     std::cout << "LR: DETAILED TRAVERSE MODIFIED RHOMBOID PRISM " << name() << std::endl;
0092 
0093   //---------- Get forward plate

0094   ALIPlane plate = getPlate(true, true);
0095   //---------- Refract while entering splitter

0096   ALIdouble refra_ind1 = 1.;
0097   ALIdouble refra_ind2 = findExtraEntryValueMustExist("refra_ind");
0098   lightray.refract(plate, refra_ind1, refra_ind2);
0099   if (ALIUtils::debug >= 2) {
0100     lightray.dumpData("Refracted in first plate");
0101   }
0102 
0103   //---------- Get back ward plate (of triangular piiece)

0104   plate = getPlate(true, false);
0105   //---------- Refract while exiting prism

0106   lightray.refract(plate, refra_ind2, refra_ind1);
0107   if (ALIUtils::debug >= 2) {
0108     lightray.dumpData("Refracted in first plate");
0109   }
0110 }
0111 
0112 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

0113 //@@ Fast simulation of deviation of the light ray:

0114 //@@ Reflect in a Plate Splitter

0115 //@@ The beam is reflected in the first plate of the plate splitter, which is obtained without applying the rotation by 'wedge'.

0116 //@@ After the beam is reflected, it is rotated around the splitter X axis by 'deviX' and around the Y axis by 'deviY'.

0117 //@@

0118 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

0119 void OptOModifiedRhomboidPrism::fastDeviatesLightRay(LightRay& lightray) {
0120   if (ALIUtils::debug >= 2)
0121     std::cout << "LR: FAST REFLECTION IN MODIFIED RHOMBOID PRISM " << name() << std::endl;
0122 
0123   //---------- Get backward plate

0124   ALIPlane plate = getPlate(false, false);
0125   //---------- Intersect with plate

0126   lightray.intersect(plate);
0127   if (ALIUtils::debug >= 2) {
0128     lightray.dumpData("Intersected in plate");
0129   }
0130   //---------- Deviate Lightray

0131   lightray.shiftAndDeviateWhileTraversing(this, 'R');
0132   /*  ALIdouble deviRX = findExtraEntryValue("deviRX");

0133   ALIdouble deviRY = findExtraEntryValue("deviRY");

0134   ALIdouble shiftRX = findExtraEntryValue("shiftRX");

0135   ALIdouble shiftRY = findExtraEntryValue("shiftRY");

0136   lightray.shiftAndDeviateWhileTraversing( this, shiftRX, shiftRY, deviRX, deviRY);

0137   */
0138 
0139   if (ALIUtils::debug >= 2) {
0140     //    std::cout << " shiftRX " << shiftRX << " shiftRY " << shiftRY << std::endl;

0141     //   std::cout << " deviRX " << deviRX << " deviRY " << deviRY << std::endl;

0142     lightray.dumpData("Deviated ");
0143   }
0144 }
0145 
0146 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

0147 //@@ Fast simulation of the light ray traversing

0148 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

0149 //@@ Traverse Plane Parallel Plate

0150 //@@ Traslated to the backward plate of the plate splitter

0151 //@@ Shifted in the splitter X direction by 'shiftX', and in the Y direction by 'shiftY'

0152 //@@ and  rotated around the splitter X axis by 'deviX' and around the Y axis by 'deviY'.

0153 //@@

0154 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

0155 void OptOModifiedRhomboidPrism::fastTraversesLightRay(LightRay& lightray) {
0156   if (ALIUtils::debug >= 2)
0157     std::cout << "LR: FAST TRAVERSE MODIFIED RHOMBOID PRISM " << name() << std::endl;
0158 
0159   //---------- Get backward plate

0160   ALIPlane plate = getPlate(false, false);
0161   lightray.intersect(plate);
0162   if (ALIUtils::debug >= 2) {
0163     lightray.dumpData("Intersected with plate");
0164   }
0165   //---------- Shift and Deviate

0166   lightray.shiftAndDeviateWhileTraversing(this, 'T');
0167   /*  ALIdouble shiftTX = findExtraEntryValue("shiftTX");

0168   ALIdouble shiftTY = findExtraEntryValue("shiftTY");

0169   ALIdouble deviTX = findExtraEntryValue("deviTX");

0170   ALIdouble deviTY = findExtraEntryValue("deviTY");

0171   lightray.shiftAndDeviateWhileTraversing( this, shiftTX, shiftTY, deviTX, deviTY);*/
0172 
0173   if (ALIUtils::debug >= 2) {
0174     lightray.dumpData("Shifted and Deviated");
0175   }
0176 }
0177 
0178 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

0179 //@@ Get one of the rotated plates of an OptO

0180 //@@

0181 //@@ The point is defined taking the centre of the prism,

0182 //@@ and traslating it by +/-1/2 'shift' in the direction of the splitter Z.

0183 //@@ The normal of this plane is obtained as the splitter Z,

0184 //@@ and then it is rotated around X by 'angle' and with the global rotation matrix.

0185 //@@ It is also rotated around the splitter X and Y axis by +/-1/2 of the 'wedgeR'.

0186 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

0187 ALIPlane OptOModifiedRhomboidPrism::getRotatedPlate(const ALIbool forwardPlate) {
0188   if (ALIUtils::debug >= 4)
0189     std::cout << "% LR: GET ROTATED PLATE " << name() << std::endl;
0190   //---------- Get OptO variables

0191   const ALIdouble shift = (findExtraEntryValue("shiftRY"));
0192   ALIdouble wedgeR = findExtraEntryValue("wedgeR");
0193 
0194   //---------- Get centre of plate

0195   //----- plate centre = OptO centre +/- 1/2 shift

0196   CLHEP::Hep3Vector plate_point = centreGlob();
0197   //--- Add to it half of the shift following the direction of the prism Y. -1/2 if it is forward plate, +1/2 if it is backward plate

0198   ALIdouble normal_sign = -forwardPlate * 2 + 1;
0199   CLHEP::Hep3Vector YAxis(0., 1., 0.);
0200   CLHEP::HepRotation rmt = rmGlob();
0201   YAxis = rmt * YAxis;
0202   plate_point += normal_sign * shift / 2. * YAxis;
0203 
0204   //---------- Get normal of plate

0205   //----- Plate normal before wedgeR (Z axis of OptO rotated 'angle' around X)

0206   CLHEP::Hep3Vector ZAxis(0., 0., 1.);
0207   ALIdouble anglePlanes;
0208   ALIbool we = findExtraEntryValueIfExists("anglePlanes", anglePlanes);
0209   if (!we) {
0210     anglePlanes = 45. * ALIUtils::deg;
0211   }
0212   ZAxis.rotateX(anglePlanes);
0213 
0214   //----- Rotate with global rotation matrix

0215   CLHEP::Hep3Vector plate_normal = rmt * ZAxis;
0216   if (ALIUtils::debug >= 3) {
0217     ALIUtils::dump3v(plate_point, "plate_point");
0218     ALIUtils::dump3v(plate_normal, "plate_normal before wedge");
0219     ALIUtils::dumprm(rmt, "rmt before wedge angles");
0220   }
0221 
0222   //----- Rotate plate normal by 1/2 wedgeR angles

0223   //--- Around X axis

0224   CLHEP::Hep3Vector XAxis(0., 0., 1.);
0225   XAxis = rmt * XAxis;
0226   plate_normal.rotate(normal_sign * wedgeR / 2., XAxis);
0227   if (ALIUtils::debug >= 3)
0228     ALIUtils::dump3v(plate_normal, "plate_normal after wedgeR around X ");
0229   //--- Around the axis obtained rotating the prism Y axis by 'anglePlanes' around the prism X axis

0230   YAxis = CLHEP::Hep3Vector(0., 1., 0.);
0231   YAxis.rotateX(anglePlanes);
0232   YAxis = rmt * YAxis;
0233   plate_normal.rotate(normal_sign * wedgeR / 2., YAxis);
0234   if (ALIUtils::debug >= 3)
0235     ALIUtils::dump3v(plate_normal, "plate_normal after wedgeR around Y ");
0236 
0237   //---------- Return plate plane

0238   return ALIPlane(plate_point, plate_normal);
0239 }
0240 
0241 #ifdef COCOA_VIS
0242 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

0243 void OptOModifiedRhomboidPrism::fillIguana() {
0244   ALIColour* col = new ALIColour(0., 0., 1., 0.);
0245   ALIdouble width;
0246   ALIbool wexists = findExtraEntryValueIfExists("width", width);
0247   if (!wexists)
0248     width = 1.;
0249   ALIdouble shift;
0250   wexists = findExtraEntryValueIfExists("shift", shift);
0251   if (!wexists)
0252     shift = 4.;
0253   std::vector<ALIdouble> spar;
0254   spar.push_back(shift);
0255   spar.push_back(shift);
0256   spar.push_back(width);
0257   spar.push_back(0.);
0258   spar.push_back(45.);
0259   spar.push_back(0.);
0260   IgCocoaFileMgr::getInstance().addSolid(*this, "PARAL", spar, col);
0261   //add a triangle

0262   std::vector<ALIdouble> spar2;
0263   spar2.push_back(width);
0264   spar2.push_back(width);
0265   spar2.push_back(0.);
0266   spar2.push_back(width);
0267   spar2.push_back(width);
0268   IgCocoaFileMgr::getInstance().addSolid(*this, "TRD", spar2, col);
0269 }
0270 
0271 #endif
0272 
0273 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

0274 void OptOModifiedRhomboidPrism::constructSolidShape() {
0275   ALIdouble go;
0276   GlobalOptionMgr* gomgr = GlobalOptionMgr::getInstance();
0277   gomgr->getGlobalOptionValue("VisScale", go);
0278 
0279   theSolidShape = new CocoaSolidShapeBox(
0280       "Box", go * 5. * cm / m, go * 5. * cm / m, go * 5. * cm / m);  //COCOA internal units are meters

0281 }