// CheckZInt.cpp #include "CheckZInt.h" #include "objstream/ObjData.hpp" #include "objstream/ObjTable.hpp" #include "spacegeom/SpacePath.h" #include "spacegeom/SpacePoint.h" #include "trfutil/trfstream.h" #include "trffit/MTrack.h" #include "trfcut/CutRecorder.hpp" using std::string; using std::ostream; using trf::CheckZInt; //********************************************************************** // Free functions. //********************************************************************** namespace { // Creator. ObjPtr create(const ObjData& data) { assert( data.get_object_type() == "CheckZInt" ); double max_zint = data.get_double("max_zint"); string cut_name; if(data.has("cut_name")) cut_name = data.get_string("cut_name"); return ObjPtr( new CheckZInt(max_zint, cut_name) ); } } //********************************************************************** // Member functions. //********************************************************************** // Output stream. void CheckZInt::ostr(ostream& stream) const { stream << begin_object; stream << "Check z intercept <= " << _max_zint; stream << end_object; } //********************************************************************** // Constructor. CheckZInt::CheckZInt(double max_zint, const string& cut_name) : _max_zint(max_zint) { CutRecorder* p = CutRecorder::instance(); assert(p != 0); _cut_id = p->get_cutid(cut_name); } //********************************************************************** // Return the creator. ObjCreator CheckZInt::get_creator() { return create; } //********************************************************************** // Write the object data. ObjData CheckZInt::write_data() const { ObjData data( get_type_name() ); data.add_double( "max_zint", get_max_zint() ); return data; } //********************************************************************** // return track status. bool CheckZInt::status_with_record(const MTrack& trm, CutRecord* prec) const { //Calculate z at beam line... double zpos = trm.get_track().space_point().z(); double radius = trm.get_track().space_point().rxy(); double dz = trm.get_track().space_vector().dz(); double dr = trm.get_track().space_vector().drxy(); double tanlam = dz/dr; double zint = radius*tanlam - zpos; // Cut bool passed = fabs(zint) <= _max_zint; // Fill cut record, if defined. if(prec && _cut_id.is_valid()) { prec->add_cut(_cut_id, zint); prec->set_passed(passed && prec->passed()); } return passed; } //**********************************************************************