//*-- AUTHOR : Jerzy Pietraszko, Ilse Koenig 
//*-- Created : 03/02/2006
//*-- Modified: 14/09/2006 by P.Cabanelas

//_HADES_CLASS_DESCRIPTION 
/////////////////////////////////////////////////////////////
//
//  HRpcTrbUnpacker
//
//  Class for unpacking TRB data and filling 
//	the Rpc Raw category
//  Base subevent decoding is performed by decode function
//  see: htrbbaseunpacker.h (/base/datasource/) 
//
/////////////////////////////////////////////////////////////

using namespace std;
#include "hrpctrbunpacker.h"
#include "rpcdef.h"
#include "htrblookup.h"
#include "hrpcraw.h"
#include "hdebug.h"
#include "hades.h"
#include "hevent.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hruntimedb.h"
#include "hcategory.h"
#include "hldsubevt.h"
#include "heventheader.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>

ClassImp(HRpcTrbUnpacker) 

 HRpcTrbUnpacker::HRpcTrbUnpacker (UInt_t id):HTrbBaseUnpacker(id) {
  // constructor
  pRawCat = NULL;
  debugRpcFlag=0;
}

 Bool_t HRpcTrbUnpacker::init (void) {
  // creates the raw category and gets the pointer to the lookup table
  pRawCat = gHades->getCurrentEvent()->getCategory(catRpcRaw);
  if (!pRawCat) {
    pRawCat = gHades->getSetup()->getDetector("Rpc")->buildCategory(catRpcRaw);
    if (!pRawCat)
      return kFALSE;
    gHades->getCurrentEvent()->addCategory(catRpcRaw,pRawCat,"Rpc");
  }
  loc.set(3,0,0,0);
  lookup = (HTrbLookup *)(gHades->getRuntimeDb()->getContainer("TrbLookup"));
  return kTRUE;
}


 Int_t HRpcTrbUnpacker::execute(void) {

  HRpcRaw *pRaw = 0;	// pointer to Raw category 
  Int_t nEvt = 0;	// Evt Seq. Nb. 
  Char_t side = 'U';    // side declaration

  nEvt = gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();

  if (gHades->isCalibration()) {
    //calibration event
    //cout << " --calibration event nothing to do for forward rpc" << endl;
    return 1;
  }
  // decode subevent data
  if (pSubEvt) {		// pSubEvt - make sure that there is something for decoding 
    decode();			// decode the subevent and fill arrays, see: htrbbaseunpacker.h 

    // get the part of the lookup table which belongs to the subevent ID
    // in order to check which TRBchannel belongs to the RpcDetector

    ////////////////////////////////////////////
    //
    //  Previous HLD data are with SubEventId = 545
    //  In Hydra Allowed SubEvents Ids for TRB starts from 800...
    //  RPC ID is 852 (in principle) 
    //  
    ///////////////////////////////////////////   
    if(debugRpcFlag==802){  // FIXME: RPC ID ??
       subEvtId = 802;      // this line changes SubEventID 
    } 


    HTrbLookupBoard *board = lookup->getBoard(subEvtId);
    if (!board) {  
				// Problem: unpacker for specific SubId was called but for this SubId 
				// no channel in lookup table axist. 
				// 	
      Warning ("execute", "SubEvent: %i unpacked but channel in Lookup table does not exist", subEvtId);
    }

    //Int_t j=0;
    Int_t rightMulti=0;
    Int_t leftMulti=0;

    //fill RAW category for the Rpc detector 
    for (Int_t i = 0; i < 128; i++) {
        //j++;
        if (trbLeadingMult[i] < 1) continue;		//Leading Time data for this channel exist 

        // fill rpc raw category
        HTrbLookupChan *chan = board->getChannel(i);
        if (chan && 'R' == (Char_t)(chan->getDetector())) {	//Channel belongs to Rpc det
		//cout << "--Evnt Nb " << nEvt << "t --Channel= " << i << " belongs to Rpc n";

		side = chan->getSide();
		loc[0] = (Int_t)chan->getSector();  
		loc[1] = (Int_t)chan->getModule();  
		loc[2] = (Int_t)chan->getCell();  
		pRaw = (HRpcRaw *)pRawCat->getObject(loc);
		if (!pRaw) {
	  		pRaw = (HRpcRaw *)pRawCat->getSlot(loc);
	  		if (pRaw) {
	    			pRaw = new (pRaw) HRpcRaw;
	    			pRaw->setCell((Int_t) chan->getCell());
	    			pRaw->setModule((Int_t) chan->getModule());
	    			pRaw->setSector((Int_t) chan->getSector());
	    			pRaw->setChannel(i);
				if(side=='r') {
	    				pRaw->setRightTime(trbLeadingTime[i][0]);
	    				pRaw->setRightTot(trbADC[i][0]);
					pRaw->incRightNHits();
					rightMulti++;
				} else {
	    				pRaw->setLeftTime(trbLeadingTime[i][0]);
	    				pRaw->setLeftTot(trbADC[i][0]);
					pRaw->incLeftNHits();
					leftMulti++;
				}

				if(i==127) { // FIXME: cambia la condicion de if !!
					//cout << "t rightMulti = " << rightMulti << endl;
					pRaw->setRightMult(rightMulti);
					pRaw->setLeftMult(leftMulti);
				}


	  		} else {
	    			Error ("execute()", "Can't get slotn");
	    			return -1;
	  		}
		} else {
			//
			// here you can fill more than one hit for one
            		// detector channel:  trbLeadingTime[i][j>0]
            		// Raw category has to be prepared for this
			//	 
			#if DEBUG_LEVEL>4
	  		Info ("execute()", "Slot already exists!\n");
			#endif
		}

      }   // channel belongs to RPC
    }    // for(Int_t i=0; i<128; i++)  
  }	//if(pSubEvt)

  return 1;

}


ROOT page - Class index - Class Hierarchy - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.