/* This file is part of MAUS: http://micewww.pp.rl.ac.uk:8080/projects/maus * * MAUS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MAUS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MAUS. If not, see . * */ #include "src/reduce/ReduceCppEVExport/EVExporter.hh" #include #include "DataStructure/SciFiTrack.hh" #include "DataStructure/SciFiTrackPoint.hh" namespace EventViewer { EVExporter::EVExporter(MAUS::Spill *sp) { spill = sp; } EVExporter::~EVExporter() { // Do nothing } void EVExporter::ReadAllEvents(int eventSelection, bool verbose) { // - iterate through events for (size_t i = 0; i < spill->GetReconEvents()->size(); ++i) { detectorsHit = 0; evEvent.Reset(); evEvent.runNumber = spill->GetRunNumber(); evEvent.spillNumber = spill->GetSpillNumber(); evEvent.eventNumber = i; // tof_event = new MAUS::TOFEvent; // will this help? tof_event = (*spill->GetReconEvents())[i]->GetTOFEvent(); if (tof_event != NULL) ProcessTOFEvent(); // scifi_event = new MAUS::SciFiEvent; // will this help? scifi_event = (*spill->GetReconEvents())[i]->GetSciFiEvent(); if (scifi_event != NULL) ProcessScifiEvent(); // - export one EVEvent to HepRep // add selection of visualization output format at some point, // maybe as an argument to method (only HepRep supported for now) if (eventSelection == 0) { if (verbose) { std::cout << "EVExporter: processing spill " << evEvent.spillNumber << " event: " << evEvent.eventNumber << std::endl; } EVHepRepExporter exp(evEvent); exp.Export(0); } else if (eventSelection == 1 && detectorsHit == 0) { if (verbose) { std::cout << "EVExporter: processing spill " << evEvent.spillNumber << " event: " << evEvent.eventNumber << std::endl; } EVHepRepExporter exp(evEvent); exp.Export(0); } else if (detectorsHit == eventSelection) { if (verbose) { std::cout << "EVExporter: processing spill " << evEvent.spillNumber << " event: " << evEvent.eventNumber << std::endl; } EVHepRepExporter exp(evEvent); exp.Export(0); } } } int EVExporter::ReadOneEvent(int eventNumber, std::string opt, int eventSelection, int display) { detectorsHit = 0; evEvent.Reset(); evEvent.runNumber = spill->GetRunNumber(); evEvent.spillNumber = spill->GetSpillNumber(); evEvent.eventNumber = eventNumber; if ((*spill->GetReconEvents())[evEvent.eventNumber] == NULL) { std::cerr << "Event " << evEvent.eventNumber << " not available in current spill!" << "\n"; return 0; } tof_event = new MAUS::TOFEvent; // will this help? tof_event = (*spill->GetReconEvents())[eventNumber]->GetTOFEvent(); if (tof_event != NULL) ProcessTOFEvent(); scifi_event = new MAUS::SciFiEvent; // will this help? scifi_event = (*spill->GetReconEvents())[eventNumber]->GetSciFiEvent(); if (scifi_event != NULL) ProcessScifiEvent(); // - export one EVEvent to HepRep // add selection of visualization output format at some point, // maybe as an argument to method (only HepRep supported for now) if (opt == "exp" && eventSelection == 0) { std::cout << "EVExporter: processing spill " << evEvent.spillNumber << " event: " << evEvent.eventNumber << std::endl; // add vebosity option? EVHepRepExporter exp(evEvent); exp.Export(display); } else if (opt == "exp" && eventSelection == 1 && detectorsHit == 0) { std::cout << "EVExporter: processing spill " << evEvent.spillNumber << " event: " << evEvent.eventNumber << std::endl; // add vebosity option? EVHepRepExporter exp(evEvent); exp.Export(display); } else if (opt == "exp" && detectorsHit == eventSelection) { std::cout << "EVExporter: processing spill " << evEvent.spillNumber << " event: " << evEvent.eventNumber << std::endl; // add vebosity option? EVHepRepExporter exp(evEvent); exp.Export(display); } else if (opt != "exp" && opt != "no_exp") { std::cerr << "Error! Wrong option passed to EVExporter::ReadEvent! " << "Options are 'exp' to export to HepRep or 'no_exp' not to" << std::endl; // revise later whether this is necessary? return 0; } if (detectorsHit > 0) { return detectorsHit; } else if (detectorsHit == 0) { return 1; // check whether this is working correctly for non existing events } } void EVExporter::ProcessTOFEvent() { ProcessTOF0(); ProcessTOF1(); ProcessTOF2(); } void EVExporter::ProcessTOF0() { MAUS::TOFEventSpacePoint space_points = tof_event->GetTOFEventSpacePoint(); MAUS::TOFSpacePoint tof0_space_points; // - modify ReadOneEvent return value if (space_points.GetTOF0SpacePointArray().size() > 0) detectorsHit += 2; // 1. Loop over TOF0 space points: for (size_t i = 0; i < space_points.GetTOF0SpacePointArray().size(); ++i) { tof0_space_points = space_points.GetTOF0SpacePointArray()[i]; double TOF0_x = tof0_space_points.GetGlobalPosX(); double TOF0_y = tof0_space_points.GetGlobalPosY(); double TOF0_z = tof0_space_points.GetGlobalPosZ(); MAUS::ThreeVector tof0Coordinates(TOF0_x, TOF0_y, TOF0_z); evEvent.tofPoints[0] = tof0Coordinates; } } void EVExporter::ProcessTOF1() { MAUS::TOFEventSpacePoint space_points = tof_event->GetTOFEventSpacePoint(); MAUS::TOFSpacePoint tof1_space_points; // - modify ReadOneEvent return value if (space_points.GetTOF1SpacePointArray().size() > 0) detectorsHit += 4; for (size_t i = 0; i < space_points.GetTOF1SpacePointArray().size(); ++i) { tof1_space_points = space_points.GetTOF1SpacePointArray()[i]; double TOF1_x = tof1_space_points.GetGlobalPosX(); double TOF1_y = tof1_space_points.GetGlobalPosY(); double TOF1_z = tof1_space_points.GetGlobalPosZ(); MAUS::ThreeVector tof1Coordinates(TOF1_x, TOF1_y, TOF1_z); evEvent.tofPoints[1] = tof1Coordinates; } } void EVExporter::ProcessTOF2() { MAUS::TOFEventSpacePoint space_points = tof_event->GetTOFEventSpacePoint(); MAUS::TOFSpacePoint tof2_space_points; // - modify ReadOneEvent return value if (space_points.GetTOF2SpacePointArray().size() > 0) detectorsHit += 32; for (size_t i = 0; i < space_points.GetTOF2SpacePointArray().size(); ++i) { tof2_space_points = space_points.GetTOF2SpacePointArray()[i]; double TOF2_x = tof2_space_points.GetGlobalPosX(); double TOF2_y = tof2_space_points.GetGlobalPosY(); double TOF2_z = tof2_space_points.GetGlobalPosZ(); MAUS::ThreeVector tof2Coordinates(TOF2_x, TOF2_y, TOF2_z); evEvent.tofPoints[2] = tof2Coordinates; } } void EVExporter::ProcessScifiEvent() { // Extract raw scifi cluster data std::vector clusters = scifi_event->clusters(); std::vector::iterator clus_iter; for (clus_iter = clusters.begin(); clus_iter != clusters.end(); ++clus_iter) { MAUS::SciFiCluster* clus = (*clus_iter); int tracker = clus->get_tracker(); int station = clus->get_station(); int plane = clus->get_plane(); MAUS::ThreeVector position = clus->get_position(); double alpha = clus->get_alpha(); if (tracker == 0) { evEvent.scifiUSTrackerClusters[plane][0].push_back(-alpha); evEvent.scifiUSTrackerClusters[plane][1].push_back(-position.z()); // add offset later } else if (tracker == 1) { evEvent.scifiDSTrackerClusters[plane][0].push_back(alpha); evEvent.scifiDSTrackerClusters[plane][1].push_back(position.z()); // add offset later } } // --- iterate through scifi tracks std::vector tracks = scifi_event->scifitracks(); std::vector::iterator track_iter; int USPoints = 0, DSPoints = 0; // track point counters for US and DS tracker for (track_iter = tracks.begin(); track_iter != tracks.end(); ++track_iter) { std::vector track_points = (*track_iter)->scifitrackpoints(); std::vector::iterator track_point_iter; // - iterate through track points for (track_point_iter = track_points.begin(); track_point_iter != track_points.end(); ++track_point_iter) { MAUS::SciFiTrackPoint* point = (*track_point_iter); int tracker = point->tracker(); int station = point->station(); MAUS::ThreeVector position = point->pos(); MAUS::ThreeVector momentum = point->mom(); // check for nans from tracker reconstruction if (tracker == 0 && !(IsVectorNaN(position) || IsVectorNaN(momentum))) { evEvent.scifiUSTrackerPoints[station-1] = position; evEvent.scifiUSTrackerPointsMomenta[station-1] = momentum; ++USPoints; // check for nans from tracker reconstruction } else if (tracker == 1 && !(IsVectorNaN(position) || IsVectorNaN(momentum))) { evEvent.scifiDSTrackerPoints[station-1] = position; evEvent.scifiDSTrackerPointsMomenta[station-1] = momentum; ++DSPoints; } } } // - modify ReadOneEvent return value if (USPoints > 0) detectorsHit += 8; if (DSPoints > 0) detectorsHit += 16; // --- iterate through space points std::vector space_points = scifi_event->spacepoints(); std::vector::iterator spoint_iter; for (spoint_iter = space_points.begin(); spoint_iter != space_points.end(); ++spoint_iter) { MAUS::SciFiSpacePoint* point = (*spoint_iter); int tracker = point->get_tracker(); if (tracker == 0) evEvent.scifiUSTrackerSpacePoints.push_back(point->get_global_position()); else if (tracker == 1) evEvent.scifiDSTrackerSpacePoints.push_back(point->get_global_position()); } // --- iterate through straight tracks std::vector straight_tracks = scifi_event->straightprtracks(); std::vector::iterator straight_track_iter; for (straight_track_iter = straight_tracks.begin(); straight_track_iter != straight_tracks.end(); ++straight_track_iter) { MAUS::SciFiStraightPRTrack* strTrack = (*straight_track_iter); double x0 = strTrack->get_global_x0(); double mx = strTrack->get_global_mx(); double y0 = strTrack->get_global_y0(); double my = strTrack->get_global_my(); double what = strTrack->get_x0(); // move these to settings instead of hardcoding them? double extra = 50; double zminUS = 13958 - extra; double zmaxUS = 15059 + extra; double zminDS = 18854 - extra; double zmaxDS = 19955 + extra; int tracker = strTrack->get_tracker(); if (tracker == 0) { double xFirst = mx*zminUS + x0; double yFirst = my*zminUS + y0; MAUS::ThreeVector first(xFirst, yFirst, zminUS); evEvent.scifiUSTrackerStraightTrackPoints[0] = first; double xSecond = mx*zmaxUS + x0; double ySecond = my*zmaxUS + y0; MAUS::ThreeVector second(xSecond, ySecond, zmaxUS); evEvent.scifiUSTrackerStraightTrackPoints[1] = second; } else if (tracker == 1) { double xFirst = mx*zminDS + x0; double yFirst = my*zminDS + y0; MAUS::ThreeVector first(xFirst, yFirst, zminDS); evEvent.scifiDSTrackerStraightTrackPoints[0] = first; double xSecond = mx*zmaxDS + x0; double ySecond = my*zmaxDS + y0; MAUS::ThreeVector second(xSecond, ySecond, zmaxDS); evEvent.scifiDSTrackerStraightTrackPoints[1] = second; } } // --- iterate through helical tracks std::vector helical_tracks = scifi_event->helicalprtracks(); std::vector::iterator helical_track_iter; for (helical_track_iter = helical_tracks.begin(); helical_track_iter != helical_tracks.end(); ++helical_track_iter) { MAUS::SciFiHelicalPRTrack* heliTrack = (*helical_track_iter); MAUS::ThreeVector startPoint = heliTrack->get_pos0(); if (heliTrack->get_tracker() == 0) { evEvent.scifiUSTrackerHelicalTrackParameters[0] = heliTrack->get_circle_x0(); evEvent.scifiUSTrackerHelicalTrackParameters[1] = heliTrack->get_circle_y0(); evEvent.scifiUSTrackerHelicalTrackParameters[2] = heliTrack->get_R(); evEvent.scifiUSTrackerHelicalTrackParameters[3] = heliTrack->get_dsdz(); evEvent.scifiUSTrackerHelicalTrackParameters[4] = heliTrack->get_line_sz_c(); evEvent.scifiUSTrackerHelicalTrackParameters[5] = startPoint.x(); evEvent.scifiUSTrackerHelicalTrackParameters[6] = startPoint.y(); evEvent.scifiUSTrackerHelicalTrackParameters[7] = startPoint.z(); } else if (heliTrack->get_tracker() == 1) { evEvent.scifiDSTrackerHelicalTrackParameters[0] = heliTrack->get_circle_x0(); evEvent.scifiDSTrackerHelicalTrackParameters[1] = heliTrack->get_circle_y0(); evEvent.scifiDSTrackerHelicalTrackParameters[2] = heliTrack->get_R(); evEvent.scifiDSTrackerHelicalTrackParameters[3] = heliTrack->get_dsdz(); evEvent.scifiDSTrackerHelicalTrackParameters[4] = heliTrack->get_line_sz_c(); evEvent.scifiDSTrackerHelicalTrackParameters[5] = startPoint.x(); evEvent.scifiDSTrackerHelicalTrackParameters[6] = startPoint.y(); evEvent.scifiDSTrackerHelicalTrackParameters[7] = startPoint.z(); } } } int EventViewer::EVExporter::IsVectorNaN(MAUS::ThreeVector v) { if (std::isnan(v.x()) || std::isnan(v.y()) || std::isnan(v.z())) return 1; else return 0; } } // ~namespace EventViewer