00001
00002 #include "GaudiKernel/MsgStream.h"
00003 #include "GaudiKernel/AlgFactory.h"
00004 #include "GaudiKernel/ISvcLocator.h"
00005 #include "GaudiKernel/SmartDataPtr.h"
00006 #include "GaudiKernel/IDataProviderSvc.h"
00007 #include "GaudiKernel/PropertyMgr.h"
00008 #include "EventModel/EventModel.h"
00009 #include "EventModel/Event.h"
00010 #include "EventModel/EventHeader.h"
00011 #include "EvtRecEvent/EvtRecEvent.h"
00012 #include "EvtRecEvent/EvtRecTrack.h"
00013
00014 #include "MdcRecEvent/RecMdcTrack.h"
00015 #include "EmcRecEventModel/RecEmcEventModel.h"
00016 #include "TofRecEvent/RecTofTrack.h"
00017 #include "DstEvent/TofHitStatus.h"
00018 #include "MucRawEvent/MucDigi.h"
00019 #include "MucRecEvent/RecMucTrack.h"
00020
00021 #include "TMath.h"
00022 #include "GaudiKernel/INTupleSvc.h"
00023 #include "GaudiKernel/NTuple.h"
00024 #include "GaudiKernel/Bootstrap.h"
00025 #include "GaudiKernel/IHistogramSvc.h"
00026 #include "CLHEP/Vector/ThreeVector.h"
00027 using CLHEP::Hep3Vector;
00028 #include "CLHEP/Vector/LorentzVector.h"
00029 using CLHEP::HepLorentzVector;
00030 #include "CLHEP/Vector/TwoVector.h"
00031 using CLHEP::Hep2Vector;
00032 #include "CLHEP/Geometry/Point3D.h"
00033 #ifndef ENABLE_BACKWARDS_COMPATIBILITY
00034 typedef HepGeom::Point3D<double> HepPoint3D;
00035 #endif
00036 #include "VertexFit/KinematicFit.h"
00037 #include "VertexFit/VertexFit.h"
00038 #include "VertexFit/SecondVertexFit.h"
00039 #include "DimuPreSelect/DimuPreSelect.h"
00040 #include <vector>
00041 typedef std::vector<int> Vint;
00042 typedef std::vector<HepLorentzVector> Vp4;
00043 const double ECMS = 3.097;
00044 const double VELC = 299.792458;
00045 const double PI = 3.14159265;
00046 const double XMASS[5] = { 0.000511, 0.105658, 0.139570, 0.493677, 0.938272 };
00047
00049 DimuPreSelect::DimuPreSelect(const std::string& name, ISvcLocator* pSvcLocator) :
00050 Algorithm(name, pSvcLocator)
00051 {
00052 declareProperty("CmsEnergy", m_ecms = 3.686);
00053 declareProperty("Vr0Cut", m_vr0cut = 1.0);
00054 declareProperty("Vz0Cut", m_vz0cut = 5.0);
00055 declareProperty("PUpCut", m_pcut_up = 2.0);
00056 declareProperty("PDownCut", m_pcut_down = 0.5);
00057 declareProperty("PSymCut", m_psymcut = 0.5);
00058 declareProperty("TCut", m_tcut = 4);
00059 declareProperty("EUpCut", m_ecut_up = 1.0);
00060 declareProperty("EDownCut", m_ecut_down = 0.1);
00061 declareProperty("DThetaCut", m_dthetacut = 0.05);
00062 declareProperty("DPhiCut", m_dphicut = 0.4);
00063 declareProperty("PartSelect", m_partselect= 0);
00064 declareProperty("MuDigiCut", m_mudigicut = 6);
00065 declareProperty("MuTrkCut", m_mutrkcut = 1);
00066 declareProperty("UseMDC", m_useFlag[0]= 1);
00067 declareProperty("UseTOF", m_useFlag[1]= 1);
00068 declareProperty("UseEMC", m_useFlag[2]= 1);
00069 declareProperty("UseMUC", m_useFlag[3]= 1);
00070 declareProperty ("Output", m_output = false);
00071
00072 declareProperty ("SelectDimu",m_selectFlag= true);
00073
00074 }
00075
00076
00077 StatusCode DimuPreSelect::initialize()
00078 {
00079 MsgStream log(msgSvc(), name());
00080 log << MSG::INFO << "in initialize()" << endmsg;
00081
00082 m_totevent = m_currun = m_curevent = 0;
00083 for(int i = 0; i < 20; i++) m_cutpass[i] = 0;
00084 m_subpass[0] = m_subpass[1] = m_subpass[2] = m_subpass[3] = 0;
00085 m_totalpass = 0;
00086
00087 if(m_output)
00088 {
00089 StatusCode status;
00090 NTuplePtr nt(ntupleSvc(), "FILE1/dimu");
00091 if ( nt ) m_passtuple = nt;
00092 else {
00093 m_passtuple = ntupleSvc()->book ("FILE1/dimu", CLID_ColumnWiseTuple, "DimuPreSelect N-Tuple example");
00094 if ( m_passtuple )
00095 {
00096 status =m_passtuple->addItem ("run", m_run);
00097 status =m_passtuple->addItem ("event", m_event);
00098 status =m_passtuple->addItem ("part", m_part);
00099 status =m_passtuple->addItem ("c1", m_c1);
00100 status =m_passtuple->addItem ("c2", m_c2);
00101 status =m_passtuple->addItem ("r1", m_r1);
00102 status =m_passtuple->addItem ("r2", m_r2);
00103 status =m_passtuple->addItem ("z1", m_z1);
00104 status =m_passtuple->addItem ("z2", m_z2);
00105 status =m_passtuple->addItem ("p1", m_p1);
00106 status =m_passtuple->addItem ("p2", m_p2);
00107 status =m_passtuple->addItem ("t1", m_t1);
00108 status =m_passtuple->addItem ("t2", m_t2);
00109 status =m_passtuple->addItem ("e1", m_e1);
00110 status =m_passtuple->addItem ("e2", m_e2);
00111 status =m_passtuple->addItem ("theta1",m_theta1);
00112 status =m_passtuple->addItem ("theta2",m_theta2);
00113 status =m_passtuple->addItem ("phi1", m_phi1);
00114 status =m_passtuple->addItem ("phi2", m_phi2);
00115 status =m_passtuple->addItem ("mudigi",m_mudigi);
00116 status =m_passtuple->addItem ("mutrk", m_mutrk);
00117
00118 status =m_passtuple->addItem ("zeroC", m_zeroCFlag);
00119 status =m_passtuple->addItem ("vtRZ", m_vtRZFlag);
00120 status =m_passtuple->addItem ("pLim", m_pLimFlag);
00121 status =m_passtuple->addItem ("pSym", m_pSymFlag);
00122 status =m_passtuple->addItem ("tLim", m_tLimFlag);
00123 status =m_passtuple->addItem ("eLim", m_eLimFlag);
00124 status =m_passtuple->addItem ("eBB", m_eBBFlag);
00125 status =m_passtuple->addItem ("partSlt",m_partFlag);
00126 status =m_passtuple->addItem ("muDigiN",m_mudigiFlag);
00127 status =m_passtuple->addItem ("muTrkN", m_mutrkFlag);
00128
00129 status =m_passtuple->addItem ("mdc", m_mdcFlag);
00130 status =m_passtuple->addItem ("tof", m_tofFlag);
00131 status =m_passtuple->addItem ("emc", m_emcFlag);
00132 status =m_passtuple->addItem ("muc", m_mucFlag);
00133
00134 }
00135 else
00136 {
00137 log << MSG::ERROR << "Cannot book N-tuple:"<<long(m_passtuple)<<endmsg;
00138 return StatusCode::FAILURE;
00139 }
00140 }
00141 }
00142
00143 log << MSG::INFO << "Initialize done!" << endmsg;
00144
00145 return StatusCode::SUCCESS;
00146 }
00147
00148
00149 StatusCode DimuPreSelect::execute()
00150 {
00151 if(m_selectFlag==false) return( StatusCode::SUCCESS );
00152
00153 MsgStream log(msgSvc(),name());
00154 log<<MSG::INFO<<"in execute()"<<endreq;
00155
00156 m_totevent ++;
00157 if(m_totevent%1000==0) std::cout << m_totevent << "\tdone!" <<std::endl;
00158
00159 setFilterPassed(false);
00160 m_mdcPass = m_tofPass = m_emcPass = m_mucPass = false;
00161 for(int i=0; i<4; i++) m_passFlag[i] = false;
00162
00163 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),"/Event/EventHeader");
00164 m_currun = eventHeader->runNumber();
00165 m_curevent = eventHeader->eventNumber();
00166 if( m_output ) { m_run = m_currun; m_event = m_curevent; }
00167
00168
00169 SmartDataPtr<RecMdcTrackCol> mdcTrackCol(eventSvc(),"/Event/Recon/RecMdcTrackCol");
00170 if(!mdcTrackCol) {
00171 log << MSG::FATAL << "Could not find RecMdcTrackCol!" << endreq;
00172 return( StatusCode::FAILURE);
00173 }
00174 log << MSG::INFO << "MDC tracks:\t" << mdcTrackCol->size() << endreq;
00175
00176 if( mdcTrackCol->size() != 2 ) return ( StatusCode::SUCCESS );
00177
00178 m_cutpass[0] += 1;
00179
00180 double c1, c2, r1, r2, z1, z2, p1, p2;
00181 c1 = c2 = r1 = r2 = z1 = z2 = p1 = p2 = 0.;
00182
00183 c1 = (*mdcTrackCol)[0]->charge(); c2 = (*mdcTrackCol)[1]->charge();
00184 r1 = (*mdcTrackCol)[0]->r(); r2 = (*mdcTrackCol)[1]->r();
00185 z1 = (*mdcTrackCol)[0]->z(); z2 = (*mdcTrackCol)[1]->z();
00186 p1 = (*mdcTrackCol)[0]->p(); p2 = (*mdcTrackCol)[1]->p();
00187
00188 if( m_output ) { m_c1 = c1; m_c2 = c2; m_r1 = r1; m_r2 = r2; m_z1 = z1; m_z2 = z2; m_p1 = p1; m_p2 = p2; }
00189
00190 bool mdcflag1 = c1 + c2 == 0;
00191 bool mdcflag2 = fabs(r1)<=m_vr0cut && fabs(z1)<m_vz0cut;
00192 bool mdcflag3 = fabs(r2)<=m_vr0cut && fabs(z2)<m_vz0cut;
00193 bool mdcflag4 = p1<m_pcut_up && p2<m_pcut_up;
00194
00195
00196 bool mdcflag5 = fabs( p1-p2 )/( p1+p2 ) < m_psymcut;
00197
00198 log << MSG::INFO << "r1:\t" << r1 << "\tz1:" << z1 << endreq;
00199 log << MSG::INFO << "r2:\t" << r2 << "\tz2:" << z2 << endreq;
00200 log << MSG::INFO << "p1:\t" << p1 << "\tp2:" << p2 << endreq;
00201
00202 if( mdcflag1 ) { m_cutpass[1] += 1; if(m_output) m_zeroCFlag = 1; }
00203 if( mdcflag2 && mdcflag3 ) { m_cutpass[2] += 1; if(m_output) m_vtRZFlag = 1; }
00204 if( mdcflag4 ) { m_cutpass[3] += 1; if(m_output) m_pLimFlag = 1; }
00205 if( mdcflag5 ) { m_cutpass[4] += 1; if(m_output) m_pSymFlag = 1; }
00206 if( mdcflag1 && mdcflag2 && mdcflag3 && mdcflag4 && mdcflag5 ) { m_mdcPass = true; m_subpass[0] += 1; }
00207 if( !m_useFlag[0] ) m_passFlag[0] = true;
00208 else m_passFlag[0] = m_mdcPass;
00209 log << MSG::INFO << "MDC selection done!" << endreq;
00210
00211
00212 SmartDataPtr<RecTofTrackCol> tofTrackCol(eventSvc(),"/Event/Recon/RecTofTrackCol");
00213 if(!tofTrackCol) {
00214 log << MSG::FATAL << "Could not find RecTofTrackCol!" << endreq;
00215 return( StatusCode::FAILURE);
00216 }
00217 log << MSG::INFO << "TOF tracks:\t" << tofTrackCol->size() << endreq;
00218
00219 double t1, t2;
00220 t1 = 0., t2 = 1000;
00221
00222 if(tofTrackCol->size() > 7 && tofTrackCol->size() < 21)
00223 {
00224 int goodtof = 0;
00225 for(int itof = 0; itof < tofTrackCol->size(); itof++)
00226 {
00227 TofHitStatus *status = new TofHitStatus;
00228 status->setStatus((*tofTrackCol)[itof]->status());
00229
00230 if( !(status->is_cluster()) ) { delete status; continue; }
00231 if(goodtof==0) t1 = (*tofTrackCol)[itof]->tof();
00232 if(goodtof==1) t2 = (*tofTrackCol)[itof]->tof();
00233
00234 goodtof++;
00235 delete status;
00236 }
00237 }
00238
00239 if( m_output ) { m_t1 = t1; m_t2 = t2; }
00240
00241 bool tofflag1 = fabs( t1-t2 ) < m_tcut;
00242 log << MSG::INFO << "t1:\t" << t1 << "\tt2:" << t2 << "dt:\t" << fabs(t1-t2) << endreq;
00243 if( tofflag1 ) { m_cutpass[5] += 1; if(m_output) m_tLimFlag = 1; m_tofPass = true; m_subpass[1] += 1; }
00244 if( !m_useFlag[1] ) m_passFlag[1] = true;
00245 else m_passFlag[1] = m_tofPass;
00246 log << MSG::INFO << "TOF selection done!" << endreq;
00247
00248
00249 SmartDataPtr<RecEmcShowerCol> emcShowerCol(eventSvc(),"/Event/Recon/RecEmcShowerCol");
00250 if (!emcShowerCol) {
00251 log << MSG::FATAL << "Could not find RecEmcShowerCol!" << endreq;
00252 return( StatusCode::FAILURE);
00253 }
00254 log << MSG::INFO << "EMC showers:\t" << emcShowerCol->size() << endreq;
00255
00256 if( emcShowerCol->size() < 2 ) return ( StatusCode::SUCCESS );
00257
00258 double e1, e2, theta1, theta2, phi1, phi2;
00259 int part;
00260
00261 e1 = (*emcShowerCol)[0]->energy(); e2 = (*emcShowerCol)[1]->energy();
00262 theta1 = (*emcShowerCol)[0]->theta(); theta2 = (*emcShowerCol)[1]->theta();
00263 phi1 = (*emcShowerCol)[0]->phi(); phi2 = (*emcShowerCol)[1]->phi();
00264 part = (*emcShowerCol)[0]->module();
00265
00266 if( m_output ) { m_e1 = e1; m_e2 = e2; m_theta1 = theta1; m_theta2 = theta2; m_phi1 = phi1; m_phi2 = phi2;
00267 m_part = part;
00268 }
00269
00270 bool emcFlag1 = e1 < m_ecut_up && e1 > m_ecut_down;
00271 bool emcFlag2 = e2 < m_ecut_up && e2 > m_ecut_down;
00272 bool emcFlag3 = fabs(theta1 + theta2 - PI) < m_dthetacut;
00273 bool emcFlag4 = fabs(phi1 - phi2) - PI < m_dphicut;
00274 bool emcFlag5 = !m_partselect || (m_partselect==1&&part==1) || (m_partselect==2&&part!=1);
00275
00276 log << MSG::INFO << "e1:\t" << e1 << "\te2:\t" << e2 << endreq;
00277 log << MSG::INFO << "theta1:\t" << theta1 << "\ttheta2:\t" << theta2 << endreq;
00278 log << MSG::INFO << "phi1:\t" << phi1 << "\tphi2:\t" << phi2 << endreq;
00279 log << MSG::INFO << "part:\t" << part << "\tpartFlag:\t" << emcFlag5 << endreq;
00280
00281 if( emcFlag1 && emcFlag2 ) { m_cutpass[6] += 1; if(m_output) m_eLimFlag = 1; }
00282 if( emcFlag3 && emcFlag4 ) { m_cutpass[7] += 1; if(m_output) m_eBBFlag = 1; }
00283 if( emcFlag5 ) { m_cutpass[8] += 1; if(m_output) m_partFlag = 1; }
00284 if( emcFlag1 && emcFlag2 && emcFlag3 && emcFlag4 && emcFlag5 ) { m_emcPass = true; m_subpass[2] += 1; }
00285 if( !m_useFlag[2] ) m_passFlag[2] = true;
00286 else m_passFlag[2] = m_emcPass;
00287 log << MSG::INFO << "EMC selection done!" << endreq;
00288
00289
00290 SmartDataPtr<MucDigiCol> mucDigiCol(eventSvc(),"/Event/Digi/MucDigiCol");
00291 if(!mucDigiCol) {
00292 log << MSG::FATAL << "Could not find MucDigiCol!" << endreq;
00293 return( StatusCode::FAILURE);
00294 }
00295 SmartDataPtr<RecMucTrackCol> mucTrackCol(eventSvc(),"/Event/Recon/RecMucTrackCol");
00296 if (!mucTrackCol) {
00297 log << MSG::FATAL << "Could not find RecMucTrackCol" << endreq;
00298 return( StatusCode::FAILURE);
00299 }
00300
00301 int mudigiNum, mutrkNum;
00302 mudigiNum = mutrkNum = 0;
00303 mudigiNum = mucDigiCol->size(); mutrkNum = mucTrackCol->size();
00304 if(m_output) { m_mudigi = mudigiNum; m_mutrk = mutrkNum; }
00305
00306 bool mucflag1 = mudigiNum >= m_mudigicut;
00307 bool mucflag2 = mutrkNum >= m_mutrkcut;
00308
00309 log << MSG::INFO << "MUC digi:\t" << mudigiNum << "\tMUC track:\t" << mutrkNum << endreq;
00310
00311 if( mucflag1 ) { m_cutpass[9] += 1; if(m_output) m_mudigiFlag = 1; }
00312 if( mucflag2 ) { m_cutpass[10] += 1; if(m_output) m_mutrkFlag = 1; }
00313 if( mucflag1 && mucflag2 ) { m_mucPass = true; m_subpass[3] += 1; }
00314 if( !m_useFlag[3] ) m_passFlag[3] = true;
00315 else m_passFlag[3] = m_mucPass;
00316 log << MSG::INFO << "MUC selection done!" << endreq;
00317
00318
00319
00320 if( m_passFlag[0] && m_passFlag[1] && m_passFlag[2] && m_passFlag[3] )
00321 {
00322 m_totalpass += 1;
00323 setFilterPassed(true);
00324 }
00325 log << MSG::INFO << "Set filter passed!" << endreq;
00326
00327 if(m_output) { m_mdcFlag = m_mdcPass; m_tofFlag = m_tofPass; m_emcFlag = m_emcPass; m_mucFlag = m_mucPass; }
00328
00329 if( m_output ) m_passtuple->write();
00330
00331 return StatusCode::SUCCESS;
00332 }
00333
00334 StatusCode DimuPreSelect::finalize()
00335 {
00336 if(m_selectFlag==false) return StatusCode::SUCCESS;
00337
00338 MsgStream log(msgSvc(), name());
00339 log << MSG::INFO << "in finalize()" << endmsg;
00340 const string str[3] = {"all","barrel","endcap"};
00341
00342 cout << "pass 0 - 2 MDC tracks : " << m_cutpass[0] << endl;
00343 cout << "pass 1 - 0 charge : " << m_cutpass[1] << endl;
00344 cout << "pass 2 - |r|<"<<m_vr0cut<<" && |z|<"<<m_vz0cut<<" : " << m_cutpass[2] << endl;
00345 cout << "pass 3 - p < "<<m_pcut_up<<" GeV/c : " << m_cutpass[3] << endl;
00346 cout << "pass 4 - p_sym < "<<m_psymcut<<" : " << m_cutpass[4] << endl;
00347 cout << "pass 5 - |t1-t1| < "<<m_tcut<<" ns : " << m_cutpass[5] << endl;
00348 cout << "pass 6 - "<<m_ecut_down<<" < e < "<<m_ecut_up<<" : " << m_cutpass[6] << endl;
00349 cout << "pass 7 - |dth|<"<<m_dthetacut<<" && |dphi|<"<<m_dphicut<<": " << m_cutpass[7] << endl;
00350 cout << "pass 8 - "<< str[(int)m_partselect] <<" part is selected : " << m_cutpass[8] << endl;
00351 cout << "pass 9 - mudigi >= "<<m_mudigicut<<" : " << m_cutpass[9] << endl;
00352 cout << "pass 10- mutrk >= "<<m_mutrkcut<<" : " << m_cutpass[10]<< endl;
00353
00354 cout << "pass MDC : " << m_subpass[0] << "\tUsed: " << (m_useFlag[0]?"Yes":"No") << endl;
00355 cout << "pass TOF : " << m_subpass[1] << "\tUsed: " << (m_useFlag[1]?"Yes":"No") << endl;
00356 cout << "pass EMC : " << m_subpass[2] << "\tUsed: " << (m_useFlag[2]?"Yes":"No") << endl;
00357 cout << "pass MUC : " << m_subpass[3] << "\tUsed: " << (m_useFlag[3]?"Yes":"No") << endl;
00358
00359
00360 cout<<"Total event: " << m_totevent <<endl;
00361 cout<<"Dimu event: " << m_totalpass <<endl;
00362
00363 return StatusCode::SUCCESS;
00364 }