Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:13:13

0001 #ifndef MACRO_FUN4ALLG4SPHENIX_C
0002 #define MACRO_FUN4ALLG4SPHENIX_C
0003 
0004 // c++ includes --
0005 #include <string>
0006 #include <iostream>
0007 #include <fstream>
0008 #include <math.h>
0009 #include <set>
0010 #include <map>
0011 
0012 using std::cout;
0013 using std::endl;
0014 using std::string;
0015 using std::to_string;
0016 using std::set;
0017 using std::istringstream;
0018 using std::max;
0019 using std::map;
0020 
0021 // root includes --
0022 #include <TSystem.h>
0023 #include <TROOT.h>
0024 
0025 #include <GlobalVariables.C>
0026 
0027 #include <DisplayOn.C>
0028 #include "G4Setup_sPHENIX.C"
0029 #include <G4_Bbc.C>
0030 #include <G4_CaloTrigger.C>
0031 #include <G4_Centrality.C>
0032 #include <G4_DSTReader.C>
0033 #include <G4_Global.C>
0034 #include <G4_HIJetReco.C>
0035 #include <G4_Input.C>
0036 #include <G4_Jets.C>
0037 #include <G4_KFParticle.C>
0038 #include <G4_ParticleFlow.C>
0039 #include <G4_Production.C>
0040 #include <G4_TopoClusterReco.C>
0041 
0042 #include <Trkr_RecoInit.C>
0043 #include <Trkr_Clustering.C>
0044 #include <Trkr_LaserClustering.C>
0045 #include <Trkr_Reco.C>
0046 #include <Trkr_Eval.C>
0047 #include <Trkr_QA.C>
0048 
0049 #include <Trkr_Diagnostics.C>
0050 #include <G4_User.C>
0051 #include <QA.C>
0052 
0053 #include <ffamodules/FlagHandler.h>
0054 #include <ffamodules/HeadReco.h>
0055 #include <ffamodules/SyncReco.h>
0056 #include <ffamodules/CDBInterface.h>
0057 
0058 #include <fun4all/Fun4AllDstOutputManager.h>
0059 #include <fun4all/Fun4AllOutputManager.h>
0060 #include <fun4all/Fun4AllServer.h>
0061 
0062 #include <phool/PHRandomSeed.h>
0063 #include <phool/recoConsts.h>
0064 
0065 R__LOAD_LIBRARY(libfun4all.so)
0066 R__LOAD_LIBRARY(libffamodules.so)
0067 
0068 // For HepMC Hijing
0069 // try inputFile = /sphenix/sim/sim01/sphnxpro/sHijing_HepMC/sHijing_0-12fm.dat
0070 
0071 int Fun4All_G4_sPHENIX(
0072     const int nEvents = 1,
0073     const int seed = 0,
0074     const string &outdir = ".",
0075     const string &tag = "0",
0076     const string &outputFile = "G4sPHENIX.root",
0077     const string &inputFile = "https://www.phenix.bnl.gov/WWW/publish/phnxbld/sPHENIX/files/sPHENIX_G4Hits_sHijing_9-11fm_00000_00010.root",
0078     const string &embed_input_file = "https://www.phenix.bnl.gov/WWW/publish/phnxbld/sPHENIX/files/sPHENIX_G4Hits_sHijing_9-11fm_00000_00010.root",
0079     const int skip = 0)
0080 {
0081   Fun4AllServer *se = Fun4AllServer::instance();
0082   se->Verbosity(1);
0083 
0084   //Opt to print all random seed used for debugging reproducibility. Comment out to reduce stdout prints.
0085   PHRandomSeed::Verbosity(1);
0086 
0087   // just if we set some flags somewhere in this macro
0088   recoConsts *rc = recoConsts::instance();
0089   // By default every random number generator uses
0090   // PHRandomSeed() which reads /dev/urandom to get its seed
0091   // if the RANDOMSEED flag is set its value is taken as seed
0092   // You can either set this to a random value using PHRandomSeed()
0093   // which will make all seeds identical (not sure what the point of
0094   // this would be:
0095   //  rc->set_IntFlag("RANDOMSEED",PHRandomSeed());
0096   // or set it to a fixed value so you can debug your code
0097   //  rc->set_IntFlag("RANDOMSEED", 12345);
0098 
0099   if(seed > 0) {
0100     rc->set_IntFlag("RANDOMSEED", seed);
0101   }
0102 
0103   //===============
0104   // Input options
0105   //===============
0106   // verbosity setting (applies to all input managers)
0107   Input::VERBOSITY = 0;
0108   // First enable the input generators
0109   // Either:
0110   // read previously generated g4-hits files, in this case it opens a DST and skips
0111   // the simulations step completely. The G4Setup macro is only loaded to get information
0112   // about the number of layers used for the cell reco code
0113   //  Input::READHITS = true;
0114   INPUTREADHITS::filename[0] = inputFile;
0115   // if you use a filelist
0116   // INPUTREADHITS::listfile[0] = inputFile;
0117   // Or:
0118   // Use particle generator
0119   // And
0120   // Further choose to embed newly simulated events to a previous simulation. Not compatible with `readhits = true`
0121   // In case embedding into a production output, please double check your G4Setup_sPHENIX.C and G4_*.C consistent with those in the production macro folder
0122   // E.g. /sphenix/sim//sim01/production/2016-07-21/single_particle/spacal2d/
0123   //  Input::EMBED = true;
0124   INPUTEMBED::filename[0] = embed_input_file;
0125   // if you use a filelist
0126   //INPUTEMBED::listfile[0] = embed_input_file;
0127 
0128   Input::SIMPLE = true;
0129   // Input::SIMPLE_NUMBER = 2; // if you need 2 of them
0130   // Input::SIMPLE_VERBOSITY = 1;
0131 
0132   // Enable this is emulating the nominal pp/pA/AA collision vertex distribution
0133   // Input::BEAM_CONFIGURATION = Input::AA_COLLISION; // Input::AA_COLLISION (default), Input::pA_COLLISION, Input::pp_COLLISION
0134 
0135   //  Input::PYTHIA6 = true;
0136 
0137   // Input::PYTHIA8 = true;
0138 
0139   //  Input::GUN = true;
0140   //  Input::GUN_NUMBER = 3; // if you need 3 of them
0141   // Input::GUN_VERBOSITY = 1;
0142 
0143   //D0 generator
0144   //Input::DZERO = false;
0145   //Input::DZERO_VERBOSITY = 0;
0146   //Lambda_c generator //Not ready yet
0147   //Input::LAMBDAC = false;
0148   //Input::LAMBDAC_VERBOSITY = 0;
0149   // Upsilon generator
0150   //Input::UPSILON = true;
0151   //Input::UPSILON_NUMBER = 3; // if you need 3 of them
0152   //Input::UPSILON_VERBOSITY = 0;
0153 
0154   //  Input::HEPMC = true;
0155   INPUTHEPMC::filename = inputFile;
0156 
0157   // Event pile up simulation with collision rate in Hz MB collisions.
0158   //Input::PILEUPRATE = 100e3;
0159 
0160   //-----------------
0161   // Initialize the selected Input/Event generation
0162   //-----------------
0163   // This creates the input generator(s)
0164   InputInit();
0165 
0166   //--------------
0167   // Set generator specific options
0168   //--------------
0169   // can only be set after InputInit() is called
0170 
0171   // Simple Input generator:
0172   // if you run more than one of these Input::SIMPLE_NUMBER > 1
0173   // add the settings for other with [1], next with [2]...
0174   if (Input::SIMPLE)
0175   {
0176     // particle id: https://pdg.lbl.gov/2020/reviews/rpp2020-rev-monte-carlo-numbering.pdf
0177     // photon id: 22
0178     INPUTGENERATOR::SimpleEventGenerator[0]->add_particles(22, 1);
0179     if (Input::HEPMC || Input::EMBED)
0180     {
0181       INPUTGENERATOR::SimpleEventGenerator[0]->set_reuse_existing_vertex(true);
0182       INPUTGENERATOR::SimpleEventGenerator[0]->set_existing_vertex_offset_vector(0.0, 0.0, 0.0);
0183     }
0184     else
0185     {
0186       INPUTGENERATOR::SimpleEventGenerator[0]->set_vertex_distribution_function(PHG4SimpleEventGenerator::Gaus,
0187                                                                                 PHG4SimpleEventGenerator::Gaus,
0188                                                                                 PHG4SimpleEventGenerator::Gaus);
0189       INPUTGENERATOR::SimpleEventGenerator[0]->set_vertex_distribution_mean(0., 0., 0.);
0190       INPUTGENERATOR::SimpleEventGenerator[0]->set_vertex_distribution_width(0.01, 0.01, 5.);
0191     }
0192     // generation in one sector
0193     INPUTGENERATOR::SimpleEventGenerator[0]->set_eta_range(0, 1.152);
0194     INPUTGENERATOR::SimpleEventGenerator[0]->set_phi_range(-M_PI/32.0 - 0.02, M_PI/32.0 + 0.02);
0195 
0196     // for testing use full range, all sectors
0197     // INPUTGENERATOR::SimpleEventGenerator[0]->set_eta_range(-1.152, 1.152);
0198     // INPUTGENERATOR::SimpleEventGenerator[0]->set_phi_range(-M_PI, M_PI);
0199 
0200     // Train
0201     // INPUTGENERATOR::SimpleEventGenerator[0]->set_pt_range(20, 21.);
0202 
0203     // Test
0204     INPUTGENERATOR::SimpleEventGenerator[0]->set_pt_range(1, 21.);
0205   }
0206   // Upsilons
0207   // if you run more than one of these Input::UPSILON_NUMBER > 1
0208   // add the settings for other with [1], next with [2]...
0209   if (Input::UPSILON)
0210   {
0211     INPUTGENERATOR::VectorMesonGenerator[0]->add_decay_particles("e", 0);
0212     INPUTGENERATOR::VectorMesonGenerator[0]->set_rapidity_range(-1, 1);
0213     INPUTGENERATOR::VectorMesonGenerator[0]->set_pt_range(0., 10.);
0214     // Y species - select only one, last one wins
0215     INPUTGENERATOR::VectorMesonGenerator[0]->set_upsilon_1s();
0216     if (Input::HEPMC || Input::EMBED)
0217     {
0218       INPUTGENERATOR::VectorMesonGenerator[0]->set_reuse_existing_vertex(true);
0219       INPUTGENERATOR::VectorMesonGenerator[0]->set_existing_vertex_offset_vector(0.0, 0.0, 0.0);
0220     }
0221   }
0222   // particle gun
0223   // if you run more than one of these Input::GUN_NUMBER > 1
0224   // add the settings for other with [1], next with [2]...
0225   if (Input::GUN)
0226   {
0227     INPUTGENERATOR::Gun[0]->AddParticle("pi-", 0, 1, 0);
0228     INPUTGENERATOR::Gun[0]->set_vtx(0, 0, 0);
0229   }
0230 
0231   // pythia6
0232   if (Input::PYTHIA6)
0233   {
0234     //! Nominal collision geometry is selected by Input::BEAM_CONFIGURATION
0235     Input::ApplysPHENIXBeamParameter(INPUTGENERATOR::Pythia6);
0236   }
0237   // pythia8
0238   if (Input::PYTHIA8)
0239   {
0240     //! Nominal collision geometry is selected by Input::BEAM_CONFIGURATION
0241     Input::ApplysPHENIXBeamParameter(INPUTGENERATOR::Pythia8);
0242   }
0243 
0244   //--------------
0245   // Set Input Manager specific options
0246   //--------------
0247   // can only be set after InputInit() is called
0248 
0249   if (Input::HEPMC)
0250   {
0251     //! Nominal collision geometry is selected by Input::BEAM_CONFIGURATION
0252     Input::ApplysPHENIXBeamParameter(INPUTMANAGER::HepMCInputManager);
0253 
0254     // optional overriding beam parameters
0255     //INPUTMANAGER::HepMCInputManager->set_vertex_distribution_width(100e-4, 100e-4, 8, 0);  //optional collision smear in space, time
0256     //    INPUTMANAGER::HepMCInputManager->set_vertex_distribution_mean(0,0,0,0);//optional collision central position shift in space, time
0257     // //optional choice of vertex distribution function in space, time
0258     //INPUTMANAGER::HepMCInputManager->set_vertex_distribution_function(PHHepMCGenHelper::Gaus, PHHepMCGenHelper::Gaus, PHHepMCGenHelper::Gaus, PHHepMCGenHelper::Gaus);
0259     //! embedding ID for the event
0260     //! positive ID is the embedded event of interest, e.g. jetty event from pythia
0261     //! negative IDs are backgrounds, .e.g out of time pile up collisions
0262     //! Usually, ID = 0 means the primary Au+Au collision background
0263     //INPUTMANAGER::HepMCInputManager->set_embedding_id(Input::EmbedID);
0264     if (Input::PILEUPRATE > 0)
0265     {
0266       // Copy vertex settings from foreground hepmc input
0267       INPUTMANAGER::HepMCPileupInputManager->CopyHelperSettings(INPUTMANAGER::HepMCInputManager);
0268       // and then modify the ones you want to be different
0269       // INPUTMANAGER::HepMCPileupInputManager->set_vertex_distribution_width(100e-4,100e-4,8,0);
0270     }
0271   }
0272   if (Input::PILEUPRATE > 0)
0273   {
0274     //! Nominal collision geometry is selected by Input::BEAM_CONFIGURATION
0275     Input::ApplysPHENIXBeamParameter(INPUTMANAGER::HepMCPileupInputManager);
0276   }
0277   // register all input generators with Fun4All
0278   InputRegister();
0279 
0280   if (! Input::READHITS)
0281   {
0282     rc->set_IntFlag("RUNNUMBER",1);
0283 
0284     SyncReco *sync = new SyncReco();
0285     se->registerSubsystem(sync);
0286 
0287     HeadReco *head = new HeadReco();
0288     se->registerSubsystem(head);
0289   }
0290 // Flag Handler is always needed to read flags from input (if used)
0291 // and update our rc flags with them. At the end it saves all flags
0292 // again on the DST in the Flags node under the RUN node
0293   FlagHandler *flag = new FlagHandler();
0294   se->registerSubsystem(flag);
0295 
0296   // set up production relatedstuff
0297   //   Enable::PRODUCTION = true;
0298 
0299   //======================
0300   // Write the DST
0301   //======================
0302 
0303   //Enable::DSTOUT = true;
0304   Enable::DSTOUT_COMPRESS = false;
0305   DstOut::OutputDir = outdir;
0306   DstOut::OutputFile = outputFile;
0307 
0308   //Option to convert DST to human command readable TTree for quick poke around the outputs
0309   //  Enable::DSTREADER = true;
0310 
0311   // turn the display on (default off)
0312    //Enable::DISPLAY = true;
0313 
0314   //======================
0315   // What to run
0316   //======================
0317 
0318   // QA, main switch
0319   Enable::QA = false;
0320 
0321   // Global options (enabled for all enables subsystems - if implemented)
0322   //  Enable::ABSORBER = true;
0323   //  Enable::OVERLAPCHECK = true;
0324   //  Enable::VERBOSITY = 1;
0325 
0326   // Enable::BBC = true;
0327   // Enable::BBC_SUPPORT = true; // save hist in bbc support structure
0328   // Enable::BBCRECO = Enable::BBC && true
0329   Enable::BBCFAKE = true;  // Smeared vtx and t0, use if you don't want real BBC in simulation
0330 
0331   Enable::PIPE = true;
0332   Enable::PIPE_ABSORBER = true;
0333 
0334   // central tracking
0335   Enable::MVTX = false;
0336   Enable::MVTX_CELL = Enable::MVTX && true;
0337   Enable::MVTX_CLUSTER = Enable::MVTX_CELL && true;
0338   Enable::MVTX_QA = Enable::MVTX_CLUSTER && Enable::QA && true;
0339 
0340   Enable::INTT = false;
0341 //  Enable::INTT_ABSORBER = true; // enables layerwise support structure readout
0342 //  Enable::INTT_SUPPORT = true; // enable global support structure readout
0343   Enable::INTT_CELL = Enable::INTT && true;
0344   Enable::INTT_CLUSTER = Enable::INTT_CELL && true;
0345   Enable::INTT_QA = Enable::INTT_CLUSTER && Enable::QA && true;
0346 
0347   Enable::TPC = false;
0348   Enable::TPC_ABSORBER = true;
0349   Enable::TPC_CELL = Enable::TPC && true;
0350   Enable::TPC_CLUSTER = Enable::TPC_CELL && true;
0351   Enable::TPC_QA = Enable::TPC_CLUSTER && Enable::QA && true;
0352 
0353   Enable::MICROMEGAS = false;
0354   Enable::MICROMEGAS_CELL = Enable::MICROMEGAS && true;
0355   Enable::MICROMEGAS_CLUSTER = Enable::MICROMEGAS_CELL && true;
0356   Enable::MICROMEGAS_QA = Enable::MICROMEGAS_CLUSTER && Enable::QA && true;
0357 
0358   Enable::TRACKING_TRACK = (Enable::MICROMEGAS_CLUSTER && Enable::TPC_CLUSTER && Enable::INTT_CLUSTER && Enable::MVTX_CLUSTER) && true;
0359   Enable::TRACKING_EVAL = Enable::TRACKING_TRACK && true;
0360   Enable::TRACKING_QA = Enable::TRACKING_TRACK && Enable::QA && true;
0361 
0362   //Additional tracking tools 
0363   //Enable::TRACKING_DIAGNOSTICS = Enable::TRACKING_TRACK && true;
0364   //G4TRACKING::filter_conversion_electrons = true;
0365 
0366 
0367   //  cemc electronics + thin layer of W-epoxy to get albedo from cemc
0368   //  into the tracking, cannot run together with CEMC
0369   //  Enable::CEMCALBEDO = true;
0370 
0371   Enable::CEMC = true;
0372   Enable::CEMC_ABSORBER = true;
0373   Enable::CEMC_CELL = Enable::CEMC && true;
0374   Enable::CEMC_TOWER = Enable::CEMC_CELL && true;
0375   Enable::CEMC_CLUSTER = Enable::CEMC_TOWER && true;
0376   Enable::CEMC_EVAL = Enable::CEMC_CLUSTER && true;
0377   Enable::CEMC_QA = Enable::CEMC_CLUSTER && Enable::QA && true;
0378 
0379   Enable::HCALIN = false;
0380   Enable::HCALIN_ABSORBER = true;
0381   Enable::HCALIN_CELL = Enable::HCALIN && true;
0382   Enable::HCALIN_TOWER = Enable::HCALIN_CELL && true;
0383   Enable::HCALIN_CLUSTER = Enable::HCALIN_TOWER && true;
0384   Enable::HCALIN_EVAL = Enable::HCALIN_CLUSTER && true;
0385   Enable::HCALIN_QA = Enable::HCALIN_CLUSTER && Enable::QA && true;
0386 
0387   Enable::MAGNET = true;
0388   Enable::MAGNET_ABSORBER = true;
0389 
0390   Enable::HCALOUT = false;
0391   Enable::HCALOUT_ABSORBER = true;
0392   Enable::HCALOUT_CELL = Enable::HCALOUT && true;
0393   Enable::HCALOUT_TOWER = Enable::HCALOUT_CELL && true;
0394   Enable::HCALOUT_CLUSTER = Enable::HCALOUT_TOWER && true;
0395   Enable::HCALOUT_EVAL = Enable::HCALOUT_CLUSTER && true;
0396   Enable::HCALOUT_QA = Enable::HCALOUT_CLUSTER && Enable::QA && true;
0397 
0398   Enable::EPD = false;
0399   Enable::EPD_TILE = Enable::EPD && true;
0400 
0401   Enable::BEAMLINE = true;
0402 //  Enable::BEAMLINE_ABSORBER = true;  // makes the beam line magnets sensitive volumes
0403 //  Enable::BEAMLINE_BLACKHOLE = true; // turns the beamline magnets into black holes
0404   Enable::ZDC = true;
0405 //  Enable::ZDC_ABSORBER = true;
0406 //  Enable::ZDC_SUPPORT = true;
0407   Enable::ZDC_TOWER = Enable::ZDC && true;
0408   Enable::ZDC_EVAL = Enable::ZDC_TOWER && true;
0409 
0410   //! forward flux return plug door. Out of acceptance and off by default.
0411   //Enable::PLUGDOOR = true;
0412   Enable::PLUGDOOR_ABSORBER = true;
0413 
0414   Enable::GLOBAL_RECO = (Enable::BBCFAKE || Enable::TRACKING_TRACK) && true;
0415   //Enable::GLOBAL_FASTSIM = true;
0416 
0417   //Enable::KFPARTICLE = true;
0418   //Enable::KFPARTICLE_VERBOSITY = 1;
0419   //Enable::KFPARTICLE_TRUTH_MATCH = true;
0420   //Enable::KFPARTICLE_SAVE_NTUPLE = true;
0421 
0422   Enable::CALOTRIGGER = Enable::CEMC_TOWER && Enable::HCALIN_TOWER && Enable::HCALOUT_TOWER && false;
0423 
0424   Enable::JETS = (Enable::GLOBAL_RECO || Enable::GLOBAL_FASTSIM) && false;
0425   Enable::JETS_EVAL = Enable::JETS && true;
0426   Enable::JETS_QA = Enable::JETS && Enable::QA && true;
0427 
0428   // HI Jet Reco for p+Au / Au+Au collisions (default is false for
0429   // single particle / p+p-only simulations, or for p+Au / Au+Au
0430   // simulations which don't particularly care about jets)
0431   Enable::HIJETS = Enable::JETS && Enable::CEMC_TOWER && Enable::HCALIN_TOWER && Enable::HCALOUT_TOWER && false;
0432 
0433   // 3-D topoCluster reconstruction, potentially in all calorimeter layers
0434   Enable::TOPOCLUSTER = Enable::CEMC_TOWER && Enable::HCALIN_TOWER && Enable::HCALOUT_TOWER && false;
0435   // particle flow jet reconstruction - needs topoClusters!
0436   Enable::PARTICLEFLOW = Enable::TOPOCLUSTER && true;
0437   // centrality reconstruction
0438   Enable::CENTRALITY = false;
0439 
0440   // new settings using Enable namespace in GlobalVariables.C
0441   Enable::BLACKHOLE = false;
0442   //Enable::BLACKHOLE_SAVEHITS = false; // turn off saving of bh hits
0443   //Enable::BLACKHOLE_FORWARD_SAVEHITS = false; // disable forward/backward hits
0444   //BlackHoleGeometry::visible = true;
0445 
0446   // run user provided code (from local G4_User.C)
0447   //Enable::USER = true;
0448 
0449   //===============
0450   // conditions DB flags
0451   //===============
0452   Enable::CDB = true;
0453   // global tag
0454   rc->set_StringFlag("CDB_GLOBALTAG",CDB::global_tag);
0455   // 64 bit timestamp
0456   rc->set_uint64Flag("TIMESTAMP",CDB::timestamp);
0457   //---------------
0458   // World Settings
0459   //---------------
0460   //  G4WORLD::PhysicsList = "FTFP_BERT"; //FTFP_BERT_HP best for calo
0461   //  G4WORLD::WorldMaterial = "G4_AIR"; // set to G4_GALACTIC for material scans
0462 
0463   //---------------
0464   // Magnet Settings
0465   //---------------
0466 
0467   //  G4MAGNET::magfield =  string(getenv("CALIBRATIONROOT"))+ string("/Field/Map/sphenix3dbigmapxyz.root");  // default map from the calibration database
0468   //  G4MAGNET::magfield = "1.5"; // alternatively to specify a constant magnetic field, give a float number, which will be translated to solenoidal field in T, if string use as fieldmap name (including path)
0469 //  G4MAGNET::magfield_rescale = 1.;  // make consistent with expected Babar field strength of 1.4T
0470 
0471   //---------------
0472   // Pythia Decayer
0473   //---------------
0474   // list of decay types in
0475   // $OFFLINE_MAIN/include/g4decayer/EDecayType.hh
0476   // default is All:
0477   // G4P6DECAYER::decayType = EDecayType::kAll;
0478 
0479   // Initialize the selected subsystems
0480   G4Init();
0481 
0482   //---------------------
0483   // GEANT4 Detector description
0484   //---------------------
0485   if (!Input::READHITS)
0486   {
0487     G4Setup();
0488   }
0489 
0490   //------------------
0491   // Detector Division
0492   //------------------
0493 
0494   if ((Enable::BBC && Enable::BBCRECO) || Enable::BBCFAKE) Bbc_Reco();
0495 
0496   if (Enable::MVTX_CELL) Mvtx_Cells();
0497   if (Enable::INTT_CELL) Intt_Cells();
0498   if (Enable::TPC_CELL) TPC_Cells();
0499   if (Enable::MICROMEGAS_CELL) Micromegas_Cells();
0500 
0501   if (Enable::CEMC_CELL) CEMC_Cells();
0502 
0503   if (Enable::HCALIN_CELL) HCALInner_Cells();
0504 
0505   if (Enable::HCALOUT_CELL) HCALOuter_Cells();
0506 
0507   //-----------------------------
0508   // CEMC towering and clustering
0509   //-----------------------------
0510 
0511   if (Enable::CEMC_TOWER) CEMC_Towers();
0512   if (Enable::CEMC_CLUSTER) CEMC_Clusters();
0513 
0514   //--------------
0515   // EPD tile reconstruction
0516   //--------------
0517 
0518   if (Enable::EPD_TILE) EPD_Tiles();
0519 
0520   //-----------------------------
0521   // HCAL towering and clustering
0522   //-----------------------------
0523 
0524   if (Enable::HCALIN_TOWER) HCALInner_Towers();
0525   if (Enable::HCALIN_CLUSTER) HCALInner_Clusters();
0526 
0527   if (Enable::HCALOUT_TOWER) HCALOuter_Towers();
0528   if (Enable::HCALOUT_CLUSTER) HCALOuter_Clusters();
0529 
0530   // if enabled, do topoClustering early, upstream of any possible jet reconstruction
0531   if (Enable::TOPOCLUSTER) TopoClusterReco();
0532 
0533   //--------------
0534   // SVTX tracking
0535   //--------------
0536   if(Enable::TRACKING_TRACK)
0537     {
0538       TrackingInit();
0539     }
0540   if (Enable::MVTX_CLUSTER) Mvtx_Clustering();
0541   if (Enable::INTT_CLUSTER) Intt_Clustering();
0542   if (Enable::TPC_CLUSTER)
0543     {
0544       if(G4TPC::ENABLE_DIRECT_LASER_HITS || G4TPC::ENABLE_CENTRAL_MEMBRANE_HITS)
0545     {
0546       TPC_LaserClustering();
0547     }
0548       else
0549     {
0550       TPC_Clustering();
0551     }
0552     }
0553   if (Enable::MICROMEGAS_CLUSTER) Micromegas_Clustering();
0554 
0555   if (Enable::TRACKING_TRACK)
0556   {
0557     Tracking_Reco();
0558   }
0559 
0560   if(Enable::TRACKING_DIAGNOSTICS)
0561     {
0562       const std::string kshortFile = "./kshort_" + outputFile;
0563       const std::string residualsFile = "./residuals_" + outputFile;
0564  
0565       G4KshortReconstruction(kshortFile);
0566       seedResiduals(residualsFile);
0567     }
0568 
0569   //-----------------
0570   // Global Vertexing
0571   //-----------------
0572 
0573   if (Enable::GLOBAL_RECO && Enable::GLOBAL_FASTSIM)
0574   {
0575     cout << "You can only enable Enable::GLOBAL_RECO or Enable::GLOBAL_FASTSIM, not both" << endl;
0576     gSystem->Exit(1);
0577   }
0578   if (Enable::GLOBAL_RECO)
0579   {
0580     Global_Reco();
0581   }
0582   else if (Enable::GLOBAL_FASTSIM)
0583   {
0584     Global_FastSim();
0585   }
0586 
0587   //-----------------
0588   // Centrality Determination
0589   //-----------------
0590 
0591   if (Enable::CENTRALITY)
0592   {
0593       Centrality();
0594   }
0595 
0596   //-----------------
0597   // Calo Trigger Simulation
0598   //-----------------
0599 
0600   if (Enable::CALOTRIGGER)
0601   {
0602     CaloTrigger_Sim();
0603   }
0604 
0605   //---------
0606   // Jet reco
0607   //---------
0608 
0609   if (Enable::JETS) Jet_Reco();
0610   if (Enable::HIJETS) HIJetReco();
0611 
0612   if (Enable::PARTICLEFLOW) ParticleFlow();
0613 
0614   //----------------------
0615   // Simulation evaluation
0616   //----------------------
0617   string outputroot = outdir + "/" + outputFile;
0618   string remove_this = ".root";
0619   size_t pos = outputroot.find(remove_this);
0620   if (pos != string::npos)
0621   {
0622     outputroot.erase(pos, remove_this.length());
0623   }
0624 
0625   if (Enable::TRACKING_EVAL) Tracking_Eval(outputroot + "_g4svtx_eval.root");
0626 
0627   if (Enable::CEMC_EVAL) CEMC_Eval(outputroot + "_g4cemc_eval-" + tag + ".root");
0628 
0629   if (Enable::HCALIN_EVAL) HCALInner_Eval(outputroot + "_g4hcalin_eval.root");
0630 
0631   if (Enable::HCALOUT_EVAL) HCALOuter_Eval(outputroot + "_g4hcalout_eval.root");
0632 
0633   if (Enable::JETS_EVAL) Jet_Eval(outputroot + "_g4jet_eval.root");
0634 
0635   if (Enable::DSTREADER) G4DSTreader(outputroot + "_DSTReader.root");
0636 
0637   if (Enable::USER) UserAnalysisInit();
0638 
0639   // Writes electrons from conversions to a new track map on the node tree
0640   // the ntuple file is for diagnostics, it is produced only if the flag is set in G4_Tracking.C
0641   if(G4TRACKING::filter_conversion_electrons) Filter_Conversion_Electrons(outputroot + "_secvert_ntuple.root");
0642 
0643   //======================
0644   // Run KFParticle on evt
0645   //======================
0646   if (Enable::KFPARTICLE && Input::UPSILON) KFParticle_Upsilon_Reco();
0647   if (Enable::KFPARTICLE && Input::DZERO) KFParticle_D0_Reco();
0648 
0649   //----------------------
0650   // Standard QAs
0651   //----------------------
0652 
0653   if (Enable::CEMC_QA) CEMC_QA();
0654   if (Enable::HCALIN_QA) HCALInner_QA();
0655   if (Enable::HCALOUT_QA) HCALOuter_QA();
0656 
0657   if (Enable::JETS_QA) Jet_QA();
0658 
0659   if (Enable::MVTX_QA) Mvtx_QA();
0660   if (Enable::INTT_QA) Intt_QA();
0661   if (Enable::TPC_QA) TPC_QA();
0662   if (Enable::MICROMEGAS_QA) Micromegas_QA();
0663   if (Enable::TRACKING_QA) Tracking_QA();
0664 
0665   if (Enable::TRACKING_QA && Enable::CEMC_QA && Enable::HCALIN_QA && Enable::HCALOUT_QA) QA_G4CaloTracking();
0666 
0667   //--------------
0668   // Set up Input Managers
0669   //--------------
0670 
0671   InputManagers();
0672 
0673   if (Enable::PRODUCTION)
0674   {
0675     Production_CreateOutputDir();
0676   }
0677 
0678   if (Enable::DSTOUT)
0679   {
0680     string FullOutFile = DstOut::OutputDir + "/" + DstOut::OutputFile;
0681     Fun4AllDstOutputManager *out = new Fun4AllDstOutputManager("DSTOUT", FullOutFile);
0682     if (Enable::DSTOUT_COMPRESS)
0683     {
0684       ShowerCompress();
0685       DstCompress(out);
0686     }
0687     se->registerOutputManager(out);
0688   }
0689   //-----------------
0690   // Event processing
0691   //-----------------
0692   if (Enable::DISPLAY)
0693   {
0694     DisplayOn();
0695 
0696     gROOT->ProcessLine("Fun4AllServer *se = Fun4AllServer::instance();");
0697     gROOT->ProcessLine("PHG4Reco *g4 = (PHG4Reco *) se->getSubsysReco(\"PHG4RECO\");");
0698 
0699     cout << "-------------------------------------------------" << endl;
0700     cout << "You are in event display mode. Run one event with" << endl;
0701     cout << "se->run(1)" << endl;
0702     cout << "Run Geant4 command with following examples" << endl;
0703     gROOT->ProcessLine("displaycmd()");
0704 
0705     return 0;
0706   }
0707 
0708   // if we use a negative number of events we go back to the command line here
0709   if (nEvents < 0)
0710   {
0711     return 0;
0712   }
0713   // if we run the particle generator and use 0 it'll run forever
0714   // for embedding it runs forever if the repeat flag is set
0715   if (nEvents == 0 && !Input::HEPMC && !Input::READHITS && INPUTEMBED::REPEAT)
0716   {
0717     cout << "using 0 for number of events is a bad idea when using particle generators" << endl;
0718     cout << "it will run forever, so I just return without running anything" << endl;
0719     return 0;
0720   }
0721 
0722   se->skip(skip);
0723   se->run(nEvents);
0724 
0725   //-----
0726   // QA output
0727   //-----
0728 
0729   if (Enable::QA) QA_Output(outputroot + "_qa.root");
0730 
0731   //-----
0732   // Exit
0733   //-----
0734 
0735 //  CDBInterface::instance()->Print(); // print used DB files
0736   se->End();
0737   std::cout << "All done" << std::endl;
0738   delete se;
0739   if (Enable::PRODUCTION)
0740   {
0741     Production_MoveOutput();
0742   }
0743 
0744   gSystem->Exit(0);
0745   return 0;
0746 }
0747 
0748 # ifndef __CINT__
0749 int main(int argc, char* argv[]) {
0750     if(argc < 1 || argc > 9){
0751         cout << "usage: ./bin/Fun4All_G4_sPHENIX nEvents seed outdir tag outputFile inputFile embed_input_file skip" << endl;
0752         cout << "nEvents: Number of events to generate. Default: 1." << endl;
0753         cout << "seed: random seed to use for reproducibility. Default: 0" << endl;
0754         cout << "outdir: Location of output directory. Default: ." << endl;
0755         cout << "tag: Give a tag to the outputfile. Default: 0" << endl;
0756         cout << "inputfile: Default: https://www.phenix.bnl.gov/WWW/publish/phnxbld/sPHENIX/files/sPHENIX_G4Hits_sHijing_9-11fm_00000_00010.root" << endl;
0757         cout << "embed_input_file: Default: https://www.phenix.bnl.gov/WWW/publish/phnxbld/sPHENIX/files/sPHENIX_G4Hits_sHijing_9-11fm_00000_00010.root" << endl;
0758         cout << "skip: Number of events to skip. Default 0." << endl;
0759         return 1;
0760     }
0761 
0762      int nEvents = 1;
0763      int seed = 0;
0764      string outdir = ".";
0765      string tag = "0";
0766      string outputFile = "G4sPHENIX.root";
0767      string inputFile = "https://www.phenix.bnl.gov/WWW/publish/phnxbld/sPHENIX/files/sPHENIX_G4Hits_sHijing_9-11fm_00000_00010.root";
0768      string embed_input_file = "https://www.phenix.bnl.gov/WWW/publish/phnxbld/sPHENIX/files/sPHENIX_G4Hits_sHijing_9-11fm_00000_00010.root";
0769      int skip = 0;
0770 
0771     if(argc >= 2) {
0772         nEvents = atoi(argv[1]);
0773     }
0774     if(argc >= 3) {
0775         seed = atoi(argv[2]);
0776     }
0777     if(argc >= 4) {
0778         outdir = argv[3];
0779     }
0780     if(argc >= 5) {
0781         tag = argv[4];
0782     }
0783     if(argc >= 6) {
0784         outputFile = argv[5];
0785     }
0786     if(argc >= 7) {
0787         inputFile = argv[6];
0788     }
0789     if(argc >= 8) {
0790         embed_input_file = argv[7];
0791     }
0792     if(argc >= 9) {
0793         skip = atoi(argv[8]);
0794     }
0795 
0796     Fun4All_G4_sPHENIX(nEvents, seed, outdir, tag, outputFile, inputFile, embed_input_file, skip);
0797 
0798     cout << "done" << endl;
0799     return 0;
0800 }
0801 # endif
0802 
0803 #endif