1 // **************************************************************************
2 // * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 // * Author: The ALICE Off-line Project. *
5 // * Contributors are mentioned in the code where appropriate. *
7 // * Permission to use, copy, modify and distribute this software and its *
8 // * documentation strictly for non-commercial purposes is hereby granted *
9 // * without fee, provided that the above copyright notice appears in all *
10 // * copies and that both the copyright notice and this permission notice *
11 // * appear in the supporting documentation. The authors make no claims *
12 // * about the suitability of this software for any purpose. It is *
13 // * provided "as is" without express or implied warranty. *
14 // **************************************************************************
16 #include "AliHMPIDDigit.h" //class header
17 #include <TClonesArray.h> //WriteRaw()
18 #include <TBox.h> //Draw()
19 #include <TPolyLine.h> //Draw()
20 #include <AliRawDataHeader.h> //WriteRaw()
21 #include <AliDAQ.h> //WriteRaw()
22 #include "Riostream.h" //WriteRaw()
23 ClassImp(AliHMPIDDigit)
25 const Float_t AliHMPIDDigit::fgkMinPcX[]={ 0.00 , 66.60 , 0.00 , 66.60 , 0.00 , 66.60};
26 const Float_t AliHMPIDDigit::fgkMaxPcX[]={64.00 , 130.60 , 64.00 , 130.60 , 64.00 , 130.60};
28 const Float_t AliHMPIDDigit::fgkMinPcY[]={ 0.00 , 0.00 , 42.92 , 42.92, 85.84, 85.84};
29 const Float_t AliHMPIDDigit::fgkMaxPcY[]={40.32 , 40.32, 83.24 , 83.24, 126.16, 126.16};
31 const Float_t AliHMPIDDigit::fgk1 =0.28278796;
32 const Float_t AliHMPIDDigit::fgk2 =0.96242952;
33 const Float_t AliHMPIDDigit::fgkSqrtK3 =0.77459667;
34 const Float_t AliHMPIDDigit::fgk4 =0.37932926;
36 Int_t AliHMPIDDigit::fgSigmas=4;
40 Preface: all geometrical information (like left-right sides) is reported as seen from electronic side.
43 _______________ _______________
47 |_______________| |_______________|85.84
48 _______________ _______________
52 |_______________| |_______________|42.92
53 _______________ _______________
57 r1 |_______________| |_______________|0 r24
62 The DDL file starts with common header which size and structure is standartized and mandatory for all detectors.
63 The header contains among other words, so called Equipment ID word. This unique value for each D-RORC is calculated as detector ID << 8 + DDL index.
64 For HMPID the detector ID is 6 (reffered in the code as kRichRawId) while DDL indexes are from 0 to 13.
66 Common header might be followed by the private one although HMPID has no any private header, just uses the common one.
68 Single HMPID D-RORC (with 2 channels) serves a single chamber so that channel 0 serves left half (PCs 0-2-4)
69 1 serves right half(PCs 1-3-5)
71 So the LDC -chamber-ddl map is:
72 DDL index 0 -> ch 0 left -> DDL ID 0x600 DDL index 1 -> ch 1 right -> DDL ID 0x601
73 DDL index 2 -> ch 1 left -> DDL ID 0x602 DDL index 3 -> ch 2 right -> DDL ID 0x603
74 DDL index 4 -> ch 2 left -> DDL ID 0x604 DDL index 5 -> ch 3 right -> DDL ID 0x605
75 DDL index 6 -> ch 3 left -> DDL ID 0x606 DDL index 7 -> ch 4 right -> DDL ID 0x607
76 DDL index 8 -> ch 4 left -> DDL ID 0x608 DDL index 9 -> ch 5 right -> DDL ID 0x609
77 DDL index 10 -> ch 5 left -> DDL ID 0x60a DDL index 11 -> ch 6 right -> DDL ID 0x60b
78 DDL index 12 -> ch 6 left -> DDL ID 0x60c DDL index 13 -> ch 7 right -> DDL ID 0x60d
80 HMPID FEE as seen by single D-RORC is composed from a number of DILOGIC chips organized in vertical stack of rows.
81 Each DILOGIC chip serves 48 channels for the 8x6 pads Channels counted from 0 to 47.
83 The mapping inside DILOGIC chip has the following structure (see from electronics side):
86 5 04 10 16 22 28 34 40 46 due to repetition in column structure we may introduce per column map:
87 4 02 08 14 20 26 32 38 44 pady= 0 1 2 3 4 5
88 3 00 06 12 18 24 30 36 42 addr= 5 3 1 0 2 4
89 2 01 07 13 19 25 31 37 43 or vice versa
90 1 03 09 15 21 27 33 39 45 addr= 0 1 2 3 4 5
91 0 05 11 17 23 29 35 41 47 pady= 3 2 4 1 5 0
95 10 DILOGIC chips composes so called "row" in horizontal direction (reffered in the code as kNdil), so the row is 80x6 pads structure.
96 DILOGIC chips in the row are counted from right to left as seen from electronics side, from 1 to 10.
97 24 rows are piled up forming the whole FEE served by single D-RORC, so one DDL sees 80x144 pads separated in 3 photocathodes.
98 Rows are counted from 1 to 24 from top to bottom for right half of the chamber (PCs 1-3-5) as seen from electronics side, meaning even LDC number
99 and from bottom to top for left half of the chamber (PCs 0-2-4) as seen from electronics side, meaning odd LDC number.
101 HMPID raw word is 32 bits with the structure:
102 00000 rrrrr dddd aaaaaa qqqqqqqqqqqq
103 5 bits zero 5 bits row number (1..24) 4 bits DILOGIC chip number (1..10) 6 bits DILOGIC address (0..47) 12 bits QDC value (0..4095)
105 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
106 void AliHMPIDDigit::Draw(Option_t*)
108 // TMarker *pMark=new TMarker(LorsX(),LorsY(),25); pMark->SetMarkerColor(kGreen);pMark->Draw();
109 TBox *pad = new TBox(LorsX()-0.5*SizePadX(),LorsY()-0.5*SizePadY(),LorsX()+0.5*SizePadX(),LorsY()+0.5*SizePadY());
110 TPolyLine *line=new TPolyLine(5);
111 line->SetPoint(0,LorsX()-0.5*SizePadX(),LorsY()-0.5*SizePadY());
112 line->SetPoint(1,LorsX()-0.5*SizePadX(),LorsY()+0.5*SizePadY());
113 line->SetPoint(2,LorsX()+0.5*SizePadX(),LorsY()+0.5*SizePadY());
114 line->SetPoint(3,LorsX()+0.5*SizePadX(),LorsY()-0.5*SizePadY());
115 line->SetPoint(4,LorsX()-0.5*SizePadX(),LorsY()-0.5*SizePadY());
116 Int_t slice=(Int_t)fQ/20;
118 case 0: pad->SetFillColor(kBlue); break;
119 case 1: pad->SetFillColor(kBlue+4); break;
120 case 2: pad->SetFillColor(kCyan); break;
121 case 3: pad->SetFillColor(kCyan+4); break;
122 case 4: pad->SetFillColor(kGreen); break;
123 case 5: pad->SetFillColor(kGreen+4); break;
124 case 6: pad->SetFillColor(kYellow); break;
125 case 7: pad->SetFillColor(kYellow+4); break;
126 default: pad->SetFillColor(kRed); break;
128 pad->SetUniqueID((Int_t)fQ);
129 pad->Draw();line->Draw();
131 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
132 void AliHMPIDDigit::Print(Option_t *opt)const
134 // Print current digit
135 // Arguments: option string not used
137 UInt_t w32; Int_t ddl,r,d,a;
139 Printf("%sDIG:(ch=%1i,pc=%1i,x=%2i,y=%2i) (%7.3f,%7.3f) Q=%8.3f TID=(%5i,%5i,%5i) raw=0x%x (ddl=%2i,r=%2i,d=%2i,a=%2i) %s",
140 opt, A2C(fPad),A2P(fPad),A2X(fPad),A2Y(fPad),LorsX(),LorsY(), Q(), fTracks[0],fTracks[1],fTracks[2],w32,ddl,r,d,a, (IsOverTh(Q()))?"":"below thr");
142 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
143 void AliHMPIDDigit::WriteRaw(TObjArray *pDigAll)
145 // Write a list of digits for a given chamber in raw data stream
146 // Arguments: pDigAll- list of digits
148 for(Int_t iCh=kMinCh;iCh<=kMaxCh;iCh++){//chambers loop
149 ofstream ddlL,ddlR; //output streams, 2 per chamber
150 Int_t cntL=0,cntR=0; //data words counters for DDLs
151 AliRawDataHeader header; header.SetAttribute(0); //empty DDL header
153 ddlL.open(AliDAQ::DdlFileName("HMPID",2*iCh));
154 ddlR.open(AliDAQ::DdlFileName("HMPID",2*iCh+1)); //open both DDL of this chamber in parallel
155 ddlL.write((char*)&header,sizeof(header)); //write dummy header as place holder, actual
156 ddlR.write((char*)&header,sizeof(header)); //will be rewritten later when total size of DDL is known
158 UInt_t w32=0; //32 bits data word
159 TClonesArray *pDigCh=(TClonesArray *)pDigAll->At(iCh); //list of digits for current chamber
160 for(Int_t iDig=0;iDig<pDigCh->GetEntriesFast();iDig++){//digits loop
161 AliHMPIDDigit *pDig=(AliHMPIDDigit*)pDigCh->At(iDig);
162 if(pDig->Q() < 1) continue;
163 Int_t ddl,r,d,a; //32 bits data word
164 pDig->Raw(w32,ddl,r,d,a);
166 ddlL.write((char*)&w32,sizeof(w32)); cntL++;
168 ddlR.write((char*)&w32,sizeof(w32)); cntR++;
172 header.fSize=sizeof(header)+cntL*sizeof(w32); ddlL.seekp(0); ddlL.write((char*)&header,sizeof(header)); ddlL.close(); //rewrite header with size set to
173 header.fSize=sizeof(header)+cntR*sizeof(w32); ddlR.seekp(0); ddlR.write((char*)&header,sizeof(header)); ddlR.close(); //number of bytes and close file
176 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++