3#include "GaudiKernel/ISvcLocator.h"
4#include "GaudiKernel/Bootstrap.h"
5#include "GaudiKernel/IDataProviderSvc.h"
6#include "GaudiKernel/SmartDataPtr.h"
7#include "GaudiKernel/DataSvc.h"
9#include "CLHEP/Units/PhysicalConstants.h"
17using namespace Garfield;
33 m_magConfig = magConfig;
38 m_track =
new TrackHeed();
39 m_track->SetSensor(m_sensor);
40 if(m_debugging) m_track->EnableDebugging();
41 else m_track->DisableDebugging();
50 double x0 = 0., y0 = 0., z0 = 0., t0 = 0.;
64 double dx0 = (trkPosOut[0] - trkPosIn[0])/10.0;
65 double dy0 = (trkPosOut[1] - trkPosIn[1])/10.0;
66 double dz0 = (trkPosOut[2] - trkPosIn[2])/10.0;
67 double trkL = sqrt(dx0*dx0 + dy0*dy0 + dz0*dz0);
73 double minX = 0. < dx0 ? 0. : dx0;
74 double maxX = 0. < dx0 ? dx0 : 0.;
75 double minY = 0. < dy0 ? 0. : dy0;
76 double maxY = 0. < dy0 ? dy0 : 0.;
77 double minZ = 0. < dz0 ? 0. : dz0;
78 double maxZ = 0. < dz0 ? dz0 : 0.;
92 string particleType = getParticle(particle, charge);
94 m_track->SetParticle(particleType);
95 m_track->SetMomentum(p*1.e9);
97 m_sensor->SetArea(minX, minY, minZ, maxX, maxY, maxZ);
106 m_track->NewTrack(x0, y0, z0, t0, dx0, dy0, dz0);
113 double xc = 0., yc = 0., zc = 0., tc = 0.;
119 while(m_track->GetCluster(xc, yc, zc, tc, nc, ec, extra)){
121 double length = sqrt(pow(xc,2)+pow(yc,2)+pow(zc,2));
124 cout <<
"overflow -------------------------" << endl;
129 for(
int j = 0; j<nc; ++j) {
130 double xe, ye, ze, te;
131 double ee, dxe, dye, dze;
133 m_track->GetElectron(j, xe, ye, ze, te, ee, dxe, dye, dze);
136 m_ex.push_back(trkPosIn[0] + xe*10.0);
137 m_ey.push_back(trkPosIn[1] + ye*10.0);
138 m_ez.push_back(trkPosIn[2] + ze*10.0);
147string IonizationGar::getParticle(
int particle,
int charge)
const{
149 if((0==particle)&&(-1==charge)) {particleName =
"electron";}
150 else if((0==particle)&&(1==charge)) {particleName =
"e+";}
151 else if((1==particle)&&(1==charge)) {particleName =
"mu+";}
152 else if((1==particle)&&(-1==charge)) {particleName =
"mu-";}
153 else if((2==particle)&&(1==charge)) {particleName =
"pi+";}
154 else if((2==particle)&&(-1==charge)) {particleName =
"pi-";}
155 else if((3==particle)&&(1==charge)) {particleName =
"K+";}
156 else if((3==particle)&&(-1==charge)) {particleName =
"K-";}
157 else if((4==particle)&&(1==charge)) {particleName =
"p";}
158 else if((4==particle)&&(-1==charge)) {particleName =
"p-bar";}
159 else if((5==particle)&&(1==charge)) {particleName =
"d";}
160 else if((6==particle)&&(2==charge)) {particleName =
"alpha";}
162 cout <<
"IonizationGar::getParticle() error";
163 particleName =
"error";
168void IonizationGar::clear(){
176void IonizationGar::initGeoGas(){
177 randomEngine.Seed(m_random);
178 m_gas =
new MediumMagboltz();
179 m_gas->SetComposition(
"ar",90.,
"isobutane",10.);
180 m_gas->SetTemperature(293.15);
181 m_gas->SetPressure(760.0);
182 m_gas->SetMaxElectronEnergy(200.);
183 m_gas->EnablePenningTransfer(0.44, 0.0,
"Ar");
184 m_gas->Initialise(
true);
186 m_box =
new SolidBox(0., 0., 0., 10., 10., 10.);
188 m_geo =
new GeometrySimple();
189 m_geo->AddSolid(m_box, m_gas);
191 m_comp =
new ComponentAnalyticField();
192 if(m_debugging) m_comp->EnableDebugging();
193 else m_comp->DisableDebugging();
194 m_comp->SetGeometry(m_geo);
196 m_sensor =
new Sensor();
197 if(m_debugging) m_sensor->EnableDebugging();
198 else m_sensor->DisableDebugging();
199 m_sensor->AddComponent(m_comp);
void setTrack(int particle, int charge, double p, double trkPosIn[], double trkPosOut[])
void init(unsigned int random, ICgemGeomSvc *geomSvc, double magConfig)