Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

TriggerRecon.cxx

Go to the documentation of this file.
00001 //  $Header: /nfs/slac/g/glast/ground/cvs/reconstruction/src/TriggerRecon.cxx,v 1.13 2000/12/11 16:38:45 burnett Exp $
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");     // hsg: changed version to 2.1 with level 2 addition
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     // Get energy info from the CsI data
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     // get readout data statistics, if available. otherwise we are done here.
00092 
00093     const TEMDataMap&       tem_data = evt->tem_data();
00094     // get access to stored readout data...
00095 
00096     // statistics
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) {  // This tower triggered  (3 in a row in tracker)
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); // mask off system bits for now!
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     //Perform Level 3 trigger
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     //unused    const Level2& t13L2 = *t13evt.level2();
00151 /*
00152     data.addData(i_L2_Layers     , t13L2.c_layers);
00153     data.addData(i_L2_Top       , t13L2.c_top);
00154     data.addData(i_L2_Mid       , t13L2.c_mid);
00155     data.addData(i_L2_Bot       , t13L2.c_bot); */
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    // not STL (not in SGI version)   TrigTowers.assign(MaxNumTowers, (int)0);
00168    // hsg: use map for TrigTowers - same functionality.
00169    TrigTowers.clear();
00170 
00171    Recon::clear();
00172    data.clear();
00173 }
00174 

Generated at Wed Nov 21 12:20:45 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000