MollerDetectorSD.cc
Go to the documentation of this file.00001
00002
00003
00004 #include "MollerDetectorSD.hh"
00005 #include "MollerDetectorHit.hh"
00006 #include "G4Step.hh"
00007 #include "G4HCofThisEvent.hh"
00008 #include "G4TouchableHistory.hh"
00009 #include "G4ios.hh"
00010
00011 #include "G4Track.hh"
00012 #include "G4SDManager.hh"
00013 #include "G4Navigator.hh"
00014 #include "G4VProcess.hh"
00015
00016 MollerDetectorSD::MollerDetectorSD(G4String name)
00017 :G4VSensitiveDetector(name)
00018 {
00019 G4String HCname;
00020 collectionName.insert(HCname="hitsColl");
00021 HCID = -1;
00022 }
00023
00024 MollerDetectorSD::~MollerDetectorSD(){;}
00025
00026 void MollerDetectorSD::Initialize(G4HCofThisEvent* HCE)
00027 {
00028 hitsCollection = new MollerDetectorHitsCollection
00029 (SensitiveDetectorName,collectionName[0]);
00030 if(HCID<0)
00031 { HCID = G4SDManager::GetSDMpointer()->GetCollectionID(hitsCollection); }
00032 HCE->AddHitsCollection(HCID,hitsCollection);
00033
00034 }
00035
00036 G4bool MollerDetectorSD::ProcessHits(G4Step* aStep, G4TouchableHistory*)
00037 {
00038
00039
00040 const G4Track* fTrack = aStep->GetTrack();
00041
00042 G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
00043 G4TouchableHistory* theTouchable
00044 = (G4TouchableHistory*)(preStepPoint->GetTouchable());
00045 G4VPhysicalVolume* theMotherPhysical = theTouchable->GetVolume(1);
00046 G4int copyNo = theMotherPhysical->GetCopyNo();
00047
00048
00049 G4ThreeVector worldPos = preStepPoint->GetPosition();
00050 G4ThreeVector vertexPos = fTrack->GetVertexPosition();
00051 G4ThreeVector momentum = fTrack->GetMomentumDirection();
00052 G4ThreeVector vertexMomentum = fTrack->GetVertexMomentumDirection();
00053
00054
00055 const G4VProcess* creatorProcess = fTrack->GetCreatorProcess();
00056 G4String process;
00057 if (creatorProcess!=0) process = creatorProcess->GetProcessName();
00058
00059 G4bool ion = (process=="eIoni");
00060
00061 G4String particle = fTrack->GetDefinition()->GetParticleName();
00062
00063
00064
00065 char volumeName[200]; char volumeNameAlt0[200]; char volumeNameAlt1[200]; char volumeNameAlt2[200]; char volumeNameAlt3[200];
00066 G4int offset=0; G4int alt0offset=1000; G4int alt1offset=1000; G4int alt2offset=2000; G4int alt3offset=2000;
00067 G4int volume=-1000;
00068
00069 for (G4int vol = 0; vol<100; vol++){
00070
00071 snprintf(volumeName,200,"planeDet_%i",vol); offset = 0;
00072 snprintf(volumeNameAlt0,200,"UScoll_%i",vol); alt0offset = 1050;
00073 snprintf(volumeNameAlt1,200,"DScoll_%i",vol); alt1offset = 1100;
00074 snprintf(volumeNameAlt2,200,"UScoil_%i",vol); alt2offset = 2000;
00075 snprintf(volumeNameAlt3,200,"DScoil_%i",vol); alt3offset = 2050;
00076
00077
00078
00079
00080 if (fTrack->GetVolume()->GetName().compare(volumeName)==0){
00081 volume = vol+offset;
00082 } else if (fTrack->GetVolume()->GetName().compare(volumeNameAlt0)==0){
00083 volume = vol+alt0offset;
00084 } else if (fTrack->GetVolume()->GetName().compare(volumeNameAlt1)==0){
00085 volume = vol+alt1offset;
00086 } else if (fTrack->GetVolume()->GetName().compare(volumeNameAlt2)==0){
00087 volume = vol+alt2offset;
00088 } else if (fTrack->GetVolume()->GetName().compare(volumeNameAlt3)==0){
00089 volume = vol+alt3offset;
00090 }
00091 }
00092
00093
00094 G4int trackID = fTrack->GetTrackID();
00095
00096 G4int partType;
00097
00098 if (particle=="e-") partType=0;
00099 else if (particle=="e+") partType=1;
00100 else if (particle=="proton") partType=2;
00101 else if (particle=="antiproton") partType=3;
00102 else if (particle=="gamma") partType=4;
00103 else partType=5;
00104
00105 G4double kineE = fTrack->GetKineticEnergy();
00106 G4double kineE0 = fTrack->GetVertexKineticEnergy();
00107
00108
00109
00110
00111
00112 G4double scat_ang = sqrt(vertexMomentum.x()*vertexMomentum.x() +
00113 vertexMomentum.y()*vertexMomentum.y());
00114
00115
00116
00117
00118 if (kineE0<100||!(partType==4||partType==0)) {
00119 return true;
00120 }
00121
00122
00123 else {
00124 MollerDetectorHit* newHit = new MollerDetectorHit(copyNo);
00125
00126
00127 newHit->SetWorldPos(worldPos);
00128 newHit->SetVertexPos(vertexPos);
00129 newHit->SetMomentum(momentum);
00130 newHit->SetKineticEnergy(kineE);
00131
00132 newHit->SetMomentum2(vertexMomentum);
00133 newHit->SetKineticEnergy2(kineE0);
00134 newHit->SetScatAngle(scat_ang);
00135
00136 newHit->SetCreatorProcess(process);
00137 newHit->SetParticleName(particle);
00138
00139 newHit->SetIon(ion);
00140 newHit->SetType(partType);
00141
00142
00143 newHit->SetVolume(volume);
00144 newHit->SetTrackID(trackID);
00145
00146
00147 hitsCollection->insert( newHit );
00148
00149 return true;
00150 }
00151 }
00152
00153 void MollerDetectorSD::EndOfEvent(G4HCofThisEvent*)
00154 {
00155 }
00156
00157