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; }
//--------------------------------------------------------------------------- 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; }
unsigned int GSMS::MaskConfig::imprintMask(G4VPhysicalVolume* wptr) { //clean up for(int i=0; i<m_mask.size(); i++) { if(m_mask[i]) delete m_mask[i]; } m_mask.clear(); /* if(m_assembly) { std::vector<G4VPhysicalVolume*>::iterator iter = m_assembly->GetVolumesIterator(); for(int i=0;i<m_assembly->TotalImprintedVolumes();iter++,i++) { G4VPhysicalVolume* ptr = *iter; if(ptr) delete ptr; *iter = NULL; } delete m_assembly; }; m_assembly = new G4AssemblyVolume; */ G4VPhysicalVolume* world = NULL; if(wptr) world = wptr; else GSMS::GSMS::getWorld(&world); std::cerr << world << std::endl; try { G4VSolid* s_element = NULL; G4VSolid* s_mask = NULL; /* s_mask = new G4Tubs( "mask", 0., m_radius+m_ethick*1.5, m_eheight/2, 0.*deg, 360.*deg ); */ if(m_etype == "Box") { s_element = new G4Box( "element", m_ewidth/2, m_ethick/2, m_eheight/2); } else if(m_etype == "Segment") { s_element = new G4Box( "element", m_ewidth/2, m_ethick/2, m_eheight/2); } else return GSMS_ERR; G4Material* element_mat = NULL; G4Material* mask_mat = NULL; if(!__SUCCEEDED(GSMS::GSMS::getMaterial(m_emat,&element_mat)) || !__SUCCEEDED(GSMS::GSMS::getMaterial("Air",&mask_mat))) return GSMS_ERR; G4LogicalVolume* element_log = new G4LogicalVolume( s_element, element_mat, "element_log"); ///////////// /* G4LogicalVolume* mask_log = new G4LogicalVolume( s_mask, mask_mat, "mask_log" ); G4VPVParameterisation* mask_param = new MaskElement( this ); G4VPhysicalVolume* mask_phys = new G4PVParameterised( "mask_phys", element_log, mask_log, kUndefined, m_ecount, mask_param ); */ //////////// G4RotationMatrix mR; //mask G4ThreeVector mT(0.,0.,0.); //mask G4double local_time,angle,angle_offset; local_time = angle = angle_offset = 0.0; if(!__SUCCEEDED(GSMS::getTime(&local_time))) return GSMS_ERR; angle_offset = (m_speed * local_time); std::cerr << "Mask angle offset: " << angle_offset*360/2/pi << std::endl; for(int i=0;i<m_ecount;i++) if(!isTransparent(i)) { G4RotationMatrix mRe; //element G4ThreeVector mTe; //element angle = ( (float)i/(float)m_ecount*2*pi + angle_offset ); G4float xoff = (m_radius+m_ethick)*cos(angle); G4float yoff = (m_radius+m_ethick)*sin(angle); G4float zoff = 0.; mTe.setX(xoff); mTe.setY(yoff); mTe.setZ(zoff); mRe.rotateZ(pi/2 + angle); G4VPhysicalVolume* mask_phys = new G4PVPlacement( G4Transform3D(mRe,G4ThreeVector(xoff,yoff,zoff)), element_log, "element_phys", world->GetLogicalVolume(), false, i ); // &mRe, // G4ThreeVector(xoff,yoff,zoff), // "mask_phys", // element_log, // world, // false, // 0); m_mask.push_back(mask_phys); //m_assembly->AddPlacedVolume(element_log,mTe,&mRe); std::cerr << "Element " << i << " at angle " << angle*360/2/pi << " xOff = " << xoff << " yOff = " << yoff << " zOff = " << zoff << std::endl; }; // m_assembly->MakeImprint(world->GetLogicalVolume(),mT,&mR, true); G4VisAttributes* element_vis = new G4VisAttributes(GSMS_COLOR_ELEMENT); element_vis->SetVisibility(true); element_vis->SetForceSolid(true); element_log->SetVisAttributes(element_vis); //////////// } catch(...) { return GSMS_ERR; }; return GSMS_OK; };