void CaloEvaluator::printInputInfo(PHCompositeNode *topNode) { if (verbosity > 2) cout << "CaloEvaluator::printInputInfo() entered" << endl; // print out the truth container if (verbosity > 1) { cout << endl; cout << PHWHERE << " NEW INPUT FOR EVENT " << _ievent << endl; cout << endl; // need things off of the DST... PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo"); if (!truthinfo) { cerr << PHWHERE << " ERROR: Can't find G4TruthInfo" << endl; exit(-1); } cout << "PHG4TruthInfoContainer contents: " << endl; PHG4TruthInfoContainer::Range truthrange = truthinfo->GetParticleRange(); for(PHG4TruthInfoContainer::Iterator truthiter = truthrange.first; truthiter != truthrange.second; ++truthiter) { PHG4Particle *particle = truthiter->second; cout << truthiter->first << " => pid: " << particle->get_pid() << " pt: " << sqrt(pow(particle->get_px(),2)+pow(particle->get_py(),2)) << endl; } } return; }
std::set<PHG4VtxPoint*> SvtxVertexEval::all_truth_points(SvtxVertex* vertex) { if ((_do_cache) && (_cache_all_truth_points.find(vertex) != _cache_all_truth_points.end())) { return _cache_all_truth_points[vertex]; } PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(_topNode,"G4TruthInfo"); if (!truthinfo) { cerr << PHWHERE << " ERROR: Can't find G4TruthInfo" << endl; exit(-1); } std::set<PHG4VtxPoint*> points; std::set<PHG4Particle*> particles = all_truth_particles(vertex); for (std::set<PHG4Particle*>::iterator iter = particles.begin(); iter != particles.end(); ++iter) { PHG4Particle* particle = *iter; // only consider primary particles PHG4TruthInfoContainer::Map primarymap = truthinfo->GetPrimaryMap(); if (primarymap.find(particle->get_track_id()) == primarymap.end()) continue; points.insert(truthinfo->GetPrimaryVtx(particle->get_vtx_id())); } if (_do_cache) _cache_all_truth_points.insert(make_pair(vertex,points)); return points; }
int BaseTruthEval::get_embed(PHG4Particle* particle) { if (_strict) {assert(particle);} else if (!particle) {++_errors; return 0;} if (!is_primary(particle)) return 0; PHG4Particle* primary = get_primary(particle); if (_strict) {assert(primary);} else if (!primary) {++_errors; return 0;} return _truthinfo->isEmbeded(primary->get_track_id()); }
// overlap calculations unsigned int SvtxVertexEval::get_ntracks_contribution(SvtxVertex* vertex, PHG4VtxPoint* truthpoint) { if ((_do_cache) && (_cache_get_ntracks_contribution.find(make_pair(vertex,truthpoint)) != _cache_get_ntracks_contribution.end())) { return _cache_get_ntracks_contribution[make_pair(vertex,truthpoint)]; } SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(_topNode,"SvtxTrackMap"); if (!trackmap) { cerr << PHWHERE << " ERROR: Can't find SvtxTrackMap" << endl; exit(-1); } PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(_topNode,"G4TruthInfo"); if (!truthinfo) { cerr << PHWHERE << " ERROR: Can't find G4TruthInfo" << endl; exit(-1); } unsigned int ntracks = 0; for (SvtxVertex::TrackIter iter = vertex->begin_tracks(); iter != vertex->end_tracks(); ++iter) { SvtxTrack* track = trackmap->get(*iter); PHG4Particle* particle = _trackeval.max_truth_particle_by_nclusters(track); // only consider primary particles PHG4TruthInfoContainer::Map primarymap = truthinfo->GetPrimaryMap(); if (primarymap.find(particle->get_track_id()) == primarymap.end()) continue; PHG4VtxPoint* candidate = truthinfo->GetPrimaryVtx(particle->get_vtx_id()); if (candidate->get_id() == truthpoint->get_id()) ++ntracks; } if (_do_cache) _cache_get_ntracks_contribution.insert(make_pair(make_pair(vertex,truthpoint),ntracks)); return ntracks; }
double RICHParticleID::calculate_true_emission_angle( PHG4TruthInfoContainer* truthinfo, SvtxTrack_FastSim * track, double index ) { /* Get truth particle associated with track */ PHG4Particle* particle = truthinfo->GetParticle( track->get_truth_track_id() ); /* Get particle ID */ int pid = particle->get_pid(); /* Get particle mass */ double mass = _pdg->GetParticle(pid)->Mass(); /* Get particle total momentum */ double ptotal = sqrt( track->get_px() * track->get_px() + track->get_py() * track->get_py() + track->get_pz() * track->get_pz() ); /* Calculate 'beta' */ double beta = ptotal / sqrt( mass * mass + ptotal * ptotal ); /* Calculate emission angle for Cerenkov light */ double theta_c = acos( 1 / ( index * beta ) ); return theta_c; }
int RICHEvaluator::process_event(PHCompositeNode *topNode) { _ievent ++; /* Get truth information */ PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo"); /* Get all photon hits in RICH for this event */ PHG4HitContainer* richhits = findNode::getClass<PHG4HitContainer>(topNode,_richhits_name); /* Get track collection with all tracks in this event */ SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode,_trackmap_name); /* Check if collections found */ if (!truthinfo) { cout << PHWHERE << "PHG4TruthInfoContainer not found on node tree" << endl; return Fun4AllReturnCodes::ABORTEVENT; } if (!richhits) { cout << PHWHERE << "PHG4HitContainer not found on node tree" << endl; return Fun4AllReturnCodes::ABORTEVENT; } if (!trackmap) { cout << PHWHERE << "SvtxTrackMap node not found on node tree" << endl; return Fun4AllReturnCodes::ABORTEVENT; } /* Loop over tracks */ for (SvtxTrackMap::ConstIter track_itr = trackmap->begin(); track_itr != trackmap->end(); track_itr++) { bool use_reconstructed_momentum = false; bool use_truth_momentum = false; bool use_emission_momentum = true; bool use_reconstructed_point = false; bool use_approximate_point = true; /* Store angles to get RMS value */ TH1F *ch_ang = new TH1F("","",1000,0.0,1.0); SvtxTrack* track_j = dynamic_cast<SvtxTrack*>(track_itr->second); /* Check if track_j is a null pointer. */ if (track_j == NULL) continue; /* Fill momv object which is the normalized momentum vector of the track in the RICH (i.e. its direction) */ double momv[3] = {0.,0.,0.}; if (use_reconstructed_momentum) { /* 'Continue' with next track if RICH projection not found for this track */ if ( ! _trackproj->get_projected_momentum( track_j, momv, TrackProjectorPid::SPHERE, _radius ) ) { cout << "RICH track projection momentum NOT FOUND; next iteration" << endl; continue; } } if (use_truth_momentum) { /* Fill with truth momentum instead of reco */ if ( ! _acquire->get_true_momentum( truthinfo, track_j, momv) ) { cout << "No truth momentum found for track; next iteration" << endl; continue; } } if (use_emission_momentum) { /* Fill with vector constructed from emission points (from truth) */ if ( ! _acquire->get_emission_momentum( truthinfo, richhits, track_j, momv) ) { cout << "No truth momentum from emission points found for track; next iteration" << endl; continue; } } double momv_norm = sqrt( momv[0]*momv[0] + momv[1]*momv[1] + momv[2]*momv[2] ); momv[0] /= momv_norm; momv[1] /= momv_norm; momv[2] /= momv_norm; /* Get mean emission point from track in RICH */ double m_emi[3] = {0.,0.,0.}; if (use_reconstructed_point) { /* 'Continue' with next track if RICH projection not found for this track */ if ( ! _trackproj->get_projected_position( track_j, m_emi, TrackProjectorPid::SPHERE, _radius ) ) { cout << "RICH track projection position NOT FOUND; next iteration" << endl; continue; } } if (use_approximate_point) { m_emi[0] = ((_radius)/momv[2])*momv[0]; m_emi[1] = ((_radius)/momv[2])*momv[1]; m_emi[2] = ((_radius)/momv[2])*momv[2]; } /* 'Continue' with next track if track doesn't pass through RICH */ if ( ! _trackproj->is_in_RICH( momv ) ) continue; /* Calculate truth emission angle and truth mass */ if (truthinfo) { _theta_true = calculate_true_emission_angle( truthinfo , track_j , _refractive_index ); } /* Loop over all G4Hits in container (i.e. RICH photons in event) */ PHG4HitContainer::ConstRange rich_hits_begin_end = richhits->getHits(); PHG4HitContainer::ConstIterator rich_hits_iter; for (rich_hits_iter = rich_hits_begin_end.first; rich_hits_iter != rich_hits_begin_end.second; ++rich_hits_iter) { PHG4Hit *hit_i = rich_hits_iter->second; PHG4Particle* particle = NULL; PHG4Particle* parent = NULL; PHG4VtxPoint* vertex = NULL; if ( truthinfo ) { particle = truthinfo->GetParticle( hit_i->get_trkid() ); parent = truthinfo->GetParticle( particle->get_parent_id() ); vertex = truthinfo->GetVtx( particle->get_vtx_id() ); } _hit_x0 = hit_i->get_x(0); _hit_y0 = hit_i->get_y(0); _hit_z0 = hit_i->get_z(0); _emi_x = vertex->get_x(); _emi_y = vertex->get_y(); _emi_z = vertex->get_z(); _track_px = particle->get_px(); _track_py = particle->get_py(); _track_pz = particle->get_pz(); _mtrack_px = parent->get_px(); _mtrack_py = parent->get_py(); _mtrack_pz = parent->get_pz(); _mtrack_ptot = sqrt( _mtrack_px*_mtrack_px + _mtrack_py*_mtrack_py + _mtrack_pz*_mtrack_pz ); _track_e = particle->get_e(); _mtrack_e = parent->get_e(); _edep = hit_i->get_edep(); _bankid = 0; _volumeid = hit_i->get_detid(); _hitid = hit_i->get_hit_id(); _pid = particle->get_pid(); _mpid = parent->get_pid(); _trackid = particle->get_track_id(); _mtrackid = parent->get_track_id(); _otrackid = track_j->get_id(); /* Set reconstructed emission angle and reconstructed mass for output tree */ _theta_reco = _acquire->calculate_emission_angle( m_emi, momv, hit_i ); ch_ang->Fill(_theta_reco); /* Fill tree */ _tree_rich->Fill(); } // END loop over photons _theta_rms = ch_ang->GetRMS(); _theta_mean = ch_ang->GetMean(); /* Fill condensed tree after every track */ _tree_rich_small->Fill(); } // END loop over tracks return 0; }
int MomentumEvaluator::process_event( PHCompositeNode *topNode ) { PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo"); PHG4HitContainer* g4hits = findNode::getClass<PHG4HitContainer>(topNode,"G4HIT_SVTX"); if(g4hits == nullptr){cout<<"can't find PHG4HitContainer"<<endl;exit(1);} PHG4HitContainer::ConstRange g4range = g4hits->getHits(); // set<int> trkids; map<int, pair<unsigned int,unsigned int> > trkids; for( PHG4HitContainer::ConstIterator iter = g4range.first; iter != g4range.second; ++iter ) { PHG4Hit* hit = iter->second; int layer = hit->get_layer(); float length = outer_z_length; if(((unsigned int)layer)<n_inner_layers){length=inner_z_length;} if(fabs(hit->get_z(0))>length){continue;} int trk_id = hit->get_trkid(); if(trkids.find(trk_id) == trkids.end()) { trkids[trk_id].first = 0; trkids[trk_id].second = 0; } if( hit->get_layer() < 32 ) { trkids[trk_id].first = (trkids[trk_id].first | (1<<(hit->get_layer()))); } else { trkids[trk_id].second = (trkids[trk_id].second | (1<<(hit->get_layer()-32))); } // cout<<"trk_id = "<<trk_id<<endl; // cout<<"layer = "<<hit->get_layer()<<endl; // cout<<"nlayer = "<<__builtin_popcount(trkids[trk_id].first)+__builtin_popcount(trkids[trk_id].second)<<endl<<endl; // trkids.insert(trk_id); } SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode,"SvtxTrackMap"); PHG4VtxPoint *gvertex = truthinfo->GetPrimaryVtx( truthinfo->GetPrimaryVertexIndex() ); float gvx = gvertex->get_x(); float gvy = gvertex->get_y(); float gvz = gvertex->get_z(); RecursiveMomentumContainer true_sorted( -20., 20., -20., 20., -20., 20., 10 ); // PHG4TruthInfoContainer::Map primarymap = truthinfo->GetPrimaryMap(); PHG4TruthInfoContainer::Map primarymap = truthinfo->GetMap(); for(PHG4TruthInfoContainer::Iterator iter = primarymap.begin();iter != primarymap.end();++iter) { PHG4Particle *particle = iter->second; float vx = truthinfo->GetVtx(particle->get_vtx_id())->get_x(); float vy = truthinfo->GetVtx(particle->get_vtx_id())->get_y(); float vz = truthinfo->GetVtx(particle->get_vtx_id())->get_z(); TrivialTrack track( particle->get_px(), particle->get_py(), particle->get_pz(), vx-gvx, vy-gvy, vz-gvz ); if( ( (track.px * track.px) + (track.py * track.py) ) < (0.1*0.1) ){continue;} if( trkids.find(particle->get_track_id()) == trkids.end() ) { continue; } // cout<<"trk, nhits = "<<particle->get_track_id()<<" "<<__builtin_popcount(trkids[particle->get_track_id()].first)+__builtin_popcount(trkids[particle->get_track_id()].second)<<endl; if( __builtin_popcount(trkids[particle->get_track_id()].first)+__builtin_popcount(trkids[particle->get_track_id()].second) < (int)n_required_layers ) { continue; } true_sorted.insert( track ); } RecursiveMomentumContainer reco_sorted( -20., 20., -20., 20., -20., 20., 10 ); for(SvtxTrackMap::Iter iter = trackmap->begin();iter != trackmap->end();++iter) { SvtxTrack* track = iter->second; TrivialTrack ttrack( track->get_px(), track->get_py(), track->get_pz(), track->get_x()-gvx, track->get_y()-gvy, track->get_z()-gvz, track->get_quality() ); reco_sorted.insert(ttrack); } TrivialTrack* t_track = true_sorted.begin(); vector<TrivialTrack*> pointer_list; while(t_track != nullptr) { pointer_list.clear(); float pt = sqrt((t_track->px * t_track->px) + (t_track->py * t_track->py)); float pt_diff = pt*pt_search_scale; float px_lo = t_track->px - pt_diff; float px_hi = t_track->px + pt_diff; float py_lo = t_track->py - pt_diff; float py_hi = t_track->py + pt_diff; float pz_diff = fabs( t_track->pz )*pz_search_scale; float pz_lo = t_track->pz - pz_diff; float pz_hi = t_track->pz + pz_diff; reco_sorted.append_list( pointer_list, px_lo,px_hi, py_lo,py_hi, pz_lo,pz_hi ); if(pointer_list.size() > 0) { float mom_true = sqrt(pt*pt + (t_track->pz)*(t_track->pz)); float best_ind = 0; float mom_reco = sqrt( (pointer_list[0]->px)*(pointer_list[0]->px) + (pointer_list[0]->py)*(pointer_list[0]->py) + (pointer_list[0]->pz)*(pointer_list[0]->pz) ); float best_mom = mom_reco; for(unsigned int i=1;i<pointer_list.size();++i) { mom_reco = sqrt( (pointer_list[i]->px)*(pointer_list[i]->px) + (pointer_list[i]->py)*(pointer_list[i]->py) + (pointer_list[i]->pz)*(pointer_list[i]->pz) ); if( fabs( mom_true - mom_reco ) < fabs( mom_true - best_mom ) ) { best_mom = mom_reco; best_ind = i; } } float ntp_data[14] = { (float) event_counter, t_track->px, t_track->py, t_track->pz, t_track->dcax, t_track->dcay, t_track->dcaz, pointer_list[best_ind]->px, pointer_list[best_ind]->py, pointer_list[best_ind]->pz, pointer_list[best_ind]->dcax, pointer_list[best_ind]->dcay, pointer_list[best_ind]->dcaz, pointer_list[best_ind]->quality }; ntp_true->Fill(ntp_data); } else { float ntp_data[14] = { (float) event_counter, t_track->px, t_track->py, t_track->pz, t_track->dcax, t_track->dcay, t_track->dcaz, -9999.,-9999.,-9999.,-9999.,-9999.,-9999., -9999. }; ntp_true->Fill(ntp_data); } t_track = true_sorted.next(); } TrivialTrack* r_track = reco_sorted.begin(); while(r_track != nullptr) { pointer_list.clear(); float pt = sqrt((r_track->px * r_track->px) + (r_track->py * r_track->py)); float pt_diff = pt*pt_search_scale; float px_lo = r_track->px - pt_diff; float px_hi = r_track->px + pt_diff; float py_lo = r_track->py - pt_diff; float py_hi = r_track->py + pt_diff; float pz_diff = fabs( r_track->pz )*pz_search_scale; float pz_lo = r_track->pz - pz_diff; float pz_hi = r_track->pz + pz_diff; true_sorted.append_list( pointer_list, px_lo,px_hi, py_lo,py_hi, pz_lo,pz_hi ); if(pointer_list.size() > 0) { float mom_reco = sqrt(pt*pt + (r_track->pz)*(r_track->pz)); float best_ind = 0; float mom_true = sqrt( (pointer_list[0]->px)*(pointer_list[0]->px) + (pointer_list[0]->py)*(pointer_list[0]->py) + (pointer_list[0]->pz)*(pointer_list[0]->pz) ); float best_mom = mom_true; for(unsigned int i=1;i<pointer_list.size();++i) { mom_true = sqrt( (pointer_list[i]->px)*(pointer_list[i]->px) + (pointer_list[i]->py)*(pointer_list[i]->py) + (pointer_list[i]->pz)*(pointer_list[i]->pz) ); if( fabs( mom_reco - mom_true ) < fabs( mom_reco - best_mom ) ) { best_mom = mom_true; best_ind = i; } } float ntp_data[14] = { (float) event_counter, r_track->px, r_track->py, r_track->pz, r_track->dcax, r_track->dcay, r_track->dcaz, pointer_list[best_ind]->px, pointer_list[best_ind]->py, pointer_list[best_ind]->pz, pointer_list[best_ind]->dcax, pointer_list[best_ind]->dcay, pointer_list[best_ind]->dcaz, r_track->quality }; ntp_reco->Fill(ntp_data); } else { float ntp_data[14] = { (float) event_counter, r_track->px, r_track->py, r_track->pz, r_track->dcax, r_track->dcay, r_track->dcaz, -9999.,-9999.,-9999.,-9999.,-9999.,-9999., r_track->quality }; ntp_reco->Fill(ntp_data); } r_track = reco_sorted.next(); } event_counter += 1; return Fun4AllReturnCodes::EVENT_OK; }
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; }
int PhotonJet::process_event(PHCompositeNode *topnode) { cout<<"at event number "<<nevents<<endl; //get the nodes from the NodeTree JetMap* truth_jets = findNode::getClass<JetMap>(topnode,"AntiKt_Truth_r04"); JetMap *reco_jets = findNode::getClass<JetMap>(topnode,"AntiKt_Tower_r04"); PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topnode,"G4TruthInfo"); RawClusterContainer *clusters = findNode::getClass<RawClusterContainer>(topnode,"CLUSTER_CEMC"); SvtxTrackMap *trackmap = findNode::getClass<SvtxTrackMap>(topnode,"SvtxTrackMap"); JetEvalStack* _jetevalstack = new JetEvalStack(topnode,"AntiKt_Tower_r04","AntiKt_Truth_r04"); PHG4TruthInfoContainer::Range range = truthinfo->GetPrimaryParticleRange(); if(!truth_jets){ cout<<"no truth jets"<<endl; return 0; } if(!reco_jets){ cout<<"no reco jets"<<endl; return 0; } if(!truthinfo){ cout<<"no truth track info"<<endl; return 0; } if(!clusters){ cout<<"no cluster info"<<endl; return 0; } if(!trackmap){ cout<<"no track map"<<endl; return 0; } if(!_jetevalstack){ cout<<"no good truth jets"<<endl; return 0; } JetRecoEval* recoeval = _jetevalstack->get_reco_eval(); /*********************************************** GET THE TRUTH PARTICLES ************************************************/ for( PHG4TruthInfoContainer::ConstIterator iter = range.first; iter!=range.second; ++iter){ PHG4Particle *truth = iter->second; truthpx = truth->get_px(); truthpy = truth->get_py(); truthpz = truth->get_pz(); truthp = sqrt(truthpx*truthpx+truthpy*truthpy+truthpz*truthpz); truthenergy = truth->get_e(); TLorentzVector vec; vec.SetPxPyPzE(truthpx,truthpy,truthpz,truthenergy); truthpt = sqrt(truthpx*truthpx+truthpy*truthpy); if(truthpt<0.5) continue; truthphi = vec.Phi(); trutheta = vec.Eta(); truthpid = truth->get_pid(); truth_g4particles->Fill(); } /*********************************************** GET THE EMCAL CLUSTERS ************************************************/ RawClusterContainer::ConstRange begin_end = clusters->getClusters(); RawClusterContainer::ConstIterator clusiter; for(clusiter = begin_end.first; clusiter!=begin_end.second; ++clusiter){ RawCluster *cluster = clusiter->second; clus_energy = cluster->get_energy(); clus_eta = cluster->get_eta(); clus_theta = 2.*TMath::ATan((TMath::Exp(-1.*clus_eta))); clus_pt = clus_energy*TMath::Sin(clus_theta); clus_phi = cluster->get_phi(); if(clus_pt<0.5) continue; TLorentzVector *clus = new TLorentzVector(); clus->SetPtEtaPhiE(clus_pt,clus_eta,clus_phi,clus_energy); float dumarray[4]; clus->GetXYZT(dumarray); clus_x = dumarray[0]; clus_y = dumarray[1]; clus_z = dumarray[2]; clus_t = dumarray[3]; clus_px = clus_pt*TMath::Cos(clus_phi); clus_py = clus_pt*TMath::Sin(clus_phi); clus_pz = sqrt(clus_energy*clus_energy-clus_px*clus_px-clus_py*clus_py); cluster_tree->Fill(); //only interested in high pt photons to be isolated if(clus_pt<mincluspt) continue; if(fabs(clus_eta)>(1.0-isoconeradius)) continue; float energysum = ConeSum(cluster,clusters,trackmap,isoconeradius); bool conecut = energysum > 0.1*clus_energy; if(conecut) continue; isolated_clusters->Fill(); GetRecoHadronsAndJets(cluster, trackmap, reco_jets,recoeval); } /*********************************************** GET THE SVTX TRACKS ************************************************/ SvtxEvalStack *svtxevalstack = new SvtxEvalStack(topnode); svtxevalstack->next_event(topnode); SvtxTrackEval *trackeval = svtxevalstack->get_track_eval(); for(SvtxTrackMap::Iter iter = trackmap->begin(); iter!=trackmap->end(); ++iter){ SvtxTrack *track = iter->second; //get reco info tr_px = track->get_px(); tr_py = track->get_py(); tr_pz = track->get_pz(); tr_p = sqrt(tr_px*tr_px+tr_py*tr_py+tr_pz*tr_pz); tr_pt = sqrt(tr_px*tr_px+tr_py*tr_py); if(tr_pt<0.5) continue; tr_phi = track->get_phi(); tr_eta = track->get_eta(); if(fabs(tr_eta)>1) continue; charge = track->get_charge(); chisq = track->get_chisq(); ndf = track->get_ndf(); dca = track->get_dca(); tr_x = track->get_x(); tr_y = track->get_y(); tr_z = track->get_z(); //get truth info PHG4Particle *truthtrack = trackeval->max_truth_particle_by_nclusters(track); truth_is_primary = truthinfo->is_primary(truthtrack); truthtrackpx = truthtrack->get_px(); truthtrackpy = truthtrack->get_py(); truthtrackpz = truthtrack->get_pz(); truthtrackp = sqrt(truthtrackpx*truthtrackpx+truthtrackpy*truthtrackpy+truthtrackpz*truthtrackpz); truthtracke = truthtrack->get_e(); TLorentzVector *Truthtrack = new TLorentzVector(); Truthtrack->SetPxPyPzE(truthtrackpx,truthtrackpy,truthtrackpz,truthtracke); truthtrackpt = Truthtrack->Pt(); truthtrackphi = Truthtrack->Phi(); truthtracketa = Truthtrack->Eta(); truthtrackpid = truthtrack->get_pid(); tracktree->Fill(); } /*************************************** TRUTH JETS ***************************************/ for(JetMap::Iter iter = truth_jets->begin(); iter!=truth_jets->end(); ++iter){ Jet *jet = iter->second; truthjetpt = jet->get_pt(); if(truthjetpt<10.) continue; truthjeteta = jet->get_eta(); if(fabs(truthjeteta)>2.) continue; truthjetpx = jet->get_px(); truthjetpy = jet->get_py(); truthjetpz = jet->get_pz(); truthjetphi = jet->get_phi(); truthjetmass = jet->get_mass(); truthjetp = jet->get_p(); truthjetenergy = jet->get_e(); truthjettree->Fill(); } /*************************************** RECONSTRUCTED JETS ***************************************/ for(JetMap::Iter iter = reco_jets->begin(); iter!=reco_jets->end(); ++iter){ Jet *jet = iter->second; Jet *truthjet = recoeval->max_truth_jet_by_energy(jet); recojetpt = jet->get_pt(); if(recojetpt<4.) continue; recojeteta = jet->get_eta(); if(fabs(recojeteta)>2.) continue; recojetid = jet->get_id(); recojetpx = jet->get_px(); recojetpy = jet->get_py(); recojetpz = jet->get_pz(); recojetphi = jet->get_phi(); recojetmass = jet->get_mass(); recojetp = jet->get_p(); recojetenergy = jet->get_e(); if(truthjet){ truthjetid = truthjet->get_id(); truthjetp = truthjet->get_p(); truthjetphi = truthjet->get_phi(); truthjeteta = truthjet->get_eta(); truthjetpt = truthjet->get_pt(); truthjetenergy = truthjet->get_e(); truthjetpx = truthjet->get_px(); truthjetpy = truthjet->get_py(); truthjetpz = truthjet->get_pz(); } else{ truthjetid = 0; truthjetp = 0; truthjetphi = 0; truthjeteta = 0; truthjetpt = 0; truthjetenergy = 0; truthjetpx = 0; truthjetpy = 0; truthjetpz = 0; } recojettree->Fill(); } nevents++; tree->Fill(); return 0; }
int PHG4DstCompressReco::process_event(PHCompositeNode *topNode) { if (_g4hits.empty() && _g4cells.empty() && _towers.empty()) return Fun4AllReturnCodes::EVENT_OK; //---cells-------------------------------------------------------------------- for (std::set<PHG4CellContainer*>::iterator iter = _g4cells.begin(); iter != _g4cells.end(); ++iter) { PHG4CellContainer* cells = *iter; cells->Reset(); // DROP ALL COMPRESSED G4CELLS } //---hits--------------------------------------------------------------------- for (std::set<PHG4HitContainer*>::iterator iter = _g4hits.begin(); iter != _g4hits.end(); ++iter) { PHG4HitContainer* hits = *iter; hits->Reset(); // DROP ALL COMPRESSED G4HITS } //---secondary particles and vertexes----------------------------------------- std::set<int> keep_particle_ids; for (std::set<PHG4HitContainer*>::iterator iter = _keep_g4hits.begin(); iter != _keep_g4hits.end(); ++iter) { PHG4HitContainer* hits = *iter; for (PHG4HitContainer::ConstIterator jter = hits->getHits().first; jter != hits->getHits().second; ++jter) { PHG4Hit* hit = jter->second; keep_particle_ids.insert(hit->get_trkid()); // this will need to include all parents too in a trace back to // the primary, but let's start here for now } } std::set<int> keep_vertex_ids; PHG4TruthInfoContainer::Range range = _truth_info->GetSecondaryParticleRange(); for (PHG4TruthInfoContainer::Iterator iter = range.first; iter != range.second; ) { int id = iter->first; PHG4Particle* particle = iter->second; if (keep_particle_ids.find(id) != keep_particle_ids.end()) { ++iter; keep_vertex_ids.insert(particle->get_vtx_id()); continue; } else { _truth_info->delete_particle(iter++); // DROP PARTICLES NOT ASSOCIATED TO A PRESERVED HIT } } PHG4TruthInfoContainer::VtxRange vrange = _truth_info->GetSecondaryVtxRange(); for (PHG4TruthInfoContainer::VtxIterator iter = vrange.first; iter != vrange.second; ) { int id = iter->first; if (keep_vertex_ids.find(id) != keep_vertex_ids.end()) { ++iter; continue; } else { _truth_info->delete_vtx(iter++); // DROP VERTEXES NOT ASSOCIATED TO A PRESERVED HIT } } //---shower entries----------------------------------------------------------- PHG4TruthInfoContainer::ShowerRange srange = _truth_info->GetShowerRange(); for (PHG4TruthInfoContainer::ShowerIterator iter = srange.first; iter != srange.second; ++iter) { PHG4Shower* shower = iter->second; shower->clear_g4particle_id(); shower->clear_g4vertex_id(); shower->clear_g4hit_id(); } //---tower cell entries------------------------------------------------------- for (std::set<RawTowerContainer*>::iterator iter = _towers.begin(); iter != _towers.end(); ++iter) { RawTowerContainer* towers = *iter; // loop over all the towers for (RawTowerContainer::Iterator jter = towers->getTowers().first; jter != towers->getTowers().second; ++jter) { RawTower* tower = jter->second; tower->clear_g4cells(); } } return Fun4AllReturnCodes::EVENT_OK; }
void CaloEvaluator::fillOutputNtuples(PHCompositeNode *topNode) { if (verbosity > 2) cout << "CaloEvaluator::fillOutputNtuples() entered" << endl; CaloRawClusterEval* clustereval = _caloevalstack->get_rawcluster_eval(); CaloRawTowerEval* towereval = _caloevalstack->get_rawtower_eval(); CaloTruthEval* trutheval = _caloevalstack->get_truth_eval(); //---------------------- // fill the Event NTuple //---------------------- if (_do_gpoint_eval) { // need things off of the DST... PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo"); if (!truthinfo) { cerr << PHWHERE << " ERROR: Can't find G4TruthInfo" << endl; exit(-1); } // need things off of the DST... SvtxVertexMap* vertexmap = findNode::getClass<SvtxVertexMap>(topNode,"SvtxVertexMap"); 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; if (vertexmap) { if (!vertexmap->empty()) { SvtxVertex* vertex = (vertexmap->begin()->second); vx = vertex->get_x(); vy = vertex->get_y(); vz = vertex->get_z(); } } float gpoint_data[7] = {_ievent, gvx, gvy, gvz, vx, vy, vz }; _ntp_gpoint->Fill(gpoint_data); } //------------------------ // fill the Gshower NTuple //------------------------ if (_ntp_gshower) { if (verbosity > 1) cout << "CaloEvaluator::filling gshower ntuple..." << endl; PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo"); if (!truthinfo) { cerr << PHWHERE << " ERROR: Can't find G4TruthInfo" << endl; exit(-1); } PHG4TruthInfoContainer::ConstRange range = truthinfo->GetPrimaryParticleRange(); for (PHG4TruthInfoContainer::ConstIterator iter = range.first; iter != range.second; ++iter) { PHG4Particle* primary = iter->second; if (primary->get_e() < _truth_e_threshold) continue; if (!_truth_trace_embed_flags.empty()) { if (_truth_trace_embed_flags.find(trutheval->get_embed(primary)) == _truth_trace_embed_flags.end()) continue; } float gparticleID = primary->get_track_id(); float gflavor = primary->get_pid(); std::set<PHG4Hit*> g4hits = trutheval->get_shower_from_primary(primary); float gnhits = g4hits.size(); float gpx = primary->get_px(); float gpy = primary->get_py(); float gpz = primary->get_pz(); float ge = primary->get_e(); float gpt = sqrt(gpx*gpx+gpy*gpy); float geta = NAN; if (gpt != 0.0) geta = asinh(gpz/gpt); float gphi = atan2(gpy,gpx); PHG4VtxPoint* vtx = trutheval->get_vertex(primary); float gvx = vtx->get_x(); float gvy = vtx->get_y(); float gvz = vtx->get_z(); float gembed = trutheval->get_embed(primary); float gedep = trutheval->get_shower_energy_deposit(primary); float gmrad = trutheval->get_shower_moliere_radius(primary); RawCluster* cluster = clustereval->best_cluster_from(primary); float clusterID = NAN; float ntowers = NAN; float eta = NAN; float phi = NAN; float e = NAN; float efromtruth = NAN; if (cluster) { clusterID = cluster->get_id(); ntowers = cluster->getNTowers(); eta = cluster->get_eta(); phi = cluster->get_phi(); e = cluster->get_energy(); efromtruth = clustereval->get_energy_contribution(cluster, primary); } float shower_data[20] = {_ievent, gparticleID, gflavor, gnhits, geta, gphi, ge, gpt, gvx, gvy, gvz, gembed, gedep, gmrad, clusterID, ntowers, eta, phi, e, efromtruth }; _ntp_gshower->Fill(shower_data); } } //---------------------- // fill the Tower NTuple //---------------------- if (_do_tower_eval) { if (verbosity > 1) cout << "CaloEvaluator::filling tower ntuple..." << endl; string towernode = "TOWER_CALIB_" + _caloname; RawTowerContainer* towers = findNode::getClass<RawTowerContainer>(topNode,towernode.c_str()); if (!towers) { cerr << PHWHERE << " ERROR: Can't find " << towernode << endl; exit(-1); } string towergeomnode = "TOWERGEOM_" + _caloname; RawTowerGeomContainer* towergeom = findNode::getClass<RawTowerGeomContainer>(topNode,towergeomnode.c_str()); if (!towergeom) { cerr << PHWHERE << " ERROR: Can't find " << towergeomnode << endl; exit(-1); } RawTowerContainer::ConstRange begin_end = towers->getTowers(); RawTowerContainer::ConstIterator rtiter; for (rtiter = begin_end.first; rtiter != begin_end.second; ++rtiter) { RawTower *tower = rtiter->second; if (tower->get_energy() < _reco_e_threshold) continue; float towerid = tower->get_id(); float ieta = tower->get_bineta(); float iphi = tower->get_binphi(); float eta = towergeom->get_etacenter(tower->get_bineta()); float phi = towergeom->get_phicenter(tower->get_binphi()); float e = tower->get_energy(); PHG4Particle* primary = towereval->max_truth_primary_by_energy(tower); float gparticleID = NAN; float gflavor = NAN; float gnhits = NAN; float gpx = NAN; float gpy = NAN; float gpz = NAN; float ge = NAN; float gpt = NAN; float geta = NAN; float gphi = NAN; float gvx = NAN; float gvy = NAN; float gvz = NAN; float gembed = NAN; float gedep = NAN; float gmrad = NAN; float efromtruth = NAN; if (primary) { gparticleID = primary->get_track_id(); gflavor = primary->get_pid(); std::set<PHG4Hit*> g4hits = trutheval->get_shower_from_primary(primary); gnhits = g4hits.size(); gpx = primary->get_px(); gpy = primary->get_py(); gpz = primary->get_pz(); ge = primary->get_e(); gpt = sqrt(gpx * gpx + gpy * gpy); if (gpt != 0.0) geta = asinh(gpz / gpt); gphi = atan2(gpy, gpx); PHG4VtxPoint* vtx = trutheval->get_vertex(primary); if (vtx) { gvx = vtx->get_x(); gvy = vtx->get_y(); gvz = vtx->get_z(); } gembed = trutheval->get_embed(primary); gedep = trutheval->get_shower_energy_deposit(primary); gmrad = trutheval->get_shower_moliere_radius(primary); efromtruth = towereval->get_energy_contribution(tower, primary); } float tower_data[21] = {_ievent, towerid, ieta, iphi, eta, phi, e, gparticleID, gflavor, gnhits, geta, gphi, ge, gpt, gvx, gvy, gvz, gembed, gedep, gmrad, efromtruth }; _ntp_tower->Fill(tower_data); } } //------------------------ // fill the Cluster NTuple //------------------------ if (_do_cluster_eval) { if (verbosity > 1) cout << "CaloEvaluator::filling gcluster ntuple..." << endl; string clusternode = "CLUSTER_" + _caloname; RawClusterContainer* clusters = findNode::getClass<RawClusterContainer>(topNode,clusternode.c_str()); if (!clusters) { cerr << PHWHERE << " ERROR: Can't find " << clusternode << endl; exit(-1); } // for every cluster for (unsigned int icluster = 0; icluster < clusters->size(); icluster++) { RawCluster *cluster = clusters->getCluster(icluster); if (cluster->get_energy() < _reco_e_threshold) continue; float clusterID = cluster->get_id(); float ntowers = cluster->getNTowers(); float eta = cluster->get_eta(); float phi = cluster->get_phi(); float e = cluster->get_energy(); PHG4Particle* primary = clustereval->max_truth_primary_by_energy(cluster); float gparticleID = NAN; float gflavor = NAN; float gnhits = NAN; float gpx = NAN; float gpy = NAN; float gpz = NAN; float ge = NAN; float gpt = NAN; float geta = NAN; float gphi = NAN; float gvx = NAN; float gvy = NAN; float gvz = NAN; float gembed = NAN; float gedep = NAN; float gmrad = NAN; float efromtruth = NAN; if (primary) { gparticleID = primary->get_track_id(); gflavor = primary->get_pid(); std::set<PHG4Hit*> g4hits = trutheval->get_shower_from_primary(primary); gnhits = g4hits.size(); gpx = primary->get_px(); gpy = primary->get_py(); gpz = primary->get_pz(); ge = primary->get_e(); gpt = sqrt(gpx * gpx + gpy * gpy); if (gpt != 0.0) geta = asinh(gpz / gpt); gphi = atan2(gpy, gpx); PHG4VtxPoint* vtx = trutheval->get_vertex(primary); if (vtx) { gvx = vtx->get_x(); gvy = vtx->get_y(); gvz = vtx->get_z(); } gembed = trutheval->get_embed(primary); gedep = trutheval->get_shower_energy_deposit(primary); gmrad = trutheval->get_shower_moliere_radius(primary); efromtruth = clustereval->get_energy_contribution(cluster, primary); } float cluster_data[20] = {_ievent, clusterID, ntowers, eta, phi, e, gparticleID, gflavor, gnhits, geta, gphi, ge, gpt, gvx, gvy, gvz, gembed, gedep, gmrad, efromtruth }; _ntp_cluster->Fill(cluster_data); } } return; }
void CaloEvaluator::printOutputInfo(PHCompositeNode *topNode) { if (verbosity > 2) cout << "CaloEvaluator::printOutputInfo() entered" << endl; CaloRawClusterEval* clustereval = _caloevalstack->get_rawcluster_eval(); CaloTruthEval* trutheval = _caloevalstack->get_truth_eval(); //========================================== // print out some useful stuff for debugging //========================================== if (verbosity > 1) { // event information cout << endl; cout << PHWHERE << " NEW OUTPUT FOR EVENT " << _ievent << endl; cout << endl; // need things off of the DST... PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo"); if (!truthinfo) { cerr << PHWHERE << " ERROR: Can't find G4TruthInfo" << endl; exit(-1); } // need things off of the DST... SvtxVertexMap* vertexmap = findNode::getClass<SvtxVertexMap>(topNode,"SvtxVertexMap"); 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; if (vertexmap) { if (!vertexmap->empty()) { SvtxVertex* vertex = (vertexmap->begin()->second); vx = vertex->get_x(); vy = vertex->get_y(); vz = vertex->get_z(); } } cout << "vtrue = (" << gvx << "," << gvy << "," << gvz << ") => vreco = (" << vx << "," << vy << "," << vz << ")" << endl; PHG4TruthInfoContainer::ConstRange range = truthinfo->GetPrimaryParticleRange(); for (PHG4TruthInfoContainer::ConstIterator iter = range.first; iter != range.second; ++iter) { PHG4Particle* primary = iter->second; cout << endl; cout << "===Primary PHG4Particle=========================================" << endl; cout << " particle id = " << primary->get_track_id() << endl; cout << " flavor = " << primary->get_pid() << endl; cout << " (px,py,pz,e) = ("; float gpx = primary->get_px(); float gpy = primary->get_py(); float gpz = primary->get_pz(); float ge = primary->get_e(); cout.width(5); cout << gpx; cout << ","; cout.width(5); cout << gpy; cout << ","; cout.width(5); cout << gpz; cout << ","; cout.width(5); cout << ge; cout << ")" << endl; float gpt = sqrt(gpx*gpx+gpy*gpy); float geta = NAN; if (gpt != 0.0) geta = asinh(gpz/gpt); float gphi = atan2(gpy,gpx); cout << "(eta,phi,e,pt) = ("; cout.width(5); cout << geta; cout << ","; cout.width(5); cout << gphi; cout << ","; cout.width(5); cout << ge; cout << ","; cout.width(5); cout << gpt; cout << ")" << endl; PHG4VtxPoint* vtx = trutheval->get_vertex(primary); float gvx = vtx->get_x(); float gvy = vtx->get_y(); float gvz = vtx->get_z(); cout << " vtrue = ("; cout.width(5); cout << gvx; cout << ","; cout.width(5); cout << gvy; cout << ","; cout.width(5); cout << gvz; cout << ")" << endl; cout << " embed = " << trutheval->get_embed(primary) << endl; cout << " edep = " << trutheval->get_shower_energy_deposit(primary) << endl; cout << " mrad = " << trutheval->get_shower_moliere_radius(primary) << endl; std::set<RawCluster*> clusters = clustereval->all_clusters_from(primary); for (std::set<RawCluster*>::iterator clusiter = clusters.begin(); clusiter != clusters.end(); ++clusiter) { RawCluster* cluster = (*clusiter); float ntowers = cluster->getNTowers(); float eta = cluster->get_eta(); float phi = cluster->get_phi(); float e = cluster->get_energy(); float efromtruth = clustereval->get_energy_contribution(cluster, primary); cout << " => #" << cluster->get_id() << " (eta,phi,e) = ("; cout.width(5); cout << eta; cout << ","; cout.width(5); cout << phi; cout << ","; cout.width(5); cout << e; cout << "), ntowers = "<< ntowers <<", efromtruth = " << efromtruth << endl; } } cout << endl; } return; }
int QAG4SimulationCalorimeter::process_event_G4Hit(PHCompositeNode *topNode) { if (verbosity > 2) cout << "QAG4SimulationCalorimeter::process_event_G4Hit() entered" << endl; TH1F* h = nullptr; Fun4AllHistoManager *hm = QAHistManagerDef::getHistoManager(); assert(hm); TH1D* h_norm = dynamic_cast<TH1D*>(hm->getHisto( get_histo_prefix() + "_Normalization")); assert(h_norm); // get primary assert(_truth_container); PHG4TruthInfoContainer::ConstRange primary_range = _truth_container->GetPrimaryParticleRange(); double total_primary_energy = 1e-9; //make it zero energy epsilon samll so it can be used for denominator for (PHG4TruthInfoContainer::ConstIterator particle_iter = primary_range.first; particle_iter != primary_range.second; ++particle_iter) { const PHG4Particle *particle = particle_iter->second; assert(particle); total_primary_energy += particle->get_e(); } assert(not _truth_container->GetMap().empty()); const PHG4Particle * last_primary = _truth_container->GetMap().rbegin()->second; assert(last_primary); if (verbosity > 2) { cout << "QAG4SimulationCalorimeter::process_event_G4Hit() handle this truth particle" << endl; last_primary->identify(); } const PHG4VtxPoint* primary_vtx = // _truth_container->GetPrimaryVtx(last_primary->get_vtx_id()); assert(primary_vtx); if (verbosity > 2) { cout << "QAG4SimulationCalorimeter::process_event_G4Hit() handle this vertex" << endl; primary_vtx->identify(); } const double t0 = primary_vtx->get_t(); const TVector3 vertex(primary_vtx->get_x(), primary_vtx->get_y(), primary_vtx->get_z()); // projection axis TVector3 axis_proj(last_primary->get_px(), last_primary->get_py(), last_primary->get_pz()); if (axis_proj.Mag() == 0) axis_proj.SetXYZ(0, 0, 1); axis_proj = axis_proj.Unit(); // azimuthal direction axis TVector3 axis_azimuth = axis_proj.Cross(TVector3(0, 0, 1)); if (axis_azimuth.Mag() == 0) axis_azimuth.SetXYZ(1, 0, 0); axis_azimuth = axis_azimuth.Unit(); // polar direction axis TVector3 axis_polar = axis_proj.Cross(axis_azimuth); assert(axis_polar.Mag() > 0); axis_polar = axis_polar.Unit(); double e_calo = 0.0; // active energy deposition double ev_calo = 0.0; // visible energy double ea_calo = 0.0; // absorber energy double ev_calo_em = 0.0; // EM visible energy if (_calo_hit_container) { TH2F * hrz = dynamic_cast<TH2F*>(hm->getHisto( get_histo_prefix() + "_G4Hit_RZ")); assert(hrz); TH2F * hxy = dynamic_cast<TH2F*>(hm->getHisto( get_histo_prefix() + "_G4Hit_XY")); assert(hxy); TH1F * ht = dynamic_cast<TH1F*>(hm->getHisto( get_histo_prefix() + "_G4Hit_HitTime")); assert(ht); TH2F * hlat = dynamic_cast<TH2F*>(hm->getHisto( get_histo_prefix() + "_G4Hit_LateralTruthProjection")); assert(hlat); h_norm->Fill("G4Hit Active", _calo_hit_container->size()); PHG4HitContainer::ConstRange calo_hit_range = _calo_hit_container->getHits(); for (PHG4HitContainer::ConstIterator hit_iter = calo_hit_range.first; hit_iter != calo_hit_range.second; hit_iter++) { PHG4Hit *this_hit = hit_iter->second; assert(this_hit); e_calo += this_hit->get_edep(); ev_calo += this_hit->get_light_yield(); // EM visible energy that is only associated with electron energy deposition PHG4Particle* particle = _truth_container->GetParticle( this_hit->get_trkid()); if (!particle) { cout <<__PRETTY_FUNCTION__<<" - Error - this PHG4hit missing particle: "; this_hit -> identify(); } assert(particle); if (abs(particle->get_pid()) == 11) ev_calo_em += this_hit->get_light_yield(); const TVector3 hit(this_hit->get_avg_x(), this_hit->get_avg_y(), this_hit->get_avg_z()); hrz->Fill(hit.Z(), hit.Perp(), this_hit->get_edep()); hxy->Fill(hit.X(), hit.Y(), this_hit->get_edep()); ht->Fill(this_hit->get_avg_t() - t0, this_hit->get_edep()); const double hit_azimuth = axis_azimuth.Dot(hit - vertex); const double hit_polar = axis_polar.Dot(hit - vertex); hlat->Fill(hit_polar, hit_azimuth, this_hit->get_edep()); } } if (_calo_abs_hit_container) { h_norm->Fill("G4Hit Absor.", _calo_abs_hit_container->size()); PHG4HitContainer::ConstRange calo_abs_hit_range = _calo_abs_hit_container->getHits(); for (PHG4HitContainer::ConstIterator hit_iter = calo_abs_hit_range.first; hit_iter != calo_abs_hit_range.second; hit_iter++) { PHG4Hit *this_hit = hit_iter->second; assert(this_hit); ea_calo += this_hit->get_edep(); } } if (verbosity > 3) cout << "QAG4SimulationCalorimeter::process_event_G4Hit::" << _calo_name << " - SF = " << e_calo / (e_calo + ea_calo + 1e-9) << ", VSF = " << ev_calo / (e_calo + ea_calo + 1e-9) << endl; if (e_calo + ea_calo > 0) { h = dynamic_cast<TH1F*>(hm->getHisto(get_histo_prefix() + "_G4Hit_SF")); assert(h); h->Fill(e_calo / (e_calo + ea_calo)); h = dynamic_cast<TH1F*>(hm->getHisto(get_histo_prefix() + "_G4Hit_VSF")); assert(h); h->Fill(ev_calo / (e_calo + ea_calo)); } h = dynamic_cast<TH1F*>(hm->getHisto( get_histo_prefix() + "_G4Hit_FractionTruthEnergy")); assert(h); h->Fill((e_calo + ea_calo) / total_primary_energy); if (ev_calo > 0) { h = dynamic_cast<TH1F*>(hm->getHisto( get_histo_prefix() + "_G4Hit_FractionEMVisibleEnergy")); assert(h); h->Fill(ev_calo_em / (ev_calo)); } if (verbosity > 3) cout << "QAG4SimulationCalorimeter::process_event_G4Hit::" << _calo_name << " - histogram " << h->GetName() << " Get Sum = " << h->GetSum() << endl; return Fun4AllReturnCodes::EVENT_OK; }