Skip to content
Snippets Groups Projects
test_matscan.cxx 5.32 KiB
Newer Older
  • Learn to ignore specific revisions
  • R__LOAD_LIBRARY(libDDCore.so)
    // R__LOAD_LIBRARY(libActsPluginDD4hep.so)
    R__LOAD_LIBRARY(libDDG4.so)
    R__LOAD_LIBRARY(libDDG4IO.so)
    #include "DD4hep/Detector.h"
    #include "DD4hep/DetElement.h"
    #include "DD4hep/Objects.h"
    #include "DD4hep/Detector.h"
    #include "DDG4/Geant4Data.h"
    #include "DDRec/CellIDPositionConverter.h"
    #include "DDRec/SurfaceManager.h"
    #include "DDRec/Surface.h"
    
    #include "TCanvas.h"
    #include "TChain.h"
    #include "TGeoMedium.h"
    #include "TGeoManager.h"
    #include "DDRec/MaterialScan.h"
    #include "DDRec/MaterialManager.h"
    #include "DD4hep/Detector.h"
    #include "DD4hep/Printout.h"
    #include "fmt/core.h"
    
    #include <iostream>
    #include <fstream>
    
    // #include "Acts/Geometry/TrackingGeometry.hpp"
    // #include "Acts/Geometry/TrackingVolume.hpp"
    // #include "Acts/Plugins/DD4hep/ConvertDD4hepDetector.hpp"
    using namespace dd4hep;
    using namespace dd4hep::rec;
    
    void test_matscan(const char* compact = "athena.xml", TString face="z"){
    
      dd4hep::Detector& detector = dd4hep::Detector::getInstance();
      detector.fromCompact(compact);
      MaterialScan matscan(detector); 
    
      fmt::print("\n");
      fmt::print("All detector subsystem names:\n");
      for(const auto&  d : detector.detectors() ) {
        fmt::print("  {}\n", d.first);
      }
      return;
    
      TString det_list[14]={"TrackerBarrel_Inner","TrackerBarrel_Outer","TrackerEndcapN_Inner","TrackerEndcapN_Outer","TrackerEndcapP_Inner","TrackerEndcapP_Outer","TrackerSubAssembly_Inner","TrackerSubAssembly_Outer","VertexBarrel","VertexBarrelSubAssembly","VertexEndcapN","VertexEndcapP","VertexEndcapSubAssembly","cb_DIRC"};
      for (int dd=0;dd<14;dd++){
      TString detname = det_list[dd];
      matscan.setDetector(detname.Data());      
    
      double x0=0,y0=0,z0=0,x1,y1,z1;  // cm
      double epsilon=1e-4; // (mm) default 1e-4: Materials with a thickness smaller than epsilon (default 1e-4=1mu
      const char* fmt1 = "%7.2f %7.2f %7.2f %5d %-20s %3.0f %8.3f %8.4f %11.4f %11.4f %10.3f %8.2f %11.6f %11.6f %7.2f %7.2f %7.2f\n";
      const char* fmt2 = "%7.2f %7.2f %7.2f %5d %-20s %3.0f %8.3f %8.4f %11.6g %11.6g %10.3f %8.2f %11.6f %11.6f %7.2f %7.2f %7.2f\n";
    
    
      // x1 = 100; y1 = 100; z1 = 100; 
      // y1 = 100;
      double a1,a2,a3;
      for(a3=-100;a3<101;a3=a3+200){
        TString fname = Form("/global/u2/s/shujie/eic/output/matscan/%s_%s%g.dat",detname.Data(),face.Data(),a3);
        FILE * pFile;
        pFile = fopen (fname,"w");
    
      for(a1=-100;a1<100;a1=a1+1){
      for(a2=-100;a2<100;a2=a2+1){
        if (face=="x"){
          y1=a1; z1=a2; x1=a3;
        }
        else if (face=="y"){
          x1=a1; z1=a2; y1=a3;
        }
        else if (face=="z"){
          x1=a1; y1=a2; z1=a3;
        }
    
        Vector3D p0(x0, y0, z0), p1(x1, y1, z1);
        Vector3D end, direction;
        direction = (p1-p0).unit();
      	const auto& placements = matscan.scan(x0,y0,z0,x1,y1,z1,epsilon); 
      	// matscan.print(x0,y0,z0,x1,y1,z1,epsilon);
        // return;
        // Vector3D end, direction;
        double sum_x0 = 0;
        double sum_lambda = 0;
        double path_length = 0, total_length = 0;
    
        // TString fname = Form("/global/u2/s/shujie/eic_dir/matscan_%g_%g_%g.dat",x1,y1,z1);
    
      	for (unsigned i=0;i<placements.size();i++){
    
          TGeoMaterial* mat=placements[i].first->GetMaterial();
          double length = placements[i].second;
          double nx0     = length / mat->GetRadLen();
          double nLambda = length / mat->GetIntLen();
          sum_x0        += nx0;
          sum_lambda    += nLambda;
          path_length   += length;
          total_length  += length;
          end = p0 + total_length * direction;
          const char* fmt = mat->GetRadLen() >= 1e5 ? fmt2 : fmt1;
    
          // fprintf(pFile, "%d\n",i+1);
          fprintf(pFile, fmt,x1, y1, z1, i+1, mat->GetName(), mat->GetZ(), mat->GetA(),
                    mat->GetDensity(), mat->GetRadLen(), mat->GetIntLen(), 
                    length, path_length, sum_x0, sum_lambda, end[0], end[1], end[2]);
    
          // ::printf(fmt, i+1, mat->GetName(), mat->GetZ(), mat->GetA(),
          //           mat->GetDensity(), mat->GetRadLen(), mat->GetIntLen(), 
          //           length, path_length, sum_x0, sum_lambda, end[0], end[1], end[2]);
          //  // mat->Print();
    
      	} 
      }
        cout<<detname<<"  "<<x1<<","<<y1<<","<<z1<<endl;
        // cout<<x1<<","<<y1<<","<<z1<<": "<<placements.size()<<"  "<<sum_x0<<"  "<<total_length<<endl;
      }	
      fclose (pFile);
    
      }
    }
    }
    
    /*
      <!-- <include ref="ecal_barrel_hybrid.xml"/> -->
    <TGeoManager::CountLevels>: max level = 5, max placements = 2796
    Error in <TGeoVoxelFinder::SortAll>: Volume B0Tracker: Cannot make slices on any axis
    Error in <TGeoVoxelFinder::SortAll>: Volume ForwardRomanPot_Station_1: Cannot make slices on any axis
    
    
    {  B0APF_BeamlineMagnet
    B0PF_BeamlineMagnet
    B0Tracker
    B1APF_BeamlineMagnet
    B1PF_BeamlineMagnet
    B2PF_BeamlineMagnet
    BPFR1_BeamlineMagnet
    BackwardTOF
    BarrelTOF
    BeamPipe
    EcalEndcapN
    EcalEndcapP
    ForwardOffMTracker
    ForwardRomanPot_Station_1
    ForwardTOF
    ForwardTRD
    GaseousRICH
    HcalBarrel
    HcalEndcapN
    HcalEndcapP
    Q1APF_BeamlineMagnet
    Q1BPF_BeamlineMagnet
    Q2PF_BeamlineMagnet
    QPFC1_BeamlineMagnet
    QPFC2_BeamlineMagnet
    QPFC3_BeamlineMagnet
    QPFC4_BeamlineMagnet
    QPFR1_BeamlineMagnet
    QPFR2_BeamlineMagnet
    SolenoidCoilBarrel
    SolenoidCoilEndcapN
    SolenoidCoilEndcapP
    TOFSubAssembly
    TrackerBarrel_Inner
    TrackerBarrel_Outer
    TrackerEndcapN_Inner
    TrackerEndcapN_Outer
    TrackerEndcapP_Inner
    TrackerEndcapP_Outer
    TrackerSubAssembly_Inner
    TrackerSubAssembly_Outer
    VertexBarrel
    VertexBarrelSubAssembly
    VertexEndcapN
    VertexEndcapP
    VertexEndcapSubAssembly
    cb_DIRC
    ce_MRICH
    ffi_ZDC_ECAL
    ffi_ZDC_HCAL}
    
    
    */