diff --git a/.gitignore b/.gitignore index 176904b71c3c7f8f56bc8d292949ad99b49e7151..7b9ab073ef3ca0a2412212ed0a44395feb31847e 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ __pycache__/ *.py[cod] *$py.class .ipynb_checkpoints + +# test for calorimeter +calorimeters/test/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ba68e8f39deecf2674661d9f96a6c14f838c01fd..b76a6d88bf109ca2d0ed2d25ab9b238bb6fd137d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -132,6 +132,14 @@ zdc_benchmark: - root -b -q calorimeters/simple_checking.cxx+ allow_failure: true +zdc_benchmark_info_histogram: + stage: benchmarks + tags: + - sodium + script: + - root -b -q calorimeters/simple_info_plot_histograms.cxx+ + allow_failure: true + deploy_results: stage: deploy tags: diff --git a/calorimeters/edep_histo_zdc_photons.png b/calorimeters/edep_histo_zdc_photons.png new file mode 100644 index 0000000000000000000000000000000000000000..5e1985b21c7316b75ea4c70b42c2927caff48a6f Binary files /dev/null and b/calorimeters/edep_histo_zdc_photons.png differ diff --git a/calorimeters/hit_postion_histo_zdc_photons.png b/calorimeters/hit_postion_histo_zdc_photons.png new file mode 100644 index 0000000000000000000000000000000000000000..da904eaa47c323bf762c50f9722fc470cda94f4c Binary files /dev/null and b/calorimeters/hit_postion_histo_zdc_photons.png differ diff --git a/calorimeters/nhits_histo_zdc_photons.png b/calorimeters/nhits_histo_zdc_photons.png new file mode 100644 index 0000000000000000000000000000000000000000..3e519f1ff0f7edef6c23d38aaede1b1cd0ecf8df Binary files /dev/null and b/calorimeters/nhits_histo_zdc_photons.png differ diff --git a/calorimeters/simple_info_plot_histograms.cxx b/calorimeters/simple_info_plot_histograms.cxx new file mode 100644 index 0000000000000000000000000000000000000000..27c8015d4afd4f83b4ad6bd3817564aacbb2962f --- /dev/null +++ b/calorimeters/simple_info_plot_histograms.cxx @@ -0,0 +1,176 @@ +R__LOAD_LIBRARY($HOME/stow/development/lib/libGenDetectors.so) +R__LOAD_LIBRARY(libfmt.so) +#include "fmt/core.h" +R__LOAD_LIBRARY(libDDG4IO.so) +#include "DD4hep/Detector.h" +#include "DDG4/Geant4Data.h" +#include "DDRec/CellIDPositionConverter.h" +#include "DDRec/SurfaceManager.h" +#include "DD4hep/VolumeManager.h" +#include "DD4hep/detail/Handle.inl" +#include "DD4hep/detail/ObjectsInterna.h" +#include "DD4hep/detail/DetectorInterna.h" +#include "DD4hep/detail/VolumeManagerInterna.h" +#include "DDRec/Surface.h" +#include "DD4hep/Volumes.h" +#include "DD4hep/DetElement.h" +#include "DD4hep/NamedObject.h" +#include "DD4hep/IDDescriptor.h" +#include "DD4hep/ConditionsMap.h" +#include "TGeoMatrix.h" +#include "ROOT/RDataFrame.hxx" +#include "Math/Vector3D.h" +#include "Math/Vector4D.h" +#include "Math/VectorUtil.h" +#include "TCanvas.h" +#include "TLegend.h" +#include "TMath.h" +#include "TRandom3.h" +#include "TFile.h" +#include "TH1F.h" +#include "TH1D.h" +#include "TTree.h" +#include "TChain.h" +#include <random> +#include <iostream> + +void simple_info_plot_histograms(const char* fname = "sim_output/output_zdc_photons.root"){ + + TChain* t = new TChain("EVENT"); + t->Add(fname); + + ROOT::RDataFrame d0(*t);//, {"ZDCHits","MCParticles"}); + + dd4hep::Detector& detector = dd4hep::Detector::getInstance(); + detector.fromCompact("ZDC_example.xml"); + + //dd4hep::VolumeManager volman = detector.volumeManager(); + //volman.getVolumeManager(detector); + dd4hep::VolumeManager volman = dd4hep::VolumeManager::getVolumeManager(detector); + + // Number of hits + auto nhits = [] (std::vector<dd4hep::sim::Geant4Calorimeter::Hit*>& hits){ return (int) hits.size(); }; + + // Cell ID + auto cellID = [&] (const std::vector<dd4hep::sim::Geant4Calorimeter::Hit*>& hits) { + std::vector<double> result; + for(const auto& h: hits) + result.push_back(h->cellID); + return result; + }; + + // Volume ID + auto volID = [&] (const std::vector<dd4hep::sim::Geant4Calorimeter::Hit*>& hits) { + std::vector<double> result; + for(const auto& h: hits) { + auto detelement = volman.lookupDetElement(h->cellID); + result.push_back(detelement.volumeID()); + } + return result; + }; + + // Hit position X + auto hit_x_position = [&] (const std::vector<dd4hep::sim::Geant4Calorimeter::Hit*>& hits) { + std::vector<double> result; + for(const auto& h: hits) + result.push_back(h->position.x()); //mm + return result; + }; + + // Hit position Y + auto hit_y_position = [&] (const std::vector<dd4hep::sim::Geant4Calorimeter::Hit*>& hits) { + std::vector<double> result; + for(const auto& h: hits) + result.push_back(h->position.y()); //mm + return result; + }; + + // Hit position Z + auto hit_z_position = [&] (const std::vector<dd4hep::sim::Geant4Calorimeter::Hit*>& hits) { + std::vector<double> result; + for(const auto& h: hits) + result.push_back(h->position.z()); //mm + return result; + }; + + // Energy deposition + auto e_dep = [&] (const std::vector<dd4hep::sim::Geant4Calorimeter::Hit*>& hits) { + std::vector<double> result; + for(const auto& h: hits) + result.push_back(h->energyDeposit); //GeV + return result; + }; + + auto d1 = d0.Define("nhits", nhits, {"ZDCHits"}) + .Define("cellID", cellID, {"ZDCHits"}) + .Define("volID", volID, {"ZDCHits"}) + .Define("hit_x_position", hit_x_position, {"ZDCHits"}) + .Define("hit_y_position", hit_y_position, {"ZDCHits"}) + .Define("hit_z_position", hit_z_position, {"ZDCHits"}) + .Define("e_dep", e_dep, {"ZDCHits"}) + ; + + // Define Histograms + auto h0 = d1.Histo1D({"h0", "nhits histogram; nhits; Events", 100, 0,5000}, "nhits"); + auto h1 = d1.Histo1D({"h1", "hit_x_position histogram; hit X position [mm]; Events", 60,-30,30}, "hit_x_position"); + auto h2 = d1.Histo1D({"h2", "hit_y_position histogram; hit Y position [mm]; Events", 100,-30,80}, "hit_y_position"); + auto h3 = d1.Histo1D({"h3", "hit_z_position histogram; hit Z position [mm]; Events", 100,1000,1300}, "hit_z_position"); + auto h4 = d1.Histo1D({"h4", "energy deposition histogram; energy deposition [GeV]; Events", 100,0,300}, "e_dep"); + auto h5 = d1.Histo1D({"h5", "volume ID; volumeID; Events", 92,-0.5,92.5}, "volID"); + + auto n0 = d1.Filter([](int n){ return (n>0); },{"nhits"}).Count(); + + d1.Snapshot("info_EVENT","./calorimeters/info_zdc_photons.root"); + std::cout << *n0 << " events with nonzero hits\n"; + + TCanvas *c1 = new TCanvas("c1","c1",800,600); + c1->SetLogy(1); + h0->GetYaxis()->SetTitleOffset(1.4); + h0->SetLineWidth(2); + h0->SetLineColor(kBlack); + h0->DrawClone(); + c1->SaveAs("./calorimeters/nhits_histo_zdc_photons.png"); + + TCanvas *c2 = new TCanvas("c2","c2",1000,1000); + c2->Divide(2,2); + c2->cd(1); + h1->GetYaxis()->SetTitleOffset(1.7); + h1->SetLineWidth(2); + h1->SetLineColor(kBlack); + h1->DrawClone(); + + c2->cd(2); + h2->GetYaxis()->SetTitleOffset(1.7); + h2->SetLineWidth(2); + h2->SetLineColor(kBlack); + h2->DrawClone(); + + c2->cd(3); + h3->GetYaxis()->SetTitleOffset(1.7); + h3->SetLineWidth(2); + h3->SetLineColor(kBlack); + h3->DrawClone(); + c2->SaveAs("./calorimeters/hit_postion_histo_zdc_photons.png"); + + TCanvas *c3 = new TCanvas("c3","c3",600,600); + c3->cd(); + c3->SetLogy(1); + h4->GetYaxis()->SetTitleOffset(1.4); + h4->SetLineWidth(2); + h4->SetLineColor(kBlack); + h4->DrawClone(); + c3->SaveAs("./calorimeters/edep_histo_zdc_photons.png"); + + TCanvas *c4 = new TCanvas("c4","c4",600,600); + c4->SetLogy(0); + h5->GetYaxis()->SetTitleOffset(2.0); + h5->SetLineWidth(2); + h5->SetLineColor(kBlack); + h5->DrawClone(); + c4->SaveAs("./calorimeters/volID_histo_zdc_photons.png"); + + if(*n0<5) { + std::quick_exit(1); + } +} + diff --git a/calorimeters/volID_histo_zdc_photons.png b/calorimeters/volID_histo_zdc_photons.png new file mode 100644 index 0000000000000000000000000000000000000000..81479c86ae858b78e474bbb9c409ae0da1606763 Binary files /dev/null and b/calorimeters/volID_histo_zdc_photons.png differ