Skip to content
Snippets Groups Projects
Select Git revision
  • 3bfd9e7ea74c8f7fc21bc1a80565486cb551386d
  • master default
  • yezhenyu-btof-20210520
  • 41-detailed-zero-degree-calorimeter-hcal
  • testBranchRobin
  • 73-pion-rejection-yr-benchmark
  • default_visibilities
  • view_update
  • wdconinc-ecal-testing
  • 65-trigger-detector-benchmarks
  • upstream_trigger
  • 14-implement-cb_vtx_endcaps
  • 28-implement-ffi_offm_trk-2
  • 32-implement-ffi_rpot_d2
  • 27-implement-fi_b0_emcal
  • 15-implement-cb_sidiscs
  • 24-implement-ci_hcal
  • fix_ci_GEM
  • 8-implement-cb_ctd
  • Implement_AMEGOX_layers
  • yezhenyu_work_master
  • v0.2.0
  • v0.1.0
23 results

ffi_ZDC_HCAL.cpp

Blame
  • ffi_ZDC_HCAL.cpp 3.36 KiB
    #include "DD4hep/DetFactoryHelper.h"
    #include "DD4hep/Printout.h"
    #include <XML/Helper.h>
    #include "TMath.h"
    #include "DDRec/Surface.h"
    #include "DDRec/DetectorData.h"
    #include "XML/Layering.h"
    #include "Math/Transform3D.h"
    
    ///////////////////////////
    // Zero Degree Hadron Calorimeter
    ///////////////////////////
    
    using namespace std;
    using namespace dd4hep;
    using namespace dd4hep::rec;
    using namespace dd4hep::detail;
    
    
    static Ref_t createDetector(Detector& lcdd, xml_h e, SensitiveDetector sens) {
      xml_det_t  x_det     = e;
    	int        det_id    = x_det.id();
    	string     det_name  = x_det.nameStr();
    	xml_dim_t  pos       = x_det.position();
    	double     x_pos     = dd4hep::getAttrOrDefault(pos, _Unicode(x),0.0);
    	double     y_pos     = dd4hep::getAttrOrDefault(pos, _Unicode(y),0.0);
    	double     z_pos     = dd4hep::getAttrOrDefault(pos, _Unicode(z),0.0);
    	xml_dim_t  dim       = x_det.dimensions();
    	double     pixel_x   = dim.x();
    	double     pixel_y   = dim.y();
    	Material   air       = lcdd.material("Air");	
    	double     z         = z_pos;
    	double     zmin      = z_pos;
    	DetElement det(det_name, det_id);
    	
    	int layer_num = 1;
    	int slice_num = 1;
    	double totWidth = Layering(x_det).totalThickness();
    	Box envelope (pixel_x/2.0, pixel_y/2.0, totWidth/2.0);
    	Volume envelopeVol(det_name+"_envelope", envelope, air); 
    	PlacedVolume pv;
    	
    	xml_comp_t x_layer = x_det.child(_U(layer));
    
    	// Read layers
    	for(xml_coll_t c(x_det,_U(layer)); c; ++c)
    	{
    		xml_comp_t x_layer = c;
    		int repeat = x_layer.repeat();
    		double layerWidth = 0;
    		for(xml_coll_t l(x_layer,_U(slice)); l; ++l)
    			layerWidth += xml_comp_t(l).thickness();
        std::cout << layerWidth << " " << 123 <<std::endl;
    		// Loop over repeat#
    		for(int i=0; i< repeat; i++)
    		{
    			double zlayer = z;
    			string layer_name = det_name + _toString(layer_num,"_layer%d");
    			Volume layer_vol(layer_name,Box(pixel_x/2.0, pixel_y/2.0,layerWidth/2.0),air);
    
    			// Loop over slices
    			for(xml_coll_t l(x_layer,_U(slice)); l; ++l)
    			{
    				xml_comp_t x_slice = l;
    				double w = x_slice.thickness();
    				string slice_name = layer_name + _toString(slice_num,"slice%d");
    				Material slice_mat = lcdd.material(x_slice.materialStr());		
    				Volume slice_vol (slice_name,Box(pixel_x/2.0, pixel_y/2.0,w/2.0),slice_mat);
    				if(x_slice.isSensitive())
    				{
    					sens.setType("calorimeter");
    					slice_vol.setSensitiveDetector(sens);
    				}
    				slice_vol.setAttributes(lcdd,x_slice.regionStr(), x_slice.limitsStr(), x_slice.visStr());
    				pv = layer_vol.placeVolume(slice_vol, Transform3D(RotationZYX(0, 0, 0),Position(0.0,0.0,z-zlayer-layerWidth/2.0+w/2.0)));
    				pv.addPhysVolID("slice", slice_num);
    				z += w;
    				++slice_num;
    			}
    			string layer_vis = dd4hep::getAttrOrDefault(x_layer, _Unicode(vis), "InvisibleWithDaughters");
    			layer_vol.setAttributes(lcdd, x_layer.regionStr(), x_layer.limitsStr(), layer_vis);
    			pv = envelopeVol.placeVolume(layer_vol, Transform3D(RotationZYX(0, 0, 0), Position(0,0,zlayer-zmin-totWidth/2.0+layerWidth/2.0)));
    			pv.addPhysVolID("layer", layer_num);
    			++layer_num;
    		}
    	}
    	envelopeVol.setAttributes(lcdd, x_det.regionStr(), x_det.limitsStr(), "InvisibleWithDaughters");
    
    	Volume motherVol = lcdd.pickMotherVolume(det);
    	PlacedVolume phv = motherVol.placeVolume(envelopeVol, Position(x_pos,y_pos,z_pos+totWidth/2.0));
    	phv.addPhysVolID("system", det.id());
    	det.setPlacement(phv);
    
    	return det;
    }
    
    DECLARE_DETELEMENT(ffi_ZDC_HCAL, createDetector)