Beispiel #1
0
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;
}
Beispiel #2
0
//---------------------------------------------------------------------------
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;
}
Beispiel #3
0
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;
};