diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 74ed1de8542a4c562e891bdd27e7ca297a6c3811..f831ea4221396dd1b8d7bd2565b20e6118d3db53 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -107,11 +107,12 @@ include: - local: 'benchmarks/pid/config.yml' - local: 'benchmarks/timing/config.yml' - local: 'benchmarks/b0_tracker/config.yml' + - local: 'benchmarks/others/config.yml' deploy_results: stage: deploy needs: - - ["collect_results:zdc","collect_results:barrel_ecal","collect_results:barrel_hcal","collect_results:crystal_calorimeter"] + - ["collect_results:zdc","collect_results:barrel_ecal","collect_results:barrel_hcal","collect_results:crystal_calorimeter","collect_results:materialscan"] script: - echo "deploy results!" diff --git a/benchmarks/others/config.yml b/benchmarks/others/config.yml new file mode 100644 index 0000000000000000000000000000000000000000..3c4348d4a7f4ad11d1099bf8bfc0bd56db501d92 --- /dev/null +++ b/benchmarks/others/config.yml @@ -0,0 +1,14 @@ +bench:materialscan: + stage: benchmarks + extends: .det_benchmark + script: + - echo ".x benchmarks/others/materialScan.cxx(-4.5, +4.5, 0.01, 500.)" | materialScan ${DETECTOR_PATH}/${JUGGLER_DETECTOR}.xml -interactive + - mkdir results/images/ && mv materialScan.png materialScan.pdf results/images/ + +collect_results:materialscan: + extends: .det_benchmark + stage: collect + needs: + - ["bench:materialscan"] + script: + - ls -lrht diff --git a/benchmarks/others/materialScan.cxx b/benchmarks/others/materialScan.cxx new file mode 100644 index 0000000000000000000000000000000000000000..9d27e2f38897504c703ca1f9449e0242dfa3a5bc --- /dev/null +++ b/benchmarks/others/materialScan.cxx @@ -0,0 +1,118 @@ +#import <iostream> +#import <vector> + +#include <DDRec/Material.h> +#include <DDRec/MaterialScan.h> + +#include <TH1F.h> +#include <THStack.h> + +Color_t color(const Material& m) { + if (m.name() == std::string("Silicon")) return kGray; + else if (m.name() == std::string("Aluminum")) return kAzure; + else if (m.name() == std::string("CarbonFiber")) return kGray; + else if (m.name() == std::string("Beryllium")) return kGreen; + else if (m.name() == std::string("Gold")) return kYellow; + else if (m.name() == std::string("Mylar")) return kGreen; + else if (m.name() == std::string("Kapton")) return kGreen; + else if (m.name() == std::string("Copper")) return kGreen; + else if (m.name() == std::string("C2F6_DRICH")) return kOrange; + else if (m.name() == std::string("Ar10CO2")) return kOrange; + else if (m.name() == std::string("Aerogel")) return kPink; + else if (m.name() == std::string("AerogelOptical")) return kPink; + else if (m.name() == std::string("Aerogel_DRICH")) return kPink; + else if (m.name() == std::string("Lead")) return kBlack; + else if (m.name() == std::string("Steel235")) return kGray+2; + else if (m.name() == std::string("TungstenDens24")) return kBlack; + else if (m.name() == std::string("Polystyrene")) return kGray; + else if (m.name() == std::string("PolystyreneFoam")) return kGray; + else if (m.name() == std::string("Epoxy")) return kGray; + else if (m.name() == std::string("PlasticScint")) return kGray; + else if (m.name() == std::string("AcrylicOptical")) return kGray; + else if (m.name() == std::string("Acrylic_DRICH")) return kGray; + else if (m.name() == std::string("Quartz")) return kViolet; + else if (m.name() == std::string("Air")) return kBlue; + else if (m.name() == std::string("AirOptical")) return kBlue; + else if (m.name() == std::string("Vacuum")) return kWhite; + else { + std::cout << "Unknown material: " << m.name() << std::endl; + return kRed; + } +} + +void materialScan( + double etamin = -2.0, + double etamax = +1.0, + double etastep = 0.2, + double rmax = 100.0, + double phi = 0.0) +{ + // check inputs + if (etamin * etamax >= 0.0 || etamin > etamax || rmax <= 0.0) { + std::cout << "Error: ordered eta range around zero required" << std::endl; + return -1; + } + + // get material scans + size_t total{0}; + std::vector<dd4hep::rec::MaterialVec> scan; + double x0{0}, y0{0}, z0{+0.001}; + for (double eta = etamin; eta <= etamax + 0.5*etastep; eta += etastep) { + double theta = 2.0 * atan(exp(-eta)); + double x = rmax * cos(phi) * sin(theta); + double y = rmax * sin(phi) * sin(theta); + double z = rmax * cos(theta); + scan.emplace_back(gMaterialScan->scan(x0,y0,z0,x,y,z)); + total += scan.back().size(); + } + + // start creating histograms for stacking: + // - start with first material layer at central eta bin + // - pop front layers first positive + size_t layer = 0; + std::vector<TH1F> histograms; + while (total > 0) { + // find next layer, starting from center bin outwards + size_t eta0 = static_cast<unsigned int>(std::rint(abs(-etamin/etastep))); + for (size_t i = 0, j = eta0; + i < scan.size(); + ++i, j += (2*eta0 < scan.size()? -1: +1) * (i <= 2*min(eta0,scan.size()-eta0-1)? (i%2==0? -i: +i): -1)) { + if (scan.at(j).size() == 0) continue; + // define layer + auto layer_anchor = scan.at(j).at(0); + histograms.emplace_back(Form("h%zu",layer++),layer_anchor.first.name(),scan.size(),etamin,etamax); + //histograms.back().SetLineColor(color(layer_anchor.first)); + histograms.back().SetFillColor(color(layer_anchor.first)); + // add all bins to this layer + for (size_t bin = 0; bin < scan.size(); bin++) { + double X0{0}; + for (auto& mat_len: scan.at(bin)) { + if (mat_len.first.name() == layer_anchor.first.name()) { + X0 += mat_len.second / mat_len.first.radLength(); + scan.at(bin).erase(scan.at(bin).begin()); total--; + } else { + break; + } + } + histograms.back().SetBinContent(bin+1, X0); // bins start at 1 + } + } + } + std::cout << histograms.size() << " histograms created" << std::endl; + + // plot histograms as stack + THStack hs("hs",Form("Material Scan (max distance %.0f cm)",rmax)); + for (auto& h: histograms) { + hs.Add(&h); + } + TCanvas cs("cs","Material Scan",1920,1080); + auto pad = cs.cd(); + pad->SetLogy(); + hs.Draw(); + hs.GetXaxis()->SetTitle("eta"); + hs.GetYaxis()->SetTitle("Fraction X0"); + hs.SetMinimum(2.5e-3); + hs.SetMaximum(100.); + cs.SaveAs("materialScan.png"); + cs.SaveAs("materialScan.pdf"); +}