CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_4/src/Alignment/CocoaModel/src/OptOPlateSplitter.cc

Go to the documentation of this file.
00001 //   COCOA class implementation file
00002 //Id:  OptOPlateSplitter.cc
00003 //CAT: Model
00004 //
00005 //   History: v1.0 
00006 //   Pedro Arce
00007 
00008 #include "Alignment/CocoaModel/interface/OptOPlateSplitter.h"
00009 #include "Alignment/CocoaModel/interface/LightRay.h"
00010 #include "Alignment/CocoaModel/interface/ALIPlane.h"
00011 #include "Alignment/CocoaUtilities/interface/ALIUtils.h"
00012 #ifdef COCOA_VIS
00013 #include "Alignment/IgCocoaFileWriter/interface/IgCocoaFileMgr.h"
00014 #include "Alignment/CocoaVisMgr/interface/ALIColour.h"
00015 #endif
00016 #include "Alignment/CocoaDDLObjects/interface/CocoaSolidShapeBox.h"
00017 #include "Alignment/CocoaUtilities/interface/GlobalOptionMgr.h"
00018 
00019 using namespace CLHEP;
00020 
00021 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00022 //@@ Detailed simulation of Reflection in Plate Splitter
00023 //@@ The software gets the plane of reflection as the forward splitter plane
00024 //@@ Then the beam is reflected in this plane.
00025 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00026 void OptOPlateSplitter::detailedDeviatesLightRay( LightRay& lightray )
00027 {
00028   if (ALIUtils::debug >= 2) std::cout << "LR: DETAILED REFLECTION IN PLATE SPLITTER " << name() << std::endl;
00029   if (ALIUtils::debug >= 3) ALIUtils::dump3v( centreGlob(), " centre Global RF ");
00030 
00031   //---------- Get forward plate
00032   ALIPlane plate = getPlate(1, 1);
00033   //---------- Reflect
00034   lightray.reflect( plate );
00035   if (ALIUtils::debug >= 2) {
00036     std::cout << "Reflected in plate" << std::endl;
00037     lightray.dumpData(" "); 
00038   }
00039 
00040 }
00041 
00042 
00043 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00044 //@@ Detailed simulation of the light ray traversing
00045 //@@  The beam enters the splitter, is refracted, traverses the splitter and finally is again refracted when it exits:
00046 //@@ Get the intersection with the forward splitter plane
00047 //@@ Refract the beam and propagate until it intersects the backward splitter plane.
00048 //@@ Finally the beam is refracted again.
00049 //@@
00050 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00051 void OptOPlateSplitter::detailedTraversesLightRay( LightRay& lightray )
00052 {
00053   if (ALIUtils::debug >= 2) std::cout << "LR: DETAILED TRAVERSE IN PLATE SPLITTER " << name() << std::endl;
00054 
00055   //---------- Get forward plate
00056   ALIPlane plate = getPlate(1, 1);
00057   //---------- If width is 0, just keep the same point 
00058   ALIdouble width = findExtraEntryValue("width");
00059   if( width == 0 ) {
00060     if(ALIUtils::debug >= 3) lightray.dumpData("Traversed with 0 width"); 
00061     return;
00062   }
00063 
00064   //---------- Refract while entering splitter
00065   ALIdouble refra_ind1 = 1.;
00066   ALIdouble refra_ind2 = findExtraEntryValue("refra_ind");
00067   lightray.refract( plate, refra_ind1, refra_ind2 );
00068   if (ALIUtils::debug >= 2) {
00069     lightray.dumpData("Refracted in first plate"); 
00070   }
00071 
00072   //---------- Get backward plate
00073   plate = getPlate(0, 1);
00074   //---------- Refract while exiting splitter
00075   lightray.refract( plate, refra_ind2, refra_ind1 );
00076   if (ALIUtils::debug >= 2) {
00077     lightray.dumpData("Refracted in first plate"); 
00078   }
00079 
00080 }
00081 
00082 
00083 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00084 //@@ Fast simulation of deviation of the light ray:
00085 //@@ Reflect in a Plate Splitter
00086 //@@ The beam is reflected in the first plate of the plate splitter, which is obtained without applying the rotation by 'wedge'. 
00087 //@@ After the beam is reflected, it is rotated around the splitter X axis by 'deviX' and around the Y axis by 'deviY'.
00088 //@@
00089 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00090 void OptOPlateSplitter::fastDeviatesLightRay( LightRay& lightray ) 
00091 {
00092   if (ALIUtils::debug >= 2) std::cout << "LR: REFLECTION IN PLATE SPLITTER " << name() << std::endl;
00093 
00094   //---------- Get forward plate
00095   ALIPlane plate = getPlate(1, 0);
00096   //---------- Reflect in plate (including intersection with it)
00097   lightray.reflect( plate );
00098   if (ALIUtils::debug >= 2) {
00099     lightray.dumpData("Reflected in plate"); 
00100   }
00101   //---------- Deviate Lightray 
00102   lightray.shiftAndDeviateWhileTraversing( this, 'R' );
00103   if (ALIUtils::debug >= 2) {
00104     lightray.dumpData("Deviated ");
00105   }
00106   
00107 }
00108 
00109 
00110 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00111 //@@ Fast simulation of the light ray traversing
00112 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00113 //@@ Traverse Plane Parallel Plate 
00114 //@@ Traslated to the backward plate of the plate splitter
00115 //@@ Shifted in the splitter X direction by 'shiftX', and in the Y direction by 'shiftY' 
00116 //@@ and  rotated around the splitter X axis by 'deviX' and around the Y axis by 'deviY'.
00117 //@@
00118 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00119 void OptOPlateSplitter::fastTraversesLightRay( LightRay& lightray )
00120 {
00121   if (ALIUtils::debug >= 2) std::cout << "LR: TRAVERSE PLATE SPLITTER  " << name() << std::endl;
00122   
00123   //---------- Get backward plate
00124   ALIPlane plate = getPlate(0, 0);
00125   lightray.intersect( plate );
00126   if (ALIUtils::debug >= 2) {
00127     lightray.dumpData("Intersected with plate"); 
00128   }
00129   //---------- Shift and Deviate
00130   lightray.shiftAndDeviateWhileTraversing( this, 'T' );
00131   if (ALIUtils::debug >= 2) {
00132     lightray.dumpData("Shifted and Deviated");
00133   }
00134 
00135 }
00136 
00137 
00138 #ifdef COCOA_VIS
00139 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00140 void OptOPlateSplitter::fillIguana()
00141 {
00142   ALIColour* col = new ALIColour( 0., 0., 0., 0. );
00143   ALIdouble width;
00144   ALIbool wexists = findExtraEntryValueIfExists("width",width);
00145   if( !wexists ) width = 1.;
00146 
00147   std::vector<ALIdouble> spar;
00148   spar.push_back(4.);
00149   spar.push_back(4.);
00150   spar.push_back(width);
00151   IgCocoaFileMgr::getInstance().addSolid( *this, "BOX", spar, col);
00152 }
00153 #endif
00154 
00155 
00156 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
00157 void OptOPlateSplitter::constructSolidShape()
00158 {
00159   ALIdouble go;
00160   GlobalOptionMgr* gomgr = GlobalOptionMgr::getInstance();
00161   gomgr->getGlobalOptionValue("VisScale", go );
00162 
00163   theSolidShape = new CocoaSolidShapeBox( "Box", go*5.*cm/m, go*5.*cm/m, go*1.*cm/m ); //COCOA internal units are meters
00164 }