// HitXYPlane2_t.cpp // Test component HitXYPlane2. #include "HitXYPlane2.h" #include #include #include "trfbase/ETrack.h" #include #include #include "objstream/StdObjStream.hpp" #include "trfutil/TRFMath.h" #include "trfutil/trfstream.h" #include "objstream/ObjData.hpp" #ifndef DEFECT_NO_STDLIB_NAMESPACES using std::cout; using std::cerr; using std::endl; using std::string; using std::fabs; using std::ostringstream; using std::istringstream; #endif using namespace trf; // calculate hm from a track vector HitVector calc_hm(TrackVector vec) { double v_track = vec(SurfXYPlane::IV); double z_track = vec(SurfXYPlane::IZ); return HitVector( v_track, z_track ); } // calculate dhm from error matrix HitError calc_dhm(TrackError err) { double evv_track = err(SurfXYPlane::IV,SurfXYPlane::IV); double evz_track = err(SurfXYPlane::IV,SurfXYPlane::IZ); double ezz_track = err(SurfXYPlane::IZ,SurfXYPlane::IZ); return HitError( evv_track, evz_track, ezz_track); } // compare HitError and error matrix of the cluster bool hiteqsm(const HitError& lhs, const HitError& rhs) { if ( lhs.size() != rhs.size() || lhs.size()!=2 ) return false; return ( (lhs(0,0) == rhs(ClusXYPlane2::IV,ClusXYPlane2::IV)) && (lhs(0,1) == rhs(ClusXYPlane2::IV,ClusXYPlane2::IZ)) && (lhs(1,1) == rhs(ClusXYPlane2::IZ,ClusXYPlane2::IZ)) ); } // compare HitVector and vector of the cluster bool hiteqvec(const HitVector& lhs, const HitVector& rhs) { if ( lhs.size() != rhs.size() || lhs.size()!=2 ) return false; return ( (lhs(0) == rhs(ClusXYPlane2::IV)) && (lhs(1) == rhs(ClusXYPlane2::IZ)) ); } //********************************************************************** int main( ) { string component = "HitXYPlane2"; string ok_prefix = component + " (I): "; string error_prefix = component + " test (E): "; cout << ok_prefix << "-------- Testing component " + component + ". --------" << endl; // Make sure assert is enabled. bool assert_flag = false; assert ( ( assert_flag = true, assert_flag ) ); if ( ! assert_flag ) { cerr << "Assert is disabled" << endl; return 1; } //******************************************************************** cout << trf_format; cout << ok_prefix << "Test cluster constructors." << endl; enum { IV = ClusXYPlane2::IV, IZ = ClusXYPlane2::IZ }; McIdList mcids; mcids.push_back(1); mcids.push_back(2); double dist1 = 10.0; double phi1 = PI/3.; double v1 = 1.0; double z1 = 1.1; HitError dhm1(2); dhm1(ClusXYPlane2::IV,ClusXYPlane2::IV) = 0.02; dhm1(ClusXYPlane2::IV,ClusXYPlane2::IZ) = 0.01; dhm1(ClusXYPlane2::IZ,ClusXYPlane2::IZ) = 0.03; SurfXYPlane szp1(dist1,phi1); ClusXYPlane2& hcp1 = *new ClusXYPlane2(dist1,phi1,v1,z1,dhm1(ClusXYPlane2::IV,ClusXYPlane2::IV),dhm1(ClusXYPlane2::IZ,ClusXYPlane2::IZ),dhm1(ClusXYPlane2::IV,ClusXYPlane2::IZ)); ClusXYPlane2& hcp1a = *new ClusXYPlane2(dist1,phi1,v1,z1,dhm1(ClusXYPlane2::IV,ClusXYPlane2::IV),dhm1(ClusXYPlane2::IZ,ClusXYPlane2::IZ),dhm1(ClusXYPlane2::IV,ClusXYPlane2::IZ),mcids); assert(hcp1==hcp1a); assert(hcp1.get_v() == v1 ); assert(hcp1.get_dhm() == dhm1 ); assert(hcp1.get_hm() == HitVector(v1,z1) ); assert(hcp1.get_z() == z1 ); assert(hcp1.get_dv2() == 0.02 ); assert(hcp1.get_dz2() == 0.03 ); assert(hcp1.get_dvdz() == 0.01 ); assert(hcp1a.get_v() == v1 ); assert(hcp1a.get_z() == z1 ); assert(hcp1a.get_dv2() == 0.02 ); assert(hcp1a.get_dz2() == 0.03 ); assert(hcp1a.get_dvdz() == 0.01 ); assert(hcp1.get_mc_ids().size()==0); assert(hcp1a.get_mc_ids().size()==2); ClusterPtr phcp1 = &hcp1; cout << hcp1 << endl; ClusXYPlane2 hcp1c = hcp1; cout << hcp1c << endl; double dist2 = 20.0; double phi2 = PI/5.; double v2 = 2.0; double z2 = 2.2; HitVector hm2(2); hm2(ClusXYPlane2::IV) = v2; hm2(ClusXYPlane2::IZ) = z2; HitError dhm2(2); dhm2(ClusXYPlane2::IV,ClusXYPlane2::IV) = 0.022; dhm2(ClusXYPlane2::IV,ClusXYPlane2::IZ) = 0.012; dhm2(ClusXYPlane2::IZ,ClusXYPlane2::IZ) = 0.032; ClusXYPlane2& hcp2 = *new ClusXYPlane2(dist2,phi2,v2,z2,dhm2); ClusXYPlane2& hcp2a = *new ClusXYPlane2(dist2,phi2,v2,z2,dhm2); assert(hcp2==hcp2a); ClusterPtr phcp2 = &hcp2; assert(hcp2.get_v() == v2 ); assert(hcp2.get_z() == z2 ); assert(hcp2.get_dv2() == 0.022 ); assert(hcp2.get_dz2() == 0.032 ); assert(hcp2.get_dvdz() == 0.012 ); assert(hcp2a.get_v() == v2 ); assert(hcp2a.get_z() == z2 ); assert(hcp2a.get_dv2() == 0.022 ); assert(hcp2a.get_dz2() == 0.032 ); assert(hcp2a.get_dvdz() == 0.012 ); HitVector hm1(2); hm1(ClusXYPlane2::IV) = v1; hm1(ClusXYPlane2::IZ) = z1; ClusXYPlane2 hcp3(dist1,phi1,hm1,dhm1); ClusXYPlane2 hcp3a(dist1,phi1,hm1,dhm1,mcids); ClusXYPlane2 hcp3b(hcp3a); ClusXYPlane2 hcp3c(hcp3); assert(hcp3.get_v() == v1 ); assert(hcp3.get_z() == z1 ); assert(hcp3.get_dv2() == 0.02 ); assert(hcp3.get_dz2() == 0.03 ); assert(hcp3.get_dvdz() == 0.01 ); assert(hcp3a.get_v() == v1 ); assert(hcp3a.get_z() == z1 ); assert(hcp3a.get_dv2() == 0.02 ); assert(hcp3a.get_dz2() == 0.03 ); assert(hcp3a.get_dvdz() == 0.01 ); assert(hcp3b==hcp3a); assert(hcp3==hcp3c); assert(hcp3.get_mc_ids().size()==0); assert(hcp3a.get_mc_ids().size()==2); assert(hcp3c.get_mc_ids().size()==0); assert(hcp3b.get_mc_ids().size()==2); // test two diferent constructors assert( hcp3 == hcp1 ); //******************************************************************** cout << ok_prefix << "Test cluster type ID." << endl; cout << hcp1.get_type() << endl; cout << hcp2.get_type() << endl; assert( hcp1.get_type() != 0 ); assert( hcp1.get_type() == hcp2.get_type() ); //******************************************************************** cout << ok_prefix << "Test cluster accessors." << endl; cout << hcp1 << endl; cout << hcp1.get_surface() << endl; cout << hcp1.get_hm() << endl; cout << hcp1.get_dhm() << endl; assert( hcp1.get_surface() == szp1 ); assert( hcp1.get_hm() == hm1 ); assert( hcp1.get_dhm() == dhm1 ); //******************************************************************** cout << ok_prefix << "Generate a hit." << endl; TrackVector vec; TrackError err; HitDerivative der_expect(2); der_expect(0,0) = 1.; der_expect(1,1) = 1.; vec(SurfXYPlane::IV) = 1.1; vec(SurfXYPlane::IZ) = 40.0; err(SurfXYPlane::IV,SurfXYPlane::IV) = 0.04; err(SurfXYPlane::IV,SurfXYPlane::IZ) = 0.03; err(SurfXYPlane::IZ,SurfXYPlane::IZ) = 0.02; ETrack tre1(SurfacePtr(szp1.new_pure_surface()),vec,err); HitList tclus11 = phcp1->predict(tre1); assert( tclus11.size() == 1 ); Hit& pre11 = *tclus11.front(); double maxdiff = 1.e-12; cout << pre11.size() << endl; assert( pre11.size() == 2); cout << pre11.measured_vector() << endl; assert( ((const HitXYPlane2&)pre11).get_v() == pre11.predicted_vector()(IV) ); assert( ((const HitXYPlane2&)pre11).get_z() == pre11.predicted_vector()(IZ) ); assert( ((const HitXYPlane2&)pre11).get_dv2() == pre11.predicted_error()(IV,IV) ); assert( ((const HitXYPlane2&)pre11).get_dz2() == pre11.predicted_error()(IZ,IZ) ); assert( ((const HitXYPlane2&)pre11).get_dvdz() == pre11.predicted_error()(IZ,IV) ); assert( hiteqvec(pre11.measured_vector(), hm1) ); cout << pre11.measured_error() << endl; assert( hiteqsm(pre11.measured_error(), dhm1) ); cout << pre11.predicted_vector() << endl; assert( pre11.predicted_vector() == calc_hm(vec) ); cout << pre11.predicted_error() << endl; assert( pre11.predicted_error() == calc_dhm(err) ); cout << pre11.dhit_dtrack() << endl; assert( pre11.dhit_dtrack() == der_expect ); cout << pre11.difference_vector() << endl; assert( fabs(pre11.difference_vector()(0) - calc_hm(vec)(0) + hm1(0)) < maxdiff ); assert( fabs(pre11.difference_vector()(1) - calc_hm(vec)(1) + hm1(1)) < maxdiff ); //******************************************************************** cout << ok_prefix << "Generate hit for a different track." << endl; vec(SurfXYPlane::IV) = 1.2; ETrack tre2(SurfacePtr(szp1.new_pure_surface()),vec,err); HitList tclus12 = phcp1->predict(tre2); assert( tclus12.size() == 1 ); Hit& pre12 = *tclus12.front(); cout << pre12.size() << endl; assert( pre12.size() == 2); cout << pre12.measured_vector() << endl; assert( hiteqvec(pre12.measured_vector(), hm1) ); cout << pre12.measured_error() << endl; assert( hiteqsm(pre12.measured_error(), dhm1) ); cout << pre12.predicted_vector() << endl; assert( pre12.predicted_vector() == calc_hm(vec) ); cout << pre12.predicted_error() << endl; assert( pre12.predicted_error() == calc_dhm(err) ); cout << pre12.dhit_dtrack() << endl; assert( pre12.dhit_dtrack() == der_expect ); cout << pre12.difference_vector() << endl; assert( fabs(pre12.difference_vector()(0) - calc_hm(vec)(0) + hm1(0)) < maxdiff ); assert( fabs(pre12.difference_vector()(1) - calc_hm(vec)(1) + hm1(1)) < maxdiff ); // same cluster ==> same hit (even though track changes) assert( pre11 == pre11 ); assert( ! ( pre11 != pre11 ) ); assert( pre11 == pre12 ); //******************************************************************** cout << ok_prefix << "Generate hit for a different cluster." << endl; HitList tclus22 = phcp2->predict(tre2); assert( tclus22.size() == 1 ); Hit& pre22 = *tclus22.front(); cout << pre22.size() << endl; assert( pre22.size() == 2); cout << pre22.measured_vector() << endl; assert( hiteqvec(pre22.measured_vector(), hm2) ); cout << pre22.measured_error() << endl; assert( hiteqsm(pre22.measured_error(), dhm2) ); cout << pre22.predicted_vector() << endl; assert( pre22.predicted_vector() == calc_hm(vec) ); cout << pre22.predicted_error() << endl; assert( pre22.predicted_error() == calc_dhm(err) ); cout << pre22.dhit_dtrack() << endl; assert( pre22.dhit_dtrack() == der_expect ); cout << pre22.difference_vector() << endl; assert( fabs(pre22.difference_vector()(0) - calc_hm(vec)(0) + hm2(0)) < maxdiff ); assert( fabs(pre22.difference_vector()(1) - calc_hm(vec)(1) + hm2(1)) < maxdiff ); // different cluster ==> different hit assert( pre22 != pre11 ); assert( ! ( pre22 == pre11 ) ); assert( pre22 != pre12 ); //******************************************************************** cout << ok_prefix << "Update hit." << endl; cout << pre11 << endl; pre11.update(tre2); cout << pre11 << endl; assert( pre11.size() == 2); cout << pre11.measured_vector() << endl; assert( hiteqvec(pre11.measured_vector(), hm1) ); cout << pre11.measured_error() << endl; assert( hiteqsm(pre11.measured_error(), dhm1) ); cout << pre11.predicted_vector() << endl; assert( pre11.predicted_vector() == calc_hm(vec) ); cout << pre11.predicted_error() << endl; assert( pre11.predicted_error() == calc_dhm(err) ); cout << pre11.dhit_dtrack() << endl; assert( pre11.dhit_dtrack() == der_expect ); cout << pre11.difference_vector() << endl; assert( fabs(pre11.difference_vector()(0) - calc_hm(vec)(0) + hm1(0)) < maxdiff ); assert( fabs(pre11.difference_vector()(1) - calc_hm(vec)(1) + hm1(1)) < maxdiff ); //******************************************************************** cout << ok_prefix << "Check hit type and equality." << endl; cout << HitXYPlane2::get_static_type(); cout << pre11.get_type() << endl; cout << pre12.get_type() << endl; assert( pre11.get_type() != 0 ); assert( pre11.get_type() == HitXYPlane2::get_static_type() ); assert( pre11.get_type() == pre12.get_type() ); //******************************************************************** ObjTable::register_type(); cout << ok_prefix << "Write object data." << endl; McIdList mcids_h; mcids_h.push_back(2); mcids_h.push_back(4); mcids_h.push_back(8); { HitError err(2); err(ClusXYPlane2::IV,ClusXYPlane2::IV) = 0.01; err(ClusXYPlane2::IV,ClusXYPlane2::IZ) = 0.0001; err(ClusXYPlane2::IZ,ClusXYPlane2::IZ) = 0.02; ObjPtr pobj( new ClusXYPlane2(12.3, 1.5, 0.1,0.9,err, mcids_h) ); ostringstream mystream; StdObjStream objstream(mystream); objstream.write_object("obj1",pobj); cout << mystream.str() << endl; assert( ObjTable::has_object_name("obj1") ); string::size_type pos = 0; assert( (pos=mystream.str().find( "obj1 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "ClusXYPlane2 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "dist",pos)) != string::npos ); assert( (pos=mystream.str().find( "12.3 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "phi",pos)) != string::npos ); assert( (pos=mystream.str().find( "1.5 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "z",pos)) != string::npos ); assert( (pos=mystream.str().find( "0.9 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "v",pos)) != string::npos ); assert( (pos=mystream.str().find( "0.1 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "dvdz",pos)) != string::npos ); assert( (pos=mystream.str().find( "0.0001 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "dv2",pos)) != string::npos ); assert( (pos=mystream.str().find( "0.01 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "dz2",pos)) != string::npos ); assert( (pos=mystream.str().find( "0.02 ",pos)) != string::npos ); #ifdef ObjData_supports_lists assert( (pos=mystream.str().find( "mcids",pos)) != string::npos ); assert( (pos=mystream.str().find( "2 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "4 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "8 ",pos)) != string::npos ); #endif } //******************************************************************** cout << ok_prefix << "Read object data." << endl; { string istring = "[ obj2 ClusXYPlane2 dist=24.4 phi=2.8 v=0.1 z=0.9 dv2=1.3 dz2=0.3 dvdz=0.1"; #ifdef ObjData_supports_lists istring += " mcids=int( 2 4 8 )"; #endif istring += " ]"; cout << istring << endl; istringstream isstrm(istring); { StdObjStream obstr(isstrm); string name = obstr.read_object(); assert( name == "obj2" ); const ClusXYPlane2* pobj; ObjTable::get_object(name,pobj); assert( pobj != 0 ); cout << *pobj << endl; assert( pobj->get_type() == ClusXYPlane2::get_static_type() ); assert( ((const SurfXYPlane&)(pobj->get_surface())).get_parameter(SurfXYPlane::DISTNORM) == 24.4 ); assert( ((const SurfXYPlane&)(pobj->get_surface())).get_parameter(SurfXYPlane::NORMPHI) == 2.8 ); assert( pobj->get_hm()(ClusXYPlane2::IV) == 0.1 ); assert( pobj->get_hm()(ClusXYPlane2::IZ) == 0.9 ); assert( pobj->get_dhm()(ClusXYPlane2::IV,ClusXYPlane2::IV) == 1.3 ); assert( pobj->get_dhm()(ClusXYPlane2::IZ,ClusXYPlane2::IZ) == 0.3 ); assert( pobj->get_dhm()(ClusXYPlane2::IV,ClusXYPlane2::IZ) == 0.1 ); #ifdef ObjData_supports_lists assert( pobj->get_mc_ids() == mcids_h ); #endif } } //******************************************************************** cout << ok_prefix << "------------- All tests passed. -------------" << endl; return 0; //******************************************************************** }