CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_2_9/src/Alignment/CocoaModel/src/OptOCubeSplitter.cc

Go to the documentation of this file.
00001 //   COCOA class implementation file
00002 //Id:  OptOCubeSplitter.cc
00003 //CAT: Model
00004 //
00005 //   History: v1.0 
00006 //   Pedro Arce
00007 
00008 #include "Alignment/CocoaModel/interface/OptOCubeSplitter.h"
00009 #include "Alignment/CocoaModel/interface/LightRay.h"
00010 #include "Alignment/CocoaModel/interface/ALIPlane.h" 
00011 #include "Alignment/CocoaUtilities/interface/ALIUtils.h"
00012 #include "CLHEP/Units/GlobalSystemOfUnits.h"
00013 #ifdef COCOA_VIS
00014 #include "Alignment/IgCocoaFileWriter/interface/IgCocoaFileMgr.h"
00015 #include "Alignment/CocoaVisMgr/interface/ALIColour.h"
00016 #endif
00017 #include "Alignment/CocoaDDLObjects/interface/CocoaSolidShapeBox.h"
00018 #include "Alignment/CocoaUtilities/interface/GlobalOptionMgr.h"
00019 
00020 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00021 //@@ Fast simulation of deviation of the light ray:
00022 //@@ Reflect in a Cube Splitter
00023 //@@ The beam is reflected in the first plate of the Cube splitter, which is obtained without applying the rotation by 'wedge'. 
00024 //@@ After the beam is reflected, it is rotated around the splitter X axis by 'deviX' and around the Y axis by 'deviY'.
00025 //@@
00026 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00027 void OptOCubeSplitter::fastDeviatesLightRay( LightRay& lightray ) 
00028 {
00029   if (ALIUtils::debug >= 2) std::cout << "LR: FAST REFLECTION IN CUBE SPLITTER " << name() << std::endl;
00030 
00031   //---------- Get forward plate
00032   ALIPlane plate = getMiddlePlate();
00033   //---------- Reflect in plate (including intersection with it)
00034   lightray.reflect( plate );
00035   if (ALIUtils::debug >= 2) {
00036     lightray.dumpData("Reflected in plate"); 
00037   }
00038   //---------- Deviate Lightray 
00039   //  ALIdouble deviRX = findExtraEntryValue("deviRX");
00040   // ALIdouble deviRY = findExtraEntryValue("deviRY");
00041   //  lightray.shiftAndDeviateWhileTraversing( this, 0., 0., 0., deviRX, deviRY, 0.);
00042   lightray.shiftAndDeviateWhileTraversing( this, 'R' );
00043   if (ALIUtils::debug >= 2) {
00044     lightray.dumpData("Deviated ");
00045   }
00046   
00047 }
00048 
00049 
00050 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00051 //@@ Fast simulation of the light ray traversing
00052 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00053 //@@ Traverse Plane Parallel Plate 
00054 //@@ Traslated to the backward plate of the plate splitter
00055 //@@ Shifted in the splitter X direction by 'shiftX', and in the Y direction by 'shiftY' 
00056 //@@ and  rotated around the splitter X axis by 'deviX' and around the Y axis by 'deviY'.
00057 //@@
00058 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00059 void OptOCubeSplitter::fastTraversesLightRay( LightRay& lightray )
00060 {
00061   if (ALIUtils::debug >= 2) std::cout << "LR: FAST TRAVERSE CUBE SPLITTER  " << name() << std::endl;
00062   
00063   //---------- Get backward plate
00064   ALIPlane plate = getPlate(0, 0);
00065   lightray.intersect( plate );
00066   if (ALIUtils::debug >= 2) {
00067     lightray.dumpData("Intersected with plate"); 
00068   }
00069   //---------- Shift and Deviate
00070   lightray.shiftAndDeviateWhileTraversing( this, 'T');
00071   /*  ALIdouble shiftX = findExtraEntryValue("shiftX");
00072   ALIdouble shiftY = findExtraEntryValue("shiftY");
00073   ALIdouble deviTX = findExtraEntryValue("deviTX");
00074   ALIdouble deviTY = findExtraEntryValue("deviTY");
00075   lightray.shiftAndDeviateWhileTraversing( this, shiftX, shiftY, deviTX, deviTY);*/
00076 
00077   if (ALIUtils::debug >= 2) {
00078     lightray.dumpData("Shifted and Deviated");
00079   }
00080 
00081 }
00082 
00083 
00084 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00085 //@@ Detailed simulation of deviation of the light ray (reflection, shift, ...)
00086 
00087 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00088 //@@ Detailed simulation of Reflection in Cube Splitter
00089 //@@ The software gets the plane of entering as the forward splitter plane and the beam is refracted
00090 //@@ The software gets the plane of reflection as the middle splitter plane
00091 //@@ The beam is reflected in this plane.
00092 //@@ The beam is refracted at exiting 
00093 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00094 void OptOCubeSplitter::detailedDeviatesLightRay( LightRay& lightray )
00095 {
00096   if (ALIUtils::debug >= 2) std::cout << "LR: DETAILED REFLECTION IN CUBE SPLITTER " << name() << std::endl;
00097 
00098   if(ALIUtils::debug >= 2) ALIUtils::dump3v( centreGlob(), "centreGlob");
00099   //---------- Get first plate
00100   if (ALIUtils::debug >= 3) std::cout << "%%%%% refracting at entering first plate " << std::endl; 
00101   if (ALIUtils::debug >= 3) std::cout << "%%% getting first plate " << std::endl; 
00102   ALIPlane plate = getPlate(1, 1);
00103 
00104   //---------- Refract  
00105   ALIdouble refra_ind1 = 1.;
00106   ALIdouble refra_ind2 = findExtraEntryValue("refra_ind");
00107   lightray.refract( plate, refra_ind1, refra_ind2 );
00108 
00109   //---------- Get middle plate
00110   if (ALIUtils::debug >= 3) std::cout << "%%%%% reflecting in middle plate " << std::endl; 
00111   if (ALIUtils::debug >= 3) std::cout << "%%% getting middle plate " << std::endl; 
00112   plate = getMiddlePlate();
00113 
00114   //---------- Reflect
00115   lightray.reflect( plate );
00116   if (ALIUtils::debug >= 2) {
00117     lightray.dumpData("Reflected in plate"); 
00118   }
00119 
00120   //--------- Get upper plate
00121   if (ALIUtils::debug >= 3) std::cout << "%%%%% getting second plate " << std::endl; 
00122   plate = getUpperPlate();
00123   if (ALIUtils::debug >= 3) std::cout << "%%%%% refracting at exiting second plate " << std::endl; 
00124   lightray.refract( plate, refra_ind2, refra_ind1 );
00125 
00126  if (ALIUtils::debug >= 2) {
00127     lightray.dumpData("After CubeSplitter"); 
00128   }
00129 
00130 }
00131 
00132 
00133 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00134 //@@ Detailed simulation of the light ray traversing
00135 //@@  The beam enters the splitter, is refracted, traverses the splitter and finally is again refracted when it exits:
00136 //@@ Get the intersection with the forward splitter plane
00137 //@@ Refract the beam and propagate until it intersects the backward splitter plane.
00138 //@@ Finally the beam is refracted again.
00139 //@@
00140 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00141 void OptOCubeSplitter::detailedTraversesLightRay( LightRay& lightray )
00142 {
00143   if (ALIUtils::debug >= 2) std::cout << "LR: DETAILED TRAVERSE CUBE SPLITTER " << name() << std::endl;
00144 
00145   //---------- Get forward plate
00146   ALIPlane plate = getPlate(1, 1);
00147 
00148   //---------- Refract while entering splitter
00149   ALIdouble refra_ind1 = 1.;
00150   ALIdouble refra_ind2 = findExtraEntryValue("refra_ind");
00151   lightray.refract( plate, refra_ind1, refra_ind2 );
00152   if (ALIUtils::debug >= 2) {
00153     lightray.dumpData("Refracted in first plate"); 
00154   }
00155 
00156   //---------- Get backward plate
00157   plate = getPlate(0, 1);
00158   //---------- Refract while exiting splitter
00159   lightray.refract( plate, refra_ind2, refra_ind1 );
00160   if (ALIUtils::debug >= 2) {
00161     lightray.dumpData("Refracted in first plate"); 
00162   }
00163 
00164 }
00165 
00166 
00167 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00168 //@@ Get the middle semitransparent plate of a Cube Splittter
00169 //@@ The point is defined taking the centre of the splitter, 
00170 //@@ The normal of this plane is obtained as the splitter Z rotated 45o around X
00171 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00172 ALIPlane OptOCubeSplitter::getMiddlePlate()
00173 {
00174   if (ALIUtils::debug >= 4) std::cout << "%%% LR: GET MIDDLE PLATE " << name() << std::endl;
00175   //---------- Get centre and normal of plate
00176   //----- plate normal before wedge (Z axis of OptO)
00177   ALIdouble anglePlanes;
00178   ALIbool angpl = findExtraEntryValueIfExists("anglePlanes", anglePlanes);
00179   if( !angpl ) {
00180     anglePlanes = acos(0.)/2.;  //default is 45o  !!! this creates problem in 'isr_medidas_globales.txt': laser goes along X and does not intersect cube if angles Y 0, anglePlanes 45 
00181     if (ALIUtils::debug >= 4) std::cout << "anglePlanes default = " << anglePlanes/deg << std::endl;
00182   }
00183   CLHEP::Hep3Vector Axis(0., 0., 1.);
00184   CLHEP::Hep3Vector XAxis(1., 0., 0.);
00185   Axis.rotate( anglePlanes, XAxis);
00186   CLHEP::HepRotation rmt = rmGlob();
00187   CLHEP::Hep3Vector plate_normal = rmt*Axis;
00188   if (ALIUtils::debug >= 3) { 
00189     ALIUtils::dumprm( rmt, "rmt before wedge angles" );
00190     ALIUtils::dump3v( plate_normal, "plate_normal before wedge");
00191   }
00192   //----- plate centre = OptO 
00193   CLHEP::Hep3Vector plate_point = centreGlob();
00194 
00195   //---------- Return plate plane
00196   return ALIPlane(plate_point, plate_normal);
00197 
00198 }
00199 
00200 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00201 //@@ Get the upper plate of a Cube Splittter
00202 //@@ The point is defined taking the centre of the splitter, 
00203 //@@ The normal of this plane is obtained as the splitter Z rotated 45o around X
00204 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00205 ALIPlane OptOCubeSplitter::getUpperPlate()
00206 {
00207   if (ALIUtils::debug >= 4) std::cout << "LR: GET UPPER PLATE " << name() << std::endl;
00208   //---------- Get centre and normal of plate
00209   ALIdouble width = findExtraEntryValue("width");
00210   //----- plate normal before wedge (Y axis of OptO)
00211   CLHEP::Hep3Vector Axis(0., 1., 0.);
00212   CLHEP::HepRotation rmt = rmGlob();
00213   CLHEP::Hep3Vector plate_normal = rmt*Axis;
00214   if (ALIUtils::debug >= 3) { 
00215     ALIUtils::dumprm( rmt, "rmt before wedge angles" );
00216     ALIUtils::dump3v( plate_normal, "plate_normal before wedge");
00217   }
00218   //----- plate centre = OptO centre +1/2 width in Y direction 
00219   CLHEP::Hep3Vector plate_point = centreGlob();
00220   plate_point += width/2. * plate_normal;
00221 
00222   //---------- Return plate plane
00223   return ALIPlane(plate_point, plate_normal);
00224 
00225 }
00226 
00227 
00228 #ifdef COCOA_VIS
00229 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00230 void OptOCubeSplitter::fillIguana()
00231 {
00232   ALIColour* col = new ALIColour( 0., 0., 0., 0. );
00233   ALIdouble width;
00234   ALIbool wexists = findExtraEntryValueIfExists("width",width);
00235   if( !wexists ) width = 4.;
00236 
00237   std::vector<ALIdouble> spar;
00238   spar.push_back(width);
00239   spar.push_back(width);
00240   spar.push_back(width);
00241   IgCocoaFileMgr::getInstance().addSolid( *this, "BOX", spar, col);
00242 }
00243 #endif
00244 
00245 
00246 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00247 void OptOCubeSplitter::constructSolidShape()
00248 {
00249   ALIdouble go;
00250   GlobalOptionMgr* gomgr = GlobalOptionMgr::getInstance();
00251   gomgr->getGlobalOptionValue("VisScale", go );
00252 
00253   theSolidShape = new CocoaSolidShapeBox( "Box", go*5.*cm/m, go*5.*cm/m, go*5.*cm/m ); //COCOA internal units are meters
00254 }