// HitCylPhiZ_t.cpp // Test component HitCylPhiZ. #include "HitCylPhiZ.h" #include #include #include #include "objstream/ObjData.hpp" #include "objstream/StdObjStream.hpp" #include "trfutil/trfstream.h" #include "trfbase/ETrack.h" #include "trfutil/TRFMath.h" using namespace trf; using std::cout; using std::cerr; using std::endl; using std::string; using std::ostringstream; using std::istringstream; #ifndef DEFECT_CMATH_NOT_STD using std::fabs; #endif double stereo = 0.001; // calculate phiz from a track vector double calc_phiz(TrackVector vec) { return vec(0) + stereo*vec(1); } // calculate ephiz from error matrix double calc_ephiz(TrackError err) { return err(0,0) + 2.0*stereo*err(0,1) + stereo*stereo*err(1,1); } //********************************************************************** int main( ) { string component = "HitCylPhiZ"; 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; } //******************************************************************** ObjTable::register_type(); cout << trf_format; cout << ok_prefix << "Test cluster constructors." << endl; double r1 = 10.0; double phiz1 = 1.0; double dphiz1 = 0.01; SurfCylinder scy1(r1); ClusCylPhiZ* phcp1 = new ClusCylPhiZ(r1,phiz1,dphiz1,stereo); cout << *phcp1 << endl; ClusCylPhiZ hcp1c = *phcp1; cout << hcp1c << endl; double r2 = 20.0; double phiz2 = 2.0; double dphiz2 = 0.02; ClusCylPhiZ* phcp2 = new ClusCylPhiZ(r2,phiz2,dphiz2,stereo); //******************************************************************** cout << ok_prefix << "Test cluster type ID." << endl; cout << phcp1->get_type() << endl; cout << phcp2->get_type() << endl; assert( phcp1->get_type() != 0 ); assert( phcp1->get_type() == phcp2->get_type() ); //******************************************************************** cout << ok_prefix << "Test cluster accessors." << endl; cout << *phcp1 << endl; cout << phcp1->get_surface() << endl; cout << phcp1->get_phiz() << endl; cout << phcp1->get_dphiz() << endl; cout << phcp1->get_stereo() << endl; assert( phcp1->get_surface() == scy1 ); assert( phcp1->get_phiz() == phiz1 ); assert( phcp1->get_dphiz() == dphiz1 ); assert( phcp1->get_stereo() == stereo ); //******************************************************************** cout << ok_prefix << "Generate a hit." << endl; TrackVector vec; TrackError err; HitDerivative der_expect(1); der_expect(0,0) = 1.0; der_expect(0,1) = stereo; vec(0) = 1.1; vec(1) = 40.0; err(0,0) = 0.04; ETrack tre1( SurfacePtr(scy1.new_pure_surface()), vec, err ); ClusterPtr cluptr1(phcp1); 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( is_equal(pre11.measured_vector()(0),phiz1) ); cout << pre11.measured_error() << endl; assert( is_equal( pre11.measured_error()(0,0), dphiz1*dphiz1 ) ); cout << pre11.predicted_vector() << endl; assert( is_equal( pre11.predicted_vector()(0), calc_phiz(vec) ) ); cout << pre11.predicted_error() << endl; assert( is_equal( pre11.predicted_error()(0,0), calc_ephiz(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_phiz(vec) + phiz1) < maxdiff ); //******************************************************************** cout << ok_prefix << "Generate hit for a different track." << endl; vec(0) = 1.2; ETrack tre2( SurfacePtr(scy1.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), phiz1 ) ); cout << pre12.measured_error() << endl; assert( is_equal( pre12.measured_error()(0,0), dphiz1*dphiz1 ) ); cout << pre12.predicted_vector() << endl; assert( is_equal( pre12.predicted_vector()(0), calc_phiz(vec) ) ); cout << pre12.predicted_error() << endl; assert( is_equal( pre12.predicted_error()(0,0), calc_ephiz(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_phiz(vec) + phiz1) < 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; ClusterPtr cluptr2(phcp2); 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), phiz2 ) ); cout << pre22.measured_error() << endl; assert( is_equal( pre22.measured_error()(0,0), dphiz2*dphiz2 ) ); cout << pre22.predicted_vector() << endl; assert( is_equal( pre22.predicted_vector()(0), calc_phiz(vec) ) ); cout << pre22.predicted_error() << endl; assert( is_equal( pre22.predicted_error()(0,0), calc_ephiz(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_phiz(vec) + phiz2) < 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), phiz1 ) ); cout << pre11.measured_error() << endl; assert( is_equal( pre11.measured_error()(0,0), dphiz1*dphiz1 ) ); cout << pre11.predicted_vector() << endl; assert( is_equal( pre11.predicted_vector()(0), calc_phiz(vec) ) ); cout << pre11.predicted_error() << endl; assert( is_equal( pre11.predicted_error()(0,0), calc_ephiz(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_phiz(vec) + phiz1) < maxdiff ); //******************************************************************** cout << ok_prefix << "Check hit type and equality." << endl; cout << HitCylPhiZ::get_static_type(); cout << pre11.get_type() << endl; cout << pre12.get_type() << endl; assert( pre11.get_type() != 0 ); assert( pre11.get_type() == HitCylPhiZ::get_static_type() ); assert( pre11.get_type() == pre12.get_type() ); //******************************************************************** cout << ok_prefix << "Check MC ID's." << endl; assert( phcp1->get_mc_ids().size() == 0 ); McIdList ids; ids.push_back(1); ids.push_back(22); ids.push_back(333); ClusCylPhiZ* phcp3( new ClusCylPhiZ(r2,phiz2,dphiz2,stereo,ids) ); ClusterPtr pclu3(phcp3); { const McIdList& oids = pclu3->get_mc_ids(); assert( oids.size() == 3 ); assert( oids[0] == 1 ); assert( oids[1] == 22 ); assert( oids[2] == 333 ); } { HitList thits31 = pclu3->predict(tre1); assert( thits31.size() == 1 ); Hit& hit = *thits31.front(); const McIdList& oids = hit.get_mc_ids(); assert( oids.size() == 3 ); assert( oids[0] == 1 ); assert( oids[1] == 22 ); assert( oids[2] == 333 ); } { ClusterPtr pclu4 = new ClusCylPhiZ(*phcp3); const McIdList& oids = pclu4->get_mc_ids(); assert( oids.size() == 3 ); assert( oids[0] == 1 ); assert( oids[1] == 22 ); assert( oids[2] == 333 ); } //******************************************************************** cout << ok_prefix << "Write object data." << endl; McIdList mcids; mcids.push_back(2); mcids.push_back(4); mcids.push_back(8); { ObjPtr pobj( new ClusCylPhiZ(12.3, 4.5, 1.2, 1.23, mcids) ); 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( "ClusCylPhiZ ",pos)) != string::npos ); assert( (pos=mystream.str().find( "radius",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( "4.5 ",pos)) != string::npos ); assert( (pos=mystream.str().find( "dphi",pos)) != string::npos ); assert( (pos=mystream.str().find( "stereo",pos)) != string::npos ); assert( (pos=mystream.str().find( "1.23 ",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 ClusCylPhiZ radius=24.4 phiz=2.8 dphiz=1.1"; istring += " stereo=2.46"; #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 ClusCylPhiZ* pobj; ObjTable::get_object(name,pobj); assert( pobj != 0 ); assert( pobj->get_type() == ClusCylPhiZ::get_static_type() ); assert( pobj->get_radius() == 24.4 ); assert( pobj->get_phiz() == 2.8 ); assert( pobj->get_dphiz() == 1.1 ); assert( pobj->get_stereo() == 2.46 ); #ifdef ObjData_supports_lists assert( pobj->get_mc_ids() == mcids ); #endif } } //******************************************************************** cout << ok_prefix << "------------- All tests passed. -------------" << endl; return 0; //******************************************************************** }