00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00033
00034
00046
00047
00048
00049
00050 #include <CLHEP/Units/SystemOfUnits.h>
00051 #include <CLHEP/Units/PhysicalConstants.h>
00052
00053 #include "waveform/MJWaveformChargePoint.hh"
00054 #include "waveform/MJVWaveformSegment.hh"
00055 #include "io/MJLogger.hh"
00056
00057
00058
00059 #include "waveform/MJVWaveformCrystal.hh"
00060
00061
00062
00063 MJVWaveformCrystal::MJVWaveformCrystal():
00064 fFirstChargePoint(0), fLastChargePoint(0), fNumberOfChargePoints(0),
00065 fFirstActiveChargePoint(0), fLastActiveChargePoint(0),
00066 fFirstSegment(0), fLastSegment(0), fNumberOfSegments(0),
00067 fNextCrystal(0), fPreviousCrystal(0)
00068 {;}
00069
00070
00071
00072 MJVWaveformCrystal::MJVWaveformCrystal(const MJVWaveformCrystal & other)
00073 {;}
00074
00075
00076
00077 MJVWaveformCrystal::~MJVWaveformCrystal()
00078 {
00079 DeleteSegments();
00080 DeleteChargePoints();
00081 }
00082
00083
00084
00085
00086 void MJVWaveformCrystal::AddChargePoint(MJWaveformChargePoint *chgpt)
00087 {
00088 if(chgpt) {
00089 if(fNumberOfChargePoints++ == 0) {
00090 fFirstChargePoint = chgpt;
00091 fFirstChargePoint->SetPreviousChargePoint(NULL);
00092 fFirstChargePoint->SetNextChargePoint(NULL);
00093 } else {
00094 fLastChargePoint->SetNextChargePoint(chgpt);
00095 }
00096 chgpt->SetPreviousChargePoint(fLastChargePoint);
00097 fLastChargePoint = chgpt;
00098 fLastChargePoint->SetNextChargePoint(NULL);
00099 if(chgpt->StillActive()) {
00100 if(!fFirstActiveChargePoint) {
00101 fFirstActiveChargePoint = chgpt;
00102 fFirstActiveChargePoint->SetPreviousActiveChargePoint(NULL);
00103 fFirstActiveChargePoint->SetNextActiveChargePoint(NULL);
00104 } else {
00105 fLastActiveChargePoint->SetNextActiveChargePoint(chgpt);
00106 }
00107 chgpt->SetPreviousActiveChargePoint(fLastActiveChargePoint);
00108 fLastActiveChargePoint = chgpt;
00109 fLastActiveChargePoint->SetNextActiveChargePoint(NULL);
00110 }
00111 } else {
00112 MJLog(error) << "Tried to add charge point with NULL pointer.\n";
00113 }
00114 }
00115
00116
00117
00118 void MJVWaveformCrystal::AddSegment(MJVWaveformSegment *seg)
00119 {
00120 if(seg != NULL) {
00121 if(fNumberOfSegments++ == 0) {
00122 fFirstSegment = seg;
00123 fFirstSegment->SetPreviousSegment(NULL);
00124 } else {
00125 fLastSegment->SetNextSegment(seg);
00126 }
00127 fLastSegment = seg;
00128 fLastSegment->SetNextSegment(NULL);
00129 } else {
00130 MJLog(error) << "Tried to add segment with NULL pointer.\n";
00131 }
00132 }
00133
00134
00135
00136 HepDouble MJVWaveformCrystal::ConvertEnergyLossToCharge(HepDouble eloss)
00137 {
00138
00139 return eloss / (2.96 * eV) * eplus;
00140 }
00141
00142
00143
00144 void MJVWaveformCrystal::DeleteChargePoints()
00145 {
00146 if(fNumberOfChargePoints > 0 && fFirstChargePoint){
00147 MJWaveformChargePoint *chp = fFirstChargePoint;
00148 MJWaveformChargePoint *chp2;
00149 HepInt numberDeleted = 0;
00150 while(chp) {
00151 chp2 = chp->GetNextChargePoint();
00152 delete chp;
00153 chp = chp2;
00154 numberDeleted++;
00155 }
00156 if(numberDeleted != fNumberOfChargePoints) {
00157 MJLog(fatal) << "fNumberOfChargePoints" << " != numberDeleted "
00158 << numberDeleted << fNumberOfChargePoints << '\n';
00159 }
00160 } else {
00161 MJLog(warning)<<"No chargepoints to delete. Possible allocation error.\n";
00162 }
00163 fNumberOfChargePoints = 0;
00164 fFirstChargePoint = fLastChargePoint =
00165 fFirstActiveChargePoint = fLastActiveChargePoint = NULL;
00166 }
00167
00168
00169
00170 void MJVWaveformCrystal::DeleteSegments()
00171 {
00172 if(fNumberOfSegments > 0 && fFirstSegment){
00173 MJVWaveformSegment *seg = fFirstSegment;
00174 MJVWaveformSegment *seg2;
00175 HepInt numberDeleted = 0;
00176 while(seg) {
00177 seg2 = seg->GetNextSegment();
00178 delete seg;
00179 seg = seg2;
00180 numberDeleted++;
00181 }
00182 if(numberDeleted != fNumberOfSegments) {
00183 MJLog(fatal) << "fNumberOfSegments != numberDeleted "
00184 << numberDeleted << fNumberOfSegments << '\n';
00185 }
00186 } else {
00187 MJLog(warning) << "No segments to delete. Possible allocation error.\n";
00188 }
00189 fNumberOfSegments = 0;
00190 fFirstSegment = fLastSegment = NULL;
00191 }
00192
00193
00194
00195 void MJVWaveformCrystal::GenerateSignal()
00196 {
00197 MJVWaveformSegment *seg;
00198 MJWaveformChargePoint *chgpt;
00199
00200 ResetAllSegmentWaveforms();
00201 while(fFirstActiveChargePoint){
00202 seg = fFirstSegment;
00203 while(seg){
00204 seg->AddWaveformPoint(fFirstActiveChargePoint);
00205 seg = seg->GetNextSegment();
00206 }
00207 chgpt = fFirstActiveChargePoint;
00208 while(chgpt) {
00209 chgpt->Dump();
00210 chgpt->DoOneStep();
00211 if(chgpt == fFirstActiveChargePoint && !chgpt->StillActive())
00212 fFirstActiveChargePoint = chgpt->GetNextActiveChargePoint();
00213 chgpt = chgpt->GetNextActiveChargePoint();
00214 }
00215 }
00216 fLastActiveChargePoint = NULL;
00217 }
00218
00219
00220
00221 HepDouble MJVWaveformCrystal::GetInitialGridPointSigma()
00222 {
00223 return fGridPointSize;
00224 }
00225
00226
00227
00228 Hep3Vector MJVWaveformCrystal::GetElectronVelocity(const Hep3Vector *position)
00229 {
00230 Hep3Vector efield;
00231
00232 GetDriftFieldVector(position, &efield);
00233 return kmu_0_e * efield /
00234 pow((1.0 + pow(efield.mag() / keps_0_e, kbeta_e)), 1.0 / kbeta_e);
00235 }
00236
00237
00238
00239 void MJVWaveformCrystal::ResetAllSegmentWaveforms()
00240 {
00241 MJVWaveformSegment *seg = fFirstSegment;
00242 while(seg) {
00243 seg->SetAllZero();
00244 seg = seg->GetNextSegment();
00245 }
00246 }
00247
00248
00249
00250 Hep3Vector MJVWaveformCrystal::GetHoleVelocity(const Hep3Vector *position)
00251 {
00252 Hep3Vector efield;
00253
00254 GetDriftFieldVector(position, &efield);
00255 return kmu_0_h * efield /
00256 pow((1.0 + pow(efield.mag() / keps_0_h, kbeta_h)), 1.0 / kbeta_h);
00257 }
00258
00259
00260
00261 void MJVWaveformCrystal::SetConstants(void)
00262 {
00263
00264
00265
00266
00267
00268 kmu_0_e = 0.0036 * cm * cm / (volt * 100.0 * ns);
00269 kmu_0_h = 0.0042 * cm * cm / (volt * 100.0 * ns);
00270 kbeta_e = 1.32;
00271 kbeta_h = 1.36;
00272 keps_0_e = 275.0 * volt / cm;
00273 keps_0_h = 210.5 * volt / cm;
00274
00275
00276
00277 fGridPointSize = 0.1 * cm;
00278 fTimeStep = 50 * nanosecond;
00279 fDiffusionOn = fTrappingOn = false;
00280 fDielectricConstant = 16.0 * epsilon0;
00281 fSpaceChargeDensity = 10e12 * e_SI / cm3;
00282 }
00283
00284
00285
00286