ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4Setup_EICDetector.C
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4Setup_EICDetector.C
1 #ifndef MACRO_G4SETUPEICDETECTOR_C
2 #define MACRO_G4SETUPEICDETECTOR_C
3 
4 #include <GlobalVariables.C>
5 
6 #include <G4_Aerogel.C>
7 #include <G4_Barrel_EIC.C>
8 #include <G4_Bbc.C>
9 #include <G4_BlackHole.C>
10 #include <G4_CEmc_EIC.C>
11 #include <G4_DIRC.C>
12 #include <G4_EEMC.C>
13 #include <G4_FEMC_EIC.C>
14 #include <G4_FHCAL.C>
15 #include <G4_FST_EIC.C>
16 #include <G4_GEM_EIC.C>
17 #include <G4_HcalIn_ref.C>
18 #include <G4_HcalOut_ref.C>
19 #include <G4_Input.C>
20 #include <G4_Magnet.C>
21 #include <G4_Mvtx_EIC.C>
22 #include <G4_Pipe_EIC.C>
23 #include <G4_PlugDoor_EIC.C>
24 #include <G4_RICH.C>
25 #include <G4_TPC_EIC.C>
26 #include <G4_Tracking_EIC.C>
27 #include <G4_User.C>
28 #include <G4_World.C>
29 #include <G4_hFarFwdBeamLine_EIC.C>
30 
32 
34 
35 #include <g4main/PHG4Reco.h>
37 
38 #include <phfield/PHFieldConfig.h>
39 
40 #include <g4decayer/EDecayType.hh>
41 
43 #include <fun4all/Fun4AllServer.h>
44 
45 R__LOAD_LIBRARY(libg4decayer.so)
46 R__LOAD_LIBRARY(libg4detectors.so)
47 
48 void G4Init()
49 {
50  // First some check for subsystems which do not go together
51 
53  {
54  cout << "FST setup cannot fit in the TPC" << endl;
55  gSystem->Exit(1);
56  }
57  else if (Enable::MVTX && Enable::BARREL)
58  {
59  cout << "MVTX and BARREL cannot be enabled together" << endl;
60  gSystem->Exit(1);
61  }
62  else if (Enable::TPC && Enable::BARREL && !G4BARREL::SETTING::BARRELV6) {
63  cout << "Barrel setup cannot fit in the TPC" << endl;
64  gSystem->Exit(1);
65  }
66 
67  if(Enable::FGEM_ORIG && Enable::FST)
68  {
69  cout << "FST cannot be enabled with 5 FGEM setup" << endl;
70  gSystem->Exit(1);
71  }
72 
73  if(Enable::FGEM_ORIG && Enable::FST)
74  {
75  cout << "FST cannot be enabled with 5 FGEM setup" << endl;
76  gSystem->Exit(1);
77  }
78 
79  // load detector/material macros and execute Init() function
80  if (Enable::PIPE) PipeInit();
83  if (Enable::EGEM) EGEM_Init();
84  if (Enable::FGEM || Enable::FGEM_ORIG) FGEM_Init();
85  if (Enable::FST) FST_Init();
87  if (Enable::MVTX) MvtxInit();
88  if (Enable::TPC) TPCInit();
90  if (Enable::BBC) BbcInit();
91  if (Enable::CEMC) CEmcInit(72); // make it 2*2*2*3*3 so we can try other combinations
94  MagnetFieldInit(); // We want the field - even if the magnet volume is disabled
96  if (Enable::FEMC) FEMCInit();
97  if (Enable::FHCAL) FHCALInit();
98  if (Enable::EEMC) EEMCInit();
99  if (Enable::DIRC) DIRCInit();
100  if (Enable::RICH) RICHInit();
102  if (Enable::USER) UserInit();
104 }
105 
106 int G4Setup()
107 {
108  //---------------
109  // Fun4All server
110  //---------------
111 
113 
114  PHG4Reco *g4Reco = new PHG4Reco();
115 
116  WorldInit(g4Reco);
117 
118  g4Reco->set_rapidity_coverage(1.1); // according to drawings
119  // uncomment to set QGSP_BERT_HP physics list for productions
120  // (default is QGSP_BERT for speed)
121  // g4Reco->SetPhysicsList("QGSP_BERT_HP");
122 
124  {
126  }
127 
128  double fieldstrength;
129  istringstream stringline(G4MAGNET::magfield);
130  stringline >> fieldstrength;
131  if (stringline.fail())
132  { // conversion to double fails -> we have a string
133 
134  if (G4MAGNET::magfield.find("sPHENIX.root") != string::npos)
135  {
137  }
138  else
139  {
141  }
142  }
143  else
144  {
145  g4Reco->set_field(fieldstrength); // use const soleniodal field
146  }
148 
149 // the radius is an older protection against overlaps, it is not
150 // clear how well this works nowadays but it doesn't hurt either
151  double radius = 0.;
152 
153  if (Enable::PIPE) radius = Pipe(g4Reco, radius);
157  if (Enable::EGEM) EGEMSetup(g4Reco);
158  if (Enable::FGEM || Enable::FGEM_ORIG) FGEMSetup(g4Reco);
159  if (Enable::FST) FSTSetup(g4Reco);
160  if (Enable::BARREL) Barrel(g4Reco, radius);
161  if (Enable::MVTX) radius = Mvtx(g4Reco, radius);
162  if (Enable::TPC) radius = TPC(g4Reco, radius);
163  if (Enable::BBC) Bbc(g4Reco);
164  if (Enable::CEMC) radius = CEmc(g4Reco, radius);
165  if (Enable::HCALIN) radius = HCalInner(g4Reco, radius, 4);
166  if (Enable::MAGNET) radius = Magnet(g4Reco, radius);
167  if (Enable::HCALOUT) radius = HCalOuter(g4Reco, radius, 4);
168  if (Enable::FEMC) FEMCSetup(g4Reco);
169  if (Enable::FHCAL) FHCALSetup(g4Reco);
170  if (Enable::EEMC) EEMCSetup(g4Reco);
171 
172  //----------------------------------------
173  // PID
174 
175  if (Enable::DIRC) DIRCSetup(g4Reco);
176  if (Enable::RICH) RICHSetup(g4Reco);
177  if (Enable::AEROGEL) AerogelSetup(g4Reco);
178 
179  //----------------------------------------
180  // sPHENIX forward flux return door
181  if (Enable::PLUGDOOR) PlugDoor(g4Reco);
182 
183  if (Enable::USER) UserDetector(g4Reco);
184 
185  //----------------------------------------
186  // BLACKHOLE if enabled, needs info from all previous sub detectors for dimensions
187  if (Enable::BLACKHOLE) BlackHole(g4Reco, radius);
188 
189  PHG4TruthSubsystem *truth = new PHG4TruthSubsystem();
190  g4Reco->registerSubsystem(truth);
191  // finally adjust the world size in case the default is too small
192  WorldSize(g4Reco, radius);
193 
194  se->registerSubsystem(g4Reco);
195  return 0;
196 }
197 
199 {
201 
202  PHG4DstCompressReco *compress = new PHG4DstCompressReco("PHG4DstCompressReco");
203  compress->AddHitContainer("G4HIT_PIPE");
204  compress->AddHitContainer("G4HIT_ZDC");
205  compress->AddHitContainer("G4HIT_RomanPots");
206  compress->AddHitContainer("G4HIT_B0detector");
207  compress->AddHitContainer("G4HIT_FIELDCAGE");
208  compress->AddHitContainer("G4HIT_CEMC_ELECTRONICS");
209  compress->AddHitContainer("G4HIT_CEMC");
210  compress->AddHitContainer("G4HIT_ABSORBER_CEMC");
211  compress->AddHitContainer("G4HIT_CEMC_SPT");
212  compress->AddHitContainer("G4HIT_ABSORBER_HCALIN");
213  compress->AddHitContainer("G4HIT_HCALIN");
214  compress->AddHitContainer("G4HIT_HCALIN_SPT");
215  compress->AddHitContainer("G4HIT_MAGNET");
216  compress->AddHitContainer("G4HIT_ABSORBER_HCALOUT");
217  compress->AddHitContainer("G4HIT_HCALOUT");
218  compress->AddHitContainer("G4HIT_BH_1");
219  compress->AddHitContainer("G4HIT_BH_FORWARD_PLUS");
220  compress->AddHitContainer("G4HIT_BH_FORWARD_NEG");
221  compress->AddCellContainer("G4CELL_CEMC");
222  compress->AddCellContainer("G4CELL_HCALIN");
223  compress->AddCellContainer("G4CELL_HCALOUT");
224  compress->AddTowerContainer("TOWER_SIM_CEMC");
225  compress->AddTowerContainer("TOWER_RAW_CEMC");
226  compress->AddTowerContainer("TOWER_CALIB_CEMC");
227  compress->AddTowerContainer("TOWER_SIM_HCALIN");
228  compress->AddTowerContainer("TOWER_RAW_HCALIN");
229  compress->AddTowerContainer("TOWER_CALIB_HCALIN");
230  compress->AddTowerContainer("TOWER_SIM_HCALOUT");
231  compress->AddTowerContainer("TOWER_RAW_HCALOUT");
232  compress->AddTowerContainer("TOWER_CALIB_HCALOUT");
233 
234  compress->AddHitContainer("G4HIT_FEMC");
235  compress->AddHitContainer("G4HIT_ABSORBER_FEMC");
236  compress->AddHitContainer("G4HIT_FHCAL");
237  compress->AddHitContainer("G4HIT_ABSORBER_FHCAL");
238  compress->AddCellContainer("G4CELL_FEMC");
239  compress->AddCellContainer("G4CELL_FHCAL");
240  compress->AddTowerContainer("TOWER_SIM_FEMC");
241  compress->AddTowerContainer("TOWER_RAW_FEMC");
242  compress->AddTowerContainer("TOWER_CALIB_FEMC");
243  compress->AddTowerContainer("TOWER_SIM_FHCAL");
244  compress->AddTowerContainer("TOWER_RAW_FHCAL");
245  compress->AddTowerContainer("TOWER_CALIB_FHCAL");
246 
247  compress->AddHitContainer("G4HIT_EEMC");
248  compress->AddHitContainer("G4HIT_ABSORBER_EEMC");
249  compress->AddCellContainer("G4CELL_EEMC");
250  compress->AddTowerContainer("TOWER_SIM_EEMC");
251  compress->AddTowerContainer("TOWER_RAW_EEMC");
252  compress->AddTowerContainer("TOWER_CALIB_EEMC");
253 
254  se->registerSubsystem(compress);
255 
256  return;
257 }
258 
260 {
261  if (out)
262  {
263  out->StripNode("G4HIT_PIPE");
264  out->StripNode("G4HIT_ZDC");
265  out->StripNode("G4HIT_RomanPots");
266  out->StripNode("G4HIT_B0detectors");
267  out->StripNode("G4HIT_SVTXSUPPORT");
268  out->StripNode("G4HIT_CEMC_ELECTRONICS");
269  out->StripNode("G4HIT_CEMC");
270  out->StripNode("G4HIT_ABSORBER_CEMC");
271  out->StripNode("G4HIT_CEMC_SPT");
272  out->StripNode("G4HIT_ABSORBER_HCALIN");
273  out->StripNode("G4HIT_HCALIN");
274  out->StripNode("G4HIT_HCALIN_SPT");
275  out->StripNode("G4HIT_MAGNET");
276  out->StripNode("G4HIT_ABSORBER_HCALOUT");
277  out->StripNode("G4HIT_HCALOUT");
278  out->StripNode("G4HIT_BH_1");
279  out->StripNode("G4HIT_BH_FORWARD_PLUS");
280  out->StripNode("G4HIT_BH_FORWARD_NEG");
281  out->StripNode("G4CELL_CEMC");
282  out->StripNode("G4CELL_HCALIN");
283  out->StripNode("G4CELL_HCALOUT");
284 
285  out->StripNode("G4HIT_FEMC");
286  out->StripNode("G4HIT_ABSORBER_FEMC");
287  out->StripNode("G4HIT_FHCAL");
288  out->StripNode("G4HIT_ABSORBER_FHCAL");
289  out->StripNode("G4CELL_FEMC");
290  out->StripNode("G4CELL_FHCAL");
291 
292  out->StripNode("G4HIT_EEMC");
293  out->StripNode("G4HIT_ABSORBER_EEMC");
294  out->StripNode("G4CELL_EEMC");
295  }
296 }
297 #endif