Line data Source code
1 : #include "AliCaloRawStreamV3.h"
2 : #include "AliCaloBunchInfo.h"
3 : #include "AliHLTCaloTriggerRawDigitDataStruct.h"
4 : #include "AliHLTEMCALGeometry.h"
5 : #include "AliHLTEMCALTRURawDigitMaker.h"
6 :
7 6 : ClassImp(AliHLTEMCALTRURawDigitMaker)
8 :
9 : AliHLTEMCALTRURawDigitMaker::AliHLTEMCALTRURawDigitMaker():
10 0 : AliHLTLogging(),
11 0 : fCaloRawStream(),
12 0 : fGeometryPtr(NULL),
13 0 : fNRawDigits(0)
14 0 : {
15 0 : for(int ndx = 0; ndx < fgkNRawDigits; ndx++)
16 0 : fRawDigitIndex[ndx] = -1;
17 0 : }
18 :
19 : void AliHLTEMCALTRURawDigitMaker::SetRawReader(AliCaloRawStreamV3 *reader){
20 0 : fCaloRawStream = reader;
21 0 : }
22 :
23 0 : AliHLTEMCALTRURawDigitMaker::~AliHLTEMCALTRURawDigitMaker() {
24 0 : if(fGeometryPtr) delete fGeometryPtr;
25 0 : }
26 :
27 : void AliHLTEMCALTRURawDigitMaker::Initialize(Int_t runno){
28 0 : fGeometryPtr = new AliHLTEMCALGeometry(runno);
29 0 : }
30 :
31 : void AliHLTEMCALTRURawDigitMaker::Add(const std::vector<AliCaloBunchInfo> &bunchlist) {
32 0 : Int_t hwAdd = fCaloRawStream->GetHWAddress();
33 0 : UShort_t iRCU = fCaloRawStream->GetDDLNumber() % 2; // 0/1
34 0 : Int_t iSM = fCaloRawStream->GetModule();
35 :
36 0 : Int_t iTRU = fGeometryPtr->GetGeometryPtr()->GetTriggerMapping()->GetTRUIndexFromOnlineHwAdd(hwAdd,iRCU,iSM);
37 :
38 0 : if (GetLocalLoggingDefault() & kHLTLogDebug) {
39 0 : UShort_t iBranch = ( hwAdd >> 11 ) & 0x1; // 0/1
40 : HLTDebug("===\n");
41 : HLTDebug("| Hw Adress: 0x%x => SM# %2d / RCU# %d / Branch# %d / TRU# %2d / ADC# %2d\n",
42 : hwAdd, fCaloRawStream->GetModule(), iRCU, iBranch, iTRU, fCaloRawStream->GetColumn());
43 0 : }
44 :
45 0 : Int_t idx;
46 :
47 0 : Int_t timeSamples[15]; memset(timeSamples, 0, sizeof(timeSamples));
48 : UChar_t nSamples = 0;
49 :
50 0 : UInt_t iBin = bunchlist.at(0).GetStartBin();
51 : Int_t iBunch = 0;
52 :
53 0 : for (UInt_t i = 0; i < bunchlist.size(); i++) {
54 0 : AliCaloBunchInfo bunch = bunchlist.at(i);
55 :
56 0 : if (iBin > bunch.GetStartBin()) {
57 0 : iBin = bunch.GetStartBin();
58 : iBunch = i;
59 0 : }
60 0 : Int_t column = fCaloRawStream->GetColumn();
61 :
62 0 : if (column < 96) {
63 0 : const UShort_t* sig = bunch.GetData();
64 0 : Int_t startBin = bunch.GetStartBin();
65 :
66 0 : for (Int_t iS = 0; iS < bunch.GetLength(); iS++) {
67 0 : Int_t time = startBin--;
68 0 : Int_t amp = sig[iS];
69 :
70 0 : if (amp){
71 0 : if(nSamples >= 15){
72 0 : HLTError("Buffer for time samples exceeded, not possible to store more");
73 : } else {
74 0 : timeSamples[nSamples++] = ((time << 16) & 0xFF0000) | (amp & 0xFFFF);
75 : HLTDebug("ADC# %2d / time: %2d amplitude: %d\n", fCaloRawStream->GetColumn(), time, amp);
76 : }
77 : }
78 : }
79 0 : }
80 0 : }
81 :
82 0 : if (fCaloRawStream->GetColumn() > 95 && fCaloRawStream->GetColumn() < 106) {
83 0 : Int_t nBits = (fCaloRawStream->GetColumn() == 105) ? 6 : 10;
84 0 : const UShort_t* sig = bunchlist.at(iBunch).GetData();
85 : HLTDebug("| L0 id in F-ALTRO => bunch length is: %d\n", bunchlist.at(iBunch).GetLength());
86 :
87 0 : for (Int_t i = 0; i < bunchlist.at(iBunch).GetLength(); i++) {
88 : HLTDebug("| sig[%3d]: %x\n",i,sig[i]);
89 :
90 0 : for (Int_t j = 0; j < nBits; j++) {
91 0 : if (sig[i] & ( 1 << j )) {
92 : HLTDebug("| Add L0 patch index in TRU# %2d position %2d\n",iTRU,(fCaloRawStream->GetColumn() - 96) * 10 + j);
93 :
94 0 : if (fGeometryPtr->GetGeometryPtr()->GetAbsFastORIndexFromTRU(iTRU, (fCaloRawStream->GetColumn() - 96) * 10 + j, idx)) {
95 0 : SetL0Time(GetRawDigit(idx), iBin);
96 0 : }
97 : }
98 : }
99 0 : iBin--;
100 : }
101 0 : } else {
102 0 : if (nSamples && fGeometryPtr->GetGeometryPtr()->GetAbsFastORIndexFromTRU(iTRU, fCaloRawStream->GetColumn(), idx)) {
103 0 : SetTimeSamples(GetRawDigit(idx), nSamples, timeSamples);
104 :
105 0 : if (GetLocalLoggingDefault() & kHLTLogDebug) {
106 : HLTDebug("| Add TRG digit of id# %4d from TRU# %2d ADC# %2d\n", idx, iTRU, fCaloRawStream->GetColumn());
107 :
108 : //PrintRawDigit(GetRawDigit(idx));
109 0 : Int_t iSm, iTru, iEta, iPhi, iD[4], iFor;
110 0 : if (fGeometryPtr->GetGeometryPtr()->GetPositionInTRUFromAbsFastORIndex(idx, iTru, iEta, iPhi))
111 : HLTDebug("| Position => TRU: %2d Eta: %2d Phi: %2d\n", iTru, iEta, iPhi);
112 :
113 0 : if (fGeometryPtr->GetGeometryPtr()->GetPositionInSMFromAbsFastORIndex(idx, iSm, iEta, iPhi))
114 : HLTDebug("| Position => SM: %2d Eta: %2d Phi: %2d\n", iSm, iEta, iPhi);
115 :
116 0 : if (fGeometryPtr->GetGeometryPtr()->GetCellIndexFromFastORIndex(idx, iD)) {
117 : HLTDebug("| tower iDs: ");
118 0 : for (Int_t i = 0; i < 4; i++) HLTDebug ("%5d ",iD[i]);
119 0 : for (Int_t i = 0; i < 4; i++) {
120 0 : if (fGeometryPtr->GetGeometryPtr()->GetFastORIndexFromCellIndex(iD[i], iFor)) {
121 : HLTDebug("| tower %d to F-OR %d\n",iD[i],iFor);
122 : }
123 : }
124 0 : }
125 0 : }
126 : }
127 : }
128 : /*
129 : std::cout << "Found TRU raw digits: " << std::endl;
130 : for(Int_t idig = 0; idig < fNRawDigits; idig++){
131 : PrintRawDigit(fRawDigitBuffer[idig]);
132 : }
133 : */
134 0 : }
135 :
136 : void AliHLTEMCALTRURawDigitMaker::Reset() {
137 0 : for (Int_t i = 0; i < fgkNRawDigits; i++) fRawDigitIndex[i] = -1;
138 0 : fNRawDigits = 0;
139 0 : }
140 :
141 : Int_t AliHLTEMCALTRURawDigitMaker::WriteRawDigitsBuffer(AliHLTCaloTriggerRawDigitDataStruct *bufferptr, AliHLTUInt32_t &availableSize) const {
142 : Int_t outputsize = 0;
143 0 : if(availableSize < sizeof(AliHLTCaloTriggerRawDigitDataStruct)){
144 0 : HLTWarning("Not enough space in buffer in order to write digit");
145 0 : return 0;
146 : }
147 0 : for(Int_t idig = 0; idig < fNRawDigits; idig++){
148 0 : if(availableSize < sizeof(AliHLTCaloTriggerRawDigitDataStruct)){
149 0 : HLTWarning("Buffer exceeded after %d digits", idig);
150 0 : break;
151 : }
152 0 : *bufferptr = fRawDigitBuffer[idig];
153 0 : bufferptr++;
154 0 : outputsize += sizeof(AliHLTCaloTriggerRawDigitDataStruct);
155 0 : availableSize -= sizeof(AliHLTCaloTriggerRawDigitDataStruct);
156 : }
157 0 : return outputsize;
158 0 : }
159 :
160 : AliHLTCaloTriggerRawDigitDataStruct &AliHLTEMCALTRURawDigitMaker::GetRawDigit(Int_t index){
161 0 : if(fRawDigitIndex[index] >= 0){
162 0 : return fRawDigitBuffer[fRawDigitIndex[index]];
163 : }
164 :
165 0 : fRawDigitIndex[index] = fNRawDigits;
166 0 : new(fRawDigitBuffer + fNRawDigits) AliHLTCaloTriggerRawDigitDataStruct;
167 0 : AliHLTCaloTriggerRawDigitDataStruct &dig = fRawDigitBuffer[fNRawDigits];
168 0 : InitializeRawDigit(dig);
169 0 : SetRawDigitID(dig, index);
170 0 : fNRawDigits++;
171 : return dig;
172 0 : }
|