9#include <arich/modules/arichBtest/arichBtestModule.h> 
   16#include <framework/datastore/StoreObjPtr.h> 
   17#include <framework/dataobjects/EventMetaData.h> 
   18#include <framework/datastore/StoreArray.h> 
   19#include <framework/logging/Logger.h> 
   20#include <framework/gearbox/Unit.h> 
   23#include <boost/algorithm/string.hpp> 
   24#include <boost/foreach.hpp> 
   28#include <arich/dataobjects/ARICHDigit.h> 
   29#include <arich/dataobjects/ARICHAeroHit.h> 
   30#include "arich/geometry/ARICHGeometryPar.h" 
   31#include "arich/geometry/ARICHBtestGeometryPar.h" 
   33#include "arich/modules/arichBtest/arichBtestData.h" 
   39#include <Math/Vector3D.h> 
   40#include <Math/Rotation3D.h> 
   66    setDescription(
"Module for the ARICH Beamtest data analysis. It creates track form the MWPC hits and reads the HAPD hits");
 
   69    addParam(
"outputFileName", 
m_outFile, 
"Output Root Filename", std::string(
"output.root"));
 
   70    std::vector<std::string> defaultList;
 
   72    std::vector<int> defaultMask;
 
   77    for (
int i = 0; i < 32; i++) 
m_tdc[i] = 0;
 
   95    B2INFO(
"arichBtestModule::initialize()");
 
   99    digits.registerInDataStore();
 
  102    m_tuple = 
new TNtuple(
"nt", 
"Btest data hits", 
"x:y:xrec:yrec:m:c:gx:gy");
 
  104    for (
int i = 0; i < 6; i++) {
 
  105      sprintf(hapdName, 
"hapd%d", i);
 
  106      hapd[i] = 
new TH1F(hapdName, hapdName, 145, -0.5, 144.5);
 
  110    for (
int i = 0; i < 4; i++) {
 
  111      for (
int k = 0; k < 2; k++) {
 
  112        sprintf(name, 
"mwpc%d_a%d_", i, k);
 
  113        mwpc_diff[i][k]     = 
new TH1F(strcat(name, 
"diff"), name, 300, -150, 150);
 
  114        sprintf(name, 
"mwpc%d_a%d_", i, k);
 
  115        mwpc_sum[i][k]      = 
new TH1F(strcat(name, 
"sum"), name, 200, -0.5, 199.5);
 
  116        sprintf(name, 
"mwpc%d_a%d_", i, k);
 
  117        mwpc_sum_cut[i][k]      = 
new TH1F(strcat(name, 
"sum_cut"), name, 200, -0.5, 199.5);
 
  118        sprintf(name, 
"mwpc%d_a%d_", i, k);
 
  119        mwpc_residuals[i][k] = 
new TH1F(strcat(name, 
"resd"), name, 200, -100, 100);
 
  120        sprintf(name, 
"mwpc%d_a%d_", i, k);
 
  121        mwpc_residualsz[i][k] = 
new TH2F(strcat(name, 
"resd_z"), name, 200, -25, 25, 400, -1000, 1000);
 
  123      for (
int k = 0; k < 5; k++) {
 
  124        sprintf(name, 
"mwpc%d_a%d_", i, k);
 
  125        mwpc_tdc[i][k]     = 
new TH1F(strcat(name, 
"tdc"), name, 1024, -1024, 1024);
 
  127      sprintf(name, 
"mwpc%d_", i);
 
  128      mwpc_xy[i] = 
new TH2F(strcat(name, 
"xy"), name, 120, -30, 30, 120, -30, 30);
 
  152    B2INFO(
"arichBtestModule::beginRun()");
 
  155    B2INFO(
"arichBtestModule::eventMetaDataPtr run:" << eventMetaDataPtr->getRun());
 
  156    B2INFO(
"arichBtestModule::eventMetaDataPtr exp:" << eventMetaDataPtr->getExperiment());
 
  161    static int first = 1;
 
  178      m_fp = gzopen((*m_runCurrent).c_str(), 
"rb");
 
  193    gzread(fp, &u, 
sizeof(
unsigned int));
 
  194    gzseek(fp, u * 
sizeof(
unsigned int), SEEK_CUR);
 
  201    const int unsigned MAXV1290 = 32;
 
  208    for (
int i = 0; i < 32; i++) 
m_tdc[i] = 0XFFFF;
 
  211    for (
unsigned int i = 0; i < len; i++) {
 
  212      int rid = (dbuf[i] >> 27) & 0x1F;
 
  215          if (print1290) printf(
"Filler  0x%08x %u.data\n", dbuf[i], i);
 
  218          if (print1290) printf(
"Global Header  0x%08x %u.data\n", dbuf[i], i);
 
  221          nhits = ((dbuf[i] >> 5) & 0xFFFF); 
 
  222          if (print1290) printf(
"Global Trailer  0x%08x %u.data  STATUS=0x%03x nhits=%u\n", dbuf[i], i, (dbuf[i] >> 24) & 0x7, nhits);
 
  225            if (print1290) printf(
"V1290 nhits!=len %u %u\n", nhits, len);
 
  229          if (print1290) printf(
"Global Trigger TimeTag  0x%08x %u.data\n", dbuf[i], i);
 
  232          if (print1290) printf(
"TDC header  0x%08x %u.data evid=%u wc=%u\n", dbuf[i], i, (dbuf[i] >> 12) & 0xFFF, dbuf[i] & 0xFFF);
 
  236          if (print1290) printf(
"TDC trailer  0x%08x %u.data\n", dbuf[i], i);
 
  240          if (print1290) printf(
"TDC Error  0x%08x %u.data ERR=0x%x\n", dbuf[i], i, dbuf[i] & 0x3FFF);
 
  245          edge  = (dbuf[i] >> 26) & 0x1;
 
  246          tdcch = (dbuf[i] >> 21) & 0x1F;
 
  247          tdcl  =   dbuf[i] & 0x1FFFFF;
 
  248          if (tdcch < MAXV1290) {
 
  252              printf(
"V1290 0x%08x %u. [ch=%2u] edge=%u data=%u \n", dbuf[i], i, tdcch, edge, tdcl);
 
  253            m_tdc[tdcch] = tdcl / 40;
 
  259          if (print1290) printf(
"Unknown  0x%08x %u.data\n", dbuf[i], i);
 
  275    unsigned int bmask = 0xF;
 
  277    for (
int module = 0; module < 6; module++) {
 
  278      int istart = 19 * module;
 
  279      int istop = 19 * module + 18;
 
  280      for (
int i = istart; i < istop; i++) {
 
  281        for (
int j = 0; j < 8; j++) {
 
  282          unsigned int kdata = data[i] & (bmask << (j * 4));
 
  284            int channelID = j + 8 * (i - istart);
 
  286            if (_arichgp->
isActive(module,  channelID)) {
 
  288              hapd[module]->Fill(channelID);
 
  291              double globalTime = 0;
 
  293              double rposx = 0, rposy = 0;
 
  295              int channel = eposhapd.second;
 
  297              if ((channel < 108 && channel > 71) || channel < 36) channel = 108 - (int(channel / 6) * 2 + 1) * 6 +
 
  299              else channel = 144 - (int((channel - 36) / 6) * 2 + 1) * 6 + channel - 36;
 
  301              if (abs(loc.X()) > 2.3 || abs(loc.Y()) > 2.3) 
continue;
 
  303              arichDigits.
appendNew(module + 1, channel, globalTime);
 
  307              m_tuple ->Fill(-poshapd.first, poshapd.second, rechit.X(), rechit.Y(), module, channelID, rposx, rposy);
 
  323    for (
int i = 0; i < 4; i++) {
 
  326      for (
int k = 0; k < 4; k++) 
mwpc_tdc[i][k]->Fill(
m_tdc[w->tdc[k]] - t0);
 
  330      for (
int k = 0; k < 2; k++) {  
 
  332        w->diff[k] = 
m_tdc[w->tdc[2 * k]]  - 
m_tdc[w->tdc[2 * k + 1]];
 
  333        w->sum[k] = 
m_tdc[w->tdc[2 * k + 1]] + 
m_tdc[w->tdc[2 * k]] - 2 * 
m_tdc[w->atdc];
 
  335        if (w->sum[k] < w->cutll[k] || w->sum[k] > w->cutul[k]) 
continue;
 
  338        w->reco[k] = w->diff[k] * w->slp[k] + w->offset[k];
 
  339        w->reco[k] += w->pos[k];
 
  344      w->reco[2] = w->pos[2]; 
 
  345      if (!w->status[0] &&  !w->status[1])  
mwpc_xy[i]->Fill(w->reco[0], w->reco[1]);
 
  347      if (mask & (1 << i)) {
 
  348        if (!w->status[0] &&  !w->status[1]) {
 
  357    int ii[4] = {0, 1, 0, 0};
 
  359    for (
int i = 0; i < 4; i++) {
 
  360      if (mask & (1 << i)) {
 
  377      for (
int i = 0; i < 4; i++) {
 
  379        double l = (w->reco[2] - r.Z()) / dir.Z() ;
 
  380        ROOT::Math::XYZVector rext = r + dir * l;
 
  381        if (!w->status[0])  
mwpc_residuals[i][0]->Fill(w->reco[0] - rext.Y());
 
  382        if (!w->status[1])  
mwpc_residuals[i][1]->Fill(w->reco[1] - rext.X());
 
  385        for (
int k = 0; k < axis->GetNbins(); k++) {
 
  386          double ll = (w->reco[2] + axis->GetBinCenter(k + 1) - r.Z()) / dir.Z();
 
  387          ROOT::Math::XYZVector rextt = r + dir * ll;
 
  388          mwpc_residualsz[i][0]->Fill(w->reco[0] - rextt.Y(), axis->GetBinCenter(k + 1));
 
  389          mwpc_residualsz[i][1]->Fill(w->reco[1] - rextt.X(), axis->GetBinCenter(k + 1));
 
  401    unsigned int len, data[10000];
 
  402    gzread(fp, &len, 
sizeof(
unsigned int));
 
  404    gzread(fp, data, 
sizeof(
unsigned int)*len);
 
  406    ROOT::Math::XYZVector r;
 
  407    ROOT::Math::XYZVector dir;
 
  431        ROOT::Math::XYZVector rrel  =  rc - rot * rc;
 
  434        r.SetX(-r.X()); dir.SetX(-dir.X());
 
  441        B2DEBUG(50, 
"-----------> " <<  rc.X() <<  
" " << rc.Y() << 
" " <<   rc.Z() << 
"::::" << rrel.X() <<  
" " << rrel.Y() << 
" " <<
 
  442                rrel.Z()  << 
" ----> R " <<   r.X() <<  
" " << r.Y() << 
" " <<   r.Z() << 
" ----> S " <<   dir.X() <<  
" " << dir.Y() << 
" " <<
 
  446        arichAeroHits.
appendNew(particleId, r, dir);
 
  455    for (
unsigned int j = 0; j < len; j++) {
 
  478    static char msg[1024];
 
  481    const int sint = 
sizeof(
unsigned int);
 
  483      if (gzread(
m_fp, hdr, sint * 2) != 2 * sint  && 
m_end) {
 
  488          eventMetaDataPtr->setEndOfData();
 
  498      B2INFO(
"neve= [" << 
m_events << 
"] in " << (
double)(m_time - 
m_timestart) / 60. << 
" min (" << 
int(
 
  507    gzseek(
m_fp, 2 * 
sizeof(
unsigned int), SEEK_CUR);
 
  509      case BEGIN_RECORD_TYPE: {
 
  510        gzread(
m_fp, &beginrec, 
sizeof(beginrec));
 
  511        time_t t = beginrec.
time;
 
  512        sprintf(msg, 
"BeginRec run %u time %s", beginrec.
runno, ctime(&t));
 
  516      case END_RECORD_TYPE: {
 
  517        gzread(
m_fp, &endrec, 
sizeof(endrec));
 
  518        time_t t = endrec.
time;
 
  519        sprintf(msg, 
"EndRec run %u time %s", endrec.
runno, ctime(&t));
 
  523      case EVENT_RECORD_TYPE: {
 
  524        gzread(
m_fp, &rec, 
sizeof(rec));
 
  525        int print = !(rec.evtno % 10000);
 
  528          sprintf(msg, 
"EventRec run %u evt %u mstime %u, time %s", rec.runno, rec.evtno, rec.mstime, ctime(&t));
 
  532        int pos = gztell(
m_fp);
 
  534        int buflen = rec.len - 
sizeof(rec) / 
sizeof(
int);
 
  539        while (i < buflen && j < 5) {
 
  545        if (gzseek(
m_fp, pos + buflen * 
sizeof(
unsigned int), SEEK_SET) < 0) B2ERROR(
"gzseek returns -1 ");
 
  549        B2ERROR(
"IO error unknown record type " << type);
 
  557    B2INFO(
" arichBtestModule: End Run !!!");
 
  571    BOOST_FOREACH(
const std::string & fname, 
m_runList) {
 
  572      B2INFO(
m_eveList[j] << 
" events processed from file " << fname);
 
  575    for (
int i = 0; i < 4; i++) {
 
  577      B2INFO(i << 
" a1=" << 
m_mwpc[i].tdc[0] << 
" a2="  << 
m_mwpc[i].tdc[1] << 
" a3=" << 
m_mwpc[i].tdc[2] << 
" a2="  << 
m_mwpc[i].tdc[3]
 
  578             << 
" A=" << 
m_mwpc[i].atdc);
 
The Class for ARICH Beamtest Geometry Parameters.
The Class for ARICH Geometry Parameters.
Beamtest ARICH Geometry Tracking Class.
void Print()
Debug printouts.
void setDescription(const std::string &description)
Sets the description of the module.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Accessor to arrays stored in the data store.
T * appendNew()
Construct a new T object at the end of the array.
Type-safe access to single objects in the data store.
static const double mm
[millimeters]
static const double GeV
Standard of [energy, momentum, mass].
std::string m_outFile
output file name
time_t m_timestart
time of the first processed event
ARICHTracking * m_mwpc
Pointer to the tracking chambers.
int m_tdc[32]
raw MWPC TDC buffer
std::vector< std::string >::iterator m_runCurrent
current run
TFile * m_file
pointer to the root file
double m_beamMomentum
Momentum of the particles in the beam [GeV].
std::vector< std::string > m_runList
The filenames of the runs.
int m_events
number of events
std::vector< int > m_MwpcTrackMask
Bit mask of the MWPC tracking chambers used for the track creation.
gzFile m_fp
file desriptor of the data file
std::vector< int > m_eveList
The eventnumbers for each of the runs.
TH2F * mwpc_xy[4]
calculated x-y track positions
TH1F * mwpc_residuals[4][2]
residuals from mwpcs
int skipdata(gzFile fp)
Skip the data part of the record.
TH1F * mwpc_sum_cut[4][2]
tdc sum from mwpcs, with sum cut applied
virtual void initialize() override
Initialize the Module.
TH2F * mwpc_residualsz[4][2]
z-residuals from mwpcs
TH1F * mwpc_diff[4][2]
tdc difference from mwpcs
virtual void event() override
Running over all events.
virtual void endRun() override
Is called after processing the last event of a run.
virtual void terminate() override
Is called at the end of your Module.
virtual void beginRun() override
Called when entering a new run.
TH1F * mwpc_sum[4][2]
tdc sum from mwpcs
int getTrack(int mask, ROOT::Math::XYZVector &r, ROOT::Math::XYZVector &dir)
Beamtest Track reconstruction.
arichBtestModule()
Constructor.
TH1F * hapd[6]
histogram of hits for each hapd
TNtuple * m_tuple
ntuple containing hapd hits
void readmwpc(unsigned int *dbuf, unsigned int len, int print=0)
Read the MWPC information from the data buffer.
int readdata(gzFile fp, int rec_id, int print)
Read the data from the file (can be compressed)
int readhapd(unsigned int len, unsigned int *data)
Read the HAPD hits from the data buffer.
TH1F * mwpc_tdc[4][5]
tdc information from mwpcs
std::pair< double, double > GetHapdChannelPosition(int)
Get the position of the HAPD channel.
ROOT::Math::XYZVector getRotationCenter()
Get the rotation center of the Aerogel RICH frame.
ROOT::Math::Rotation3D getFrameRotation()
Get the rotation matrix of the Aerogel RICH frame.
std::pair< int, int > GetHapdElectronicMap(int)
Get the mapping of the electronic channel to the HAPD module nr and the channel number.
static ARICHBtestGeometryPar * Instance()
Static method to get a reference to the ARICHBtestGeometryPar instance.
static ARICHGeometryPar * Instance()
Static method to get a reference to the ARICHGeometryPar instance.
ROOT::Math::XYZVector getTrackingShift()
Get the tracking shift.
ARICHTracking * getMwpc()
Get the pointer of the tracking MWPCs.
bool isActive(int module, int channel)
check the activity of the channel
ROOT::Math::XYZVector getChannelCenterGlob(int modID, int chanID)
get center of chanID channel of modID detector module (in global coordinates)
ROOT::Math::XYVector getChannelCenterLoc(int chID)
get center position of chID channel (in detector module local coordinates)
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.
Begin record structure for the beamtest data.
unsigned int runno
Run number.
unsigned int time
Timestamp of the run.
Event record structure for the beamtest data.