int PHG4TrackGhostRejection::process_event(PHCompositeNode *topNode) { if(verbosity > 0) cout << "PHG4TrackGhostRejection::process_event -- entered" << endl; //--------------------------------- // Get Objects off of the Node Tree //--------------------------------- // Pull the reconstructed track information off the node tree... _g4tracks = findNode::getClass<SvtxTrackMap>(topNode, "SvtxTrackMap"); if(!_g4tracks) { cerr << PHWHERE << " ERROR: Can't find SvtxTrackMap." << endl; return Fun4AllReturnCodes::ABORTEVENT; } if (verbosity > 1) { _g4tracks->identify(); for (SvtxTrackMap::Iter iter = _g4tracks->begin(); iter != _g4tracks->end(); ++iter) { SvtxTrack *track = iter->second; track->identify(); } } //---------------------------- // Sort the hits on each track //---------------------------- _candidates.clear(); for (SvtxTrackMap::Iter iter = _g4tracks->begin(); iter != _g4tracks->end(); ++iter) { SvtxTrack* track = iter->second; PHG4TrackCandidate combo; combo.trackid = track->get_id(); combo.nhits = track->size_clusters(); for (SvtxTrack::ConstClusterIter iter = track->begin_clusters(); iter != track->end_clusters(); ++iter) { unsigned int cluster_id = *iter; combo.hitids.push_back(cluster_id); } if (track->get_ndf() != 0) { combo.chisq = track->get_chisq()/track->get_ndf(); } combo.keep = true; // sort the hits by index stable_sort(combo.hitids.begin(),combo.hitids.end(),hit_sort); _candidates.push_back(combo); } //--------------------- // Fill the overlap map //--------------------- _overlapping.clear(); for(unsigned int i = 0; i < _candidates.size(); i++) { for(unsigned int j = i+1; j < _candidates.size(); j++) { // determine the maximum length of the anticipated storage unsigned maxhits = _candidates[i].hitids.size(); if(_candidates[j].hitids.size() > maxhits) { maxhits = _candidates[j].hitids.size(); } // create the difference storage std::vector<unsigned int> diff; diff.assign(maxhits,0); // run the difference algorithm std::vector<unsigned int>::iterator it = diff.begin(); it = std::set_difference(_candidates[i].hitids.begin(),_candidates[i].hitids.end(), _candidates[j].hitids.begin(),_candidates[j].hitids.end(), diff.begin()); // calculate the overlap unsigned int overlap = maxhits - int(it - diff.begin()); // insert an overlapping pair into the map if(overlap > _max_shared_hits) _overlapping.insert(std::make_pair(i,j)); } } //---------------------- // Flag the ghost tracks //---------------------- std::multimap<unsigned,unsigned int>::iterator iter; for (iter = _overlapping.begin(); iter != _overlapping.end(); iter++) { unsigned int key = iter->first; unsigned int value = iter->second; if (_candidates[key].nhits > _candidates[value].nhits) { // prefer longer track _candidates[value].keep = false; } else if (_candidates[key].nhits < _candidates[value].nhits) { // prefer longer track _candidates[key].nhits = false; } else { // choose between equal length tracks by chisq/dof if (_candidates[key].chisq < _candidates[value].chisq) { _candidates[value].keep = false; } else { _candidates[key].keep = false; } } } //------------------------ // Remove the ghost tracks //------------------------ SvtxVertexMap* vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMap"); int initial_size = _g4tracks->size(); // loop over container and delete! for (unsigned int i = 0; i < _candidates.size(); i++) { if (!_candidates[i].keep) { // look for the track to delete if (_g4tracks->find(_candidates[i].trackid) != _g4tracks->end()) { _g4tracks->erase(_candidates[i].trackid); // also remove the track id from any vertex that contains this track if (!vertexmap) continue; for (SvtxVertexMap::Iter iter = vertexmap->begin(); iter != vertexmap->end(); ++iter) { SvtxVertex* vertex = iter->second; vertex->erase_track(_candidates[i].trackid); } } } } if (verbosity > 1) { _g4tracks->identify(); for (SvtxTrackMap::Iter iter = _g4tracks->begin(); iter != _g4tracks->end(); ++iter) { SvtxTrack *track = iter->second; track->identify(); } } if(verbosity > 0) cout << "PHG4TrackGhostRejection - rejected and removed " << initial_size - _g4tracks->size() << " tracks" << endl;; if(verbosity > 0) cout << "PHG4TrackGhostRejection::process_event -- exited" << endl; return Fun4AllReturnCodes::EVENT_OK; }
int PHG4SvtxTrackProjection::process_event(PHCompositeNode *topNode) { if(verbosity > 1) cout << "PHG4SvtxTrackProjection::process_event -- entered" << endl; //--------------------------------- // Get Objects off of the Node Tree //--------------------------------- // Pull the reconstructed track information off the node tree... SvtxTrackMap* _g4tracks = findNode::getClass<SvtxTrackMap>(topNode, "SvtxTrackMap"); if (!_g4tracks) { cerr << PHWHERE << " ERROR: Can't find SvtxTrackMap." << endl; return Fun4AllReturnCodes::ABORTRUN; } for (int i=0;i<_num_cal_layers;++i) { if (isnan(_cal_radii[i])) continue; if (verbosity > 1) cout << "Projecting tracks into: " << _cal_names[i] << endl; // pull the tower geometry string towergeonodename = "TOWERGEOM_" + _cal_names[i]; RawTowerGeom *towergeo = findNode::getClass<RawTowerGeom>(topNode,towergeonodename.c_str()); if (!towergeo) { cerr << PHWHERE << " ERROR: Can't find node " << towergeonodename << endl; return Fun4AllReturnCodes::ABORTRUN; } // pull the towers string towernodename = "TOWER_CALIB_" + _cal_names[i]; RawTowerContainer *towerList = findNode::getClass<RawTowerContainer>(topNode,towernodename.c_str()); if (!towerList) { cerr << PHWHERE << " ERROR: Can't find node " << towernodename << endl; return Fun4AllReturnCodes::ABORTRUN; } // pull the clusters string clusternodename = "CLUSTER_" + _cal_names[i]; RawClusterContainer *clusterList = findNode::getClass<RawClusterContainer>(topNode,clusternodename.c_str()); if (!clusterList) { cerr << PHWHERE << " ERROR: Can't find node " << clusternodename << endl; return Fun4AllReturnCodes::ABORTRUN; } // loop over all tracks for (SvtxTrackMap::Iter iter = _g4tracks->begin(); iter != _g4tracks->end(); ++iter) { SvtxTrack *track = iter->second; if (verbosity > 1) cout << "projecting track id " << track->get_id() << endl; if (verbosity > 1) { cout << " track pt = " << track->get_pt() << endl; } // curved tracks inside mag field // straight projections thereafter std::vector<double> point; point.assign(3,-9999.); //if (_cal_radii[i] < _mag_extent) { // curved projections inside field _hough.projectToRadius(track,_magfield,_cal_radii[i],point); if (isnan(point[0])) continue; if (isnan(point[1])) continue; if (isnan(point[2])) continue; // } else { // // straight line projections after mag field exit // _hough.projectToRadius(track,_mag_extent-0.05,point); // if (isnan(point[0])) continue; // if (isnan(point[1])) continue; // if (isnan(point[2])) continue; // std::vector<double> point2; // point2.assign(3,-9999.); // _hough.projectToRadius(track,_mag_extent+0.05,point2); // if (isnan(point2[0])) continue; // if (isnan(point2[1])) continue; // if (isnan(point2[2])) continue; // // find intersection of r and z // find x,y of intersection //} double x = point[0]; double y = point[1]; double z = point[2]; double phi = atan2(y,x); double eta = asinh(z/sqrt(x*x+y*y)); if (verbosity > 1) { cout << " initial track phi = " << track->get_phi(); cout << ", eta = " << track->get_eta() << endl; cout << " calorimeter phi = " << phi << ", eta = " << eta << endl; } // projection is outside the detector extent // \todo towergeo doesn't make this easy to extract, but this should be // fetched from the node tree instead of hardcoded if (fabs(eta) >= 1.0) continue; // calculate 3x3 tower energy int binphi = towergeo->get_phibin(phi); int bineta = towergeo->get_etabin(eta); double energy_3x3 = 0.0; for (int iphi = binphi-1; iphi < binphi+2; ++iphi) { for (int ieta = bineta-1; ieta < bineta+2; ++ieta) { // wrap around int wrapphi = iphi; if (wrapphi < 0) { wrapphi = towergeo->get_phibins() + wrapphi; } if (wrapphi >= towergeo->get_phibins()) { wrapphi = wrapphi - towergeo->get_phibins(); } // edges if (ieta < 0) continue; if (ieta >= towergeo->get_etabins()) continue; RawTower* tower = towerList->getTower(ieta,wrapphi); if (tower) { energy_3x3 += tower->get_energy(); if (verbosity > 1) cout << " tower " << ieta << " " << wrapphi << " energy = " << tower->get_energy() << endl; } } } track->set_cal_energy_3x3(_cal_types[i],energy_3x3); // loop over all clusters and find nearest double min_r = DBL_MAX; double min_index = -9999; double min_dphi = NAN; double min_deta = NAN; double min_e = NAN; for (unsigned int k = 0; k < clusterList->size(); ++k) { RawCluster *cluster = clusterList->getCluster(k); double dphi = atan2(sin(phi-cluster->get_phi()),cos(phi-cluster->get_phi())); double deta = eta-cluster->get_eta(); double r = sqrt(pow(dphi,2)+pow(deta,2)); if (r < min_r) { min_index = k; min_r = r; min_dphi = dphi; min_deta = deta; min_e = cluster->get_energy(); } } if (min_index != -9999) { track->set_cal_dphi(_cal_types[i],min_dphi); track->set_cal_deta(_cal_types[i],min_deta); track->set_cal_cluster_id(_cal_types[i],min_index); track->set_cal_cluster_e(_cal_types[i],min_e); if (verbosity > 1) { cout << " nearest cluster dphi = " << min_dphi << " deta = " << min_deta << " e = " << min_e << endl; } } } // end track loop } // end calorimeter layer loop if(verbosity > 1) cout << "PHG4SvtxTrackProjection::process_event -- exited" << endl; return Fun4AllReturnCodes::EVENT_OK; }
void SvtxEvaluator::fillOutputNtuples(PHCompositeNode *topNode) { if (verbosity > 1) cout << "SvtxEvaluator::fillOutputNtuples() entered" << endl; SvtxVertexEval* vertexeval = _svtxevalstack->get_vertex_eval(); SvtxTrackEval* trackeval = _svtxevalstack->get_track_eval(); SvtxClusterEval* clustereval = _svtxevalstack->get_cluster_eval(); SvtxHitEval* hiteval = _svtxevalstack->get_hit_eval(); SvtxTruthEval* trutheval = _svtxevalstack->get_truth_eval(); //----------------------- // fill the Vertex NTuple //----------------------- if (_ntp_vertex) { //cout << "Filling ntp_vertex " << endl; SvtxVertexMap* vertexmap = findNode::getClass<SvtxVertexMap>(topNode,"SvtxVertexMap"); PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo"); if (vertexmap && truthinfo) { for (SvtxVertexMap::Iter iter = vertexmap->begin(); iter != vertexmap->end(); ++iter) { SvtxVertex* vertex = iter->second; PHG4VtxPoint* point = vertexeval->max_truth_point_by_ntracks(vertex); float vx = vertex->get_x(); float vy = vertex->get_y(); float vz = vertex->get_z(); float ntracks = vertex->size_tracks(); float gvx = NAN; float gvy = NAN; float gvz = NAN; float gvt = NAN; float gntracks = truthinfo->GetNumPrimaryVertexParticles(); float nfromtruth = NAN; if (point) { gvx = point->get_x(); gvy = point->get_y(); gvz = point->get_z(); gvt = point->get_t(); gntracks = truthinfo->GetNumPrimaryVertexParticles(); nfromtruth = vertexeval->get_ntracks_contribution(vertex,point); } float vertex_data[11] = {(float) _ievent, vx, vy, vz, ntracks, gvx, gvy, gvz, gvt, gntracks, nfromtruth }; /* cout << "vertex: " << " ievent " << vertex_data[0] << " vx " << vertex_data[1] << " vy " << vertex_data[2] << " vz " << vertex_data[3] << endl; */ _ntp_vertex->Fill(vertex_data); } } } //----------------------- // fill the gpoint NTuple //----------------------- if (_ntp_gpoint) { //cout << "Filling ntp_gpoint " << endl; SvtxVertexMap* vertexmap = findNode::getClass<SvtxVertexMap>(topNode,"SvtxVertexMap"); PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo"); if (vertexmap && truthinfo) { PHG4VtxPoint* point = truthinfo->GetPrimaryVtx(truthinfo->GetPrimaryVertexIndex()); if (point) { SvtxVertex* vertex = vertexeval->best_vertex_from(point); float gvx = point->get_x(); float gvy = point->get_y(); float gvz = point->get_z(); float gvt = point->get_t(); float gntracks = truthinfo->GetNumPrimaryVertexParticles(); float vx = NAN; float vy = NAN; float vz = NAN; float ntracks = NAN; float nfromtruth = NAN; if (vertex) { vx = vertex->get_x(); vy = vertex->get_y(); vz = vertex->get_z(); ntracks = vertex->size_tracks(); nfromtruth = vertexeval->get_ntracks_contribution(vertex,point); } float gpoint_data[11] = {(float) _ievent, gvx, gvy, gvz, gvt, gntracks, vx, vy, vz, ntracks, nfromtruth }; _ntp_gpoint->Fill(gpoint_data); } } } //--------------------- // fill the G4hit NTuple //--------------------- if (_ntp_g4hit) { //cout << "Filling ntp_g4hit " << endl; std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits(); for (std::set<PHG4Hit*>::iterator iter = g4hits.begin(); iter != g4hits.end(); ++iter) { PHG4Hit *g4hit = *iter; PHG4Particle *g4particle = trutheval->get_particle(g4hit); float g4hitID = g4hit->get_hit_id(); float gx = g4hit->get_avg_x(); float gy = g4hit->get_avg_y(); float gz = g4hit->get_avg_z(); float gt = g4hit->get_avg_t(); float gedep = g4hit->get_edep(); float glayer = g4hit->get_layer(); float gtrackID = g4hit->get_trkid(); float gflavor = NAN; float gpx = NAN; float gpy = NAN; float gpz = NAN; float gvx = NAN; float gvy = NAN; float gvz = NAN; float gembed = NAN; float gprimary = NAN; float gfpx = 0.; float gfpy = 0.; float gfpz = 0.; float gfx = 0.; float gfy = 0.; float gfz = 0.; if (g4particle) { if (_scan_for_embedded) { if (trutheval->get_embed(g4particle) == 0) continue; } gflavor = g4particle->get_pid(); gpx = g4particle->get_px(); gpy = g4particle->get_py(); gpz = g4particle->get_pz(); PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle); if (vtx) { gvx = vtx->get_x(); gvy = vtx->get_y(); gvz = vtx->get_z(); } PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); if (outerhit) { gfpx = outerhit->get_px(1); gfpy = outerhit->get_py(1); gfpz = outerhit->get_pz(1); gfx = outerhit->get_x(1); gfy = outerhit->get_y(1); gfz = outerhit->get_z(1); } gembed = trutheval->get_embed(g4particle); gprimary = trutheval->is_primary(g4particle); } // if (g4particle) std::set<SvtxCluster*> clusters = clustereval->all_clusters_from(g4hit); float nclusters = clusters.size(); // best cluster reco'd SvtxCluster* cluster = clustereval->best_cluster_from(g4hit); float clusID = NAN; float x = NAN; float y = NAN; float z = NAN; float e = NAN; float adc = NAN; float layer = NAN; float size = NAN; float phisize = NAN; float zsize = NAN; float efromtruth = NAN; if (cluster) { clusID = cluster->get_id(); x = cluster->get_x(); y = cluster->get_y(); z = cluster->get_z(); e = cluster->get_e(); adc = cluster->get_adc(); layer = cluster->get_layer(); size = cluster->size_hits(); phisize = cluster->get_phi_size(); zsize = cluster->get_z_size(); if (g4particle) { efromtruth = clustereval->get_energy_contribution(cluster,g4particle); } } float g4hit_data[36] = {(float) _ievent, g4hitID, gx, gy, gz, gt, gedep, glayer, gtrackID, gflavor, gpx, gpy, gpz, gvx, gvy, gvz, gfpx, gfpy, gfpz, gfx, gfy, gfz, gembed, gprimary, nclusters, clusID, x, y, z, e, adc, layer, size, phisize, zsize, efromtruth }; _ntp_g4hit->Fill(g4hit_data); } } //-------------------- // fill the Hit NTuple //-------------------- if (_ntp_hit) { //cout << "Filling ntp_hit " << endl; // need things off of the DST... SvtxHitMap* hitmap = findNode::getClass<SvtxHitMap>(topNode,"SvtxHitMap"); if (hitmap) { for (SvtxHitMap::Iter iter = hitmap->begin(); iter != hitmap->end(); ++iter) { SvtxHit* hit = iter->second; PHG4Hit* g4hit = hiteval->max_truth_hit_by_energy(hit); PHG4CylinderCell* g4cell = hiteval->get_cell(hit); PHG4Particle* g4particle = trutheval->get_particle(g4hit); float event = _ievent; float hitID = hit->get_id(); float e = hit->get_e(); float adc = hit->get_adc(); float layer = hit->get_layer(); float cellID = hit->get_cellid(); float ecell = g4cell->get_edep(); float g4hitID = NAN; float gedep = NAN; float gx = NAN; float gy = NAN; float gz = NAN; float gt = NAN; float gtrackID = NAN; float gflavor = NAN; float gpx = NAN; float gpy = NAN; float gpz = NAN; float gvx = NAN; float gvy = NAN; float gvz = NAN; float gfpx = NAN; float gfpy = NAN; float gfpz = NAN; float gfx = NAN; float gfy = NAN; float gfz = NAN; float gembed = NAN; float gprimary = NAN; float efromtruth = NAN; if (g4hit) { g4hitID = g4hit->get_hit_id(); gedep = g4hit->get_edep(); gx = g4hit->get_avg_x(); gy = g4hit->get_avg_y(); gz = g4hit->get_avg_z(); gt = g4hit->get_avg_t(); if (g4particle) { if (_scan_for_embedded) { if (trutheval->get_embed(g4particle) == 0) continue; } gtrackID = g4particle->get_track_id(); gflavor = g4particle->get_pid(); gpx = g4particle->get_px(); gpy = g4particle->get_py(); gpz = g4particle->get_pz(); PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle); if (vtx) { gvx = vtx->get_x(); gvy = vtx->get_y(); gvz = vtx->get_z(); } PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); if (outerhit) { gfpx = outerhit->get_px(1); gfpy = outerhit->get_py(1); gfpz = outerhit->get_pz(1); gfx = outerhit->get_x(1); gfy = outerhit->get_y(1); gfz = outerhit->get_z(1); } gembed = trutheval->get_embed(g4particle); gprimary = trutheval->is_primary(g4particle); } // if (g4particle){ } if (g4particle) { efromtruth = hiteval->get_energy_contribution(hit,g4particle); } float hit_data[33] = { event, hitID, e, adc, layer, cellID, ecell, g4hitID, gedep, gx, gy, gz, gt, gtrackID, gflavor, gpx, gpy, gpz, gvx, gvy, gvz, gfpx, gfpy, gfpz, gfx, gfy, gfz, gembed, gprimary, efromtruth }; _ntp_hit->Fill(hit_data); } } } //------------------------ // fill the Cluster NTuple //------------------------ //cout << "check for ntp_cluster" << endl; if (_ntp_cluster && !_scan_for_embedded) { //cout << "Filling ntp_cluster 1 " << endl; // need things off of the DST... SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap"); if (clustermap) { for (SvtxClusterMap::Iter iter = clustermap->begin(); iter != clustermap->end(); ++iter) { SvtxCluster* cluster = iter->second; SvtxTrack* track = trackeval->best_track_from(cluster); PHG4Hit *g4hit = clustereval->max_truth_hit_by_energy(cluster); PHG4Particle *g4particle = trutheval->get_particle(g4hit); float hitID = cluster->get_id(); float x = cluster->get_x(); float y = cluster->get_y(); float z = cluster->get_z(); float ex = sqrt(cluster->get_error(0,0)); float ey = sqrt(cluster->get_error(1,1)); float ez = cluster->get_z_error(); float ephi = cluster->get_phi_error(); float e = cluster->get_e(); float adc = cluster->get_adc(); float layer = cluster->get_layer(); float size = cluster->size_hits(); float phisize = cluster->get_phi_size(); float zsize = cluster->get_z_size(); float trackID = NAN; if (track) trackID = track->get_id(); float g4hitID = NAN; float gx = NAN; float gy = NAN; float gz = NAN; float gt = NAN; float gtrackID = NAN; float gflavor = NAN; float gpx = NAN; float gpy = NAN; float gpz = NAN; float gvx = NAN; float gvy = NAN; float gvz = NAN; float gfpx = NAN; float gfpy = NAN; float gfpz = NAN; float gfx = NAN; float gfy = NAN; float gfz = NAN; float gembed = NAN; float gprimary = NAN; float efromtruth = NAN; if (g4hit) { g4hitID = g4hit->get_hit_id(); gx = g4hit->get_avg_x(); gy = g4hit->get_avg_y(); gz = g4hit->get_avg_z(); gt = g4hit->get_avg_t(); if (g4particle) { gtrackID = g4particle->get_track_id(); gflavor = g4particle->get_pid(); gpx = g4particle->get_px(); gpy = g4particle->get_py(); gpz = g4particle->get_pz(); PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle); if (vtx) { gvx = vtx->get_x(); gvy = vtx->get_y(); gvz = vtx->get_z(); } PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); if (outerhit) { gfpx = outerhit->get_px(1); gfpy = outerhit->get_py(1); gfpz = outerhit->get_pz(1); gfx = outerhit->get_x(1); gfy = outerhit->get_y(1); gfz = outerhit->get_z(1); } gembed = trutheval->get_embed(g4particle); gprimary = trutheval->is_primary(g4particle); } // if (g4particle){ } // if (g4hit) { if (g4particle){ efromtruth = clustereval->get_energy_contribution(cluster,g4particle); } float cluster_data[38] = {(float) _ievent, hitID, x, y, z, ex, ey, ez, ephi, e, adc, layer, size, phisize, zsize, trackID, g4hitID, gx, gy, gz, gt, gtrackID, gflavor, gpx, gpy, gpz, gvx, gvy, gvz, gfpx, gfpy, gfpz, gfx, gfy, gfz, gembed, gprimary, efromtruth}; _ntp_cluster->Fill(cluster_data); } } } else if (_ntp_cluster && _scan_for_embedded) { //cout << "Filling ntp_cluster 2 " << endl; // if only scanning embedded signals, loop over all the tracks from // embedded particles and report all of their clusters, including those // from other sources (noise hits on the embedded track) // need things off of the DST... SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode,"SvtxTrackMap"); SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap"); if (trackmap) { for (SvtxTrackMap::Iter iter = trackmap->begin(); iter != trackmap->end(); ++iter) { SvtxTrack* track = iter->second; PHG4Particle* truth = trackeval->max_truth_particle_by_nclusters(track); if (truth) { if (trutheval->get_embed(truth) == 0) continue; } for (SvtxTrack::ConstClusterIter iter = track->begin_clusters(); iter != track->end_clusters(); ++iter) { unsigned int cluster_id = *iter; SvtxCluster* cluster = clustermap->get(cluster_id); PHG4Hit *g4hit = clustereval->max_truth_hit_by_energy(cluster); PHG4Particle *g4particle = trutheval->get_particle(g4hit); float hitID = cluster->get_id(); float x = cluster->get_x(); float y = cluster->get_y(); float z = cluster->get_z(); float ex = sqrt(cluster->get_error(0,0)); float ey = sqrt(cluster->get_error(1,1)); float ez = cluster->get_z_error(); float ephi = cluster->get_phi_error(); float e = cluster->get_e(); float adc = cluster->get_adc(); float layer = cluster->get_layer(); float size = cluster->size_hits(); float phisize = cluster->get_phi_size(); float zsize = cluster->get_z_size(); float trackID = NAN; if (track) trackID = track->get_id(); float g4hitID = NAN; float gx = NAN; float gy = NAN; float gz = NAN; float gt = NAN; float gtrackID = NAN; float gflavor = NAN; float gpx = NAN; float gpy = NAN; float gpz = NAN; float gvx = NAN; float gvy = NAN; float gvz = NAN; float gfpx = NAN; float gfpy = NAN; float gfpz = NAN; float gfx = NAN; float gfy = NAN; float gfz = NAN; float gembed = NAN; float gprimary = NAN; float efromtruth = NAN; if (g4hit) { g4hitID = g4hit->get_hit_id(); gx = g4hit->get_avg_x(); gy = g4hit->get_avg_y(); gz = g4hit->get_avg_z(); gt = g4hit->get_avg_t(); if (g4particle) { gtrackID = g4particle->get_track_id(); gflavor = g4particle->get_pid(); gpx = g4particle->get_px(); gpy = g4particle->get_py(); gpz = g4particle->get_pz(); PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle); if (vtx) { gvx = vtx->get_x(); gvy = vtx->get_y(); gvz = vtx->get_z(); } PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); if (outerhit) { gfpx = outerhit->get_px(1); gfpy = outerhit->get_py(1); gfpz = outerhit->get_pz(1); gfx = outerhit->get_x(1); gfy = outerhit->get_y(1); gfz = outerhit->get_z(1); } gembed = trutheval->get_embed(g4particle); gprimary = trutheval->is_primary(g4particle); } // if (g4particle){ } // if (g4hit) { if (g4particle){ efromtruth = clustereval->get_energy_contribution(cluster,g4particle); } float cluster_data[38] = {(float) _ievent, hitID, x, y, z, ex, ey, ez, ephi, e, adc, layer, size, phisize, zsize, trackID, g4hitID, gx, gy, gz, gt, gtrackID, gflavor, gpx, gpy, gpz, gvx, gvy, gvz, gfpx, gfpy, gfpz, gfx, gfy, gfz, gembed, gprimary, efromtruth}; _ntp_cluster->Fill(cluster_data); } } } } //------------------------ // fill the Gtrack NTuple //------------------------ // need things off of the DST... //cout << "check for ntp_gtrack" << endl; if (_ntp_gtrack) { //cout << "Filling ntp_gtrack " << endl; PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo"); SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap"); if (truthinfo) { PHG4TruthInfoContainer::ConstRange range = truthinfo->GetPrimaryParticleRange(); for (PHG4TruthInfoContainer::ConstIterator iter = range.first; iter != range.second; ++iter) { PHG4Particle* g4particle = iter->second; if (_scan_for_embedded) { if (trutheval->get_embed(g4particle) == 0) continue; } float gtrackID = g4particle->get_track_id(); float gflavor = g4particle->get_pid(); std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits(g4particle); float ng4hits = g4hits.size(); float gpx = g4particle->get_px(); float gpy = g4particle->get_py(); float gpz = g4particle->get_pz(); PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle); float gvx = vtx->get_x(); float gvy = vtx->get_y(); float gvz = vtx->get_z(); float gvt = vtx->get_t(); float gfpx = 0.; float gfpy = 0.; float gfpz = 0.; float gfx = 0.; float gfy = 0.; float gfz = 0.; PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); if (outerhit) { gfpx = outerhit->get_px(1); gfpy = outerhit->get_py(1); gfpz = outerhit->get_pz(1); gfx = outerhit->get_x(1); gfy = outerhit->get_y(1); gfz = outerhit->get_z(1); } float gembed = trutheval->get_embed(g4particle); float gprimary = trutheval->is_primary(g4particle); SvtxTrack* track = trackeval->best_track_from(g4particle); float trackID = NAN; float charge = NAN; float quality = NAN; float chisq = NAN; float ndf = NAN; float nhits = NAN; unsigned int layers = 0x0; float dca2d = NAN; float dca2dsigma = NAN; float px = NAN; float py = NAN; float pz = NAN; float pcax = NAN; float pcay = NAN; float pcaz = NAN; float nfromtruth = NAN; float layersfromtruth = NAN; if (track) { trackID = track->get_id(); charge = track->get_charge(); quality = track->get_quality(); chisq = track->get_chisq(); ndf = track->get_ndf(); nhits = track->size_clusters(); for (SvtxTrack::ConstClusterIter iter = track->begin_clusters(); iter != track->end_clusters(); ++iter) { unsigned int cluster_id = *iter; SvtxCluster* cluster = clustermap->get(cluster_id); unsigned int layer = cluster->get_layer(); if (layer < 32) layers |= (0x1 << layer); } dca2d = track->get_dca2d(); dca2dsigma = track->get_dca2d_error(); px = track->get_px(); py = track->get_py(); pz = track->get_pz(); pcax = track->get_x(); pcay = track->get_y(); pcaz = track->get_z(); nfromtruth = trackeval->get_nclusters_contribution(track,g4particle); layersfromtruth = trackeval->get_nclusters_contribution_by_layer(track,g4particle); } float gtrack_data[36] = {(float) _ievent, gtrackID, gflavor, ng4hits, gpx, gpy, gpz, gvx, gvy, gvz, gvt, gfpx, gfpy, gfpz, gfx, gfy, gfz, gembed, gprimary, trackID, px, py, pz, charge, quality, chisq, ndf, nhits, (float) layers, dca2d, dca2dsigma, pcax, pcay, pcaz, nfromtruth, layersfromtruth }; /* cout << " ievent " << _ievent << " gtrackID " << gtrackID << " gflavor " << gflavor << " ng4hits " << ng4hits << endl; */ _ntp_gtrack->Fill(gtrack_data); } } } //------------------------ // fill the Track NTuple //------------------------ if (_ntp_track) { //cout << "Filling ntp_track " << endl; // need things off of the DST... SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode,"SvtxTrackMap"); SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap"); if (trackmap) { for (SvtxTrackMap::Iter iter = trackmap->begin(); iter != trackmap->end(); ++iter) { SvtxTrack* track = iter->second; float trackID = track->get_id(); float charge = track->get_charge(); float quality = track->get_quality(); float chisq = track->get_chisq(); float ndf = track->get_ndf(); float nhits = track->size_clusters(); unsigned int layers = 0x0; for (SvtxTrack::ConstClusterIter iter = track->begin_clusters(); iter != track->end_clusters(); ++iter) { unsigned int cluster_id = *iter; SvtxCluster* cluster = clustermap->get(cluster_id); unsigned int layer = cluster->get_layer(); if (layer < 31) layers |= (0x1 << layer); } float dca2d = track->get_dca2d(); float dca2dsigma = track->get_dca2d_error(); float px = track->get_px(); float py = track->get_py(); float pz = track->get_pz(); float pcax = track->get_x(); float pcay = track->get_y(); float pcaz = track->get_z(); float presdphi = track->get_cal_dphi(SvtxTrack::PRES); float presdeta = track->get_cal_deta(SvtxTrack::PRES); float prese3x3 = track->get_cal_energy_3x3(SvtxTrack::PRES); float prese = track->get_cal_cluster_e(SvtxTrack::PRES); float cemcdphi = track->get_cal_dphi(SvtxTrack::CEMC); float cemcdeta = track->get_cal_deta(SvtxTrack::CEMC); float cemce3x3 = track->get_cal_energy_3x3(SvtxTrack::CEMC); float cemce = track->get_cal_cluster_e(SvtxTrack::CEMC); float hcalindphi = track->get_cal_dphi(SvtxTrack::HCALIN); float hcalindeta = track->get_cal_deta(SvtxTrack::HCALIN); float hcaline3x3 = track->get_cal_energy_3x3(SvtxTrack::HCALIN); float hcaline = track->get_cal_cluster_e(SvtxTrack::HCALIN); float hcaloutdphi = track->get_cal_dphi(SvtxTrack::HCALOUT); float hcaloutdeta = track->get_cal_deta(SvtxTrack::HCALOUT); float hcaloute3x3 = track->get_cal_energy_3x3(SvtxTrack::HCALOUT); float hcaloute = track->get_cal_cluster_e(SvtxTrack::HCALOUT); float gtrackID = NAN; float gflavor = NAN; float ng4hits = NAN; float gpx = NAN; float gpy = NAN; float gpz = NAN; float gvx = NAN; float gvy = NAN; float gvz = NAN; float gvt = NAN; float gfpx = NAN; float gfpy = NAN; float gfpz = NAN; float gfx = NAN; float gfy = NAN; float gfz = NAN; float gembed = NAN; float gprimary = NAN; float nfromtruth = NAN; float layersfromtruth = NAN; PHG4Particle* g4particle = trackeval->max_truth_particle_by_nclusters(track); if (g4particle) { if (_scan_for_embedded) { if (trutheval->get_embed(g4particle) == 0) continue; } gtrackID = g4particle->get_track_id(); gflavor = g4particle->get_pid(); std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits(g4particle); ng4hits = g4hits.size(); gpx = g4particle->get_px(); gpy = g4particle->get_py(); gpz = g4particle->get_pz(); PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle); gvx = vtx->get_x(); gvy = vtx->get_y(); gvz = vtx->get_z(); gvt = vtx->get_t(); PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); if (outerhit) { gfpx = outerhit->get_px(1); gfpy = outerhit->get_py(1); gfpz = outerhit->get_pz(1); gfx = outerhit->get_x(1); gfy = outerhit->get_y(1); gfz = outerhit->get_z(1); } gembed = trutheval->get_embed(g4particle); gprimary = trutheval->is_primary(g4particle); nfromtruth = trackeval->get_nclusters_contribution(track,g4particle); layersfromtruth = trackeval->get_nclusters_contribution_by_layer(track,g4particle); } float track_data[52] = {(float) _ievent, trackID, px, py, pz, charge, quality, chisq, ndf, nhits, (float) layers, dca2d, dca2dsigma, pcax, pcay, pcaz, presdphi, presdeta, prese3x3, prese, cemcdphi, cemcdeta, cemce3x3, cemce, hcalindphi, hcalindeta, hcaline3x3, hcaline, hcaloutdphi, hcaloutdeta, hcaloute3x3, hcaloute, gtrackID, gflavor, ng4hits, gpx, gpy, gpz, gvx, gvy, gvz, gvt, gfpx, gfpy, gfpz, gfx, gfy, gfz, gembed, gprimary, nfromtruth, layersfromtruth }; /* cout << "ievent " << _ievent << " trackID " << trackID << " nhits " << nhits << " px " << px << " py " << py << " pz " << pz << " gembed " << gembed << " gprimary " << gprimary << endl; */ _ntp_track->Fill(track_data); } } } return; }
void SvtxEvaluator::printOutputInfo(PHCompositeNode *topNode) { if (verbosity > 1) cout << "SvtxEvaluator::printOutputInfo() entered" << endl; //========================================== // print out some useful stuff for debugging //========================================== if (verbosity > 0) { SvtxTrackEval* trackeval = _svtxevalstack->get_track_eval(); SvtxClusterEval* clustereval = _svtxevalstack->get_cluster_eval(); SvtxTruthEval* trutheval = _svtxevalstack->get_truth_eval(); // event information cout << endl; cout << PHWHERE << " NEW OUTPUT FOR EVENT " << _ievent << endl; cout << endl; PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo"); PHG4VtxPoint *gvertex = truthinfo->GetPrimaryVtx( truthinfo->GetPrimaryVertexIndex() ); float gvx = gvertex->get_x(); float gvy = gvertex->get_y(); float gvz = gvertex->get_z(); float vx = NAN; float vy = NAN; float vz = NAN; SvtxVertexMap* vertexmap = findNode::getClass<SvtxVertexMap>(topNode,"SvtxVertexMap"); if (vertexmap) { if (!vertexmap->empty()) { SvtxVertex* vertex = (vertexmap->begin()->second); vx = vertex->get_x(); vy = vertex->get_y(); vz = vertex->get_z(); } } cout << "===Vertex Reconstruction=======================" << endl; cout << "vtrue = (" << gvx << "," << gvy << "," << gvz << ") => vreco = (" << vx << "," << vy << "," << vz << ")" << endl; cout << endl; cout << "===Tracking Summary============================" << endl; unsigned int ng4hits[100] = {0}; std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits(); for (std::set<PHG4Hit*>::iterator iter = g4hits.begin(); iter != g4hits.end(); ++iter) { PHG4Hit *g4hit = *iter; ++ng4hits[g4hit->get_layer()]; } SvtxHitMap* hitmap = findNode::getClass<SvtxHitMap>(topNode,"SvtxHitMap"); unsigned int nhits[100] = {0}; if (hitmap) { for (SvtxHitMap::Iter iter = hitmap->begin(); iter != hitmap->end(); ++iter) { SvtxHit* hit = iter->second; ++nhits[hit->get_layer()]; } } SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap"); unsigned int nclusters[100] = {0}; if (clustermap) { for (SvtxClusterMap::Iter iter = clustermap->begin(); iter != clustermap->end(); ++iter) { SvtxCluster* cluster = iter->second; ++nclusters[cluster->get_layer()]; } } for (unsigned int ilayer = 0; ilayer < 100; ++ilayer) { cout << "layer " << ilayer << ": nG4hits = " << ng4hits[ilayer] << " => nHits = " << nhits[ilayer] << " => nClusters = " << nclusters[ilayer] << endl; } SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode,"SvtxTrackMap"); cout << "nGtracks = " << std::distance(truthinfo->GetPrimaryParticleRange().first, truthinfo->GetPrimaryParticleRange().second); cout << " => nTracks = "; if (trackmap) cout << trackmap->size() << endl; else cout << 0 << endl; // cluster wise information if (verbosity > 1) { for(std::set<PHG4Hit*>::iterator iter = g4hits.begin(); iter != g4hits.end(); ++iter) { PHG4Hit *g4hit = *iter; cout << endl; cout << "===PHG4Hit===================================" << endl; cout << " PHG4Hit: "; g4hit->identify(); std::set<SvtxCluster*> clusters = clustereval->all_clusters_from(g4hit); for (std::set<SvtxCluster*>::iterator jter = clusters.begin(); jter != clusters.end(); ++jter) { SvtxCluster *cluster = *jter; cout << "===Created-SvtxCluster================" << endl; cout << "SvtxCluster: "; cluster->identify(); } } PHG4TruthInfoContainer::ConstRange range = truthinfo->GetPrimaryParticleRange(); for (PHG4TruthInfoContainer::ConstIterator iter = range.first; iter != range.second; ++iter) { PHG4Particle *particle = iter->second; // track-wise information cout << endl; cout << "=== Gtrack ===================================================" << endl; cout << " PHG4Particle id = " << particle->get_track_id() << endl; particle->identify(); cout << " ptrue = ("; cout.width(5); cout << particle->get_px(); cout << ","; cout.width(5); cout << particle->get_py(); cout << ","; cout.width(5); cout << particle->get_pz(); cout << ")" << endl; cout << " vtrue = ("; cout.width(5); cout << truthinfo->GetVtx(particle->get_vtx_id())->get_x(); cout << ","; cout.width(5); cout << truthinfo->GetVtx(particle->get_vtx_id())->get_y(); cout << ","; cout.width(5); cout << truthinfo->GetVtx(particle->get_vtx_id())->get_z(); cout << ")" << endl; cout << " pt = " << sqrt(pow(particle->get_px(),2)+pow(particle->get_py(),2)) << endl; cout << " phi = " << atan2(particle->get_py(),particle->get_px()) << endl; cout << " eta = " << asinh(particle->get_pz()/sqrt(pow(particle->get_px(),2)+pow(particle->get_py(),2))) << endl; cout << " embed flag = " << truthinfo->isEmbeded(particle->get_track_id()) << endl; cout << " ---Associated-PHG4Hits-----------------------------------------" << endl; std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits(particle); for(std::set<PHG4Hit*>::iterator jter = g4hits.begin(); jter != g4hits.end(); ++jter) { PHG4Hit *g4hit = *jter; float x = 0.5*(g4hit->get_x(0)+g4hit->get_x(1)); float y = 0.5*(g4hit->get_y(0)+g4hit->get_y(1)); float z = 0.5*(g4hit->get_z(0)+g4hit->get_z(1)); cout << " #" << g4hit->get_hit_id() << " xtrue = ("; cout.width(5); cout << x; cout << ","; cout.width(5); cout << y; cout << ","; cout.width(5); cout << z; cout << ")"; std::set<SvtxCluster*> clusters = clustereval->all_clusters_from(g4hit); for (std::set<SvtxCluster*>::iterator kter = clusters.begin(); kter != clusters.end(); ++kter) { SvtxCluster *cluster = *kter; float x = cluster->get_x(); float y = cluster->get_y(); float z = cluster->get_z(); cout << " => #" << cluster->get_id(); cout << " xreco = ("; cout.width(5); cout << x; cout << ","; cout.width(5); cout << y; cout << ","; cout.width(5); cout << z; cout << ")"; } cout << endl; } if (trackmap&&clustermap) { std::set<SvtxTrack*> tracks = trackeval->all_tracks_from(particle); for (std::set<SvtxTrack*>::iterator jter = tracks.begin(); jter != tracks.end(); ++jter) { SvtxTrack *track = *jter; float px = track->get_px(); float py = track->get_py(); float pz = track->get_pz(); cout << "===Created-SvtxTrack==========================================" << endl; cout << " SvtxTrack id = " << track->get_id() << endl; cout << " preco = ("; cout.width(5); cout << px; cout << ","; cout.width(5); cout << py; cout << ","; cout.width(5); cout << pz; cout << ")" << endl; cout << " quality = " << track->get_quality() << endl; cout << " nfromtruth = " << trackeval->get_nclusters_contribution(track,particle) << endl; cout << " ---Associated-SvtxClusters-to-PHG4Hits-------------------------" << endl; for (SvtxTrack::ConstClusterIter iter = track->begin_clusters(); iter != track->end_clusters(); ++iter) { unsigned int cluster_id = *iter; SvtxCluster* cluster = clustermap->get(cluster_id); float x = cluster->get_x(); float y = cluster->get_y(); float z = cluster->get_z(); cout << " #" << cluster->get_id() << " xreco = ("; cout.width(5); cout << x; cout << ","; cout.width(5); cout << y; cout << ","; cout.width(5); cout << z; cout << ") =>"; PHG4Hit* g4hit = clustereval->max_truth_hit_by_energy(cluster); if ((g4hit) && (g4hit->get_trkid() == particle->get_track_id())) { x = 0.5*(g4hit->get_x(0)+g4hit->get_x(1)); y = 0.5*(g4hit->get_y(0)+g4hit->get_y(1)); z = 0.5*(g4hit->get_z(0)+g4hit->get_z(1)); cout << " #" << g4hit->get_hit_id() << " xtrue = ("; cout.width(5); cout << x; cout << ","; cout.width(5); cout << y; cout << ","; cout.width(5); cout << z; cout << ") => Gtrack id = " << g4hit->get_trkid(); } else { cout << " noise hit"; } } cout << endl; } } } } cout << endl; } // if verbosity return; }
void SvtxEvaluator::fillOutputNtuples(PHCompositeNode *topNode) { if (verbosity > 1) cout << "SvtxEvaluator::fillOutputNtuples() entered" << endl; SvtxVertexEval* vertexeval = _svtxevalstack->get_vertex_eval(); SvtxTrackEval* trackeval = _svtxevalstack->get_track_eval(); SvtxClusterEval* clustereval = _svtxevalstack->get_cluster_eval(); SvtxHitEval* hiteval = _svtxevalstack->get_hit_eval(); SvtxTruthEval* trutheval = _svtxevalstack->get_truth_eval(); //----------------------- // fill the Vertex NTuple //----------------------- if (_ntp_vertex) { SvtxVertexMap* vertexmap = findNode::getClass<SvtxVertexMap>(topNode,"SvtxVertexMap"); PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo"); if (vertexmap && truthinfo) { for (SvtxVertexMap::Iter iter = vertexmap->begin(); iter != vertexmap->end(); ++iter) { SvtxVertex* vertex = iter->second; PHG4VtxPoint* point = vertexeval->max_truth_point_by_ntracks(vertex); float vx = vertex->get_x(); float vy = vertex->get_y(); float vz = vertex->get_z(); float ntracks = vertex->size_tracks(); float gvx = NAN; float gvy = NAN; float gvz = NAN; float gntracks = truthinfo->GetNumPrimaryVertexParticles(); float nfromtruth = NAN; if (point) { gvx = point->get_x(); gvy = point->get_y(); gvz = point->get_z(); gntracks = truthinfo->GetNumPrimaryVertexParticles(); nfromtruth = vertexeval->get_ntracks_contribution(vertex,point); } float vertex_data[10] = {_ievent, vx, vy, vz, ntracks, gvx, gvy, gvz, gntracks, nfromtruth }; _ntp_vertex->Fill(vertex_data); } } } //----------------------- // fill the gpoint NTuple //----------------------- if (_ntp_gpoint) { SvtxVertexMap* vertexmap = findNode::getClass<SvtxVertexMap>(topNode,"SvtxVertexMap"); PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo"); if (vertexmap && truthinfo) { PHG4VtxPoint* point = truthinfo->GetPrimaryVtx(truthinfo->GetPrimaryVertexIndex()); SvtxVertex* vertex = vertexeval->best_vertex_from(point); float gvx = point->get_x(); float gvy = point->get_y(); float gvz = point->get_z(); float gntracks = truthinfo->GetNumPrimaryVertexParticles(); float vx = NAN; float vy = NAN; float vz = NAN; float ntracks = NAN; float nfromtruth = NAN; if (vertex) { vx = vertex->get_x(); vy = vertex->get_y(); vz = vertex->get_z(); ntracks = vertex->size_tracks(); nfromtruth = vertexeval->get_ntracks_contribution(vertex,point); } float gpoint_data[10] = {_ievent, gvx, gvy, gvz, gntracks, vx, vy, vz, ntracks, nfromtruth }; _ntp_gpoint->Fill(gpoint_data); } } //--------------------- // fill the G4hit NTuple //--------------------- if (_ntp_g4hit) { std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits(); for (std::set<PHG4Hit*>::iterator iter = g4hits.begin(); iter != g4hits.end(); ++iter) { PHG4Hit *g4hit = *iter; PHG4Particle *g4particle = trutheval->get_particle(g4hit); float g4hitID = g4hit->get_hit_id(); float gx = 0.5*(g4hit->get_x(0)+g4hit->get_x(1)); float gy = 0.5*(g4hit->get_y(0)+g4hit->get_y(1)); float gz = 0.5*(g4hit->get_z(0)+g4hit->get_z(1)); float gedep = g4hit->get_edep(); float glayer = g4hit->get_layer(); float gtrackID = g4hit->get_trkid(); float gflavor = NAN; float gpx = NAN; float gpy = NAN; float gpz = NAN; float gvx = NAN; float gvy = NAN; float gvz = NAN; float gembed = NAN; float gprimary = NAN; float gfpx = NULL; float gfpy = NULL; float gfpz = NULL; float gfx = NULL; float gfy = NULL; float gfz = NULL; if (g4particle) { gflavor = g4particle->get_pid(); gpx = g4particle->get_px(); gpy = g4particle->get_py(); gpz = g4particle->get_pz(); PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle); if (vtx) { gvx = vtx->get_x(); gvy = vtx->get_y(); gvz = vtx->get_z(); } PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); if (outerhit) { gfpx = outerhit->get_px(1); gfpy = outerhit->get_py(1); gfpz = outerhit->get_pz(1); gfx = outerhit->get_x(1); gfy = outerhit->get_y(1); gfz = outerhit->get_z(1); } gembed = trutheval->get_embed(g4particle); gprimary = trutheval->is_primary(g4particle); } // if (g4particle) std::set<SvtxCluster*> clusters = clustereval->all_clusters_from(g4hit); float nclusters = clusters.size(); // best cluster reco'd SvtxCluster* cluster = clustereval->best_cluster_from(g4hit); float clusID = NAN; float x = NAN; float y = NAN; float z = NAN; float e = NAN; float adc = NAN; float layer = NAN; float size = NAN; float phisize = NAN; float zsize = NAN; float efromtruth = NAN; if (cluster) { clusID = cluster->get_id(); x = cluster->get_x(); y = cluster->get_y(); z = cluster->get_z(); e = cluster->get_e(); adc = cluster->get_adc(); layer = cluster->get_layer(); size = cluster->size_hits(); phisize = cluster->get_phi_size(); zsize = cluster->get_z_size(); if (g4particle) { efromtruth = clustereval->get_energy_contribution(cluster,g4particle); } } float g4hit_data[35] = {_ievent, g4hitID, gx, gy, gz, gedep, glayer, gtrackID, gflavor, gpx, gpy, gpz, gvx, gvy, gvz, gfpx, gfpy, gfpz, gfx, gfy, gfz, gembed, gprimary, nclusters, clusID, x, y, z, e, adc, layer, size, phisize, zsize, efromtruth }; _ntp_g4hit->Fill(g4hit_data); } } //-------------------- // fill the Hit NTuple //-------------------- if (_ntp_hit) { // need things off of the DST... SvtxHitMap* hitmap = findNode::getClass<SvtxHitMap>(topNode,"SvtxHitMap"); if (hitmap) { for (SvtxHitMap::Iter iter = hitmap->begin(); iter != hitmap->end(); ++iter) { SvtxHit* hit = iter->second; PHG4Hit* g4hit = hiteval->max_truth_hit_by_energy(hit); PHG4CylinderCell* g4cell = hiteval->get_cell(hit); PHG4Particle* g4particle = trutheval->get_particle(g4hit); float event = _ievent; float hitID = hit->get_id(); float e = hit->get_e(); float adc = hit->get_adc(); float layer = hit->get_layer(); float cellID = hit->get_cellid(); float ecell = g4cell->get_edep(); float g4hitID = NAN; float gedep = NAN; float gx = NAN; float gy = NAN; float gz = NAN; float gtrackID = NAN; float gflavor = NAN; float gpx = NAN; float gpy = NAN; float gpz = NAN; float gvx = NAN; float gvy = NAN; float gvz = NAN; float gfpx = NAN; float gfpy = NAN; float gfpz = NAN; float gfx = NAN; float gfy = NAN; float gfz = NAN; float glast = NAN; float gembed = NAN; float gprimary = NAN; float efromtruth = NAN; if (g4hit) { g4hitID = g4hit->get_hit_id(); gedep = g4hit->get_edep(); gx = 0.5*(g4hit->get_x(0)+g4hit->get_x(1)); gy = 0.5*(g4hit->get_y(0)+g4hit->get_y(1)); gz = 0.5*(g4hit->get_z(0)+g4hit->get_z(1)); gx = g4hit->get_x(0); gy = g4hit->get_y(0); gz = g4hit->get_z(0); if (g4particle) { gtrackID = g4particle->get_track_id(); gflavor = g4particle->get_pid(); gpx = g4particle->get_px(); gpy = g4particle->get_py(); gpz = g4particle->get_pz(); PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle); if (vtx) { gvx = vtx->get_x(); gvy = vtx->get_y(); gvz = vtx->get_z(); } PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); if (outerhit) { gfpx = outerhit->get_px(1); gfpy = outerhit->get_py(1); gfpz = outerhit->get_pz(1); gfx = outerhit->get_x(1); gfy = outerhit->get_y(1); gfz = outerhit->get_z(1); } glast = NAN; gembed = trutheval->get_embed(g4particle); gprimary = trutheval->is_primary(g4particle); } // if (g4particle){ } if (g4particle) { efromtruth = hiteval->get_energy_contribution(hit,g4particle); } float hit_data[32] = { event, hitID, e, adc, layer, cellID, ecell, g4hitID, gedep, gx, gy, gz, gtrackID, gflavor, gpx, gpy, gpz, gvx, gvy, gvz, gfpx, gfpy, gfpz, gfx, gfy, gfz, gembed, gprimary, efromtruth }; _ntp_hit->Fill(hit_data); } } } //------------------------ // fill the Cluster NTuple //------------------------ if (_ntp_cluster) { // need things off of the DST... SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap"); if (clustermap) { for (SvtxClusterMap::Iter iter = clustermap->begin(); iter != clustermap->end(); ++iter) { SvtxCluster* cluster = iter->second; PHG4Hit *g4hit = clustereval->max_truth_hit_by_energy(cluster); PHG4Particle *g4particle = trutheval->get_particle(g4hit); float hitID = cluster->get_id(); float x = cluster->get_x(); float y = cluster->get_y(); float z = cluster->get_z(); float e = cluster->get_e(); float adc = cluster->get_adc(); float layer = cluster->get_layer(); float size = cluster->size_hits(); float phisize = cluster->get_phi_size(); float zsize = cluster->get_z_size(); float g4hitID = NAN; float gx = NAN; float gy = NAN; float gz = NAN; float gtrackID = NAN; float gflavor = NAN; float gpx = NAN; float gpy = NAN; float gpz = NAN; float gvx = NAN; float gvy = NAN; float gvz = NAN; float gfpx = NAN; float gfpy = NAN; float gfpz = NAN; float gfx = NAN; float gfy = NAN; float gfz = NAN; float glast = NAN; float gembed = NAN; float gprimary = NAN; float nhits = NAN; float efromtruth = NAN; if (g4hit) { g4hitID = g4hit->get_hit_id(); gx = 0.5*(g4hit->get_x(0)+g4hit->get_x(1)); gy = 0.5*(g4hit->get_y(0)+g4hit->get_y(1)); gz = 0.5*(g4hit->get_z(0)+g4hit->get_z(1)); gx = g4hit->get_x(0); gy = g4hit->get_y(0); gz = g4hit->get_z(0); if (g4particle) { gtrackID = g4particle->get_track_id(); gflavor = g4particle->get_pid(); gpx = g4particle->get_px(); gpy = g4particle->get_py(); gpz = g4particle->get_pz(); PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle); if (vtx) { gvx = vtx->get_x(); gvy = vtx->get_y(); gvz = vtx->get_z(); } PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); if (outerhit) { gfpx = outerhit->get_px(1); gfpy = outerhit->get_py(1); gfpz = outerhit->get_pz(1); gfx = outerhit->get_x(1); gfy = outerhit->get_y(1); gfz = outerhit->get_z(1); } glast = NAN; gembed = trutheval->get_embed(g4particle); gprimary = trutheval->is_primary(g4particle); } // if (g4particle){ } // if (g4hit) { if (g4particle){ efromtruth = clustereval->get_energy_contribution(cluster,g4particle); } float cluster_data[33] = {_ievent, hitID, x, y, z, e, adc, layer, size, phisize, zsize, g4hitID, gx, gy, gz, gtrackID, gflavor, gpx, gpy, gpz, gvx, gvy, gvz, gfpx, gfpy, gfpz, gfx, gfy, gfz, gembed, gprimary, nhits, efromtruth}; _ntp_cluster->Fill(cluster_data); } } } //------------------------ // fill the Gtrack NTuple //------------------------ // need things off of the DST... if (_ntp_gtrack) { PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo"); SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap"); if (truthinfo) { PHG4TruthInfoContainer::ConstRange range = truthinfo->GetPrimaryParticleRange(); for (PHG4TruthInfoContainer::ConstIterator iter = range.first; iter != range.second; ++iter) { PHG4Particle* g4particle = iter->second; float gtrackID = g4particle->get_track_id(); float gflavor = g4particle->get_pid(); std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits(g4particle); float ng4hits = g4hits.size(); float gpx = g4particle->get_px(); float gpy = g4particle->get_py(); float gpz = g4particle->get_pz(); PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle); float gvx = vtx->get_x(); float gvy = vtx->get_y(); float gvz = vtx->get_z(); float gfpx = NULL; float gfpy = NULL; float gfpz = NULL; float gfx = NULL; float gfy = NULL; float gfz = NULL; PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); if (outerhit) { gfpx = outerhit->get_px(1); gfpy = outerhit->get_py(1); gfpz = outerhit->get_pz(1); gfx = outerhit->get_x(1); gfy = outerhit->get_y(1); gfz = outerhit->get_z(1); } float gembed = trutheval->get_embed(g4particle); float gprimary = trutheval->is_primary(g4particle); SvtxTrack* track = trackeval->best_track_from(g4particle); float trackID = NAN; float charge = NAN; float quality = NAN; float chisq = NAN; float ndf = NAN; float nhits = NAN; unsigned int layers = 0x0; float dca = NAN; float dca2d = NAN; float dca2dsigma = NAN; float px = NAN; float py = NAN; float pz = NAN; float pcax = NAN; float pcay = NAN; float pcaz = NAN; float nfromtruth = NAN; if (track) { trackID = track->get_id(); charge = track->get_charge(); quality = track->get_quality(); chisq = track->get_chisq(); ndf = track->get_ndf(); nhits = track->size_clusters(); for (SvtxTrack::ConstClusterIter iter = track->begin_clusters(); iter != track->end_clusters(); ++iter) { unsigned int cluster_id = *iter; SvtxCluster* cluster = clustermap->get(cluster_id); unsigned int layer = cluster->get_layer(); if (layer < 32) layers |= (0x1 << layer); } dca = track->get_dca(); dca2d = track->get_dca2d(); dca2dsigma = track->get_dca2d_error(); px = track->get_px(); py = track->get_py(); pz = track->get_pz(); pcax = track->get_x(); pcay = track->get_y(); pcaz = track->get_z(); nfromtruth = trackeval->get_nclusters_contribution(track,g4particle); } float gtrack_data[34] = {_ievent, gtrackID, gflavor, ng4hits, gpx, gpy, gpz, gvx, gvy, gvz, gfpx, gfpy, gfpz, gfx, gfy, gfz, gembed, gprimary, trackID, px, py, pz, charge, quality, chisq, ndf, nhits, layers, dca2d, dca2dsigma, pcax, pcay, pcaz, nfromtruth }; _ntp_gtrack->Fill(gtrack_data); } } } //------------------------ // fill the Track NTuple //------------------------ if (_ntp_track) { // need things off of the DST... SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode,"SvtxTrackMap"); SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap"); if (trackmap) { for (SvtxTrackMap::Iter iter = trackmap->begin(); iter != trackmap->end(); ++iter) { SvtxTrack* track = iter->second; float trackID = track->get_id(); float charge = track->get_charge(); float quality = track->get_quality(); float chisq = track->get_chisq(); float ndf = track->get_ndf(); float nhits = track->size_clusters(); unsigned int layers = 0x0; for (SvtxTrack::ConstClusterIter iter = track->begin_clusters(); iter != track->end_clusters(); ++iter) { unsigned int cluster_id = *iter; SvtxCluster* cluster = clustermap->get(cluster_id); unsigned int layer = cluster->get_layer(); if (layer < 32) layers |= (0x1 << layer); } float dca2d = track->get_dca2d(); float dca2dsigma = track->get_dca2d_error(); float px = track->get_px(); float py = track->get_py(); float pz = track->get_pz(); float pcax = track->get_x(); float pcay = track->get_y(); float pcaz = track->get_z(); float presdphi = track->get_cal_dphi(SvtxTrack::PRES); float presdeta = track->get_cal_deta(SvtxTrack::PRES); float prese3x3 = track->get_cal_energy_3x3(SvtxTrack::PRES); float prese = track->get_cal_cluster_e(SvtxTrack::PRES); float cemcdphi = track->get_cal_dphi(SvtxTrack::CEMC); float cemcdeta = track->get_cal_deta(SvtxTrack::CEMC); float cemce3x3 = track->get_cal_energy_3x3(SvtxTrack::CEMC); float cemce = track->get_cal_cluster_e(SvtxTrack::CEMC); float hcalindphi = track->get_cal_dphi(SvtxTrack::HCALIN); float hcalindeta = track->get_cal_deta(SvtxTrack::HCALIN); float hcaline3x3 = track->get_cal_energy_3x3(SvtxTrack::HCALIN); float hcaline = track->get_cal_cluster_e(SvtxTrack::HCALIN); float hcaloutdphi = track->get_cal_dphi(SvtxTrack::HCALOUT); float hcaloutdeta = track->get_cal_deta(SvtxTrack::HCALOUT); float hcaloute3x3 = track->get_cal_energy_3x3(SvtxTrack::HCALOUT); float hcaloute = track->get_cal_cluster_e(SvtxTrack::HCALOUT); float gtrackID = NAN; float gflavor = NAN; float ng4hits = NAN; float gpx = NAN; float gpy = NAN; float gpz = NAN; float gvx = NAN; float gvy = NAN; float gvz = NAN; float gfpx = NAN; float gfpy = NAN; float gfpz = NAN; float gfx = NAN; float gfy = NAN; float gfz = NAN; float gembed = NAN; float gprimary = NAN; float nfromtruth = NAN; PHG4Particle* g4particle = trackeval->max_truth_particle_by_nclusters(track); if (g4particle) { gtrackID = g4particle->get_track_id(); gflavor = g4particle->get_pid(); std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits(g4particle); ng4hits = g4hits.size(); gpx = g4particle->get_px(); gpy = g4particle->get_py(); gpz = g4particle->get_pz(); PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle); gvx = vtx->get_x(); gvy = vtx->get_y(); gvz = vtx->get_z(); PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); if (outerhit) { gfpx = outerhit->get_px(1); gfpy = outerhit->get_py(1); gfpz = outerhit->get_pz(1); gfx = outerhit->get_x(1); gfy = outerhit->get_y(1); gfz = outerhit->get_z(1); } gembed = trutheval->get_embed(g4particle); gprimary = trutheval->is_primary(g4particle); nfromtruth = trackeval->get_nclusters_contribution(track,g4particle); } float track_data[50] = {_ievent, trackID, px, py, pz, charge, quality, chisq, ndf, nhits, layers, dca2d, dca2dsigma, pcax, pcay, pcaz, presdphi, presdeta, prese3x3, prese, cemcdphi, cemcdeta, cemce3x3, cemce, hcalindphi, hcalindeta, hcaline3x3, hcaline, hcaloutdphi, hcaloutdeta, hcaloute3x3, hcaloute, gtrackID, gflavor, ng4hits, gpx, gpy, gpz, gvx, gvy, gvz, gfpx, gfpy, gfpz, gfx, gfy, gfz, gembed, gprimary, nfromtruth }; _ntp_track->Fill(track_data); } } } return; }
int PHG4GenFitTrackProjection::process_event(PHCompositeNode *topNode) { if (verbosity > 1) cout << "PHG4GenFitTrackProjection::process_event -- entered" << endl; //--------------------------------- // Get Objects off of the Node Tree //--------------------------------- // Pull the reconstructed track information off the node tree... SvtxTrackMap* _g4tracks = findNode::getClass<SvtxTrackMap>(topNode, "SvtxTrackMap"); if (!_g4tracks) { cerr << PHWHERE << " ERROR: Can't find SvtxTrackMap." << endl; return Fun4AllReturnCodes::ABORTRUN; } for (int i = 0; i < _num_cal_layers; ++i) { if (std::isnan(_cal_radii[i])) continue; if (verbosity > 1) cout << "Projecting tracks into: " << _cal_names[i] << endl; // pull the tower geometry string towergeonodename = "TOWERGEOM_" + _cal_names[i]; RawTowerGeomContainer *towergeo = findNode::getClass< RawTowerGeomContainer>(topNode, towergeonodename.c_str()); if (!towergeo) { cerr << PHWHERE << " ERROR: Can't find node " << towergeonodename << endl; return Fun4AllReturnCodes::ABORTRUN; } // pull the towers string towernodename = "TOWER_CALIB_" + _cal_names[i]; RawTowerContainer *towerList = findNode::getClass<RawTowerContainer>( topNode, towernodename.c_str()); if (!towerList) { cerr << PHWHERE << " ERROR: Can't find node " << towernodename << endl; return Fun4AllReturnCodes::ABORTRUN; } // pull the clusters string clusternodename = "CLUSTER_" + _cal_names[i]; RawClusterContainer *clusterList = findNode::getClass< RawClusterContainer>(topNode, clusternodename.c_str()); if (!clusterList) { cerr << PHWHERE << " ERROR: Can't find node " << clusternodename << endl; return Fun4AllReturnCodes::ABORTRUN; } // loop over all tracks for (SvtxTrackMap::Iter iter = _g4tracks->begin(); iter != _g4tracks->end(); ++iter) { SvtxTrack *track = iter->second; #ifdef DEBUG cout <<__LINE__ <<": track->get_charge(): "<<track->get_charge() <<endl; #endif if(!track) { if(verbosity >= 2) LogWarning("!track"); continue; } if (verbosity > 1) cout << "projecting track id " << track->get_id() << endl; if (verbosity > 1) { cout << " track pt = " << track->get_pt() << endl; } std::vector<double> point; point.assign(3, -9999.); auto last_state_iter = --track->end_states(); SvtxTrackState * trackstate = last_state_iter->second; if(!trackstate) { if(verbosity >= 2) LogWarning("!trackstate"); continue; } auto pdg = unique_ptr<TDatabasePDG> (TDatabasePDG::Instance()); int reco_charge = track->get_charge(); int gues_charge = pdg->GetParticle(_pid_guess)->Charge(); if(reco_charge*gues_charge<0) _pid_guess *= -1; #ifdef DEBUG cout <<__LINE__ <<": guess charge: " << gues_charge <<": reco charge: " << reco_charge <<": pid: " << _pid_guess <<": pT: " << sqrt(trackstate->get_px()*trackstate->get_px() + trackstate->get_py()*trackstate->get_py()) <<endl; #endif auto rep = unique_ptr<genfit::AbsTrackRep> (new genfit::RKTrackRep(_pid_guess)); unique_ptr<genfit::MeasuredStateOnPlane> msop80 = nullptr; { TVector3 pos(trackstate->get_x(), trackstate->get_y(), trackstate->get_z()); //pos.SetXYZ(0.01,0,0); TVector3 mom(trackstate->get_px(), trackstate->get_py(), trackstate->get_pz()); //mom.SetXYZ(1,0,0); TMatrixDSym cov(6); for (int i = 0; i < 6; ++i) { for (int j = 0; j < 6; ++j) { cov[i][j] = trackstate->get_error(i, j); } } msop80 = unique_ptr<genfit::MeasuredStateOnPlane> (new genfit::MeasuredStateOnPlane(rep.get())); msop80->setPosMomCov(pos, mom, cov); } #ifdef DEBUG { double x = msop80->getPos().X(); double y = msop80->getPos().Y(); double z = msop80->getPos().Z(); // double px = msop80->getMom().X(); // double py = msop80->getMom().Y(); double pz = msop80->getMom().Z(); genfit::FieldManager *field_mgr = genfit::FieldManager::getInstance(); double Bx=0, By=0, Bz=0; field_mgr->getFieldVal(x,y,z,Bx,By,Bz); cout << __LINE__ << ": { " << msop80->getPos().Perp() << ", " << msop80->getPos().Phi() << ", " << msop80->getPos().Eta() << "} @ " //<< "{ " << Bx << ", " << By << ", " << Bz << "}" << "{ " << msop80->getMom().Perp() << ", " << msop80->getMom().Phi() << ", " << pz << "} " <<endl; //msop80->Print(); } #endif try { rep->extrapolateToCylinder(*msop80, _cal_radii[i], TVector3(0,0,0), TVector3(0,0,1)); //rep->extrapolateToCylinder(*msop80, 5., TVector3(0,0,0), TVector3(0,0,1)); } catch (...) { if(verbosity >= 2) LogWarning("extrapolateToCylinder failed"); continue; } #ifdef DEBUG { cout<<__LINE__<<endl; //msop80->Print(); double x = msop80->getPos().X(); double y = msop80->getPos().Y(); double z = msop80->getPos().Z(); // double px = msop80->getMom().X(); // double py = msop80->getMom().Y(); double pz = msop80->getMom().Z(); genfit::FieldManager *field_mgr = genfit::FieldManager::getInstance(); double Bx=0, By=0, Bz=0; field_mgr->getFieldVal(x,y,z,Bx,By,Bz); cout << __LINE__ << ": { " << msop80->getPos().Perp() << ", " << msop80->getPos().Phi() << ", " << msop80->getPos().Eta() << "} @ " //<< "{ " << Bx << ", " << By << ", " << Bz << "}" << "{ " << msop80->getMom().Perp() << ", " << msop80->getMom().Phi() << ", " << pz << "} " <<endl; } #endif point[0] = msop80->getPos().X(); point[1] = msop80->getPos().Y(); point[2] = msop80->getPos().Z(); #ifdef DEBUG cout <<__LINE__ <<": GenFit: {" << point[0] <<", " << point[1] <<", " << point[2] <<" }" <<endl; #endif if (std::isnan(point[0])) continue; if (std::isnan(point[1])) continue; if (std::isnan(point[2])) continue; double x = point[0]; double y = point[1]; double z = point[2]; double phi = atan2(y, x); double eta = asinh(z / sqrt(x * x + y * y)); if (verbosity > 1) { cout << " initial track phi = " << track->get_phi(); cout << ", eta = " << track->get_eta() << endl; cout << " calorimeter phi = " << phi << ", eta = " << eta << endl; } // projection is outside the detector extent // TODO towergeo doesn't make this easy to extract, but this should be // fetched from the node tree instead of hardcoded if (fabs(eta) >= 1.0) continue; // calculate 3x3 tower energy int binphi = towergeo->get_phibin(phi); int bineta = towergeo->get_etabin(eta); double energy_3x3 = 0.0; double energy_5x5 = 0.0; for (int iphi = binphi - 2; iphi <= binphi + 2; ++iphi) { for (int ieta = bineta - 2; ieta <= bineta + 2; ++ieta) { // wrap around int wrapphi = iphi; if (wrapphi < 0) { wrapphi = towergeo->get_phibins() + wrapphi; } if (wrapphi >= towergeo->get_phibins()) { wrapphi = wrapphi - towergeo->get_phibins(); } // edges if (ieta < 0) continue; if (ieta >= towergeo->get_etabins()) continue; RawTower* tower = towerList->getTower(ieta, wrapphi); if (tower) { energy_5x5 += tower->get_energy(); if (abs(iphi - binphi) <= 1 and abs(ieta - bineta) <= 1) energy_3x3 += tower->get_energy(); if (verbosity > 1) cout << " tower " << ieta << " " << wrapphi << " energy = " << tower->get_energy() << endl; } } } track->set_cal_energy_3x3(_cal_types[i], energy_3x3); track->set_cal_energy_5x5(_cal_types[i], energy_5x5); // loop over all clusters and find nearest double min_r = DBL_MAX; double min_index = -9999; double min_dphi = NAN; double min_deta = NAN; double min_e = NAN; #ifdef DEBUG double min_cluster_phi = NAN; #endif for (unsigned int k = 0; k < clusterList->size(); ++k) { RawCluster *cluster = clusterList->getCluster(k); double dphi = atan2(sin(phi - cluster->get_phi()), cos(phi - cluster->get_phi())); double deta = eta - cluster->get_eta(); double r = sqrt(pow(dphi, 2) + pow(deta, 2)); if (r < min_r) { min_index = k; min_r = r; min_dphi = dphi; min_deta = deta; min_e = cluster->get_energy(); #ifdef DEBUG min_cluster_phi = cluster->get_phi(); #endif } } if (min_index != -9999) { track->set_cal_dphi(_cal_types[i], min_dphi); track->set_cal_deta(_cal_types[i], min_deta); track->set_cal_cluster_id(_cal_types[i], min_index); track->set_cal_cluster_e(_cal_types[i], min_e); #ifdef DEBUG cout <<__LINE__ <<": min_cluster_phi: "<<min_cluster_phi <<endl; #endif if (verbosity > 1) { cout << " nearest cluster dphi = " << min_dphi << " deta = " << min_deta << " e = " << min_e << endl; } } } // end track loop } // end calorimeter layer loop if (verbosity > 1) cout << "PHG4GenFitTrackProjection::process_event -- exited" << endl; return Fun4AllReturnCodes::EVENT_OK; }