Warning, file /geant4/examples/extended/exoticphysics/phonon/src/XAluminumElectrodeSensitivity.cc was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #include "XAluminumElectrodeSensitivity.hh"
0031
0032 #include "XAluminumElectrodeHit.hh"
0033
0034 #include "G4AutoLock.hh"
0035 #include "G4HCofThisEvent.hh"
0036 #include "G4Navigator.hh"
0037 #include "G4SDManager.hh"
0038 #include "G4Step.hh"
0039 #include "G4SystemOfUnits.hh"
0040 #include "G4Threading.hh"
0041 #include "G4TouchableHistory.hh"
0042 #include "G4Track.hh"
0043
0044 #include <fstream>
0045
0046 std::fstream* XAluminumElectrodeSensitivity::fWriter = 0;
0047 std::fstream* XAluminumElectrodeSensitivity::fWriter2 = 0;
0048
0049 G4Mutex theMutex = G4MUTEX_INITIALIZER;
0050
0051
0052
0053 XAluminumElectrodeSensitivity::XAluminumElectrodeSensitivity(const G4String& name)
0054 : G4VSensitiveDetector(name)
0055 {
0056 collectionName.insert("XAluminumElectrodeHit");
0057 fHCID = -1;
0058
0059 G4AutoLock lockIt(&theMutex);
0060 fWriter = new std::fstream("caustic.ssv", std::fstream::out | std::fstream::ate);
0061 if (!fWriter->is_open()) {
0062 G4cerr << "XAluminumElectrodeSensitivity::Constructor:"
0063 << "\n\tFailed to open caustic.ssv for appending data."
0064 << "\n\tCreating caustic.ssv" << G4endl;
0065 fWriter->open("caustic.ssv");
0066 }
0067
0068 fWriter2 = new std::fstream("timing.ssv", std::fstream::out | std::fstream::ate);
0069 if (!fWriter2->is_open()) {
0070 G4cerr << "XAluminumElectrodeSensitivity::Constructor: "
0071 << "\n\tFailed to open timing.ssv for appending data."
0072 << "\n\tCreating timing.ssv." << G4endl;
0073 fWriter2->open("timing.ssv");
0074 }
0075
0076 if (!(fWriter->is_open() && fWriter2->is_open())) {
0077 G4cerr << "XAluminumElectrodeSensitivity::Constructor: "
0078 << "\nERROR: COULD NOT CREATE OUTPUT FILES FOR WRITING" << G4endl;
0079 }
0080 }
0081
0082
0083
0084 XAluminumElectrodeSensitivity::~XAluminumElectrodeSensitivity()
0085 {
0086 G4AutoLock lockIt(&theMutex);
0087
0088 if (fWriter) {
0089 fWriter->close();
0090 delete fWriter;
0091 fWriter = 0;
0092 }
0093
0094 if (fWriter2) {
0095 fWriter2->close();
0096 delete fWriter2;
0097 fWriter2 = 0;
0098 }
0099 }
0100
0101
0102
0103 XAluminumElectrodeHitsCollection* XAluminumElectrodeSensitivity::GetHitsCollection()
0104 {
0105 return fHitsCollection;
0106 }
0107
0108
0109
0110 void XAluminumElectrodeSensitivity::Initialize(G4HCofThisEvent* HCE)
0111 {
0112 fHitsCollection = new XAluminumElectrodeHitsCollection(SensitiveDetectorName, collectionName[0]);
0113 if (fHCID < 0) {
0114 fHCID = G4SDManager::GetSDMpointer()->GetCollectionID(fHitsCollection);
0115 }
0116 HCE->AddHitsCollection(fHCID, fHitsCollection);
0117 }
0118
0119
0120
0121 G4bool XAluminumElectrodeSensitivity::ProcessHits(G4Step* aStep, G4TouchableHistory* )
0122 {
0123
0124 G4double edp = aStep->GetNonIonizingEnergyDeposit();
0125 if (edp == 0.) return true;
0126
0127 G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
0128 G4StepPoint* postStepPoint = aStep->GetPostStepPoint();
0129 G4TouchableHistory* theTouchable = (G4TouchableHistory*)(preStepPoint->GetTouchable());
0130 G4ThreeVector fWorldPos = postStepPoint->GetPosition();
0131 G4ThreeVector fLocalPos = theTouchable->GetHistory()->GetTopTransform().TransformPoint(fWorldPos);
0132
0133 XAluminumElectrodeHit* aHit = new XAluminumElectrodeHit();
0134 aHit->fTime = postStepPoint->GetGlobalTime();
0135 aHit->fEdep = edp;
0136 aHit->fWorldPos = fWorldPos;
0137 aHit->fLocalPos = fLocalPos;
0138
0139 fHitsCollection->insert(aHit);
0140
0141 return true;
0142 }
0143
0144
0145
0146 void XAluminumElectrodeSensitivity::EndOfEvent(G4HCofThisEvent* )
0147 {
0148 if (!fHitsCollection || fHitsCollection->GetSize() == 0) return;
0149
0150 for (size_t i = 0; i < fHitsCollection->GetSize(); i++) {
0151 WriteHitInfo(dynamic_cast<XAluminumElectrodeHit*>(fHitsCollection->GetHit(i)));
0152 }
0153 }
0154
0155
0156
0157 void XAluminumElectrodeSensitivity::WriteHitInfo(const XAluminumElectrodeHit* aHit)
0158 {
0159 if (!aHit) return;
0160
0161 G4AutoLock lockIt(&theMutex);
0162
0163 *fWriter << aHit->fWorldPos.getX() / mm << "," << aHit->fWorldPos.getY() / mm << ","
0164 << aHit->fWorldPos.getZ() / mm << "\n";
0165
0166 *fWriter2 << aHit->fTime / ns << " " << aHit->fEdep / eV << "\n";
0167 }