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; }
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; }
int LeptoquarksReco::AddTrackInformation( type_map_tcan& tauCandidateMap, SvtxTrackMap* trackmap, SvtxVertexMap* vertexmap, SvtxEvalStack *svtxevalstack, double R_max ) { // Pointers for tracks // SvtxTrackEval* trackeval = svtxevalstack->get_track_eval(); SvtxTruthEval* trutheval = svtxevalstack->get_truth_eval(); /* Loop over tau candidates */ for (type_map_tcan::iterator iter = tauCandidateMap.begin(); iter != tauCandidateMap.end(); ++iter) { uint tracks_count_r02 = 0; int tracks_chargesum_r02 = 0; float tracks_rmax_r02 = 0; uint tracks_count_r04 = 0; int tracks_chargesum_r04 = 0; float tracks_rmax_r04 = 0; uint tracks_count_R = 0; int tracks_chargesum_R = 0; float tracks_rmax_R = 0; vector<float> tracks_vertex; vector<float> temp_vertex; float jet_eta = (iter->second)->get_property_float( PidCandidate::jet_eta ); float jet_phi = (iter->second)->get_property_float( PidCandidate::jet_phi ); /* Loop over tracks * (float) track->get_eta(), //eta of the track * (float) track->get_phi(), //phi of the track * (float) track->get_pt(), //transverse momentum of track * (float) track->get_p(), //total momentum of track * (float) track->get_charge(), //electric charge of track * (float) track->get_quality() //track quality */ //Loop over tracks in event // for (SvtxTrackMap::ConstIter track_itr = trackmap->begin(); track_itr != trackmap->end(); track_itr++) { SvtxTrack* track = dynamic_cast<SvtxTrack*>(track_itr->second); // Get track variables // float track_eta = track->get_eta(); float track_phi = track->get_phi(); int track_charge = track->get_charge(); double gvx,gvy,gvz; float delta_R = CalculateDeltaR( track_eta, track_phi, jet_eta, jet_phi ); PHG4Particle* g4particle = trackeval->max_truth_particle_by_nclusters(track); // Get true vertex distances // PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle); gvx = vtx->get_x(); gvy = vtx->get_y(); gvz = vtx->get_z(); // If charged track is within jet then use its vertex // if(delta_R < 0.5 && trutheval->is_primary(g4particle)) tracks_vertex.push_back(sqrt(pow(gvx,2)+pow(gvy,2)+pow(gvz,2))); /* if save_tracks set true: add track to tree */ if ( _save_tracks ) { float track_data[17] = {(float) _ievent, (float) (iter->second)->get_property_uint( PidCandidate::jet_id ), (float) (iter->second)->get_property_int( PidCandidate::evtgen_pid ), (float) (iter->second)->get_property_float( PidCandidate::evtgen_etotal ), (float) (iter->second)->get_property_float( PidCandidate::evtgen_eta ), (float) (iter->second)->get_property_float( PidCandidate::evtgen_phi ), (float) (iter->second)->get_property_uint( PidCandidate::evtgen_decay_prong ), (float) (iter->second)->get_property_uint( PidCandidate::evtgen_decay_hcharged ), (float) (iter->second)->get_property_uint( PidCandidate::evtgen_decay_lcharged ), (float) (iter->second)->get_property_float( PidCandidate::jet_eta ), (float) (iter->second)->get_property_float( PidCandidate::jet_phi ), (float) (iter->second)->get_property_float( PidCandidate::jet_etotal ), (float) track->get_quality(), (float) track_eta, (float) track_phi, (float) delta_R, (float) track->get_p() }; _ntp_track->Fill(track_data); } /* If track within search cone, update track information for tau candidate */ if ( delta_R < 0.2 ) { tracks_count_r02++; tracks_chargesum_r02 += track_charge; if ( delta_R > tracks_rmax_r02 ) tracks_rmax_r02 = delta_R; } if ( delta_R < 0.4 ) { tracks_count_r04++; tracks_chargesum_r04 += track_charge; if ( delta_R > tracks_rmax_r04 ) tracks_rmax_r04 = delta_R; } if ( delta_R < R_max ) { tracks_count_R++; tracks_chargesum_R += track_charge; if ( delta_R > tracks_rmax_R ) tracks_rmax_R = delta_R; } } // end loop over reco tracks // // sort vertex array in increasing order // std::sort(tracks_vertex.begin(),tracks_vertex.end()); // Compute average vertex distance of tracks in jet // float avg = Average(tracks_vertex); /* Set track-based properties for tau candidate */ (iter->second)->set_property( PidCandidate::tracks_count_r02, tracks_count_r02 ); (iter->second)->set_property( PidCandidate::tracks_chargesum_r02, tracks_chargesum_r02 ); (iter->second)->set_property( PidCandidate::tracks_rmax_r02, tracks_rmax_r02 ); (iter->second)->set_property( PidCandidate::tracks_count_r04, tracks_count_r04 ); (iter->second)->set_property( PidCandidate::tracks_chargesum_r04, tracks_chargesum_r04 ); (iter->second)->set_property( PidCandidate::tracks_rmax_r04, tracks_rmax_r04 ); (iter->second)->set_property( PidCandidate::tracks_count_R, tracks_count_R ); (iter->second)->set_property( PidCandidate::tracks_chargesum_R, tracks_chargesum_R ); (iter->second)->set_property( PidCandidate::tracks_rmax_R, tracks_rmax_R ); if(avg == avg) (iter->second)->set_property( PidCandidate::tracks_vertex, avg); } // end loop over tau candidates return 0; }
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; }
float PhotonJet::ConeSum(RawCluster *cluster, RawClusterContainer *cluster_container, SvtxTrackMap *trackmap, float coneradius) { float energyptsum=0; RawClusterContainer::ConstRange begin_end = cluster_container->getClusters(); RawClusterContainer::ConstIterator clusiter; for(clusiter = begin_end.first; clusiter!=begin_end.second; ++clusiter){ RawCluster *conecluster = clusiter->second; //check to make sure that the candidate isolated photon isn't being counted in the energy sum if(conecluster->get_energy() == cluster->get_energy()) if(conecluster->get_phi() == cluster->get_phi()) if(conecluster->get_eta() == cluster->get_eta()) continue; float cone_pt = conecluster->get_energy()/TMath::CosH(conecluster->get_eta()); if(cone_pt<0.2) continue; float cone_e = conecluster->get_energy(); float cone_eta = conecluster->get_eta(); float cone_phi = conecluster->get_phi(); float dphi = cluster->get_phi()-cone_phi; if(dphi<-1*pi) dphi+=2.*pi; if(dphi>pi) dphi-=2.*pi; float deta = cluster->get_eta()-cone_eta; float radius = sqrt(dphi*dphi+deta*deta); if(radius<coneradius){ energyptsum+=cone_e; } } for(SvtxTrackMap::Iter iter = trackmap->begin(); iter!=trackmap->end(); ++iter){ SvtxTrack *track = iter->second; float trackpx = track->get_px(); float trackpy = track->get_py(); float trackpt = sqrt(trackpx*trackpx+trackpy*trackpy); if(trackpt<0.2) continue; float trackphi = track->get_phi(); float tracketa = track->get_eta(); float dphi = cluster->get_phi()-trackphi; float deta = cluster->get_eta()-tracketa; float radius = sqrt(dphi*dphi+deta*deta); if(radius<coneradius){ energyptsum+=trackpt; } } return energyptsum; }
void PhotonJet::GetRecoHadronsAndJets(RawCluster *trig, SvtxTrackMap *tracks, JetMap *jets, JetRecoEval *recoeval) { float trig_phi = trig->get_phi(); float trig_eta = trig->get_eta(); for(SvtxTrackMap::Iter iter = tracks->begin(); iter!=tracks->end(); ++iter){ SvtxTrack *track = iter->second; _tr_px = track->get_px(); _tr_py = track->get_py(); _tr_pz = track->get_pz(); _tr_pt = sqrt(_tr_px*_tr_px+_tr_py*_tr_py); if(_tr_pt<0.5) continue; _tr_p = sqrt(_tr_px*_tr_px+_tr_py*_tr_py+_tr_pz*_tr_pz); _tr_phi = track->get_phi(); _tr_eta = track->get_eta(); _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(); haddphi = trig_phi-_tr_phi; if(haddphi<pi2) haddphi+=2.*pi; if(haddphi>threepi2) haddphi-=2.*pi; haddeta = trig_eta-_tr_eta; hadpout = _tr_p*TMath::Sin(haddphi); isophot_had_tree->Fill(); } for(JetMap::Iter iter = jets->begin(); iter!=jets->end(); ++iter){ Jet* jet = iter->second; Jet *truthjet = recoeval->max_truth_jet_by_energy(jet); _recojetpt = jet->get_pt(); if(_recojetpt<4.0) continue; _recojeteta = jet->get_eta(); if(fabs(_recojeteta)>1.) continue; _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(); _recojetid = jet->get_id(); 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; } jetdphi = trig_phi-_recojetphi; if(jetdphi<pi2) jetdphi+=2.*pi; if(jetdphi>threepi2) jetdphi-=2.*pi; jetdeta = trig_eta-_recojeteta; jetpout = _recojetpt*TMath::Sin(jetdphi); isophot_jet_tree->Fill(); } }