00001
00002
00003
00004 #include "reconstruction/TriggerRecon.h"
00005
00006 #include "data/CsIData.h"
00007 #include "data/GlastData.h"
00008
00009 #include "DetectorData.h"
00010
00011 #include "reconstruction/ReconVisitor.h"
00012
00013 #include <algorithm>
00014 using namespace std;
00015
00016
00017 map<idents::ModuleId, int> TriggerRecon::TrigTowers;
00018 const int TriggerRecon::MaxNumTowers = 60;
00019
00020
00021 TriggerRecon::TriggerRecon ()
00022 : Recon()
00023 {
00024 setTitle("TriggerRecon: ver 2.1");
00025 #if 0 // THB: remove
00026
00027 i_Triage_Time = data.addElement("Triage_Time");
00028 i_bits = data.addElement("Trig_Bits");
00029 i_Energy_max_Twr = data.addElement("Trig_max_Twr_E");
00030 i_Energy_max_Xtl = data.addElement("Trig_max_Xtl_E");
00031 i_Count = data.addElement("Trig_1x1");
00032 i_CV_Count = data.addElement("Trig_cv_Vetos");
00033 i_Gd_Trig = data.addElement("Trig_1x1_Gd_Trig");
00034 i_Level2_Trig = data.addElement("Trig_Level2_Bits");
00035 i_Dead_Time = data.addElement("Dead_Time");
00036 i_Max_FE_Buff = data.addElement("Max_FE_Buff");
00037 i_Total_Evt_Size = data.addElement("Total_Evt_Size");
00038 i_Max_Evt_Size = data.addElement("Max_Evt_Size");
00039 i_Max_TEM_Thrpt = data.addElement("Max_TEM_Thrpt");
00040 i_Max_RO_Time = data.addElement("Max_RO_Time");
00041 i_N_Hits = data.addElement("N_Tracker_Hits");
00042
00043 i_L2_Layers = data.addElement("L2_Layers");
00044 i_L2_Top = data.addElement("L2_Top");
00045 i_L2_Mid = data.addElement("L2_Mid");
00046 i_L2_Bot = data.addElement("L2_Bot");
00047 i_L2_Dsize = data.addElement("L2_Dsize");
00048 i_L3_flag = data.addElement("L3_flag");
00049 i_L3_vetoFlag = data.addElement("L3_vetoFlag");
00050 i_L3_nTracks = data.addElement("L3_nTracks");
00051 #endif
00052 }
00053
00054 void TriggerRecon::accept (ReconVisitor& rv)
00055 {
00056 rv.visit(this);
00057 }
00058
00059 void TriggerRecon::reconstruct (const GlastData* glastdata)
00060 {
00061 if(state() == DONE) return;
00062 #if 0 //THB: put may problems to solve here
00063
00064
00065 const CsIData* csi = glastdata->getCsIData();
00066
00067 map<ModuleId, float, less<ModuleId> > tower_sum;
00068
00069 float max_e_tower=0,
00070 max_e_xtal=0;
00071
00072 for(int layer=0; layer < Calorimeter::numberOfLayers(); layer++)
00073 {
00074 int nh = csi->nHits(layer);
00075 for(int i=0; i<nh; i++) {
00076 float e = csi->energy(layer, i);
00077 max_e_xtal = max(max_e_xtal, e);
00078 ModuleId id = csi->moduleId(layer,i);
00079 tower_sum[id] += e;
00080 max_e_tower = std::max(max_e_tower, tower_sum[id]);
00081 }
00082 }
00083
00084 int noCV=0, no1x1=0, no1x1Trig=0, bitsL2=0, bitsL1=0, maxThrpt = 0,
00085 maxFEBuff = 0, totalEvtSize = 0;
00086 unsigned nhits = 0;
00087 double maxREvt = 0, maxROTime = 0;
00088
00089 GlastEvent* evt = glastdata->glastEvent();
00090 if (!evt) { setState(DONE); return; }
00091
00092
00093 const TEMDataMap& tem_data = evt->tem_data();
00094
00095
00096
00097 for( TEMDataMap::const_iterator it = tem_data.begin(); it != tem_data.end(); ++it) {
00098 if ((*it).second) {
00099 const TEMEvent& temevt = *(*it).second;
00100 unsigned bit = temevt.level1bits();
00101
00102 noCV += ((bit & Level1::b_ACDL) !=0);
00103 no1x1 += ((bit & Level1::b_Track) != 0);
00104 no1x1Trig += ((bit & Level1::b_Gamma) != 0);
00105 bitsL1 |= temevt.level1bits();
00106 const Level2& l2 = *temevt.level2();
00107 bitsL2 |= l2.flag();
00108 maxREvt = std::max(maxREvt, temevt.readevt_time() + temevt.sendevt_time());
00109 maxThrpt = std::max<int>(maxThrpt, temevt.throughput()*16);
00110 maxFEBuff = std::max<int>(maxFEBuff, temevt.fe_depth());
00111 nhits = std::max( nhits, temevt.data().nhits());
00112
00113 totalEvtSize += (temevt.dram()) ? temevt.dram()->size()*16 : 0;
00114 maxROTime = std::max( maxROTime, temevt.readevt_time() + temevt.sendevt_time());
00115
00116
00117 if((bit & Level1::b_Track) != 0) {
00118 TrigTowers[(*it).first] = 1;
00119 }
00120 }
00121 }
00122
00123
00124 data.addData(i_Triage_Time , evt->key());
00125 data.addData(i_bits , bitsL1 & 127);
00126 data.addData(i_Energy_max_Twr, max_e_tower);
00127 data.addData(i_Energy_max_Xtl, max_e_xtal);
00128 data.addData(i_Count , no1x1);
00129 data.addData(i_CV_Count , noCV);
00130 data.addData(i_Gd_Trig , no1x1Trig);
00131 data.addData(i_Level2_Trig , bitsL2);
00132 data.addData(i_Dead_Time , evt->dead_time());
00133 data.addData(i_Max_TEM_Thrpt , maxThrpt);
00134 data.addData(i_Max_FE_Buff , maxFEBuff);
00135 data.addData(i_Max_RO_Time , maxROTime);
00136 data.addData(i_Total_Evt_Size, totalEvtSize);
00137 data.addData(i_N_Hits , nhits);
00138 #if 0
00139
00140 L3T* l3 = L3T::instance();
00141 l3->wakeup(evt);
00142
00143 data.addData(i_L3_flag , l3->get_flag());
00144 data.addData(i_L3_vetoFlag , l3->get_vetoFlag());
00145 data.addData(i_L3_nTracks , l3->nTracks());
00146 #endif
00147 TEMDataMap::const_iterator it13 = tem_data.find(ModuleId(13));
00148 if (it13 != tem_data.end()) {
00149 const TEMEvent& t13evt = *(*it13).second;
00150
00151
00152
00153
00154
00155
00156 data.addData(i_L2_Dsize , (t13evt.dram()) ? t13evt.dram()->size() : 0);
00157 }
00158 setState(DONE);
00159 if( mode()==2 && bitsL2!=1 && ((bitsL1&64)==0))
00160 setState(FAIL);
00161 #endif
00162 return;
00163 }
00164
00165 void TriggerRecon::clear ()
00166 {
00167
00168
00169 TrigTowers.clear();
00170
00171 Recon::clear();
00172 data.clear();
00173 }
00174