Newer
Older
/*****************************************************************************
* Copyright (C) 2009-2013 this file is part of the NPTool Project *
* *
* For the licensing terms see $NPTOOL/Licence/NPTool_Licence *
* For the list of contributors see $NPTOOL/Licence/Contributors *
*****************************************************************************/
/*****************************************************************************
* Original Author: Adrien MATTA contact address: matta@ipno.in2p3.fr *
* *
* Creation Date : November 2012 *
* Last update : *
*---------------------------------------------------------------------------*
* Decription: *
* This class describe the Tiara Silicon array *
* *
*---------------------------------------------------------------------------*
* Comment: *
* *
*****************************************************************************/
// C++ headers
#include <sstream>
#include <cmath>
#include <limits>
//G4 Geometry object
#include "G4Box.hh"
#include "G4Tubs.hh"
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//G4 sensitive
#include "G4SDManager.hh"
//G4 various object
#include "G4MaterialTable.hh"
#include "G4Element.hh"
#include "G4ElementTable.hh"
#include "G4Transform3D.hh"
#include "G4PVPlacement.hh"
#include "G4Colour.hh"
#include "G4PVDivision.hh"
#include "G4SubtractionSolid.hh"
// NPS
#include "Tiara.hh"
// NPL
#include "NPOptionManager.h"
//#include "TiaraScorers.hh"
#include "RootOutput.h"
using namespace TIARA;
// CLHEP header
#include "CLHEP/Random/RandGauss.h"
using namespace std;
using namespace CLHEP;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
Tiara::Tiara(){
//InitializeMaterial();
m_EventBarrel = new TTiaraBarrelData();
m_EventHyball = new TTiaraHyballData();
// Dark Grey
SiliconVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)) ;
// Green
PCBVisAtt = new G4VisAttributes(G4Colour(0.2, 0.5, 0.2)) ;
// Gold Yellow
PADVisAtt = new G4VisAttributes(G4Colour(0.5, 0.5, 0.2)) ;
// Light Grey
FrameVisAtt = new G4VisAttributes(G4Colour(0.5, 0.5, 0.5)) ;
}
Tiara::~Tiara(){
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
// Virtual Method of VDetector class
// Read stream at Configfile to pick-up parameters of detector (Position,...)
// Called in DetecorConstruction::ReadDetextorConfiguration Method
void Tiara::ReadConfiguration(string Path){
/* ifstream ConfigFile ;
ConfigFile.open(Path.c_str()) ;
string LineBuffer ;
string DataBuffer ;
while (!ConfigFile.eof()){
int VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel();
getline(ConfigFile, LineBuffer);
// cout << LineBuffer << endl;
if (LineBuffer.compare(0, 5, "Tiara") == 0)
ReadingStatus = true;
while (ReadingStatus && !ConfigFile.eof()) {
ConfigFile >> DataBuffer ;
// Comment Line
if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );}
// Tiara Chamber
if (DataBuffer=="TiaraChambe="){
if(VerboseLevel==1) G4cout << "///" << G4endl ;
if(VerboseLevel==1) G4cout << "Chamber Found:: " << G4endl ;
bool bool_Chamber;
ConfigFile >> bool_Chamber;
}
// Barrel case
else if (DataBuffer=="TiaraBarrel"){
if(VerboseLevel==1) G4cout << "///" << G4endl ;
if(VerboseLevel==1) G4cout << "Barrel found: " << G4endl ;
// ReadingStatusBOX = true ;
}
// Hyball case
else if (DataBuffer=="TiaraHyball")
if(VerboseLevel==1) G4cout << "///" << G4endl ;
if(VerboseLevel==1) G4cout << "Hyball found: " << G4endl ;
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
// Construct detector and inialise sensitive part.
// Called After DetecorConstruction::AddDetector Method
void Tiara::ConstructDetector(G4LogicalVolume* world){
ConstructChamber(world);
ConstructBarrel(world);
// Read sensitive part and fill the Root tree.
// Called at in the EventAction::EndOfEventAvtion
void Tiara::ReadSensitive(const G4Event* event){
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void Tiara::InitializeScorers(){
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void Tiara::InitializeRootOutput(){
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void Tiara::ConstructChamber(G4LogicalVolume* world){
// Vaccum Chamber of Tiara
// The chamber is made of a central cylinder surrounding the barrel Si
// Two Cone that expeand out of the central cylinder to let room for Exogam
// Two outer cylinder surrounding Hyball
// Hyball is hold on a back plate that close the Diabolo Shaped Chamber
// Material to be moved in a Material Function //
// Al
G4double density = 2.702*g/cm3;
G4double a = 26.98*g/mole;
G4Material* Aluminium = new G4Material("Aluminium", 13., a, density);
// Making the Chamber //
// We make the individual pieces, starting from the inside to the outside
// Then we merge them together using the a G4AdditionSolid
// The whole chamber is then placed
// Central Tube
G4Tubs* solidCentralTube =
new G4Tubs("TiaraChamberCentralTube",CHAMBER_CentralTube_Inner_Radius,
CHAMBER_CentralTube_Outer_Radius,CHAMBER_CentralTube_Length,
0*deg,360*deg);
// Forward-Backward Cones
G4Cons* solidOuterCone =
new G4Cons("TiaraChamberOuterCone",CHAMBER_CentralTube_Inner_Radius,
CHAMBER_CentralTube_Outer_Radius,CHAMBER_OuterCylinder_Inner_Radius,
CHAMBER_OuterCylinder_Outer_Radius,CHAMBER_OuterCone_Length,
0*deg,360*deg);
// Outer Cylinder
G4Tubs* solidOuterCylinder =
new G4Tubs("TiaraChamberOuterCylinder",CHAMBER_OuterCylinder_Inner_Radius,
CHAMBER_OuterCylinder_Outer_Radius,CHAMBER_OuterCylinder_Length,
0*deg,360*deg);
// Add the volume together
G4UnionSolid* solidTiaraChamberStep1 =
new G4UnionSolid("TiaraChamber", solidCentralTube, solidOuterCone,
new G4RotationMatrix,
G4ThreeVector(0,0,CHAMBER_OuterCone_Z_Pos));
G4UnionSolid* solidTiaraChamberStep2 =
new G4UnionSolid("TiaraChamber", solidTiaraChamberStep1, solidOuterCone,
new G4RotationMatrix(0,180*deg,0),
G4ThreeVector(0,0,-CHAMBER_OuterCone_Z_Pos));
G4UnionSolid* solidTiaraChamberStep3 =
new G4UnionSolid("TiaraChamber", solidTiaraChamberStep2, solidOuterCylinder,
new G4RotationMatrix,
G4ThreeVector(0,0,CHAMBER_OuterCylinder_Z_Pos));
G4UnionSolid* solidTiaraChamberStep4 =
new G4UnionSolid("TiaraChamber", solidTiaraChamberStep3, solidOuterCylinder,
new G4RotationMatrix,
G4ThreeVector(0,0,-CHAMBER_OuterCylinder_Z_Pos));
// Create Logic Volume
G4LogicalVolume* logicTiaraChamber =
new G4LogicalVolume(solidTiaraChamberStep4,Aluminium,"logicTiaraChamber", 0, 0, 0);
// Visual Attribute
G4VisAttributes* ChamberVisAtt
ChamberVisAtt->SetForceWireframe(true);
ChamberVisAtt->SetForceAuxEdgeVisible (true);
logicTiaraChamber->SetVisAttributes(ChamberVisAtt);
// Place the whole chamber
new G4PVPlacement(new G4RotationMatrix(0,0,0), G4ThreeVector(0,0,0),
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
logicTiaraChamber,"TiaraChamber",world,false,0);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void Tiara::ConstructBarrel(G4LogicalVolume* world){
// Tiara Barrel
// The Barrel is made of 8 identical resistive strip detector
// The detector are rectangular shape with a pcb and a wafer
// the pcb is a substracted volume
// the wafer goes into the hole
// the whole things is design so the local reference is the one of the wafer
// Material to be moved in a Material Function //
// Al
G4double density = 2.702*g/cm3;
G4double a = 26.98*g/mole;
G4Material* Aluminium = new G4Material("Aluminium", 13., a, density);
PCBVisAtt = new G4VisAttributes(G4Colour(0.2, 0.5, 0.2)) ;
int DetNbr=0;
// Start by making a full pcb
G4Box* PCBFull = new G4Box("PCBFull" ,
INNERBARREL_PCB_Length/2.,
INNERBARREL_PCB_Width/2.,
INNERBARREL_PCB_Thickness/2.);
G4Box* WaferShape = new G4Box("WaferShape",
INNERBARREL_Wafer_Length/2.,
INNERBARREL_Wafer_Width/2.,
INNERBARREL_PCB_Thickness/2.+0.1*mm);
G4Box* Wafer = new G4Box("Wafer",
INNERBARREL_Wafer_Length/2.,
INNERBARREL_Wafer_Width/2.,
INNERBARREL_Wafer_Thickness/2.);
// Calculate the wafer shift within the PCB
G4ThreeVector WaferShift = G4ThreeVector(
INNERBARREL_PCB_Offset-(INNERBARREL_PCB_Length/2-INNERBARREL_Wafer_Length/2),
0,
0);
G4SubtractionSolid* PCB = new G4SubtractionSolid("PCB", PCBFull, WaferShape,
new G4RotationMatrix,WaferShift);
// Master Volume
G4LogicalVolume* logicBarrelDetector =
new G4LogicalVolume(PCBFull,Aluminium,"logicBoxDetector", 0, 0, 0);
logicBarrelDetector->SetVisAttributes(G4VisAttributes::Invisible);
// Sub Volume PCB
G4LogicalVolume* logicPCB =
new G4LogicalVolume(PCB,Aluminium,"logicPCB", 0, 0, 0);
logicPCB->SetVisAttributes(PCBVisAtt);
// Sub Volume Wafer
G4LogicalVolume* logicWafer =
new G4LogicalVolume(Wafer,Aluminium,"logicWafer", 0, 0, 0);
// Place the sub volume in the master volume
new G4PVPlacement(new G4RotationMatrix(0,0,0),
G4ThreeVector(0,0,0),
logicPCB,"Tiara_Barrel_PCB",logicBarrelDetector,
false,DetNbr);
new G4PVPlacement(new G4RotationMatrix(0,0,0),
WaferShift,
logicWafer,"Barrel_Wafer",
logicBarrelDetector,false,DetNbr);
new G4PVPlacement(new G4RotationMatrix(0,0,0),
G4ThreeVector(0,5*mm,10*cm),
logicBarrelDetector,"Tiara_Barrel_Detector",
world,false,DetNbr);
// Substract a square to make a hole in it
// create the wafer
// place the wafer in the pcb