ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CCalDetectorConstruction.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file CCalDetectorConstruction.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
27 // File: CCalDetectorConstruction.cc
28 // Description: CCalDetectorConstruction user action class to construct
29 // detector geometry
32 
33 //#define debug
34 
35 #ifdef debug
36 #include "G4Timer.hh"
37 #endif
38 
39 #include "CCalMaterialFactory.hh"
41 #include "CCalSensAssign.hh"
42 #include "CCalMagneticField.hh"
43 #include "CCalG4Hall.hh"
44 #include "CCalutils.hh"
45 
47 #include "CCalEcalOrganization.hh"
48 #include "CCalHcalOrganization.hh"
49 
50 #include "G4SystemOfUnits.hh"
51 #include "G4SDManager.hh"
52 #include "G4FieldManager.hh"
53 #include "G4ChordFinder.hh"
54 #include "G4Mag_UsualEqRhs.hh"
55 #include "G4PropagatorInField.hh"
57 
58 #include "G4ClassicalRK4.hh"
59 #include "G4SimpleRunge.hh"
60 #include "G4ExplicitEuler.hh"
61 #include "G4ImplicitEuler.hh"
62 #include "G4SimpleHeum.hh"
63 #include "G4HelixExplicitEuler.hh"
64 #include "G4HelixImplicitEuler.hh"
65 #include "G4HelixSimpleRunge.hh"
66 #include "G4CashKarpRKF45.hh"
67 #include "G4RKG3_Stepper.hh"
68 
70 
72 
74 
76  //Instantiate for the first time the materials and rotations
77 #ifdef debug
78  G4cout << "Retrieving materials...." << G4endl;
79 #endif
80  CCalMaterialFactory::getInstance("material.cms");
81 
82 #ifdef debug
83  G4cout << "Retrieving rotation matrices....." << G4endl;
84 #endif
86 
87  //-------------------------------------------------------------------------
88  // Magnetic field
89  //-------------------------------------------------------------------------
90 
91  static G4bool fieldIsInitialized = false;
92  //And finally that it was not initialized previously
93  if (!fieldIsInitialized) {
94  CCalMagneticField* ccalField=new CCalMagneticField("fmap.tb96");
95  G4double field = ccalField->GetConstantFieldvalue();
96  if (field == 0) {
97  ccalField = NULL;
98  G4cout << "***************************" << G4endl
99  << "* *" << G4endl
100  << "* Magnetic Field is off *" << G4endl
101  << "* *" << G4endl
102  << "***************************" << G4endl;
103  } else {
104  G4cout << "***************************" << G4endl
105  << "* *" << G4endl
106  << "* Magnetic Field is on *" << G4endl
107  << "* *" << G4endl
108  << "***************************" << G4endl << G4endl
109  << " Field Value " << tab << field << G4endl;
110  }
111  G4FieldManager* fieldMgr
113  fieldMgr->SetDetectorField(ccalField);
114  G4Mag_UsualEqRhs *fEquation = new G4Mag_UsualEqRhs(ccalField);
115 
116  G4MagIntegratorStepper *pStepper = new G4ClassicalRK4 (fEquation);
117  //pStepper = new G4ExplicitEuler( fEquation );
118  //pStepper = new G4ImplicitEuler( fEquation );
119  //pStepper = new G4SimpleRunge( fEquation );
120  //pStepper = new G4SimpleHeum( fEquation );
121  //pStepper = new G4HelixExplicitEuler( fEquation );
122  //pStepper = new G4HelixImplicitEuler( fEquation );
123  //pStepper = new G4HelixSimpleRunge( fEquation );
124  //pStepper = new G4CashKarpRKF45( fEquation );
125  //pStepper = new G4RKG3_Stepper( fEquation );
126 
127  G4ChordFinder *pChordFinder = new G4ChordFinder(ccalField,
128  1.e-1*mm, pStepper);
129  pChordFinder->SetDeltaChord(1.0e-3*mm);
130  fieldMgr->SetChordFinder(pChordFinder);
131  fieldMgr->SetDeltaOneStep(1.0e-3*mm);
132  fieldMgr->SetDeltaIntersection(1.0e-4*mm);
133  G4PropagatorInField* fieldPropagator
136  fieldPropagator->SetMinimumEpsilonStep(1.e-5*mm);
137  fieldPropagator->SetMaximumEpsilonStep(1.e-2*mm);
138  fieldIsInitialized = true;
139  }
140 
141 #ifdef debug
142  G4cout << tab << "CCalDetectorConstruction: Starting timer!!!"
143  << G4endl;
144  G4Timer timer;
145  timer.Start();
146 #endif
147 
148  //HCAL Test Beam 96
149  CCalG4Hall* testBeamHCal96 = new CCalG4Hall("HcalTB96");
150  testBeamHCal96->constructHierarchy();
151 #ifdef debug
152  timer.Stop();
153  G4cout << tab << "CCalDetectorConstruction: Total time to "
154  << "construct the geometry: " << timer << G4endl;
155 #endif //debug
156  G4VPhysicalVolume* volume = testBeamHCal96->PhysicalVolume(0);
157 
158  //Addsenistive detector types
159  //G4bool result;
160  G4int sensitive;
162  getSensitiveFlag("HadronCalorimeter");
163  if (sensitive>0) /*result =*/ CCalSensAssign::getInstance()->
164  addCaloSD("HadronCalorimeter", new CCalHcalOrganization);
166  getSensitiveFlag("CrystalMatrixModule");
167  if (sensitive>0) /*result =*/ CCalSensAssign::getInstance()->
168  addCaloSD("CrystalMatrix", new CCalEcalOrganization);
169 
170  //Assign the sensitive detectors
171  /*result =*/ CCalSensAssign::getInstance()->assign();
172 
173  //Create the stacking manager required by Calorimeter
175 
176  return volume;
177 
178 }