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.