Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions sbndcode/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,5 @@ add_subdirectory(SBNDCVN)
add_subdirectory(TPCPMTBarycenterMatching)

add_subdirectory(WireMod)

add_subdirectory(CathodeFilter)
78 changes: 78 additions & 0 deletions sbndcode/CathodeFilter/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# Data-driven cathode volume library
art_make_library(
LIBRARY_NAME sbndcode_CathodeFilter
SOURCE SBNDCathode.cxx
LIBRARIES
cetlib::cetlib
lardataobj::Simulation
art_root_io::TFileService_service
ROOT::Core
ROOT::GenVector
INTERFACE
)

# The art producer module
cet_build_plugin(SBNDCathode art::tool
SOURCE
SBNDCathode.cxx
LIBRARIES
sbndcode_CathodeFilter
lardataobj::Simulation
art::Framework_Core
art::Framework_Principal
art::Framework_Services_Registry
art::Persistency_Common
art::Utilities
canvas::canvas
messagefacility::MF_MessageLogger
fhiclcpp::fhiclcpp
cetlib::cetlib
cetlib_except::cetlib_except
CLHEP::CLHEP
ROOT::Core
ROOT::GenVector
)


# The art producer module
cet_build_plugin( CathodeFilterSBND art::module
SOURCE
CathodeSimEnergyDepositFilter_module.cc
LIBRARIES
sbndcode_CathodeFilter
larcorealg::Geometry
larcore::Geometry_Geometry_service
larsim::Simulation
lardataobj::Simulation
larcoreobj::headers
lardata::Utilities
lardata::RecoObjects
nusimdata::SimulationBase
lardataobj::Simulation
art::Framework_Core
art::Framework_Principal
art::Framework_Services_Registry
art::Persistency_Common
art::Utilities
canvas::canvas
messagefacility::MF_MessageLogger
fhiclcpp::fhiclcpp
cetlib::cetlib
cetlib_except::cetlib_except
CLHEP::CLHEP
ROOT::Core
art_root_io::tfile_support
art_root_io::TFileService_service
ROOT::MathCore
ROOT::GenVector
)

#cet_build_plugin(CathodeFilterSBND art::module SOURCE CathodeSimEnergyDepositFilter_module.cc LIBRARIES ${MODULE_LIBRARIES})

install_headers()
install_source()
install_fhicl(SUBDIRS fcl)
cet_enable_asserts()

# install sbnd_pds_mapping.json with mapping of the photon detectors
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment seems wrong

install_fw(LIST sbnd_cathode_v6.txt)
172 changes: 172 additions & 0 deletions sbndcode/CathodeFilter/CathodeSimEnergyDepositFilter_module.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
////////////////////////////////////////////////////////////////////////////////
// Class: CathodeSimEnergyDepositFilter
// Plugin Type: producer (art v3_xx / LArSoft v09+)
//
// Reads one or more sim::SimEnergyDeposit collections, drops every deposit
// whose MidPoint (and, optionally, Start or End) lies inside the data-driven
// SBND cathode volume (sbnd::SBNDCathode), and writes the surviving deposits
// back out under this module's label with user-specified instance names.
//
// Configuring multiple (input, output-instance) pairs in a single job mirrors
// ionandscint's behaviour of emitting both "" (default instance) and
// "priorSCE" collections. With a single-element list the module behaves
// like a simple 1:1 filter.
//
// FHiCL parameters
// -----------------
// SimEnergyDepositLabels (vector<InputTag>)
// default { "ionandscint" }
// input collections, one per produced output.
// OutputInstances (vector<string>)
// default { "" }
// instance name used for each produced collection. Must have the
// same length as SimEnergyDepositLabels.
// CathodeVolumeFile (string) required
// UseStepEndpoints (bool) default false
// NanPolicy (string) default "outside" ("outside"|"inside"|"throw")
// Interp (string) default "bilinear" ("bilinear"|"nearest")
// Verbose (bool) default false
//
// Produces
// --------
// std::vector<sim::SimEnergyDeposit> (one per OutputInstances entry)
////////////////////////////////////////////////////////////////////////////////

#include "art/Framework/Core/EDProducer.h"
#include "art/Framework/Core/ModuleMacros.h"
#include "art/Framework/Principal/Event.h"
#include "art/Framework/Principal/Handle.h"
#include "canvas/Utilities/InputTag.h"
#include "fhiclcpp/ParameterSet.h"
#include "messagefacility/MessageLogger/MessageLogger.h"
#include "cetlib_except/exception.h"

#include "lardataobj/Simulation/SimEnergyDeposit.h"

#include "sbndcode/CathodeFilter/SBNDCathode.h"

#include <memory>
#include <string>
#include <vector>
#include "TMath.h"
#include "Math/GenVector/Cartesian3D.h"

namespace sbnd {

class CathodeSimEnergyDepositFilter : public art::EDProducer {
public:
explicit CathodeSimEnergyDepositFilter(fhicl::ParameterSet const& p);

CathodeSimEnergyDepositFilter(CathodeSimEnergyDepositFilter const&) = delete;
CathodeSimEnergyDepositFilter(CathodeSimEnergyDepositFilter&&) = delete;
CathodeSimEnergyDepositFilter& operator=(CathodeSimEnergyDepositFilter const&) = delete;
CathodeSimEnergyDepositFilter& operator=(CathodeSimEnergyDepositFilter&&) = delete;

void produce(art::Event& e) override;

private:
std::vector<art::InputTag> fInputLabels;
std::vector<std::string> fOutputInstances;
std::string fCathodeVolumeFile;
bool fUseStepEndpoints;
std::string fNanPolicyStr;
std::string fInterpStr;
bool fVerbose;

std::unique_ptr<SBNDCathode> fCathode;

bool depositInsideCathode(sim::SimEnergyDeposit const& d) const;
};

CathodeSimEnergyDepositFilter::CathodeSimEnergyDepositFilter(fhicl::ParameterSet const& p)
: EDProducer(p)
, fInputLabels (p.get<std::vector<art::InputTag>>("SimEnergyDepositLabels",
{ art::InputTag("ionandscint") }))
, fOutputInstances (p.get<std::vector<std::string>>("OutputInstances",
{ std::string{} }))
, fCathodeVolumeFile(p.get<std::string>("CathodeVolumeFile"))
, fUseStepEndpoints (p.get<bool> ("UseStepEndpoints", false))
, fNanPolicyStr (p.get<std::string>("NanPolicy", "outside"))
, fInterpStr (p.get<std::string>("Interp", "bilinear"))
, fVerbose (p.get<bool> ("Verbose", false))
{
if (fInputLabels.empty())
throw cet::exception("CathodeSimEnergyDepositFilter")
<< "SimEnergyDepositLabels must contain at least one entry";
if (fInputLabels.size() != fOutputInstances.size())
throw cet::exception("CathodeSimEnergyDepositFilter")
<< "SimEnergyDepositLabels and OutputInstances must have the same length "
<< "(" << fInputLabels.size() << " vs " << fOutputInstances.size() << ")";

fCathode = std::make_unique<SBNDCathode>(fCathodeVolumeFile);

if (fNanPolicyStr == "outside") fCathode->setNanPolicy(SBNDCathode::NanPolicy::Outside);
else if (fNanPolicyStr == "inside" ) fCathode->setNanPolicy(SBNDCathode::NanPolicy::Inside);
else if (fNanPolicyStr == "throw" ) fCathode->setNanPolicy(SBNDCathode::NanPolicy::Throw);
else throw cet::exception("CathodeSimEnergyDepositFilter")
<< "Unknown NanPolicy '" << fNanPolicyStr << "'";

if (fInterpStr == "bilinear") fCathode->setInterp(SBNDCathode::Interp::Bilinear);
else if (fInterpStr == "nearest" ) fCathode->setInterp(SBNDCathode::Interp::Nearest);
else throw cet::exception("CathodeSimEnergyDepositFilter")
<< "Unknown Interp '" << fInterpStr << "'";

mf::LogInfo("CathodeSimEnergyDepositFilter") << fCathode->describe();
for (size_t i = 0; i < fInputLabels.size(); ++i) {
mf::LogInfo("CathodeSimEnergyDepositFilter")
<< "filter [" << i << "]: "
<< fInputLabels[i].encode()
<< " -> <this>:\"" << fOutputInstances[i] << "\"";
produces<std::vector<sim::SimEnergyDeposit>>(fOutputInstances[i]);
}
}

bool CathodeSimEnergyDepositFilter::depositInsideCathode(
sim::SimEnergyDeposit const& d) const {
const auto mid = d.MidPoint();
if (fCathode->contains(mid.X(), mid.Y(), mid.Z())) return true;

if (fUseStepEndpoints) {
if (fCathode->contains(d.StartX(), d.StartY(), d.StartZ())) return true;
if (fCathode->contains(d.EndX(), d.EndY(), d.EndZ() )) return true;
}
return false;
}

void CathodeSimEnergyDepositFilter::produce(art::Event& e) {
for (size_t i = 0; i < fInputLabels.size(); ++i) {
auto const& in =
e.getValidHandle<std::vector<sim::SimEnergyDeposit>>(fInputLabels[i]);

auto out = std::make_unique<std::vector<sim::SimEnergyDeposit>>();
out->reserve(in->size());

size_t nKept = 0, nDropped = 0;
double eKept = 0.0, eDropped = 0.0;
for (sim::SimEnergyDeposit const& dep : *in) {
if (depositInsideCathode(dep)) {
++nDropped;
eDropped += dep.Energy();
continue;
}
out->push_back(dep);
++nKept;
eKept += dep.Energy();
}

if (fVerbose) {
mf::LogInfo("CathodeSimEnergyDepositFilter")
<< "[" << fInputLabels[i].encode() << " -> :"
<< fOutputInstances[i] << "] "
<< "kept " << nKept << " (" << eKept << " MeV) / "
<< "dropped " << nDropped << " (" << eDropped << " MeV) / "
<< "total " << in->size();
}

e.put(std::move(out), fOutputInstances[i]);
}
}

} // namespace sbnd

DEFINE_ART_MODULE(sbnd::CathodeSimEnergyDepositFilter)
43 changes: 43 additions & 0 deletions sbndcode/CathodeFilter/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# sbndcode/CathodeFilter

Data-driven representation of the SBND cathode (CPA) volume, reconstructed
from cosmic-muon track endpoints, and an art::EDProducer that uses it to
drop `sim::SimEnergyDeposit`s that lie inside the cathode volume.

## Files
- `SBNDCathode.h / .cxx` — C++17 class that loads the ASCII volume file and
exposes `contains(x, y, z)`, `x_neg`, `x_pos`, `thickness`, etc.
- `CathodeSimEnergyDepositFilter_module.cc` — art producer; reads a
`sim::SimEnergyDeposit` collection and writes a filtered collection
that excludes every deposit whose MidPoint (and optionally Start/End)
lies inside the cathode volume.
- `fcl/cathode_simenergydeposit_filter.fcl` — default PROLOG.
- `fcl/run_cathode_filter.fcl` — drop-in job that wires the producer
around any SBND simulation input file.
- `data/sbnd_cathode_v6.txt` — 160 × 200 grid of (x_neg, x_pos) in cm,
installed to `$FW_SEARCH_PATH/sbndcode/CathodeFilter/sbnd_cathode_v6.txt`.

## Build
Append `add_subdirectory(CathodeFilter)` to `sbndcode/sbndcode/CMakeLists.txt`.
Then rebuild sbndcode:

```
mrb z
mrbsetenv
mrb i -j4
```

## Run
```
lar -c run_cathode_filter.fcl -s <input.root> -n 10
```

## Parameters (FHiCL)
| name | type | default | meaning |
| --- | --- | --- | --- |
| `SimEnergyDepositLabel` | `art::InputTag` | `"ionandscint"` | input sim::SimEnergyDeposit collection |
| `CathodeVolumeFile` | `std::string` | *required* | fw-search-path-resolved ASCII volume file |
| `UseStepEndpoints` | `bool` | `false` | also reject deposits whose Start or End lies inside the cathode (in addition to the MidPoint test) |
| `NanPolicy` | `std::string` | `"outside"` | `outside` / `inside` / `throw` at (y,z) bins with no endpoint data |
| `Interp` | `std::string` | `"bilinear"` | `bilinear` / `nearest` |
| `Verbose` | `bool` | `false` | log kept/dropped counts per event |
Loading