From 63197f4b7ec940bb9e5cf9578948af4c40330976 Mon Sep 17 00:00:00 2001 From: nicolas <nicolas@nptool> Date: Tue, 2 Jul 2013 14:07:33 +0000 Subject: [PATCH] * drop Tigress.cc file in NPSimulation/src --- NPSimulation/src/Tigress.cc | 1002 ----------------------------------- 1 file changed, 1002 deletions(-) delete mode 100644 NPSimulation/src/Tigress.cc diff --git a/NPSimulation/src/Tigress.cc b/NPSimulation/src/Tigress.cc deleted file mode 100644 index 860b529df..000000000 --- a/NPSimulation/src/Tigress.cc +++ /dev/null @@ -1,1002 +0,0 @@ -/***************************************************************************** - * 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 Tigress Silicon array * - * * - *---------------------------------------------------------------------------* - * Comment: * - * * - *****************************************************************************/ - -// C++ headers -#include <sstream> -#include <cmath> -#include <limits> -//G4 Geometry object -#include "G4Box.hh" -#include "G4Tubs.hh" -#include "G4Trd.hh" -#include "G4Trap.hh" -#include "G4Cons.hh" - -//G4 sensitive -#include "G4SDManager.hh" -#include "G4MultiFunctionalDetector.hh" - -//G4 various object -#include "G4Material.hh" -#include "G4Polycone.hh" -#include "G4Polyhedra.hh" -#include "G4LogicalVolume.hh" -#include "G4ThreeVector.hh" -#include "G4Transform3D.hh" -#include "G4RotationMatrix.hh" -#include "G4PVPlacement.hh" -#include "G4VisAttributes.hh" -#include "G4Colour.hh" -#include "G4RunManager.hh" -#include "G4ios.hh" -#include "G4SubtractionSolid.hh" -#include "G4UnionSolid.hh" -#include "G4ThreeVector.hh"// NPS -#include "Tigress.hh" -//#include "TigressScorers.hh" - -// NPL -#include "NPOptionManager.h" - -//#include "TigressScorers.hh" -#include "RootOutput.h" -using namespace TIGRESS; - -// CLHEP header -#include "CLHEP/Random/RandGauss.h" - -using namespace std; -using namespace CLHEP; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -namespace { - const G4double CrystalOuterRadius = 30.0*mm; // outer radius for crystal - const G4double CrystalInnerRadius = 5.0*mm; // inner radius for hole in crystal - const G4double CrystalLength = 90.0*mm; // crystal length - const G4double CrystalHoleDepth = 15.0*mm; // depth at which starts the hole - - const G4double CrystalEdgeOffset1 = 26.0*mm; // distance of the edge from the center of the crystal - const G4double CrystalEdgeOffset2 = 28.5*mm; // distance of the edge from the center of the crystal - - const G4double CrystalEdgeDepth = 30.0*mm; // depth to which the crystal is shaped - const G4double CrystalEdgeAngle = 22.5*deg; // bevel angle - - const G4double CapsuleWidth = 1.5*mm; // capsule width - const G4double CapsuleLength = 110.*mm; // capsule length - const G4double CapsuleEdgeDepth = 3.3*cm; // same as crystal ! - const G4double CrystalToCapsule = 3.5*mm; // to be adjusted .. - - const G4double BGOLength = 120.0*mm; - const G4double BGOWidth = 25.0*mm; - - const G4double CsILength = 20.0*mm; -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Tigress Specific Method -Tigress::Tigress(){ - InitializeMaterial(); - m_Event = new TTigressData(); - - BlueVisAtt = new G4VisAttributes(G4Colour(0, 0, 1)) ; - GreenVisAtt = new G4VisAttributes(G4Colour(0, 1, 0)) ; - RedVisAtt = new G4VisAttributes(G4Colour(1, 0, 0)) ; - WhiteVisAtt = new G4VisAttributes(G4Colour(1, 1, 1)) ; - TrGreyVisAtt = new G4VisAttributes(G4Colour(0.5, 0.5, 0.5, 0.5)) ; - - m_LogicClover = 0; - -} - -Tigress::~Tigress(){ - delete m_MaterialSilicon; - delete m_MaterialAl; - delete m_MaterialVacuum; - delete m_MaterialPCB; -} - -//....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 Tigress::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - istringstream LineStream ; - // Standard Case: - bool check_CloverId = false; - - vector<int> CloverId; - int CloverId_Free = 0; - double R = 0; - double Theta = 0; - double Phi = 0; - double BetaX; - double BetaY; - double BetaZ; - - // Free postion case: - bool check_R = false ; - bool check_Theta = false ; - bool check_Phi = false ; - bool check_Beta = false ; - - // Frame Case - bool check_RightFrame = false ; - bool check_LeftFrame = false ; - - bool ReadingStatusStandard = false ; - bool ReadingStatusFree = false ; - bool ReadingStatusFrame = false ; - bool ReadingStatus = false ; - - while (!ConfigFile.eof()){ - int VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); - - getline(ConfigFile, LineBuffer); - - if (LineBuffer.compare(0, 7, "Tigress") == 0) - ReadingStatus = true; - - while (ReadingStatus && !ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // Comment Line - while (LineBuffer.compare(0, 1, "%") == 0) { - // Take the next line - getline(ConfigFile, LineBuffer); - } - - // Standard case - if (LineBuffer.compare(0, 15, "TigressStandard") == 0){ - if(VerboseLevel==1) - G4cout << "/// Clovers in Standard Configuration : ///" << G4endl ; - ReadingStatusStandard = true ; - } - - // Free placing case - else if (LineBuffer.compare(0, 13, "TigressClover") == 0){ - if(VerboseLevel==1) - G4cout << "/// Free placed clover : ///" << G4endl ; - ReadingStatusFree = true ; - } - - // Frame case - else if (LineBuffer.compare(0, 12, "TigressFrame") == 0){ - if(VerboseLevel==1) - G4cout << "/// Support Frame : ///" << G4endl ; - ReadingStatusFrame = true ; - } - - // Reading Block - while(ReadingStatusStandard){ - // Pickup Next Line - getline(ConfigFile, LineBuffer); - // Comment Line - while (LineBuffer.compare(0, 1, "%") == 0) { - // Take the next line - getline(ConfigFile, LineBuffer); - } - - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer; - - if ( DataBuffer == "CloverId=" ) { - check_CloverId = true; - - if(VerboseLevel==1) cout << "CloverId: " ; - while(LineStream >> DataBuffer){ - CloverId.push_back(atoi(DataBuffer.c_str())); - if(VerboseLevel==1) G4cout << atoi(DataBuffer.c_str()) << " "; - } - if(VerboseLevel==1) G4cout << G4endl << G4endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusStandard = false; - G4cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_CloverId){ - ReadingStatusStandard = false; - AddCloverStandard(CloverId); - CloverId.clear(); - check_CloverId = false ; - } - } - - // Reading Block - while(ReadingStatusFree){ - // Pickup Next Line - getline(ConfigFile, LineBuffer); - // Comment Line - while (LineBuffer.compare(0, 1, "%") == 0) { - // Take the next line - getline(ConfigFile, LineBuffer); - } - - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer; - - if ( DataBuffer == "CloverId=" ) { - check_CloverId = true; - LineStream >> DataBuffer; - CloverId_Free = atoi(DataBuffer.c_str()); - if(VerboseLevel==1) - cout << "CloverId: " << atoi(DataBuffer.c_str()) << " " << endl ; - } - - else if ( DataBuffer == "R=" ) { - check_R = true; - LineStream >> DataBuffer; - R = atof(DataBuffer.c_str())*mm; - if(VerboseLevel==1) - cout << "R: " << R/mm << " " << endl ; - } - - else if ( DataBuffer == "Theta=" ) { - check_Theta = true; - LineStream >> DataBuffer; - Theta = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - cout << "Theta: " << Theta/deg << " " << endl ; - } - - else if ( DataBuffer == "Phi=" ) { - check_Phi = true; - LineStream >> DataBuffer; - Phi = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - cout << "Phi: " << Phi/deg << " " << endl ; - } - - else if ( DataBuffer == "Beta=" ) { - check_Beta = true; - LineStream >> DataBuffer; - BetaX = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - cout << "BetaX: " << BetaX/deg << " " << endl ; - LineStream >> DataBuffer; - BetaY = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - cout << "BetaY: " << BetaY/deg << " " << endl ; - LineStream >> DataBuffer; - BetaZ = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - cout << "BetaZ: " << BetaZ/deg << " " << endl ; - } - - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusStandard = false; - G4cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_CloverId && check_R && check_Theta && check_Phi && check_Beta){ - ReadingStatusFree = false; - AddCloverFreePosition(CloverId_Free,R,Theta,Phi,BetaX,BetaY,BetaZ); - check_CloverId = false ; - check_R = false ; - check_Theta = false ; - check_Phi = false ; - check_Beta = false ; - } - } - - // Reading Block - while(ReadingStatusFrame){ - // Pickup Next Line - getline(ConfigFile, LineBuffer); - // Comment Line - while (LineBuffer.compare(0, 1, "%") == 0) { - // Take the next line - getline(ConfigFile, LineBuffer); - } - - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer; - - if ( DataBuffer == "RightFrame=" ) { - check_RightFrame = true; - - LineStream >> DataBuffer; - m_RightFrame=atoi(DataBuffer.c_str()); - - if (VerboseLevel==1) { - if(m_RightFrame) - cout << "Right frame: yes" << endl; - else - cout << "Right frame: no" << endl; - } - } - - else if ( DataBuffer == "LeftFrame=" ) { - check_LeftFrame = true; - - LineStream >> DataBuffer; - m_LeftFrame=atoi(DataBuffer.c_str()); - - if (VerboseLevel==1) { - if(m_LeftFrame) - cout << "Left frame: yes" << endl; - else - cout << "Left frame: no" << endl; - } - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusStandard = false; - G4cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_RightFrame && check_LeftFrame){ - ReadingStatusFrame = false; - AddCloverStandard(CloverId); - CloverId.clear(); - check_RightFrame = false; - check_LeftFrame = false; - } - } - - } - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Return a G4VSolid modeling the Crystal -G4VSolid* Tigress::ConstructCrystal(){ - - // Copy Past form Exogam collaboration - - char sName[40]; // generic for named objects - - // define a coaxial shape that will be modify with SubstractSolid - G4int nbslice = 4; - G4double zSliceGe[4] = { 0.0*mm, CrystalHoleDepth, CrystalHoleDepth + 3.0*mm, CrystalLength}; // depth where is the hole - G4double InnRadGe[4] = { 0.0*mm, 0.0*mm, CrystalInnerRadius, CrystalInnerRadius}; // to define the hole in the crystal - G4double OutRadGe[4] = { CrystalOuterRadius, CrystalOuterRadius, CrystalOuterRadius, CrystalOuterRadius}; // to define the external surface - - G4double Edge[3]; - - sprintf(sName, "coax"); - G4Polycone *coax - = new G4Polycone(G4String(sName), 0.*deg, 360.*deg, nbslice, zSliceGe, InnRadGe, OutRadGe); - - // substract boxes to remove maters. - G4RotationMatrix rm; // rm.SetName(G4String("RotationEdge")); - - // box definition to remove some matter to the crystal - sprintf(sName, "LongEdge1"); - Edge[0] = (CrystalOuterRadius-CrystalEdgeOffset1); // x half-width - Edge[1] = 1.001*CrystalOuterRadius; // y half-width - Edge[2] = 1.001*CrystalLength/2.0; // z half-width - G4Box *cutEdge1 = new G4Box(G4String(sName),Edge[0],Edge[1],Edge[2]); - - sprintf(sName, "LongEdge2"); - Edge[0] = (CrystalOuterRadius-CrystalEdgeOffset2); // x half-width - Edge[1] = 1.001*CrystalOuterRadius; // y half-width - Edge[2] = 1.001*CrystalLength/2.0; // z half-width - G4Box *cutEdge2 = new G4Box(G4String(sName),Edge[0],Edge[1],Edge[2]); - - sprintf(sName, "Bevel"); - Edge[0] = 1.001*CrystalOuterRadius; - Edge[1] = sin(CrystalEdgeAngle)*(CrystalEdgeDepth); - Edge[2] = 1.001*CrystalLength/2.0; - - G4Box *cutBevel = new G4Box(G4String(sName),Edge[0],Edge[1],Edge[2]); - - // now remove previously defined box from coax. The box must be placed correctly before - // since the box definition goes from negative to positive values. - sprintf(sName, "coax_cut1_edge"); - G4SubtractionSolid *coax_cut1 - = new G4SubtractionSolid (G4String(sName), coax, cutEdge1, &rm, G4ThreeVector(-CrystalOuterRadius,0.0,CrystalLength/2.0)); - - sprintf(sName, "coax_cut2_edge"); - G4SubtractionSolid *coax_cut2 - = new G4SubtractionSolid (G4String(sName), coax_cut1, cutEdge2, &rm, G4ThreeVector(CrystalOuterRadius,0.0,CrystalLength/2.0)); - - sprintf(sName, "coax_cut3_edge"); - rm.rotateZ(90.0*deg); - G4SubtractionSolid *coax_cut3 - = new G4SubtractionSolid (G4String(sName), coax_cut2, cutEdge2, &rm, G4ThreeVector(0.0,CrystalOuterRadius,CrystalLength/2.0)); - - sprintf(sName, "coax_cut4_edge"); - G4SubtractionSolid *coax_cut4 - = new G4SubtractionSolid (G4String(sName), coax_cut3, cutEdge1, &rm, G4ThreeVector(0.0,-CrystalOuterRadius,CrystalLength/2.0)); - rm.rotateZ(-90.0*deg); - - sprintf(sName, "coax_cut5_edge"); - rm.rotateX(CrystalEdgeAngle); - G4SubtractionSolid *coax_cut5 - = new G4SubtractionSolid (G4String(sName), coax_cut4, cutBevel, &rm, G4ThreeVector(0.,CrystalEdgeOffset2,0.)); - rm.rotateX(-CrystalEdgeAngle); - - sprintf(sName, "coax_cut6_edge"); - rm.rotateZ(90.0*deg); - rm.rotateX(CrystalEdgeAngle); - G4SubtractionSolid *coax_cut6 - = new G4SubtractionSolid (G4String(sName), coax_cut5, cutBevel, &rm, G4ThreeVector(CrystalEdgeOffset2,0.,0.)); - rm.rotateX(-CrystalEdgeAngle); - rm.rotateZ(-90.0*deg); - - return coax_cut6; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Return a G4VSolid modeling the Capsule -G4VSolid* Tigress::ConstructCapsule(){ - - G4int nbslice = 7; - const G4double widthface = 45.5*mm; - G4double zSlice[7] = { 0.0*mm, - CapsuleWidth-0.1*mm, - CapsuleWidth, - CapsuleEdgeDepth, - CapsuleLength-CapsuleWidth, - CapsuleLength-CapsuleWidth-0.1*mm, - CapsuleLength }; - G4double InnRad[7] = { 0.0*mm, - 0.0*mm, - widthface-CapsuleWidth, - CrystalEdgeOffset1 + CrystalEdgeOffset2 + CrystalToCapsule - CapsuleWidth, - CrystalEdgeOffset1 + CrystalEdgeOffset2 + CrystalToCapsule - CapsuleWidth, - 0.0*mm, - 0.0*mm}; - G4double OutRad[7] = { widthface-1.5*mm, - widthface, - widthface, - CrystalEdgeOffset1 + CrystalEdgeOffset2 + CrystalToCapsule, - CrystalEdgeOffset1 + CrystalEdgeOffset2 + CrystalToCapsule, - CrystalEdgeOffset1 + CrystalEdgeOffset2 + CrystalToCapsule, - CrystalEdgeOffset1 + CrystalEdgeOffset2 + CrystalToCapsule}; - - G4Polyhedra *caps = new G4Polyhedra(G4String("Capsule"), 0.*deg, 360.*deg, 4, nbslice, zSlice, InnRad, OutRad); - return caps; - -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Return a G4VSolid modeling the BGO -G4VSolid* Tigress::ConstructBGO(){ - - return 0; - - -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Return a clover in the configuration given by option (not use a the moment) -void Tigress::ConstructClover(string){ - - if(m_LogicClover==0){ - - // Construct the clover itself - G4VSolid* Capsule = ConstructCapsule(); - // Place the cristal in the clover - G4ThreeVector CrystalPosition = G4ThreeVector(+113.6*0.5*0.5*mm,+113.6*0.5*0.5*mm,0); - G4VSolid* CrystalB = ConstructCrystal(); - - m_LogicClover = - new G4LogicalVolume(Capsule,m_MaterialVacuum,"LogicCloverCase", 0, 0, 0); - - G4LogicalVolume* logicCrystalB = - new G4LogicalVolume(CrystalB,m_MaterialVacuum,"LogicCrystalB", 0, 0, 0); - - G4LogicalVolume* logicCrystalG = - new G4LogicalVolume(CrystalB,m_MaterialVacuum,"LogicCrystalG", 0, 0, 0); - - G4LogicalVolume* logicCrystalR = - new G4LogicalVolume(CrystalB,m_MaterialVacuum,"LogicCrystalR", 0, 0, 0); - - G4LogicalVolume* logicCrystalW = - new G4LogicalVolume(CrystalB,m_MaterialVacuum,"LogicCrystalW", 0, 0, 0); - - G4RotationMatrix* CrystalRotation = new G4RotationMatrix(0,0,0); - CrystalPosition = G4ThreeVector(+113.6*0.5*0.5*mm,+113.6*0.5*0.5*mm,0); - new G4PVPlacement(G4Transform3D(*CrystalRotation, CrystalPosition), - logicCrystalB,"LogicCrystalB",m_LogicClover,false,m_CloverId[0]); - logicCrystalB->SetVisAttributes(BlueVisAtt); - - CrystalRotation->rotate(-180*deg, G4ThreeVector(0,0,1)); - CrystalPosition = G4ThreeVector(+113.6*0.5*0.5*mm,-113.6*0.5*0.5*mm,0); - new G4PVPlacement(G4Transform3D(*CrystalRotation, CrystalPosition), - logicCrystalG,"LogicCrystalG",m_LogicClover,false,m_CloverId[0]); - logicCrystalG->SetVisAttributes(GreenVisAtt); - - CrystalRotation->rotate(-180*deg, G4ThreeVector(0,0,1)); - CrystalPosition = G4ThreeVector(-113.6*0.5*0.5*mm,-113.6*0.5*0.5*mm,0); - new G4PVPlacement(G4Transform3D(*CrystalRotation, CrystalPosition), - logicCrystalR,"LogicCrystalR",m_LogicClover,false,m_CloverId[0]); - logicCrystalR->SetVisAttributes(RedVisAtt); - - CrystalRotation->rotate(-180*deg, G4ThreeVector(0,0,1)); - CrystalPosition = G4ThreeVector(-113.6*0.5*0.5*mm,+113.6*0.5*0.5*mm,0); - new G4PVPlacement(G4Transform3D(*CrystalRotation, CrystalPosition), - logicCrystalW,"LogicCrystalW",m_LogicClover,false,m_CloverId[0]); - logicCrystalW->SetVisAttributes(WhiteVisAtt); - - m_LogicClover->SetVisAttributes(TrGreyVisAtt); - } - -} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Construct detector and inialise sensitive part. -// Called After DetecorConstruction::AddDetector Method -void Tigress::ConstructDetector(G4LogicalVolume* world){ - ConstructClover(""); - - G4RotationMatrix* DetectorRotation = new G4RotationMatrix(0,0,0); - for (unsigned int i = 0 ; i < m_CloverId.size(); i++) { - - // Constructing the Detector referential and the transition matrix - G4ThreeVector U,V,W; - G4double wX = sin(m_Theta[i]) * cos(m_Phi[i]) ; - G4double wY = sin(m_Theta[i]) * sin(m_Phi[i]) ; - G4double wZ = cos(m_Theta[i]); - W = G4ThreeVector(wX, wY, wZ) ; - - // vector parallel to one axis of the entrance plane - G4double vX = cos(m_Theta[i]) * cos(m_Phi[i]); - G4double vY = cos(m_Theta[i]) * sin(m_Phi[i]); - G4double vZ = -sin(m_Theta[i]); - V = G4ThreeVector(vX, vY, vZ); - - W = W.unit(); - U = V.cross(W); - U = U.unit(); - V = W.cross(U); - V = V.unit(); - // Passage Matrix from Lab Referential to Clover Referential - delete DetectorRotation; - DetectorRotation = new G4RotationMatrix(U, V, W); - - DetectorRotation->rotate(m_BetaX[i], U); - DetectorRotation->rotate(m_BetaY[i], V); - DetectorRotation->rotate(m_BetaZ[i], W); - DetectorRotation->rotate(45*deg, W); - G4ThreeVector DetectorPosition = m_R[i]*W; - - new G4PVPlacement(G4Transform3D(*DetectorRotation, DetectorPosition), - m_LogicClover,"Clover",world,false,m_CloverId[0]); - } - -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Add clover at the standard position of the array -// Take as argument the standard clover Id. -void Tigress::AddCloverStandard(vector<int> CloverId){ - - for (unsigned int i = 0 ; i < CloverId.size(); i++) { - if(CloverId[i] == 1 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(45*deg); - m_Phi.push_back(22.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(0); - } - - else if(CloverId[i] == 2 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(45*deg); - m_Phi.push_back(112.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(0); - } - - else if(CloverId[i] == 3 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(45*deg); - m_Phi.push_back(202.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(0); - } - - else if(CloverId[i] == 4 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(45*deg); - m_Phi.push_back(292.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(0); - } - - else if(CloverId[i] == 5 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(90*deg); - m_Phi.push_back(22.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(180*deg); - } - - else if(CloverId[i] == 6 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(90*deg); - m_Phi.push_back(67.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(180*deg); - } - - else if(CloverId[i] == 7 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(90*deg); - m_Phi.push_back(112.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(180*deg); - } - - else if(CloverId[i] == 8 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(90*deg); - m_Phi.push_back(157.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(180*deg); - } - - else if(CloverId[i] == 9 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(90*deg); - m_Phi.push_back(202.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(180*deg); - } - - else if(CloverId[i] == 10 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(90*deg); - m_Phi.push_back(247.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(180*deg); - } - - else if(CloverId[i] == 11 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(90*deg); - m_Phi.push_back(292.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(180*deg); - } - - else if(CloverId[i] == 12 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(90*deg); - m_Phi.push_back(337.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(180*deg); - } - - else if(CloverId[i] == 13 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(135*deg); - m_Phi.push_back(22.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(180*deg); - } - - else if(CloverId[i] == 14 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(135*deg); - m_Phi.push_back(112.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(180*deg); - } - - else if(CloverId[i] == 15 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(135*deg); - m_Phi.push_back(202.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(180*deg); - } - - else if(CloverId[i] == 16 ){ - m_CloverId.push_back(CloverId[i]); - m_R.push_back(145*mm); - m_Theta.push_back(135*deg); - m_Phi.push_back(292.5*deg); - m_BetaX.push_back(0); - m_BetaY.push_back(0); - m_BetaZ.push_back(180*deg); - } - } - -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Add clover at a free position in space with coordinate -// in spherical coordinate -// Beta are the three angles of rotation in the Clover frame -void Tigress::AddCloverFreePosition(int CloverId,double R,double Theta,double Phi,double BetaX,double BetaY,double BetaZ){ - - m_CloverId.push_back(CloverId); - m_R.push_back(R); - m_Theta.push_back(Theta); - m_Phi.push_back(Phi); - m_BetaX.push_back(BetaX); - m_BetaY.push_back(BetaY); - m_BetaZ.push_back(BetaZ); - -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Add Detector branch to the EventTree. -// Called After DetecorConstruction::AddDetector Method -void Tigress::InitializeRootOutput(){ - RootOutput *pAnalysis = RootOutput::getInstance(); - TTree *pTree = pAnalysis->GetTree(); - pTree->Branch("Tigress", "TTigressData", &m_Event) ; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Read sensitive part and fill the Root tree. -// Called at in the EventAction::EndOfEventAvtion -void Tigress::ReadSensitive(const G4Event* event){ - event->GetHCofThisEvent(); // event should be used to remove compilation warning - /*m_Event->Clear(); - - /////////// - // BOX - G4THitsMap<G4double*>* BOXHitMap; - std::map<G4int, G4double**>::iterator BOX_itr; - - G4int BOXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Tigress_BOXScorer/TigressBOX"); - BOXHitMap = (G4THitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(BOXCollectionID)); - - // Loop on the BOX map - for (BOX_itr = BOXHitMap->GetMap()->begin() ; BOX_itr != BOXHitMap->GetMap()->end() ; BOX_itr++){ - - G4double* Info = *(BOX_itr->second); - - double Energy = Info[0]; - double Time = Info[1]; - int DetNbr = (int) Info[2]; - int StripFront = (int) Info[3]; - int StripBack = (int) Info[4]; - - m_Event->SetFront_DetectorNbr(DetNbr); - m_Event->SetFront_StripNbr(StripFront); - m_Event->SetFront_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetFront_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetFront_TimeLED(RandGauss::shoot(Time, ResoTime)); - - m_Event->SetBack_DetectorNbr(DetNbr); - m_Event->SetBack_StripNbr(StripBack); - m_Event->SetBack_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetBack_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetBack_TimeLED(RandGauss::shoot(Time, ResoTime)); - - - // Interraction Coordinates - ms_InterCoord->SetDetectedPositionX(Info[5]) ; - ms_InterCoord->SetDetectedPositionY(Info[6]) ; - ms_InterCoord->SetDetectedPositionZ(Info[7]) ; - ms_InterCoord->SetDetectedAngleTheta(Info[8]/deg) ; - ms_InterCoord->SetDetectedAnglePhi(Info[9]/deg) ; - - } - - // clear map for next event - BOXHitMap->clear(); - - /////////// - // PAD - G4THitsMap<G4double*>* PADHitMap; - std::map<G4int, G4double**>::iterator PAD_itr; - - G4int PADCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Tigress_PADScorer/TigressPAD"); - PADHitMap = (G4THitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(PADCollectionID)); - - // Loop on the BOX map - for (PAD_itr = PADHitMap->GetMap()->begin() ; PAD_itr != PADHitMap->GetMap()->end() ; PAD_itr++){ - - G4double* Info = *(PAD_itr->second); - - double Energy = Info[0]; - double Time = Info[1]; - int DetNbr = (int) Info[2]; - - m_Event->SetPAD_DetectorNbr(DetNbr); - m_Event->SetPAD_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetPAD_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetPAD_TimeLED(RandGauss::shoot(Time, ResoTime)); - - } - - // clear map for next event - PADHitMap->clear(); - - /////////// - // QQQ - G4THitsMap<G4double*>* QQQHitMap; - std::map<G4int, G4double**>::iterator QQQ_itr; - - G4int QQQCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Tigress_QQQScorer/TigressQQQ"); - QQQHitMap = (G4THitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(QQQCollectionID)); - - // Loop on the BOX map - for (QQQ_itr = QQQHitMap->GetMap()->begin() ; QQQ_itr != QQQHitMap->GetMap()->end() ; QQQ_itr++){ - - G4double* Info = *(QQQ_itr->second); - - double Energy = Info[0]; - double Time = Info[1]; - int DetNbr = (int) Info[2]; - int StripFront = (int) Info[3]; - int StripBack = (int) Info[4]; - - m_Event->SetFront_DetectorNbr(DetNbr); - m_Event->SetFront_StripNbr(StripFront); - m_Event->SetFront_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetFront_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetFront_TimeLED(RandGauss::shoot(Time, ResoTime)); - - m_Event->SetBack_DetectorNbr(DetNbr); - m_Event->SetBack_StripNbr(StripBack); - m_Event->SetBack_Energy(RandGauss::shoot(Energy, ResoEnergy)); - m_Event->SetBack_TimeCFD(RandGauss::shoot(Time, ResoTime)); - m_Event->SetBack_TimeLED(RandGauss::shoot(Time, ResoTime)); - - // Interraction Coordinates - ms_InterCoord->SetDetectedPositionX(Info[5]) ; - ms_InterCoord->SetDetectedPositionY(Info[6]) ; - ms_InterCoord->SetDetectedPositionZ(Info[7]) ; - ms_InterCoord->SetDetectedAngleTheta(Info[8]/deg) ; - ms_InterCoord->SetDetectedAnglePhi(Info[9]/deg) ; - - } - - // clear map for next event - QQQHitMap->clear(); - */ -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void Tigress::InitializeScorers(){ - /* - // Silicon Associate Scorer - m_BOXScorer = new G4MultiFunctionalDetector("Tigress_BOXScorer"); - m_PADScorer = new G4MultiFunctionalDetector("Tigress_PADScorer"); - m_QQQScorer = new G4MultiFunctionalDetector("Tigress_QQQScorer"); - - G4VPrimitiveScorer* BOXScorer = - new Tigress::PS_Silicon_Rectangle("TigressBOX", - BOX_Wafer_Length, - BOX_Wafer_Width, - BOX_Wafer_Back_NumberOfStrip , - BOX_Wafer_Front_NumberOfStrip, - EnergyThreshold); - - G4VPrimitiveScorer* PADScorer = - new Tigress::PS_Silicon_Rectangle("TigressPAD", - PAD_Wafer_Length, - PAD_Wafer_Width, - 1 , - 1, - EnergyThreshold); - - G4VPrimitiveScorer* QQQScorer = - new Tigress::PS_Silicon_Annular("TigressQQQ", - QQQ_Wafer_Inner_Radius, - QQQ_Wafer_Outer_Radius, - QQQ_Wafer_Stopping_Phi-QQQ_Wafer_Starting_Phi, - QQQ_Wafer_NumberOf_RadialStrip, - QQQ_Wafer_NumberOf_AnnularStrip, - EnergyThreshold); - - - - //and register it to the multifunctionnal detector - m_BOXScorer->RegisterPrimitive(BOXScorer); - m_PADScorer->RegisterPrimitive(PADScorer); - m_QQQScorer->RegisterPrimitive(QQQScorer); - - // Add All Scorer to the Global Scorer Manager - G4SDManager::GetSDMpointer()->AddNewDetector(m_BOXScorer) ; - G4SDManager::GetSDMpointer()->AddNewDetector(m_PADScorer) ; - G4SDManager::GetSDMpointer()->AddNewDetector(m_QQQScorer) ;*/ -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//////////////////////////////////////////////////////////////// -/////////////////Material Definition /////////////////////////// -//////////////////////////////////////////////////////////////// -void Tigress::InitializeMaterial(){ - G4Element* H = new G4Element("Hydrogen" , "H" , 1 , 1.015 * g / mole); - G4Element* C = new G4Element("Carbon" , "C" , 6 , 12.011 * g / mole); - G4Element* N = new G4Element("Nitrogen" , "N" , 7 , 14.01 * g / mole); - G4Element* O = new G4Element("Oxygen" , "O" , 8 , 15.99 * g / mole); - - G4double a, z, density; - // Si - a = 28.0855 * g / mole; - density = 2.321 * g / cm3; - m_MaterialSilicon = new G4Material("Si", z = 14., a, density); - - // Al - density = 2.702 * g / cm3; - a = 26.98 * g / mole; - m_MaterialAl = new G4Material("Al", z = 13., a, density); - - // PCB (should be FR-4, I took Epoxy Molded from LISE++) - density = 1.85 * g / cm3; - m_MaterialPCB = new G4Material("PCB", density, 3); - m_MaterialPCB->AddElement(H, .475); - m_MaterialPCB->AddElement(C, .45); - m_MaterialPCB->AddElement(O, .075); - // Vacuum - density = 0.000000001 * mg / cm3; - m_MaterialVacuum = new G4Material("Vacuum", density, 2); - m_MaterialVacuum->AddElement(N, .7); - m_MaterialVacuum->AddElement(O, .3); -} - - -- GitLab