ExU01DetectorConstruction.cc

// $Id: DetectorConstruction.html,v 1.2 2001/05/24 02:52:09 g4u Exp $
// ====================================================================
//    ExU01DetectorConstruction.cc
//
//                                   .G4UserGroup, 2000
// ====================================================================
#include "ExU01DetectorConstruction.hh"
#include "ExU01MaterialManager.hh"

#include "G4LogicalVolume.hh"
#include "G4PVPlacement.hh"
#include "G4VisAttributes.hh"
#include "G4Box.hh"

// each detector component
#include "ExU01Counter.hh"
#include "ExU01Tracker.hh"
#include "ExU01Calorimeter.hh"

// for magnetic field
//#include "G4FieldManager.hh"
//#include "G4TransportationManager.hh"
//#include "G4ChordFinder.hh"
//#include "ExU01MagneticField.hh"

// ====================================================================
//
// constants (detector parameters)
//
// ====================================================================
// [experimental hall]
static const G4ThreeVector DXYZ_EXPHALL(10.*m, 10.*m, 10.*m);

// [downstream area] 
static const G4ThreeVector DXYZ_DOWNAREA(2.*m, 2.*m, 3.*m);
static const G4ThreeVector XYZ_DOWNAREA(0.,0.,2.4*m);

// ====================================================================
//
// class description
//
// ====================================================================
 
//////////////////////////////////////////////////////
ExU01DetectorConstruction::ExU01DetectorConstruction()
  : expHall(0), downArea(0),
    dxyzExpHall(DXYZ_EXPHALL),
    dxyzDownArea(DXYZ_DOWNAREA),
    xyzDownArea(XYZ_DOWNAREA)
//////////////////////////////////////////////////////
{
}


/////////////////////////////////////////////////////////
G4VPhysicalVolume* ExU01DetectorConstruction::Construct()
/////////////////////////////////////////////////////////
{
  // Material Manager
  ExU01MaterialManager* materialMgr= ExU01MaterialManager::GetPointer();

  // ==============================================================
  // Experimental Hall (world)
  // ==============================================================
  G4Box* expHallSolid= 
    new G4Box("EXP_HALL", 
	      dxyzExpHall.x()/2., dxyzExpHall.y()/2., dxyzExpHall.z()/2.);

  G4Material* Air= materialMgr-> GetMaterial("Air");
  G4LogicalVolume* expHallLV= 
    new G4LogicalVolume(expHallSolid, Air, "EXP_HALL_LV");

  // visualization attributes
  G4VisAttributes* expHallVisAtt=
    new G4VisAttributes(FALSE, G4Colour(1., 1., 1.));
  //expHallVisAtt-> SetForceWireframe(TRUE);
  expHallLV-> SetVisAttributes(expHallVisAtt);

  expHall= new G4PVPlacement(0, G4ThreeVector(), "EXP_HALL_PV",
			     expHallLV, 0, FALSE, 0);
  //                       ...          MV, MANY, copy#

  // ==============================================================
  // downstream area
  // ==============================================================
  G4Box* downAreaSolid=
    new G4Box("DOWN_AREA", 
	      dxyzDownArea.x()/2., dxyzDownArea.y()/2., dxyzDownArea.z()/2.);

  G4LogicalVolume* downAreaLV= 
    new G4LogicalVolume(downAreaSolid, Air, "DOWN_AREA_LV");
  downAreaLV-> SetVisAttributes(expHallVisAtt);
    
  downArea= new G4PVPlacement(0, xyzDownArea, "DOWN_AREA_PV",
  			      downAreaLV, expHall, FALSE, 0);

  // Try to rotate the "Downstream Area" by 30 degree around Y-axis.
  //const G4double angle= -30.*deg;
  //G4RotationMatrix* rotMDA= new G4RotationMatrix;
  //rotMDA-> rotateY(angle);
  //G4ThreeVector posDA= xyzDownArea;
  //posDA.rotateY(angle);
  //G4Transform3D transformDA(*rotMDA, posDA);
  //
  // A give rotation matrix must be expressed in so called "passive" rotation.
  //downArea= new G4PVPlacement(rotMDA, posDA, "DOWN_AREA_PV",
  //			      downAreaLV, expHall, FALSE, 0);
  //
  // You can also directly specify active transformation.
  //downArea= new G4PVPlacement(transformDA, "DOWN_AREA_PV",
  //			      downAreaLV, expHall, FALSE, 0);

  // ==============================================================
  // each detector component
  // ==============================================================
  // counter system
  ExU01Counter* counter= new ExU01Counter(this);
  counter-> Spec();
  counter-> Build();

  // tracker system
  ExU01Tracker* tracker= new ExU01Tracker(this);
  tracker-> Spec();
  tracker-> Build();

  // calorimeter system
  ExU01Calorimeter* calorimeter= new ExU01Calorimeter(this);
  calorimeter-> Spec();
  calorimeter-> Build();

  // ==============================================================
  // magnetic field
  // ==============================================================
  //G4FieldManager* fieldManager= 
  //  G4TransportationManager::GetTransportationManager()-> GetFieldManager();

  //ExU01MagneticField* magField= new ExU01MagneticField;
  //fieldManager-> SetDetectorField(magField);
  //fieldManager-> CreateChordFinder(magField);
  //fieldManager-> GetChordFinder()-> SetDeltaChord(1.*mm);  // if you need

  // ==============================================================
  // return PV of the world volume
  return expHall;
}


Generated by GNU enscript 1.6.1.