diff --git a/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml index e439461d9ca5f824e321e0e43b2fc833232f88bd..eaf59929b25cdf92662baa9c612f7d0d7d625543 100644 --- a/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml @@ -2,10 +2,13 @@ <lccdd> <define> <constant name="ecalbarrel_inner_radius" value="Ecal_barrel_inner_radius"/> - <constant name="ecalbarrel_thickness" value="Ecal_barrel_thickness"/> <!--Must be n*10*mm! --> - <constant name="ecalbarrel_zlength" value="Ecal_barrel_half_length*2"/> <!--Must be n*10*mm! --> - <constant name="bar_x" value="1*cm"/> - <constant name="bar_y" value="1*cm"/> + <constant name="ecalbarrel_thickness" value="Ecal_barrel_thickness"/> <!--Must be n*10*mm! --> + <constant name="ecalbarrel_zlength" value="Ecal_barrel_half_length*2"/> <!--Must be n*10*mm n*Nblock_z! --> + <constant name="n_symm" value="Ecal_barrel_symmetry" /> <!--Only support 8 and 12 now --> + <constant name="Nblock_z" value="11" /> + <constant name="Nblock_phi" value="4" /> + <constant name="bar_x" value="1*cm"/> + <constant name="bar_y" value="1*cm"/> </define> <regions> @@ -21,7 +24,7 @@ <readouts> <readout name="EcalBarrelCollection"> - <!-- <segmentation type="NoSegmentation"/> --> + <!--segmentation type="NoSegmentation"/--> <!--segmentation type="CartesianGridXYZ" grid_size_x="1*cm" diff --git a/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml b/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml index 4f631eb52d4fd73583c61db951c78630eab0e816..4960c63b564a78d33c38cd7e4f1154b5bda6dedb 100644 --- a/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml +++ b/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml @@ -150,13 +150,13 @@ <constant name="Ecal_barrel_inner_radius" value="1860*mm"/><!--1900->1860, since 1900-2180 is range for symmetry=12, but now fixed as 8 in constructor code--> <constant name="Ecal_barrel_thickness" value="280*mm"/> <constant name="Ecal_barrel_outer_radius" value="(Ecal_barrel_inner_radius+Ecal_barrel_thickness)/cos(pi/8)"/> - <constant name="Ecal_barrel_half_length" value="3350*mm"/> + <constant name="Ecal_barrel_half_length" value="3300*mm"/> <constant name="Ecal_barrel_symmetry" value="8"/> <constant name="Ecal_endcap_inner_radius" value="350*mm"/> <constant name="Ecal_endcap_outer_radius" value="Ecal_barrel_inner_radius+Ecal_barrel_thickness"/> <constant name="Ecal_endcap_zmin" value="3050*mm"/> - <constant name="Ecal_endcap_zmax" value="3350*mm"/> + <constant name="Ecal_endcap_zmax" value="3300*mm"/> <constant name="Ecal_endcap_symmetry" value="8"/> <!--obseleted constance, used by old construct, should be removed while creating new constrcut--> <constant name="EcalEndcap_outer_radius" value="Ecal_barrel_outer_radius"/> diff --git a/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02-onlyEcalB.xml b/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02-onlyEcalB.xml new file mode 100644 index 0000000000000000000000000000000000000000..a2a65e6c52df05a938069bccfc9dd9038d590747 --- /dev/null +++ b/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02-onlyEcalB.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8"?> +<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd"> + <info name="CRD_o1_v02" + title="CepC reference detctor with coil inside Hcal, pixel SIT and strip SET" + author="C.D.Fu, " + url="http://cepc.ihep.ac.cn" + status="developing" + version="v02"> + <comment>CepC reference detector simulation models used for detector study </comment> + </info> + + <includes> + <gdmlFile ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/> + <gdmlFile ref="../CRD_common_v01/materials.xml"/> + </includes> + + <define> + <constant name="world_size" value="25*m"/> + <constant name="world_x" value="world_size"/> + <constant name="world_y" value="world_size"/> + <constant name="world_z" value="world_size"/> + + <include ref="${DD4hepINSTALL}/DDDetectors/compact/detector_types.xml"/> + </define> + + <include ref="./CRD_Dimensions_v01_02.xml"/> + + <!--include ref="../CRD_common_v01/Beampipe_v01_01.xml"/> + <include ref="../CRD_common_v01/VXD_v01_01.xml"/> + <include ref="../CRD_common_v01/FTD_SkewRing_v01_01.xml"/> + <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/> + <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/> + <include ref="../CRD_common_v01/SET_SimplePlanar_v01_01.xml"/--> + <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml"/> + <!--include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v01_01.xml"/--> + <!--include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/> + <include ref="../CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml"/> + <include ref="../CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml"/> + <include ref="../CRD_common_v01/Yoke_Barrel_v01_01.xml"/> + <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/--> + <!--include ref="../CRD_common_v01/Lcal_v01_01.xml"/--> + + <fields> + <field name="InnerSolenoid" type="solenoid" + inner_field="Field_nominal_value" + outer_field="0" + zmax="SolenoidCoil_half_length" + inner_radius="SolenoidCoil_center_radius" + outer_radius="Solenoid_outer_radius"> + </field> + <field name="OuterSolenoid" type="solenoid" + inner_field="0" + outer_field="Field_outer_nominal_value" + zmax="SolenoidCoil_half_length" + inner_radius="Solenoid_outer_radius" + outer_radius="Yoke_barrel_inner_radius"> + </field> + </fields> + +</lccdd> diff --git a/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp b/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp index 4ba45b249f46c9bd815ac60b21f3a32f385a51cf..e161fedfafc3c2c98902508b69bdea1b0deae759 100644 --- a/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp +++ b/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp @@ -46,29 +46,33 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector, double Z0 = theDetector.constant<double>("ecalbarrel_zlength"); double barx = theDetector.constant<double>("bar_x"); //Crystal size in R direction. double bary = theDetector.constant<double>("bar_y"); //Crystal size in z/phi direction (z for odd layer, phi for even layer). - - double dim_x1 = R0*tan(22.5*degree) + sqrt(2)*h0/2.; - double dim_x2 = dim_x1 - h0; + //int Nsymm = theDetector.constant<int>("n_symm"); //Only support 8 and 12 now. + //double rotAngle = 360./Nsymm; + int Nsymm = 8; //Only support 8 and 12 now. + double rotAngle = 45.; + + double dim_x1 = R0*tan(rotAngle*degree/2.) + h0/(2.*sin(rotAngle*degree)); + double dim_x2 = dim_x1 - h0/tan(rotAngle*degree); double dim_y = Z0/2.; double dim_z = h0/2.; - double dx = dim_x1 - R0*tan(22.5*degree); //transport distance in x-axis - double r0 = R0+h0/2.; //rotation radius + double dx = dim_x1 - R0*tan(rotAngle*degree/2.); //transport distance in x-axis + double r0 = R0+h0/2.; //rotation radius //Crystal bar size - int Nlayers = (int)h0/(2*barx); //14 double-layers. - int Nblock_z = 11; //block number in z direction - int Nblock_phi = 4; //block number in phi direction - double barz_s0; //Crystal bar lenghth in sub-layer 0(phi direction). Depends on layer number. - double barz_s1 = Z0/Nblock_z; //Crystal bar lenghth in sub-layer 1(z direction, 46cm). - int Nbar_phi; //Crystal bar number in each block, in phi direction. - int Nbar_z = (int)barz_s1/bary; //Crystal bar number in each block, in z direction. + int Nlayers = (int)h0/(2*barx); //14 double-layers. + int Nblock_z = theDetector.constant<int>("Nblock_z"); //block number in z direction + int Nblock_phi = theDetector.constant<int>("Nblock_phi"); //block number in phi direction + double barz_s0; //Crystal bar lenghth in sub-layer 0(phi direction). Depends on layer number. + double barz_s1 = Z0/Nblock_z; //Crystal bar lenghth in sub-layer 1(z direction, ~60cm). + int Nbar_phi; //Crystal bar number in each block, in phi direction. + int Nbar_z = (int)barz_s1/bary; //Crystal bar number in each block, in z direction. //Define detector and motherVolume(world) dd4hep::DetElement ECAL(det_name, detid); dd4hep::Volume motherVol = theDetector.pickMotherVolume(ECAL); // Create a Tube-like envelope representing the whole detector volume - dd4hep::PolyhedraRegular envelope(8, 22.5*degree, R0, (R0+h0), Z0); + dd4hep::PolyhedraRegular envelope(Nsymm, rotAngle/2.*degree, R0, (R0+h0), Z0); dd4hep::Material air(theDetector.material("Air")); dd4hep::Volume envelopeVol(det_name, envelope, air); dd4hep::PlacedVolume envelopePlv = motherVol.placeVolume(envelopeVol, Position(0,0,0)); @@ -107,8 +111,8 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector, } caloData->layoutType = LayeredCalorimeterData::BarrelLayout ; - caloData->inner_symmetry = 8 ; - caloData->outer_symmetry = 8 ; + caloData->inner_symmetry = Nsymm ; + caloData->outer_symmetry = Nsymm ; caloData->phi0 = 0 ; // hardcoded // extent of the calorimeter in the r-z-plane [ rmin, rmax, zmin, zmax ] in mm. @@ -141,7 +145,7 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector, //sub-layer 0: bars along phi. length=barz_s0. Bar num=Nbar_z for(int ibar0=1;ibar0<=Nbar_z;ibar0++){ - dd4hep::PlacedVolume plv_bar0 = block.placeVolume(bar_s0, Position(0,(2*ibar0-1)*bary/2-barz_s1/2, -barx/2)); + dd4hep::PlacedVolume plv_bar0 = block.placeVolume(bar_s0, Position(0, barz_s1/2-(2*ibar0-1)*bary/2, -barx/2)); plv_bar0.addPhysVolID("slayer",0).addPhysVolID("bar",ibar0); std::string barname0 = "CrystalBar_s0_"+std::to_string(ibar0); dd4hep::DetElement bardet0(sd, barname0, detid); @@ -150,7 +154,7 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector, //sub-layer1 for(int ibar1=1;ibar1<=Nbar_phi;ibar1++){ - dd4hep::PlacedVolume plv_bar1 = block.placeVolume(bar_s1, Position((2*ibar1-1)*bary/2-barz_s0/2, 0, barx/2)); + dd4hep::PlacedVolume plv_bar1 = block.placeVolume(bar_s1, Position( barz_s0/2-(2*ibar1-1)*bary/2, 0, barx/2)); plv_bar1.addPhysVolID("slayer",1).addPhysVolID("bar",ibar1); std::string barname1 = "CrystalBar_s1_"+std::to_string(ibar1); dd4hep::DetElement bardet1(sd, barname1, detid); @@ -166,21 +170,21 @@ static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector, } for(int iz=1; iz<=Nblock_z; iz++){ - dd4hep::PlacedVolume plv = det_vol.placeVolume(det_stave, Position(0, (2*iz-1)*barz_s1/2-dim_y, 0) ); + dd4hep::PlacedVolume plv = det_vol.placeVolume(det_stave, Position(0, dim_y-(2*iz-1)*barz_s1/2, 0) ); plv.addPhysVolID("stave", iz); DetElement sd(stavedet, _toString(iz,"stave%3d"), detid); sd.setPlacement(plv); } - for(int i=0;i<8;i++){ - double rotAngle = 45*i*degree; - double posx = -r0*sin(rotAngle) - dx*cos(rotAngle); - double posy = r0*cos(rotAngle) - dx*sin(rotAngle); - dd4hep::Transform3D transform(dd4hep::RotationZ(rotAngle)*dd4hep::RotationX(-90*degree), dd4hep::Position(posx, posy, 0.)); - dd4hep::PlacedVolume plv = envelopeVol.placeVolume(det_vol, transform); - plv.addPhysVolID("module", i); - DetElement sd(ECAL, _toString(i,"trap%3d"), detid); - sd.setPlacement(plv); + for(int i=0;i<Nsymm;i++){ + double m_rot = rotAngle*i*degree; + double posx = -r0*sin(m_rot) - dx*cos(m_rot); + double posy = r0*cos(m_rot) - dx*sin(m_rot); + dd4hep::Transform3D transform(dd4hep::RotationZ(m_rot)*dd4hep::RotationX(-90*degree), dd4hep::Position(posx, posy, 0.)); + dd4hep::PlacedVolume plv = envelopeVol.placeVolume(det_vol, transform); + plv.addPhysVolID("module", i); + DetElement sd(ECAL, _toString(i,"trap%3d"), detid); + sd.setPlacement(plv); } sens.setType("calorimeter");