//------------------------------------------------------------------- // File and Version Information: // $Id: InitSvtDataBlock.cc,v 1.6 2005/08/19 22:14:24 rlc Exp $ // // Initialization of the Stntuple SVT track block. This is the place // which is called every event and offline data is converted to // stntuple data. Here we loop over SVT/XTRP tracks and fill up // TSvtDataBlock. // // Author List: // Subir Sarkar University of Rome //------------------------------------------------------------------- #include #include #include #include "Edm/Handle.hh" #include "ErrorLogger_i/gERRLOG.hh" #include #include #include "TriggerObjects/SVTD_StorableBank.hh" #include #include "Stntuple/mod/StntupleUtilities.hh" #include #include "TClonesArray.h" //_____________________________________________________________________________ void SvtDataBlock_ForceLoad() { // force pulling in of TSvtDataBlock.o TSvtDataBlock* block = 0; block->ForceLoad(); } Int_t StntupleInitSvtDataBlock(TStnDataBlock *block, AbsEvent *event, int mode) { // initialize SVT data block with the `event' data // return -1, if bank doesn't exist, 0, if everything is OK // check if block has already been initialised int ev_number, rn_number; ev_number = AbsEnv::instance()->trigNumber(); rn_number = AbsEnv::instance()->runNumber(); if (block->Initialized(ev_number, rn_number)) return 0; TSvtDataBlock *data = (TSvtDataBlock *) block; data->Clear(); EventRecord::ConstIterator iter(event, "SVTD_StorableBank"); if (!iter.is_valid()) return -1; ConstHandle svtd_h(iter); #ifdef __DEBUG_SVTD__ std::cout << "Dump of SVTD bank: " << std::endl; svtd_h->svtd_print(); #endif // Unpack SVTD bank data int pb0 = svtd_h->get_block_pointer(); int peod = svtd_h->get_eod(); int pc0 = svtd_h->get_card_pointer(); int peoc = svtd_h->get_eob(); // Check if End Event is OK int eei = svtd_h->get_ee_position(); if (eei == -1) { #ifdef __DEBUG_SVTD__ std::cout << "End Event word not found " << " Run " << std::dec << rn_number << ", Trigger " << std::dec << ev_number << std::endl; #endif return -1; } // Get End Event word and fill data block int eeword = svtd_h->get_word(eei); data->SetEEWord(eeword); // Get number of tracks int ntracks = svtd_h->get_number_of_tracks(); // Loop on tracks for (int trk = 0; trk < ntracks; trk++) { // Check if the track has 7 words: int trk_words = svtd_h->get_nwords(trk); if (trk_words != SVTD_SIZE) { std::cout << "Track n. " << trk << " has only " << trk_words << " words, skipped." << std::endl; continue; } // Get beginning of packet int bop = svtd_h->get_bop(trk); // Get track packet Int_t svt_track[SVTD_SIZE]; for (int i = 0; i < SVTD_SIZE; i++) { svt_track[i] = svtd_h->get_word(bop+i); } TSvtTrack *svt_t = data->NewSvtTrack(SVTD_SIZE, svt_track); #ifdef __DEBUG_SVTD__ svt_t->Print(); #endif } // Are there XTRP words ? int lep = svtd_h->get_last_eop(); int n_xtrp_words = eei - lep - 1; // Unpack XPRP words if (n_xtrp_words > 0) { for (int i = 1; i <= n_xtrp_words; i++) { Int_t xtrp_word = svtd_h->get_word(lep+i); // Find valid tracks Int_t wedge = ((xtrp_word & 0xfff) >> 3)/24; Int_t ptbin = (xtrp_word >> 12) & 0x7f; Bool_t shrt = ((xtrp_word >> 20) & 0x1) ? kTRUE : kFALSE; Bool_t junk = kFALSE; Float_t pt = 0.; Bool_t illegal = TSvXtTrack::CalculatePt(shrt, ptbin, &pt); if ( (wedge == 1) && (ptbin == 0) ) junk = kTRUE; TSvXtTrack *xft_t = data->NewSvXtTrack(xtrp_word, (!junk && !illegal)); } } float beam3D[4]; UnpackSvtBeamline(event,beam3D); data->SetBeamSpot(beam3D); data->f_EventNumber = ev_number; data->f_RunNumber = rn_number; return 0; }