// LayerCylinder_t.cpp #include "LayerCylinder.h" #include #include #include #include "objstream/StdObjStream.hpp" #include "trfutil/trfstream.h" #include "trfbase/ETrack.h" #include "trfbase/MissTest.h" #include "trflayer/ClusterFindAll.h" #include "trflayer/LayerStat.h" #include "HitCylPhi.h" #include "PropCyl.h" #include "trflayer/ClusterContainer.h" using std::cout; using std::cerr; using std::endl; using std::string; using std::ostringstream; using std::istringstream; using namespace trf; //********************************************************************** int main( ) { string component = "LayerCylinder"; 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 constructor." << endl; SurfacePtr pfsrf1( new SurfCylinder(20.0) ); MutableClusterFindManagerPtr pfind1( new ClusterFindAll(pfsrf1) ); double par1 = 123.; double like1 = 0.246; Miss* pmiss = new MissTest(par1,like1); MissPtr pmiss1(pmiss); assert( pmiss1->get_likelihood() == like1 ); SurfacePtr pfsrf2( new BSurfCylinder(40.0,-50.,50.) ); MutableClusterFindManagerPtr pfind2( new ClusterFindAll(pfsrf2) ); LayerCylinder lcy1( 20.0, -50.0, 50.0, pfind1, pmiss1 ); LayerCylinder lcy2( 40.0, -70.0, 70.0, pfind2 ); cout << lcy1 << endl; //******************************************************************** cout << ok_prefix << "Test type." << endl; cout << lcy1.get_type() << endl; cout << lcy2.get_type() << endl; assert( lcy1.get_type() != 0 ); assert( lcy1.get_type() == LayerCylinder::get_static_type() ); assert( lcy1.get_type() == lcy2.get_type() ); //******************************************************************** cout << ok_prefix << "Define a surface and track." << endl; SurfacePtr psrf0( new SurfCylinder(20.0) ); SurfacePtr psrf1( new SurfCylinder(5.0) ); TrackVector vec; vec(0) = 1.0; // phi vec(1) = 5.0; // z vec(2) = 0.1; // alpha vec(3) = -0.2; // lambda vec(4) = 0.002; // q/p TrackError err; err.fill(0.0); err(0,0) = 0.01; err(1,1) = 0.02; err(2,2) = 0.03; err(3,3) = 0.04; err(4,4) = 0.05; ETrack tre0(psrf0,vec,err); ETrack tre(psrf1,vec,err); cout << tre << endl; //******************************************************************** cout << ok_prefix << "Test surface." << endl; SurfacePtr psrf = lcy1.get_cluster_surfaces().front(); { const SurfacePtr& psrf3 = lcy1.get_surface(); cout << *psrf3 << endl; assert( lcy1.get_cluster_surfaces().size() == 1 ); assert( *psrf3 == *psrf ); } //******************************************************************** cout << ok_prefix << "Check cluster access" << endl; assert( lcy1.has_clusters() ); lcy1.add_cluster(new ClusCylPhi(20,1.0,0.1) ); lcy1.add_cluster(new ClusCylPhi(20,2.0,0.1) ); lcy1.add_cluster(new ClusCylPhi(20,3.0,0.1) ); const LayerCylinder& lcy1c = lcy1; cout << lcy1c.get_clusters().size() << endl; assert( lcy1c.get_clusters().size() == 3 ); assert( lcy1c.get_clusters(psrf).size() == 3 ); //******************************************************************** cout << ok_prefix << "Propagate from inside." << endl; PropCyl prop(ObjDoublePtr(new ObjDouble(-2.0))); LTrackList ltracks; lcy1.propagate(tre,prop,ltracks); assert( ltracks.size() == 1 ); // save a copy of the propagated track const LTrack trl1 = ltracks.front(); const ETrack& tre1 = trl1.get_track(); const LayerStat& lstat1 = trl1.get_status(); cout << trl1 << endl; assert( lstat1.at_exit() ); assert( lstat1.get_state() == 1 ); ltracks.erase(ltracks.begin(), ltracks.end()); assert( ltracks.size() == 0 ); lcy1.propagate(trl1,prop,ltracks); assert( ltracks.size() == 0 ); //******************************************************************** cout << ok_prefix << "Check returned miss." << endl; assert( lstat1.get_miss() != 0 ); pmiss->update(tre1); assert( lstat1.get_miss()->get_likelihood() == pmiss1->get_likelihood() ); //******************************************************************** cout << ok_prefix << "Check returned clusters." << endl; assert( lstat1.has_clusters() ); assert( lstat1.get_clusters().size() == 3 ); assert( lstat1.get_clusters(tre,0,0).get_clusters().size() == 3 ); //******************************************************************** cout << ok_prefix << "Propagate from outside." << endl; SurfacePtr psrf2( new SurfCylinder(50.0) ); tre.set_surface(psrf2); cout << tre << endl; ltracks.erase(ltracks.begin(), ltracks.end()); assert( ltracks.size() == 0 ); lcy1.propagate(tre,prop,ltracks); assert( ltracks.size() == 1 ); // save a copy of the propagated track const LTrack trl2 = ltracks.front(); const ETrack& tre2 = trl2.get_track(); const LayerStat& lstat2 = trl2.get_status(); cout << trl2 << endl; assert( lstat2.at_exit() ); assert( lstat2.get_state() == 1 ); ltracks.erase(ltracks.begin(), ltracks.end()); assert( ltracks.size() == 0 ); lcy1.propagate(trl2,prop,ltracks); assert( ltracks.size() == 0 ); //******************************************************************** cout << ok_prefix << "Propagate backward from outside." << endl; TrackVector vec2 = vec; vec2(2) = -3.1; ETrack tre30(psrf2,vec2,err); cout << tre30 << endl; ltracks.erase(ltracks.begin(), ltracks.end()); assert( ltracks.size() == 0 ); lcy1.propagate(tre30,prop,ltracks); assert( ltracks.size() == 1 ); // save a copy of the propagated track const LTrack trl3 = ltracks.front(); const ETrack& tre3 = trl3.get_track(); const LayerStat& lstat3 = trl3.get_status(); cout << trl3 << endl; assert( lstat3.at_exit() ); assert( lstat3.get_state() == 1 ); ltracks.erase(ltracks.begin(), ltracks.end()); assert( ltracks.size() == 0 ); lcy1.propagate(trl3,prop,ltracks); assert( ltracks.size() == 0 ); //******************************************************************** cout << ok_prefix << "Propagate from layer surface." << endl; SurfacePtr psrf3( new SurfCylinder(20.0) ); tre.set_surface(psrf3); cout << tre << endl; ltracks.erase(ltracks.begin(), ltracks.end()); assert( ltracks.size() == 0 ); lcy1.propagate(tre,prop,ltracks); assert( ltracks.size() == 1 ); // save a copy of the propagated track const LTrack trl4 = ltracks.front(); const ETrack& tre4 = trl4.get_track(); const LayerStat& lstat4 = trl4.get_status(); cout << trl4 << endl; assert( lstat4.at_exit() ); assert( lstat4.get_state() == 1 ); //******************************************************************** cout << ok_prefix << "Propagate out of bounds." << endl; tre.set_surface(psrf1); vec(1) = 300.0; tre.set_vector(vec); cout << tre << endl; ltracks.erase(ltracks.begin(), ltracks.end()); assert( ltracks.size() == 0 ); lcy1.propagate(tre,prop,ltracks); assert( ltracks.size() == 1 ); // save a copy of the propagated track const LTrack trl5 = ltracks.front(); const ETrack& tre5 = trl5.get_track(); const LayerStat& lstat5 = trl5.get_status(); cout << trl5 << endl; assert( lstat5.at_exit() ); assert( lstat5.get_state() == 1 ); //******************************************************************** cout << ok_prefix << "Drop clusters." << endl; cout << "Before drop: " << lcy1.get_clusters().size() << endl; assert ( lcy1.get_clusters().size() == 3 ); lcy1.drop_clusters(); cout << "After drop: " << lcy1.get_clusters().size() << endl; assert ( lcy1.get_clusters().size() == 0 ); //******************************************************************** cout << ok_prefix << "Write object data." << endl; Ptr pbcyl( new BSurfCylinder(12.3,-123,+246.) ); MutableClusterFindManagerPtr pfind( new ClusterFindAll(pbcyl) ); { ObjPtr pobj( new LayerCylinder(pbcyl,pfind) ); ostringstream mystream; StdObjStream objstream(mystream); objstream.write_object("bcyl",pbcyl); objstream.write_object("findall",pfind); 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( "LayerCylinder ",pos)) != string::npos ); assert( (pos=mystream.str().find( "surface",pos)) != string::npos ); assert( (pos=mystream.str().find( "bcyl ",pos)) != string::npos ); assert( (pos=mystream.str().find( "finder",pos)) != string::npos ); assert( (pos=mystream.str().find( "findall ",pos)) != string::npos ); } //******************************************************************** cout << ok_prefix << "Read object data." << endl; { string istring = "[ obj2 LayerCylinder surface=@bcyl finder=@findall ]"; istringstream isstrm(istring); { StdObjStream obstr(isstrm); string name = obstr.read_object(); assert( name == "obj2" ); const LayerCylinder* pobj; ObjTable::get_object(name,pobj); assert( pobj != 0 ); assert( pobj->get_type() == LayerCylinder::get_static_type() ); assert( pobj->get_surface() == pbcyl ); assert( pobj->get_finder() == pfind ); } } //******************************************************************** cout << ok_prefix << "------------- All tests passed. -------------" << endl; return 0; //******************************************************************** }