CGEM BOSS 6.6.5.f
BESIII Offline Software System
Loading...
Searching...
No Matches
IonizationGar.cxx
Go to the documentation of this file.
1#include "CgemDigitizerSvc/IonizationGar.h"
2
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"
8
9#include "CLHEP/Units/PhysicalConstants.h"
10
11#include <iomanip>
12#include <iostream>
13#include <fstream>
14#include <cmath>
15
16using namespace std;
17using namespace Garfield;
18
20}
21
23 delete m_gas;
24 delete m_geo;
25 delete m_comp;
26 delete m_box;
27 delete m_sensor;
28}
29
30void IonizationGar::init(unsigned int random, ICgemGeomSvc* geomSvc, double magConfig){
31 m_random = random;
32 m_geomSvc = geomSvc;
33 m_magConfig = magConfig;
34
35 initGeoGas();
36}
37
38void IonizationGar::setTrack(int particle, int charge, double p, double trkPosIn[], double trkPosOut[]){
39 clear();
40 int nE = 0;
41
42 double x0 = 0., y0 = 0., z0 = 0., t0 = 0.;
43
44 // //the length of track segment.
45 // double d0 = sqrt(pow((trkPosOut[0]-trkPosIn[0]),2)+pow((trkPosOut[1]-trkPosIn[1]),2)+pow((trkPosOut[2]-trkPosIn[2]),2));
46 // double d1 = sqrt(pow((trkPosOut[0]-trkPosIn[0]),2)+pow((trkPosOut[1]-trkPosIn[1]),2));
47 // double trkL = d0;
48
49 // double lambda = acos(d1/d0);
50 // double theta = acos((trkPosOut[1]-trkPosIn[1])/d1);
51
52 // double dx0 = cos(lambda)*sin(theta)/10.0; // mm->cm
53 // double dy0 = cos(lambda)*cos(theta)/10.0; // mm->cm
54 // double dz0 = sin(lambda)/10.0; // mm->cm
55
56 double dx0 = (trkPosOut[0] - trkPosIn[0])/10.0; // cm
57 double dy0 = (trkPosOut[1] - trkPosIn[1])/10.0; // cm
58 double dz0 = (trkPosOut[2] - trkPosIn[2])/10.0; // cm
59 double trkL = sqrt(dx0*dx0 + dy0*dy0 + dz0*dz0);
60
61 // cout << "track segment: " << setw(15) << trkPosIn[0] << setw(15) << trkPosIn[1] << setw(15) << trkPosIn[2]
62 // << setw(15) << trkPosOut[0] << setw(15) << trkPosOut[1] << setw(15) << trkPosOut[2] << endl;
63 // cout << setw(15) << trkL << setw(15) << dx0 << setw(15) << dy0 << setw(15) << dz0 << endl;
64
65 double minX = 0. < dx0 ? 0. : dx0;
66 double maxX = 0. < dx0 ? dx0 : 0.;
67 double minY = 0. < dy0 ? 0. : dy0;
68 double maxY = 0. < dy0 ? dy0 : 0.;
69 double minZ = 0. < dz0 ? 0. : dz0;
70 double maxZ = 0. < dz0 ? dz0 : 0.;
71 if(maxX<=minX){
72 minX += -0.1;
73 maxX += 0.1;
74 }
75 if(maxY<=minY){
76 minY += -0.1;
77 maxY += 0.1;
78 }
79 if(maxZ<=minZ){
80 minZ += -0.1;
81 maxZ += 0.1;
82 }
83
84 string particleType = getParticle(particle, charge);
85
86 TrackHeed* track = new TrackHeed();
87 track->SetSensor(m_sensor);
88 if(m_debugging) track->EnableDebugging();
89 else track->DisableDebugging();
90 track->EnableMagneticField();
91 track->SetParticle(particleType);
92 track->SetMomentum(p*1.e9);
93 // m_sensor->SetArea(-0.5, 0, -0.5, 0.5, 0.5, 0.5);
94 m_sensor->SetArea(minX, minY, minZ, maxX, maxY, maxZ);
95 // cout << setw(15) << minX << setw(15) << maxX << setw(15) << minY << setw(15) << maxY
96 // << setw(15) << minZ << setw(15) << maxZ << endl;
97
98 // cout << "trkpos" << endl;
99 // cout << setw(15) << trkPosIn[0] << setw(15) << trkPosIn[1] << setw(15) << trkPosIn[2]
100 // << setw(15) << trkPosOut[0] << setw(15) << trkPosOut[1] << setw(15) << trkPosOut[2] << endl;
101
102 track->NewTrack(x0, y0, z0, t0, dx0, dy0, dz0);
103 // track->NewTrack(0, 0, 0, t0, 0, 1, 0);
104 // cout << "particle: " << particleType << ", P = " << p << endl;
105 // cout << setw(15) << x0 << setw(15) << y0 << setw(15) << z0 << setw(15) << t0
106 // << setw(15) << dx0 << setw(15) << dy0 << setw(15) << dz0 << endl;
107
108 double xc = 0., yc = 0., zc = 0., tc = 0.; // cluster position
109 int nc = 0; // number of electrons
110 double ec = 0.; // energy
111 double extra = 0.; // not used
112 int nCluster = 0;
113
114 while(track->GetCluster(xc, yc, zc, tc, nc, ec, extra)){
115 double length = sqrt(pow(xc,2)+pow(yc,2)+pow(zc,2));
116 // cout << "length = " << length << ", trkL = " << trkL << endl;
117 if(length>trkL){
118 cout << "overflow -------------------------" << endl;
119 continue;
120 }
121 // cout << setw(5) << nCluster << setw(15) << xc << setw(15) << yc << setw(15) << zc << setw(15) << nc << endl;
122 nCluster++;
123 for(int j = 0; j<nc; ++j) {
124 double xe, ye, ze, te;
125 double ee, dxe, dye, dze;
126 track->GetElectron(j, xe, ye, ze, te, ee, dxe, dye, dze); // unit: cm
127
128 // cout << setw(5) << nE << setw(15) << xe << setw(15) << ye << setw(15) << ze << setw(15) << te << endl;
129 m_ex.push_back(trkPosIn[0] + xe*10.0); // mm
130 m_ey.push_back(trkPosIn[1] + ye*10.0); // mm
131 m_ez.push_back(trkPosIn[2] + ze*10.0); // mm
132 m_et.push_back(te);
133 nE++;
134 }
135 }
136 m_nIonE = nE;
137 delete track;
138}
139
140string IonizationGar::getParticle(int particle, int charge) const{
141 string particleName;
142 if((0==particle)&&(-1==charge)) {particleName = "electron";}
143 else if((0==particle)&&(1==charge)) {particleName = "e+";}
144 else if((1==particle)&&(1==charge)) {particleName = "mu+";}
145 else if((1==particle)&&(-1==charge)) {particleName = "mu-";}
146 else if((2==particle)&&(1==charge)) {particleName = "pi+";}
147 else if((2==particle)&&(-1==charge)) {particleName = "pi-";}
148 else if((3==particle)&&(1==charge)) {particleName = "K+";}
149 else if((3==particle)&&(-1==charge)) {particleName = "K-";}
150 else if((4==particle)&&(1==charge)) {particleName = "p";}
151 else if((4==particle)&&(-1==charge)) {particleName = "p-bar";}
152 else {
153 cout << "IonizationGar::getParticle() error";
154 particleName = "error";
155 }
156 return particleName;
157}
158
159void IonizationGar::clear(){
160 m_nIonE = 0;
161 m_ex.clear();
162 m_ey.clear();
163 m_ez.clear();
164 m_et.clear();
165}
166
167void IonizationGar::initGeoGas(){
168 randomEngine.Seed(m_random);
169 m_gas = new MediumMagboltz();
170 m_gas->SetComposition("ar",90.,"isobutane",10.);
171 m_gas->SetTemperature(293.15);
172 m_gas->SetPressure(760.0);
173 m_gas->SetMaxElectronEnergy(200.);
174 m_gas->EnablePenningTransfer(0.44, 0.0, "Ar");
175 m_gas->Initialise(true);
176
177 m_box = new SolidBox(0., 0., 0., 10., 10., 10.); // center and half length
178
179 m_geo = new GeometrySimple();
180 m_geo->AddSolid(m_box, m_gas);
181
182 m_comp = new ComponentAnalyticField();
183 if(m_debugging) m_comp->EnableDebugging();
184 else m_comp->DisableDebugging();
185 m_comp->SetGeometry(m_geo);
186
187 m_sensor = new Sensor();
188 if(m_debugging) m_sensor->EnableDebugging();
189 else m_sensor->DisableDebugging();
190 m_sensor->AddComponent(m_comp);
191}
void setTrack(int particle, int charge, double p, double trkPosIn[], double trkPosOut[])
void init(unsigned int random, ICgemGeomSvc *geomSvc, double magConfig)