//--------------------------------------------------------------------------- G4int SteppingAction::IsBoxSurfaceFlux(const G4Step* aStep) //returns 1(in), 2(out), or -1 { //G4PSFlatSurfaceFlux G4StepPoint* preStep = aStep->GetPreStepPoint(); G4VPhysicalVolume* physVol = preStep->GetPhysicalVolume(); G4VPVParameterisation* physParam = physVol->GetParameterisation(); G4VSolid * solid = 0; if(physParam) { // for parameterized volume //G4int idx = ((G4TouchableHistory*)(aStep->GetPreStepPoint()->GetTouchable())) //->GetReplicaNumber(indexDepth);//TODO find indexDepth and use these //solid = physParam->ComputeSolid(idx, physVol); //solid->ComputeDimensions(physParam,idx,physVol); } else { // for ordinary volume solid = physVol->GetLogicalVolume()->GetSolid(); } G4Box* boxSolid = (G4Box*)(solid); G4TouchableHandle theTouchable = aStep->GetPreStepPoint()->GetTouchableHandle(); G4double kCarTolerance=G4GeometryTolerance::GetInstance()->GetSurfaceTolerance(); if (aStep->GetPreStepPoint()->GetStepStatus() == fGeomBoundary ){ // Entering Geometry G4ThreeVector stppos1= aStep->GetPreStepPoint()->GetPosition(); G4ThreeVector localpos1 = theTouchable->GetHistory()->GetTopTransform().TransformPoint(stppos1); if(std::fabs( localpos1.z() + boxSolid->GetZHalfLength())<kCarTolerance ||std::fabs( localpos1.z() - boxSolid->GetZHalfLength())<kCarTolerance ||std::fabs( localpos1.y() + boxSolid->GetYHalfLength())<kCarTolerance ||std::fabs( localpos1.y() - boxSolid->GetYHalfLength())<kCarTolerance ||std::fabs( localpos1.x() + boxSolid->GetXHalfLength())<kCarTolerance ||std::fabs( localpos1.x() - boxSolid->GetXHalfLength())<kCarTolerance ){ return 1;//fFlux_In; _InOut =0 } } if (aStep->GetPostStepPoint()->GetStepStatus() == fGeomBoundary ){ // Exiting Geometry G4ThreeVector stppos2= aStep->GetPostStepPoint()->GetPosition(); G4ThreeVector localpos2 = theTouchable->GetHistory()->GetTopTransform().TransformPoint(stppos2); if(std::fabs( localpos2.z() + boxSolid->GetZHalfLength())<kCarTolerance ||std::fabs( localpos2.z() - boxSolid->GetZHalfLength())<kCarTolerance ||std::fabs( localpos2.y() + boxSolid->GetYHalfLength())<kCarTolerance ||std::fabs( localpos2.y() - boxSolid->GetYHalfLength())<kCarTolerance ||std::fabs( localpos2.x() + boxSolid->GetXHalfLength())<kCarTolerance ||std::fabs( localpos2.x() - boxSolid->GetXHalfLength())<kCarTolerance ){ return 2;//fFlux_Out; } } return -1; }
G4int SteppingAction::IsCylSurfaceFlux(const G4Step* aStep, G4double fRadius, G4double fHalfHt) { //from G4PSCylinderSurfaceFlux //returns 1(in), 2(out), or -1 G4StepPoint* preStep = aStep->GetPreStepPoint(); //????? G4VPhysicalVolume* physVol = preStep->GetPhysicalVolume(); G4VPVParameterisation* physParam = physVol->GetParameterisation(); //G4VSolid* solid = NULL; if(physParam) { // for parameterized volume //G4int idx = ((G4TouchableHistory*)(aStep->GetPreStepPoint()->GetTouchable())) //->GetReplicaNumber(indexDepth);//TODO get indexdepth and uncomment these //solid = physParam->ComputeSolid(idx, physVol); //solid->ComputeDimensions(physParam,idx,physVol); } else { // for ordinary volume // solid = physVol->GetLogicalVolume()->GetSolid(); //G4cout << " logvol " << physVol->GetLogicalVolume()->GetName() << G4endl; //NOTE this is wrong } //G4Tubs* tubsSolid = (G4Tubs*)(solid); //NOTE solid dimensions are all 0 //now it is bypassed by passing in ht and rad. TODO correct it G4TouchableHandle theTouchable = aStep->GetPreStepPoint()->GetTouchableHandle(); G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance(); if (aStep->GetPreStepPoint()->GetStepStatus() == fGeomBoundary ) { // Entering Geometry. Prestep point is at the Outer surface. G4ThreeVector stppos1= aStep->GetPreStepPoint()->GetPosition(); G4ThreeVector localpos1 = theTouchable->GetHistory()->GetTopTransform().TransformPoint(stppos1); //if ( std::fabs(localpos1.z()) > tubsSolid->GetZHalfLength()) return -1; if ( std::fabs(localpos1.z()) > (fHalfHt+ kCarTolerance))//tubsSolid->GetZHalfLength() {//G4cout << " preGeom:-1:z " << localpos1.z() << " halfz " << tubsSolid->GetZHalfLength() // <<" tol " << kCarTolerance << G4endl; // NOTE solid dimensions are all 0 return -1; } G4double localR2 = localpos1.x()*localpos1.x()+localpos1.y()*localpos1.y(); G4double outerRad = fRadius;//tubsSolid->GetOuterRadius();// GetInnerRadius();//NOTE if( (localR2 > (outerRad-kCarTolerance)*(outerRad-kCarTolerance) && localR2 < (outerRad+kCarTolerance)*(outerRad+kCarTolerance)) || ( std::fabs( localpos1.z())< (fHalfHt +kCarTolerance)//tubsSolid->GetZHalfLength() && localR2 < (outerRad+kCarTolerance)*(outerRad+kCarTolerance) ) ){ //G4cout << " preGeom:1 " << G4endl; return 1;//fFlux_In; } } if (aStep->GetPostStepPoint()->GetStepStatus() == fGeomBoundary ) { // Exiting Geometry. Post step point is at the outer surface. G4ThreeVector stppos2= aStep->GetPostStepPoint()->GetPosition(); G4ThreeVector localpos2 = theTouchable->GetHistory()->GetTopTransform().TransformPoint(stppos2); //if ( std::fabs(localpos2.z()) > tubsSolid->GetZHalfLength() ) return -1; if ( std::fabs(localpos2.z()) > (fHalfHt+ kCarTolerance))//tubsSolid->GetZHalfLength() { return -1; } G4double localR2 = localpos2.x()*localpos2.x()+localpos2.y()*localpos2.y(); G4double outerRad = fRadius;//tubsSolid->GetOuterRadius();//GetInnerRadius();//NOTE if( (localR2 > (outerRad-kCarTolerance)*(outerRad-kCarTolerance) && localR2 < (outerRad+kCarTolerance)*(outerRad+kCarTolerance)) || ( std::fabs( localpos2.z())< ( fHalfHt+kCarTolerance)// tubsSolid->GetZHalfLength() && localR2 < (outerRad+kCarTolerance)*(outerRad+kCarTolerance) ) ){ //G4cout << " postGeom:2 " << G4endl; return 2;//fFlux_Out; } } return -1; }