// CFTPathBuilder.cpp #include "CFTPathBuilder.h" #include "trflayer/Detector.h" #include "trffit/AddFitKalman.h" #include "trfcyl/AddFitCyl_Phi.h" #include "trfcyl/AddFitCyl_Phi_Phi.h" #include "trfcyl/AddFitCyl_Phi_Phi_Phi.h" #include "trfcyl/AddFitCyl_PhiZ.h" #include "trfcyl/AddFitCyl_PhiZ_PhiZ.h" #include "trfcyl/HitCylPhi.h" #include "trfcyl/HitCylPhiZ.h" #include "trffit/AddFitStarter.h" #include "trfcyl/PropCyl.h" #include "trffind/PathStop.h" #include "trfbase/ETrack.h" #include "trffind/CheckChiSquare.h" #include "trffind/FilterShares.h" using namespace trf; //********************************************************************** // Methods. //********************************************************************** // constructor // Here we build the path used for track finding. CFTPathBuilder::CFTPathBuilder(const Detector& cftdet, const ETrack& tre, double bfield, double ptmin, double nsigma_3phi) : _cftdet(cftdet) { // parameters double zmin = -1000.0; double zmax = -zmin; // Extract surface and error from starting track. SurfacePtr psrf0 = tre.get_surface(); const TrackError& err = tre.get_error(); // Define propagators. _props["cyl"] = new PropCyl(ObjDoublePtr(new ObjDouble(bfield))); const Propagator& propc = *_props["cyl"]; // Define fitters. _fits["kalman"] = new AddFitKalman; const AddFitter& fitk = *_fits["kalman"]; _fits["phi"] = new AddFitCyl_Phi; _fits["phi phi"] = new AddFitCyl_Phi_Phi(ObjDoublePtr(new ObjDouble(bfield)), fitk,ptmin); _fits["phi phi phi"] = new AddFitCyl_Phi_Phi_Phi(nsigma_3phi,fitk); _fits["phiz"] = new AddFitCyl_PhiZ(zmin,zmax); _fits["phiz phiz"] = new AddFitCyl_PhiZ_PhiZ(ObjDoublePtr(new ObjDouble(-bfield)), fitk,propc,psrf0,err,-1000,1000); { AddFitStarter* pstarter = new AddFitStarter(5); pstarter->register_default_fitter( _fits["kalman"] ); TrfObject::Type p = HitCylPhi::get_static_type(); TrfObject::Type z = HitCylPhiZ::get_static_type(); pstarter->register_fitter( _fits["phi"], p ); pstarter->register_fitter( _fits["phi phi"], p, p ); pstarter->register_fitter( _fits["phi phi"], p, p ); pstarter->register_fitter( _fits["phi phi phi"], p, p, p ); pstarter->register_fitter( _fits["phiz"], p, z ); pstarter->register_fitter( _fits["phiz"], p, p, z ); pstarter->register_fitter( _fits["phiz"], p, p, p, z ); pstarter->register_fitter( _fits["phiz"], p, p, p, p, z ); pstarter->register_fitter( _fits["phiz phiz"], p, z, z ); pstarter->register_fitter( _fits["phiz phiz"], z, p, z ); pstarter->register_fitter( _fits["phiz phiz"], p, z, z ); pstarter->register_fitter( _fits["phiz phiz"], p, z, p, z ); pstarter->register_fitter( _fits["phiz phiz"], p, p, p, z, z ); _fits["start"] = pstarter; } // define checkers _checkers["chi-square 6"] = new CheckChiSquare(10.0); _checkers["chi-square 7"] = new CheckChiSquare(15.0); _checkers["chi-square 8"] = new CheckChiSquare(18.0); _checkers["chi-square 9"] = new CheckChiSquare(20.0); _checkers["chi-square 10"] = new CheckChiSquare(22.0); _checkers["chi-square 11"] = new CheckChiSquare(24.0); _checkers["chi-square 12"] = new CheckChiSquare(26.0); _checkers["chi-square 13"] = new CheckChiSquare(28.0); _checkers["chi-square 14"] = new CheckChiSquare(30.0); _checkers["chi-square 15"] = new CheckChiSquare(32.0); _checkers["chi-square 16"] = new CheckChiSquare(34.0); // define filters _filters["share 5"] = new FilterShares(5); // define stops. _stops["empty1"] = new PathStop; PathStop* pstop_end = new PathStop; pstop_end->add_filter( _filters["share 5"] ); _stops["end"] = pstop_end; } //********************************************************************** // Add a child tree to a path node. void CFTPathBuilder::add_path_tree(MutablePathPtr ppath) const { // Fetch the layers const Layer& cftx1 = _cftdet.get_layer("CFTX1"); const Layer& cftx2 = _cftdet.get_layer("CFTX2"); const Layer& cftx3 = _cftdet.get_layer("CFTX3"); const Layer& cftx4 = _cftdet.get_layer("CFTX4"); const Layer& cftx5 = _cftdet.get_layer("CFTX5"); const Layer& cftx6 = _cftdet.get_layer("CFTX6"); const Layer& cftx7 = _cftdet.get_layer("CFTX7"); const Layer& cftx8 = _cftdet.get_layer("CFTX8"); const Layer& cftu1 = _cftdet.get_layer("CFTU1"); const Layer& cftu2 = _cftdet.get_layer("CFTU2"); const Layer& cftu3 = _cftdet.get_layer("CFTU3"); const Layer& cftu4 = _cftdet.get_layer("CFTU4"); const Layer& cftv1 = _cftdet.get_layer("CFTV1"); const Layer& cftv2 = _cftdet.get_layer("CFTV2"); const Layer& cftv3 = _cftdet.get_layer("CFTV3"); const Layer& cftv4 = _cftdet.get_layer("CFTV4"); // Fetch the propagators. const Propagator& propc = *_props.find("cyl")->second; // Fetch the fitters. const AddFitter& fits = *_fits.find("start")->second; const AddFitter& fitk = *_fits.find("kalman")->second; // CFTX8 ppath = ppath->add_child(cftx8, propc, fits); // CFTX7 ppath = ppath->add_child(cftx7, propc, fits); // CFTX6 ppath = ppath->add_child(cftx6, propc, fits); // CFTV4 ppath = ppath->add_child(cftv4, propc, fits); // CFTU4 ppath = ppath->add_child(cftu4, propc, fits); // CFTV3 ppath = ppath->add_child(cftv3, propc, fitk); ppath->add_checker( _checkers.find("chi-square 6")->second ); // CFTU3 ppath = ppath->add_child(cftu3, propc, fitk); ppath->add_checker( _checkers.find("chi-square 7")->second ); // CFTX5 ppath = ppath->add_child(cftx5, propc, fitk); ppath->add_checker( _checkers.find("chi-square 8")->second ); // CFTV2 ppath = ppath->add_child(cftv2, propc, fitk); ppath->add_checker( _checkers.find("chi-square 9")->second ); // CFTX4 ppath = ppath->add_child(cftx4, propc, fitk); ppath->add_checker( _checkers.find("chi-square 10")->second ); // CFTU2 ppath = ppath->add_child(cftu2, propc, fitk); ppath->add_checker( _checkers.find("chi-square 11")->second ); // CFTX3 ppath = ppath->add_child(cftx3, propc, fitk); ppath->add_checker( _checkers.find("chi-square 12")->second ); // CFTV1 ppath = ppath->add_child(cftv1, propc, fitk); ppath->add_checker( _checkers.find("chi-square 13")->second ); // CFTX2 ppath = ppath->add_child(cftx2, propc, fitk); ppath->add_checker( _checkers.find("chi-square 14")->second ); // CFTU1 ppath = ppath->add_child(cftu1, propc, fitk); ppath->add_checker( _checkers.find("chi-square 15")->second ); // CFTX1 ppath = ppath->add_child(cftx1, propc, fitk); ppath->add_checker( _checkers.find("chi-square 16")->second ); ppath->set_stop( _stops.find("end")->second ); } //********************************************************************** // destructor CFTPathBuilder::~CFTPathBuilder() { } //**********************************************************************