1.hard coded numbers removed 2.removal of chains in the hardware is taken care of
authorbasanta <basanta@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 22 Jun 2009 07:31:23 +0000 (07:31 +0000)
committerbasanta <basanta@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 22 Jun 2009 07:31:23 +0000 (07:31 +0000)
PMD/AliPMDClusterFinder.cxx
PMD/AliPMDDDLRawData.cxx
PMD/AliPMDDDLRawData.h
PMD/AliPMDRawStream.cxx
PMD/AliPMDRawStream.h
PMD/PMD_ddl_info.dat [new file with mode: 0644]
PMD/PMD_removed_chains.dat [new file with mode: 0644]

index 7849385..9a24689 100644 (file)
@@ -26,6 +26,7 @@
 #include <TTree.h>
 #include <TObjArray.h>
 #include <TClonesArray.h>
+#include <TSystem.h>
 
 #include "AliLog.h"
 #include "AliRunLoader.h"
@@ -518,6 +519,34 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
 
   AliPMDClustering *pmdclust = new AliPMDClusteringV1();
 
+  // open the ddl file info to know the module
+  TString ddlinfofileName(gSystem->Getenv("ALICE_ROOT"));
+  ddlinfofileName += "/PMD/PMD_ddl_info.dat";
+  
+  ifstream infileddl;
+  infileddl.open(ddlinfofileName.Data(), ios::in); // ascii file
+  if(!infileddl) AliError("Could not read the ddl info file");
+
+  Int_t ddlno;
+  Int_t modno;
+  Int_t modulePerDDL;
+  Int_t moduleddl[6];
+
+  for(Int_t jddl = 0; jddl < 6; jddl++)
+    {
+      if (infileddl.eof()) break;
+      infileddl >> ddlno >> modulePerDDL;
+      moduleddl[jddl] = modulePerDDL;
+
+      if (modulePerDDL == 0) continue;
+      for (Int_t im = 0; im < modulePerDDL; im++)
+       {
+         infileddl >> modno;
+       }
+    }
+
+  infileddl.close();
+
   // Set the minimum noise cut per module before clustering
 
   fRecoParam = AliPMDReconstructor::GetRecoParam();
@@ -527,7 +556,6 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
        AliFatal("No Reco Param found for PMD!!!");
     }
 
-
   ResetRecpoint();
 
   Int_t bufsize = 16000;
@@ -545,15 +573,9 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
   AliPMDRawStream pmdinput(rawReader);
 
   while ((indexDDL = pmdinput.DdlData(&pmdddlcont)) >=0)
-  {
-      if (indexDDL < 4)
-       {
-         iSMN = 6;
-       }
-      else if (indexDDL >= 4)
-       {
-         iSMN = 12;
-       }
+    {
+      iSMN = moduleddl[indexDDL];
+
       Int_t ***precpvADC;
       precpvADC = new int **[iSMN];
       for (Int_t i=0; i<iSMN; i++) precpvADC[i] = new int *[kRow];
@@ -596,6 +618,7 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
            {
              AliError(Form("*Row %d and Column NUMBER %d NOT Valid *",
                            row, col));
+
              continue; 
            }
 
@@ -615,7 +638,24 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
          //printf("sig = %d gain = %f\n",sig,gain);
          sig = (Int_t) (sig1*gain);
 
-         if (indexDDL < 4)
+         if (indexDDL == 0)
+           {
+             if (det != 0)
+               AliError(Form("*DDL %d and Detector NUMBER %d NOT MATCHING *",
+                             indexDDL, det));
+             if (iSMN == 6)
+               {
+                 indexsmn = smn;
+               }
+             else if (iSMN == 12)
+               {
+                 if (smn < 6)
+                   indexsmn = smn;
+                 else if (smn >= 18 && smn < 24)
+                   indexsmn = smn-12;
+               }
+           }
+         else if (indexDDL >= 1 && indexDDL < 4)
            {
              if (det != 0)
                AliError(Form("*DDL %d and Detector NUMBER %d NOT MATCHING *",
@@ -641,15 +681,12 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
              if (det != 1)
                AliError(Form("*DDL %d and Detector NUMBER %d NOT MATCHING *",
                              indexDDL, det));
-             if (smn >= 6 && smn < 12)
-               {
-                 indexsmn = smn - 6;
-               }
-             else if (smn >= 12 && smn < 18)
+             if (smn >= 6 && smn < 18)
                {
                  indexsmn = smn - 6;
                }
            }         
+
          precpvADC[indexsmn][row][col] = sig;
        }
       
@@ -675,7 +712,23 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
                } // row
            }     // col
          
-         if (indexDDL < 4)
+         if (indexDDL == 0)
+           {
+             if (iSMN == 6)
+               {
+                 ismn = indexsmn;
+               }
+             else if (iSMN == 12)
+               {
+                 
+                 if (indexsmn < 6)
+                   ismn = indexsmn;
+                 else if (indexsmn >= 6 && indexsmn < 12)
+                   ismn = indexsmn + 12;
+               }
+             idet = 0;
+           }
+         else if (indexDDL >= 1 && indexDDL < 4)
            {
              ismn = indexsmn + indexDDL * 6;
              idet = 0;
@@ -694,14 +747,7 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader,
            }
          else if (indexDDL == 5)
            {
-             if (indexsmn < 6)
-               {
-                 ismn = indexsmn + 6;
-               }
-             else if (indexsmn >= 6 && indexsmn < 12)
-               {
-                 ismn = indexsmn + 6;
-               }
+             ismn = indexsmn + 6;
              idet = 1;
            }
 
@@ -820,6 +866,34 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
 
   AliPMDClustering *pmdclust = new AliPMDClusteringV1();
 
+  // open the ddl file info to know the module
+  TString ddlinfofileName(gSystem->Getenv("ALICE_ROOT"));
+  ddlinfofileName += "/PMD/PMD_ddl_info.dat";
+  
+  ifstream infileddl;
+  infileddl.open(ddlinfofileName.Data(), ios::in); // ascii file
+  if(!infileddl) AliError("Could not read the ddl info file");
+
+  Int_t ddlno;
+  Int_t modno;
+  Int_t modulePerDDL;
+  Int_t moduleddl[6];
+
+  for(Int_t jddl = 0; jddl < 6; jddl++)
+    {
+      if (infileddl.eof()) break;
+      infileddl >> ddlno >> modulePerDDL;
+      moduleddl[jddl] = modulePerDDL;
+
+      if (modulePerDDL == 0) continue;
+      for (Int_t im = 0; im < modulePerDDL; im++)
+       {
+         infileddl >> modno;
+       }
+    }
+
+  infileddl.close();
+
   // Set the minimum noise cut per module before clustering
 
   fRecoParam = AliPMDReconstructor::GetRecoParam();
@@ -853,16 +927,11 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
   AliPMDRawStream pmdinput(rawReader);
   Int_t indexDDL = -1;
 
-  while ((indexDDL = pmdinput.DdlData(&pmdddlcont)) >=0) {
+  while ((indexDDL = pmdinput.DdlData(&pmdddlcont)) >=0)
+    {
+      
+      iSMN = moduleddl[indexDDL];
 
-      if (indexDDL < 4)
-       {
-         iSMN = 6;
-       }
-      else if (indexDDL >= 4)
-       {
-         iSMN = 12;
-       }
       Int_t ***precpvADC;
       precpvADC = new int **[iSMN];
       for (Int_t i=0; i<iSMN; i++) precpvADC[i] = new int *[kRow];
@@ -918,8 +987,24 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
          //printf("sig = %d gain = %f\n",sig,gain);
          sig = (Int_t) (sig1*gain);
 
-
-         if (indexDDL < 4)
+         if (indexDDL == 0)
+           {
+             if (det != 0)
+               AliError(Form("*DDL %d and Detector NUMBER %d NOT MATCHING *",
+                             indexDDL, det));
+             if (iSMN == 6)
+               {
+                 indexsmn = smn;
+               }
+             else if (iSMN == 12)
+               {
+                 if (smn < 6)
+                   indexsmn = smn;
+                 else if (smn >= 18 && smn < 24)
+                   indexsmn = smn-12;
+               }
+           }
+         else if (indexDDL >= 1 && indexDDL < 4)
            {
              if (det != 0)
                AliError(Form("*DDL %d and Detector NUMBER %d NOT MATCHING *",
@@ -945,15 +1030,12 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
              if (det != 1)
                AliError(Form("*DDL %d and Detector NUMBER %d NOT MATCHING *",
                              indexDDL, det));
-             if (smn >= 6 && smn < 12)
-               {
-                 indexsmn = smn - 6;
-               }
-             else if (smn >= 12 && smn < 18)
+             if (smn >= 6 && smn < 18)
                {
                  indexsmn = smn - 6;
                }
            }         
+         
          precpvADC[indexsmn][row][col] = sig;
 
        }
@@ -975,8 +1057,24 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
                } // row
            }     // col
 
-         
-         if (indexDDL < 4)
+
+         if (indexDDL == 0)
+           {
+             if (iSMN == 6)
+               {
+                 ismn = indexsmn;
+               }
+             else if (iSMN == 12)
+               {
+                 
+                 if (indexsmn < 6)
+                   ismn = indexsmn;
+                 else if (indexsmn >= 6 && indexsmn < 12)
+                   ismn = indexsmn + 12;
+               }
+             idet = 0;
+           }
+         else if (indexDDL >= 1 && indexDDL < 4)
            {
              ismn = indexsmn + indexDDL * 6;
              idet = 0;
@@ -995,14 +1093,7 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader)
            }
          else if (indexDDL == 5)
            {
-             if (indexsmn < 6)
-               {
-                 ismn = indexsmn + 6;
-               }
-             else if (indexsmn >= 6 && indexsmn < 12)
-               {
-                 ismn = indexsmn + 6;
-               }
+             ismn = indexsmn + 6;
              idet = 1;
            }
 
index 8883182..4140dba 100644 (file)
@@ -103,32 +103,39 @@ void AliPMDDDLRawData::WritePMDRawData(TTree *treeD)
 
   Char_t filename[80];
 
+  // open the ddl file info to know the modules per DDL
+  TString ddlinfofileName(gSystem->Getenv("ALICE_ROOT"));
+  ddlinfofileName += "/PMD/PMD_ddl_info.dat";
+
+  ifstream infileddl;
+  infileddl.open(ddlinfofileName.Data(), ios::in); // ascii file
+  if(!infileddl) AliError("Could not read the ddl info file");
+
+
 
   Int_t mmodule = 0;
+  Int_t ddlno;
+  Int_t modno;
+  Int_t *modulenoddl = 0x0;
+
   for(Int_t iddl = 0; iddl < kDDL; iddl++)
     {
+      if (infileddl.eof()) break;
+      infileddl >> ddlno >> modulePerDDL;
+
+      if (modulePerDDL == 0) continue;
+
+      modulenoddl = new Int_t [modulePerDDL];
+      for (Int_t im = 0; im < modulePerDDL; im++)
+       {
+         infileddl >> modno;
+         modulenoddl[im] = modno;
+       }
+
       strcpy(filename,AliDAQ::DdlFileName("PMD",iddl));
       
       outfile = new AliFstream(filename);
       
-      if (iddl < 4)
-       {
-         modulePerDDL = 6;
-         mmodule = 6*iddl;
-       }
-      else if (iddl == 4)
-       {
-         modulePerDDL = 12;
-         mmodule = 24;
-       }
-      else if (iddl == 5)
-       {
-         modulePerDDL = 12;
-         mmodule = 30;
-       }
-
-
-
       // Write the Dummy Data Header into the file
       Int_t bHPosition = outfile->Tellp();
       outfile->WriteBuffer((char*)(&header),sizeof(header));
@@ -144,18 +151,16 @@ void AliPMDDDLRawData::WritePMDRawData(TTree *treeD)
 
       for(Int_t ium = 0; ium < modulePerDDL; ium++)
        {
-         if (iddl == 4 && ium == 6) mmodule = 42;
+         //if (iddl == 4 && ium == 6) mmodule = 42;
 
          // Extract energy deposition per cell and pack it
          // in a 32-bit word and returns all the total words
          // per one unit-module
          
-         GetUMDigitsData(treeD, mmodule, iddl, contentsBus, busPatch);
-         mmodule++;
+         mmodule = modulenoddl[ium];
+         GetUMDigitsData(treeD, mmodule, iddl, modulePerDDL, contentsBus, busPatch);
        }
 
-      
-
       Int_t ij = 0;
       Int_t dsp[10];
       Int_t dspBus[10];
@@ -361,14 +366,16 @@ void AliPMDDDLRawData::WritePMDRawData(TTree *treeD)
       delete outfile;
     } // DDL Loop over
 
-
+  delete [] modulenoddl;
+  infileddl.close();
 }
 //____________________________________________________________________________
 void AliPMDDDLRawData::GetUMDigitsData(TTree *treeD, Int_t imodule,
-                                      Int_t ddlno, Int_t *contentsBus,
+                                      Int_t ddlno, Int_t modulePerDDL,
+                                      Int_t *contentsBus,
                                       UInt_t busPatch[][1536])
 {
-  // Retrives digits data UnitModule by UnitModule
+  // Retrieves digits data UnitModule by UnitModule
 
   UInt_t baseword;
   UInt_t mcmno, chno;
@@ -396,15 +403,7 @@ void AliPMDDDLRawData::GetUMDigitsData(TTree *treeD, Int_t imodule,
       endRowBus[i]   = -1;
       endColBus[i]   = -1;
     }
-  Int_t modulePerDDL = 0;
-  if (ddlno < 4)
-    {
-      modulePerDDL = 6;
-    }
-  else if (ddlno == 4 || ddlno == 5)
-    {
-      modulePerDDL = 12;
-    }
+
 
   TString fileName(gSystem->Getenv("ALICE_ROOT"));
 
@@ -442,6 +441,8 @@ void AliPMDDDLRawData::GetUMDigitsData(TTree *treeD, Int_t imodule,
     {
       infile >> moduleno;
       infile >> totPatchBus >> bPatchBus >> ePatchBus;
+      
+      if (totPatchBus == 0) continue;    // BKN
 
       if (moduleno == imodule)
        {
@@ -468,6 +469,39 @@ void AliPMDDDLRawData::GetUMDigitsData(TTree *treeD, Int_t imodule,
 
   infile.close();
 
+  // Read if some chains are off
+  TString rchainName(gSystem->Getenv("ALICE_ROOT"));
+  rchainName += "/PMD/PMD_removed_chains.dat";
+
+  ifstream rchainfile;
+  rchainfile.open(rchainName.Data(), ios::in); // ascii file
+  if(!rchainfile)AliError("Could not read the removed cahins file");
+
+  Int_t srowoff1[2][24], erowoff1[2][24];
+  Int_t scoloff1[2][24], ecoloff1[2][24];
+  Int_t srowoff2[2][24], erowoff2[2][24];
+  Int_t scoloff2[2][24], ecoloff2[2][24];
+
+  Int_t rows1, rowe1, cols1, cole1;
+  Int_t rows2, rowe2, cols2, cole2;
+
+  for (Int_t im = 0; im < 48; im++)
+    {
+      rchainfile >> det >> smn >> rows1 >> rowe1 >> cols1 >> cole1
+                >> rows2 >> rowe2 >> cols2 >> cole2;
+      
+      srowoff1[det][smn] = rows1;
+      erowoff1[det][smn] = rowe1;
+      scoloff1[det][smn] = cols1;
+      ecoloff1[det][smn] = cole1;
+      srowoff2[det][smn] = rows2;
+      erowoff2[det][smn] = rowe2;
+      scoloff2[det][smn] = cols2;
+      ecoloff2[det][smn] = cole2;
+    }
+
+  rchainfile.close();
+
   treeD->GetEntry(imodule); 
   Int_t nentries = fDigits->GetLast();
   Int_t totword = nentries+1;
@@ -485,8 +519,30 @@ void AliPMDDDLRawData::GetUMDigitsData(TTree *treeD, Int_t imodule,
       adc    = (UInt_t) pmddigit->GetADC();
 
       TransformS2H(smn,irow,icol);
+      
+      // remove the non-existence channels
+
+      //printf("%d %d %d %d\n",det,smn,irow,icol);
+      //printf("--- %d   %d   %d   %d\n",srowoff[det][smn],erowoff[det][smn],
+      //     scoloff[det][smn],ecoloff[det][smn]);
+
+      if (irow >= srowoff1[det][smn] && irow <= erowoff1[det][smn])
+       {
+         if (icol >= scoloff1[det][smn] && icol <= ecoloff1[det][smn])
+           {
+             continue;
+           }
+       }
+      if (irow >= srowoff2[det][smn] && irow <= erowoff2[det][smn])
+       {
+         if (icol >= scoloff2[det][smn] && icol <= ecoloff2[det][smn])
+           {
+             continue;
+           }
+       }
+
 
-      GetMCMCh(ddlno, smn, irow, icol, beginPatchBus, endPatchBus,
+      GetMCMCh(imodule, irow, icol, beginPatchBus, endPatchBus,
               mcmperBus, startRowBus, startColBus,
               endRowBus, endColBus, busno, mcmno, chno);
 
@@ -538,7 +594,7 @@ void AliPMDDDLRawData::TransformS2H(Int_t smn, Int_t &irow, Int_t &icol)
 
 //____________________________________________________________________________
 
-void AliPMDDDLRawData::GetMCMCh(Int_t ddlno, Int_t smn, Int_t row, Int_t col,
+void AliPMDDDLRawData::GetMCMCh(Int_t imodule, Int_t row, Int_t col,
                                Int_t beginPatchBus, Int_t endPatchBus,
                                Int_t *mcmperBus,
                                Int_t *startRowBus, Int_t *startColBus,
@@ -660,18 +716,22 @@ void AliPMDDDLRawData::GetMCMCh(Int_t ddlno, Int_t smn, Int_t row, Int_t col,
     
     
     for (Int_t i = 0; i < 16; i++)
-    {
+      {
        for (Int_t j = 0; j < 4; j++)
-       {
-           if (ddlno == 0 || ddlno == 1) iCh[i][j] = kChDdl01[i][j];
-           if (ddlno == 2 || ddlno == 3) iCh[i][j] = kChDdl23[i][j];
+         {
            
-           if (ddlno == 4 && smn < 6)                iCh[i][j] = kChDdl41[i][j];
-           if (ddlno == 4 && (smn >= 18 && smn < 24))iCh[i][j] = kChDdl42[i][j];
-           if (ddlno == 5 && (smn >= 12 && smn < 18))iCh[i][j] = kChDdl51[i][j];
-           if (ddlno == 5 && (smn >=  6 && smn < 12))iCh[i][j] = kChDdl52[i][j];
-       }
-    }
+           if(imodule < 6)                    iCh[i][j] = kChDdl01[i][j];
+           if(imodule >= 6 && imodule <= 11)  iCh[i][j] = kChDdl01[i][j];
+           if(imodule >= 12 && imodule <= 17) iCh[i][j] = kChDdl23[i][j];
+           if(imodule >= 18 && imodule <= 23) iCh[i][j] = kChDdl23[i][j];
+
+           if(imodule >= 24 && imodule <= 29) iCh[i][j] = kChDdl41[i][j];
+           if(imodule >= 42 && imodule <= 47) iCh[i][j] = kChDdl42[i][j];
+           if(imodule >= 36 && imodule <= 41) iCh[i][j] = kChDdl51[i][j];
+           if(imodule >= 30 && imodule <= 35) iCh[i][j] = kChDdl52[i][j];
+           
+         }
+      }
 
 
   Int_t irownew = row%16;
@@ -687,30 +747,35 @@ void AliPMDDDLRawData::GetMCMCh(Int_t ddlno, Int_t smn, Int_t row, Int_t col,
       Int_t scol = startColBus[ibus];
       Int_t ecol = endColBus[ibus];
       Int_t tmcm = mcmperBus[ibus];
+
       if ((row >= srow && row <= erow) && (col >= scol && col <= ecol))
        {
          busno = ibus;
          
          // Find out the MCM Number
          //
-         
-         if (ddlno == 0 || ddlno == 1)
+
+         if (imodule < 6)                  mcmno = (col-scol)/4 + 1;
+         if (imodule >= 6 && imodule < 12) mcmno = (col-scol)/4 + 1;
+
+         if (imodule >= 12 && imodule < 18)
            {
-             // PRE plane, SU Mod = 0, 1
-             mcmno = (col-scol)/4 + 1;
-             
-           }
-         else if (ddlno == 2 || ddlno == 3)
+             icolnew = (col - scol)/4;
+             mcmno = tmcm - icolnew;
+           }         
+         if (imodule >= 18 && imodule < 24)
            {
-             // PRE plane,  SU Mod = 2, 3
              icolnew = (col - scol)/4;
              mcmno = tmcm - icolnew;
-           }
-         else if (ddlno == 4 )
+           }         
+
+         // DDL = 4
+         if (imodule >= 24 && imodule < 30)
            {
-             // CPV plane,  SU Mod = 0, 3 : ddl = 4
-             
-             if(ibus <= 18)
+
+             //if (tmcm == 24)
+             Int_t rowdiff = endRowBus[ibus] - startRowBus[ibus];
+             if(rowdiff > 16)
                {
                  Int_t midrow = srow + 16;
                  if(row >= srow && row < midrow)
@@ -718,38 +783,46 @@ void AliPMDDDLRawData::GetMCMCh(Int_t ddlno, Int_t smn, Int_t row, Int_t col,
                      mcmno = 12 + (col-scol)/4 + 1;
                    }
                  else if(row >= midrow && row <= erow)
-                 
+                   
                    {
                      mcmno = (col-scol)/4 + 1;
                    }
                }
-             
-             else if (ibus > 18)
+             else if (rowdiff < 16)
                {
-                 Int_t rowdiff = endRowBus[ibus] - startRowBus[ibus];
-                 if(rowdiff > 16)
+                 mcmno = (col-scol)/4 + 1;
+               }
+           
+           }         
+         if (imodule >= 42 && imodule < 48)
+           {
+             Int_t rowdiff = endRowBus[ibus] - startRowBus[ibus];
+             if(rowdiff > 16)
+               {
+                 Int_t midrow = srow + 16;
+                 if (row >= midrow && row <= erow)
                    {
-                     Int_t midrow = srow + 16;
-                     if (row >= midrow && row <= erow)
-                       {
-                         mcmno = 12 + (ecol -col)/4 + 1;
-                       }
-                     else if (row >= srow && row < midrow)
-                       {
-                         mcmno = (ecol - col)/4 + 1;
-                       }
+                     mcmno = 12 + (ecol -col)/4 + 1;
                    }
-                 else if (rowdiff < 16)
+                 else if (row >= srow && row < midrow)
                    {
                      mcmno = (ecol - col)/4 + 1;
                    }
                }
-           }
-         else if ( ddlno == 5)
+             else if (rowdiff < 16)
+               {
+                 mcmno = (ecol - col)/4 + 1;
+               }
+           }         
+
+         // DDL = 5
+         if (imodule >= 30 && imodule < 36)
            {
              // CPV plane,  SU Mod = 1, 2 : ddl = 5
              
-             if(ibus <= 18)
+             //if(tmcm == 24)
+             Int_t rowdiff = endRowBus[ibus] - startRowBus[ibus];
+             if(rowdiff > 16)
                {
                  Int_t midrow = srow + 16;
                  if(row >= srow && row < midrow)
@@ -761,28 +834,33 @@ void AliPMDDDLRawData::GetMCMCh(Int_t ddlno, Int_t smn, Int_t row, Int_t col,
                      mcmno = (col-scol)/4 + 1;
                    }
                }
+             else if(rowdiff < 16)
+               {
+                 mcmno = (col-scol)/4 + 1;
+               }
              
-             else if (ibus > 18)
+           }
+         if (imodule >= 36 && imodule < 42)
+           {
+             Int_t rowdiff = endRowBus[ibus] - startRowBus[ibus];
+             if(rowdiff > 16)
                {
-                 Int_t rowdiff = endRowBus[ibus] - startRowBus[ibus];
-                 if(rowdiff > 16)
+                 Int_t midrow = srow + 16;
+                 if (row >= midrow && row <= erow)
                    {
-                     Int_t midrow = srow + 16;
-                     if (row >= midrow && row <= erow)
-                       {
-                         mcmno = 12 + (ecol - col)/4 + 1;
-                       }
-                     else if (row >= srow && row < midrow)
-                       {
-                         mcmno = (ecol - col)/4 + 1;
-                       }
+                     mcmno = 12 + (ecol - col)/4 + 1;
                    }
-                 else if (rowdiff < 16)
+                 else if (row >= srow && row < midrow)
                    {
                      mcmno = (ecol - col)/4 + 1;
                    }
                }
+             else if (rowdiff < 16)
+               {
+                 mcmno = (ecol - col)/4 + 1;
+               }
            }
+
        }
     }
 } 
index 4af39f6..76f6b47 100644 (file)
@@ -29,24 +29,23 @@ class AliPMDDDLRawData:public TObject
 
   void WritePMDRawData(TTree *treeD);
   void GetUMDigitsData(TTree *treeD, Int_t imodule, Int_t ddlno,
-                      Int_t *contentsBus, UInt_t busPatch[][1536]);
+                      Int_t modulePerDDL, Int_t *contentsBus,
+                      UInt_t busPatch[][1536]);
   void TransformS2H(Int_t smn, Int_t &irow, Int_t &icol);
-  void GetMCMCh(Int_t ddlno, Int_t smn, Int_t row, Int_t col,
+  void GetMCMCh(Int_t imodule, Int_t row, Int_t col,
                Int_t beginPatchBus, Int_t endPatchBus,
                Int_t *mcmperBus,
                Int_t *startRowBus, Int_t *startColBus,
                Int_t *endRowBus, Int_t *endColBus,
                Int_t & busno, UInt_t &mcmno, UInt_t &chno);
 
-//  void  ChMap(Int_t ddlno, Int_t smn, UInt_t iCh[][4]);
-
  protected:
 
   Int_t ComputeParity(UInt_t baseword);
 
   TClonesArray *fDigits;    //! List of digits
 
-  ClassDef(AliPMDDDLRawData,8)    // To make RAW Data
+  ClassDef(AliPMDDDLRawData,9)    // To make RAW Data
 };
 #endif
 
index f3c8097..05bae2d 100644 (file)
@@ -88,11 +88,9 @@ AliPMDRawStream::~AliPMDRawStream()
 
 Int_t AliPMDRawStream::DdlData(TObjArray *pmdddlcont)
 {
-// read the next raw digit
-// returns kFALSE if there is no digit left
-
-    
-
+  // read the next raw digit
+  // returns kFALSE if there is no digit left
+  
   Int_t iddl = -1;
 
   AliPMDddldata *pmdddldata;
@@ -103,6 +101,7 @@ Int_t AliPMDRawStream::DdlData(TObjArray *pmdddlcont)
   Int_t dataSize = fRawReader->GetDataSize();
   Int_t totaldataword = dataSize/4;
 
+
   if (dataSize <= 0) return -1;
 
   UInt_t data;
@@ -130,37 +129,70 @@ Int_t AliPMDRawStream::DdlData(TObjArray *pmdddlcont)
       endColBus[ibus]   = -1;
     }
 
-  // Call the Mapping methods - hard coded
+  // open the ddl file info to know the module
+  TString ddlinfofileName(gSystem->Getenv("ALICE_ROOT"));
+  ddlinfofileName += "/PMD/PMD_ddl_info.dat";
+
+  ifstream infileddl;
+  infileddl.open(ddlinfofileName.Data(), ios::in); // ascii file
+  if(!infileddl) AliError("Could not read the ddl info file");
+
+  Int_t ddlno;
+  Int_t modno;
+  Int_t modulePerDDL;
+  Int_t moduleddl[6];
+
+  for(Int_t jddl = 0; jddl < 6; jddl++)
+    {
+      if (infileddl.eof()) break;
+      infileddl >> ddlno >> modulePerDDL;
+      moduleddl[jddl] = modulePerDDL;
+
+      if (modulePerDDL == 0) continue;
+      for (Int_t im = 0; im < modulePerDDL; im++)
+       {
+         infileddl >> modno;
+       }
+    }
 
+  infileddl.close();
 
   if (iddl == 0)
-  {
-      Ddl0Mapping(moduleNo, mcmperBus, startRowBus, 
+    {
+      modulePerDDL = moduleddl[iddl];
+      Ddl0Mapping(modulePerDDL, moduleNo, mcmperBus, startRowBus, 
                  endRowBus, startColBus, endColBus);
-  }
+
+    }
   else if (iddl == 1)
-  {
-      Ddl1Mapping(moduleNo, mcmperBus, startRowBus, 
+    {
+      modulePerDDL = moduleddl[iddl];
+      Ddl1Mapping(modulePerDDL, moduleNo, mcmperBus, startRowBus, 
                  endRowBus, startColBus, endColBus);
-  }
+      
+    }
   else if (iddl == 2)
-  {
-      Ddl2Mapping(moduleNo, mcmperBus, startRowBus, 
+    {
+      modulePerDDL = moduleddl[iddl];
+      Ddl2Mapping(modulePerDDL, moduleNo, mcmperBus, startRowBus, 
                  endRowBus, startColBus, endColBus);
-  }
+    }
   else if (iddl == 3)
-  {
-      Ddl3Mapping(moduleNo, mcmperBus, startRowBus, 
+    {
+      modulePerDDL = moduleddl[iddl];
+      Ddl3Mapping(modulePerDDL, moduleNo, mcmperBus, startRowBus, 
                  endRowBus, startColBus, endColBus);
-  }
+    }
   else if (iddl == 4)
-  {
-      Ddl4Mapping(moduleNo, mcmperBus, startRowBus, 
+    {
+      modulePerDDL = moduleddl[iddl];
+      Ddl4Mapping(modulePerDDL, moduleNo, mcmperBus, startRowBus, 
                  endRowBus, startColBus, endColBus);
-  }
+    }
   else if (iddl == 5)
-  {
-      Ddl5Mapping(moduleNo, mcmperBus, startRowBus, 
+    {
+      modulePerDDL = moduleddl[iddl];
+      Ddl5Mapping(modulePerDDL, moduleNo, mcmperBus, startRowBus, 
                  endRowBus, startColBus, endColBus);
   }
 
@@ -269,11 +301,12 @@ Int_t AliPMDRawStream::DdlData(TObjArray *pmdddlcont)
 
                  ConvertDDL2SMN(iddl, imodule, ismn, idet);
 
-                 GetRowCol(iddl, ismn, pbusid, imcm, ich, 
+                 GetRowCol(imodule, pbusid, imcm, ich, 
                            startRowBus, endRowBus,
                            startColBus, endColBus,
                            irow, icol);
 
+
                  TransformH2S(ismn, irow, icol);
 
                  pmdddldata = new AliPMDddldata();
@@ -290,9 +323,10 @@ Int_t AliPMDRawStream::DdlData(TObjArray *pmdddlcont)
                  pmdddldata->SetParityBit(ibit);
                  
                  pmdddlcont->Add(pmdddldata);
-                 
+
                } // data word loop
 
+
              if (iwordddl == totaldataword) break;
 
              if (dspHeader.GetPaddingWord() == 1)
@@ -303,8 +337,11 @@ Int_t AliPMDRawStream::DdlData(TObjArray *pmdddlcont)
              {
                  if (iworddsp == dspRawDataLength) break; // raw data
              }
+
+
            } // patch bus loop
 
+
          if (dspHeader.GetPaddingWord() == 1)
          {
              iwordddl++;
@@ -316,6 +353,7 @@ Int_t AliPMDRawStream::DdlData(TObjArray *pmdddlcont)
 
          if (iwordblk == blRawDataLength) break; // for raw data
 
+
        } // end of DSP
 
     } // end of BLOCK
@@ -323,13 +361,13 @@ Int_t AliPMDRawStream::DdlData(TObjArray *pmdddlcont)
   return iddl;
 }
 //_____________________________________________________________________________
-void AliPMDRawStream::GetRowCol(Int_t ddlno, Int_t smn, Int_t pbusid,
+void AliPMDRawStream::GetRowCol(Int_t imodule, Int_t pbusid,
                                UInt_t mcmno, UInt_t chno,
                                Int_t startRowBus[], Int_t endRowBus[],
                                Int_t startColBus[], Int_t endColBus[],
                                Int_t &row, Int_t &col) const
 {
-// decode: ddlno, patchbusid, mcmno, chno -> um, row, col
+  // decode: ddlno, patchbusid, mcmno, chno -> um, row, col
 
   UInt_t iCh[64];
 
@@ -388,45 +426,48 @@ void AliPMDRawStream::GetRowCol(Int_t ddlno, Int_t smn, Int_t pbusid,
                                       0, 3, 1, 2, 9, 6, 5, 10 };
   
   for (Int_t i = 0; i < 64; i++)
-  {
-      if (ddlno == 0 || ddlno == 1) iCh[i] = kChDdl01[i];
-      if (ddlno == 2 || ddlno == 3) iCh[i] = kChDdl23[i];
-      
-      if (ddlno == 4 && smn < 6)                iCh[i] = kChDdl41[i];
-      if (ddlno == 4 && (smn >= 18 && smn < 24))iCh[i] = kChDdl42[i];
-      if (ddlno == 5 && (smn >= 12 && smn < 18))iCh[i] = kChDdl51[i];
-      if (ddlno == 5 && (smn >=  6 && smn < 12))iCh[i] = kChDdl52[i];
-  }
+    {
+      if(imodule < 6)                    iCh[i] = kChDdl01[i];
+      if(imodule >= 6 && imodule <= 11)  iCh[i] = kChDdl01[i];
+      if(imodule >= 12 && imodule <= 17) iCh[i] = kChDdl23[i];
+      if(imodule >= 18 && imodule <= 23) iCh[i] = kChDdl23[i];
+      if(imodule >= 24 && imodule <= 29) iCh[i] = kChDdl41[i];
+      if(imodule >= 42 && imodule <= 47) iCh[i] = kChDdl42[i];
+      if(imodule >= 36 && imodule <= 41) iCh[i] = kChDdl51[i];
+      if(imodule >= 30 && imodule <= 35) iCh[i] = kChDdl52[i];
+    }
   
   
   Int_t rowcol  = iCh[chno];
   Int_t irownew = rowcol/4;
   Int_t icolnew = rowcol%4;
 
-  if (ddlno == 0 )
+
+  if (imodule < 6 )
     {
       row = startRowBus[pbusid] + irownew;
       col = startColBus[pbusid] + (mcmno-1)*4 + icolnew;
     }
-  else if (ddlno == 1)
+  else if (imodule >= 6 && imodule < 12)
     {
-    row = endRowBus[pbusid] - (15 - irownew);
-    col = startColBus[pbusid] + (mcmno-1)*4 + icolnew;
-    
+      row = endRowBus[pbusid] - (15 - irownew);
+      col = startColBus[pbusid] + (mcmno-1)*4 + icolnew;
+      
     }
-  else if (ddlno == 2 )
+  else if (imodule >= 12 && imodule < 18 )
     {
       row = startRowBus[pbusid] + irownew;
       col = endColBus[pbusid] - (mcmno-1)*4 - (3 - icolnew);
     }
-  else if (ddlno == 3)
+  else if (imodule >= 18 && imodule < 24)
     {
-    row = endRowBus[pbusid] - (15 - irownew);
-    col = endColBus[pbusid] - (mcmno-1)*4 - (3 - icolnew);
+      row = endRowBus[pbusid] - (15 - irownew);
+      col = endColBus[pbusid] - (mcmno-1)*4 - (3 - icolnew);
     }
-  else if (ddlno == 4 )
+  else if (imodule >= 24 && imodule < 30)
     {
-      if (pbusid  < 19)
+      Int_t rowdiff = endRowBus[pbusid] - startRowBus[pbusid];
+      if(rowdiff > 16)
        {
          if (mcmno <= 12)
            {
@@ -440,58 +481,66 @@ void AliPMDRawStream::GetRowCol(Int_t ddlno, Int_t smn, Int_t pbusid,
              col = startColBus[pbusid] + (mcmno-12-1)*4 + icolnew;
            }
        }
-      else if(pbusid > 18)
+      else if (rowdiff < 16)
        {
-         if (mcmno <= 12)
-           {
-             col = endColBus[pbusid] - (mcmno-1)*4 - (3 - icolnew); 
-
-             if(endRowBus[pbusid] - startRowBus[pbusid] > 16)
-               row = endRowBus[pbusid] - (15 - irownew) - 16 ;
-             else
-               row = endRowBus[pbusid] - (15 - irownew) ;
-           }
-         else if(mcmno > 12)
-           {
-             row = endRowBus[pbusid] - (15 - irownew)  ;
-             col = endColBus[pbusid] - (mcmno - 12 - 1)*4 - (3 - icolnew);
-           }
+         row = startRowBus[pbusid] + irownew;
+         col = startColBus[pbusid] + (mcmno-1)*4 + icolnew;
        }
     }
-  else if (ddlno == 5)
+  else if (imodule >= 42 && imodule < 48)
     {
-      if (pbusid  <= 18)
+      Int_t rowdiff = endRowBus[pbusid] - startRowBus[pbusid];
+
+      if (mcmno <= 12)
        {
-         if (mcmno > 12)
-           {
-             // Subtract 16 to skip the 1st 15 rows
-             row = endRowBus[pbusid] - 16 -(15 - irownew);
-             col = startColBus[pbusid] + (mcmno-12 -1)*4 + icolnew;
-           }
+         col = endColBus[pbusid] - (mcmno-1)*4 - (3 - icolnew); 
+         
+         if(rowdiff > 16)
+           row = endRowBus[pbusid] - (15 - irownew) - 16 ;
          else
-           {
-             row = endRowBus[pbusid]  - (15 - irownew) ;
-             col = startColBus[pbusid] + (mcmno -1)*4 + icolnew;
-           }
+           row = endRowBus[pbusid] - (15 - irownew) ;
+       }
+      else if(mcmno > 12)
+       {
+         row = endRowBus[pbusid] - (15 - irownew)  ;
+         col = endColBus[pbusid] - (mcmno - 12 - 1)*4 - (3 - icolnew);
+       }
+    }
+
+
 
+  else if (imodule >= 30 && imodule < 36)
+    {
+      if (mcmno > 12)
+       {
+         // Subtract 16 to skip the 1st 15 rows
+         row = endRowBus[pbusid] - 16 -(15 - irownew);
+         col = startColBus[pbusid] + (mcmno-12 -1)*4 + icolnew;
        }
+      else
+       {
+         row = endRowBus[pbusid]  - (15 - irownew) ;
+         col = startColBus[pbusid] + (mcmno -1)*4 + icolnew;
+       }
+
+    }
       
-      else if (pbusid > 18)
+  else if (imodule >= 36 && imodule < 42)
+    {
+      if(mcmno > 12)
        {
-         if(mcmno > 12)
-           {
-             // Add 16 to skip the 1st 15 rows
-             row = startRowBus[pbusid] + irownew + 16;
-             col = endColBus[pbusid] - (mcmno - 12 - 1)*4 - (3 - icolnew);
-           }
-         else 
-           {
-             row = startRowBus[pbusid] + irownew ;
-             col = endColBus[pbusid] - (mcmno - 1)*4 - (3 - icolnew); 
-           }
+         // Add 16 to skip the 1st 15 rows
+         row = startRowBus[pbusid] + irownew + 16;
+         col = endColBus[pbusid] - (mcmno - 12 - 1)*4 - (3 - icolnew);
+       }
+      else 
+       {
+         row = startRowBus[pbusid] + irownew ;
+         col = endColBus[pbusid] - (mcmno - 1)*4 - (3 - icolnew); 
        }
     }
-  
+
+
 }
 //_____________________________________________________________________________
 void AliPMDRawStream::ConvertDDL2SMN(Int_t iddl, Int_t imodule,
@@ -573,354 +622,274 @@ UInt_t AliPMDRawStream::GetNextWord()
 }
 
 //_____________________________________________________________________________
-void AliPMDRawStream::Ddl0Mapping(Int_t moduleNo[],    Int_t mcmperBus[],
+void AliPMDRawStream::Ddl0Mapping(Int_t modulePerDDL, 
+                                 Int_t moduleNo[],    Int_t mcmperBus[],
                                  Int_t startRowBus[], Int_t endRowBus[],
                                  Int_t startColBus[], Int_t endColBus[])
 {
-// DDL0 Mapping 
+  // DDL0 Mapping 
 
-    const Int_t ktotpbus = 36;
-    static const Int_t modno0[ktotpbus] = {0, 0, 0, 0, 0, 0,
-                                          1, 1, 1, 1, 1, 1,
-                                          2, 2, 2, 2, 2, 2,
-                                          3, 3, 3, 3, 3, 3,
-                                          4, 4, 4, 4, 4, 4,
-                                          5, 5, 5, 5, 5, 5,};
+  Int_t moduleno, totPatchBus, bPatchBus, ePatchBus;
+  Int_t ibus, totmcm, rows, rowe, cols, cole;
 
+  TString fileName(gSystem->Getenv("ALICE_ROOT"));
+  fileName += "/PMD/PMD_Mapping_ddl0.dat";
 
+  ifstream infile;
+  infile.open(fileName.Data(), ios::in); // ascii file
+  if(!infile)
+    AliError("Could not read the mapping file for DDL No = 0");
 
-    static const Int_t srbus0[ktotpbus] = {0, 16, 32, 48, 64, 80,
-                                          0, 16, 32, 48, 64, 80,
-                                          0, 16, 32, 48, 64, 80,
-                                          0, 16, 32, 48, 64, 80,
-                                          0, 16, 32, 48, 64, 80,
-                                          0, 16, 32, 48, 64, 80};
-
-
-       
-    static const Int_t erbus0[ktotpbus] = {15, 31, 47, 63, 79, 95,
-                                          15, 31, 47, 63, 79, 95,
-                                          15, 31, 47, 63, 79, 95,
-                                          15, 31, 47, 63, 79, 95,
-                                          15, 31, 47, 63, 79, 95,
-                                          15, 31, 47, 63, 79, 95};
-    
-       
-    for (Int_t ibus = 1; ibus <= ktotpbus; ibus++)
+  for (Int_t im = 0; im < modulePerDDL; im++)
     {
-       moduleNo[ibus]      = modno0[ibus-1];
-       mcmperBus[ibus]     = 12;
-       startRowBus[ibus]   = srbus0[ibus-1];
-       endRowBus[ibus]     = erbus0[ibus-1];
-       startColBus[ibus]   = 0;
-       endColBus[ibus]     = 47;
+      infile >> moduleno;
+      infile >> totPatchBus >> bPatchBus >> ePatchBus;
+      
+      if (totPatchBus == 0) continue;
+
+      for(Int_t i=0; i<totPatchBus; i++)
+       {
+         infile >> ibus >> totmcm >> rows >> rowe >> cols >> cole;
+         
+         moduleNo[ibus]     = moduleno;
+         mcmperBus[ibus]    = totmcm;
+         startRowBus[ibus]  = rows;
+         startColBus[ibus]  = cols;
+         endRowBus[ibus]    = rowe;
+         endColBus[ibus]    = cole;
+         
+       }
+      
     }
-       
+  
+  infile.close();
+
 }
 
 //_____________________________________________________________________________
-void AliPMDRawStream::Ddl1Mapping(Int_t moduleNo[],    Int_t mcmperBus[],
+void AliPMDRawStream::Ddl1Mapping(Int_t modulePerDDL,
+                                 Int_t moduleNo[],    Int_t mcmperBus[],
                                  Int_t startRowBus[], Int_t endRowBus[],
                                  Int_t startColBus[], Int_t endColBus[])
 {
-// DDL1 Mapping 
-
-    const Int_t ktotpbus = 36;
-    static const Int_t kmodno1[ktotpbus] = {6, 6, 6, 6, 6, 6,
-                                          7, 7, 7, 7, 7, 7,
-                                          8, 8, 8, 8, 8, 8,
-                                          9, 9, 9, 9, 9, 9,
-                                          10, 10, 10, 10, 10, 10,
-                                          11, 11, 11, 11, 11, 11};
+  // DDL1 Mapping 
 
+  Int_t moduleno, totPatchBus, bPatchBus, ePatchBus;
+  Int_t ibus, totmcm, rows, rowe, cols, cole;
 
-    static const Int_t ksrbus1[ktotpbus] = {0, 16, 32, 48, 64, 80,
-                                          0, 16, 32, 48, 64, 80,
-                                          0, 16, 32, 48, 64, 80,
-                                          0, 16, 32, 48, 64, 80,
-                                          0, 16, 32, 48, 64, 80,
-                                          0, 16, 32, 48, 64, 80};
+  TString fileName(gSystem->Getenv("ALICE_ROOT"));
+  fileName += "/PMD/PMD_Mapping_ddl1.dat";
 
+  ifstream infile;
+  infile.open(fileName.Data(), ios::in); // ascii file
+  if(!infile)
+    AliError("Could not read the mapping file for DDL No = 1");
 
-       
-    static const Int_t kerbus1[ktotpbus] = {15, 31, 47, 63, 79, 95,
-                                          15, 31, 47, 63, 79, 95,
-                                          15, 31, 47, 63, 79, 95,
-                                          15, 31, 47, 63, 79, 95,
-                                          15, 31, 47, 63, 79, 95,
-                                          15, 31, 47, 63, 79, 95};
-    
-       
-    for (Int_t ibus = 1; ibus <= ktotpbus; ibus++)
+  for (Int_t im = 0; im < modulePerDDL; im++)
     {
-       moduleNo[ibus]      = kmodno1[ibus-1];
-       mcmperBus[ibus]     = 12;
-       startRowBus[ibus]   = ksrbus1[ibus-1];
-       endRowBus[ibus]     = kerbus1[ibus-1];
-       startColBus[ibus]   = 0;
-       endColBus[ibus]     = 47;
+      infile >> moduleno;
+      infile >> totPatchBus >> bPatchBus >> ePatchBus;
+
+      if (totPatchBus == 0) continue;
+
+      for(Int_t i=0; i<totPatchBus; i++)
+       {
+         infile >> ibus >> totmcm >> rows >> rowe >> cols >> cole;
+         
+         moduleNo[ibus]     = moduleno;
+         mcmperBus[ibus]    = totmcm;
+         startRowBus[ibus]  = rows;
+         startColBus[ibus]  = cols;
+         endRowBus[ibus]    = rowe;
+         endColBus[ibus]    = cole;
+         
+       }
+      
     }
-       
+  
+  infile.close();
+
 }
 
 //_____________________________________________________________________________
-void AliPMDRawStream::Ddl2Mapping(Int_t moduleNo[],    Int_t mcmperBus[],
+void AliPMDRawStream::Ddl2Mapping(Int_t modulePerDDL,
+                                 Int_t moduleNo[],    Int_t mcmperBus[],
                                  Int_t startRowBus[], Int_t endRowBus[],
                                  Int_t startColBus[], Int_t endColBus[])
 {
-// DDL2 Mapping 
-
-    const Int_t ktotpbus = 36;
-    static const Int_t kmodno2[ktotpbus] = {12, 12, 12, 12, 12, 12,
-                                           13, 13, 13, 13, 13, 13,
-                                           14, 14, 14, 14, 14, 14,
-                                           15, 15, 15, 15, 15, 15,
-                                           16, 16, 16, 16, 16, 16,
-                                           17, 17, 17, 17, 17, 17};
-
-    static const Int_t ksrbus2[ktotpbus] = {32, 32, 16, 16, 0, 0,
-                                           32, 32, 16, 16, 0, 0,
-                                           32, 32, 16, 16, 0, 0,
-                                           32, 32, 16, 16, 0, 0,
-                                           32, 32, 16, 16, 0, 0,
-                                           32, 32, 16, 16, 0, 0};
+  // DDL2 Mapping 
 
-       
-    static const Int_t kerbus2[ktotpbus] = {47, 47, 31, 31, 15, 15,
-                                           47, 47, 31, 31, 15, 15,
-                                           47, 47, 31, 31, 15, 15,
-                                           47, 47, 31, 31, 15, 15,
-                                           47, 47, 31, 31, 15, 15,
-                                           47, 47, 31, 31, 15, 15};
-
-    static const Int_t kscbus2[ktotpbus] = {48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0};
-
-    static const Int_t kecbus2[ktotpbus] = {95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47};
+  Int_t moduleno, totPatchBus, bPatchBus, ePatchBus;
+  Int_t ibus, totmcm, rows, rowe, cols, cole;
 
 
-       
-    for (Int_t ibus = 1; ibus <= ktotpbus; ibus++)
+  TString fileName(gSystem->Getenv("ALICE_ROOT"));
+  fileName += "/PMD/PMD_Mapping_ddl2.dat";
+
+  ifstream infile;
+  infile.open(fileName.Data(), ios::in); // ascii file
+  if(!infile)
+    AliError("Could not read the mapping file for DDL No = 2");
+
+  for (Int_t im = 0; im < modulePerDDL; im++)
     {
-       moduleNo[ibus]      = kmodno2[ibus-1];
-       mcmperBus[ibus]     = 12;
-       startRowBus[ibus]   = ksrbus2[ibus-1];
-       endRowBus[ibus]     = kerbus2[ibus-1];
-       startColBus[ibus]   = kscbus2[ibus-1];
-       endColBus[ibus]     = kecbus2[ibus-1];
+      infile >> moduleno;
+      infile >> totPatchBus >> bPatchBus >> ePatchBus;
+
+      if (totPatchBus == 0) continue;
+
+      for(Int_t i=0; i<totPatchBus; i++)
+       {
+         infile >> ibus >> totmcm >> rows >> rowe >> cols >> cole;
+         
+         moduleNo[ibus]     = moduleno;
+         mcmperBus[ibus]    = totmcm;
+         startRowBus[ibus]  = rows;
+         startColBus[ibus]  = cols;
+         endRowBus[ibus]    = rowe;
+         endColBus[ibus]    = cole;
+         
+       }
+      
     }
-       
+  
+  infile.close();
+
 }
 
 //_____________________________________________________________________________
-void AliPMDRawStream::Ddl3Mapping(Int_t moduleNo[],    Int_t mcmperBus[],
+void AliPMDRawStream::Ddl3Mapping(Int_t modulePerDDL,
+                                 Int_t moduleNo[],    Int_t mcmperBus[],
                                  Int_t startRowBus[], Int_t endRowBus[],
                                  Int_t startColBus[], Int_t endColBus[])
 {
-// DDL3 Mapping 
-
-    const Int_t ktotpbus = 36;
-    static const Int_t kmodno3[ktotpbus] = {18, 18, 18, 18, 18, 18,
-                                           19, 19, 19, 19, 19, 19,
-                                           20, 20, 20, 20, 20, 20,
-                                           21, 21, 21, 21, 21, 21,
-                                           22, 22, 22, 22, 22, 22,
-                                           23, 23, 23, 23, 23, 23};
-    
+  // DDL3 Mapping 
 
+  Int_t moduleno, totPatchBus, bPatchBus, ePatchBus;
+  Int_t ibus, totmcm, rows, rowe, cols, cole;
 
-    static const Int_t ksrbus3[ktotpbus] = {32, 32, 16, 16, 0, 0,
-                                           32, 32, 16, 16, 0, 0,
-                                           32, 32, 16, 16, 0, 0,
-                                           32, 32, 16, 16, 0, 0,
-                                           32, 32, 16, 16, 0, 0,
-                                           32, 32, 16, 16, 0, 0};
-    
-       
-    static const Int_t kerbus3[ktotpbus] = {47, 47, 31, 31, 15, 15,
-                                           47, 47, 31, 31, 15, 15,
-                                           47, 47, 31, 31, 15, 15,
-                                           47, 47, 31, 31, 15, 15,
-                                           47, 47, 31, 31, 15, 15,
-                                           47, 47, 31, 31, 15, 15};
-    
-    static const Int_t kscbus3[ktotpbus] = {48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0};
-       
-    static const Int_t kecbus3[ktotpbus] = {95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47};
-    
-    for (Int_t ibus = 1; ibus <= ktotpbus; ibus++)
+  TString fileName(gSystem->Getenv("ALICE_ROOT"));
+  fileName += "/PMD/PMD_Mapping_ddl3.dat";
+
+  ifstream infile;
+  infile.open(fileName.Data(), ios::in); // ascii file
+  if(!infile)
+    AliError("Could not read the mapping file for DDL No = 3");
+
+  for (Int_t im = 0; im < modulePerDDL; im++)
     {
-       moduleNo[ibus]      = kmodno3[ibus-1];
-       mcmperBus[ibus]     = 12;
-       startRowBus[ibus]   = ksrbus3[ibus-1];
-       endRowBus[ibus]     = kerbus3[ibus-1];
-       startColBus[ibus]   = kscbus3[ibus-1];
-       endColBus[ibus]     = kecbus3[ibus-1];
+      infile >> moduleno;
+      infile >> totPatchBus >> bPatchBus >> ePatchBus;
+
+      if (totPatchBus == 0) continue;
+
+      for(Int_t i=0; i<totPatchBus; i++)
+       {
+         infile >> ibus >> totmcm >> rows >> rowe >> cols >> cole;
+         
+         moduleNo[ibus]     = moduleno;
+         mcmperBus[ibus]    = totmcm;
+         startRowBus[ibus]  = rows;
+         startColBus[ibus]  = cols;
+         endRowBus[ibus]    = rowe;
+         endColBus[ibus]    = cole;
+         
+       }
+      
     }
-       
+  
+  infile.close();
+
 }
 
 //_____________________________________________________________________________
-void AliPMDRawStream::Ddl4Mapping(Int_t moduleNo[],    Int_t mcmperBus[],
+void AliPMDRawStream::Ddl4Mapping(Int_t modulePerDDL,
+                                 Int_t moduleNo[],    Int_t mcmperBus[],
                                  Int_t startRowBus[], Int_t endRowBus[],
                                  Int_t startColBus[], Int_t endColBus[])
 {
-// DDL4 Mapping 
-
-    const Int_t ktotpbus = 42;
-    static const Int_t kmodno4[ktotpbus] = {24, 24, 24, 25, 25, 25,
-                                           26, 26, 26, 27, 27, 27,
-                                           28, 28, 28, 29, 29, 29,
-                                           42, 42, 42, 42, 43, 43, 43, 43,
-                                           44, 44, 44, 44, 45, 45, 45, 45,
-                                           46, 46, 46, 46, 47, 47, 47, 47};
-    
+  // DDL4 Mapping 
 
-    static const Int_t kmcbus4[ktotpbus] = {24, 24, 24, 24, 24, 24,
-                                           24, 24, 24, 24, 24, 24,
-                                           24, 24, 24, 24, 24, 24,
-                                           12, 12, 24, 24, 12, 12, 24, 24,
-                                           12, 12, 24, 24, 12, 12, 24, 24,
-                                           12, 12, 24, 24, 12, 12, 24, 24};
+  Int_t moduleno, totPatchBus, bPatchBus, ePatchBus;
+  Int_t ibus, totmcm, rows, rowe, cols, cole;
 
+  TString fileName(gSystem->Getenv("ALICE_ROOT"));
+  fileName += "/PMD/PMD_Mapping_ddl4.dat";
 
-    static const Int_t ksrbus4[ktotpbus] = {0, 32, 64, 0, 32, 64,
-                                           0, 32, 64, 0, 32, 64,
-                                           0, 32, 64, 0, 32, 64,
-                                           32, 32, 0, 0, 32, 32, 0, 0,
-                                           32, 32, 0, 0, 32, 32, 0, 0,
-                                           32, 32, 0, 0, 32, 32, 0, 0};
+  ifstream infile;
+  infile.open(fileName.Data(), ios::in); // ascii file
+  if(!infile)
+    AliError("Could not read the mapping file for DDL No = 4");
 
+  for (Int_t im = 0; im < modulePerDDL; im++)
+    {
+      infile >> moduleno;
+      infile >> totPatchBus >> bPatchBus >> ePatchBus;
 
+      if (totPatchBus == 0) continue;
 
-       
-    static const Int_t kerbus4[ktotpbus] = {31, 63, 95, 31, 63, 95,
-                                           31, 63, 95, 31, 63, 95,
-                                           31, 63, 95, 31, 63, 95,
-                                           47, 47, 31, 31, 47, 47, 31, 31,
-                                           47, 47, 31, 31, 47, 47, 31, 31,
-                                           47, 47, 31, 31, 47, 47, 31, 31};
-
-
-       
-    static const Int_t kscbus4[ktotpbus] = {0, 0, 0, 0, 0, 0,
-                                           0, 0, 0, 0, 0, 0,
-                                           0, 0, 0, 0, 0, 0,
-                                           48, 0, 48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0, 48, 0};
-
-
-       
-    static const Int_t kecbus4[ktotpbus] = {47, 47, 47, 47, 47, 47,
-                                           47, 47, 47, 47, 47, 47,
-                                           47, 47, 47, 47, 47, 47,
-                                           95, 47, 95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47, 95, 47};
-
-       
-    for (Int_t ibus = 1; ibus <= ktotpbus; ibus++)
-    {
-       moduleNo[ibus]      = kmodno4[ibus-1];
-       mcmperBus[ibus]     = kmcbus4[ibus-1];
-       startRowBus[ibus]   = ksrbus4[ibus-1];
-       endRowBus[ibus]     = kerbus4[ibus-1];
-       startColBus[ibus]   = kscbus4[ibus-1];
-       endColBus[ibus]     = kecbus4[ibus-1];
+      for(Int_t i=0; i<totPatchBus; i++)
+       {
+         infile >> ibus >> totmcm >> rows >> rowe >> cols >> cole;
+         
+         moduleNo[ibus]     = moduleno;
+         mcmperBus[ibus]    = totmcm;
+         startRowBus[ibus]  = rows;
+         startColBus[ibus]  = cols;
+         endRowBus[ibus]    = rowe;
+         endColBus[ibus]    = cole;
+         
+       }
+      
     }
+  
+  infile.close();
        
 }
 
 //_____________________________________________________________________________
-void AliPMDRawStream::Ddl5Mapping(Int_t moduleNo[],    Int_t mcmperBus[],
+void AliPMDRawStream::Ddl5Mapping(Int_t modulePerDDL,
+                                 Int_t moduleNo[],    Int_t mcmperBus[],
                                  Int_t startRowBus[], Int_t endRowBus[],
                                  Int_t startColBus[], Int_t endColBus[])
 {
-// DDL5 Mapping 
-
-    const Int_t ktotpbus = 42;
-    static const Int_t kmodno5[ktotpbus] = {30, 30, 30, 31, 31, 31,
-                                           32, 32, 32, 33, 33, 33,
-                                           34, 34, 34, 35, 35, 35,
-                                           36, 36, 36, 36, 37, 37, 37, 37,
-                                           38, 38, 38, 38, 39, 39, 39, 39,
-                                           40, 40, 40, 40, 41, 41, 41, 41};
+  // DDL5 Mapping 
 
+  Int_t moduleno, totPatchBus, bPatchBus, ePatchBus;
+  Int_t ibus, totmcm, rows, rowe, cols, cole;
 
-    static const Int_t kmcbus5[ktotpbus] = {24, 24, 24, 24, 24, 24,
-                                           24, 24, 24, 24, 24, 24,
-                                           24, 24, 24, 24, 24, 24,
-                                           12, 12, 24, 24, 12, 12, 24, 24,
-                                           12, 12, 24, 24, 12, 12, 24, 24,
-                                           12, 12, 24, 24, 12, 12, 24, 24};
-                                           
 
+  TString fileName(gSystem->Getenv("ALICE_ROOT"));
+  fileName += "/PMD/PMD_Mapping_ddl5.dat";
 
-    static const Int_t ksrbus5[ktotpbus] = {0, 32, 64, 0, 32, 64,
-                                           0, 32, 64, 0, 32, 64,
-                                           0, 32, 64, 0, 32, 64,
-                                           32, 32, 0, 0, 32, 32, 0, 0,
-                                           32, 32, 0, 0, 32, 32, 0, 0,
-                                           32, 32, 0, 0, 32, 32, 0, 0};
-
-
-
-       
-    static const Int_t kerbus5[ktotpbus] = {31, 63, 95, 31, 63, 95,
-                                           31, 63, 95, 31, 63, 95,
-                                           31, 63, 95, 31, 63, 95,
-                                           47, 47, 31, 31, 47, 47, 31, 31,
-                                           47, 47, 31, 31, 47, 47, 31, 31,
-                                           47, 47, 31, 31, 47, 47, 31, 31};
-
+  ifstream infile;
+  infile.open(fileName.Data(), ios::in); // ascii file
+  if(!infile)
+    AliError("Could not read the mapping file for DDL No = 5");
 
-       
-    static const Int_t kscbus5[ktotpbus] = {0, 0, 0, 0, 0, 0,
-                                           0, 0, 0, 0, 0, 0,
-                                           0, 0, 0, 0, 0, 0,
-                                           48, 0, 48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0, 48, 0,
-                                           48, 0, 48, 0, 48, 0, 48, 0};
+  for (Int_t im = 0; im < modulePerDDL; im++)
+    {
+      infile >> moduleno;
+      infile >> totPatchBus >> bPatchBus >> ePatchBus;
 
+      if (totPatchBus == 0) continue;
 
-       
-    static const Int_t kecbus5[ktotpbus] = {47, 47, 47, 47, 47, 47,
-                                           47, 47, 47, 47, 47, 47,
-                                           47, 47, 47, 47, 47, 47,
-                                           95, 47, 95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47, 95, 47,
-                                           95, 47, 95, 47, 95, 47, 95, 47};
-
-       
-    for (Int_t ibus = 1; ibus <= ktotpbus; ibus++)
-    {
-       moduleNo[ibus]      = kmodno5[ibus-1];
-       mcmperBus[ibus]     = kmcbus5[ibus-1];
-       startRowBus[ibus]   = ksrbus5[ibus-1];
-       endRowBus[ibus]     = kerbus5[ibus-1];
-       startColBus[ibus]   = kscbus5[ibus-1];
-       endColBus[ibus]     = kecbus5[ibus-1];
+      for(Int_t i=0; i<totPatchBus; i++)
+       {
+         infile >> ibus >> totmcm >> rows >> rowe >> cols >> cole;
+         
+         moduleNo[ibus]     = moduleno;
+         mcmperBus[ibus]    = totmcm;
+         startRowBus[ibus]  = rows;
+         startColBus[ibus]  = cols;
+         endRowBus[ibus]    = rowe;
+         endColBus[ibus]    = cole;
+         
+       }
+      
     }
+  
+  infile.close();
        
 }
 
index af3c2a9..83213eb 100644 (file)
@@ -35,7 +35,7 @@ class AliPMDRawStream: public TObject {
     AliPMDRawStream(const AliPMDRawStream& stream);
     AliPMDRawStream& operator = (const AliPMDRawStream& stream);
 
-    void             GetRowCol(Int_t ddlno, Int_t smn, Int_t pbusid, 
+    void             GetRowCol(Int_t imodule, Int_t pbusid, 
                               UInt_t mcmno, UInt_t chno,
                               Int_t startRowBus[], Int_t endRowBus[],
                               Int_t startColBus[], Int_t endColBus[],
@@ -45,22 +45,28 @@ class AliPMDRawStream: public TObject {
     void             TransformH2S(Int_t smn, Int_t &row, Int_t &col) const;
     Int_t            ComputeParity(UInt_t data1);
     UInt_t           GetNextWord();
-    void             Ddl0Mapping(Int_t moduleNo[],    Int_t mcmperBus[],
+    void             Ddl0Mapping(Int_t modulePerDDL,
+                                Int_t moduleNo[],    Int_t mcmperBus[],
                                 Int_t startRowBus[], Int_t endRowBus[],
                                 Int_t startColBus[], Int_t endColBus[]);
-    void             Ddl1Mapping(Int_t moduleNo[],    Int_t mcmperBus[],
+    void             Ddl1Mapping(Int_t modulePerDDL,
+                                Int_t moduleNo[],    Int_t mcmperBus[],
                                 Int_t startRowBus[], Int_t endRowBus[],
                                 Int_t startColBus[], Int_t endColBus[]);
-    void             Ddl2Mapping(Int_t moduleNo[],    Int_t mcmperBus[],
+    void             Ddl2Mapping(Int_t modulePerDDL,
+                                Int_t moduleNo[],    Int_t mcmperBus[],
                                 Int_t startRowBus[], Int_t endRowBus[],
                                 Int_t startColBus[], Int_t endColBus[]);
-    void             Ddl3Mapping(Int_t moduleNo[],    Int_t mcmperBus[],
+    void             Ddl3Mapping(Int_t modulePerDDL,
+                                Int_t moduleNo[],    Int_t mcmperBus[],
                                 Int_t startRowBus[], Int_t endRowBus[],
                                 Int_t startColBus[], Int_t endColBus[]);
-    void             Ddl4Mapping(Int_t moduleNo[],    Int_t mcmperBus[],
+    void             Ddl4Mapping(Int_t modulePerDDL,
+                                Int_t moduleNo[],    Int_t mcmperBus[],
                                 Int_t startRowBus[], Int_t endRowBus[],
                                 Int_t startColBus[], Int_t endColBus[]);
-    void             Ddl5Mapping(Int_t moduleNo[],    Int_t mcmperBus[],
+    void             Ddl5Mapping(Int_t modulePerDDL,
+                                Int_t moduleNo[],    Int_t mcmperBus[],
                                 Int_t startRowBus[], Int_t endRowBus[],
                                 Int_t startColBus[], Int_t endColBus[]);
 
@@ -68,7 +74,7 @@ class AliPMDRawStream: public TObject {
     UChar_t*         fData;         // pointer to the data
     Int_t            fPosition;
 
-    ClassDef(AliPMDRawStream, 6)    // class for reading PMD raw digits
+    ClassDef(AliPMDRawStream, 7)    // class for reading PMD raw digits
 };
 
 #endif
diff --git a/PMD/PMD_ddl_info.dat b/PMD/PMD_ddl_info.dat
new file mode 100644 (file)
index 0000000..c1341c0
--- /dev/null
@@ -0,0 +1,54 @@
+0 6
+0
+1
+2
+3
+4
+5
+1 6
+6
+7
+8
+9
+10
+11
+2 6
+12
+13
+14
+15
+16
+17
+3 6
+18
+19
+20
+21
+22
+23
+4 12
+24
+25
+26
+27
+28
+29
+42
+43
+44
+45
+46
+47
+5 12
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
diff --git a/PMD/PMD_removed_chains.dat b/PMD/PMD_removed_chains.dat
new file mode 100644 (file)
index 0000000..70bb81f
--- /dev/null
@@ -0,0 +1,48 @@
+0 0 99 99 99 99 99 99 99 99
+0 1 99 99 99 99 99 99 99 99
+0 2 99 99 99 99 99 99 99 99
+0 3 99 99 99 99 99 99 99 99
+0 4 99 99 99 99 99 99 99 99
+0 5 99 99 99 99 99 99 99 99
+0 6 99 99 99 99 99 99 99 99
+0 7 99 99 99 99 99 99 99 99
+0 8 99 99 99 99 99 99 99 99
+0 9 99 99 99 99 99 99 99 99
+0 10 99 99 99 99 99 99 99 99
+0 11 99 99 99 99 99 99 99 99
+0 12 99 99 99 99 99 99 99 99
+0 13 99 99 99 99 99 99 99 99
+0 14 99 99 99 99 99 99 99 99
+0 15 99 99 99 99 99 99 99 99
+0 16 99 99 99 99 99 99 99 99
+0 17 99 99 99 99 99 99 99 99
+0 18 99 99 99 99 99 99 99 99
+0 19 99 99 99 99 99 99 99 99
+0 20 99 99 99 99 99 99 99 99
+0 21 99 99 99 99 99 99 99 99
+0 22 99 99 99 99 99 99 99 99
+0 23 99 99 99 99 99 99 99 99
+1 0 99 99 99 99 99 99 99 99
+1 1 99 99 99 99 99 99 99 99
+1 2 99 99 99 99 99 99 99 99
+1 3 99 99 99 99 99 99 99 99
+1 4 99 99 99 99 99 99 99 99
+1 5 99 99 99 99 99 99 99 99
+1 6 99 99 99 99 99 99 99 99
+1 7 99 99 99 99 99 99 99 99
+1 8 99 99 99 99 99 99 99 99
+1 9 99 99 99 99 99 99 99 99
+1 10 99 99 99 99 99 99 99 99
+1 11 99 99 99 99 99 99 99 99
+1 12 99 99 99 99 99 99 99 99
+1 13 99 99 99 99 99 99 99 99
+1 14 99 99 99 99 99 99 99 99
+1 15 99 99 99 99 99 99 99 99
+1 16 99 99 99 99 99 99 99 99
+1 17 99 99 99 99 99 99 99 99
+1 18 99 99 99 99 99 99 99 99
+1 19 99 99 99 99 99 99 99 99
+1 20 99 99 99 99 99 99 99 99
+1 21 99 99 99 99 99 99 99 99
+1 22 99 99 99 99 99 99 99 99
+1 23 99 99 99 99 99 99 99 99