Class Reference for E1039 Core & Analysis Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
AnaSimDst.cc
Go to the documentation of this file.
1 #include <iomanip>
2 #include <TFile.h>
3 #include <TTree.h>
8 #include <ktracker/SRecEvent.h>
10 #include <phool/getClass.h>
11 #include <UtilAna/UtilDimuon.h>
12 #include "AnaSimDst.h"
13 using namespace std;
14 
16 {
18 }
19 
21 {
22  int ret = GetNodes(topNode);
23  if (ret != Fun4AllReturnCodes::EVENT_OK) return ret;
24  MakeTree();
26 }
27 
29 {
30  static unsigned int n_evt = 0;
31  if (++n_evt % 100000 == 0) cout << n_evt << endl;
32  else if (n_evt % 10000 == 0) cout << " . " << flush;
33 
37  mo_evt.proc_id = mi_evt_true->get_process_id();
38  for (int ii = 0; ii < 4; ii++) {
39  mo_evt.par_id [ii] = mi_evt_true->get_particle_id (ii);
40  mo_evt.par_mom[ii] = mi_evt_true->get_particle_momentum(ii);
41  }
42  mo_evt.trig_bits = mi_evt->get_trigger();
43  mo_evt.rec_stat = mi_srec->getRecStatus();
44  mo_evt.n_dim_true = mi_vec_dim->size();
45  mo_evt.n_dim_reco = mi_srec->getNDimuons();
46 
50 // IdMap_t id_trk_t2r;
51 // FindTrackRelation(id_trk_t2r);
52 // mo_trk_true.clear();
53 // mo_trk_reco.clear();
54 // for (unsigned int ii = 0; ii < mi_vec_trk->size(); ii++) {
55 // SQTrack* trk = &mi_vec_trk->at(ii);
56 // TrackData td;
57 // td.charge = trk->charge;
58 // td.pos_vtx = trk->pos_vtx;
59 // td.mom_vtx = trk->mom_vtx;
60 // mo_trk_true.push_back(td);
61 //
62 // TrackData tdr;
63 // if (id_trk_t2r[ii] >= 0) {
64 // SRecTrack* trk_reco = &mi_srec->getTrack(id_trk_t2r[ii]);
65 // tdr.charge = trk_reco->getCharge();
66 // tdr.pos_vtx = trk_reco->getVertex();
67 // tdr.mom_vtx = trk_reco->getMomentumVertex();
68 // }
69 // mo_trk_reco.push_back(tdr);
70 // }
71 
75  IdMap_t id_dim_t2r;
76  FindDimuonRelation(id_dim_t2r);
77  mo_dim_true.clear();
78  mo_dim_reco.clear();
79  for (unsigned int ii = 0; ii < mi_vec_dim->size(); ii++) {
80  SQDimuon* dim = mi_vec_dim->at(ii);
81  DimuonData dd;
82  dd.pdg_id = dim->get_pdg_id();
83  dd.pos = dim->get_pos();
84  dd.mom = dim->get_mom();
85  dd.mom_pos = dim->get_mom_pos();
86  dd.mom_neg = dim->get_mom_neg();
87  UtilDimuon::CalcVar(dim, dd.mass, dd.pT, dd.x1, dd.x2, dd.xF, dd.costh, dd.phi);
88  mo_dim_true.push_back(dd);
89 
90  DimuonData ddr;
91  if (id_dim_t2r[ii] >= 0) {
92  SRecDimuon dim_reco = mi_srec->getDimuon(id_dim_t2r[ii]);
93  ddr.pos = dim_reco.vtx;
94  ddr.mom = dim_reco.p_pos + dim_reco.p_neg;
95  ddr.mom_pos = dim_reco.p_pos;
96  ddr.mom_neg = dim_reco.p_neg;
97  ddr.x1 = dim_reco.x1;
98  ddr.x2 = dim_reco.x2;
99  }
100  mo_dim_reco.push_back(ddr);
101  }
102 
103  tree->Fill();
105 }
106 
108 {
109  file->cd();
110  file->Write();
111  file->Close();
113 }
114 
115 int AnaSimDst::GetNodes(PHCompositeNode *topNode)
116 {
117  mi_evt = findNode::getClass<SQEvent >(topNode, "SQEvent");
118  mi_evt_true = findNode::getClass<SQMCEvent >(topNode, "SQMCEvent");
119  mi_vec_trk = findNode::getClass<SQTrackVector >(topNode, "SQTruthTrackVector");
120  mi_vec_dim = findNode::getClass<SQDimuonVector>(topNode, "SQTruthDimuonVector");
121  if (!mi_evt || !mi_evt_true || !mi_vec_trk || !mi_vec_dim) return Fun4AllReturnCodes::ABORTEVENT;
122 
123  mi_srec = findNode::getClass<SRecEvent>(topNode, "SRecEvent");
124  if (!mi_srec) return Fun4AllReturnCodes::ABORTEVENT;
125 
127 }
128 
129 void AnaSimDst::MakeTree()
130 {
131  file = new TFile("sim_tree.root", "RECREATE");
132  tree = new TTree("tree", "Created by AnaSimDst");
133 
134  //tree->Branch("sqevt" , mi_evt);
135  tree->Branch("evt" , &mo_evt);
136  //tree->Branch("trk_true", &mo_trk_true);
137  //tree->Branch("trk_reco", &mo_trk_reco);
138  tree->Branch("dim_true", &mo_dim_true);
139  tree->Branch("dim_reco", &mo_dim_reco);
140 }
141 
142 void AnaSimDst::FindTrackRelation(IdMap_t& id_map)
143 {
144  id_map.clear();
145  for (unsigned int i_true = 0; i_true < mi_vec_trk->size(); i_true++) {
146  SQTrack* trk_true = mi_vec_trk->at(i_true);
147  int ch_true = trk_true->get_charge();
148  double mom_true = trk_true->get_mom_vtx().Mag();
149 
150  int i_reco_best = -1;
151  double mom_diff_best;
152  for (int i_reco = 0; i_reco < mi_srec->getNTracks(); i_reco++) {
153  SRecTrack* trk_reco = &mi_srec->getTrack(i_reco);
154  if (trk_reco->getCharge() != ch_true) continue;
155  double mom_diff = fabs(trk_reco->getMomentumVertex().Mag() - mom_true);
156  if (i_reco_best < 0 || mom_diff < mom_diff_best) {
157  i_reco_best = i_reco;
158  mom_diff_best = mom_diff;
159  }
160  }
161  id_map[i_true] = i_reco_best;
162  }
163 }
164 
165 void AnaSimDst::FindDimuonRelation(IdMap_t& id_map)
166 {
167  id_map.clear();
168  for (unsigned int i_true = 0; i_true < mi_vec_dim->size(); i_true++) {
169  SQDimuon* dim_true = mi_vec_dim->at(i_true);
170  double mass_true = dim_true->get_mom().M();
171 
172  int i_reco_best = -1;
173  double mass_diff_best;
174  for (int i_reco = 0; i_reco < mi_srec->getNDimuons(); i_reco++) {
175  SRecDimuon dim_reco = mi_srec->getDimuon(i_reco);
176  double mass_diff = fabs(dim_reco.mass - mass_true);
177  if (i_reco_best < 0 || mass_diff < mass_diff_best) {
178  i_reco_best = i_reco;
179  mass_diff_best = mass_diff;
180  }
181  }
182  id_map[i_true] = i_reco_best;
183  }
184 }
virtual int get_pdg_id() const =0
Return the GPD ID of parent particle. It is valid only for true dimuon.
double phi
Definition: TreeData.h:44
int InitRun(PHCompositeNode *topNode)
Definition: AnaSimDst.cc:20
virtual TLorentzVector get_mom_vtx() const =0
Return the track momentum at vertex.
TLorentzVector mom
Definition: TreeData.h:35
TLorentzVector p_neg
Definition: SRecEvent.h:364
int process_event(PHCompositeNode *topNode)
Definition: AnaSimDst.cc:28
int pdg_id
Definition: TreeData.h:33
double costh
Definition: TreeData.h:43
Double_t x2
Definition: SRecEvent.h:386
Double_t mass
Definition: SRecEvent.h:382
int Init(PHCompositeNode *topNode)
Definition: AnaSimDst.cc:15
void CalcVar(const SQDimuon *dim, double &mass, double &pT, double &x1, double &x2, double &xF, double &costh, double &phi)
Calculate the key kinematic variables of dimuon.
Definition: UtilDimuon.cc:52
double x2
Definition: TreeData.h:41
virtual TLorentzVector get_mom() const =0
Return the dimuon momentum at vertex.
virtual TLorentzVector get_mom_neg() const =0
Return the momentum of the negative track at vertex.
Double_t x1
Definition: SRecEvent.h:385
TVector3 pos
Definition: TreeData.h:34
virtual TVector3 get_pos() const =0
Return the dimuon position at vertex.
virtual int get_charge() const =0
Return the charge, i.e. +1 or -1.
int End(PHCompositeNode *topNode)
Called at the end of all processing.
Definition: AnaSimDst.cc:107
An SQ interface class to hold one true or reconstructed track.
Definition: SQTrack.h:8
virtual TLorentzVector get_mom_pos() const =0
Return the momentum of the positive track at vertex.
TLorentzVector getMomentumVertex()
Get the vertex info.
Definition: SRecEvent.cxx:340
TLorentzVector p_pos
Definition: SRecEvent.h:363
TVector3 vtx
Definition: SRecEvent.h:371
double xF
Definition: TreeData.h:42
TLorentzVector mom_pos
Definition: TreeData.h:36
Int_t getCharge() const
Gets.
Definition: SRecEvent.h:100
double pT
Definition: TreeData.h:39
An SQ interface class to hold one true or reconstructed dimuon.
Definition: SQDimuon.h:8
double x1
Definition: TreeData.h:40
double mass
Definition: TreeData.h:38
TLorentzVector mom_neg
Definition: TreeData.h:37