// * provided "as is" without express or implied warranty. *
// **************************************************************************
-#include "AliHMPIDDigit.h" //class header
-#include <TClonesArray.h> //Hit2Sdi()
-#include <TMarker.h> //Draw()
-ClassImp(AliHMPIDDigit)
-
-const Float_t AliHMPIDDigit::fMinPcX[]={0,SizePcX() + SizeDead(),0,SizePcX() + SizeDead(), 0,SizePcX() + SizeDead()};
-const Float_t AliHMPIDDigit::fMinPcY[]={0, 0,SizePcY()+SizeDead(),SizePcY() + SizeDead(),2*(SizePcY()+SizeDead()),2*(SizePcY()+SizeDead())};
-
-const Float_t AliHMPIDDigit::fMaxPcX[]={SizePcX(),SizeAllX(),SizePcX(),SizeAllX(),SizePcX(),SizeAllX()};
-const Float_t AliHMPIDDigit::fMaxPcY[]={SizePcY(),SizePcY(),SizeAllY() - SizePcY(),SizeAllY() - SizePcY(),SizeAllY(),SizeAllY()};
+#include "AliHMPIDDigit.h" //class header
+#include <TClonesArray.h> //WriteRaw()
+#include <TBox.h> //Draw()
+#include <TPolyLine.h> //Draw()
+#include <AliRawDataHeader.h> //WriteRaw()
+#include "AliHMPIDParam.h"
+#include <AliDAQ.h> //WriteRaw()
+#include "Riostream.h" //WriteRaw()
+#include "AliFstream.h"
+ClassImp(AliHMPIDDigit)
/*
-Preface: all geometrical information (like left-right sides) is reported as seen from electronic side.
+ Preface: all geometrical information (like left-right sides) is reported as seen from electronic side.
+
+ d10 d1 d10 d1
+ _______________ _______________
+r24 | | | |126.16 r1
+ | 4 | | 5 |
+ | | | |
+ |_______________| |_______________|85.84
+ _______________ _______________
+ | | | |83.24
+ | 2 | | 3 |
+ | | | |
+ |_______________| |_______________|42.92
+ _______________ _______________
+ | | | |40.32
+ | 0 | | 1 |
+ | | | |
+r1 |_______________| |_______________|0 r24
+ 0 64.0 66.6 130.6
+
The DDL file starts with common header which size and structure is standartized and mandatory for all detectors.
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDDigit::Draw(Option_t*)
{
- TMarker *pMark=new TMarker(LorsX(),LorsY(),25); pMark->SetMarkerColor(kGreen); pMark->Draw();
-}
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void AliHMPIDDigit::Hit2Sdi(AliHMPIDHit *pHit,TClonesArray *pSdiLst)
-{
-// Creates a list of sdigits out of provided hit
-// Arguments: pHit- hit
-// Returns: none
-
- Int_t iSdiCnt=pSdiLst->GetEntries(); //list of sdigits contains sdigits from previous ivocations of Hit2Sdi, do not override them
- AliHMPIDDigit dig;
- for(Int_t i=0;i<9;i++){ //affected pads loop
- dig.Set(pHit,i); //c,q,tid,x,y create tmp sdigit for pad i around hit position
- if(dig.PadPcX()==-1) continue;
- new((*pSdiLst)[iSdiCnt++]) AliHMPIDDigit(dig);
+// TMarker *pMark=new TMarker(LorsX(),LorsY(),25); pMark->SetMarkerColor(kGreen);pMark->Draw();
+ TBox *pad = new
+
+TBox(LorsX()-0.5*AliHMPIDParam::SizePadX(),LorsY()-0.5*AliHMPIDParam::SizePadY(),LorsX()+0.5*AliHMPIDParam::SizePadX(),LorsY()+0.5*AliHMPIDParam::SizePadY());
+ TPolyLine *line=new TPolyLine(5);
+ line->SetPoint(0,LorsX()-0.5*AliHMPIDParam::SizePadX(),LorsY()-0.5*AliHMPIDParam::SizePadY());
+ line->SetPoint(1,LorsX()-0.5*AliHMPIDParam::SizePadX(),LorsY()+0.5*AliHMPIDParam::SizePadY());
+ line->SetPoint(2,LorsX()+0.5*AliHMPIDParam::SizePadX(),LorsY()+0.5*AliHMPIDParam::SizePadY());
+ line->SetPoint(3,LorsX()+0.5*AliHMPIDParam::SizePadX(),LorsY()-0.5*AliHMPIDParam::SizePadY());
+ line->SetPoint(4,LorsX()-0.5*AliHMPIDParam::SizePadX(),LorsY()-0.5*AliHMPIDParam::SizePadY());
+ Int_t slice=(Int_t)fQ/20;
+ switch(slice){
+ case 0: pad->SetFillColor(kBlue); break;
+ case 1: pad->SetFillColor(kBlue+4); break;
+ case 2: pad->SetFillColor(kCyan); break;
+ case 3: pad->SetFillColor(kCyan+4); break;
+ case 4: pad->SetFillColor(kGreen); break;
+ case 5: pad->SetFillColor(kGreen+4); break;
+ case 6: pad->SetFillColor(kYellow); break;
+ case 7: pad->SetFillColor(kYellow+4); break;
+ default: pad->SetFillColor(kRed); break;
}
-}//Hit2Sdi()
+ pad->SetUniqueID((Int_t)fQ);
+ pad->Draw();line->Draw();
+}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void AliHMPIDDigit::Print(Option_t*)const
+void AliHMPIDDigit::Print(Option_t *opt)const
{
// Print current digit
// Arguments: option string not used
// Returns: none
- UInt_t w32; Raw(w32);
- Printf("DIG:(%7.3f,%7.3f) Q=%8.3f (ch=%1i,pc=%1i,x=%2i,y=%2i) TID=(%5i,%5i,%5i) ddl=%i raw=0x%x (r=%2i,d=%2i,a=%2i) %s",
- LorsX(),LorsY(),Q(), A2C(fPad),A2P(fPad),A2X(fPad),A2Y(fPad),
- fTracks[0],fTracks[1],fTracks[2],DdlIdx(),w32,Row(),Dilogic(),Addr(),
- (IsOverTh(Q()))?"":"!!!");
-}
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void AliHMPIDDigit::PrintSize()
-{
-// Print all segmentaion related sizes
-// Arguments: none
-// Returns: none
- Printf("-->pad =(%6.2f,%6.2f) cm dead zone %.2f cm\n"
- "-->PC =(%6.2f,%6.2f) cm (%3i,%3i) pads\n"
- "-->all PCs=(%6.2f,%6.2f) cm (%3i,%3i) pads",
- SizePadX(),SizePadY(),SizeDead(),
- SizePcX() ,SizePcY() ,kPadPcX ,kPadPcY,
- SizeAllX(),SizeAllY(),kPadAllX,kPadAllY);
+ UInt_t w32; Int_t ddl,r,d,a;
+ Raw(w32,ddl,r,d,a);
+ 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",
+ opt, AliHMPIDParam::A2C(fPad),AliHMPIDParam::A2P(fPad),AliHMPIDParam::A2X(fPad),AliHMPIDParam::A2Y(fPad),LorsX(),LorsY(), Q(),
+ fTracks[0],fTracks[1],fTracks[2],w32,ddl,r,d,a, (AliHMPIDParam::IsOverTh(Q()))?"":"below thr");
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void AliHMPIDDigit::Test()
+void AliHMPIDDigit::WriteRaw(TObjArray *pDigAll)
{
- AliHMPIDDigit d1,d2; Int_t ddl;UInt_t w32;
- for(Int_t i=0;i<10000;i++){
- Int_t ch=Int_t(gRandom->Rndm()*7);
- Int_t pc=Int_t(gRandom->Rndm()*6);
- Int_t px=Int_t(gRandom->Rndm()*80);
- Int_t py=Int_t(gRandom->Rndm()*48);
- d1.Manual2(ch,pc,px,py);
- ddl=d1.Raw(w32); d2.Raw(ddl,w32);
- if(d1.Compare(&d2)) Printf("Problem!!!");
- }
- Printf("OK");
-}//Test()
+// Write a list of digits for a given chamber in raw data stream
+// Arguments: pDigAll- list of digits
+// Returns: none
+ for(Int_t iCh=AliHMPIDParam::kMinCh;iCh<=AliHMPIDParam::kMaxCh;iCh++){//chambers loop
+ AliFstream* ddlL; //output streams, 2 per chamber
+ AliFstream* ddlR;
+ Int_t cntL=0,cntR=0; //data words counters for DDLs
+ AliRawDataHeader header; header.SetAttribute(0); //empty DDL header
+
+// ddlL = new AliFstream(AliDAQ::DdlFileName("HMPID",2*iCh));
+// ddlR = new AliFstream(AliDAQ::DdlFileName("HMPID",2*iCh+1)); //open both DDL of this chamber in parallel
+ ddlL = new AliFstream(AliDAQ::DdlFileName("HMPID",2*iCh+1)); //left and right looking at the IP
+ ddlR = new AliFstream(AliDAQ::DdlFileName("HMPID",2*iCh)); //open both DDL of this chamber in parallel
+ ddlL->WriteBuffer((char*)&header,sizeof(header)); //write dummy header as place holder, actual
+ ddlR->WriteBuffer((char*)&header,sizeof(header)); //will be rewritten later when total size of DDL is known
+
+ UInt_t w32=0; //32 bits data word
+ TClonesArray *pDigCh=(TClonesArray *)pDigAll->At(iCh); //list of digits for current chamber
+ for(Int_t iDig=0;iDig<pDigCh->GetEntriesFast();iDig++){//digits loop
+ AliHMPIDDigit *pDig=(AliHMPIDDigit*)pDigCh->At(iDig);
+ if(pDig->Q() < 1) continue;
+ Int_t ddl,r,d,a; //32 bits data word
+ pDig->Raw(w32,ddl,r,d,a);
+ if(ddl%2){
+ ddlL->WriteBuffer((char*)&w32,sizeof(w32)); cntL++;
+ }else{
+ ddlR->WriteBuffer((char*)&w32,sizeof(w32)); cntR++;
+ }
+ }//digits loop
+
+ header.fSize=sizeof(header)+cntL*sizeof(w32); ddlL->Seekp(0); ddlL->WriteBuffer((char*)&header,sizeof(header)); delete ddlL; //rewrite header with size set to
+ header.fSize=sizeof(header)+cntR*sizeof(w32); ddlR->Seekp(0); ddlR->WriteBuffer((char*)&header,sizeof(header)); delete ddlR; //number of bytes and close file
+ }//chambers loop
+}//WriteRaw()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-