void Svtx_Reco(int verbosity = 0) { //--------------- // Load libraries //--------------- gSystem->Load("libfun4all.so"); gSystem->Load("libg4hough.so"); //--------------- // Fun4All server //--------------- Fun4AllServer *se = Fun4AllServer::instance(); //---------------------------------- // Digitize the cell energy into ADC //---------------------------------- PHG4SvtxDigitizer* digi = new PHG4SvtxDigitizer(); digi->Verbosity(0); for (int i=0;i<n_svx_layer;++i) { digi->set_adc_scale(i, 255, 1.0e-6); } for (int i=n_svx_layer;i<63;++i) { digi->set_adc_scale(i, 10000, 1.0e-1); } se->registerSubsystem( digi ); //------------------------------------- // Apply Live Area Inefficiency to Hits //------------------------------------- // defaults to 1.0 (fully active) PHG4SvtxDeadArea* deadarea = new PHG4SvtxDeadArea(); deadarea->Verbosity(verbosity); deadarea->set_hit_efficiency(0,0.998); deadarea->set_hit_efficiency(1,0.998); deadarea->set_hit_efficiency(2,0.998); se->registerSubsystem( deadarea ); //----------------------------- // Apply MIP thresholds to Hits //----------------------------- PHG4SvtxThresholds* thresholds = new PHG4SvtxThresholds(); thresholds->Verbosity(verbosity); thresholds->set_threshold(0,0.33); thresholds->set_threshold(1,0.33); thresholds->set_threshold(2,0.33); thresholds->set_use_thickness_mip(0, true); se->registerSubsystem( thresholds ); //------------- // Cluster Hits //------------- PHG4TPCClusterizer* clusterizer = new PHG4TPCClusterizer("PHG4SvtxClusterizer",4,1);; se->registerSubsystem( clusterizer ); //--------------------- // Track reconstruction //--------------------- PHG4HoughTransformTPC* hough = new PHG4HoughTransformTPC(63,56); hough->set_mag_field(1.4); hough->set_use_vertex(true); hough->setRemoveHits(true); hough->setRejectGhosts(true); hough->set_min_pT(0.2); hough->set_chi2_cut_full( 3.0 ); hough->set_chi2_cut_init( 3.0 ); hough->setBinScale(1.0); hough->setZBinScale(1.0); hough->Verbosity(0); double mat_scale = 1.0; hough->set_material(0, mat_scale*0.003); hough->set_material(1, mat_scale*0.003); hough->set_material(2, mat_scale*0.003); for (int i=3;i<63;++i) { hough->set_material(i, mat_scale*0.06/60.); } hough->setUseCellSize(false); for (int i=3;i<63;++i) { hough->setFitErrorScale(i, 1./sqrt(12.)); } for (int i=3;i<63;++i) { hough->setVoteErrorScale(i, 0.2); } se->registerSubsystem( hough ); //------------------ // Track Projections //------------------ PHG4SvtxTrackProjection* projection = new PHG4SvtxTrackProjection(); projection->Verbosity(verbosity); se->registerSubsystem( projection ); //---------------------- // Beam Spot Calculation //---------------------- PHG4SvtxBeamSpotReco* beamspot = new PHG4SvtxBeamSpotReco(); beamspot->Verbosity(verbosity); se->registerSubsystem( beamspot ); return; }
void Svtx_Reco(int verbosity = 0) { //--------------- // Load libraries //--------------- gSystem->Load("libfun4all.so"); gSystem->Load("libg4hough.so"); //--------------- // Fun4All server //--------------- Fun4AllServer* se = Fun4AllServer::instance(); //---------------------------------- // Digitize the cell energy into ADC //---------------------------------- PHG4SvtxDigitizer* digi = new PHG4SvtxDigitizer(); digi->Verbosity(0); for (int i = 0; i < n_maps_layer; ++i) { digi->set_adc_scale(i, 255, 0.4e-6); // reduced by a factor of 2.5 when going from maps thickess of 50 microns to 18 microns } if (n_intt_layer > 0) { // INTT // Load pre-defined deadmaps PHG4SvtxDeadMapLoader* deadMapINTT = new PHG4SvtxDeadMapLoader("SILICON_TRACKER"); for (int i = 0; i < n_intt_layer; i++) { string DeadMapConfigName = Form("LadderType%d_RndSeed%d/", laddertype[i], i); string DeadMapPath = string(getenv("CALIBRATIONROOT")) + string("/Tracking/INTT/DeadMap_4Percent/"); //4% of dead/masked area (2% sensor + 2% chip) as a typical FVTX Run14 production run. // string DeadMapPath = string(getenv("CALIBRATIONROOT")) + string("/Tracking/INTT/DeadMap_8Percent/"); // 8% dead/masked area (6% sensor + 2% chip) as threshold of operational DeadMapPath += DeadMapConfigName; deadMapINTT->deadMapPath(n_maps_layer + i, DeadMapPath); } // se->registerSubsystem(deadMapINTT); std::vector<double> userrange; // 3-bit ADC threshold relative to the mip_e at each layer. // these should be used for the INTT userrange.push_back(0.05); userrange.push_back(0.10); userrange.push_back(0.15); userrange.push_back(0.20); userrange.push_back(0.25); userrange.push_back(0.30); userrange.push_back(0.35); userrange.push_back(0.40); PHG4SiliconTrackerDigitizer* digiintt = new PHG4SiliconTrackerDigitizer(); digiintt->Verbosity(verbosity); for (int i = 0; i < n_intt_layer; i++) { digiintt->set_adc_scale(n_maps_layer + i, userrange); } se->registerSubsystem(digiintt); // digiintt->Verbosity(1); } // TPC layers use the Svtx digitizer digi->SetTPCMinLayer(n_maps_layer + n_intt_layer); double ENC = 670.0; // standard digi->SetENC(ENC); double ADC_threshold = 4.0*ENC; digi->SetADCThreshold(ADC_threshold); // 4 * ENC seems OK cout << " TPC digitizer: Setting ENC to " << ENC << " ADC threshold to " << ADC_threshold << " maps+INTT layers set to " << n_maps_layer + n_intt_layer << endl; se->registerSubsystem(digi); //------------------------------------- // Apply Live Area Inefficiency to Hits // This is obsolete, please use PHG4SvtxDeadMapLoader instead for pre-defined deadmap //------------------------------------- // defaults to 1.0 (fully active) // PHG4SvtxDeadArea* deadarea = new PHG4SvtxDeadArea(); // // for (int i = 0; i < n_maps_layer; i++) // { // deadarea->Verbosity(verbosity); // //deadarea->set_hit_efficiency(i,0.99); // deadarea->set_hit_efficiency(i, 1.0); // } // for (int i = n_maps_layer; i < n_maps_layer + n_intt_layer; i++) // { // //deadarea->set_hit_efficiency(i,0.99); // deadarea->set_hit_efficiency(i, 1.0); // } // se->registerSubsystem(deadarea); //----------------------------- // Apply MIP thresholds to Hits //----------------------------- PHG4SvtxThresholds* thresholds = new PHG4SvtxThresholds(); thresholds->Verbosity(verbosity); // maps for (int i = 0; i < n_maps_layer; i++) { // reduced by x2.5 when going from cylinder maps with 50 microns thickness to actual maps with 18 microns thickness // Note the non-use of set_using_thickness here, this is so that the shortest dimension of the cell sets the mip energy loss thresholds->set_threshold(i, 0.1); } // INTT for (int i = n_maps_layer; i < n_maps_layer + n_intt_layer; i++) { thresholds->set_threshold(i, 0.1); thresholds->set_use_thickness_mip(i, true); } se->registerSubsystem(thresholds); //------------- // Cluster Hits //------------- PHG4SvtxClusterizer* clusterizer = new PHG4SvtxClusterizer("PHG4SvtxClusterizer", 0, n_maps_layer + n_intt_layer - 1); clusterizer->Verbosity(verbosity); // Reduced by 2 relative to the cylinder cell maps macro. I found this necessary to get full efficiency // Many hits in the present simulation are single cell hits, so it is not clear why the cluster threshold should be higher than the cell threshold clusterizer->set_threshold(0.1); // fraction of a mip // no Z clustering for INTT type 1 layers (we DO want Z clustering for type 0 layers) // turning off phi clustering for type 0 layers is not necessary, there is only one strip per sensor in phi for (int i = n_maps_layer; i < n_maps_layer + n_intt_layer; i++) { if(laddertype[i-n_maps_layer] == 1) clusterizer->set_z_clustering(i, false); } se->registerSubsystem(clusterizer); PHG4TPCClusterizer* tpcclusterizer = new PHG4TPCClusterizer(); tpcclusterizer->Verbosity(0); tpcclusterizer->setRangeLayers(n_maps_layer + n_intt_layer, Max_si_layer); tpcclusterizer->setEnergyCut(15 /*adc*/); tpcclusterizer->setFitWindowSigmas(0.0150, 0.0160); // should be changed when TPC cluster resolution changes tpcclusterizer->setFitWindowMax(5 /*rphibins*/, 5 /*zbins*/); se->registerSubsystem(tpcclusterizer); // This should be true for everything except testing! const bool use_kalman_pat_rec = true; if (use_kalman_pat_rec) { //--------------------- // PHG4KalmanPatRec //--------------------- PHG4KalmanPatRec* kalman_pat_rec = new PHG4KalmanPatRec("PHG4KalmanPatRec", n_maps_layer, n_intt_layer, n_gas_layer); kalman_pat_rec->Verbosity(0); for(int i = 0;i<n_intt_layer;i++) { if(laddertype[i] == PHG4SiliconTrackerDefs::SEGMENTATION_Z) { // strip length is along phi kalman_pat_rec->set_max_search_win_theta_intt(i, 0.010); kalman_pat_rec->set_min_search_win_theta_intt(i, 0.00); kalman_pat_rec->set_max_search_win_phi_intt(i, 0.20); kalman_pat_rec->set_min_search_win_phi_intt(i, 0.20); } else { // strip length is along theta kalman_pat_rec->set_max_search_win_theta_intt(i, 0.200); kalman_pat_rec->set_min_search_win_theta_intt(i, 0.200); kalman_pat_rec->set_max_search_win_phi_intt(i, 0.0050); kalman_pat_rec->set_min_search_win_phi_intt(i, 0.000); } } se->registerSubsystem(kalman_pat_rec); } else { //--------------------- // Truth Pattern Recognition //--------------------- PHG4TruthPatRec* pat_rec = new PHG4TruthPatRec(); se->registerSubsystem(pat_rec); } //--------------------- // Kalman Filter //--------------------- PHG4TrackKalmanFitter* kalman = new PHG4TrackKalmanFitter(); kalman->Verbosity(0); if (use_primary_vertex) kalman->set_fit_primary_tracks(true); // include primary vertex in track fit if true se->registerSubsystem(kalman); //------------------ // Track Projections //------------------ PHG4GenFitTrackProjection* projection = new PHG4GenFitTrackProjection(); projection->Verbosity(verbosity); se->registerSubsystem(projection); /* //---------------------- // Beam Spot Calculation //---------------------- PHG4SvtxBeamSpotReco* beamspot = new PHG4SvtxBeamSpotReco(); beamspot->Verbosity(verbosity); se->registerSubsystem( beamspot ); */ return; }
void Svtx_Reco(int verbosity = 0) { // reconstructs the MIE Svtx v2 detector (7 layers) // requires Svtx setup and Svtx cell routines // prefers calorimeter reconstruction prior (once projections are working) //--------------- // Load libraries //--------------- gSystem->Load("libfun4all.so"); gSystem->Load("libg4hough.so"); //--------------- // Fun4All server //--------------- Fun4AllServer *se = Fun4AllServer::instance(); //---------------------------------- // Digitize the cell energy into ADC //---------------------------------- // defaults to 8-bit ADC with MIP at 0.25% dynamic range PHG4SvtxDigitizer* digi = new PHG4SvtxDigitizer(); digi->Verbosity(verbosity); digi->set_adc_scale(0, 255, 1.0e-6); // 1.0 keV / bit digi->set_adc_scale(1, 255, 1.0e-6); // 1.0 keV / bit digi->set_adc_scale(2, 255, 1.6e-6); // 1.6 keV / bit digi->set_adc_scale(3, 255, 1.6e-6); // 1.6 keV / bit digi->set_adc_scale(4, 255, 1.6e-6); // 1.6 keV / bit digi->set_adc_scale(5, 255, 1.6e-6); // 1.6 keV / bit digi->set_adc_scale(6, 255, 1.6e-6); // 1.6 keV / bit se->registerSubsystem( digi ); //------------------------------------- // Apply Live Area Inefficiency to Hits //------------------------------------- // defaults to 1.0 (fully active) PHG4SvtxDeadArea* deadarea = new PHG4SvtxDeadArea(); deadarea->Verbosity(verbosity); // deadarea->set_hit_efficiency(0,0.90); // deadarea->set_hit_efficiency(1,0.90); // deadarea->set_hit_efficiency(2,0.98); // deadarea->set_hit_efficiency(3,0.98); // deadarea->set_hit_efficiency(4,0.98); // deadarea->set_hit_efficiency(5,0.98); // deadarea->set_hit_efficiency(6,0.98); se->registerSubsystem( deadarea ); //----------------------------- // Apply MIP thresholds to Hits //----------------------------- PHG4SvtxThresholds* thresholds = new PHG4SvtxThresholds(); thresholds->Verbosity(verbosity); thresholds->set_threshold(0,0.33); thresholds->set_threshold(1,0.33); thresholds->set_threshold(2,0.33); thresholds->set_threshold(3,0.33); thresholds->set_threshold(4,0.33); thresholds->set_threshold(5,0.33); thresholds->set_threshold(6,0.33); thresholds->set_use_thickness_mip(0, true); se->registerSubsystem( thresholds ); //------------- // Cluster Hits //------------- // needs to have clusters hold hit ids not cell ids // will require changes to evaluation PHG4SvtxClusterizer* clusterizer = new PHG4SvtxClusterizer(); clusterizer->Verbosity(verbosity); clusterizer->set_threshold(0.33); clusterizer->set_z_clustering(2, false); clusterizer->set_z_clustering(3, false); clusterizer->set_z_clustering(4, false); clusterizer->set_z_clustering(5, false); clusterizer->set_z_clustering(6, false); // clusterizer->set_energy_weighting(2, true); // clusterizer->set_energy_weighting(3, true); // clusterizer->set_energy_weighting(4, true); // clusterizer->set_energy_weighting(5, true); // clusterizer->set_energy_weighting(6, true); se->registerSubsystem( clusterizer ); //--------------------- // Track reconstruction //--------------------- PHG4HoughTransform* hough = new PHG4HoughTransform(7,7); hough->Verbosity(verbosity); hough->set_mag_field(1.4); hough->set_material(0, 0.013); hough->set_material(1, 0.013); hough->set_material(2, 0.013); hough->set_material(3, 0.013); hough->set_material(4, 0.010); hough->set_material(5, 0.010); hough->set_material(6, 0.020); hough->setPtRescaleFactor(0.9972); hough->set_chi2_cut_init(3.0); hough->set_chi2_cut_full(3.0); hough->set_ca_chi2_cut(3.0); hough->setCutOnDCA(true); hough->setDCACut(0.1); hough->setDCAZCut(0.1); hough->setRejectGhosts(false); hough->setRemoveHits(false); se->registerSubsystem( hough ); //--------------------- // Ghost rejection //--------------------- // needs updates to merge split tracks when possible PHG4TrackGhostRejection* rejection = new PHG4TrackGhostRejection(7); rejection->Verbosity(verbosity); rejection->set_max_shared_hits(3); se->registerSubsystem( rejection ); //------------------------ // Final Track Refitting //------------------------ // PHG4TrackKalmanFitter *kalman = new PHG4TrackKalmanFitter // we need a module to redo the Kalman fit with G4 material and real mag field // to update the track container //------------------------ // Primary Track Refitting //------------------------ // PHG4TrackKalmanFitter *kalman = new PHG4TrackKalmanFitter // we need a module to redo the Kalman fit including the vertex position // and create a separate stream of output tracks //------------------ // Track Projections //------------------ PHG4SvtxTrackProjection* projection = new PHG4SvtxTrackProjection(); projection->Verbosity(verbosity); se->registerSubsystem( projection ); //---------------------- // Beam Spot Calculation //---------------------- PHG4SvtxBeamSpotReco* beamspot = new PHG4SvtxBeamSpotReco(); beamspot->Verbosity(verbosity); se->registerSubsystem( beamspot ); return; }