#include #include #include #include #include #include #include #include #include "Garfield/MediumCdTe.hh" #include "Garfield/ComponentComsol.hh" #include "Garfield/ComponentConstant.hh" #include "Garfield/ComponentUser.hh" #include "Garfield/ComponentAnalyticField.hh" #include "Garfield/Sensor.hh" #include "Garfield/TrackHeed.hh" #include "Garfield/AvalancheMC.hh" #include "Garfield/SolidBox.hh" #include "Garfield/GeometrySimple.hh" #include "Garfield/ViewMedium.hh" #include "Garfield/ViewDrift.hh" #include "Garfield/ViewField.hh" #include "Garfield/ViewSignal.hh" #include "Garfield/Plotting.hh" #include "Garfield/FundamentalConstants.hh" #include "Garfield/Random.hh" using namespace Garfield; using namespace std; int main(int argc, char *argv[]) { TApplication app("app", &argc, argv); // 绘图控制 constexpr bool plotField = true; constexpr bool plotWeightingField = true; constexpr bool plotDrift = true; constexpr bool plotSignal = true; constexpr bool savefile = true; constexpr bool plotVelocity = true; // 画板 TCanvas *canvasSignal = nullptr; TCanvas *canvasField = nullptr; TCanvas *canvasWeightingField = nullptr; TCanvas *canvasDrift = nullptr; TCanvas *canvasVelocity = nullptr; // signal时间窗设置 constexpr double tMin = 0.; constexpr double tMax = 10000; // ns constexpr double tStep = 1; // 每个bin的宽度是1ns constexpr int nTimeBins = int((tMax - tMin) / tStep); // load field map from comsol const std::string path = "comsol/"; const string label_weight = "readout_anode"; ComponentComsol cmp; cmp.Initialise(path + "mesh.mphtxt", path + "mplist.txt", path + "potential.txt", "mm"); cmp.SetWeightingField(path + "weight-potential.txt", label_weight); cmp.PrintRange(); // Create a sensor Sensor sensor; sensor.Clear(); sensor.AddComponent(&cmp); sensor.AddElectrode(&cmp, label_weight); sensor.SetTimeWindow(tMin, tStep, nTimeBins); // View Field if (plotField) { ViewField *fieldView = new ViewField(); canvasField = new TCanvas("cField", "", 600, 600); fieldView->SetCanvas(canvasField); fieldView->SetPlaneYZ(); fieldView->SetSensor(&sensor); fieldView->Plot("e"); } if (plotWeightingField) { ViewField *wfieldView = new ViewField(); wfieldView->SetComponent(&cmp); wfieldView->SetPlaneYZ(); wfieldView->PlotContourWeightingField(label_weight, "e"); } app.Run(); }