00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "AtlfastAlgs/ClusterKtStrategy.h"
00011 #include "AtlfastEvent/Cell.h"
00012 #include "AtlfastEvent/KtCluster.h"
00013 #include "AtlfastEvent/ICluster.h"
00014 #include "AtlfastEvent/CollectionDefs.h"
00015
00016 #include "KtJet/KtLorentzVector.h"
00017 #include "KtJet/KtEvent.h"
00018
00019
00020 #include "GaudiKernel/MsgStream.h"
00021
00022
00023 #include "CLHEP/Vector/LorentzVector.h"
00024 #include <map>
00025 #include <vector>
00026
00027
00028 namespace Atlfast {
00029
00030 ClusterKtStrategy::ClusterKtStrategy(double minet, double rp, std::string angle, std::string recom, int subjet) :
00031 m_minClusterET(minet), m_rParameter(rp), m_subjet(subjet){
00032
00033 if(angle == "angular") {m_angle = 1;}
00034 else if (angle == "deltaR") {m_angle = 2;}
00035 else if (angle == "QCD") {m_angle = 3;}
00036 else{
00037 std::cerr << "Warning, unknown Kt angle scheme. Scheme set to \"angular\"" << std::endl;
00038 m_angle = 1;
00039 }
00040
00041 if(recom == "E") {m_recom = 1;}
00042 else if (recom == "pt") {m_recom = 2;}
00043 else if (recom == "pt2") {m_recom = 3;}
00044 else if (recom == "et") {m_recom = 4;}
00045 else if (recom == "et2") {m_recom = 5;}
00046 else{
00047 std::cerr << "Warning, unknown Kt recombination scheme. Scheme set to \"E\"" << std::endl;
00048 m_recom = 1;
00049 }
00050 }
00051
00052 void
00053 ClusterKtStrategy::makeClusters(
00054 MsgStream& log,
00055 const std::vector<IKinematic*>& storedCells,
00056 IKinematicVector& unusedCells,
00057 IClusterCollection* clusters) const {
00058 log << MSG::DEBUG << storedCells.size() << " cells to start with"<<endreq;
00059
00064 std::vector<IKinematic*>::const_iterator itr = storedCells.begin();
00065 std::vector<KtJet::KtLorentzVector> jetvec;
00066 std::map<KtJet::KtLorentzVector,IKinematic*> CellMap;
00067 for(; itr != storedCells.end() ; ++itr){
00068 KtJet::KtLorentzVector tempVec = KtJet::KtLorentzVector((*itr)->momentum());
00069 jetvec.push_back(tempVec);
00070 CellMap[tempVec] = (*itr);
00071 }
00072 log << MSG::DEBUG << "Made jetvec"<<endreq;
00077 KtJet::KtEvent ev(jetvec,4,m_angle,m_recom,m_rParameter);
00078 log << MSG::DEBUG << "Made KtEvent"<<endreq;
00079
00081 vector<KtJet::KtLorentzVector> jets0 = ev.getJets();
00086 log << MSG::DEBUG << "Got events jets "<< jets0.size() << endreq;
00087 std::vector<KtJet::KtLorentzVector>::const_iterator iter = jets0.begin();
00088 for (; iter != jets0.end() ; ++iter){
00089 if((*iter).et() > m_minClusterET) {
00090 std::vector<KtJet::KtLorentzVector> tompVec;
00091 tompVec = (*iter).copyConstituents();
00092
00093 std::vector<IKinematic*> tempCellVec;
00094 std::vector<KtJet::KtLorentzVector>::const_iterator iter2 = tompVec.begin();
00095 for (; iter2 != tompVec.end() ; ++iter2){
00096 if(CellMap.find((*iter2)) == CellMap.end()){
00097 log << MSG::ERROR << "Cannot find this key" << endreq;
00098 }else {
00099 tempCellVec.push_back(CellMap[(*iter2)]);
00100 CellMap.erase((*iter2));
00101
00102 }
00103 }
00104
00105 double yCut = 0.;
00106 if(m_subjet){
00107 KtJet::KtEvent subev(*iter,m_angle,m_recom);
00108 yCut = subev.getYMerge(m_subjet);
00109 }
00110
00111 ICluster* clu = new KtCluster(*iter,tempCellVec.begin(),tempCellVec.end(),yCut);
00112 log << MSG::DEBUG << "Made a KtCluster" << endreq;
00114 clusters->push_back(clu);
00115 }
00116 }
00117
00118 log << MSG::DEBUG
00119 << "Number of clusters Made by Kt algo " << clusters->size()
00120 << endreq;
00122 std::map<KtJet::KtLorentzVector,IKinematic*>::iterator celit =
00123 CellMap.begin();
00124
00125 for (; celit != CellMap.end() ; ++celit){
00126
00127 unusedCells.push_back( ( (*celit).second ) );
00128
00129 log << MSG::DEBUG
00130 << "Size of unusedCells vector " << unusedCells.size()
00131 << endreq;
00132 }
00133
00134 return;
00135 }
00136
00137 }
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148