]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Add variable numbers of DSP's/buspatches and DDL (Christian)
authormartinez <martinez@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 13 Dec 2005 11:37:30 +0000 (11:37 +0000)
committermartinez <martinez@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 13 Dec 2005 11:37:30 +0000 (11:37 +0000)
MUON/AliMUONRawData.cxx
MUON/AliMUONRawData.h
MUON/mapping/data/DetElemIdToBusPatch.dat

index 4fa5c17e27a95f9b3511f2352dbf67ee1ab4f8a8..cd8d97bc4177f7c59c9ec9775a4edb22dbf1465d 100644 (file)
 ////////////////////////////////////
 //
 // MUON Raw Data generator and reader in ALICE-MUON
-// This class version 1 (further details could be found in Alice-note)
+// This class version 3 (further details could be found in Alice-note)
+//
+// Implemented non-constant buspatch numbers for tracking
+// with correct DDL id (first guess)
+// (Ch. Finck, dec 2005)
+//
 // Digits2Raw:
 // Generates raw data for MUON tracker and finally for trigger
-// * a simple mapping is used (see below)
-// * the bus patch id is calculated with an absolute number 0 - 999
-// * one DDL per 1/2 chamber is created for both cathode.
+// Using real mapping (inverse) for tracker
 // For trigger there is no mapping (mapping could be found in AliMUONTriggerCircuit)
 // Ch. Finck july 04
+//
 // Raw2Digits:
-// Using still dummy mapping (inverse) for tracker
+// Using real mapping  for tracker
 // Indranil Das (Adapted for runloader: Ch. Finck) july 05
+// 
 ////////////////////////////////////
 
 #include <fstream>
@@ -137,8 +142,9 @@ AliMUONRawData::~AliMUONRawData(void)
   if (fDDLTrigger)
     delete fDDLTrigger;
 
- fDetElemIdToBusPatch.Delete();
- fBusPatchToDetElem.Delete();
+  fDetElemIdToBusPatch.Delete();
+  fBusPatchToDetElem.Delete();
+  fBusPatchToDDL.Delete();
 
   return;
 }
@@ -269,7 +275,7 @@ Int_t AliMUONRawData::WriteTrackerDDL(Int_t iCh)
     Int_t error = GetInvMapping(digit, busPatchId, manuId, channelId);
     if (error) continue;
 
-    AliDebug(1,Form("input  IdDE %d busPatchId %d PadX %d PadY %d iCath %d \n", 
+    AliDebug(3,Form("input  IdDE %d busPatchId %d PadX %d PadY %d iCath %d \n", 
                    detElemId, busPatchId, padX, padY, cathode));
 
     AliDebug(3,Form("busPatchId %d, manuId %d channelId %d\n", busPatchId, manuId, channelId ));
@@ -326,21 +332,36 @@ Int_t AliMUONRawData::WriteTrackerDDL(Int_t iCh)
     printf("\n");
   }
   
+  // getting info for the number of buspatches
   Int_t iBusPatch;
-  Int_t iEntries = 0;
   Int_t length;
+  Int_t iBusPerDSP[5];//number of bus patches per DSP
+  Int_t iDspMax; //number max of DSP per block
+  Int_t iFile = 0;
+  GetDspInfo(iCh, iDspMax, iBusPerDSP);
+
+  TArrayI* vec = GetBusfromDE((iCh+1)*100);
+
+  Int_t iBus0AtCh = vec->At(0); //get first bus patch id for a given ich
+       
+  AliDebug(3,Form("iBus0AtCh %d", iBus0AtCh));
+
+  iBusPatch = iBus0AtCh - 1; // starting point for each chamber
+
+  // nEntries = fSubEventArray->GetEntriesFast();
+  AliMUONSubEventTracker* temp = 0x0;
 
   // open DDL file, on per 1/2 chamber
   for (Int_t iDDL = 0; iDDL < 2; iDDL++) {
+    
+
     // filling buffer
-    nEntries = fSubEventArray->GetEntriesFast();
     buffer = new Int_t [(2048+24)*50]; // 24 words in average for one buspatch and 2048 manu info at most
 
     indexBlk = 0;
     indexDsp = 0;
     index = 0;
-    iBusPatch = 0;
 
     // two blocks A and B per DDL
     for (Int_t iBlock = 0; iBlock < 2; iBlock++) {
@@ -351,8 +372,8 @@ Int_t AliMUONRawData::WriteTrackerDDL(Int_t iCh)
       indexBlk = index;
       index += length; 
 
-      // 5 DSP's per block
-      for (Int_t iDsp = 0; iDsp < 5; iDsp++) {
+      // 5 DSP's max per block
+      for (Int_t iDsp = 0; iDsp < iDspMax; iDsp++) {
 
        // DSP header
        length = fDDLTracker->GetDspHeaderLength();
@@ -360,22 +381,29 @@ Int_t AliMUONRawData::WriteTrackerDDL(Int_t iCh)
        indexDsp = index;
        index += length; 
 
-       // 5 buspatches per DSP
-       for (Int_t i = 0; i < 5; i++) {
+       // 5 buspatches max per DSP
+       for (Int_t i = 0; i < iBusPerDSP[iDsp]; i++) {
+
+         iBusPatch ++;
+         if ((fBusPatchToDDL(iBusPatch) % 2) == 1) // comparing to DDL file
+           iFile = 0;
+         else
+           iFile = 1;
 
-         // assuming busPatchId begins at 100 (to be discussed ChF)
-         iBusPatch = i + iBlock*25 + iDsp*5 + 50*(2*(iCh+1) + iDDL);
-         AliDebug(3,Form("busPatchId %d", iBusPatch));
+         AliDebug(3,Form("iCh %d iDDL %d iBlock %d iDsp %d busPatchId %d", iCh, iDDL, iBlock, iDsp, iBusPatch));
 
-         AliMUONSubEventTracker* temp = (AliMUONSubEventTracker*)fSubEventArray->At(iEntries);
-         if (nEntries > 0) {
+         nEntries = fSubEventArray->GetEntriesFast();
+
+         for (Int_t iEntries = 0; iEntries < nEntries; iEntries++) { // method "bourrique"...
+           temp = (AliMUONSubEventTracker*)fSubEventArray->At(iEntries);
            busPatchId = temp->GetBusPatchId();
+           if (busPatchId == iBusPatch) break;
+           busPatchId = -1;
            AliDebug(3,Form("busPatchId %d", temp->GetBusPatchId()));
-         } else
-            busPatchId = -1;
+         } 
         
          // check if buspatchid has digit
-         if (busPatchId == iBusPatch) {
+         if (busPatchId != -1) {
            // add bus patch structure
            length = temp->GetHeaderLength();
            memcpy(&buffer[index],temp->GetAddress(),length*4);
@@ -385,8 +413,8 @@ Int_t AliMUONRawData::WriteTrackerDDL(Int_t iCh)
              AliDebug(3,Form("busPatchId %d, manuId %d channelId %d\n", temp->GetBusPatchId(), 
                              temp->GetManuId(j), temp->GetChannelId(j) ));
            }
-           if (iEntries < nEntries-1)
-              iEntries++;
+           //        fSubEventArray->RemoveAt(iEntries);
+           //        fSubEventArray->Compress();
          } else {
            // writting anyhow buspatch structure (empty ones)
            buffer[index++] = 4; // total length
@@ -409,8 +437,8 @@ Int_t AliMUONRawData::WriteTrackerDDL(Int_t iCh)
     //writting onto disk
     // write DDL 1 & 2
     header.fSize = (index + headerSize) * 4;// total length in bytes
-    fwrite((char*)(&header),headerSize*4,1,fFile[iDDL]);
-    fwrite(buffer,sizeof(int),index,fFile[iDDL]);
+    fwrite((char*)(&header),headerSize*4,1,fFile[iFile]);
+    fwrite(buffer,sizeof(int),index,fFile[iFile]);
    
     delete[] buffer;
   }
@@ -528,7 +556,7 @@ Int_t AliMUONRawData::WriteTriggerDDL()
        if (isFired[iLocCard]) {
          locTrg = (AliMUONLocalTrigger*)localTrigger->At(iEntries);
          locCard = locTrg->LoCircuit();
-         locDec = locTrg->GetLoDecision();
+         locDec  = locTrg->GetLoDecision();
          trigY = 0;
          posY = locTrg->LoStripY();
          posX = locTrg->LoStripX();
@@ -541,7 +569,7 @@ Int_t AliMUONRawData::WriteTriggerDDL()
          trigY = 1;
          posY = 15;
          posX = 0;
-         devX = 0x8000;
+         devX = 0x8;
        }
 
        //packing word
@@ -551,7 +579,7 @@ Int_t AliMUONRawData::WriteTriggerDDL()
        AliBitPacking::PackWord((UInt_t)trigY,word,14,14);
        AliBitPacking::PackWord((UInt_t)posY,word,10,13);
        AliBitPacking::PackWord((UInt_t)devX,word,5,9);
-       AliBitPacking::PackWord((UInt_t)posX,word,0,4);
+       AliBitPacking::PackWord((UInt_t)posX,word,0,4);
 
        if (locCard == iLocCard) {
          // add local cards structure
@@ -730,28 +758,41 @@ Int_t AliMUONRawData::ReadTrackerDDL(AliRawReader* rawReader)
   Int_t dspHeaderSize      = fDDLTracker->GetDspHeaderLength();
   Int_t buspatchHeaderSize = subEventTracker->GetHeaderLength();
 
-//   Each DDL is made with 2 Blocks each of which consists of 5 DSP and each of DSP has at most 5 buspatches.
-//   This information is used to calculate the size of headers (DDL,Block and DSP) which has no interesting data. 
+  Int_t totalDDLSize, totalBlockSize, totalDspSize , totalBusPatchSize, dataSize; 
 
-  const Int_t kBlankDDLSize   = ddlHeaderSize + 2*blockHeaderSize + 2*5*dspHeaderSize + 2*5*5*buspatchHeaderSize;
-  const Int_t kBlankBlockSize = blockHeaderSize + 5*dspHeaderSize + 5*5*buspatchHeaderSize;
-  const Int_t kBlankDspSize   = dspHeaderSize + 5*buspatchHeaderSize;
 
-  Int_t totalDDLSize, totalBlockSize, totalDspSize , totalBusPatchSize, dataSize; 
+  Int_t iBusPerDSP[5];//number of bus patches per DSP
+  Int_t iDspMax; //number max of DSP per block
 
-  UShort_t  charge; 
-  Int_t padX, padY,iCath;
+  // minimum data size (only header's)
+  Int_t blankDDLSize;
+  Int_t blankBlockSize;
+  Int_t blankDspSize;  
 
   for(Int_t iDDL = 0; iDDL < 20; iDDL++) { // DDL loop
+
     AliDebug(3, Form("Chamber %d\n", iDDL/2 +1 ));
 
+    // getting DSP info
+    GetDspInfo(iDDL/2, iDspMax, iBusPerDSP);
+
+    //   Each DDL is made with 2 Blocks each of which consists of 5 DSP's at most and each of DSP has at most 5 buspatches.
+    //   This information is used to calculate the size of headers (DDL,Block and DSP) which has no interesting data.
+    blankDDLSize   = ddlHeaderSize + 2*blockHeaderSize + 2*iDspMax*dspHeaderSize;
+    blankBlockSize = blockHeaderSize + iDspMax*dspHeaderSize;
+
+    for (Int_t i = 0; i < iDspMax; i++) {
+      blankDDLSize   += 2*iBusPerDSP[i]*buspatchHeaderSize;
+      blankBlockSize +=   iBusPerDSP[i]*buspatchHeaderSize;
+    }
+
     rawReader->Select(0X9, iDDL, iDDL);  //Select the DDL file to be read  
 
     rawReader->ReadHeader();
 
-    totalDDLSize = (rawReader->GetDataSize()+sizeof(AliRawDataHeader))/4; // 4 is multiplied to convert byte 2 word
+    totalDDLSize = (rawReader->GetDataSize() + sizeof(AliRawDataHeader))/4; // 4 is multiplied to convert byte 2 words
 
-    if(totalDDLSize>kBlankDDLSize){      // Compare the DDL header with an empty DDL header size to read the file
+    if(totalDDLSize > blankDDLSize) {      // Compare the DDL header with an empty DDL header size to read the file
 
       Int_t totalDataWord = rawReader->GetDataSize()/4 ;
       UInt_t *buffer = new UInt_t[totalDataWord];
@@ -760,65 +801,77 @@ Int_t AliMUONRawData::ReadTrackerDDL(AliRawReader* rawReader)
        rawReader->ReadNextInt(temp);      // takes the whole result into buffer variable for future analysis
       }
 
-      Char_t parity;
-      Int_t buspatchId;
-      UChar_t channelId;
-      UShort_t  manuId;//,charge; 
-      Int_t idDE;//,padX, padY,iCath;
-      Int_t indexDsp, indexBusPatch, index = 0;
+      // elex info
+      Int_t    buspatchId;
+      UChar_t  channelId;
+      UShort_t manuId;
+      Char_t   parity;
+      UShort_t charge; 
 
+      // indexes
+      Int_t indexDsp;
+      Int_t indexBusPatch;
+      Int_t index = 0;
 
       for(Int_t iBlock = 0; iBlock < 2 ;iBlock++){  // loop over 2 blocks
        totalBlockSize = buffer[index];
          
-       if(totalBlockSize > kBlankBlockSize){        // compare block header
+       if(totalBlockSize > blankBlockSize) {        // compare block header
          index += blockHeaderSize;
 
-         for(Int_t iDsp = 0; iDsp < 5 ;iDsp++){   //DSP loop
+         for(Int_t iDsp = 0; iDsp < iDspMax ;iDsp++){   //DSP loop
+
            totalDspSize = buffer[index];
            indexDsp = index;
 
-           if(totalDspSize > kBlankDspSize){       // Compare DSP Header
+           blankDspSize =  dspHeaderSize + iBusPerDSP[iDsp]*buspatchHeaderSize; // no data just header
+
+           if(totalDspSize > blankDspSize) {       // Compare DSP Header
              index += dspHeaderSize;
                
-             for(Int_t iBusPatch = 0; iBusPatch < 5 ; iBusPatch++){  
+             for(Int_t iBusPatch = 0; iBusPatch < iBusPerDSP[iDsp]; iBusPatch++) {  
+
                totalBusPatchSize = buffer[index];
-               indexBusPatch = index;
-               buspatchId = buffer[index+2];
+               buspatchId        = buffer[index+2];
+               indexBusPatch     = index;
+
+               if(totalBusPatchSize > buspatchHeaderSize) {    //Check Buspatch header
 
-               if(totalBusPatchSize > buspatchHeaderSize){    //Check Buspatch header
-                 index += buspatchHeaderSize;
+                 index   += buspatchHeaderSize;
                  dataSize = totalBusPatchSize - buspatchHeaderSize;
 
-                 if(dataSize>0) {
+                 if(dataSize>0) { // check data present
 
-                   for(Int_t iData = 0; iData < dataSize ;iData++) {
+                   for(Int_t iData = 0; iData < dataSizeiData++) {
 
                      subEventTracker->SetData(buffer[index++],iData);   //Set to extract data
-                     parity = subEventTracker->GetParity(iData);
-                     manuId = subEventTracker->GetManuId(iData);
+                     // digits info
+                     parity    = subEventTracker->GetParity(iData); // test later for parity
+                     manuId    = subEventTracker->GetManuId(iData);
                      channelId = subEventTracker->GetChannelId(iData);
-                     charge = subEventTracker->GetCharge(iData);
-                     digit->SetSignal(charge); // set charge
+                     charge    = subEventTracker->GetCharge(iData);
+                     // set charge
+                     digit->SetSignal(charge);
 
                      Int_t error = GetMapping(buspatchId,manuId,channelId,digit); // Get Back the hits at pads
                      if (error) continue;
 
-                     padX = digit->PadX();
-                     padY = digit->PadY();
-                     iCath = digit->Cathode();  
-                     idDE = digit->DetElemId();
+                     // debugging 
+                     if (AliLog::GetGlobalDebugLevel() == 3) {
+                       Int_t padX  = digit->PadX();
+                       Int_t padY  = digit->PadY();
+                       Int_t iCath = digit->Cathode();  
+                       Int_t idDE  = digit->DetElemId();
 
-                     AliDebug(1,Form("output  IdDE %d busPatchid %d PadX %d PadY %d iCath %d \n", 
+                       AliDebug(1,Form("output  IdDE %d busPatchid %d PadX %d PadY %d iCath %d \n", 
                                      idDE, buspatchId, padX, padY, iCath));
                
+                       AliDebug(3,Form("idDE %d Padx %d Pady %d, Cath %d, charge %d",idDE, padX, padY, iCath, charge));
+                     }
 
-                     AliDebug(3,Form("idDE %d Padx %d Pady %d, Cath %d, charge %d",idDE, padX, padY, iCath, charge));
                      // fill digits
-                     //        fMUONData->AddDigit(iCh, *digit);
                      fMUONData->AddDigit(iDDL/2, *digit);
 
-
                    } // data loop
                  } // dataSize test
                } // testing buspatch
@@ -827,7 +880,6 @@ Int_t AliMUONRawData::ReadTrackerDDL(AliRawReader* rawReader)
 
              }  //buspatch loop
                
-               
            }  // dsp test
 
            index = indexDsp + totalDspSize;
@@ -1092,6 +1144,37 @@ TArrayI*  AliMUONRawData::GetBusfromDE(Int_t idDE)
   return (TArrayI*)fDetElemIdToBusPatch.GetValue(idDE);
 }
 //____________________________________________________________________
+Int_t AliMUONRawData::GetDDLfromBus(Int_t busPatchId)
+{
+  // getting DE id from bus patch
+  Long_t it = fBusPatchToDDL.GetValue(busPatchId);
+
+ if ( it ) 
+   return (Int_t)it;
+ else 
+   return -1;
+}
+
+//____________________________________________________________________
+void AliMUONRawData::GetDspInfo(Int_t iCh, Int_t& iDspMax, Int_t* iBusPerDSP)
+{
+  // calculates the number of DSP & buspatch per block
+
+  Int_t iBusPerBlk = fMaxBusPerCh[iCh]/4; //per half chamber; per block
+
+  iDspMax =  iBusPerBlk/5; //number max of DSP per block
+  if (iBusPerBlk % 5 != 0)
+    iDspMax += 1;
+  
+  for (Int_t i = 0; i < iDspMax; i++) {
+    if ((iBusPerBlk -= 5) > 0) 
+      iBusPerDSP[i] = 5;
+    else 
+      iBusPerDSP[i] = iBusPerBlk + 5;
+  }
+  
+}
+//____________________________________________________________________
 void AliMUONRawData::ReadBusPatchFile()
 {
 
@@ -1108,33 +1191,51 @@ void AliMUONRawData::ReadBusPatchFile()
        
    char line[80];
 
+   Int_t iChprev = 1;
+   Int_t maxBusPatch = 0;
+
    while ( in.getline(line,80) ) {
 
       if ( line[0] == '#' ) continue;
 
       TString tmp(AliMpHelper::Normalize(line));
 
-      Int_t blankPos = tmp.First(' ');
+      Int_t blankPos  = tmp.First(' ');
+      Int_t blankPos1 = tmp.Last(' ');
 
       TString sDE(tmp(0, blankPos));
 
       Int_t idDE = atoi(sDE.Data());
       
-      TString busPatch(tmp(blankPos + 1, tmp.Length()-blankPos));
+      if (idDE/100 != iChprev) {
+       fMaxBusPerCh[iChprev-1] = maxBusPatch-iChprev*100+1;
+       iChprev = idDE/100;
+      }
+
+      TString sDDL(tmp(blankPos1 + 1, tmp.Length()-blankPos1));
+
+      Int_t iDDL = atoi(sDDL.Data());
+
+      TString busPatch(tmp(blankPos + 1,blankPos1-blankPos-1));
+      AliDebug(3,Form("idDE %d buspatch %s iDDL %d\n", idDE, busPatch.Data(), iDDL));
 
       TArrayI busPatchList;
       // decoding range of buspatch
       AliMpHelper::DecodeName(busPatch,';',busPatchList);
       
       // filling buspatch -> idDE
-      for (Int_t i = 0; i < busPatchList.GetSize(); i++)
+      for (Int_t i = 0; i < busPatchList.GetSize(); i++) {
        fBusPatchToDetElem.Add((Long_t)busPatchList[i],(Long_t)idDE);
-
-
+       fBusPatchToDDL.Add((Long_t)busPatchList[i],(Long_t)iDDL);
+       maxBusPatch = busPatchList[i];
+      }
+   
       // filling idDE -> buspatch list (vector)
       fDetElemIdToBusPatch.Add((Long_t)idDE, (Long_t)(new TArrayI(busPatchList))); 
 
     }
+   
+   fMaxBusPerCh[iChprev-1] = maxBusPatch-iChprev*100+1;
 
   in.close();
 
index f2a3f67bbe8439c36ee07ea732daf74ce2f97ae1..2772fc79d159364d086d51fb245df133b5f59d20 100644 (file)
@@ -40,6 +40,9 @@ class AliMUONRawData : public TObject
   Int_t ReadTrackerDDL(AliRawReader* rawReader);
   Int_t ReadTriggerDDL(AliRawReader* rawReader);
 
+  void GetDspInfo(Int_t iCh, Int_t& iDspMax, Int_t* iBusPerDSP);
+  Int_t  GetDDLfromBus(Int_t busPatchId);
+
   AliMUONData*   GetMUONData() {return fMUONData;}
 
   void AddData(const AliMUONSubEventTracker* event) {
@@ -82,6 +85,9 @@ class AliMUONRawData : public TObject
 
   TExMap fDetElemIdToBusPatch;       //! Map from idDE to BusPatch   
   TExMap fBusPatchToDetElem;         //! Map from BusPatch to idDE
+  TExMap fBusPatchToDDL;             //! Map from BusPatch to iDDL
+
+  Int_t fMaxBusPerCh[10];            //! max buspatch number per chamber
 
   // writing raw data
   Int_t WriteTrackerDDL(Int_t iCh);
index 568088bc633a3162ce3161029348e135da3efd6f..3e71aa4c8672d989f09acc5a773a39673898628f 100644 (file)
+#DE buspatch DDL
 # Chamber 1
-100 100-124
-101 125-149
-102 150-174
-103 175-199
+100 100-124 1
+101 125-149 1
+102 150-174 2
+103 175-199 2
 # Chamber 2
-200 200-224
-201 225-249
-202 250-274
-203 275-299
+200 200-224 3
+201 225-249 3
+202 250-274 4
+203 275-299 4
 # Chamber 3
-300 300-324
-301 325-349
-302 350-374
-303 375-399
+300 300-324 5 
+301 325-349 5
+302 350-374 6
+303 375-399 6
 # Chamber 4
-400 400-424
-401 425-449
-402 450-474
-403 475-499
+400 400-424 7
+401 425-449 7
+402 450-474 8
+403 475-499 8
 # Chamber 5
-500 500-501
-501 502-505
-502 506-509
-503 510-511
-504 512-513
-505 514-515
-506 516-517
-507 518-521
-508 522-525
-509 526-527
-510 528-531
-511 532-535
-512 536-537
-513 538-539
-514 540-541
-515 542-543
-516 544-547
-517 548-551
+500 500-501 9
+501 502-505 9
+502 506-509 9
+503 510-511 9
+504 512-513 9
+505 514-515 9
+506 516-517 9
+507 518-521 9
+508 522-525 9 
+509 526-527 10
+510 528-531 10
+511 532-535 10
+512 536-537 10
+513 538-539 10
+514 540-541 10
+515 542-543 10
+516 544-547 10
+517 548-551 10
 # Chamber 6
-600 600-601
-601 602-605
-602 606-609
-603 610-611
-604 612-613
-605 614-615
-606 616-617
-607 618-621
-608 622-625
-609 626-627
-610 628-631
-611 632-635
-612 636-637
-613 638-639
-614 640-641
-615 642-643
-616 644-647
-617 648-651
+600 600-601 11
+601 602-605 11
+602 606-609 11
+603 610-611 11
+604 612-613 11
+605 614-615 11
+606 616-617 11
+607 618-621 11
+608 622-625 11
+609 626-627 12
+610 628-631 12
+611 632-635 12
+612 636-637 12
+613 638-639 12
+614 640-641 12
+615 642-643 12
+616 644-647 12
+617 648-651 12
 # Chamber 7
-700 700-703
-701 704-707
-702 708-711
-703 712-715
-704 716-719
-705 720-721
-706 722-723
-707 724-725
-708 726-727
-709 728-731
-710 732-735
-711 736-739
-712 740-743
-713 744-747
-714 748-751
-715 752-755
-716 756-759
-717 760-763
-718 764-765
-719 766-767
-720 768-769
-721 770-771
-722 772-775
-723 776-779
-724 780-783
-725 784-787
+700 700-703 13
+701 704-707 13
+702 708-711 13
+703 712-715 13
+704 716-719 13
+705 720-721 13
+706 722-723 13
+707 724-725 14
+708 726-727 14
+709 728-731 14
+710 732-735 14
+711 736-739 14
+712 740-743 14
+713 744-747 14
+714 748-751 14
+715 752-755 14
+716 756-759 14
+717 760-763 14
+718 764-765 14
+719 766-767 14
+720 768-769 13
+721 770-771 13
+722 772-775 13
+723 776-779 13
+724 780-783 13
+725 784-787 13
 # Chamber 8
-800 800-803
-801 804-807
-802 808-811
-803 812-815
-804 816-819
-805 820-821
-806 822-823
-807 824-825
-808 826-827
-809 828-831
-810 832-835
-811 836-839
-812 840-843
-813 844-847
-814 848-851
-815 852-855
-816 856-859
-817 860-863
-818 864-865
-819 866-867
-820 868-869
-821 870-871
-822 872-875
-823 876-879
-824 880-883
-825 884-887
+800 800-803 15
+801 804-807 15
+802 808-811 15
+803 812-815 15
+804 816-819 15
+805 820-821 15
+806 822-823 15
+807 824-825 16
+808 826-827 16
+809 828-831 16
+810 832-835 16
+811 836-839 16
+812 840-843 16
+813 844-847 16
+814 848-851 16
+815 852-855 16
+816 856-859 16
+817 860-863 16
+818 864-865 16
+819 866-867 16
+820 868-869 15
+821 870-871 15
+822 872-875 15
+823 876-879 15
+824 880-883 15
+825 884-887 15
 # Chamber 9
-900 900-903
-901 904-907
-902 908-911
-903 912-915
-904 916-919
-905 920-923
-906 924-925
-907 926-927
-908 928-931
-909 932-935
-910 936-939
-911 940-943
-912 944-947
-913 948-951
-914 952-955
-915 956-959
-916 960-963
-917 964-967
-918 968-971
-919 972-973
-920 974-975
-921 976-979
-922 980-983
-923 984-987
-924 988-991
-925 992-995
+900 900-903 17
+901 904-907 17
+902 908-911 17
+903 912-915 17
+904 916-919 17
+905 920-923 17
+906 924-925 17
+907 926-927 18
+908 928-931 18
+909 932-935 18
+910 936-939 18
+911 940-943 18
+912 944-947 18
+913 948-951 18
+914 952-955 18
+915 956-959 18
+916 960-963 18
+917 964-967 18
+918 968-971 18 
+919 972-973 18
+920 974-975 17
+921 976-979 17
+922 980-983 17
+923 984-987 17
+924 988-991 17
+925 992-995 17
 # Chamber 10
-1000 1000-1003
-1001 1004-1007
-1002 1008-1011
-1003 1012-1015
-1004 1016-1019
-1005 1020-1023
-1006 1024-1025
-1007 1026-1027
-1008 1028-1031
-1009 1032-1035
-1010 1036-1039
-1011 1040-1043
-1012 1044-1047
-1013 1048-1051
-1014 1052-1055
-1015 1056-1059
-1016 1060-1063
-1017 1064-1067
-1018 1068-1071
-1019 1072-1073
-1020 1074-1075
-1021 1076-1079
-1022 1080-1083
-1023 1084-1087
-1024 1088-1091
-1025 1092-1095
+1000 1000-1003 19
+1001 1004-1007 19
+1002 1008-1011 19
+1003 1012-1015 19
+1004 1016-1019 19
+1005 1020-1023 19
+1006 1024-1025 19
+1007 1026-1027 20
+1008 1028-1031 20
+1009 1032-1035 20
+1010 1036-1039 20
+1011 1040-1043 20
+1012 1044-1047 20
+1013 1048-1051 20
+1014 1052-1055 20
+1015 1056-1059 20
+1016 1060-1063 20
+1017 1064-1067 20
+1018 1068-1071 20
+1019 1072-1073 20
+1020 1074-1075 19
+1021 1076-1079 19 
+1022 1080-1083 19
+1023 1084-1087 19
+1024 1088-1091 19
+1025 1092-1095 19