Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2026-10-15 08:20:37

0001 #ifndef CUTS_H
0002 #define CUTS_H
0003 
0004 #include "binning.h"
0005 
0006 struct CutSettings
0007 {
0008   std::string name = "";
0009   std::string mother_name = "";
0010   bool isData = false;
0011 
0012   int track_1_min_MVTX_nHits = -1;
0013   int track_2_min_MVTX_nHits = -1;
0014   int track_1_min_INTT_nHits = -1;
0015   int track_2_min_INTT_nHits = -1;
0016   int track_1_min_TPC_nHits = -1;
0017   int track_2_min_TPC_nHits = -1;
0018 
0019   float primary_vertex_max_z = FLT_MAX;
0020   float track_1_min_pT = -1.;
0021   float track_2_min_pT = -1.;
0022   float track_1_max_quality = FLT_MAX;
0023   float track_2_max_quality = FLT_MAX;
0024 
0025   float track_1_PV_min_DCA_xy = -1.;
0026   float track_2_PV_min_DCA_xy = -1.;
0027   float track_1_track_2_max_DCA = FLT_MAX;
0028   float track_1_track_2_max_DCA_xy = FLT_MAX;
0029 
0030   float min_DIRA = -FLT_MAX;
0031 
0032   int max_background_order = 1;
0033   std::pair<float,float> left_sideband = {-FLT_MAX,FLT_MAX};
0034   std::pair<float,float> right_sideband = {-FLT_MAX,FLT_MAX};
0035 
0036   std::string misc_cutstring = "";
0037 };
0038 
0039 CutSettings add_misc_cutstring(const CutSettings& c, std::string newname, std::string newmisc_cutstring)
0040 {
0041   CutSettings copy = c;
0042   copy.name = newname;
0043   copy.misc_cutstring = newmisc_cutstring;
0044   return copy;
0045 }
0046 
0047 std::string generate_fiducial_cuts(const std::string& particle_name,const std::vector<HistogramInfo> variables)
0048 {
0049   std::string cut;
0050   for(size_t i=0;i<variables.size();i++)
0051   {
0052     cut += particle_name+"_"+variables[i].name+">="+std::to_string(variables[i].bins.front())
0053            +" && "+particle_name+"_"+variables[i].name+"<="+std::to_string(variables[i].bins.back());
0054     if(i<variables.size()-1) cut += " && ";
0055   }
0056   return cut;
0057 }
0058 
0059 std::string generate_selection_cutstring(const CutSettings& settings,const std::vector<HistogramInfo> variables)
0060 {
0061   std::string daughter_pt_cuts = "track_1_pT>"+std::to_string(settings.track_1_min_pT)+" && track_2_pT>"+std::to_string(settings.track_2_min_pT);
0062   std::string fiducial_cuts = generate_fiducial_cuts(settings.mother_name,variables);
0063 
0064   // in data, basically all of this is handled by KFParticle settings
0065   if(settings.isData)
0066   {
0067     std::string crossing_cuts = "track_1_bunch_crossing>0 && track_1_bunch_crossing<360 && track_2_bunch_crossing>0 && track_2_bunch_crossing<360";
0068     std::string full_cuts = crossing_cuts+" && "+daughter_pt_cuts+" && "+fiducial_cuts;
0069     if(!settings.misc_cutstring.empty()) full_cuts += " && "+settings.misc_cutstring;
0070     return full_cuts;
0071   }
0072 
0073   // in MC, KFParticle applies no cuts, and also only populates crossing 0
0074   else
0075   {
0076     std::string MC_PVz_cut = "fabs(primary_vertex_z)<="+std::to_string(settings.primary_vertex_max_z);
0077 
0078     std::string MC_nHits_cuts = "track_1_MVTX_nHits>"+std::to_string(settings.track_1_min_MVTX_nHits)
0079                               +" && track_2_MVTX_nHits>"+std::to_string(settings.track_2_min_MVTX_nHits)
0080                               +" && track_1_INTT_nHits>"+std::to_string(settings.track_1_min_INTT_nHits)
0081                               +" && track_2_INTT_nHits>"+std::to_string(settings.track_2_min_INTT_nHits)
0082                               +" && track_1_TPC_nHits>"+std::to_string(settings.track_1_min_TPC_nHits)
0083                               +" && track_2_TPC_nHits>"+std::to_string(settings.track_2_min_TPC_nHits);
0084 
0085     std::string MC_daughter_selection_cuts = "fabs(track_1_PV_DCA_xy)>="+std::to_string(settings.track_1_PV_min_DCA_xy)
0086                                            +" && fabs(track_2_PV_DCA_xy)>="+std::to_string(settings.track_2_PV_min_DCA_xy)
0087                                            +" && (track_1_chi2/track_1_nDoF)<="+std::to_string(settings.track_1_max_quality)
0088                                            +" && (track_2_chi2/track_2_nDoF)<="+std::to_string(settings.track_2_max_quality);
0089 
0090     std::string MC_mother_selection_cuts = settings.mother_name+"_DIRA>="+std::to_string(settings.min_DIRA)
0091                                          +" && track_1_track_2_DCA_xy<="+std::to_string(settings.track_1_track_2_max_DCA_xy)
0092                                          +" && track_1_track_2_DCA<="+std::to_string(settings.track_1_track_2_max_DCA);
0093 
0094     std::string full_cuts = daughter_pt_cuts+" && "+fiducial_cuts+" && "+MC_PVz_cut+" && "+MC_nHits_cuts+" && "+MC_daughter_selection_cuts+" && "+MC_mother_selection_cuts;
0095     if(!settings.misc_cutstring.empty()) full_cuts += " && "+settings.misc_cutstring;
0096     return full_cuts;
0097   }
0098 }
0099 
0100 namespace StandardCuts
0101 {
0102 
0103   // (Lambda+anti-Lambda)/2Ks data
0104   CutSettings data_K_S0_cuts =
0105   {
0106     .name = "data_K_S0_cuts",
0107     .mother_name = "K_S0",
0108     .isData = true,
0109     .track_1_min_pT = 0.2,
0110     .track_2_min_pT = 0.2,
0111 
0112     .max_background_order = 6,
0113     .left_sideband = {0.4,0.42},
0114     .right_sideband = {0.58,0.64}
0115   };
0116   CutSettings data_Lambda0_cuts =
0117   {
0118     .name = "data_Lambda0_cuts",
0119     .mother_name = "Lambda0",
0120     .isData = true,
0121     .track_1_min_pT = 0.2,
0122     .track_2_min_pT = 0.2,
0123 
0124     .max_background_order = 6,
0125     .left_sideband = {1.09,1.105},
0126     .right_sideband = {1.13,1.18}
0127   };
0128 
0129   // Lambda/Ks data
0130   CutSettings data_Lambda0_pos_cuts = add_misc_cutstring(data_Lambda0_cuts,"data_Lambda0_pos_cuts","track_1_charge==-1 && track_2_charge==1");
0131 
0132   // anti-Lambda/Ks data
0133   CutSettings data_Lambda0_neg_cuts = add_misc_cutstring(data_Lambda0_cuts,"data_Lambda0_neg_cuts","track_1_charge==1 && track_2_charge==-1");
0134 
0135   // (Lambda+anti-Lambda)/2Ks MC
0136   CutSettings MC_K_S0_cuts =
0137   {
0138     .name = "MC_K_S0_cuts",
0139     .mother_name = "K_S0",
0140     .isData = false,
0141 
0142     .track_1_min_MVTX_nHits = 0,
0143     .track_2_min_MVTX_nHits = 0,
0144     .track_1_min_INTT_nHits = 0,
0145     .track_2_min_INTT_nHits = 0,
0146     .track_1_min_TPC_nHits = 19,
0147     .track_2_min_TPC_nHits = 19,
0148 
0149     .primary_vertex_max_z = 10.,
0150     .track_1_min_pT = 0.2,
0151     .track_2_min_pT = 0.2,
0152     .track_1_max_quality = 300.,
0153     .track_2_max_quality = 300.,
0154 
0155     .track_1_PV_min_DCA_xy = 0.01,
0156     .track_2_PV_min_DCA_xy = 0.01,
0157     .track_1_track_2_max_DCA = 0.75,
0158     .track_1_track_2_max_DCA_xy = 1.25,
0159 
0160     .min_DIRA = 0.98,
0161 
0162     .max_background_order = 8,
0163     .left_sideband = {0.42,0.46},
0164     .right_sideband = {0.52,0.58}
0165   };
0166 
0167   CutSettings MC_Lambda0_cuts =
0168   {
0169     .name = "MC_Lambda0_cuts",
0170     .mother_name = "Lambda0",
0171     .isData = false,
0172 
0173     .track_1_min_MVTX_nHits = 0,
0174     .track_2_min_MVTX_nHits = 0,
0175     .track_1_min_INTT_nHits = 0,
0176     .track_2_min_INTT_nHits = 0,
0177     .track_1_min_TPC_nHits = 19,
0178     .track_2_min_TPC_nHits = 19,
0179 
0180     .primary_vertex_max_z = 10.,
0181     .track_1_min_pT = 0.2,
0182     .track_2_min_pT = 0.2,
0183     .track_1_max_quality = 300.,
0184     .track_2_max_quality = 300.,
0185 
0186     .track_1_PV_min_DCA_xy = 0.01,
0187     .track_2_PV_min_DCA_xy = 0.01,
0188     .track_1_track_2_max_DCA = 0.75,
0189     .track_1_track_2_max_DCA_xy = 1.25,
0190 
0191     .min_DIRA = 0.98,
0192 
0193     .max_background_order = 8,
0194     .left_sideband = {1.1,1.105},
0195     .right_sideband = {1.125,1.14}
0196   };
0197 
0198   // Lambda/Ks MC 
0199   CutSettings MC_Lambda0_pos_cuts = add_misc_cutstring(MC_Lambda0_cuts,"MC_Lambda0_pos_cuts","track_1_charge==-1 && track_2_charge==1");
0200 
0201   // anti-Lambda/Ks MC
0202   CutSettings MC_Lambda0_neg_cuts = add_misc_cutstring(MC_Lambda0_cuts,"MC_Lambda0_neg_cuts","track_1_charge==1 && track_2_charge==-1");
0203 
0204 } // namespace StandardCuts
0205 
0206 #endif // CUTS_H