- added configuration handler for TRAP configuration (Uwe)
authorcblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 1 Jul 2010 14:02:00 +0000 (14:02 +0000)
committercblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 1 Jul 2010 14:02:00 +0000 (14:02 +0000)
  contains the parameter calculation of tracklet parameters
  as on the DCS board (e.g. deflection correction)
- bugfixes (catch unconfigured PID LUT, corrected array declaration)

TRD/AliTRDfeeParam.cxx
TRD/AliTRDmcmSim.cxx
TRD/AliTRDmcmSim.h
TRD/AliTRDtrapConfig.cxx
TRD/AliTRDtrapConfig.h
TRD/AliTRDtrapConfigHandler.cxx [new file with mode: 0644]
TRD/AliTRDtrapConfigHandler.h [new file with mode: 0644]
TRD/TRDbaseLinkDef.h
TRD/libTRDbase.pkg

index 06d4a66..61558d2 100644 (file)
@@ -401,12 +401,12 @@ Short_t AliTRDfeeParam::ChipmaskToMCMlist( UInt_t cmA, UInt_t cmB, UShort_t link
   
   Short_t nmcm = 0;
   Short_t i;
-  for( i = 0 ; i < listSize ; i++ ) {
-     if( (cmA & (1 << i)) != 0 ) {
+  for( i = 0 ; i < 18 ; i++ ) {  // 18: number of MCMs on a ROB
+     if( (cmA & (1 << i)) != 0 && nmcm<listSize) {
         mcmList[nmcm] = ((linkpair*2) << 7) | i;
        ++nmcm;
     }
-    if( (cmB & (1 << i)) != 0 ) {
+    if( (cmB & (1 << i)) != 0  && nmcm<listSize) {
        mcmList[nmcm] = ((linkpair*2+1) << 7) | i;
        ++nmcm;
     }
index 952c979..784fc17 100644 (file)
@@ -469,7 +469,7 @@ void AliTRDmcmSim::Draw(Option_t* const option)
       AliTRDtrackletMCM *trkl = (AliTRDtrackletMCM*) (*fTrackletArray)[iTrkl];
       Float_t padWidth = 0.635 + 0.03 * (fDetector % 6);
       Float_t offset   = padWidth/256. * ((((((fRobPos & 0x1) << 2) + (fMcmPos & 0x3)) * 18) << 8) - ((18*4*2 - 18*2 - 3) << 7)); // revert adding offset in FitTracklet
-      Int_t   ndrift   = fTrapConfig->GetDmemUnsigned(0xc025, fDetector, fRobPos, fMcmPos) >> 5; 
+      Int_t   ndrift   = fTrapConfig->GetDmemUnsigned(AliTRDtrapConfig::fgkDmemAddrNdrift, fDetector, fRobPos, fMcmPos) >> 5;
       Float_t slope    = trkl->GetdY() * 140e-4 / ndrift; 
 
       Int_t t0 = fTrapConfig->GetTrapReg(AliTRDtrapConfig::kTPFS);
@@ -1194,7 +1194,7 @@ void AliTRDmcmSim::CalcFitreg()
   
   UShort_t timebin, adcch, adcLeft, adcCentral, adcRight, hitQual, timebin1, timebin2, qtotTemp;
   Short_t ypos, fromLeft, fromRight, found;
-  UShort_t qTotal[19]; // the last is dummy
+  UShort_t qTotal[19+1]; // the last is dummy
   UShort_t marked[6], qMarked[6], worse1, worse2;
   
   timebin1 = fTrapConfig->GetTrapReg(AliTRDtrapConfig::kTPFS); 
@@ -1860,13 +1860,16 @@ Int_t AliTRDmcmSim::GetPID(Int_t q0, Int_t q1)
 
    UInt_t nBinsQ0 = fTrapConfig->GetDmemUnsigned(AliTRDtrapConfig::fgkDmemAddrLUTnbins);  // number of bins in q0 / 4 !!
    UInt_t pidTotalSize = fTrapConfig->GetDmemUnsigned(AliTRDtrapConfig::fgkDmemAddrLUTLength);
+   if(nBinsQ0==0 || pidTotalSize==0)  // make sure we don't run into trouble if one of the values is not configured
+      return 0;
 
    ULong_t corrQ0 = fTrapConfig->GetDmemUnsigned(AliTRDtrapConfig::fgkDmemAddrLUTcor0, fDetector, fRobPos, fMcmPos);
    ULong_t corrQ1 = fTrapConfig->GetDmemUnsigned(AliTRDtrapConfig::fgkDmemAddrLUTcor1, fDetector, fRobPos, fMcmPos);
+   if(corrQ0==0 || corrQ1==0)  // make sure we don't run into trouble if one of the values is not configured
+      return 0;
 
    addrQ0 = corrQ0;
    addrQ0 = (((addrQ0*q0)>>16)>>16); // because addrQ0 = (q0 * corrQ0) >> 32; does not work for unknown reasons
-   //   std::cout << "addrQ0: " << addrQ0 << ", q0: " << q0 << ", corrQ0: " << corrQ0 << std::endl;
 
    if(addrQ0 >= nBinsQ0) {  // check for overflow
       AliDebug(5,Form("Overflow in q0: %i/4 is bigger then %i", addrQ0, nBinsQ0));
@@ -1876,7 +1879,6 @@ Int_t AliTRDmcmSim::GetPID(Int_t q0, Int_t q1)
    addr = corrQ1;
    addr = (((addr*q1)>>16)>>16);
    addr = addrQ0 + nBinsQ0*addr; // because addr = addrQ0 + nBinsQ0* (((corrQ1*q1)>>32); does not work
-   //   std::cout << "addr: " <<  addr << ", q1: " << q1 << ", corrQ1: " << corrQ1 << std::endl;
 
    if(addr >= pidTotalSize) {
       AliDebug(5,Form("Overflow in q1. Address %i/4 is bigger then %i", addr, pidTotalSize));
@@ -1891,81 +1893,6 @@ Int_t AliTRDmcmSim::GetPID(Int_t q0, Int_t q1)
 
 
 
-void AliTRDmcmSim::SetPIDLut(TH2F * const lut)
-{
-  // set a user-defined PID LUT from a 2D histogram
-
-   UInt_t nBinsQ0 = lut->GetNbinsX();
-   UInt_t nBinsQ1 = lut->GetNbinsY();
-
-   Double_t scaleQ0 = lut->GetNbinsX() / lut->GetXaxis()->GetXmax();
-   Double_t scaleQ1 = lut->GetNbinsY() / lut->GetYaxis()->GetXmax();
-   fTrapConfig->SetPIDscale(scaleQ0, scaleQ1);
-   SetPIDLutScaleDMEM();
-      
-   UInt_t fPIDsizeX = 0;
-   if(nBinsQ0%4==0)
-      fPIDsizeX=nBinsQ0/4;
-   else
-      fPIDsizeX = (nBinsQ0/4)+1;
-
-   fTrapConfig->SetDmem(AliTRDtrapConfig::fgkDmemAddrLUTnbins, nBinsQ0); // number of bins in q0
-   fTrapConfig->SetDmem(AliTRDtrapConfig::fgkDmemAddrLUTLength, nBinsQ0*nBinsQ1);  // total size of the table in BYTES (does work because each bin is 8 bit wide)
-
-   UInt_t buffer;
-   Int_t dmemAddr=0;
-   if(nBinsQ0*nBinsQ1/4 < AliTRDtrapConfig::fgkDmemAddrLUTEnd - AliTRDtrapConfig::fgkDmemAddrLUTStart)  {  // /4 because each memory address contains 4 LUT entries
-      for (UInt_t iy = 0; iy < nBinsQ1; iy++) {
-        for (UInt_t ix = 0; ix < fPIDsizeX; ix++) {
-           buffer=0;
-           for(UInt_t isub=0; isub<4; isub++) {
-              if(ix*4+isub<nBinsQ0) {
-                 buffer |= ((Int_t) (255. * lut->GetBinContent(ix*4+isub +1, iy +1))) << isub*8 ;
-                 //AliDebug(10, Form("x: %d, y: %d -- %d, %d \n", ix*4+isub, iy, lut->GetBinContent(ix*4+isub, iy), ((Int_t) (255. * lut->GetBinContent(ix*4+isub +1, iy +1)))));
-              }
-              else
-                 buffer |= 0<<isub*8;
-           }
-           dmemAddr = AliTRDtrapConfig::fgkDmemAddrLUTStart+ix+(iy*fPIDsizeX);
-           if(dmemAddr >= AliTRDtrapConfig::fgkDmemAddrLUTEnd) {
-              AliError("LUT table size is too big!");
-           }
-           else {
-              //              AliDebug(8,Form("x: %d, y: %d is memory address %d, setting to %d \n", ix, iy, dmemAddr, buffer));
-              fTrapConfig->SetDmem(AliTRDtrapConfig::fgkDmemAddrLUTStart+ix+(iy*fPIDsizeX), buffer);
-           }
-        }
-      }
-   }
-   else {
-      AliError("LUT table is too big!");
-   }
-}
-
-
-void AliTRDmcmSim::SetPIDLutScaleDMEM()
-{
-  // set scale factor for PID in DMEM
-
-   Double_t scaleQ[2];
-   fTrapConfig->GetPIDscale(scaleQ);
-   
-   ULong64_t scale = 1;
-   scale = scale<<32;
-
-   fTrapConfig->SetDmem(AliTRDtrapConfig::fgkDmemAddrLUTcor0, TMath::Nint(scale*scaleQ[0]));
-   fTrapConfig->SetDmem(AliTRDtrapConfig::fgkDmemAddrLUTcor1, TMath::Nint(scale*scaleQ[1]));
-}
-
-
-void AliTRDmcmSim::SetPIDLut(Int_t* /* lut */, Int_t /* nbinsq0 */, Int_t /* nbinsq1 */)
-{
-   ;
-}
-
-
-
-
 // help functions, to be cleaned up
 
 UInt_t AliTRDmcmSim::AddUintClipping(UInt_t a, UInt_t b, UInt_t nbits) const
@@ -2275,7 +2202,7 @@ void AliTRDmcmSim::PrintFitRegXml(ostream& os) const
        os << "   <c cpu=\"" << cpu << "\">" << std::endl;
        if(fFitPtr[cpu] != 31) {
           for(int adcch=fFitPtr[cpu]; adcch<fFitPtr[cpu]+2; adcch++) {
-             os << "    <ch chnr=\">" << adcch << "\">"<< std::endl;
+             os << "    <ch chnr=\"" << adcch << "\">"<< std::endl;
              os << "     <hits>"   << fFitReg[adcch].fNhits << "</hits>"<< std::endl;
              os << "     <q0>"     << fFitReg[adcch].fQ0/4 << "</q0>"<< std::endl;    // divided by 4 because in simulation we have 2 additional decimal places
              os << "     <q1>"     << fFitReg[adcch].fQ1/4 << "</q1>"<< std::endl;    // in the output 
@@ -2326,7 +2253,7 @@ void AliTRDmcmSim::PrintTrackletsXml(ostream& os) const
 
       }
       os << "      <trk> <pid>" << pid << "</pid>" << " <padrow>" << padrow << "</padrow>" 
-        << " <slope>" << slope << "</slope>" << " <offset>" << offset << "</offset>" << std::endl;
+        << " <slope>" << slope << "</slope>" << " <offset>" << offset << "</offset>" << "</trk>" << std::endl;
    }
 
    os << "    </m>" << std::endl;
@@ -2437,43 +2364,14 @@ void AliTRDmcmSim::PrintPidLutHuman()
    UInt_t nBinsQ0 = fTrapConfig->GetDmemUnsigned(AliTRDtrapConfig::fgkDmemAddrLUTnbins);
 
    std::cout << "nBinsQ0: " << nBinsQ0 << std::endl;
-   std::cout << "LUT table length: " << fTrapConfig->GetDmemUnsigned(AliTRDtrapConfig::fgkDmemAddrLUTLength)/4 << std::endl;
+   std::cout << "LUT table length: " << fTrapConfig->GetDmemUnsigned(AliTRDtrapConfig::fgkDmemAddrLUTLength) << std::endl;
  
    for(UInt_t addr=AliTRDtrapConfig::fgkDmemAddrLUTStart; addr< addrEnd; addr++) {
       result = fTrapConfig->GetDmemUnsigned(addr);
-      std::cout << addr << " # x: " << (addr-AliTRDtrapConfig::fgkDmemAddrLUTStart)%(nBinsQ0/4) << ", y: " <<(addr-AliTRDtrapConfig::fgkDmemAddrLUTStart)/nBinsQ0 << "  #  " <<((result>>0)&0xFF)/255.0 
-               << " | " << ((result>>8)&0xFF)/255.0
-               << " | " << ((result>>16)&0xFF)/255.0 << " | " << ((result>>24)&0xFF)/255.0 << std::endl;
-   }
-}
-
-
-void AliTRDmcmSim::PrintPidLutDatx(ostream& os) const
-{
-  // print PID LUT in datx format (to send to FEE)
-  
-   Double_t scaleQ[2];
-   fTrapConfig->GetPIDscale(scaleQ);
-   
-   ULong64_t scale = 1;
-   scale = scale<<32;
-
-   os << std::setw(5) << 27;          // cmd 
-   os << std::setw(8) << 4;           // scaleQ0
-   os << std::setw(12) << TMath::Nint(scale*scaleQ[0]);  // value
-   os << std::setw(8)  << 1 << std::endl;          // destination
-
-   os << std::setw(5) << 27;          // cmd 
-   os << std::setw(8) << 5;           // scaleQ1
-   os << std::setw(12) << TMath::Nint(scale*scaleQ[1]);  // value
-   os << std::setw(8)  << 1 << std::endl << std::endl;          // destination
-
-   fTrapConfig->PrintMemDatx(os, AliTRDtrapConfig::fgkDmemAddrLUTnbins);
-   fTrapConfig->PrintMemDatx(os, AliTRDtrapConfig::fgkDmemAddrLUTLength);
-
-   UInt_t addrStart = AliTRDtrapConfig::fgkDmemAddrLUTStart;
-   UInt_t addrEnd = addrStart +  (fTrapConfig->GetDmemUnsigned(AliTRDtrapConfig::fgkDmemAddrLUTLength)/4); // divided by 4 because each addr contains four values  
-   for(UInt_t addr=AliTRDtrapConfig::fgkDmemAddrLUTStart; addr< addrEnd; addr++) { 
-      fTrapConfig->PrintMemDatx(os, addr);
+      std::cout << addr << " # x: " << ((addr-AliTRDtrapConfig::fgkDmemAddrLUTStart)%((nBinsQ0)/4))*4 << ", y: " <<(addr-AliTRDtrapConfig::fgkDmemAddrLUTStart)/(nBinsQ0/4)
+               << "  #  " <<((result>>0)&0xFF)
+               << " | "  << ((result>>8)&0xFF)
+               << " | "  << ((result>>16)&0xFF)
+               << " | "  << ((result>>24)&0xFF) << std::endl;
    }
 }
index d72b62a..0ebd8b6 100644 (file)
@@ -122,10 +122,6 @@ class AliTRDmcmSim : public TObject {
          // PID
          Int_t GetPID(Int_t q0, Int_t q1);
          void PrintPidLutHuman();
-         void PrintPidLutDatx(ostream& os) const;
-         void SetPIDLutScaleDMEM();
-         void SetPIDLut(TH2F * const lut);
-         void SetPIDLut(Int_t *lut, Int_t nbinsq0, Int_t nbinsq1);
 
          // I/O
          void PrintFitRegXml(ostream& os) const;
index a5c1e2f..b30fbbf 100644 (file)
@@ -798,13 +798,13 @@ Bool_t AliTRDtrapConfig::SetDmem(Int_t addr, UInt_t value)
    addr = addr - fgkDmemStartAddress;
 
    if(addr < 0 || addr >=  fgkDmemWords) {
-      AliDebug(5, Form("No DMEM address: 0x%08x", addr+fgkDmemStartAddress));
+      AliError(Form("No DMEM address: 0x%08x", addr+fgkDmemStartAddress));
       return kFALSE;
    }
 
    switch(fDmemDepth[addr]) {
    case fgkDmemSizeEmpty:
-      AliDebug(5, Form("DMEM address %i not active", addr));
+      AliDebug(4, Form("DMEM address %i not active", addr));
       return kFALSE;
       break;
    case fgkDmemSizeUniform:
@@ -864,7 +864,7 @@ Bool_t AliTRDtrapConfig::SetDmem(Int_t addr, UInt_t value, Int_t det, Int_t rob,
 
    switch(fDmemDepth[addr]) {
    case fgkDmemSizeEmpty:
-      AliError(Form("DMEM address 0x%08x not active", addr+fgkDmemStartAddress));
+      AliDebug(4, Form("DMEM address 0x%08x not active", addr+fgkDmemStartAddress));
       return kFALSE;
       break;
    case fgkDmemSizeUniform:
@@ -925,7 +925,7 @@ Bool_t AliTRDtrapConfig::SetDmem(Int_t addr, UInt_t value, Int_t det, Int_t rob,
 UInt_t AliTRDtrapConfig::GetDmemUnsigned(Int_t addr) const
 {
    addr = addr - fgkDmemStartAddress;
-   if(addr >=  fgkDmemWords) {
+   if(addr < 0 || addr >=  fgkDmemWords) {
       AliError(Form("No DMEM address: 0x%08x", addr+fgkDmemStartAddress));
       return 0;
    }
@@ -955,7 +955,7 @@ UInt_t AliTRDtrapConfig::GetDmemUnsigned(Int_t addr, Int_t det, Int_t rob, Int_t
 
    switch(fDmemDepth[addr]) {
    case fgkDmemSizeEmpty:
-      AliError(Form("DMEM address 0x%08x not active", addr+fgkDmemStartAddress));
+      AliDebug(4, Form("DMEM address 0x%08x not active", addr+fgkDmemStartAddress));
       return 0;
       break;
    case fgkDmemSizeUniform:
@@ -1080,52 +1080,6 @@ Bool_t AliTRDtrapConfig::LoadConfig()
 }
 
 
-Bool_t  AliTRDtrapConfig::LoadConfig(Int_t det, TString filename)
-{
-   // load a TRAP configuration from a file
-   // The file format is the format created by the standalone 
-   // command coder: scc / show_cfdat 
-   // which are two tools to inspect/export configurations from wingDB
-
-  ResetRegs(); // does not really make sense here???
-
-  std::ifstream infile;
-  infile.open(filename.Data(), std::ifstream::in);
-  if (!infile.is_open()) {
-    AliError("Can not open MCM configuration file");
-    return kFALSE;
-  }
-
-  Int_t cmd, extali, addr, data;
-  Int_t no;
-  char tmp;
-  
-  while(infile.good()) {
-    cmd=-1;
-    extali=-1;
-    addr=-1;
-    data=-1;
-    infile >> std::skipws >> no >> tmp >> cmd >> addr >> data >> extali;
-    //      std::cout << "no: " << no << ", cmd " << cmd << ", extali " << extali << ", addr " << addr << ", data " << data <<  endl;
-    
-    if(cmd!=-1 && extali!=-1 && addr != -1 && data!= -1) {
-      AddValues(det, cmd, extali, addr, data);
-    }
-    else if(!infile.eof() && !infile.good()) {
-      infile.clear();
-      infile.ignore(256, '\n');
-    }
-    
-    if(!infile.eof())
-      infile.clear();
-  }
-  
-  infile.close();
-  
-  return kTRUE;
-}
-
-
 Bool_t AliTRDtrapConfig::ReadPackedConfig(Int_t hc, UInt_t *data, Int_t size) 
 {
   // Read the packed configuration from the passed memory block
index bbff9ce..a70b457 100644 (file)
@@ -500,7 +500,6 @@ class AliTRDtrapConfig : public TObject
 
   // configuration handling
   Bool_t LoadConfig();
-  Bool_t LoadConfig(Int_t det, TString filename);
 
   Bool_t ReadPackedConfig(Int_t det, UInt_t *data, Int_t size);
 
diff --git a/TRD/AliTRDtrapConfigHandler.cxx b/TRD/AliTRDtrapConfigHandler.cxx
new file mode 100644 (file)
index 0000000..68fea3a
--- /dev/null
@@ -0,0 +1,500 @@
+
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+////////////////////////////////////////////////////////////////////////////
+//                                                                        //
+//  MCM configuraton handler                                              //
+//                                                                        //
+//  Author: U. Westerhoff                                                 //
+//                                                                        //
+////////////////////////////////////////////////////////////////////////////
+
+
+
+#include "AliTRDtrapConfigHandler.h"
+
+#include <iostream>
+#include <iomanip>
+
+#include "AliTRDpadPlane.h"
+#include "AliTRDtrapConfig.h"
+#include "AliTRDcalibDB.h"
+#include "AliTRDCommonParam.h"
+#include "AliLog.h"
+
+#include "AliTRDarrayDictionary.h"
+
+#include "AliMagF.h"
+#include "TGeoGlobalMagField.h"
+#include "AliMagWrapCheb.h"
+#include "AliTRDgeometry.h"
+
+#include "TMath.h"
+#include "TGeoMatrix.h"
+
+using namespace std;
+
+ClassImp(AliTRDtrapConfigHandler)
+
+
+AliTRDtrapConfigHandler::AliTRDtrapConfigHandler() :
+     fGeo(NULL)
+     , fDet(0)
+     , fBField(0)
+     , fOmegaTau(1)
+     , fPtMin(0)
+     , fNTimebins(0)
+     , fScaleQ0(1)
+     , fScaleQ1(1)
+     , fPidTracklengthCorr(kFALSE)
+     , fTiltCorr(kTRUE)
+{
+   fGeo = new AliTRDgeometry;
+}
+
+
+AliTRDtrapConfigHandler::~AliTRDtrapConfigHandler()
+{
+   delete fGeo;
+}
+
+void AliTRDtrapConfigHandler::ResetMCMs()
+{
+   //
+   // Reset all MCM registers and DMEM
+   //
+
+   AliTRDtrapConfig *cfg = AliTRDtrapConfig::Instance();
+   cfg->ResetRegs();
+   cfg->ResetDmem();
+}
+
+
+Int_t AliTRDtrapConfigHandler::LoadConfig(TString filename, Int_t det)
+{
+   //
+  // load a TRAP configuration from a file
+   // The file format is the format created by the standalone
+   // command coder scc / show_cfdat but without the running number
+   // scc /show_cfdat adds as the first column
+   // which are two tools to inspect/export configurations from wingDB
+   //
+
+
+   fDet = det;
+   Int_t ignoredLines=0;
+   Int_t ignoredCmds=0;
+   Int_t readLines=0;
+
+
+   AliTRDtrapConfig *cfg = AliTRDtrapConfig::Instance();
+
+   AliDebug(5, Form("Processing file %s", filename.Data()));
+   std::ifstream infile;
+   infile.open(filename.Data(), std::ifstream::in);
+   if (!infile.is_open()) {
+    AliError(Form("Can not open MCM configuration file %s", filename.Data()));
+    return kFALSE;
+   }
+
+   UInt_t cmd;
+   Int_t extali, addr, data;
+
+   while(infile.good()) {
+      cmd=999;
+      extali=-1;
+      addr=-1;
+      data=-1;
+      infile >> std::skipws >> cmd >> addr >> data >> extali;
+      //      std::cout << "no: " << no << ", cmd " << cmd << ", extali " << extali << ", addr " << addr << ", data " << data <<  endl;
+
+      if(cmd!=999 && extali!=-1 && addr != -1 && data!= -1 && extali!=-1) {
+        if(cmd==fgkScsnCmdWrite)
+           cfg->AddValues(det, cmd, extali, addr, data);
+        else if(cmd == fgkScsnLTUparam)
+           ProcessLTUparam(extali, addr, data);
+        else
+           ignoredCmds++;
+
+        readLines++;
+      }
+      else if(!infile.eof() && !infile.good()) {
+        infile.clear();
+        infile.ignore(256, '\n');
+        ignoredLines++;
+      }
+
+      if(!infile.eof())
+        infile.clear();
+   }
+
+   infile.close();
+
+   AliDebug(5, Form("Ignored lines: %i, ignored cmds: %i", ignoredLines, ignoredCmds));
+
+
+   if(ignoredLines>readLines)
+      AliError(Form("More then 50% of the input file could not be processed. Perhaps you should check the input file %s", filename.Data()));
+
+
+   return kTRUE;
+}
+
+
+
+void AliTRDtrapConfigHandler::ProcessLTUparam(Int_t dest, Int_t addr, UInt_t data)
+{
+   //
+   // Process the LTU parameters and stores them in internal class variables
+   // or transfer the stored values to AliTRDtrapConfig, depending on the dest parameter
+   //
+
+   switch (dest) {
+
+   case 0: // set the parameters in AliTRDtrapConfig
+      ConfigureDyCorr();
+      ConfigureDRange(); // deflection range
+      ConfigureNTimebins();  // timebins in the drift region
+      ConfigurePIDcorr();  // scaling parameters for the PID
+      break;
+
+   case 1: // set variables
+      switch (addr) {
+
+      case 0: fPtMin =  float(data) / 1000.; break; // pt_min in GeV/c (*1000)
+      case 1: fBField = float(data) / 1000. ; break; // B in T (*1000)
+      case 2: fOmegaTau = float(data) / 1.0E6  ; break; // omega*tau
+      case 3: fNTimebins = data; break;
+       // ntimbins: drift time (for 3 cm) in timebins (5 add. bin. digits)
+      case 4: fScaleQ0 = data; break;
+      case 5: fScaleQ1 = data; break;
+      case 6: fPidTracklengthCorr = (bool) data; break;
+      case 7: fTiltCorr = (bool) data; break;
+      }
+      break;
+
+   default:
+      AliError(Form("dest %i not implemented", dest));
+   }
+
+}
+
+
+void AliTRDtrapConfigHandler::ConfigureNTimebins()
+{
+   //
+   // Set timebins in the drift region
+   //
+   AliTRDtrapConfig::Instance()->AddValues(fDet, fgkScsnCmdWrite, 127, AliTRDtrapConfig::fgkDmemAddrNdrift, fNTimebins);
+}
+
+
+
+void AliTRDtrapConfigHandler::ConfigureDyCorr()
+{
+   //
+   //  Deflection length correction
+   //  due to Lorentz angle and tilted pad correction
+   //  This correction is in units of padwidth / (256*32)
+   //
+
+   Int_t nRobs;
+   if(fGeo->GetStack(fDet) == 2)
+      nRobs=6;
+   else
+      nRobs=8;
+
+   Double_t dyLorentz = - fOmegaTau * fGeo->CdrHght();    // CdrHght: Height of the drift region
+   Double_t globalPos[3];
+   Double_t tiltingAngle = fGeo->GetPadPlane(fDet)->GetTiltingAngle();
+   Double_t scalePad = 256. * 32.;
+   Int_t dyCorrInt=0;
+
+    for (Int_t r = 0; r < nRobs; r++) {
+       for (Int_t m = 0; m < 16; m++) {
+          if(GetPadPosNonRot(r, m, 9, globalPos)==0) {
+             double dyTilt = ( fGeo->CdrHght() *  TMath::Tan(tiltingAngle * TMath::DegToRad()) * globalPos[2]/globalPos[0]);
+
+             double dyCorr;
+             if(fTiltCorr==kTRUE)
+                dyCorr = dyLorentz + dyTilt;
+             else
+                dyCorr = dyTilt;
+
+
+             dyCorrInt =  TMath::Nint(dyCorr * scalePad /  fGeo->GetPadPlane(fDet)->GetWidthIPad());  // The correction is in units of 1/256 of the
+                                                                                                      // pad width, including 5 binary digits
+          }
+          else {
+             AliError("No transformation matrix available");
+             dyCorrInt=0;
+          }
+          Int_t dest =  1<<10 | r<<7 | m;
+          AliTRDtrapConfig::Instance()->AddValues(fDet, fgkScsnCmdWrite, dest, AliTRDtrapConfig::fgkDmemAddrDeflCorr, dyCorrInt);
+       }
+    }
+}
+
+
+
+
+
+void AliTRDtrapConfigHandler::ConfigureDRange()
+{
+   //
+   // deflection range LUT
+   // range calculated according to B-field (in T) and pt_min (in GeV/c)
+   // if pt_min < 0.1 GeV/c the maximal allowed range for the tracklet
+   // deflection (-64..63) is used
+   //
+
+   static const int x=0;
+   static const int y=1;
+   static const Double_t dyBin = 140e-6;
+
+   Int_t dyMinInt=fgkDyMinCut;
+   Int_t dyMaxInt=fgkDyMaxCut;
+   Double_t mcmPos[3];
+
+   Int_t nRobs=-1;
+   if(fGeo->GetStack(fDet) == 2)
+      nRobs=6;
+   else
+      nRobs=8;
+
+   for (Int_t r = 0; r < nRobs; r++) {
+      for (Int_t m = 0; m < 16; m++) {
+        for (Int_t c = 0; c < 18; c++) {
+
+           if(fPtMin<0.1) {
+              dyMinInt=fgkDyMinCut;
+              dyMaxInt=fgkDyMaxCut;
+           }
+           else {
+              if(GetPadPosNonRot(r, m, c, mcmPos)==0) {
+                 Double_t radius = fPtMin/(0.3*fBField);
+
+                 double vertexPos[2] = {0,0};
+
+                 Double_t distanceX = (vertexPos[x]-mcmPos[x]) / 100.; // cm -> m
+                 Double_t distanceY = (vertexPos[y]-mcmPos[y]) / 100.; // cm -> m
+
+                 Double_t maxDeflTemp = (TMath::Sqrt( Square(distanceX) + Square(distanceY)) / 2) / radius;
+                 Double_t localPhi = TMath::ATan2(distanceY, distanceX);
+
+                 Double_t maxDeflAngle=0;
+                 if(maxDeflTemp < 1. ) {
+                    maxDeflAngle = TMath::ASin(maxDeflTemp);
+                    Double_t dyMin = fGeo->CdrHght()/100. * TMath::Tan(localPhi - maxDeflAngle);  // CdrHght: Height of the drift region in cm
+                    Double_t dyMax = fGeo->CdrHght()/100. * TMath::Tan(localPhi + maxDeflAngle);
+
+                    dyMinInt = Int_t (dyMin / dyBin);
+                    dyMaxInt = Int_t (dyMax / dyBin);
+
+                    if(dyMinInt < fgkDyMinCut)
+                       dyMinInt = fgkDyMinCut;
+                    if(dyMaxInt > fgkDyMaxCut)
+                       dyMaxInt = fgkDyMaxCut;
+                 }
+                 else {
+                    dyMinInt = fgkDyMinCut;
+                    dyMaxInt = fgkDyMaxCut;
+                 }
+
+//               cout << "maxdefl: " << maxDeflAngle << ", localPhi " << localPhi << endl;
+//               cout << "r " << r << ", m" << m << ", c " << c << ", min angle: " << localPhi-maxDeflAngle << ", max: " << localPhi+maxDeflAngle
+//                    << ", min int: " << dyMinInt << ", max int: " << dyMaxInt << endl;
+              }
+              else {
+                 AliError("No geometry model loaded\n");
+              }
+           }
+
+           Int_t dest =  1<<10 | r<<7 | m;
+           Int_t lutAddr = AliTRDtrapConfig::fgkDmemAddrDeflCutStart + 2*c;
+           AliTRDtrapConfig::Instance()->AddValues(fDet, fgkScsnCmdWrite, dest, lutAddr+0, dyMinInt);
+           AliTRDtrapConfig::Instance()->AddValues(fDet, fgkScsnCmdWrite, dest, lutAddr+1, dyMaxInt);
+        }
+      }
+   }
+}
+
+void AliTRDtrapConfigHandler::PrintGeoTest()
+{
+   //
+   // Prints some information about the geometry. Only for debugging
+   //
+
+   Double_t mcmPos[3];
+   int sm=0;
+   //   for(int sm=0; sm<6; sm++) {
+   for(int stack=0; stack<5; stack++) {
+      for(int layer=0; layer<6; layer++) {
+
+        fDet = sm*30+stack*6+layer;
+        for (Int_t r = 0; r < 6; r++) {
+           for (Int_t m = 0; m < 16; m++) {
+              for (Int_t c = 7; c < 8; c++) {
+                 GetPadPosNonRot(r, m, c, mcmPos);
+                 cout << stack << ";" << layer << ";" << r << ";" << m
+                      << ";" << mcmPos[0] << ";" << mcmPos[1] << ";" << mcmPos[2] << endl;
+              }
+           }
+        }
+      }
+   }
+   // }
+}
+
+
+
+void AliTRDtrapConfigHandler::ConfigurePIDcorr()
+{
+   //
+   // Calculate the MCM individual correction factors for the PID
+   // and transfer them to AliTRDtrapConfig
+   //
+
+   static const Int_t addrLUTcor0 = AliTRDtrapConfig::fgkDmemAddrLUTcor0;
+   static const Int_t addrLUTcor1 = AliTRDtrapConfig::fgkDmemAddrLUTcor1;
+
+   UInt_t cor0;
+   UInt_t cor1;
+
+   Double_t globalPos[3];
+
+   Int_t nRobs=-1;
+   if(fGeo->GetStack(fDet) == 2)
+      nRobs=6;
+   else
+      nRobs=8;
+
+   for (Int_t r=0; r<nRobs; r++) {
+      for(Int_t m=0; m<16; m++) {
+
+        if(GetPadPosNonRot(r, m, 9, globalPos)==0) {
+           Double_t elongation = TMath::Abs(TMath::Sqrt(globalPos[0]*globalPos[0] + globalPos[1]*globalPos[1] + globalPos[2]*globalPos[2]) / globalPos[0]);
+
+           if(fPidTracklengthCorr==kFALSE) {
+              cor0 = fScaleQ0;
+              cor1 = fScaleQ1;
+           }
+           else {
+              cor0 = Int_t ((1.0*fScaleQ0* (1/elongation) ));
+              cor1 = Int_t ((1.0*fScaleQ1* (1/elongation) ));
+           }
+
+           Int_t dest =  1<<10 | r<<7 | m;
+           AliTRDtrapConfig::Instance()->AddValues(fDet, fgkScsnCmdWrite, dest, addrLUTcor0, cor0);
+           AliTRDtrapConfig::Instance()->AddValues(fDet, fgkScsnCmdWrite, dest, addrLUTcor1, cor1);
+        }
+        else {
+           AliError("No transformation matrix available");
+        }
+      }
+   }
+}
+
+
+
+Int_t AliTRDtrapConfigHandler::GetPadPosNonRot(Int_t rob, Int_t mcm, Int_t channel, Double_t trackCoor[3])
+{
+   //
+   // Calcutate the gobal coordinates for an mcm channel in the supermodule at position -0.5
+   //
+
+   Int_t stack = fGeo->GetStack(fDet);
+   Int_t layer = fGeo->GetLayer(fDet);
+
+   AliTRDpadPlane *plane = fGeo->GetPadPlane(layer, stack);
+   if(plane==NULL) {
+      AliError(Form("stack %i, layer %i, det %i", stack, layer, fDet));
+      return 1;
+   }
+
+   Double_t locYZ[2];
+   Double_t loc[3];
+
+   Double_t radialPos = fGeo->AnodePos()-0.83; //
+   //   Double_t radialPos = 300.65 + 12.60 * layer; // cm // taken from libTRD/geometry/geometry.cc, probably not the final value
+
+   GetLocalPadPos(plane, rob, mcm, channel, locYZ);
+
+   loc[0] = radialPos;
+   loc[1] = locYZ[0];
+   loc[2] = locYZ[1];
+
+   //transform from loc[3] - coordinates of the pad
+   // Go to tracking coordinates
+
+   TGeoHMatrix *fMatrix  = fGeo->GetClusterMatrix(fDet);
+   if(fMatrix==NULL) {
+      AliError(Form("stack %i, layer %i, det %i", stack, layer, fDet));
+      return 2;
+   }
+   fMatrix->LocalToMaster(loc, trackCoor);
+   return 0;
+}
+
+
+void AliTRDtrapConfigHandler::GetLocalPadPos(AliTRDpadPlane *plane, Int_t rob, Int_t mcm, Int_t channel, Double_t result[2])
+{
+   //
+   // calculate the local coordinates for an mcm channel
+   //
+
+   Double_t localY, localZ;
+
+    Int_t padCol;
+    if(rob%2 == 0) //side a
+       padCol  = (mcm % fgkMCMperROBCol) * fgkPadsPerMCM + channel;
+    else
+       padCol  = (mcm % fgkMCMperROBCol) * fgkPadsPerMCM + (plane->GetNcols()/2) + channel;
+
+    Int_t padRow = ((Int_t) floor(rob/2.0)) * fgkMCMperROBRow + ((Int_t) floor(mcm/4));
+
+    if(padCol<0 || padCol>= plane->GetNcols())
+       AliError(Form("Invalid pad col: %i\n", padCol));
+
+    if(padRow<0 || padRow>= plane->GetNrows())
+       AliError(Form("Invalid pad row: %i\n", padRow));
+
+    if(padCol+1 == plane->GetNcols()) // last pad
+       localY = plane->GetColPos(padCol) + (plane->GetColEnd()-plane->GetColPos(padCol))/2;
+    else
+       localY = plane->GetColPos(padCol) + (plane->GetColPos(padCol+1)-plane->GetColPos(padCol))/2;
+
+    if(padRow+1 == plane->GetNrows())
+       localZ = plane->GetRowPosROC(padRow) + (plane->GetRowEndROC() - plane->GetRowPosROC(padRow))/2;
+    else
+       localZ = plane->GetRowPosROC(padRow) + (plane->GetRowPosROC(padRow+1) - plane->GetRowPosROC(padRow))/2;
+
+    //    std::cout << "pad col " << padCol << ", pad row " << padRow << std::endl;
+    //    std::cout << "pos y (col) " << localY << ", pos z (row) " << localZ << std::endl;
+
+    result[0]=localY;
+    result[1]=localZ;
+}
+
+
+Double_t AliTRDtrapConfigHandler::Square(Double_t val)
+{
+   //
+   // calculate the square of the argument
+   //
+
+   return val*val;
+}
diff --git a/TRD/AliTRDtrapConfigHandler.h b/TRD/AliTRDtrapConfigHandler.h
new file mode 100644 (file)
index 0000000..77ebf4e
--- /dev/null
@@ -0,0 +1,80 @@
+#ifndef ALITRDMCMSIMCONFIGHANDLER_H
+#define ALITRDMCMSIMCONFIGHANDLER_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+////////////////////////////////////////////////////////////////
+//                                                            //
+//  Multi Chip Module Simulation Configuration Handler Class  //
+//                                                            //
+////////////////////////////////////////////////////////////////
+
+
+#include <TObject.h>
+
+class AliTRDgeometry;
+class AliTRDtrapConfig;
+class AliTRDpadPlane;
+
+
+class AliTRDtrapConfigHandler : public TObject {
+ public:
+                    AliTRDtrapConfigHandler();
+  virtual          ~AliTRDtrapConfigHandler();
+
+  void ResetMCMs();                                           // Reset all trap registers and DMEM of the MCMs
+  Int_t LoadConfig(TString filename, Int_t det);              // load a TRAP configuration from a file
+
+  void ProcessLTUparam(Int_t dest, Int_t addr, UInt_t data);  // Process the LTU parameters
+  void PrintGeoTest();                                        // Prints some information about the geometry. Only for debugging
+
+  // UInt_t peek(Int_t rob, Int_t mcm, Int_t addr);   // not implemented yet
+  // Int_t poke(Int_t rob, Int_t mcm, Int_t addr, UInt_t value);   // not implemented yet
+
+ private:
+  void  ConfigureDyCorr();                                    // deflection length correction due to Lorentz angle and tilted pad correction
+  void  ConfigureDRange();                                    // deflection range LUT,  range calculated according to B-field (in T) and pt_min (in GeV/c)
+  void  ConfigureNTimebins();                                 // timebins in the drift region
+  void  ConfigurePIDcorr();                                   // Calculate the mcm individual correction factors for the PID
+
+  Int_t GetPadPosNonRot(Int_t rob, Int_t mcm, Int_t channel, Double_t trackCoor[3]);    // calcutate the gobal coordinates for an mcm channel in the supermodule at position -0.5
+  void GetLocalPadPos(AliTRDpadPlane *plane, Int_t rob, Int_t mcm, Int_t channel, Double_t result[2]); // calculate the local coordinates for an mcm channel
+
+  Double_t Square(Double_t val);  // returns the square of a given number
+
+  AliTRDtrapConfigHandler(const AliTRDtrapConfigHandler &h);             // not implemented
+  AliTRDtrapConfigHandler &operator=(const AliTRDtrapConfigHandler &h);  // not implemented
+
+
+
+  static const UInt_t fgkScsnCmdWrite=10;  // SCSN command for the write command
+  static const UInt_t fgkScsnLTUparam=27;  // extended SCSN command for the LTU configuration
+
+  static const Int_t fgkDyMaxCut = 63;     // Maximum value of the deflection cut
+  static const Int_t fgkDyMinCut = -64;    // Minimum value of the deflection cut
+
+  static const Int_t fgkMCMperROBCol = 4;  // MCMs per ROB column
+  static const Int_t fgkPadsPerMCM = 18;   // readout pads per MCM
+  static const Int_t fgkMCMperROBRow = 4;  // MCMs per ROB row
+
+
+  AliTRDgeometry *fGeo;                    // Pointer to the AliTRDgeometry class
+
+  Int_t fDet;   // detector number (0 - 539)
+
+  Double_t fBField;                        // value of the L3 magnet field
+  Double_t fOmegaTau;                      // ometa tau
+  Double_t fPtMin;                         // lower p_t threshold for the tracks which should pass the deflection cut
+  Int_t fNTimebins;                        // Number of time bins in the drift region (only relevant for GTU)
+  UInt_t fScaleQ0;                         // scale parameter to map the accumulated charge in the first time window to a memory address
+  UInt_t fScaleQ1;                         // scale parameter to map the accumulated charge in the second time window to a memory address
+  Bool_t fPidTracklengthCorr;              // Factor to correct the accumulated charge for track length effects
+  Bool_t fTiltCorr;                        // tilting correction
+
+
+  ClassDef(AliTRDtrapConfigHandler,0)
+};
+
+
+#endif
+
index 1b18335..d9af5d4 100644 (file)
@@ -83,6 +83,7 @@
 #pragma link C++ class  AliTRDSensorArray+;
 
 #pragma link C++ class  AliTRDmcmSim+;
+#pragma link C++ class  AliTRDtrapConfigHandler+;
 #pragma link C++ class  AliTRDtrapConfig+;
 #pragma link C++ class  AliTRDtrackletBase+;
 #pragma link C++ class  AliTRDtrackletGTU+;
index 53b2bd4..d37b990 100644 (file)
@@ -57,6 +57,7 @@ SRCS= AliTRDarraySignal.cxx \
       AliTRDalignment.cxx \
       AliTRDtrapConfig.cxx \
       AliTRDmcmSim.cxx \
+      AliTRDtrapConfigHandler.cxx \
       AliTRDtrackGTU.cxx \
       AliTRDtrackletBase.cxx \
       AliTRDtrackletGTU.cxx \