Resolved problem in method ReadCalibHeader of AliITSRawStreamSPD, needed for the...
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 16 Dec 2007 11:23:30 +0000 (11:23 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 16 Dec 2007 11:23:30 +0000 (11:23 +0000)
New algorithm for writing simulated raw data in AliITSDDLRawData. This will work for both the old and the new geometry.
ITSSPDPHYSda and ITSSPDSCANda may be built as offline versions, completely without the daqDA libraries, by defining the SPD_DA_OFF variable when compiling.

Henrik

ITS/AliITSDDLRawData.cxx
ITS/AliITSRawStreamSPD.cxx
ITS/AliITSRawStreamSPD.h
ITS/AliITSRawStreamSPD_NEWGEO.cxx
ITS/ITSSPDPHYSda.cxx
ITS/ITSSPDSCANda.cxx

index 7aeab22..ca7800d 100644 (file)
@@ -32,6 +32,7 @@
 #include "AliITSRawStreamSPD.h"
 #include "AliITSRawStreamSDD.h"
 #include "AliITSRawStreamSSD.h"
+#include "AliITSIntMap.h"
 #include "AliBitPacking.h"
 #include "AliDAQ.h"
 #include "AliFstream.h"
@@ -378,19 +379,22 @@ void AliITSDDLRawData::GetDigitsSPD(TClonesArray *ITSdigits,Int_t mod,Int_t ddl,
   //Since data is zero suppressed,the coordinates for the chip having zero digits 
   //doesn't get listed in the galice.root file. However the SPD format requires 
   //the empty chip to be written with chip header and chip trailer.
-  //The index of the half stave is calculated as (mod/2).
-  Int_t ix;
-  Int_t iz;
-  Int_t chipNo=0;
+
+  Int_t chipLow  = AliITSRawStreamSPD::GetOnlineChipFromOffline(mod,0);
+  Int_t chipHigh = AliITSRawStreamSPD::GetOnlineChipFromOffline(mod,159);
+  if (chipLow>chipHigh) {chipLow  -= 4; chipHigh += 4;}
+  UInt_t hs = AliITSRawStreamSPD::GetOnlineHSFromOffline(mod);
+
+  // create int map to later hold all digits sorted
+  AliITSIntMap* digMap = new AliITSIntMap();
+
   UInt_t baseWord=0;
-  UInt_t hitRow=0;
   Int_t chipHitCount=0;  //Number of Hit in the current chip
   Int_t previousChip=-1; //Previuos chip respect to the actual aone
   Int_t ndigits = ITSdigits->GetEntries(); //number of digits in the current module
   //cout<<"      Number of digits in the current module:"<<ndigits<<" module:"<<mod<<endl;
+
   AliITSdigit *digs;
-  fHalfStaveModule++;    //It's a private variable used to distinguish between the firs  
-                         //and the second module of an Half Stave Module
   ofstream ftxt;
   if(ndigits){
     //loop over digits
@@ -400,77 +404,79 @@ void AliITSDDLRawData::GetDigitsSPD(TClonesArray *ITSdigits,Int_t mod,Int_t ddl,
       digs = (AliITSdigit*)ITSdigits->UncheckedAt(digit);
       /*---------------------------------------------------------------------------
        *     Each module contains 5 read out chips of 256 rows and 32 columns.
-       *     So, the cell number in Z direction varies from 0 to 159.  Therefore,
-       *     to get the chip address (0 to 4), we need to divide column number by 32.
+       *     So, the cell number in Z direction varies from 0 to 159.
        *     ---------------------------------------------------------------------*/
-      iz=digs->GetCoord1();  // Cell number in Z direction 
-      ix=digs->GetCoord2();  // Cell number in X direction
-      chipNo=iz/32;
+      Int_t iz=digs->GetCoord1();  // Cell number in Z direction 
+      Int_t ix=digs->GetCoord2();  // Cell number in X direction
+
       if(fVerbose==2)
        ftxt<<"DDL:"<<ddl<<" Mod:"<<mod<<" Row:"<<ix<<" Col:"<<iz<<endl;
-      hitRow=iz-chipNo*32;
-      if(fHalfStaveModule){
-       chipNo+=5;
-       fHalfStaveModule=-1;
-      }//end if
-      if(previousChip==-1){
+      UInt_t dummyDDL,dummyHS,chip,col,row;
+      AliITSRawStreamSPD::OfflineToOnline(mod,iz,ix,dummyDDL,dummyHS,chip,col,row);
+
+      //  insert digit into map...
+      // (reverse order of cols and rows as in real raw data)
+      digMap->Insert(chip*256*32+(32-col)*256+(256-row),row);
+    }
+  }
+
+  UInt_t nrHits = digMap->GetNrEntries();
+  if (nrHits>0) {
+    Int_t chip = 0;
+    for (UInt_t nHit=0; nHit<nrHits; nHit++) {
+      Int_t key = digMap->GetKeyIndex(nHit);
+      chip = key/(256*32);
+      Int_t col = 32 - (key%(256*32))/256;
+      Int_t row = digMap->GetValIndex(nHit);
+
+      if(previousChip==-1) { // first hit
        //loop over chip without digits 
        //Even if there aren't digits for a given chip 
        //the chip header and the chip trailer are stored
-       for(Int_t i=0;i<(iz/32);i++){
-         if(chipNo>4)
-           WriteChipHeader(i+5,(mod/2),baseWord);
-         else
-           WriteChipHeader(i,(mod/2),baseWord);
-         WriteChipTrailer(buf,chipHitCount,baseWord);
-         chipHitCount=0;
-       }//end for
-       WriteChipHeader(chipNo,(mod/2),baseWord);
+       for (Int_t i=chipLow; i<chip; i++) {
+         WriteChipHeader(i,hs,baseWord);
+         WriteChipTrailer(buf,0,baseWord);
+       }
+       WriteChipHeader(chip,hs,baseWord);
+       WriteHit(buf,row,col,baseWord);
        chipHitCount++;
-       WriteHit(buf,ix,hitRow,baseWord);
-       previousChip=chipNo;
+       previousChip=chip;
       }//end if
       else{
-       if(previousChip!=chipNo){
+       if(previousChip!=(Int_t)chip) {
          WriteChipTrailer(buf,chipHitCount,baseWord);
          chipHitCount=0;
-         for(Int_t i=previousChip+1;i<chipNo;i++){
-           WriteChipHeader(i,(mod/2),baseWord);
+         for(Int_t i=previousChip+1; i<chip; i++) {
+           WriteChipHeader(i,hs,baseWord);
            WriteChipTrailer(buf,0,baseWord);
-           chipHitCount=0;
          }//end for
-         WriteChipHeader(chipNo,(mod/2),baseWord);
-         previousChip=chipNo;
+         WriteChipHeader(chip,hs,baseWord);
+         previousChip=chip;
        }//end if
        chipHitCount++;
-       WriteHit(buf,ix,hitRow,baseWord);
+       WriteHit(buf,row,col,baseWord);
       }//end else
     }//end for
     //Even if there aren't digits for a given chip 
     //the chip header and the chip trailer are stored
-    Int_t end=4;
-    if(chipNo>4)end+=5;
     WriteChipTrailer(buf,chipHitCount,baseWord);
     chipHitCount=0;
-    for(Int_t i=chipNo+1;i<=end;i++){
-      WriteChipHeader(i,(mod/2),baseWord);
+    for(Int_t i=chip+1;i<=chipHigh;i++){
+      WriteChipHeader(i,hs,baseWord);
       WriteChipTrailer(buf,0,baseWord);
-      chipHitCount=0;
     }//end for
   }//end if
   else{
     //In this module there aren't digits but
-    //the chip header and chip trailer are store anyway
-    if(fHalfStaveModule){
-      chipNo=5;
-      fHalfStaveModule=-1;
-    }//end if
-    for(Int_t i=0;i<5;i++){
-      WriteChipHeader(chipNo+i,(mod/2),baseWord);
-      WriteChipTrailer(buf,chipHitCount,baseWord);
-      chipHitCount=0;
+    //the chip header and chip trailer are stored anyway
+    for(Int_t i=chipLow; i<=chipHigh; i++){
+      WriteChipHeader(i,hs,baseWord);
+      WriteChipTrailer(buf,0,baseWord);
     }//end for
   }//end else 
+
+  delete digMap;
+
   if(fVerbose==2)
     ftxt.close();
   return;
index c7bb49b..ad5852c 100644 (file)
@@ -146,13 +146,13 @@ void AliITSRawStreamSPD::NewEvent() {
   fLastDDLID = -1;
 }
 //__________________________________________________________________________
-Bool_t AliITSRawStreamSPD::ReadCalibHeader() {
+Int_t AliITSRawStreamSPD::ReadCalibHeader() {
   // read the extra calibration header
-  // returns kTRUE if the header is present and there is no problem reading it
+  // returns the length of the header if it is present, -1 otherwise
 
   Int_t ddlID = fRawReader->GetDDLID();
   if (ddlID==-1) { // we may need to read one word to get the blockAttr
-    if (!ReadNextShort()) return kFALSE;
+    if (!ReadNextShort()) return -1;
     ddlID = fRawReader->GetDDLID();
   }
   // reset flags and counters
@@ -178,7 +178,7 @@ Bool_t AliITSRawStreamSPD::ReadCalibHeader() {
        AliError(errMess.Data());
        fRawReader->AddMajorErrorLog(kCalHeaderLengthErr,errMess.Data());
        if (fAdvancedErrorLog) fAdvLogger->ProcessError(kCalHeaderLengthErr,ddlID,-1,-1,errMess.Data());
-       return kFALSE;
+       return -1;
       }
       else {
        for (UInt_t iword=0; iword<calLen; iword++) {
@@ -190,15 +190,15 @@ Bool_t AliITSRawStreamSPD::ReadCalibHeader() {
            AliError(errMess.Data());
            fRawReader->AddMajorErrorLog(kCalHeaderLengthErr,errMess.Data());
            if (fAdvancedErrorLog) fAdvLogger->ProcessError(kCalHeaderLengthErr,ddlID,-1,-1,errMess.Data());
-           return kFALSE;
+           return -1;
          }
        }
-       return kTRUE;
+       return calLen;
       }
     }
   }
 
-  return kFALSE;
+  return -1;
 }
 //__________________________________________________________________________
 Bool_t AliITSRawStreamSPD::Next() {
@@ -217,7 +217,7 @@ Bool_t AliITSRawStreamSPD::Next() {
          fEqPLBytesRead -= 2;
          CheckHeaderAndTrailerCount(fLastDDLID);
        }
-       if (ReadCalibHeader()) continue;
+       if (ReadCalibHeader()>=0) continue;
       }
     }
     else {
index 33836fe..068dd86 100644 (file)
@@ -22,7 +22,7 @@ class AliITSRawStreamSPD: public AliITSRawStream {
     virtual ~AliITSRawStreamSPD() {};
 
     virtual Bool_t   Next();
-    virtual Bool_t   ReadCalibHeader();
+    virtual Int_t   ReadCalibHeader();
 
     // the 2 methods below are equivalent to AliITSRawStream::GetCoord1 and GetCoord2
     // together with the AliITSRawStream::GetModuleID these are the "offline" coordinates
index f516801..3b32683 100644 (file)
@@ -146,13 +146,13 @@ void AliITSRawStreamSPD::NewEvent() {
   fLastDDLID = -1;
 }
 //__________________________________________________________________________
-Bool_t AliITSRawStreamSPD::ReadCalibHeader() {
+Int_t AliITSRawStreamSPD::ReadCalibHeader() {
   // read the extra calibration header
-  // returns kTRUE if the header is present and there is no problem reading it
+  // returns the length of the header if it is present, -1 otherwise
 
   Int_t ddlID = fRawReader->GetDDLID();
   if (ddlID==-1) { // we may need to read one word to get the blockAttr
-    if (!ReadNextShort()) return kFALSE;
+    if (!ReadNextShort()) return -1;
     ddlID = fRawReader->GetDDLID();
   }
   // reset flags and counters
@@ -178,7 +178,7 @@ Bool_t AliITSRawStreamSPD::ReadCalibHeader() {
        AliError(errMess.Data());
        fRawReader->AddMajorErrorLog(kCalHeaderLengthErr,errMess.Data());
        if (fAdvancedErrorLog) fAdvLogger->ProcessError(kCalHeaderLengthErr,ddlID,-1,-1,errMess.Data());
-       return kFALSE;
+       return -1;
       }
       else {
        for (UInt_t iword=0; iword<calLen; iword++) {
@@ -190,15 +190,15 @@ Bool_t AliITSRawStreamSPD::ReadCalibHeader() {
            AliError(errMess.Data());
            fRawReader->AddMajorErrorLog(kCalHeaderLengthErr,errMess.Data());
            if (fAdvancedErrorLog) fAdvLogger->ProcessError(kCalHeaderLengthErr,ddlID,-1,-1,errMess.Data());
-           return kFALSE;
+           return -1;
          }
        }
-       return kTRUE;
+       return calLen;
       }
     }
   }
 
-  return kFALSE;
+  return -1;
 }
 //__________________________________________________________________________
 Bool_t AliITSRawStreamSPD::Next() {
@@ -217,7 +217,7 @@ Bool_t AliITSRawStreamSPD::Next() {
          fEqPLBytesRead -= 2;
          CheckHeaderAndTrailerCount(fLastDDLID);
        }
-       if (ReadCalibHeader()) continue;
+       if (ReadCalibHeader()>=0) continue;
       }
     }
     else {
index e724bab..54a6c53 100644 (file)
 //                                                                            //
 ////////////////////////////////////////////////////////////////////////////////
 
+#ifndef SPD_DA_OFF
 extern "C" {
 #include "daqDA.h"
 }
+#endif
 #include "event.h"
 #include "monitor.h"
 #include "AliRawReaderDate.h"
index 065b944..9bf0f6c 100644 (file)
 //                                                                            //
 ////////////////////////////////////////////////////////////////////////////////
 
+#ifndef SPD_DA_OFF
 extern "C" {
 #include "daqDA.h"
 }
+#endif
 #include "event.h"
 #include "monitor.h"
 #include "AliRawReaderDate.h"
@@ -252,7 +254,7 @@ int main(int argc, char **argv) {
            }
          }
          
-         if (str->ReadCalibHeader()) {
+         if (str->ReadCalibHeader()>0) {
            // first check the type:
            if (bScanInit[eqId] && type[eqId]!=str->GetHtype()) {
              printf("Calib header problem. Type changed (%d -> %d)!\n",type[eqId],str->GetHtype());