]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/mapping/AliMpTriggerReader.cxx
Updates from David Rohr to add checks for fakes and clones and several bugfixes
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpTriggerReader.cxx
index 070ddd01c2aece9d3f45a59dd1bb32c654dfc8bc..25d7a4fa84a6830198c4605667c42b60223c78a6 100644 (file)
 // $MpId: AliMpTriggerReader.cxx,v 1.4 2006/05/24 13:58:52 ivana Exp $
 
 #include "AliMpTriggerReader.h"
-#include "AliMpMotifReader.h"
+
+#include "AliLog.h"
+#include "AliMpConstants.h"
+#include "AliMpDataStreams.h"
 #include "AliMpFiles.h"
+#include "AliMpHelper.h"
+#include "AliMpMotif.h"
+#include "AliMpMotifPosition.h"
+#include "AliMpMotifReader.h"
+#include "AliMpMotifSpecial.h"
 #include "AliMpMotifType.h"
 #include "AliMpPCB.h"
 #include "AliMpSlat.h"
 #include "AliMpSlatMotifMap.h"
-#include "AliMpMotifSpecial.h"
-#include "AliMpMotifPosition.h"
-#include "AliMpMotif.h"
-#include "AliMpHelper.h"
+#include "AliMpSlatMotifMap.h"
 #include "AliMpSt345Reader.h"
 #include "AliMpTrigger.h"
-#include "AliMpConstants.h"
-
-#include "AliLog.h"
-
 #include "Riostream.h"
 #include "TClass.h"
-#include "TObjString.h"
 #include "TList.h"
+#include "TObjString.h"
 #include "TString.h"
 #include <TArrayI.h>
+#include <cstdlib>
 #include <sstream>
 
 //-----------------------------------------------------------------------------
 ClassImp(AliMpTriggerReader)
 /// \endcond
 
-const TString AliMpTriggerReader::fgkKeywordLayer("LAYER");
-const TString AliMpTriggerReader::fgkKeywordScale("SCALE");
-const TString AliMpTriggerReader::fgkKeywordPcb("PCB");  
-const TString AliMpTriggerReader::fgkKeywordFlipX("FLIP_X");
-const TString AliMpTriggerReader::fgkKeywordFlipY("FLIP_Y");
+//
+// static private methods
+//
+
+//_____________________________________________________________________________
+const TString& AliMpTriggerReader::GetKeywordLayer()
+{
+  /// Keyword: LAYER
+  static const TString kKeywordLayer("LAYER");
+  return kKeywordLayer;
+}  
+
+//_____________________________________________________________________________
+const TString& AliMpTriggerReader::GetKeywordScale()
+{
+  /// Keyword: SCALE
+  static const TString kKeywordScale("SCALE");
+  return kKeywordScale;
+}
 
 //_____________________________________________________________________________
-AliMpTriggerReader::AliMpTriggerReader(AliMpSlatMotifMap& motifMap) 
+const TString& AliMpTriggerReader::GetKeywordPcb()
+{
+  /// Keyword : PCB
+  static const TString kKeywordPcb("PCB");  
+  return kKeywordPcb;
+}    
+  
+//_____________________________________________________________________________
+const TString& AliMpTriggerReader::GetKeywordFlipX()
+{
+  /// Keyword : FLIPX
+  static const TString kKeywordFlipX("FLIP_X");
+  return kKeywordFlipX;
+}  
+  
+//_____________________________________________________________________________
+const TString& AliMpTriggerReader::GetKeywordFlipY()
+{
+  /// Keyword : FLIPY
+  static const TString kKeywordFlipY("FLIP_Y");
+  return kKeywordFlipY;
+}  
+
+//
+// ctors, dtor
+//
+
+//_____________________________________________________________________________
+AliMpTriggerReader::AliMpTriggerReader(const AliMpDataStreams& dataStreams, AliMpSlatMotifMap* motifMap) 
 : TObject(),
+  fkDataStreams(dataStreams),
   fMotifMap(motifMap),
   fLocalBoardMap()
 {
@@ -112,7 +157,7 @@ AliMpTriggerReader::BuildSlat(const char* slatName,
     
     TString& keyword = ((TObjString*)tokens->At(0))->String();
     
-    if ( keyword == fgkKeywordPcb )
+    if ( keyword == GetKeywordPcb() )
     {
       if ( tokens->GetEntriesFast() != 3 )
       {
@@ -199,7 +244,7 @@ AliMpTriggerReader::GetBoardNameFromPCBLine(const TString& s)
   
   TString& keyword = ((TObjString*)tokens->At(0))->String();
 
-  if ( keyword == fgkKeywordPcb &&
+  if ( keyword == GetKeywordPcb() &&
        tokens->GetEntriesFast() == 3 )
   {
     boardName = ((TObjString*)tokens->At(2))->String();
@@ -264,7 +309,7 @@ AliMpTriggerReader::FlipLines(TList& lines, Bool_t flipX, Bool_t flipY,
         
         TString& s = oline->String();
         
-        if ( !s.Contains(fgkKeywordPcb) )
+        if ( !s.Contains(GetKeywordPcb()) )
         {
           // Only consider PCB lines.
           continue;
@@ -334,11 +379,11 @@ AliMpTriggerReader::FlipLines(TList& lines, Bool_t flipX, Bool_t flipY,
 
 //___________________________________________________________________________
 Int_t
-AliMpTriggerReader::IsLayerLine(const TString& sline)
+AliMpTriggerReader::IsLayerLine(const TString& sline) const
 {
   /// Whether sline contains LAYER keyword
 
-  if ( sline.BeginsWith(fgkKeywordLayer) )
+  if ( sline.BeginsWith(GetKeywordLayer()) )
   {
     return 1;
   }
@@ -361,10 +406,10 @@ AliMpTriggerReader::DecodeFlipLine(const TString& sline,
   
   TString keyword(sline(0,blankPos));
   
-  if ( keyword == fgkKeywordFlipX )
+  if ( keyword == GetKeywordFlipX() )
   {
     flipX = kTRUE;
-  } else if ( keyword == fgkKeywordFlipY )
+  } else if ( keyword == GetKeywordFlipY() )
   {
     flipY = kTRUE;
   }
@@ -384,10 +429,10 @@ AliMpTriggerReader::DecodeScaleLine(const TString& sline,
 {
   /// Decode sline containing SCALE keyword
 
-  if ( sline(0,fgkKeywordScale.Length()) == fgkKeywordScale )
+  if ( sline(0,GetKeywordScale().Length()) == GetKeywordScale() )
   {
-    TString tmp(sline(fgkKeywordScale.Length()+1,
-                      sline.Length()-fgkKeywordScale.Length()-1));
+    TString tmp(sline(GetKeywordScale().Length()+1,
+                      sline.Length()-GetKeywordScale().Length()-1));
     Ssiz_t blankPos = tmp.First(' ');
     if ( blankPos < 0 )
     {
@@ -464,13 +509,10 @@ AliMpTriggerReader::ReadLines(const char* slatType,
                        " destLine %d\n",slatType,scale,flipX,flipY,
                        srcLine,destLine));
   
-  TString filename(AliMpFiles::SlatFilePath(AliMp::kStationTrigger,slatType,
-                                            planeType).Data());
-  std::ifstream in(filename.Data());
-  if (!in.good()) 
-  {
-    AliErrorClass(Form("Cannot read slat from %s",filename.Data()));
-  }
+  istream& in 
+    = fkDataStreams.
+        CreateDataStream(AliMpFiles::SlatFilePath(
+                             AliMp::kStationTrigger,slatType, planeType));
   
   char line[80];
   
@@ -481,11 +523,11 @@ AliMpTriggerReader::ReadLines(const char* slatType,
     if ( sline.Length() == 0 || sline[0] == '#' ) continue;
     
     Bool_t isKeywordThere = 
-      sline.Contains(fgkKeywordPcb) || 
-      sline.Contains(fgkKeywordLayer) ||
-      sline.Contains(fgkKeywordScale) || 
-      sline.Contains(fgkKeywordFlipX) || 
-      sline.Contains(fgkKeywordFlipY);
+      sline.Contains(GetKeywordPcb()) || 
+      sline.Contains(GetKeywordLayer()) ||
+      sline.Contains(GetKeywordScale()) || 
+      sline.Contains(GetKeywordFlipX()) || 
+      sline.Contains(GetKeywordFlipY());
     
     if ( !isKeywordThere ) 
     {
@@ -503,7 +545,7 @@ AliMpTriggerReader::ReadLines(const char* slatType,
 
     if ( isScaleLine < 0 )
     {
-      AliFatalClass(Form("Syntax error near %s keyword\n",fgkKeywordScale.Data()));
+      AliFatalClass(Form("Syntax error near %s keyword\n",GetKeywordScale().Data()));
     }
     else if ( isScaleLine > 0 && slatType2 != slatType )
     {
@@ -532,7 +574,7 @@ AliMpTriggerReader::ReadLines(const char* slatType,
     }
   }
   
-  in.close();
+  delete &in;
 }
                                         
 //_____________________________________________________________________________
@@ -541,55 +583,51 @@ AliMpTriggerReader::ReadLocalBoardMapping()
 {
   /// Reads the file that contains the mapping local board name <-> number
 
-  TString filename(AliMpFiles::LocalTriggerBoardMapping());
-  
-  AliDebugClass(2,Form("Reading from %s\n",filename.Data()));
-
   fLocalBoardMap.DeleteAll();
   
   UShort_t mask;
   
-  ifstream in(filename.Data());
-  if (!in.good())
-  {
-    AliErrorClass(Form("Cannot read file %s\n",filename.Data()));    
-  }
-  else
+  istream& in 
+    = fkDataStreams.
+        CreateDataStream(AliMpFiles::LocalTriggerBoardMapping());
+
+  char line[80];
+  Char_t localBoardName[20];
+  Int_t j,localBoardId;
+  UInt_t switches;
+  Int_t nofBoards;
+
+  while (!in.eof())
   {
-    char line[80];
-    Char_t localBoardName[20];
-    Int_t j,localBoardId;
-    UInt_t switches;
-    
-    while (!in.eof())
-    {
-      for (Int_t i = 0; i < 4; ++i)
-        if (!in.getline(line,80)) continue; //skip 4 first lines
+    for (Int_t i = 0; i < 4; ++i)
+      if (!in.getline(line,80)) continue; //skip 4 first lines
  
-      // read mask
-      if (!in.getline(line,80)) break;
-      sscanf(line,"%hx",&mask);
-      
-      for ( Int_t i = 0; i < 16; ++i ) 
-      {      
-        if ( (mask >> i ) & 0x1 )
-        {
-          if (!in.getline(line,80)) break; 
-          sscanf(line,"%02d %s %03d %03x", &j, localBoardName, &localBoardId, &switches);
-          if (localBoardId <= AliMpConstants::NofLocalBoards()) 
-          {
-            fLocalBoardMap.Add(new TObjString(localBoardName), new TObjString(Form("%d",localBoardId)));
-            AliDebugClass(10,Form("Board %s has number %d\n", localBoardName, localBoardId));
-          }
-          // skip 2 following lines
-          if (!in.getline(line,80)) break; 
-          if (!in.getline(line,80)) break; 
-         }
+    // read mask
+    if (!in.getline(line,80)) break;
+    sscanf(line,"%hx",&mask);
+   // read # boards
+    if (!in.getline(line,80)) break;
+    sscanf(line,"%d",&nofBoards);
+   
+    for ( Int_t i = 0; i < nofBoards; ++i ) 
+    {      
+  
+      if (!in.getline(line,80)) break; 
+      sscanf(line,"%02d %19s %03d %03x", &j, localBoardName, &localBoardId, &switches);
+      if (localBoardId <= AliMpConstants::NofLocalBoards()) 
+      {
+       fLocalBoardMap.Add(new TObjString(localBoardName), new TObjString(Form("%d",localBoardId)));
+       AliDebugClass(10,Form("Board %s has number %d\n", localBoardName, localBoardId));
       }
-    }      
+      // skip 2 following lines
+      if (!in.getline(line,80)) break; 
+      if (!in.getline(line,80)) break; 
+       
+    }
   }
-
-  in.close();
+  
+  delete &in;      
 }
 
 //_____________________________________________________________________________
@@ -614,14 +652,13 @@ AliMpTriggerReader::ReadPCB(const char* pcbType)
     pcbName = pcbName(0,pos);
   }
   
-  std::ifstream in(AliMpFiles::SlatPCBFilePath(AliMp::kStationTrigger,pcbName).Data());
-  if (!in.good()) 
-  {
-    AliErrorClass(Form("Cannot open file for PCB %s",pcbName.Data()));
-    return 0;
-  }
+  istream& in 
+    = fkDataStreams.
+        CreateDataStream(AliMpFiles::SlatPCBFilePath(
+                             AliMp::kStationTrigger,pcbName));
  
-  AliMpMotifReader reader(AliMp::kStationTrigger,AliMp::kNonBendingPlane); 
+  AliMpMotifReader reader(fkDataStreams,
+                          AliMp::kStationTrigger, AliMq::kNotSt12, AliMp::kNonBendingPlane); 
   // note that the nonbending
   // parameter is of no use for trigger, as far as reading motif is 
   // concerned, as all motifs are supposed to be in the same directory
@@ -654,7 +691,7 @@ AliMpTriggerReader::ReadPCB(const char* pcbType)
       {
         AliError("pcb not null as expected");
       }
-      pcb = new AliMpPCB(&fMotifMap,pcbType,padSizeX*scale,padSizeY*scale,
+      pcb = new AliMpPCB(fMotifMap,pcbType,padSizeX*scale,padSizeY*scale,
                          pcbSizeX*scale,pcbSizeY*scale);
     }
     
@@ -669,18 +706,18 @@ AliMpTriggerReader::ReadPCB(const char* pcbType)
       TString id = reader.MotifSpecialName(sMotifSpecial,scale);
       
       AliMpMotifSpecial* specialMotif =
-        dynamic_cast<AliMpMotifSpecial*>(fMotifMap.FindMotif(id));
+        dynamic_cast<AliMpMotifSpecial*>(fMotifMap->FindMotif(id));
       if (!specialMotif)
       {
         AliDebug(1,Form("Reading motifSpecial %s (%s) from file",
                         sMotifSpecial.Data(),id.Data()));
-        AliMpMotifType* motifType = fMotifMap.FindMotifType(sMotifType.Data());
+        AliMpMotifType* motifType = fMotifMap->FindMotifType(sMotifType.Data());
         if ( !motifType)
         {
           AliDebug(1,Form("Reading motifType %s (%s) from file",
                           sMotifType.Data(),id.Data()));
           motifType = reader.BuildMotifType(sMotifType.Data());
-          fMotifMap.AddMotifType(motifType);
+          fMotifMap->AddMotifType(motifType);
         }
         else
         {
@@ -688,7 +725,7 @@ AliMpTriggerReader::ReadPCB(const char* pcbType)
                           sMotifType.Data(),id.Data()));        
         }
         specialMotif = reader.BuildMotifSpecial(sMotifSpecial,motifType,scale);
-        fMotifMap.AddMotif(specialMotif);
+        fMotifMap->AddMotif(specialMotif);
       }
       else
       {
@@ -710,23 +747,28 @@ AliMpTriggerReader::ReadPCB(const char* pcbType)
       int iy;
       sin >> sMotifType >> ix >> iy;
       
-      AliMpMotifType* motifType = fMotifMap.FindMotifType(sMotifType.Data());
+      AliMpMotifType* motifType = fMotifMap->FindMotifType(sMotifType.Data());
       if ( !motifType)
       {
         AliDebug(1,Form("Reading motifType %s from file",sMotifType.Data()));
         motifType = reader.BuildMotifType(sMotifType.Data());
-        fMotifMap.AddMotifType(motifType);
+        fMotifMap->AddMotifType(motifType);
       }
       else
       {
         AliDebug(1,Form("Got motifType %s from motifMap",sMotifType.Data()));        
       }
       
+      if (! pcb)
+      {
+        AliError("pcb null");
+        continue;
+      }
       pcb->Add(motifType,ix,iy);
     }
   }
   
-  in.close();
+  delete &in;
   
   return pcb;
 }
@@ -758,7 +800,7 @@ AliMpTriggerReader::ReadSlat(const char* slatType, AliMp::PlaneType planeType)
   if ( !IsLayerLine(firstLine) ) 
   {
     std::ostringstream s;
-    s << fgkKeywordLayer;
+    s << GetKeywordLayer();
     lines.AddFirst(new TObjString(s.str().c_str()));
   }
   
@@ -794,12 +836,12 @@ AliMpTriggerReader::ReadSlat(const char* slatType, AliMp::PlaneType planeType)
 
   AliMpTrigger* triggerSlat = new AliMpTrigger(slatType, planeType);
     
-  for ( Int_t ilayer = 0; ilayer < layers.GetEntriesFast(); ++ilayer )
+  for ( ilayer = 0; ilayer < layers.GetEntriesFast(); ++ilayer )
   {
-    TList& lines = *((TList*)layers.At(ilayer));
+    TList& lines1 = *((TList*)layers.At(ilayer));
     std::ostringstream slatName;
     slatName << slatType << "-LAYER" << ilayer;
-    AliMpSlat* slat = BuildSlat(slatName.str().c_str(),planeType,lines,scale);
+    AliMpSlat* slat = BuildSlat(slatName.str().c_str(),planeType,lines1,scale);
     if ( slat )
     {
       Bool_t ok = triggerSlat->AdoptLayer(slat);
@@ -821,17 +863,17 @@ AliMpTriggerReader::ReadSlat(const char* slatType, AliMp::PlaneType planeType)
         AliError("TriggerSlat is=");
         for ( Int_t j = 0; j < triggerSlat->GetSize(); ++j )
         {
-          AliMpSlat* slat = triggerSlat->GetLayer(j);
+          AliMpSlat* slat1 = triggerSlat->GetLayer(j);
           AliError(Form("Layer %d",j));
-          for ( Int_t i = 0; i < slat->GetSize(); ++i )
+          for ( Int_t i = 0; i < slat1->GetSize(); ++i )
           {
-            AliMpPCB* pcb = slat->GetPCB(i);
+            AliMpPCB* pcb = slat1->GetPCB(i);
             AliError(Form("ERR pcb %d size %e,%e (unscaled is %e,%e)",
                           i,pcb->DX()*2,pcb->DY()*2,
                           pcb->DX()*2/scale,pcb->DY()*2/scale));
           }
         } 
-        StdoutToAliError(fMotifMap.Print(););
+        StdoutToAliError(fMotifMap->Print(););
       }
     }
     else