00001 #ifndef MAKEGROUPLIST__H
00002 #define MAKEGROUPLIST__H
00003
00004 #include <list>
00005 #include <algorithm>
00006 #include "Criteria.h"
00007 #include "VertexFit/KinematicFit.h"
00008 #include "CLHEP/Vector/LorentzVector.h"
00009 #include "EvtRecEvent/EvtRecEvent.h"
00010 #include "EvtRecEvent/EvtRecTrack.h"
00011 #include "Pi0Cut.h"
00012 namespace Pi0{
00013
00014
00015 typedef std::list<Criteria> CriteriaList;
00016 typedef std::list<Criteria>::iterator CriteriaIterator;
00017 typedef std::list<Criteria>::const_iterator Const_CriteriaIteator;
00018
00019 typedef std::list<GammaPair> Pi0List;
00020 typedef std::list<GammaPair>::iterator Pi0Iterator;
00021 typedef std::list<GammaPair>::const_iterator Const_Pi0Iterator;
00022
00023 typedef std::list<EvtRecTrack*> GammaList;
00024 typedef std::list<EvtRecTrack*>::iterator GammaIterator;
00025 typedef std::list<EvtRecTrack*>::const_iterator Const_GammaIterator;
00026
00027 CriteriaList default_criteria_list;
00028 Pi0List candidate_pi0_list;
00029 Pi0List filter_pi0_list;
00030 GammaList default_gamma_list;
00031
00032
00033 GammaList& GetDefaultGammaList() { return default_gamma_list;}
00034
00035 Pi0List& GetCandidatePi0List() { return candidate_pi0_list;}
00036 Pi0List& GetFilterPi0List() { return filter_pi0_list;}
00037
00038
00039 GammaList& make_gamma_list(UserPi0Cut& cut)
00040 {
00041 EvtRecEvent* recEvt = UserPi0Cut::recEvt;
00042 EvtRecTrackCol* recTrkCol = UserPi0Cut::recTrkCol;
00043
00044 default_gamma_list.clear();
00045
00046 for(int i1 = recEvt->totalCharged(); i1 < (recEvt->totalTracks()); ++i1)
00047 {
00048
00049 EvtRecTrack* gTrk = *(recTrkCol->begin() + i1);
00050 if(cut.isGoodPhoton(gTrk))
00051 {
00052 default_gamma_list.push_back(gTrk);
00053
00054 }
00055 }
00056 return default_gamma_list;
00057 }
00058
00059
00060
00061
00062
00063
00064 void print_gamma_list(const GammaList& list)
00065 {
00066 if(list.size() == 0) {std::cout<<"GammaList->()"<<std::endl; return;}
00067 std::cout<<"GammaList->(";
00068 for(Const_GammaIterator it = list.begin(); it!= list.end(); it++)
00069 {
00070 std::cout<<(*it)->trackId()<<", ";
00071 }
00072 std::cout<<')'<<std::endl;
00073 }
00074
00075 Pi0List& make_pi0_list(const GammaList& gamma_list)
00076 {
00077 candidate_pi0_list.clear();
00078 Const_GammaIterator i_it = gamma_list.begin();
00079 Const_GammaIterator i_it_end = gamma_list.end();
00080 Const_GammaIterator j_it_end = gamma_list.end();
00081
00082 --i_it_end;
00083
00084
00085 Const_GammaIterator j_it ;
00086 for(; i_it != i_it_end; ++i_it)
00087 {
00088 for( j_it = i_it, ++j_it ; j_it != j_it_end; ++j_it)
00089 {
00090
00091 EvtRecTrack* g1Trk = *i_it;
00092 EvtRecTrack* g2Trk = *j_it;
00093
00094 RecEmcShower* g1Shower = g1Trk->emcShower();
00095 RecEmcShower* g2Shower = g2Trk->emcShower();
00096 double inv_m = (getP4(g1Shower) + getP4(g2Shower)).m();
00097
00098
00099
00100
00101
00102
00103
00104 candidate_pi0_list.push_back(GammaPair(*i_it, *j_it, inv_m));
00105 }
00106 }
00107 return candidate_pi0_list;
00108 }
00109 void print_pi0_list(const Pi0List& list)
00110 {
00111 std::cout<<"OK Pi0List->{";
00112 for(Const_Pi0Iterator it = list.begin(); it!= list.end(); it++)
00113 {
00114 std::cout<<"("<<(*it).inv_m<<","<<(*it).First->trackId()<<","<<(*it).Second->trackId()<<"), ";
00115 }
00116 std::cout<<'}'<<std::endl;
00117 }
00118 Pi0List& apply_criteria(const Criteria& cri)
00119 {
00120 Pi0Iterator it = candidate_pi0_list.begin();
00121 for(; it!=candidate_pi0_list.end();)
00122 {
00123 if( cri.check(*it))
00124 ++it;
00125 else{
00126 filter_pi0_list.push_back(*it);
00127 it = candidate_pi0_list.erase(it);
00128 }
00129
00130 }
00131 return candidate_pi0_list;
00132 }
00133 void Pi0ListToTDS(const Pi0List& pi0list, EvtRecPi0Col* recPi0Col)
00134 {
00135 assert(recPi0Col);
00136 static double xmpi0= 0.1349766;
00137 KinematicFit * kmfit = KinematicFit::instance();
00138
00139 for(Const_Pi0Iterator it = pi0list.begin(); it != pi0list.end(); ++it)
00140 {
00141 EvtRecTrack* g1Trk = (*it).First;
00142 EvtRecTrack* g2Trk = (*it).Second;
00143 RecEmcShower* g1Shower = g1Trk->emcShower();
00144 RecEmcShower* g2Shower = g2Trk->emcShower();
00145
00146 kmfit->init();
00147 kmfit->AddTrack(0, 0.0, g1Shower);
00148 kmfit->AddTrack(1, 0.0, g2Shower);
00149 kmfit->AddResonance(0, xmpi0, 0, 1);
00150 kmfit->Fit(0);
00151
00152 HepLorentzVector g1P4 = getP4(g1Shower);
00153 HepLorentzVector g2P4 = getP4(g2Shower);
00154 HepLorentzVector p2g = g1P4 + g2P4;
00155 EvtRecPi0* recPi0 = new EvtRecPi0();
00156
00157 recPi0->setUnconMass(p2g.restMass());
00158 recPi0->setChisq(kmfit->chisq(0));
00159 if ( g1P4.e() >= g2P4.e() ) {
00160 recPi0->setHiPfit(kmfit->pfit(0));
00161 recPi0->setLoPfit(kmfit->pfit(1));
00162 recPi0->setHiEnGamma(g1Trk);
00163 recPi0->setLoEnGamma(g2Trk);
00164 }
00165 else {
00166 recPi0->setHiPfit(kmfit->pfit(1));
00167 recPi0->setLoPfit(kmfit->pfit(0));
00168 recPi0->setHiEnGamma(g2Trk);
00169 recPi0->setLoEnGamma(g1Trk);
00170 }
00171
00172 recPi0Col->push_back(recPi0);
00173 }
00174 }
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202 void apply_criterias()
00203 {
00204 for(CriteriaIterator it = default_criteria_list.begin(); it != default_criteria_list.end(); ++it)
00205 {
00206 apply_criteria(*it);
00207 }
00208 }
00209 void add_cut(const Criteria& cri)
00210 {
00211 default_criteria_list.push_back(cri);
00212 }
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 }
00233 #endif