SND@LHC Software
Loading...
Searching...
No Matches
SciFiUnpack.cxx
Go to the documentation of this file.
1// ROOT headers
2#include "TClonesArray.h"
3
4// SHiP headers
5#include "SciFiUnpack.h"
6#include "SciFiHit.h"
8
9// Fair headers
10#include "FairRootManager.h"
11#include "FairRunOnline.h"
12#include "FairLogger.h"
13
14struct HitData {
15 uint64_t flags : 2; // flags
16 uint64_t finetime : 16; // fine time
17 uint64_t time : 32; // time
18 uint64_t ch : 14; // channel from signal or trigger
19 // if signal: channel ranges [0 - 1536] * nop
20 // where nop = number of planes
21 // if trigger: channel ranges from [1 - 24]
22 // which corresponds to the board number
23 // 1 - 2 - 3 : plane 1 or SciFiID: 111
24 // 4 - 5 - 6 : plane 2 or SciFiID: 112
25 // 7 - 8 - 9 : plane 3 or SciFiID: 121
26 // 10 - 11 - 12 : plane 4 or SciFiID: 122
27 // 13 - 14 - 15 : plane 5 or SciFiID: 131
28 // 16 - 17 - 18 : plane 6 or SciFiID: 132
29 // 19 - 20 - 21 : plane 7 or SciFiID: 141
30 // 22 - 23 - 24 : plane 8 or SciFiID: 142
31};
32
36 int getHitCount() { return (header.size - sizeof(header)) / sizeof(HitData); }
37};
38
39SciFiUnpack::SciFiUnpack(uint16_t PartitionId) : fRawData(new TClonesArray("SciFiHit")) {}
40
42
44{
45 Register();
46 return kTRUE;
47}
48
50{
51
52 LOG(INFO) << "SciFiUnpack : Registering..." ;
53 auto *fMan = FairRootManager::Instance();
54 if (!fMan) {
55 return;
56 }
57 fMan->Register("Digi_SciFiHits", "SciFi", fRawData.get(), kTRUE);
58 // fMan->Register("Digi_SciFiTrigger", "SciFi", fRawTrigger, kTRUE);
59}
60
61Bool_t SciFiUnpack::DoUnpack(Int_t *data, Int_t size)
62{
63
64 LOG(INFO) << "SciFiUnpack : Unpacking frame... size/bytes = " << size ;
65
66 auto df = reinterpret_cast<SciFiDataFrame *>(data);
67 switch (df->header.frameTime) {
68 case SoS: LOG(INFO) << "SciFiUnpack: SoS frame." ; return kTRUE;
69 case EoS: LOG(INFO) << "SciFiUnpack: EoS frame." ; return kTRUE;
70 default: break;
71 }
72
73 int i = 0;
74 int layerID;
75 assert(df->header.size == size);
76 auto nhits = df->getHitCount();
77 LOG(INFO) << nhits << " hits." ;
78 std::vector<HitData> hits(df->hits, df->hits + nhits);
79 // std::cout << df->header.size << " " << size << " " << nhits << std::endl;
80 for (auto &&hitData : hits) {
81 auto triggerFlag = (hitData.ch >= 16000) ? 1 : 0;
82 auto board = (triggerFlag == 1) ? (hitData.ch - 15999) : (hitData.ch / 512 + 1);
83 auto layer = (board-1) / 3 + 1;
84 if (layer==1) layerID=111;
85 else if (layer==2) layerID=112;
86 else if (layer==3) layerID=121;
87 else if (layer==4) layerID=122;
88 else if (layer==5) layerID=131;
89 else if (layer==6) layerID=132;
90 else if (layer==7) layerID=141;
91 else layerID=142;
92
93 // 0-25 * 10**5 + 0-16025;
94 auto detectorId = board * pow(10, 5) + hitData.ch;
95 bool trigflag = triggerFlag;
96
97 new ((*fRawData)[fNHits]) SciFiHit(detectorId, layerID, hitData.ch, board, hitData.time, hitData.finetime, hitData.flags, trigflag);
98
99 fNHits++;
100 }
101
103 return kTRUE;
104
105}
106
108{
109 fRawData->Clear();
110 fNHits = 0;
111}
112
virtual void Reset() override
virtual ~SciFiUnpack()
std::unique_ptr< TClonesArray > fRawData
Definition SciFiUnpack.h:29
virtual Bool_t Init() override
Int_t fNHitsTotal
Definition SciFiUnpack.h:31
SciFiUnpack(uint16_t PartitionId)
virtual Bool_t DoUnpack(Int_t *data, Int_t size) override
virtual void Register() override
ClassImp(ecalContFact) ecalContFact
uint64_t finetime
uint64_t ch
uint64_t flags
uint64_t time
HitData hits[0]
DataFrameHeader header