// HitZPlane1_t.cc // Test component HitZPlane1. #include "HitZPlane1.h" #include #include #include #include "objstream/StdObjStream.hpp" #include "objstream/ObjData.hpp" #include "trfbase/ETrack.h" #include "trfutil/TRFMath.h" #include "trfutil/trfstream.h" #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; double wx = 0.001; double wy = 0.345; // calculate axy from a track vector double calc_axy(TrackVector vec) { double x_track = vec(SurfZPlane::IX); double y_track = vec(SurfZPlane::IY); return( wx*x_track + wy*y_track ); } // calculate eaxy from error matrix double calc_eaxy(TrackError err) { double exx_track = err(SurfZPlane::IX,SurfZPlane::IX); double exy_track = err(SurfZPlane::IX,SurfZPlane::IY); double eyy_track = err(SurfZPlane::IY,SurfZPlane::IY); return( exx_track*wx*wx + 2.*exy_track*wx*wy + eyy_track*wy*wy ); } //********************************************************************** int main( ) { string component = "HitZPlane1"; 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; McIdList mcids; mcids.push_back(1); mcids.push_back(2); double zpos1 = 10.0; double axy1 = 1.0; double daxy1 = 0.01; SurfZPlane szp1(zpos1); ClusZPlane1& hcp1 = *new ClusZPlane1(zpos1,wx,wy,axy1,daxy1); ClusZPlane1& hcp1a = *new ClusZPlane1(zpos1,wx,wy,axy1,daxy1,mcids); ClusZPlane1 hcp1b(hcp1a); ClusZPlane1 hcp1d(hcp1); assert(hcp1==hcp1a); assert(hcp1b==hcp1a); assert(hcp1==hcp1d); assert(hcp1.get_mc_ids().size() == 0 ); assert(hcp1d.get_mc_ids().size() == 0 ); assert(hcp1a.get_mc_ids().size() == 2 ); assert(hcp1b.get_mc_ids().size() == 2 ); ClusterPtr phcp1(&hcp1); cout << hcp1 << endl; ClusZPlane1 hcp1c = hcp1; cout << hcp1c << endl; double zpos2 = 20.0; double axy2 = 2.0; double daxy2 = 0.02; ClusZPlane1& hcp2 = *new ClusZPlane1(zpos2,wx,wy,axy2,daxy2); ClusterPtr phcp2 = &hcp2; //******************************************************************** 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_axy() << endl; cout << hcp1.get_daxy() << endl; cout << hcp1.get_wx() << endl; cout << hcp1.get_wy() << endl; assert( hcp1.get_surface() == szp1 ); assert( hcp1.get_axy() == axy1 ); assert( hcp1.get_daxy() == daxy1 ); assert( hcp1.get_wx() == wx ); assert( hcp1.get_wy() == wy ); //******************************************************************** cout << ok_prefix << "Generate a hit." << endl; TrackVector vec; TrackError err; HitDerivative der_expect(1); der_expect(0,0) = wx; der_expect(0,1) = wy; vec(SurfZPlane::IX) = 1.1; vec(SurfZPlane::IY) = 40.0; err(SurfZPlane::IX,SurfZPlane::IX) = 0.04; err(SurfZPlane::IX,SurfZPlane::IY) = 0.03; err(SurfZPlane::IY,SurfZPlane::IY) = 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() == 1); cout << pre11.measured_vector() << endl; assert( pre11.measured_vector()(0) == axy1 ); cout << pre11.measured_error() << endl; assert( is_equal( pre11.measured_error()(0,0), daxy1*daxy1 ) ); cout << pre11.predicted_vector() << endl; assert( is_equal( pre11.predicted_vector()(0), calc_axy(vec) ) ); cout << pre11.predicted_error() << endl; assert( is_equal( pre11.predicted_error()(0,0), calc_eaxy(err) ) ); cout << pre11.dhit_dtrack() << endl; assert( is_equal( pre11.dhit_dtrack(), der_expect ) ); cout << pre11.difference_vector() << endl; assert( fabs(pre11.difference_vector()(0) - calc_axy(vec) + axy1) < maxdiff ); //******************************************************************** cout << ok_prefix << "Generate hit for a different track." << endl; vec(SurfZPlane::IX) = 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() == 1); cout << pre12.measured_vector() << endl; assert( is_equal( pre12.measured_vector()(0), axy1 ) ); cout << pre12.measured_error() << endl; assert( is_equal( pre12.measured_error()(0,0), daxy1*daxy1 ) ); cout << pre12.predicted_vector() << endl; assert( is_equal( pre12.predicted_vector()(0), calc_axy(vec) ) ); cout << pre12.predicted_error() << endl; assert( is_equal( pre12.predicted_error()(0,0), calc_eaxy(err) ) ); cout << pre12.dhit_dtrack() << endl; assert( is_equal( pre12.dhit_dtrack(), der_expect ) ); cout << pre12.difference_vector() << endl; assert( fabs(pre12.difference_vector()(0) - calc_axy(vec) + axy1) < 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() == 1); cout << pre22.measured_vector() << endl; assert( is_equal( pre22.measured_vector()(0), axy2 ) ); cout << pre22.measured_error() << endl; assert( is_equal( pre22.measured_error()(0,0), daxy2*daxy2 ) ); cout << pre22.predicted_vector() << endl; assert( is_equal( pre22.predicted_vector()(0), calc_axy(vec) ) ); cout << pre22.predicted_error() << endl; assert( is_equal( pre22.predicted_error()(0,0), calc_eaxy(err) ) ); cout << pre22.dhit_dtrack() << endl; assert( is_equal( pre22.dhit_dtrack(), der_expect ) ); cout << pre22.difference_vector() << endl; assert( fabs(pre22.difference_vector()(0) - calc_axy(vec) + axy2) < 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() == 1); cout << pre11.measured_vector() << endl; assert( is_equal( pre11.measured_vector()(0), axy1 ) ); cout << pre11.measured_error() << endl; assert( is_equal( pre11.measured_error()(0,0), daxy1*daxy1 ) ); cout << pre11.predicted_vector() << endl; assert( is_equal( pre11.predicted_vector()(0), calc_axy(vec) ) ); cout << pre11.predicted_error() << endl; assert( is_equal( pre11.predicted_error()(0,0), calc_eaxy(err) ) ); cout << pre11.dhit_dtrack() << endl; assert( is_equal( pre11.dhit_dtrack(), der_expect ) ); cout << pre11.difference_vector() << endl; assert( fabs(pre11.difference_vector()(0) - calc_axy(vec) + axy1) < maxdiff ); //******************************************************************** cout << ok_prefix << "Check hit type and equality." << endl; cout << HitZPlane1::get_static_type(); cout << pre11.get_type() << endl; cout << pre12.get_type() << endl; assert( pre11.get_type() != 0 ); assert( pre11.get_type() == HitZPlane1::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); { ObjPtr pobj( new ClusZPlane1(12.3, 0.1,0.9,1.2,0.15, 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( "ClusZPlane1 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "z",pos)) != string::npos ); assert( (pos=mystream.str().find( "12.3 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "xweight",pos)) != string::npos ); assert( (pos=mystream.str().find( "0.1 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "yweight",pos)) != string::npos ); assert( (pos=mystream.str().find( "0.9 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "xy",pos)) != string::npos ); assert( (pos=mystream.str().find( "1.2 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "dxy",pos)) != string::npos ); assert( (pos=mystream.str().find( "0.15 ",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 ClusZPlane1 z=24.4 xweight=0.1 yweight=0.9 xy=1.3 dxy=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 ClusZPlane1* pobj; ObjTable::get_object(name,pobj); assert( pobj != 0 ); cout << *pobj << endl; assert( pobj->get_type() == ClusZPlane1::get_static_type() ); assert( ((const SurfZPlane&)(pobj->get_surface())).get_z() == 24.4 ); assert( pobj->get_axy() == 1.3 ); assert( pobj->get_daxy() == 0.1 ); assert( pobj->get_wx() == 0.1 ); assert( pobj->get_wy() == 0.9 ); #ifdef ObjData_supports_lists assert( pobj->get_mc_ids() == mcids_h ); #endif } } //******************************************************************** cout << ok_prefix << "------------- All tests passed. -------------" << endl; return 0; //******************************************************************** }