00001
00002
00003
00004
00005
00006 #include "DetectorDescription/Parser/src/DDDividedTubs.h"
00007 #include "DetectorDescription/Parser/src/DDXMLElement.h"
00008
00009 #include "DetectorDescription/Core/interface/DDLogicalPart.h"
00010 #include "DetectorDescription/Core/interface/DDName.h"
00011 #include "DetectorDescription/Core/interface/DDAxes.h"
00012 #include "DetectorDescription/Core/interface/DDSolid.h"
00013 #include "DetectorDescription/Core/interface/DDMaterial.h"
00014
00015 #include "DetectorDescription/Base/interface/DDdebug.h"
00016 #include "DetectorDescription/Base/interface/DDRotationMatrix.h"
00017
00018 #include "CLHEP/Units/GlobalSystemOfUnits.h"
00019
00020 DDDividedTubsRho::DDDividedTubsRho( const DDDivision& div, DDCompactView* cpv )
00021 : DDDividedGeometryObject::DDDividedGeometryObject( div, cpv )
00022 {
00023 checkParametersValidity();
00024 setType( "DivisionTubsRho" );
00025 DDTubs msol = (DDTubs)(div_.parent().solid());
00026
00027 if( divisionType_ == DivWIDTH )
00028 {
00029 compNDiv_ = calculateNDiv( msol.rIn() - msol.rOut(),
00030 div_.width(), div_.offset() );
00031 }
00032 else if( divisionType_ == DivNDIV )
00033 {
00034 compWidth_ = calculateWidth( msol.rIn() - msol.rOut(),
00035 div_.nReplicas(), div_.offset() );
00036 }
00037
00038 DCOUT_V ('P', " DDDividedTubsRho - no divisions " << compNDiv_ << " = " << div_.nReplicas() << "\n Offset " << div_.offset() << "\n Width " << compWidth_ << " = " << div_.width() << "\n DivType " << divisionType_);
00039
00040 }
00041
00042 DDDividedTubsRho::~DDDividedTubsRho( void )
00043 {}
00044
00045 double
00046 DDDividedTubsRho::getMaxParameter( void ) const
00047 {
00048 DDTubs msol = (DDTubs)(div_.parent().solid());
00049 return msol.rOut() - msol.rIn();
00050
00051 }
00052
00053 DDRotation
00054 DDDividedTubsRho::makeDDRotation( const int copyNo ) const
00055 {
00056 DDRotation myddrot;
00057 DCOUT_V ('P', "DDDividedTubsRho::makeDDRotation made a rotation: " << myddrot);
00058 return myddrot;
00059 }
00060
00061
00062 DDTranslation
00063 DDDividedTubsRho::makeDDTranslation( const int copyNo ) const
00064 {
00065
00066 DDTranslation translation;
00067
00068 DCOUT_V ('P', " DDDividedTubsRho " << "\n\t Position: " << translation << " - Width: " << compWidth_ << " - Axis " << DDAxesNames::name(div_.axis()));
00069 return translation;
00070 }
00071
00072 DDLogicalPart
00073 DDDividedTubsRho::makeDDLogicalPart( const int copyNo ) const
00074 {
00075
00076 DDName solname(div_.parent().ddname().name() + "_DIVCHILD"
00077 + DDXMLElement::itostr(copyNo)
00078 , div_.parent().ddname().ns());
00079 DDSolid ddtubs(solname);
00080 DDMaterial usemat(div_.parent().material());
00081 DDTubs msol = (DDTubs) (div_.parent().solid());
00082 DDLogicalPart ddlp;
00083
00084 double pRMin = msol.rIn() + div_.offset() + compWidth_ * copyNo;
00085 double pRMax = msol.rIn() + div_.offset() + compWidth_ * (copyNo+1);
00086 double pDz = msol.zhalf();
00087 double pSPhi = msol.startPhi();
00088 double pDPhi = msol.deltaPhi();
00089 ddtubs = DDSolidFactory::tubs(DDName(solname), pDz, pRMin, pRMax, pSPhi, pDPhi);
00090 ddlp = DDLogicalPart(solname, usemat, ddtubs);
00091
00092 DCOUT_V ('P', " DDDividedTubsRho::computeDimensions() lp:" << ddlp);
00093 return ddlp;
00094 }
00095
00096 DDDividedTubsPhi::DDDividedTubsPhi( const DDDivision& div, DDCompactView* cpv )
00097 : DDDividedGeometryObject::DDDividedGeometryObject( div, cpv )
00098 {
00099 checkParametersValidity();
00100 setType( "DivisionTubsPhi" );
00101
00102 DDTubs msol = (DDTubs)(div_.parent().solid());
00103 if( divisionType_ == DivWIDTH )
00104 {
00105
00106 if( msol.deltaPhi() == 360.*deg ) {
00107 compNDiv_ = calculateNDiv( msol.deltaPhi(), div_.width(), 0. );
00108 }else {
00109 compNDiv_ = calculateNDiv( msol.deltaPhi(), div_.width(), div_.offset() );
00110 }
00111
00112 }
00113 else if( divisionType_ == DivNDIV )
00114 {
00115 if( msol.deltaPhi() == 360.*deg ) {
00116 compWidth_ = calculateWidth( msol.deltaPhi(), div_.nReplicas(), 0. );
00117 }else {
00118 compWidth_ = calculateWidth( msol.deltaPhi(), div_.nReplicas(), div_.offset() );
00119 }
00120 }
00121 }
00122
00123 DDDividedTubsPhi::~DDDividedTubsPhi( void )
00124 {}
00125
00126 double
00127 DDDividedTubsPhi::getMaxParameter( void ) const
00128 {
00129 DDTubs msol = (DDTubs)(div_.parent().solid());
00130 return msol.deltaPhi();
00131 }
00132
00133 DDRotation
00134 DDDividedTubsPhi::makeDDRotation( const int copyNo ) const
00135 {
00136 DDRotation myddrot;
00137 double posi = ( copyNo - 1 ) * compWidth_;
00138 DDRotationMatrix * rotMat = changeRotMatrix( posi );
00139
00140
00141 DDName ddrotname(div_.parent().ddname().name() + "_DIVCHILD_ROT"
00142 + DDXMLElement::itostr(copyNo)
00143 , div_.parent().ddname().ns());
00144 myddrot = DDrot(ddrotname, rotMat);
00145
00146 return myddrot;
00147 }
00148
00149 DDTranslation
00150 DDDividedTubsPhi::makeDDTranslation( const int copyNo ) const
00151 {
00152
00153 DDTranslation translation;
00154
00155 DCOUT_V ('P', " DDDividedTubsPhi " << "\n\t Position: " << translation << " - Width: " << compWidth_ << " - Axis " << DDAxesNames::name(div_.axis()));
00156 return translation;
00157 }
00158
00159 DDLogicalPart
00160 DDDividedTubsPhi::makeDDLogicalPart( const int copyNo ) const
00161 {
00162 DDName solname(div_.name());
00163
00164 DDSolid ddtubs(solname);
00165 DDMaterial usemat(div_.parent().material());
00166 DDTubs msol = (DDTubs) (div_.parent().solid());
00167 DDLogicalPart ddlp(solname);
00168
00169 if (!ddtubs.isDefined().second)
00170 {
00171 double pRMin = msol.rIn();
00172 double pRMax = msol.rOut();
00173 double pDz = msol.zhalf();
00174 double pSPhi = msol.startPhi()+div_.offset();
00175 double pDPhi = compWidth_;
00176 ddtubs = DDSolidFactory::tubs(DDName(solname), pDz, pRMin, pRMax, pSPhi, pDPhi);
00177 ddlp = DDLogicalPart(solname, usemat, ddtubs);
00178 }
00179
00180 DCOUT_V ('P', " DDDividedTubsPhi::computeDimensions() lp:" << ddlp);
00181 return ddlp;
00182 }
00183
00184 DDDividedTubsZ::DDDividedTubsZ( const DDDivision& div, DDCompactView* cpv )
00185 : DDDividedGeometryObject::DDDividedGeometryObject( div, cpv )
00186 {
00187 checkParametersValidity();
00188
00189 DDTubs msol = (DDTubs)(div_.parent().solid());
00190
00191 setType( "DivisionTubsZ" );
00192 if( divisionType_ == DivWIDTH )
00193 {
00194 compNDiv_ = calculateNDiv( 2*msol.zhalf(), div_.width(), div_.offset() );
00195 }
00196 else if( divisionType_ == DivNDIV )
00197 {
00198 compWidth_ = calculateWidth( 2*msol.zhalf(), div_.nReplicas(), div_.offset() );
00199 }
00200
00201 DCOUT_V ('P', " DDDividedTubsZ - no divisions " << compNDiv_ << " = " << div_.nReplicas() << "\n Offset " << div_.offset() << "\n Width " << compWidth_ << " = " << div_.width() << "\n DivType " << divisionType_);
00202
00203 }
00204
00205 DDDividedTubsZ::~DDDividedTubsZ( void )
00206 {}
00207
00208 double
00209 DDDividedTubsZ::getMaxParameter( void ) const
00210 {
00211 DDTubs msol = (DDTubs)(div_.parent().solid());
00212 return 2*msol.zhalf();
00213
00214 }
00215
00216 DDRotation
00217 DDDividedTubsZ::makeDDRotation( const int copyNo ) const
00218 {
00219 DDRotation myddrot;
00220 DCOUT_V ('P', "DDDividedTubsZ::makeDDRotation made a rotation: " << myddrot);
00221 return myddrot;
00222 }
00223
00224 DDTranslation
00225 DDDividedTubsZ::makeDDTranslation( const int copyNo ) const
00226 {
00227
00228 DDTranslation translation;
00229
00230 DDTubs msol = (DDTubs)(div_.parent().solid());
00231 double posi = - msol.zhalf() + div_.offset() + compWidth_/2 + copyNo*compWidth_;
00232 translation.SetZ(posi);
00233
00234 DCOUT_V ('P', " DDDividedTubsZ " << "\n\t Position: " << translation << " - Width: " << compWidth_ << " - Axis " << DDAxesNames::name(div_.axis()));
00235 return translation;
00236 }
00237
00238 DDLogicalPart
00239 DDDividedTubsZ::makeDDLogicalPart( const int copyNo ) const
00240 {
00241 DDMaterial usemat(div_.parent().material());
00242 DDTubs msol = (DDTubs) (div_.parent().solid());
00243 DDLogicalPart ddlp;
00244
00245 DDName solname(div_.parent().ddname().name() + "_DIVCHILD", div_.parent().ddname().ns());
00246 DDSolid ddtubs(solname);
00247
00248 if (!ddtubs.isDefined().second)
00249 {
00250 double pRMin = msol.rIn();
00251 double pRMax = msol.rOut();
00252 double pDz = compWidth_/2.;
00253 double pSPhi = msol.startPhi();
00254 double pDPhi = msol.deltaPhi();
00255 ddtubs = DDSolidFactory::tubs(DDName(solname), pDz, pRMin, pRMax, pSPhi, pDPhi);
00256 ddlp = DDLogicalPart(solname, usemat, ddtubs);
00257 }
00258 else {
00259 ddlp = DDLogicalPart(solname);
00260 }
00261
00262 DCOUT_V ('P', " DDDividedTubsZ::computeDimensions() lp:" << ddlp);
00263 return ddlp;
00264 }