Files
2023-12-08 10:43:34 +01:00

127 lines
5.1 KiB
C++

//***********************************************************************************************************
// GPSPointLoop.C
// Root command file
// Type: root GPSPointLoop.C
//
// It generates a macro file to run the simulation.
//
// More information is available in UserGuide
// Created by Z.LI LP2i Bordeaux 2022
//***********************************************************************************************************
// include <stdio.h>
// include <string.h>
// include <stdint.h>
// include <vector>
// include <math.h>
// using namespace std;
void GPSPointLoop()
{
gSystem->CopyFile("pixe3d_initial.mac", "pixe3d.mac", true);
FILE* pfile = fopen("pixe3d.mac", "a+");
// gSystem->CopyFile("pixe3d_initial.mac", "pixe3d_stim.mac", true);
// FILE* pfile = fopen("pixe3d_stim.mac", "a+");
//***********************************************
//***(begin)** Define scan parameters************
//***********************************************
//***********************************************
int NumberOfProjections = 10; // Define the number of Projections from zero to TotalAngleSpan
// (last value "TotalAngleSpan" is excluded)
int NumberOfSlices = 1; // Define the number of Slices
int NumberOfPixels = 20; // Define the number of Pixels for square YZ Scan
double TotalAngleSpan = 180; // scan angular range in degrees
double ScanSize = 40 * 1.8; // unit um, scan size for cube of 40 um
// double ScanSize = 42.48*1.8; // unit um, scan size for C.elegans
// double ScanSize = 500; // unit um, scan size for GDP
double ScanHeight = ScanSize; // Height of the scan, it depends on the need
// double ScanHeight = 201.127; //Height of the scan for STIM-T simulatio of C. elegans, for 128
// slices
int NbParticles = 1000000;
double energy = 1.5; // MeV
char typeParticle[10] = "proton";
double PixelWidth = 1. * ScanSize / NumberOfPixels; // Width of each pixel
double SliceHeight = 1. * ScanHeight / NumberOfSlices; // Height of each
// slice
double AngleStep =
1. * TotalAngleSpan / NumberOfProjections; // angular increment (in degrees)
// between two consecutive projections
//
// The beam position is at the center of each pixel
// Starting position of the beam = StartScan + 0.5 x PixelWidth
// The scan starts from the bottom left of the square
//
double StartScanXY = -0.5 * ScanSize;
double StartScanZ = -0.5 * ScanHeight;
// double StartScanZ = 0;
bool isInterrupted = false;
int P_interrupt = 0; // the start of projection index to resume a simulation
//***********************************************
//***(end)** Define scan parameters**************
//***********************************************
//************************************
//***(begin)** SCAN IMPLEMENTATION ***
//************************************
fprintf(pfile, "/tomography/run/scanParameters %d %d %d\n", NumberOfProjections, NumberOfSlices,
NumberOfPixels);
fprintf(pfile, "#\n");
if (isInterrupted) {
fprintf(pfile, "/tomography/run/resumeSimulation true\n");
fprintf(pfile, "/tomography/run/resumeProjectionIndex %d\n", P_interrupt);
fprintf(pfile, "#\n");
}
fprintf(pfile, "/run/initialize\n");
fprintf(pfile, "#\n");
// fprintf(pfile, "/run/printProgress 500000\n");
// fprintf(pfile, "#\n");
fprintf(pfile, "# Source definition : energy, type\n");
fprintf(pfile, "#\n");
fprintf(pfile, "/gps/energy %.2f MeV\n", energy);
fprintf(pfile, "/gps/particle %s\n", typeParticle);
fprintf(pfile, "#\n");
fprintf(pfile, "# SOURCE POSITION AND DIRECTION\n");
fprintf(pfile, "#\n");
for (int projectionIndex = 0; projectionIndex < NumberOfProjections;
++projectionIndex) // projections
{
if (isInterrupted) {
if (projectionIndex < P_interrupt) continue;
}
for (int sliceIndex = 0; sliceIndex < NumberOfSlices; ++sliceIndex) // slices
{
// if(sliceIndex<15) continue;
for (int pixelIndex = 0; pixelIndex < NumberOfPixels; ++pixelIndex) // pixels
{
double px = cos(projectionIndex * AngleStep * TMath::DegToRad()); // beam direction
double py = sin(projectionIndex * AngleStep * TMath::DegToRad());
double pz = 0.0;
double x =
StartScanXY * px - (StartScanXY + (pixelIndex + 0.5) * PixelWidth) * py; // beam position
double y = StartScanXY * py + (StartScanXY + (pixelIndex + 0.5) * PixelWidth) * px;
double z = StartScanZ + (sliceIndex + 0.5) * SliceHeight;
// z = 18.07; //if z is fixed
// z = z + 1.953125;
// z = z + 3.90625;
fprintf(pfile, "/gps/direction %f %f %f\n", px, py, pz);
// fprintf(pfile, "/gps/pos/centre %.6f %.6f %.6f um\n",x, y, z );
fprintf(pfile, "/gps/pos/centre %f %f %f um\n", x, y, z);
fprintf(pfile, "/run/beamOn %d\n", NbParticles);
fprintf(pfile, "#\n");
}
}
}
fclose(pfile);
//************************************
//***(end)** SCAN IMPLEMENTATION ***
//************************************
}