247 std:: cout <<
"----------------- Event " <<
evth_->
getEventNumber() <<
" -----------------" << std::endl;
255 int check_run = std::stoi(run.key());
256 if(check_run > run_number)
259 closest_run = check_run;
263 bpc_configs_[std::to_string(closest_run)][
"beamspot_y"],
264 bpc_configs_[std::to_string(closest_run)][
"beamspot_z"]};
270 double apMass = -0.9;
272 double apEnergy = -0.9;
274 double vdMass = -0.9;
276 double vdEnergy = -0.9;
287 for (
int iT = 0; iT <
trks_->size(); iT++)
289 if (
trks_->at(iT)->getCharge() > 0) NposTrks++;
292 _vtx_histos->Fill2DHisto(
"n_tracks_hh", NeleTrks, NposTrks);
296 for(
int i = 0; i <
mcParts_->size(); i++)
298 if(
mcParts_->at(i)->getPDG() == 622)
300 apMass =
mcParts_->at(i)->getMass();
301 apZ =
mcParts_->at(i)->getVertexPosition().at(2);
302 apEnergy =
mcParts_->at(i)->getEnergy();
304 if(
mcParts_->at(i)->getPDG() == 625)
306 vdMass =
mcParts_->at(i)->getMass();
307 vdZ =
mcParts_->at(i)->getVertexPosition().at(2);
308 vdEnergy =
mcParts_->at(i)->getEnergy();
315 std::vector<Vertex*> selected_vtxs;
316 bool passVtxPresel =
false;
319 for (
int i_ecal = 0; i_ecal <
ecal_->size(); i_ecal++ ) {
321 if (
vtxs_->size() == 0){
322 _vtx_histos->Fill1DHisto(
"EecalClus_noVtxs_h",
ecal_->at(i_ecal)->getEnergy());
324 _vtx_histos->Fill1DHisto(
"EecalClus_isVtxs_h",
ecal_->at(i_ecal)->getEnergy());
329 if (
vtxs_->size() == 0){
332 for (
int i_trk = 0; i_trk <
trks_->size(); i_trk++ ){
339 for (
int i_trk = 0; i_trk <
trks_->size(); i_trk++ ){
345 std::cout<<
"Number of vertices found in event: "<<
vtxs_->size()<<std::endl;
349 for (
int i_vtx = 0; i_vtx <
vtxs_->size(); i_vtx++ ) {
354 Track* ele_trk =
nullptr;
356 Track* pos_trk =
nullptr;
365 bool foundParts =
_ah->GetParticlesFromVtx(vtx,ele,pos);
367 if(
debug_) std::cout<<
"VertexAnaProcessor::WARNING::Found vtx without ele/pos. Skip."<<std::endl;
372 bool foundTracks =
_ah->MatchToGBLTracks((ele->
getTrack()).getID(),(pos->
getTrack()).getID(),
373 ele_trk, pos_trk, *
trks_);
376 if(
debug_) std::cout<<
"VertexAnaProcessor::ERROR couldn't find ele/pos in the GBLTracks collection"<<std::endl;
404 TLorentzVector p_ele;
406 TLorentzVector p_pos;
441 double botClusTime = 0.0;
446 if (!
vtxSelector->passCutLt(
"botCluTime_lt", botClusTime, weight))
449 if (!
vtxSelector->passCutGt(
"botCluTime_gt", botClusTime, weight))
453 if (!
vtxSelector->passCutLt(
"eleposCluTimeDiff_lt",fabs(corr_eleClusterTime - corr_posClusterTime),weight))
457 if (!
vtxSelector->passCutLt(
"eleTrkCluTimeDiff_lt",fabs(ele_trk->
getTrackTime() - corr_eleClusterTime),weight))
461 if (!
vtxSelector->passCutLt(
"posTrkCluTimeDiff_lt",fabs(pos_trk->
getTrackTime() - corr_posClusterTime),weight))
500 if (!
vtxSelector->passCutLt(
"eleMom_lt",ele_mom.Mag(),weight))
504 if (!
vtxSelector->passCutGt(
"eleMom_gt",ele_mom.Mag(),weight))
508 if (!
vtxSelector->passCutGt(
"posMom_gt",pos_mom.Mag(),weight))
516 if (!
vtxSelector->passCutGt(
"eleN2Dhits_gt",ele2dHits,weight)) {
525 if (!
vtxSelector->passCutGt(
"posN2Dhits_gt",pos2dHits,weight)) {
540 if (!
vtxSelector->passCutLt(
"chi2unc_lt",vtx->getChi2(),weight))
544 if (!
vtxSelector->passCutLt(
"maxVtxMom_lt",(ele_mom+pos_mom).Mag(),weight))
549 if (!
vtxSelector->passCutGt(
"minVtxMom_gt",(ele_mom+pos_mom).Mag(),weight))
559 double ele_pos_dt = corr_eleClusterTime - corr_posClusterTime;
560 double psum = ele_mom.Mag()+pos_mom.Mag();
564 _vtx_histos->Fill1DHisto(
"ele_track_n2dhits_h", ele2dHits, weight);
565 _vtx_histos->Fill1DHisto(
"pos_track_n2dhits_h", pos2dHits, weight);
566 _vtx_histos->Fill1DHisto(
"vtx_Psum_h", p_ele.P()+p_pos.P(), weight);
567 _vtx_histos->Fill1DHisto(
"vtx_Esum_h", ele_E + pos_E, weight);
568 _vtx_histos->Fill1DHisto(
"ele_pos_clusTimeDiff_h", (corr_eleClusterTime - corr_posClusterTime), weight);
583 _vtx_histos->Fill2DHisto(
"ele_pos_clusTimeDiff_v_pSum_hh",ele_mom.Mag()+pos_mom.Mag(), ele_pos_dt, weight);
594 _vtx_histos->Fill2DHisto(
"ele_track_chi2ndf_v_n2dhits_hh", ele2dHits, ele_trk->
getChi2Ndf(), weight);
599 _vtx_histos->Fill2DHisto(
"pos_track_chi2ndf_v_n2dhits_hh", pos2dHits, pos_trk->
getChi2Ndf(), weight);
609 passVtxPresel =
true;
611 selected_vtxs.push_back(vtx);
617 _vtx_histos->Fill1DHisto(
"n_vertices_h",selected_vtxs.size());
634 Vertex* goodVtx =
nullptr;
635 std::vector<Vertex*> goodVtxs;
640 for (
auto vtx : selected_vtxs) {
649 _ah->GetParticlesFromVtx(vtx,ele,pos);
674 Track* ele_trk_gbl =
nullptr;
675 Track* pos_trk_gbl =
nullptr;
678 bool foundTracks =
_ah->MatchToGBLTracks(ele_trk.
getID(),pos_trk.
getID(),
679 ele_trk_gbl, pos_trk_gbl, *
trks_);
683 std::cout<<
"VertexAnaProcessor::ERROR couldn't find ele/pos in the "<<
trkColl_ <<
"collection"<<std::endl;
689 ele_trk_gbl = (
Track*) ele_trk.Clone();
690 pos_trk_gbl = (
Track*) pos_trk.Clone();
697 TLorentzVector p_ele;
699 TLorentzVector p_pos;
707 std::cout<<
"Check on ele_Track"<<std::endl;
711 bool foundL1ele =
false;
712 bool foundL2ele =
false;
713 _ah->InnermostLayerCheck(ele_trk_gbl, foundL1ele, foundL2ele);
717 std::cout<<
"Check on pos_Track"<<std::endl;
720 bool foundL1pos =
false;
721 bool foundL2pos =
false;
723 _ah->InnermostLayerCheck(pos_trk_gbl, foundL1pos, foundL2pos);
726 std::cout<<
"Check on pos_Track"<<std::endl;
727 std::cout<<
"Innermost:"<<foundL1pos<<
" Second Innermost:"<<foundL2pos<<std::endl;
762 double botClusTime = 0.0;
774 if (!
_reg_vtx_selectors[region]->passCutLt(
"eleposCluTimeDiff_lt",fabs(corr_eleClusterTime - corr_posClusterTime),weight))
856 if (!
_reg_vtx_selectors[region]->passCutLt(
"maxVtxMom_lt",(ele_mom+pos_mom).Mag(),weight))
860 if (!
_reg_vtx_selectors[region]->passCutGt(
"minVtxMom_gt",(ele_mom+pos_mom).Mag(),weight))
866 if (!
_reg_vtx_selectors[region]->passCutEq(
"L1Requirement_eq",(
int)(foundL1ele&&foundL1pos),weight))
870 if (!
_reg_vtx_selectors[region]->passCutEq(
"L2Requirement_eq",(
int)(foundL2ele&&foundL2pos),weight))
935 TRefArray ele_trk_hits = ele_trk_gbl->
getSvtHits();
936 TRefArray pos_trk_hits = pos_trk_gbl->
getSvtHits();
937 std::map<int, std::vector<int> > trueHitIDs;
938 for(
int i = 0; i <
hits_->size(); i++)
944 std::map<int, int> nHits4part;
945 for(
int i = 0; i < ele_trk_hits.GetEntries(); i++)
948 for(
int idI = 0; idI < trueHitIDs[eleHit->
getID()].size(); idI++ )
950 int partID = trueHitIDs[eleHit->
getID()].at(idI);
951 if ( nHits4part.find(partID) == nHits4part.end() )
954 nHits4part[partID] = 1;
959 nHits4part[partID]++;
967 for (std::map<int,int>::iterator it=nHits4part.begin(); it!=nHits4part.end(); ++it)
969 if(it->second > maxNHits)
971 maxNHits = it->second;
981 trueEleP.SetXYZ(-999,-999,-999);
982 truePosP.SetXYZ(-999,-999,-999);
986 for(
int i = 0; i <
mcParts_->size(); i++)
988 int momPDG =
mcParts_->at(i)->getMomPDG();
991 std::vector<double> lP =
mcParts_->at(i)->getMomentum();
992 trueEleP.SetXYZ(lP[0],lP[1],lP[2]);
993 trueEleE =
mcParts_->at(i)->getEnergy();
998 std::vector<double> lP =
mcParts_->at(i)->getMomentum();
999 truePosP.SetXYZ(lP[0],lP[1],lP[2]);
1000 truePosE =
mcParts_->at(i)->getEnergy();
1003 if(trueEleP.X() != -999 && truePosP.X() != -999){
1004 truePsum = trueEleP.Mag() + trueEleP.Mag();
1005 trueEsum = trueEleE + truePosE;
1008 if(
mcParts_->at(i)->getID() != maxID)
continue;
1011 if(momPDG == 623) isRecEle = 1;
1014 double momRatio = recEleP.Mag() / trueEleP.Mag();
1015 double momAngle = trueEleP.Angle(recEleP) * TMath::RadToDeg();
1016 if (!
_reg_vtx_selectors[region]->passCutLt(
"momRatio_lt", momRatio, weight))
continue;
1017 if (!
_reg_vtx_selectors[region]->passCutGt(
"momRatio_gt", momRatio, weight))
continue;
1018 if (!
_reg_vtx_selectors[region]->passCutLt(
"momAngle_lt", momAngle, weight))
continue;
1020 if (!
_reg_vtx_selectors[region]->passCutEq(
"isRadEle_eq", isRadEle, weight))
continue;
1021 if (!
_reg_vtx_selectors[region]->passCutEq(
"isNotRadEle_eq", isRadEle, weight))
continue;
1022 if (!
_reg_vtx_selectors[region]->passCutEq(
"isRecEle_eq", isRecEle, weight))
continue;
1027 goodVtxs.push_back(vtx);
1034 _reg_vtx_histos[region]->Fill1DHisto(
"n_vertices_h", nGoodVtx, weight);
1037 for(std::vector<Vertex*>::iterator it = goodVtxs.begin(); it != goodVtxs.end(); it++){
1044 if (!vtx || !
_ah->GetParticlesFromVtx(vtx,ele,pos))
1061 Track* ele_trk_gbl =
nullptr;
1062 Track* pos_trk_gbl =
nullptr;
1065 bool foundTracks =
_ah->MatchToGBLTracks(ele_trk.
getID(),pos_trk.
getID(),
1066 ele_trk_gbl, pos_trk_gbl, *
trks_);
1070 std::cout<<
"VertexAnaProcessor::ERROR couldn't find ele/pos in the "<<
trkColl_ <<
"collection"<<std::endl;
1076 ele_trk_gbl = (
Track*) ele_trk.Clone();
1077 pos_trk_gbl = (
Track*) pos_trk.Clone();
1081 std::vector<float> vtx_cov = vtx->getCovariance();
1082 float cxx = vtx_cov.at(0);
1083 float cyx = vtx_cov.at(1);
1084 float cyy = vtx_cov.at(2);
1085 float czx = vtx_cov.at(3);
1086 float czy = vtx_cov.at(4);
1087 float czz = vtx_cov.at(5);
1090 int L1L2hitCode = 0;
1097 if (!
_reg_vtx_selectors[region]->passCutLt(
"hitCode_lt",((
double)L1L2hitCode)-0.5, weight))
continue;
1098 if (!
_reg_vtx_selectors[region]->passCutGt(
"hitCode_gt",((
double)L1L2hitCode)+0.5, weight))
continue;
1100 _reg_vtx_histos[region]->Fill1DHisto(
"hitCode_h", L1L2hitCode,weight);
1101 _reg_vtx_histos[region]->Fill1DHisto(
"L1hitCode_h", L1hitCode,weight);
1102 _reg_vtx_histos[region]->Fill1DHisto(
"L2hitCode_h", L2hitCode,weight);
1107 bool hasL1ele =
false;
1108 bool hasL2ele =
false;
1109 _ah->InnermostLayerCheck(ele_trk_gbl, hasL1ele, hasL2ele);
1111 bool hasL1pos =
false;
1112 bool hasL2pos =
false;
1113 _ah->InnermostLayerCheck(pos_trk_gbl, hasL1pos, hasL2pos);
1115 double ele_trk_iso_L1 = 99999.9;
1116 double pos_trk_iso_L1 = 99999.9;
1117 if(hasL1ele && hasL2ele && hasL1pos && hasL2pos){
1141 double ele_pos_dt = corr_eleClusterTime - corr_posClusterTime;
1142 double psum = ele_mom.Mag()+pos_mom.Mag();
1163 for (
int iT = 0; iT <
trks_->size(); iT++)
1165 if (
trks_->at(iT)->getCharge() > 0) NposTrks++;
1168 _reg_vtx_histos[region]->Fill2DHisto(
"n_tracks_hh", NeleTrks, NposTrks);
1174 TLorentzVector p_ele;
1176 TLorentzVector p_pos;
1188 _reg_vtx_histos[region]->Fill1DHisto(
"ele_pos_clusTimeDiff_h", (corr_eleClusterTime - corr_posClusterTime), weight);
1189 _reg_vtx_histos[region]->Fill1DHisto(
"ele_track_n2dhits_h", ele2dHits, weight);
1190 _reg_vtx_histos[region]->Fill1DHisto(
"pos_track_n2dhits_h", pos2dHits, weight);
1191 _reg_vtx_histos[region]->Fill1DHisto(
"vtx_Psum_h", p_ele.P()+p_pos.P(), weight);
1203 _reg_vtx_histos[region]->Fill1DHisto(
"vtx_track_L1_isolation_h", ele_trk_iso_L1);
1204 _reg_vtx_histos[region]->Fill1DHisto(
"vtx_track_L1_isolation_h", pos_trk_iso_L1);
1210 _reg_vtx_histos[region]->Fill2DHisto(
"vtx_Psum_vs_true_Psum_hh",p_ele.P()+p_pos.P(), truePsum, weight);
1211 _reg_vtx_histos[region]->Fill1DHisto(
"true_vtx_psum_h",truePsum,weight);
1214 double reconz = vtx->getZ();
1215 double ele_trk_z0 = ele_trk_gbl->
getZ0();
1216 double ele_trk_z0err = ele_trk_gbl->
getZ0Err();
1217 double pos_trk_z0 = pos_trk_gbl->
getZ0();
1218 double pos_trk_z0err = pos_trk_gbl->
getZ0Err();
1221 double vtx_proj_x = -999.9;
1222 double vtx_proj_y = -999.9;
1223 double vtx_proj_x_sig = -999.9;
1224 double vtx_proj_y_sig = -999.9;
1225 double vtx_proj_sig = -999.9;
1228 vtx_proj_x, vtx_proj_y, vtx_proj_x_sig, vtx_proj_y_sig, vtx->getX(), vtx->getY(),
1229 reconz, vtx->getP().X(), vtx->getP().Y(), vtx->getP().Z());
1231 _reg_vtx_histos[region]->Fill2DHisto(
"unc_vtx_x_v_unc_vtx_y_hh", vtx->getX(), vtx->getY());
1232 _reg_vtx_histos[region]->Fill2DHisto(
"unc_vtx_proj_x_v_unc_vtx_proj_y_hh", vtx_proj_x, vtx_proj_y);
1233 _reg_vtx_histos[region]->Fill2DHisto(
"unc_vtx_proj_x_y_significance_hh", vtx_proj_x_sig, vtx_proj_y_sig);
1234 _reg_vtx_histos[region]->Fill2DHisto(
"recon_z_v_vtx_proj_significance_hh", vtx_proj_sig, reconz);
1235 _reg_vtx_histos[region]->Fill2DHisto(
"vtx_track_reconz_v_Z0err_hh", ele_trk_z0err, reconz);
1236 _reg_vtx_histos[region]->Fill2DHisto(
"vtx_track_reconz_v_Z0err_hh", pos_trk_z0err, reconz);
1237 _reg_vtx_histos[region]->Fill2DHisto(
"recon_z_v_z0_hh", ele_trk_z0, reconz);
1238 _reg_vtx_histos[region]->Fill2DHisto(
"recon_z_v_z0_hh", pos_trk_z0, reconz);
1241 _reg_vtx_histos[region]->Fill2DHisto(
"recon_z_v_cxx_hh", cxx, reconz);
1242 _reg_vtx_histos[region]->Fill2DHisto(
"recon_z_v_cyy_hh", cyy, reconz);
1243 _reg_vtx_histos[region]->Fill2DHisto(
"recon_z_v_czz_hh", czz, reconz);
1244 _reg_vtx_histos[region]->Fill2DHisto(
"recon_z_v_cyx_hh", cyx, reconz);
1245 _reg_vtx_histos[region]->Fill2DHisto(
"recon_z_v_czx_hh", czx, reconz);
1246 _reg_vtx_histos[region]->Fill2DHisto(
"recon_z_v_czy_hh", czy, reconz);
1259 _reg_vtx_histos[region]->Fill2DHisto(
"ele_pos_clusTimeDiff_v_pSum_hh",ele_mom.Mag()+pos_mom.Mag(), ele_pos_dt, weight);
1288 vtxPosSvt.SetX(vtx->getX());
1289 vtxPosSvt.SetY(vtx->getY());
1290 vtxPosSvt.SetZ(vtx->getZ());
1291 vtxPosSvt.RotateY(-0.0305);
1296 _reg_tuples[region]->setVariableValue(
"ap_true_vtx_z", apZ);
1297 _reg_tuples[region]->setVariableValue(
"ap_true_vtx_mass", apMass);
1298 _reg_tuples[region]->setVariableValue(
"ap_true_vtx_energy", apEnergy);
1299 _reg_tuples[region]->setVariableValue(
"vd_true_vtx_z", vdZ);
1300 _reg_tuples[region]->setVariableValue(
"vd_true_vtx_mass", vdMass);
1301 _reg_tuples[region]->setVariableValue(
"vd_true_vtx_energy", vdEnergy);
1302 _reg_tuples[region]->setVariableValue(
"hitCode",
float(L1L2hitCode));
1303 _reg_tuples[region]->setVariableValue(
"L1hitCode",
float(L1hitCode));
1304 _reg_tuples[region]->setVariableValue(
"L2hitCode",
float(L2hitCode));
1307 _reg_tuples[region]->setVariableValue(
"unc_vtx_mass", vtx->getInvMass());
1308 _reg_tuples[region]->setVariableValue(
"unc_vtx_z" , vtxPosSvt.Z());
1309 _reg_tuples[region]->setVariableValue(
"unc_vtx_chi2", vtx->getChi2());
1310 _reg_tuples[region]->setVariableValue(
"unc_vtx_psum", p_ele.P()+p_pos.P());
1311 _reg_tuples[region]->setVariableValue(
"unc_vtx_px", vtx->getP().X());
1312 _reg_tuples[region]->setVariableValue(
"unc_vtx_py", vtx->getP().Y());
1313 _reg_tuples[region]->setVariableValue(
"unc_vtx_pz", vtx->getP().Z());
1314 _reg_tuples[region]->setVariableValue(
"unc_vtx_x", vtx->getX());
1315 _reg_tuples[region]->setVariableValue(
"unc_vtx_y", vtx->getY());
1316 _reg_tuples[region]->setVariableValue(
"unc_vtx_ele_pos_clust_dt", corr_eleClusterTime - corr_posClusterTime);
1317 _reg_tuples[region]->setVariableValue(
"unc_vtx_cxx", cxx);
1318 _reg_tuples[region]->setVariableValue(
"unc_vtx_cyy", cyy);
1319 _reg_tuples[region]->setVariableValue(
"unc_vtx_czz", czz);
1320 _reg_tuples[region]->setVariableValue(
"unc_vtx_cyx", cyx);
1321 _reg_tuples[region]->setVariableValue(
"unc_vtx_czy", czy);
1322 _reg_tuples[region]->setVariableValue(
"unc_vtx_czx", czx);
1323 _reg_tuples[region]->setVariableValue(
"unc_vtx_proj_x", vtx_proj_x);
1324 _reg_tuples[region]->setVariableValue(
"unc_vtx_proj_y", vtx_proj_y);
1325 _reg_tuples[region]->setVariableValue(
"unc_vtx_proj_x_sig", vtx_proj_x_sig);
1326 _reg_tuples[region]->setVariableValue(
"unc_vtx_proj_y_sig", vtx_proj_y_sig);
1327 _reg_tuples[region]->setVariableValue(
"unc_vtx_proj_sig", vtx_proj_sig);
1330 _reg_tuples[region]->setVariableValue(
"unc_vtx_ele_track_p", ele_trk_gbl->
getP());
1332 _reg_tuples[region]->setVariableValue(
"unc_vtx_ele_track_d0", ele_trk_gbl->
getD0());
1333 _reg_tuples[region]->setVariableValue(
"unc_vtx_ele_track_phi0", ele_trk_gbl->
getPhi());
1334 _reg_tuples[region]->setVariableValue(
"unc_vtx_ele_track_omega", ele_trk_gbl->
getOmega());
1336 _reg_tuples[region]->setVariableValue(
"unc_vtx_ele_track_z0", ele_trk_gbl->
getZ0());
1338 _reg_tuples[region]->setVariableValue(
"unc_vtx_ele_track_clust_dt", ele_trk_gbl->
getTrackTime() - corr_eleClusterTime);
1340 _reg_tuples[region]->setVariableValue(
"unc_vtx_ele_track_d0Err", ele_trk_gbl->
getD0Err());
1344 _reg_tuples[region]->setVariableValue(
"unc_vtx_ele_track_L1_isolation",ele_trk_iso_L1);
1345 _reg_tuples[region]->setVariableValue(
"unc_vtx_ele_track_nhits",ele2dHits);
1347 _reg_tuples[region]->setVariableValue(
"unc_vtx_pos_track_p", pos_trk_gbl->
getP());
1349 _reg_tuples[region]->setVariableValue(
"unc_vtx_pos_track_d0", pos_trk_gbl->
getD0());
1350 _reg_tuples[region]->setVariableValue(
"unc_vtx_pos_track_phi0", pos_trk_gbl->
getPhi());
1351 _reg_tuples[region]->setVariableValue(
"unc_vtx_pos_track_omega", pos_trk_gbl->
getOmega());
1353 _reg_tuples[region]->setVariableValue(
"unc_vtx_pos_track_z0", pos_trk_gbl->
getZ0());
1355 _reg_tuples[region]->setVariableValue(
"unc_vtx_pos_track_clust_dt", pos_trk_gbl->
getTrackTime() - corr_posClusterTime);
1357 _reg_tuples[region]->setVariableValue(
"unc_vtx_pos_track_d0Err", pos_trk_gbl->
getD0Err());
1361 _reg_tuples[region]->setVariableValue(
"unc_vtx_pos_track_L1_isolation",pos_trk_iso_L1);
1362 _reg_tuples[region]->setVariableValue(
"unc_vtx_pos_track_nhits",pos2dHits);
1366 _reg_tuples[region]->setVariableValue(
"unc_vtx_ele_clust_corr_t",corr_eleClusterTime);
1369 _reg_tuples[region]->setVariableValue(
"unc_vtx_pos_clust_corr_t",corr_posClusterTime);