Commit df337d16 authored by Håkan Wennlöf's avatar Håkan Wennlöf
Browse files

Added output plots for the deposition positions.

parent d2e4249d
Loading
Loading
Loading
Loading
+64 −2
Original line number Diff line number Diff line
@@ -38,6 +38,10 @@ DepositionPointChargeModule::DepositionPointChargeModule(Configuration& config,
    config_.setDefault("position", ROOT::Math::XYZPoint(0., 0., 0.));
    config_.setDefault("source_type", SourceType::POINT);

    // Plotting parameters
    config_.setDefault<bool>("output_plots", false);
    config_.setDefault<int>("output_plots_bins_per_um", 1);

    // Read type and model:
    type_ = config_.get<SourceType>("source_type");
    model_ = config_.get<DepositionModel>("model");
@@ -59,6 +63,8 @@ DepositionPointChargeModule::DepositionPointChargeModule(Configuration& config,
void DepositionPointChargeModule::initialize() {

    auto model = detector_->getModel();
    output_plots_ = config_.get<bool>("output_plots");
    output_plots_bins_per_um_ = config_.get<int>("output_plots_bins_per_um");

    // Set up the different source types
    if(type_ == SourceType::MIP) {
@@ -154,7 +160,40 @@ void DepositionPointChargeModule::initialize() {
            voxel_ = ROOT::Math::XYZVector(
                model->getPixelSize().x() / root_, model->getPixelSize().y() / root_, model->getSensorSize().z() / root_);
        }
        LOG(WARNING) << "Voxel size for scan of pixel volume: " << Units::display(voxel_, {"um", "mm"});
        LOG(INFO) << "Voxel size for scan of pixel volume: " << Units::display(voxel_, {"um", "mm"});
    }

    if(output_plots_) {
        auto bins_x = static_cast<int>(output_plots_bins_per_um_ * Units::convert(model->getPixelSize().x(), "um"));
        auto bins_y = static_cast<int>(output_plots_bins_per_um_ * Units::convert(model->getPixelSize().y(), "um"));
        auto bins_z = static_cast<int>(output_plots_bins_per_um_ * Units::convert(model->getSensorSize().z(), "um"));
        deposition_position_xy =
            CreateHistogram<TH2D>("deposition_position_xy",
                                  "Deposition position, x-y plane;x [#mum];y [#mum]",
                                  bins_x,
                                  -static_cast<double>(Units::convert(model->getPixelSize().x() / 2, "um")),
                                  static_cast<double>(Units::convert(model->getPixelSize().x() / 2, "um")),
                                  bins_y,
                                  -static_cast<double>(Units::convert(model->getPixelSize().y() / 2, "um")),
                                  static_cast<double>(Units::convert(model->getPixelSize().y() / 2, "um")));
        deposition_position_xz =
            CreateHistogram<TH2D>("deposition_position_xz",
                                  "Deposition position, x-z plane;x [#mum];z [#mum]",
                                  bins_x,
                                  -static_cast<double>(Units::convert(model->getPixelSize().x() / 2, "um")),
                                  static_cast<double>(Units::convert(model->getPixelSize().x() / 2, "um")),
                                  bins_z,
                                  -static_cast<double>(Units::convert(model->getSensorSize().z() / 2, "um")),
                                  static_cast<double>(Units::convert(model->getSensorSize().z() / 2, "um")));
        deposition_position_yz =
            CreateHistogram<TH2D>("deposition_position_yz",
                                  "Deposition position, y-z plane;y [#mum];z [#mum]",
                                  bins_y,
                                  -static_cast<double>(Units::convert(model->getPixelSize().y() / 2, "um")),
                                  static_cast<double>(Units::convert(model->getPixelSize().y() / 2, "um")),
                                  bins_z,
                                  -static_cast<double>(Units::convert(model->getSensorSize().z() / 2, "um")),
                                  static_cast<double>(Units::convert(model->getSensorSize().z() / 2, "um")));
    }
}

@@ -197,7 +236,7 @@ void DepositionPointChargeModule::run(Event* event) {
                position.SetZ(voxel_.z() * static_cast<double>((event->number - 1) % root_) + ref.z());
            }
        }
        LOG(WARNING) << "Deposition position in local coordinates: " << Units::display(position, {"um", "mm"});
        LOG(DEBUG) << "Deposition position in local coordinates: " << Units::display(position, {"um", "mm"});
    } else {
        // Calculate random offset from configured position
        auto shift = [&](auto size) {
@@ -217,6 +256,29 @@ void DepositionPointChargeModule::run(Event* event) {
    } else {
        DepositPoint(event, position);
    }

    if(output_plots_) {
        auto [xpixel, ypixel] = model->getPixelIndex(position);
        auto inPixelPos = position - model->getPixelCenter(xpixel, ypixel);
        auto in_pixel_um_x = static_cast<double>(Units::convert(inPixelPos.x(), "um"));
        auto in_pixel_um_y = static_cast<double>(Units::convert(inPixelPos.y(), "um"));
        auto in_pixel_um_z = static_cast<double>(Units::convert(position.z(), "um"));
        deposition_position_xy->Fill(in_pixel_um_x, in_pixel_um_y);
        deposition_position_xz->Fill(in_pixel_um_x, in_pixel_um_z);
        deposition_position_yz->Fill(in_pixel_um_y, in_pixel_um_z);
    }
}

void DepositionPointChargeModule::finalize() {
    if(output_plots_) {
        deposition_position_xy->Get()->SetOption("colz");
        deposition_position_xz->Get()->SetOption("colz");
        deposition_position_yz->Get()->SetOption("colz");

        deposition_position_xy->Write();
        deposition_position_xz->Write();
        deposition_position_yz->Write();
    }
}

void DepositionPointChargeModule::DepositPoint(Event* event, const ROOT::Math::XYZPoint& position) {
+15 −0
Original line number Diff line number Diff line
@@ -11,6 +11,8 @@

#include <string>

#include <TH2D.h>

#include "core/module/Module.hpp"

namespace allpix {
@@ -57,6 +59,11 @@ namespace allpix {
         */
        void run(Event*) override;

        /**
         * @brief Write output plots
         */
        void finalize() override;

    private:
        /**
         * @brief Helper function to deposit charges at a single point
@@ -88,5 +95,13 @@ namespace allpix {
        bool scan_x_;
        bool scan_y_;
        bool scan_z_;

        // Output plot parameters
        bool output_plots_{};
        int output_plots_bins_per_um_{};

        Histogram<TH2D> deposition_position_xy;
        Histogram<TH2D> deposition_position_xz;
        Histogram<TH2D> deposition_position_yz;
    };
} // namespace allpix
+6 −1
Original line number Diff line number Diff line
@@ -35,6 +35,11 @@ All charge carriers are deposited at time zero, i.e. at the beginning of the eve
* `spot_size`: Width of the Gaussian distribution used to smear the position in the `spot` model. Only one value is taken and used for all three dimensions.
* `scan_coordinates`: Coordinates to scan over, a combiantion of x, y, z. Defaults to `x y z`, i.e. all three spatial coordinates. The `position`parameter is used to determine the value of the coordiantes that are not scanned over if a partial scan is requested, and the start offset of the scan for the other coordinates.

### Plotting parameters

- `output_plots` : Determines if output plots should be generated. Disabled by default.
- `output_plots_bins_per_um` : Number of bins per micrometer in all directions in the 2D histograms used to plot deposition position. Only used if `output_plots` is enabled.

## Usage

Example configuration for a point source at a defined position around which 100 charge carriers are deposited with a Gaussian distribution:
@@ -48,7 +53,7 @@ spot_size = 3um
number_of_charges = 100
```

Example configuration for a point source scanned over the x and y cooridantes, with a fixed z coordinate of 10 micrometers from the sensor middle:
Example configuration for a point source scanned over the x and y cooridantes, with a fixed z coordinate of 10 micrometers (with the sensor centre at 0):

```ini
[DepositionPointCharge]