using namespace std;
#include "hhodotrbunpacker.h"
#include "hododef.h"
#include "htrblookup.h"
#include "hhodoraw.h"
#include "hhodorefhitpar.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>
#include "TCanvas.h"
#include "TStyle.h"
ClassImp (HHodoTrbUnpacker)
HHodoTrbUnpacker::HHodoTrbUnpacker (UInt_t id):HTrbBaseUnpacker (id)
{
pRawCat = NULL;
fNoTimeRefCorr=false;
fControlHistograms=false;
histdiagraw=NULL;
histdiagdif=NULL;
multdiag=NULL;
forced_TimeRefType=-1;
}
Bool_t HHodoTrbUnpacker::init (void)
{
pRawCat = gHades->getCurrentEvent ()->getCategory (catHodoRaw);
if (!pRawCat) {
pRawCat = gHades->getSetup ()->getDetector ("Hodo")->buildCategory (catHodoRaw);
if (!pRawCat)
return kFALSE;
gHades->getCurrentEvent ()->addCategory (catHodoRaw, pRawCat, "Hodo");
}
loc.set (2,0,0);
lookup = (HTrbLookup *) (gHades->getRuntimeDb ()->getContainer ("TrbLookup"));
if (!lookup) return kFALSE;
refhit=(HHodoRefHitPar*)gHades->getRuntimeDb()->getContainer("HodoRefHitPar");
if (!refhit) return kFALSE;
if(fControlHistograms){
TString name="TRBDiagRaw_";
name+=getSubEvtId();
histdiagraw=new TH2F(name,name,256,0,256,2000,0,20000);
name="TRBDiagDif_";
name+=getSubEvtId();
histdiagdif=new TH2F(name,name,256,0,256,1000,30000,40000);
name="MultDiag_";
name+=getSubEvtId();
multdiag=new TH2F(name,name,384,0,384,30,0,30);
}
return kTRUE;
}
Bool_t HHodoTrbUnpacker::finalize(void)
{
if(fControlHistograms){
if( histdiagraw){
histdiagraw->Write();
gStyle->SetPalette(1);
TCanvas c1("c1","c1");
histdiagraw->Draw("colz");
c1.Pad()->SetLogz();
c1.Print(histdiagraw->GetName()+TString(".ps"));
delete histdiagraw;
histdiagraw=NULL;
}
if( histdiagdif){
histdiagdif->Write();
gStyle->SetPalette(1);
TCanvas c1("c1","c1");
histdiagdif->Draw("colz");
c1.Pad()->SetLogz();
c1.Print(histdiagdif->GetName()+TString(".ps"));
delete histdiagdif;
histdiagdif=NULL;
}
if( multdiag){
multdiag->Write();
gStyle->SetPalette(1);
TCanvas c1("c1","c1");
multdiag->Draw("colz");
c1.Pad()->SetLogz();
c1.Print(multdiag->GetName()+TString(".ps"));
delete multdiag;
multdiag=NULL;
}
}
return kTRUE;
}
Int_t HHodoTrbUnpacker::correctRefTimeChVar(void)
{
Int_t refCh;
Int_t corrTime;
Int_t nEvt = gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();
for(Int_t jj=0; jj<4; jj++){
Int_t jo;
Bool_t flag;
flag=false;
jo=jj*32;
for(Int_t ll=0; ll<32; ll++){
if( trbLeadingMult[jo+ll]>0){ flag=true; break;}
}
if(!flag) continue;
refCh = jo+31;
corrTime = trbLeadingTime[refCh][0];
if(corrTime <= -1000000 ){
if(!quietMode){
Info("correctRefTimeChVar","trying to use another ref channel","No Ref Time! EventNb: %d TRBid %d TDC %d",nEvt,subEvtId,jj);
}
if(trbLeadingTime[31][0] > -1000000){
corrTime = trbLeadingTime[31][0];
if(!quietMode){
Info("correctRefTimeChVar","another ref channel found, EventNb: %d TRBid %d TDC %d",nEvt,subEvtId,jj);
}
}
else if(trbLeadingTime[63][0] > -1000000){
corrTime = trbLeadingTime[63][0];
if(!quietMode){
Info("correctRefTimeChVar","another ref channel found, EventNb: %d TRBid %d TDC %d",nEvt,subEvtId,jj);
}
}
else if(trbLeadingTime[95][0] > -1000000){
corrTime = trbLeadingTime[95][0];
if(!quietMode){
Info("correctRefTimeChVar","another ref channel found, EventNb: %d TRBid %d TDC %d",nEvt,subEvtId,jj);
}
}
else if(trbLeadingTime[127][0] > -1000000){
corrTime = trbLeadingTime[127][0];
if(!quietMode){
Info("correctRefTimeChVar","another ref channel found, EventNb: %d TRBid %d TDC %d",nEvt,subEvtId,jj);
}
}
else{
corrTime=-1000000;
if(!quietMode){
Warning("correctRefTimeChVar","Ref Time Not found ! EventNb: %d TRBid %d TDC %d",nEvt,subEvtId,jj);
}
}
}
for(Int_t ll=0; ll<32; ll++){
Int_t ii;
ii=jo+ll;
for(Int_t kk=0; kk<10; kk++){
trbLeadingTime[ii][kk] = trbLeadingTime[ii][kk] - corrTime + 40000;
trbTrailingTime[ii][kk] = trbTrailingTime[ii][kk] - corrTime + 40000;
}
}
}
return 0;
}
Int_t HHodoTrbUnpacker::execute (void)
{
HHodoRaw *pRaw = 0;
Int_t nEvt = 0;
if (gHades->isCalibration ()) {
return 1;
}
if (pSubEvt) {
nEvt = gHades->getCurrentEvent ()->getHeader ()->getEventSeqNumber ();
if(!decode()) return(-1);
Int_t wtf_trbLeadingTime[128][10];
Int_t wtf_trbADC[128][10];
Int_t wtf_flag[128][10];
if(fControlHistograms){
for (Int_t i = 0; i < 128; i++) {
Int_t m;
m=trbLeadingMult[i];
if(m>10) m=10;
for(Int_t chmult=0; chmult<m; chmult++){
wtf_trbLeadingTime[i][chmult]=trbLeadingTime[i][chmult];
wtf_trbADC[i][chmult]=trbADC[i][chmult];
wtf_flag[i][chmult]=false;
}
}
}
if(!fNoTimeRefCorr){
Int_t use_TimeRefType;
use_TimeRefType=trbDataVer;
if( forced_TimeRefType!=-1) use_TimeRefType=forced_TimeRefType;
switch(use_TimeRefType){
case 0:
case 2:
correctRefTimeChVar();
break;
case 1:
correctRefTimeCh31();
case 3:
correctRefTimeCh127();
break;
default:
break;
}
}
HTrbLookupBoard *board = lookup->getBoard (subEvtId);
if (!board) {
Warning ("execute", "SubEvent: %i unpacked but TRB Board in Lookup table does not exist", subEvtId);
return 1;
}
for (Int_t i = 0; i < 128; i++) {
if (trbLeadingMult[i] < 1 ) continue;
HTrbLookupChan *chan = board->getChannel (i);
if (chan && 'H' == (Char_t) (chan->getDetector ())) {
loc[0] = (Int_t)chan->getModule();
loc[1] = (Int_t)chan->getCell();
pRaw = (HHodoRaw *) pRawCat->getObject (loc);
if (!pRaw) {
pRaw = (HHodoRaw *) pRawCat->getSlot (loc);
if (pRaw) {
pRaw = new (pRaw) HHodoRaw;
pRaw->setAddress(loc[0], loc[1]);
}
else {
Error ("execute()", "Can't get slot");
cerr << "execute(): Can't get slot Mod: "<<(Int_t)chan->getModule() << " Slot " <<(Int_t)chan->getCell() << endl;
return -1;
}
} else {
Error ("execute()", "Slot already exists! This should not happen with TRB board data.");
cerr << "execute(): Slot already exists! Mod: "<<(Int_t)chan->getModule() << " Slot " <<(Int_t)chan->getCell() << endl;
}
HHodoRefHitParMod &pRefHit=(*refhit)[loc[0]];
Float_t lower, upper;
lower=pRefHit.getTrigRefLow();
upper=pRefHit.getTrigRefHigh();
Int_t m;
m=trbLeadingMult[i];
if(m>10) m=10;
for(Int_t chmult=0; chmult<m; chmult++){
if(lower>=upper || (trbLeadingTime[i][chmult]>=lower && trbLeadingTime[i][chmult]<=upper))
{
pRaw->fill( trbLeadingTime[i][chmult], trbADC[i][chmult]);
wtf_flag[i][chmult]=true;
}
}
}
}
if(fControlHistograms && histdiagraw && histdiagdif && multdiag){
for (Int_t i = 0; i < 128; i++) {
multdiag->Fill(i,trbLeadingMult[i]);
multdiag->Fill(i+128,trbTrailingMult[i]);
multdiag->Fill(i+256,trbTrailingTotalMult[i]);
Int_t m;
m=trbLeadingMult[i];
if(m>10) m=10;
for(Int_t chmult=0; chmult<m; chmult++){
histdiagraw->Fill(i,wtf_trbLeadingTime[i][chmult]);
histdiagdif->Fill(i,trbLeadingTime[i][chmult]);
if(wtf_flag[i][chmult]){
histdiagraw->Fill(i+128,wtf_trbLeadingTime[i][chmult]);
histdiagdif->Fill(i+128,trbLeadingTime[i][chmult]);
}
}
}
}
}
return 1;
}
void HHodoTrbUnpacker::correctRefTimeWKStyle(void)
{
Int_t corrTime = 0;
Float_t mean;
Int_t mean_cnt;
mean= 0.0;
mean_cnt=0;
for(Int_t ii=0; ii<128; ii++){
Int_t chn_mult, chn_time=0;
chn_mult=0;
for(Int_t kk=0; kk<10; kk++){
Int_t l, t,a ;
l=trbLeadingTime[ii][kk];
t=trbTrailingTime[ii][kk];
a=trbADC[ii][kk];
if(l>-1000000 && t>-1000000){
if(l>9000 && l<10000){
if( a>5 && a<50){
chn_time=l;
chn_mult++;
}
}
}
}
if( chn_mult==1){
mean+=chn_time;
mean_cnt++;
}
}
if( mean_cnt>0) mean/=mean_cnt; else mean = -1000000.0;
corrTime = (Int_t)mean;
if(corrTime > -1000000 ){
for(Int_t ii=0; ii<128; ii++){
for(Int_t kk=0; kk<10; kk++){
if( trbLeadingTime[ii][kk]!=-1000000) trbLeadingTime[ii][kk] = corrTime - trbLeadingTime[ii][kk] +20000;
if( trbTrailingTime[ii][kk]!=-1000000) trbTrailingTime[ii][kk] = corrTime - trbTrailingTime[ii][kk] +20000;
}
}
}
}
Last change: Sat May 22 12:57:38 2010
Last generated: 2010-05-22 12:57
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.