diff --git a/clustering/barrel_clusters.sh b/clustering/barrel_clusters.sh index c04b3ae3f154a77c4d5e657566baad9384d61875..ecee95847ffacd5531826698aca1758028442886 100644 --- a/clustering/barrel_clusters.sh +++ b/clustering/barrel_clusters.sh @@ -28,15 +28,12 @@ mkdir ${JUGGLER_DETECTOR}/build pushd ${JUGGLER_DETECTOR}/build cmake ../. -DCMAKE_INSTALL_PREFIX=/usr/local && make -j30 install popd -# -## generate the input events -## note datasets is now only used to develop datasets. -##git clone https://eicweb.phy.anl.gov/EIC/datasets.git datasets + root -b -q "clustering/scripts/gen_central_electrons.cxx(${JUGGLER_N_EVENTS}, \"${JUGGLER_FILE_NAME_TAG}.hepmc\")" -# + pushd ${JUGGLER_DETECTOR} #ls -l -## run geant4 simulations +### run geant4 simulations npsim --runType batch \ --part.minimalKineticEnergy 1000*GeV \ -v WARNING \ @@ -51,6 +48,9 @@ ls -l popd pwd -mkdir -p results -cp topside/${JUGGLER_REC_FILE} results/. +mkdir -p results/clustering + +root -b -q "clustering/scripts/barrel_clusters.cxx(\"${JUGGLER_DETECTOR}/${JUGGLER_REC_FILE}\")" + +cp topside/${JUGGLER_REC_FILE} results/clustering/. diff --git a/clustering/options/calorimeter_clustering.py b/clustering/options/calorimeter_clustering.py index 1dce32ddf09a6ad140a85db24be78200c574c31a..281a201ab329a279b7ce9fe17e1cbc3babec8d75 100644 --- a/clustering/options/calorimeter_clustering.py +++ b/clustering/options/calorimeter_clustering.py @@ -28,6 +28,7 @@ from Configurables import Jug__Digi__CrystalEndcapsDigi as CrystalEndcapsDigi from Configurables import Jug__Reco__CrystalEndcapsReco as CrystalEndcapsReco from Configurables import Jug__Reco__EMCalReconstruction as EMCalReconstruction +from Configurables import Jug__Reco__SimpleClustering as SimpleClustering from Configurables import Jug__Reco__CalorimeterIslandCluster as IslandCluster from Configurables import Jug__Reco__ClusterRecoCoG as RecoCoG @@ -43,7 +44,7 @@ ecdigi = EMCalorimeterDigi("ec_barrel_digi", inputHitCollection="EcalBarrelHits" crystal_ec_reco = CrystalEndcapsReco("crystal_ec_reco", inputHitCollection="RawDigiEcalHits", outputHitCollection="RecoEcalHits", minModuleEdep=1.0*units.MeV,OutputLevel=DEBUG) ecal_reco = EMCalReconstruction("ecal_reco", inputHitCollection="RawEcalBarrelHits", outputHitCollection="RecEcalBarrelHits", - minModuleEdep=5.0*units.MeV,OutputLevel=DEBUG) + minModuleEdep=0.0*units.MeV,OutputLevel=DEBUG) ec_barrel_cluster = IslandCluster("ec_barrel_cluster", inputHitCollection="RecEcalBarrelHits", @@ -59,6 +60,12 @@ crystal_ec_cluster = IslandCluster("crystal_ec_cluster", groupRange=2.0, OutputLevel=DEBUG) +simple_cluster = SimpleClustering("simple_cluster", + inputHitCollection="RecEcalBarrelHits", + outputClusters="SimpleClusters", + OutputLevel=DEBUG) + + clusterreco = RecoCoG("cluster_reco", clusterCollection="EcalClusters", logWeightBase=4.2, moduleDimZName="CrystalBox_z_length",OutputLevel=DEBUG) out = PodioOutput("out", filename=output_rec_file) @@ -69,7 +76,9 @@ ApplicationMgr( TopAlg = [podioinput, copier, calcopier, ecdigi, emcaldigi, crystal_ec_reco, ecal_reco, - ec_barrel_cluster, crystal_ec_cluster, clusterreco, out], + ec_barrel_cluster, crystal_ec_cluster, clusterreco, + simple_cluster, + out], EvtSel = 'NONE', EvtMax = n_events, ExtSvc = [podioevent], diff --git a/clustering/scripts/barrel_clusters.cxx b/clustering/scripts/barrel_clusters.cxx new file mode 100644 index 0000000000000000000000000000000000000000..2cfb8783cff975d8d369e3904a79bbf9ac7dd578 --- /dev/null +++ b/clustering/scripts/barrel_clusters.cxx @@ -0,0 +1,137 @@ +#include <iostream> +#include "ROOT/RDataFrame.hxx" +#include "dd4pod/Geant4ParticleCollection.h" +#include "eicd/ClusterCollection.h" +#include "eicd/ClusterData.h" +// If root cannot find a dd4pod header make sure to add the include dir to ROOT_INCLUDE_PATH: +// export ROOT_INCLUDE_PATH=$HOME/include:$ROOT_INCLUDE_PATH + +using ROOT::RDataFrame; +using namespace ROOT::VecOps; + +auto momentum = [](std::vector<ROOT::Math::PxPyPzMVector> const& in) { + std::vector<double> result; + for (size_t i = 0; i < in.size(); ++i) { + result.push_back(in[i].E()); + } + return result; +}; +auto theta = [](std::vector<ROOT::Math::PxPyPzMVector> const& in) { + std::vector<double> result; + for (size_t i = 0; i < in.size(); ++i) { + result.push_back(in[i].Theta()*180/M_PI); + } + return result; +}; +auto fourvec = [](ROOT::VecOps::RVec<dd4pod::Geant4ParticleData> const& in) { + std::vector<ROOT::Math::PxPyPzMVector> result; + ROOT::Math::PxPyPzMVector lv; + for (size_t i = 0; i < in.size(); ++i) { + lv.SetCoordinates(in[i].psx, in[i].psy, in[i].psz, in[i].mass); + result.push_back(lv); + } + return result; +}; +auto pt = [](std::vector<dd4pod::Geant4ParticleData> const& in) { + std::vector<float> result; + for (size_t i = 0; i < in.size(); ++i) { + result.push_back(std::sqrt(in[i].psx * in[i].psx + in[i].psy * in[i].psy)); + } + return result; +}; +auto eta = [](ROOT::VecOps::RVec<dd4pod::Geant4ParticleData> const& in) { + std::vector<float> result; + ROOT::Math::PxPyPzMVector lv; + for (size_t i = 0; i < in.size(); ++i) { + lv.SetCoordinates(in[i].psx, in[i].psy, in[i].psz, in[i].mass); + result.push_back(lv.Eta()); + } + return result; +}; + +auto delta_E = [](std::vector<ROOT::Math::PxPyPzMVector> const& thrown, const std::vector<eic::ClusterData>& clusters) { + std::vector<double> result; + double best = 1000000.0; + for (const auto& p : thrown) { + for (const auto& c : clusters) { + double dE = (p.E() - c.energy); + result.push_back(dE ); + if( dE < best) { + best = dE; + } + } + } + return best; +}; + + +void barrel_clusters(const char* in_fname = "topside/rec_barrel_clusters.root") +{ + ROOT::EnableImplicitMT(); + ROOT::RDataFrame df("events", in_fname); + + auto d0 = df.Define("isThrown", "mcparticles2.genStatus == 1") + .Define("thrownParticles", "mcparticles2[isThrown]") + .Define("thrownP", fourvec, {"thrownParticles"}) + .Define("thrownEta", eta, {"thrownParticles"}) + .Define("thrownTheta", theta, {"thrownP"}) + .Define("thrownMomentum", momentum, {"thrownP"}) + .Define("delta_E", delta_E, {"thrownP","SimpleClusters"}) + .Define("nclusters", "SimpleClusters.size()") + .Define("Ecluster", + [](const std::vector<eic::ClusterData>& in) { + std::vector<double> res; + for (const auto& i : in) + res.push_back(i.energy); + return res; + }, + {"SimpleClusters"}); + + auto d1 = d0.Filter("nclusters==1"); + auto c_nclusters1 = d1.Count(); + auto c_thrown = d0.Count(); + + auto h_eta_thrown = d0.Histo1D({"h_eta_thrown", " ; #eta ", 100, -5.0, 0.0}, "thrownEta"); + auto h_theta_thrown = d0.Histo1D({"h_theta_thrown", "; #theta", 100, 30.0, 180.0}, "thrownTheta"); + auto h_momentum_thrown = d0.Histo1D({"h_momentum_thrown", "; E [GeV]", 100, 0.0, 30.0}, "thrownMomentum"); + auto h_nclusters = d0.Histo1D({"h_nclusters", "; N clusters", 6, 0, 6}, "nclusters"); + auto h_Ecluster = d0.Histo1D({"h_Ecluster", "; cluster E [GeV]", 100, 0, 1}, "Ecluster"); + auto h_Ecluster1 = d1.Histo1D({"h_Ecluster1", "One cluster events; cluster E [GeV]", 100, 0, 30}, "Ecluster"); + auto h_momentum_thrown1 = d1.Histo1D({"h_momentum_thrown", "; E [GeV]", 100, 0.0, 30.0},"thrownMomentum"); + + auto h_delta_E = d0.Histo1D({"h_delta_E", "; #Delta E [GeV]", 100, -10, 10}, "delta_E"); + + //auto h_Ecluster2 = d1.Filter("thrownMomentum > 4").Histo1D({"h_Ecluster1", "One cluster events; cluster E [GeV]",100, 0,30},"Ecluster"); + //auto h_momentum_thrown2 = d1.Filter("thrownMomentum > 4").Histo1D({"h_momentum_thrown", "; E [GeV]", 100, 0.0, 30.0},"thrownMomentum"); + + auto c = new TCanvas(); + + h_eta_thrown->DrawCopy(); + c->SaveAs("results/clustering/barrel_clusters_etaThrown.png"); + + h_theta_thrown->DrawCopy(); + c->SaveAs("results/clustering/barrel_clusters_thetaThrown.png"); + + h_nclusters->DrawCopy(); + c->SaveAs("results/clustering/barrel_clusters_nclusters.png"); + + h_Ecluster->DrawCopy(); + h_Ecluster1->SetLineColor(2); + h_Ecluster1->DrawCopy("same"); + //h_Ecluster2->SetLineColor(4); + //h_Ecluster2->DrawCopy("same"); + c->SaveAs("results/clustering/barrel_clusters_Ecluster.png"); + + h_momentum_thrown->DrawCopy(); + c->SaveAs("results/clustering/barrel_clusters_momentum_thrown.png"); + + h_delta_E->DrawCopy(); + c->SaveAs("results/clustering/barrel_clusters_delta_E.png"); + + std::cout << (*c_nclusters1) << " / " << (*c_thrown) << " = single cluster events/all \n"; + + //c->SaveAs("results/crystal_cal_electrons_Ecluster.png"); + //std::string outfilename = "rdf_test.root"; + //df2.Snapshot("events", outfilename, {"MCParticles_pt", "mcparticles"}); + return 0; +} diff --git a/clustering/scripts/gen_central_electrons.cxx b/clustering/scripts/gen_central_electrons.cxx index 06867dfaea7507522bf41a0ffc3ca87d413fb301..e3e08bd44007fd907bbe0188d11ac2686e0897a4 100644 --- a/clustering/scripts/gen_central_electrons.cxx +++ b/clustering/scripts/gen_central_electrons.cxx @@ -42,7 +42,7 @@ void gen_central_electrons(int n_events = 100, Double_t p = r1->Uniform(1.0, 10.0); Double_t phi = r1->Uniform(0.0, 2.0 * M_PI); Double_t costh = r1->Uniform(cos_theta_min, cos_theta_max); - Double_t th = std::acos(costh); + Double_t th = M_PI/2.1;//std::acos(costh); Double_t px = p * std::cos(phi) * std::sin(th); Double_t py = p * std::sin(phi) * std::sin(th); Double_t pz = p * std::cos(th);