Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Class Members | File Members

MJVWaveformCrystal.cc

Go to the documentation of this file.
00001 //---------------------------------------------------------------------------//
00002 //bb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nu//
00003 //                                                                           //
00004 //                         MAJORANA Simulation                               //
00005 //                                                                           //
00006 //      This code implementation is the intellectual property of the         //
00007 //      MAJORANA Collaboration. It is based on Geant4, an intellectual       //
00008 //      property of the RD44 GEANT4 collaboration.                           //
00009 //                                                                           //
00010 //                        *********************                              //
00011 //                                                                           //
00012 //    Neither the authors of this software system, nor their employing       //
00013 //    institutes, nor the agencies providing financial support for this      //
00014 //    work  make  any representation or  warranty, express or implied,       //
00015 //    regarding this software system or assume any liability for its use.    //
00016 //    By copying, distributing or modifying the Program (or any work based   //
00017 //    on on the Program) you indicate your acceptance of this statement,     //
00018 //    and all its terms.                                                     //
00019 //                                                                           //
00020 //bb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nubb0nu//
00021 //---------------------------------------------------------------------------//
00022 //                                                          
00023 // $Id: MJVWaveformCrystal.cc,v 1.2 2004/11/09 13:42:39 xliu Exp $ 
00024 //      
00025 // CLASS IMPLEMENTATION:  MJVWaveformCrystal.cc
00026 //
00027 //---------------------------------------------------------------------------//
00033 // 
00034 //---------------------------------------------------------------------------//
00046 //---------------------------------------------------------------------------//
00047 //
00048 
00049 // CLHEP Stuff.
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   // Assume 2.96 eV per electron-hole pair. Returns number of e- hole pairs.
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   // Constants for computing charge velocity as a function of electric field
00264   // in Germanium.
00265   // Values taken from Craig Aalseth's thesis.
00266   // U. of South Carolina, 2000, p. 29
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; // Dimensionless
00271   kbeta_h = 1.36; // Ditto
00272   keps_0_e = 275.0 * volt / cm;  
00273   keps_0_h = 210.5 * volt / cm;
00274 
00275   // Other parameters
00276   // Can be overridden in inherited class.
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 

Generated on Mon Nov 29 16:58:53 2004 for Majorana Simulation by  doxygen 1.3.9.1