54 double edep = aStep->GetTotalEnergyDeposit();
56 if(aStep->GetTrack()->GetDefinition()!=G4Geantino::GeantinoDefinition() &&
57 aStep->GetTrack()->GetDefinition()!=G4ChargedGeantino::ChargedGeantinoDefinition())
64 const G4TouchableHistory *myTouch =
dynamic_cast<const G4TouchableHistory*
>(aStep->GetPreStepPoint()->GetTouchable());
66 G4cout <<
"SctSensorSD::ProcessHits bad dynamic_cast" << G4endl;
72 G4ThreeVector coord1 = aStep->GetPreStepPoint()->GetPosition();
73 G4ThreeVector coord2 = aStep->GetPostStepPoint()->GetPosition();
79 const G4AffineTransform transformation = myTouch->GetHistory()->GetTopTransform();
80 G4ThreeVector localPosition1 = transformation.TransformPoint(coord1);
81 G4ThreeVector localPosition2 = transformation.TransformPoint(coord2);
85 HepGeom::Point3D<double> lP1,lP2;
107 this->
indexMethod(myTouch, coord1.z(), brlEcap, layerDisk, etaMod, phiMod, side);
113 aStep->GetPreStepPoint()->GetGlobalTime(),
115 1,brlEcap,layerDisk,etaMod,phiMod,side);
120 int &brlEcap,
int &layerDisk,
int &etaMod,
int &phiMod,
int &side) {
128 const int sensorCopyNo = myTouch->GetVolume()->GetCopyNo();
131 for (
int i=0;i<myTouch->GetHistoryDepth();i++){
132 std::string detname=myTouch->GetVolume(i)->GetLogicalVolume()->GetName();
133 int copyno=myTouch->GetVolume(i)->GetCopyNo();
134 G4cout <<
"Volume "<<detname <<
" Copy Nr. " << copyno << G4endl;
140 if(sensorCopyNo/1000) {
142 if(sensorCopyNo == 1000) {
143 side = myTouch->GetVolume(1)->GetCopyNo();
144 etaMod = myTouch->GetVolume(2)->GetCopyNo();
145 phiMod = myTouch->GetVolume(3)->GetCopyNo();
146 layerDisk = myTouch->GetVolume(5)->GetCopyNo();
147 }
else if(sensorCopyNo == 1100) {
149 int etaModTmp = myTouch->GetVolume(1)->GetCopyNo();
150 int sign = (etaModTmp>=0)? +1 : -1;
151 side = std::abs(etaModTmp)%2;
152 etaMod =
sign * std::abs(etaModTmp)/2;
153 phiMod = myTouch->GetVolume(2)->GetCopyNo();
154 layerDisk = myTouch->GetVolume(4)->GetCopyNo();
155 }
else if(sensorCopyNo/100 == 12) {
157 int iSegment = sensorCopyNo%100;
158 int sensorEnvCopyNo = myTouch->GetVolume(1)->GetCopyNo();
159 if (sensorEnvCopyNo == 1000) {
160 side = myTouch->GetVolume(2)->GetCopyNo();
161 etaMod = myTouch->GetVolume(3)->GetCopyNo() + iSegment;
162 phiMod = myTouch->GetVolume(4)->GetCopyNo();
163 layerDisk = myTouch->GetVolume(6)->GetCopyNo();
164 }
else if (sensorEnvCopyNo == 1100) {
166 int etaModTmp = myTouch->GetVolume(2)->GetCopyNo();
167 int sign = (etaModTmp>=0)? +1 : -1;
168 side = std::abs(etaModTmp)%2;
169 etaMod =
sign * std::abs(etaModTmp)/2 + iSegment;
170 phiMod = myTouch->GetVolume(3)->GetCopyNo();
171 layerDisk = myTouch->GetVolume(5)->GetCopyNo();
174 description <<
"ProcessHits: Unrecognized geometry in SCT sensitive detector. Please contact the maintainer of the SCT Detector Description.";
175 G4Exception(
"SctSensorSD",
"UnrecognizedSCTGeometry1", FatalException,
description);
180 description <<
"ProcessHits: Unrecognized geometry in SCT sensitive detector. Please contact the maintainer of the SCT Detector Description.";
181 G4Exception(
"SctSensorSD",
"UnrecognizedSCTGeometry2", FatalException,
description);
185 G4cout <<
"In the SCT Barrel" << G4endl;
186 G4cout <<
"----- side : " << side << G4endl;
187 G4cout <<
"----- eta_module : " << etaMod << G4endl;
188 G4cout <<
"----- phi_module : " << phiMod << G4endl;
189 G4cout <<
"----- layer : " << layerDisk << G4endl;
190 G4cout <<
"----- barrel_ec : " << brlEcap<< G4endl;
197 int sensorCopyNoTest = sensorCopyNo/100;
198 if(sensorCopyNoTest == 5 || sensorCopyNoTest == 6) {
199 int signZ = (coord1z > 0) ? 1 : -1;
201 side = myTouch->GetVolume(0)->GetCopyNo() % 2;
202 if (sensorCopyNoTest == 5) {
203 etaMod = myTouch->GetVolume(3)->GetCopyNo();
204 layerDisk = myTouch->GetVolume(4)->GetCopyNo();
206 etaMod = myTouch->GetVolume(2)->GetCopyNo();
207 layerDisk = myTouch->GetVolume(3)->GetCopyNo();
209 int phiNumber = myTouch->GetVolume(1)->GetCopyNo();
212 int maxModules = (phiNumber & 0x00ff0000) >> 16;
213 int moduleZero = (phiNumber & 0xff000000) >> 24;
214 phiMod = phiNumber & 0x0000ffff;
218 if (maxModules && signZ < 0) phiMod = (maxModules + moduleZero - phiMod) % maxModules;
222 G4cout <<
"In the SCT EndCap" << G4endl;
223 G4cout <<
"----- side : " << side << G4endl;
224 G4cout <<
"----- phi_module : " << phiMod<< G4endl;
225 G4cout <<
"----- eta_module : " << etaMod << G4endl;
226 G4cout <<
"----- layerDisk : " << layerDisk << G4endl;
227 G4cout <<
"----- barrel_ec : " << brlEcap << G4endl;
232 description <<
"ProcessHits: Unrecognized geometry in SCT sensitive detector. Please contact the maintainer of the SCT Detector Description.";
233 G4Exception(
"SctSensorSD",
"UnrecognizedSCTGeometry3", FatalException,
description);