Important bug fixes for the FMD reconstruction. The amount of noise
authorcholm <Christian.Holm.Christensen@cern.ch>
Wed, 7 May 2014 10:36:55 +0000 (12:36 +0200)
committercholm <Christian.Holm.Christensen@cern.ch>
Wed, 7 May 2014 10:36:55 +0000 (12:36 +0200)
suppressed by the front-end was wrongly decoded from the data.   This
update fixes that problem.

It also includes minor updates to calibration drawing and some
test sripts

This commit needs to be ported to the release ASAP.

13 files changed:
FMD/AliFMDBaseDigit.cxx
FMD/AliFMDCalibDrawer.cxx
FMD/AliFMDDigit.cxx
FMD/AliFMDRawReader.cxx
FMD/AliFMDRawWriter.cxx
FMD/AliFMDRecoParam.h
FMD/AliFMDReconstructor.cxx
FMD/scripts/Compile.C
FMD/scripts/DoDrawCalib.C
FMD/scripts/DrawCalib.C
FMD/scripts/README.md [new file with mode: 0644]
FMD/scripts/Raw2ESD.C
FMD/scripts/ReadRaw.C

index 2bf937c..4848176 100644 (file)
@@ -145,7 +145,9 @@ void
 AliFMDBaseDigit::Print(Option_t* /* option*/) const 
 {
   // Print digit to standard out 
-  cout << ClassName() << ": " << GetName() << flush;
+  cout << ClassName() << ": FMD" << fDetector << fRing 
+       << '[' << std::setw(2) << fSector 
+       << ',' << std::setw(3) << fStrip << ']' << flush;
 }
 
 //____________________________________________________________________
index 74889bb..7a1de2a 100644 (file)
@@ -16,7 +16,11 @@ AliFMDCalibDrawer::Init(Int_t runNo, const char* ocdb)
 {
   AliCDBManager* cdb = AliCDBManager::Instance();
   cdb->SetRun(runNo);
-  if (ocdb && ocdb[0] != '\0') cdb->SetDefaultStorage(ocdb);
+  TString db(ocdb);
+  if (db.EqualTo("run", TString::kIgnoreCase) || db.IsNull())
+    cdb->SetDefaultStorageFromRun(runNo);
+  else 
+    cdb->SetDefaultStorage(db);
 
   AliFMDParameters* pars = AliFMDParameters::Instance();
   pars->Init(kTRUE);
index 4369cff..eb1b845 100644 (file)
@@ -74,7 +74,8 @@ ClassImp(AliFMDDigit)
 
 //____________________________________________________________________
 AliFMDDigit::AliFMDDigit()
-  : fCount1(0),
+  : AliFMDBaseDigit(),
+    fCount1(0),
     fCount2(-1),
     fCount3(-1),
     fCount4(-1)
index 087f8b4..fa0ff8c 100644 (file)
@@ -117,8 +117,8 @@ AliFMDRawReader::Exec(Option_t*)
   
   ReadAdcs(array);
   Int_t nWrite = fTree->Fill();
-  AliDebug(1,Form("Got a grand total of %d digits, wrote %d bytes to tree", 
-                  array->GetEntriesFast(), nWrite));
+  AliDebugF(1,"Got a grand total of %d digits, wrote %d bytes to tree", 
+           array->GetEntriesFast(), nWrite);
   delete array;
 }
 
@@ -173,7 +173,7 @@ AliFMDRawReader::NewDDL(AliAltroRawStreamV3& input, UShort_t& det)
 
   // Get the DDL number
   UInt_t ddl = input.GetDDLNumber();
-  AliDebug(2,Form("DDL number %d", ddl));
+  AliDebugF(2,"DDL number %d", ddl);
 
   // Note, previously, the ALTROCFG1 register was interpreted as 
   // 
@@ -201,6 +201,10 @@ AliFMDRawReader::NewDDL(AliAltroRawStreamV3& input, UShort_t& det)
   //  17-18     01   2nd baseline filter, # of pre-samples 
   //  19       0/1   Zero suppression, enable
   //
+  // From ALTRO DPCF2 we get 
+  // 
+  //  20-23   rate   Pre-samples 
+  // 
   //  Writing 'x' for variable values, that means we have the
   //  following patterns for the 2 cases 
   //
@@ -230,34 +234,35 @@ AliFMDRawReader::NewDDL(AliAltroRawStreamV3& input, UShort_t& det)
   UInt_t cfg1 = input.GetAltroCFG1();
   if (((cfg1 >> 10) & 0x8) == 0x8) {
     UInt_t cfg2 = input.GetAltroCFG2();
-    AliDebug(3,Form("We have data from older MiniConf 0x%x cfg2=0x%08x", 
-                   ((cfg1 >> 10) & 0x8), cfg2));
+    AliDebugF(3,"We have data from older MiniConf 0x%x cfg2=0x%08x", 
+             ((cfg1 >> 10) & 0x8), cfg2);
     fZeroSuppress[ddl] = (cfg1 >>  0) & 0x1;
     fNoiseFactor[ddl]  = (cfg1 >>  6) & 0xF;
     fSampleRate[ddl]   = (cfg2 >> 20) & 0xF;
   }
   else {
-    AliDebug(3,Form("We have data from newer MiniConf 0x%x", 
-                   ((cfg1 >> 10) & 0x8)));
+    AliDebugF(3,"We have data from newer MiniConf 0x%x", 
+             ((cfg1 >> 10) & 0x8));
     fZeroSuppress[ddl] = input.GetZeroSupp();
     // WARNING: We store the noise factor in the 2nd baseline
     // filters excluded post samples, since we'll never use that
     // mode. 
-    fNoiseFactor[ddl]  = input.GetNPostsamples();
+    // fNoiseFactor[ddl]  = input.GetNPostsamples();
+    fNoiseFactor[ddl]  = input.GetNNonZSPostsamples();
     // WARNING: We store the sample rate in the number of pre-trigger
     // samples, since we'll never use that mode.
     fSampleRate[ddl]     = input.GetNPretriggerSamples();
     // 
   }
-  AliDebug(10,Form("Phase of DDL=%d is %g (%d)", ddl, input.GetL1Phase(),
-                  input.GetAltroCFG2() & 0x1F));
+  AliDebugF(10,"Phase of DDL=%d is %g (%d)", ddl, input.GetL1Phase(),
+           input.GetAltroCFG2() & 0x1F);
   fL1Phase[ddl] = input.GetAltroCFG2() & 0x1F; // input.GetL1Phase();
-  AliDebug(3,Form("RCU @ DDL %d zero suppression: %s", 
-                  ddl, (fZeroSuppress[ddl] ? "yes" : "no")));
-  AliDebug(3,Form("RCU @ DDL %d noise factor: %d", ddl,fNoiseFactor[ddl]));    
-  AliDebug(3,Form("RCU @ DDL %d sample rate: %d", ddl,fSampleRate[ddl]));
-
-
+  AliDebugF(3,"RCU @ DDL %d zero suppression: %s", 
+                  ddl, (fZeroSuppress[ddl] ? "yes" : "no"));
+  AliDebugF(3,"RCU @ DDL %d noise factor: %d", ddl,fNoiseFactor[ddl]);    
+  AliDebugF(3,"RCU @ DDL %d sample rate: %d", ddl,fSampleRate[ddl]);
+  
+  
   // Get Errors seen 
   Int_t nChAddrMismatch = input.GetNChAddrMismatch();
   Int_t nChLenMismatch  = input.GetNChLengthMismatch();
@@ -318,22 +323,22 @@ AliFMDRawReader::NewChannel(const AliAltroRawStreamV3& input,  UShort_t det,
   map->ChannelAddress(hwaddr, board, chip, channel);
   // Then try to map to detector address
   if (!map->Channel2StripBase(board, chip, channel, ring, sec, strbase)) {
-    AliError(Form("Failed to get detector id from DDL %d, "
-                 "hardware address 0x%03x", ddl, hwaddr));
+    AliErrorF("Failed to get detector id from DDL %d, "
+             "hardware address 0x%03x", ddl, hwaddr);
     return -1;
   }
-  AliDebug(4,Form("Board: 0x%02x, Altro: 0x%x, Channel: 0x%x", 
-                 board, chip, channel));
+  AliDebugF(7,"Board: 0x%02x, Altro: 0x%x, Channel: 0x%x", 
+           board, chip, channel);
 
   // Get the 'conditions'
   fMinStrip = pars->GetMinStrip(det, ring, sec, strbase);
   fMaxStrip = pars->GetMaxStrip(det, ring, sec, strbase);
   fPreSamp  = pars->GetPreSamples(det, ring, sec, strbase);
   if (fSampleRate[ddl] == 0) {
-    AliDebug(3,Form("Get sample rate for RCU @ DDL %d from OCDB", ddl));
+    AliDebugF(7,"Get sample rate for RCU @ DDL %d from OCDB", ddl);
     fSampleRate[ddl] = pars->GetSampleRate(det, ring, sec, strbase);
   }
-  AliDebug(3,Form("RCU @ DDL %d sample rate: %d", ddl,fSampleRate[ddl]));
+  AliDebugF(7,"RCU @ DDL %d sample rate: %d", ddl,fSampleRate[ddl]);
 
   return hwaddr;
 }
@@ -401,7 +406,7 @@ AliFMDRawReader::NewSample(const AliAltroRawStreamV3& input,
   Int_t           hwa  = input.GetHWAddress();
   const UShort_t* data = input.GetSignals();
   Short_t         adc  = data[i];
-  AliDebug(10,Form("0x%04x/0x%03x/%04d %4d", ddl, hwa, t, adc));
+  AliDebugF(10,"0x%04x/0x%03x/%04d %4d", ddl, hwa, t, adc);
 
   AliFMDParameters*    pars   = AliFMDParameters::Instance();
   AliFMDAltroMapping*  map    = pars->GetAltroMap();
@@ -411,28 +416,28 @@ AliFMDRawReader::NewSample(const AliAltroRawStreamV3& input,
   map->Timebin2Strip(sec, t, fPreSamp, fSampleRate[ddl], stroff, samp);
   str             = strbase + stroff;
       
-  AliDebug(20,Form("0x%04x/0x%03x/%04d=%4d maps to strip %3d sample %d " 
-                  "(pre: %d, min: %d, max: %d, rate: %d)",
-                 ddl, hwa, t, adc, str, samp, fPreSamp, 
-                 fMinStrip, fMaxStrip, fSampleRate[ddl]));
+  AliDebugF(20,"0x%04x/0x%03x/%04d=%4d maps to strip %3d sample %d " 
+           "(pre: %d, min: %d, max: %d, rate: %d)",
+           ddl, hwa, t, adc, str, samp, fPreSamp, 
+           fMinStrip, fMaxStrip, fSampleRate[ddl]);
   if (str < 0) { 
-    AliDebug(10,Form("Got presamples at timebin %d", i));
+    AliDebugF(10,"Got presamples at timebin %d", i);
     return -1;
   }
          
   // VA1 Local strip number 
   Short_t lstrip = (t - fPreSamp) / fSampleRate[ddl] + fMinStrip;
       
-  AliDebug(15,Form("Checking if strip %d (%d) in range [%d,%d]", 
-                  lstrip, str, fMinStrip, fMaxStrip));
+  AliDebugF(15,"Checking if strip %d (%d) in range [%d,%d]", 
+           lstrip, str, fMinStrip, fMaxStrip);
   if (lstrip < fMinStrip || lstrip > fMaxStrip) {
-    AliDebug(10,Form("Strip %03d-%d (%d,%d) from t=%d out of range (%3d->%3d)", 
-                   str, samp, lstrip, stroff, t, fMinStrip, fMaxStrip));
+    AliDebugF(10,"Strip %03d-%d (%d,%d) from t=%d out of range (%3d->%3d)", 
+             str, samp, lstrip, stroff, t, fMinStrip, fMaxStrip);
     adc = -1;
   }
   // Possibly do pedestal subtraction of signal 
   if (adc > 1023) 
-    AliWarning(Form("ADC value out of range: %4d", adc));
+    AliWarningF("ADC value out of range: %4d", adc);
   return adc;
 }
 
@@ -506,10 +511,10 @@ AliFMDRawReader::NextSample(UShort_t& det, Char_t&   rng, UShort_t& sec,
 
   UShort_t ret = 0;
   do { 
-    AliDebug(15,Form("t=%4d, start=%4d, length=%4d", t, start, length));
+    AliDebugF(15, "t=%4d, start=%4d, length=%4d", t, start, length);
     if (t < start - length + 1) { 
-      AliDebug(10,Form("Time t=%d < start-length+1=%d-%d+1 (%3d/0x%03x)", 
-                      t, start, length, ddl, hwaddr));
+      AliDebugF(10,"Time t=%d < start-length+1=%d-%d+1 (%3d/0x%03x)", 
+               t, start, length, ddl, hwaddr);
       if (hwaddr > 0xFFF || 
          hwaddr < 0 || 
          !stream.NextBunch()) { 
@@ -531,13 +536,13 @@ AliFMDRawReader::NextSample(UShort_t& det, Char_t&   rng, UShort_t& sec,
            return 0;
          }
          ddl = NewDDL(stream, tdet);
-         AliDebug(5,Form("New DDL: %d (%d)", ddl, tdet));
+         AliDebugF(5,"New DDL: %d (%d)", ddl, tdet);
          ret |= 0x1;
          continue;
        }
        hwaddr = NewChannel(stream, tdet, trng, tsec, bstr);
        if (hwaddr > 0xFFF) fNErrors[ddl] += 1;
-       AliDebug(5,Form("New Channel: %3d/0x%03x", ddl, hwaddr));
+       AliDebugF(5,"New Channel: %3d/0x%03x", ddl, hwaddr);
        start  = 1024;
        ret |= 0x2;
        continue;
@@ -550,17 +555,17 @@ AliFMDRawReader::NextSample(UShort_t& det, Char_t&   rng, UShort_t& sec,
        hwaddr = 0xFFFF; // Bad channel
        return -1;
       }
-      AliDebug(5, Form("New bunch in  %3d/0x%03x: start=0x%03x, length=%4d", 
-                      ddl, hwaddr, start, length));
+      AliDebugF(5, "New bunch in  %3d/0x%03x: start=0x%03x, length=%4d", 
+               ddl, hwaddr, start, length);
       ret |= 0x4;
       t      = start;
       i      = 0;
-      AliDebug(10,Form("Got new bunch FMD%d%c[%2d], bunch @ %d, length=%d", 
-                      tdet, trng, tsec, start, length));
+      AliDebugF(10,"Got new bunch FMD%d%c[%2d], bunch @ %d, length=%d", 
+               tdet, trng, tsec, start, length);
     }
     Int_t tadc = NewSample(stream, i, t, tsec, bstr, tstr, tsam);
-    AliDebug(10,Form("New sample FMD%d%c[%2d,%3d]-%d = 0x%03x", 
-                tdet, trng, tsec, tstr, tsam, tadc));
+    AliDebugF(10,"New sample FMD%d%c[%2d,%3d]-%d = 0x%03x", 
+             tdet, trng, tsec, tstr, tsam, tadc);
     ret |= 0x8;
     if (tadc >= 0) { 
       det = tdet;
@@ -574,14 +579,14 @@ AliFMDRawReader::NextSample(UShort_t& det, Char_t&   rng, UShort_t& sec,
       fac = fNoiseFactor[ddl];
       t--;
       i++;
-      AliDebug(10,Form("Returning FMD%d%c[%2d,%3d]-%d = 0x%03x (%d,%d,%d)",
-                  det, rng, sec, str, sam, adc, rat, zs, fac));
+      AliDebugF(10,"Returning FMD%d%c[%2d,%3d]-%d = 0x%03x (%d,%d,%d)",
+               det, rng, sec, str, sam, adc, rat, zs, fac);
       break;
     }
     t--;
     i++;
   } while (true);
-  AliDebug(5,Form("Returning 0x%02x", ret));
+  AliDebugF(5,"Returning 0x%02x", ret);
   return ret;
 }
 
@@ -644,7 +649,7 @@ AliFMDRawReader::ReadAdcs(TClonesArray* array)
 {
   // Read ADC values from raw input into passed TClonesArray of AliFMDDigit
   // objects. 
-  AliDebug(3,Form("Reading ADC values into a TClonesArray"));
+  AliDebug(3,"Reading ADC values into a TClonesArray");
 
   // Read raw data into the digits array, using AliFMDAltroReader. 
   if (!array) {
@@ -702,20 +707,21 @@ AliFMDRawReader::ReadAdcs(TClonesArray* array)
          UShort_t samp;
          Int_t    t    = start - i;
          Int_t    adc  = NewSample(input, i, t, sec, strbase, str, samp);
-         if (adc < 0) continue;
+         if (adc <= 0) continue;
          UShort_t counts = adc;
       
-         AliDebug(10, Form("FMD%d%c[%02d,%03d]-%d: %4d", 
-                           det, ring, sec, str, samp, counts));
+         AliDebugF(10,"FMD%d%c[%02d,%03d]-%d: %4d", 
+                   det, ring, sec, str, samp, counts);
          // Check the cache of indicies
          Int_t idx = fSeen(det, ring, sec, str);
          AliFMDDigit* digit = 0;
          if (idx == kUShortMax) { 
            // We haven't seen this strip yet. 
            fSeen(det, ring, sec, str) = idx = array->GetEntriesFast();
-           AliDebug(7,Form("making digit @ %5d for FMD%d%c[%2d,%3d]-%d "
-                           "from %3d/0x%03x/%4d", 
-                           idx, det, ring, sec, str, samp, ddl, hwaddr, t));
+           AliDebugF(7, "making digit @ %5d for FMD%d%c[%2d,%3d]-%d "
+                     "from %3d/0x%03x/%4d (def: %d)", 
+                     idx, det, ring, sec, str, samp, ddl, hwaddr, t,
+                     fSampleRate[ddl]);
            digit = new ((*array)[idx]) AliFMDDigit(det, ring, sec, str);
            digit->SetDefaultCounts(fSampleRate[ddl]);
          }
@@ -724,10 +730,11 @@ AliFMDRawReader::ReadAdcs(TClonesArray* array)
          }
          if (first < 0) first = idx;
          last = idx;
-         AliDebug(10, Form("Setting FMD%d%c[%2d,%3d]-%d from timebin "
-                           "%4d=%4d (%4d)", det, ring, sec, str, samp, t, 
-                           counts, data[i]));
+         AliDebugF(5,"Setting FMD%d%c[%2d,%3d]-%d from timebin "
+                   "%4d=%4d (%4d)", det, ring, sec, str, samp, t, 
+                   counts, data[i]);
          digit->SetCount(samp, counts);
+         if (AliLog::GetDebugLevel("FMD","") >= 5) digit->Print();
        } // for (i)
       } // while (bunch)
       if (errors) { 
@@ -737,8 +744,8 @@ AliFMDRawReader::ReadAdcs(TClonesArray* array)
          for (Int_t i = first; i <= last; i++) { 
            AliFMDDigit* digit = static_cast<AliFMDDigit*>(array->At(i));
            for (Int_t j = 0; j < fSampleRate[ddl]; j++) {
-             AliDebug(10,Form("Resetting strip %s=%d",
-                              digit->GetName(),digit->Counts()));
+             AliDebugF(10,"Resetting strip %s=%d",
+                       digit->GetName(),digit->Counts());
              digit->SetCount(j, kBadSignal);
            }
          }
@@ -778,7 +785,7 @@ AliFMDRawReader::ReadAdcs(AliFMDUShortMap& map)
 {
   // Read ADC values from raw input into passed TClonesArray of AliFMDDigit
   // objects. 
-  AliDebug(3,Form("Reading ADC values into a map"));
+  AliDebug(3,"Reading ADC values into a map");
 
   // const UShort_t kUShortMax = (1 << 16) - 1;
   for (Int_t ddl = 0; ddl < kNDDL; ddl++) fNErrors[ddl] = 0;
@@ -829,8 +836,8 @@ AliFMDRawReader::ReadAdcs(AliFMDUShortMap& map)
          if (adc < 0) continue;
          UShort_t counts = adc;
       
-         AliDebug(10, Form("FMD%d%c[%02d,%03d]-%d: %4d", 
-                           det, ring, sec, str, samp, counts));
+         AliDebugF(10, "FMD%d%c[%02d,%03d]-%d: %4d", 
+                   det, ring, sec, str, samp, counts);
          if (SelectSample(samp, fSampleRate[ddl]))
            map(det,ring,sec,str) = counts; 
          if (first < 0) first = str;
@@ -843,8 +850,8 @@ AliFMDRawReader::ReadAdcs(AliFMDUShortMap& map)
        if (first >= 0) {
          Int_t ds = first <= last ? 1 : -1;
          for (Int_t i = first; i != last+ds; i += ds) { 
-           AliDebug(10, Form("Resetting strip FMD%d%c[%02d,%03d]=%d",
-                             det,ring,sec,i,map(det,ring,sec,i)));
+           AliDebugF(10, "Resetting strip FMD%d%c[%02d,%03d]=%d",
+                     det,ring,sec,i,map(det,ring,sec,i));
            map(det,ring,sec,i) = kBadSignal;
          }
        }
@@ -873,7 +880,7 @@ Bool_t AliFMDRawReader::ReadSODevent(AliFMDCalibSampleRate* sampleRate,
   // Return:
   //    @c true on success
   //  
-  AliDebug(0,Form("Start of SOD/EOD"));
+  AliDebug(0,"Start of SOD/EOD");
   
   UInt_t shift_clk[18];
   UInt_t sample_clk[18];
@@ -900,7 +907,7 @@ Bool_t AliFMDRawReader::ReadSODevent(AliFMDCalibSampleRate* sampleRate,
     Int_t ddl   = streamer.GetDDLNumber();
     Int_t detID = fReader->GetDetectorID();
     if (detectors) detectors[map->DDL2Detector(ddl)-1] = kTRUE;
-    AliDebug(0,Form(" From reader: DDL number is %d , det ID is %d",ddl,detID));
+    AliDebugF(0," From reader: DDL number is %d , det ID is %d",ddl,detID);
     
     ULong_t  nPayloadWords = streamer.GetRCUPayloadSizeInSOD();
     UChar_t* payloadData   = streamer.GetRCUPayloadInSOD();
@@ -958,12 +965,12 @@ Bool_t AliFMDRawReader::ReadSODevent(AliFMDCalibSampleRate* sampleRate,
       //UInt_t data          = (0xFFFF & dataWord) ;
        
       if(error) {
-       AliWarning(Form("error bit detected at Word 0x%06x; "
-                       "error % d, type %d, bc_not_altro %d, "
-                       "bcast %d, board 0x%02x, chip 0x%x, "
-                       "channel 0x%02x, instruction 0x%03x",
-                       address, error, type, bc_not_altro, 
-                       bcast,board,chip,channel,instruction));
+       AliWarningF("error bit detected at Word 0x%06x; "
+                   "error % d, type %d, bc_not_altro %d, "
+                   "bcast %d, board 0x%02x, chip 0x%x, "
+                   "channel 0x%02x, instruction 0x%03x",
+                   address, error, type, bc_not_altro, 
+                   bcast,board,chip,channel,instruction);
        //process error
        continue;
       }
@@ -1044,8 +1051,8 @@ Bool_t AliFMDRawReader::ReadSODevent(AliFMDCalibSampleRate* sampleRate,
       case 0x24: break; // FMD: L2 timeout
       case 0x25: // FMD: Shift clk 
        shift_clk[board] = ((data >> 8 ) & 0xFF); 
-       AliDebug(30,Form("Read shift_clk=%d for board 0x%02x", 
-                        shift_clk[board], board));
+       AliDebugF(30, "Read shift_clk=%d for board 0x%02x", 
+                 shift_clk[board], board);
        break; 
       case 0x26: // FMD: Strips 
        strip_low[board]  = ((data >> 0 ) & 0xFF); 
@@ -1059,8 +1066,8 @@ Bool_t AliFMDRawReader::ReadSODevent(AliFMDCalibSampleRate* sampleRate,
       case 0x2A: break; // FMD: Preamp ref
       case 0x2B: // FMD: Sample clk 
        sample_clk[board] = ((data >> 8 ) & 0xFF); 
-       AliDebug(30,Form("Read sample_clk=%d for board 0x%02x", 
-                        sample_clk[board], board));
+       AliDebugF(30,"Read sample_clk=%d for board 0x%02x", 
+                 sample_clk[board], board);
        break; 
       case 0x2C: break; // FMD: Commands
       case 0x4B: // FMD: Cal events 
@@ -1069,8 +1076,8 @@ Bool_t AliFMDRawReader::ReadSODevent(AliFMDCalibSampleRate* sampleRate,
       default: break;
        
       }
-      AliDebug(50,Form("instruction 0x%x, dataword 0x%x",
-                      instruction,dataWord));
+      AliDebugF(50,"instruction 0x%x, dataword 0x%x",
+               instruction,dataWord);
     } // End of loop over Result memory event
     
     UShort_t det    = 0;
@@ -1118,8 +1125,8 @@ Bool_t AliFMDRawReader::ReadSODevent(AliFMDCalibSampleRate* sampleRate,
            strip_high[boards[i]] = strip_high[boards[idx]];
            pulse_length[boards[i]] = pulse_length[boards[idx]];
            pulse_size[boards[i]] = pulse_size[boards[idx]];
-           AliDebug(3,Form("Vote taken for ddl %d, board 0x%x",
-                           ddl,boards[i]));
+           AliDebugF(3,"Vote taken for ddl %d, board 0x%x",
+                     ddl,boards[i]);
          }
        }
       } 
@@ -1127,13 +1134,13 @@ Bool_t AliFMDRawReader::ReadSODevent(AliFMDCalibSampleRate* sampleRate,
       
       if(sample_clk[boards[i]])
        samplerate = shift_clk[boards[i]]/sample_clk[boards[i]];
-      AliDebug(10,Form("Sample rate for board 0x%02x is %d", 
-                     boards[i], samplerate));
+      AliDebugF(10,"Sample rate for board 0x%02x is %d", 
+               boards[i], samplerate);
       sampleRate->Set(det,ring,sector,0,samplerate);
       stripRange->Set(det,ring,sector,0,
                      strip_low[boards[i]],strip_high[boards[i]]);
       
-      AliDebug(20,Form("det %d, ring %c, ",det,ring));
+      AliDebugF(20,"det %d, ring %c, ",det,ring);
       pulseLength.AddAt(pulse_length[boards[i]],
                        GetHalfringIndex(det,ring,boards[i]/16));
       pulseSize.AddAt(pulse_size[boards[i]],
@@ -1141,14 +1148,14 @@ Bool_t AliFMDRawReader::ReadSODevent(AliFMDCalibSampleRate* sampleRate,
       
       
       
-      AliDebug(20,Form(": Board: 0x%02x\n"
-                      "\tstrip_low  %3d, strip_high   %3d\n"
-                      "\tshift_clk  %3d, sample_clk   %3d\n"
-                      "\tpulse_size %3d, pulse_length %3d",
-                      boards[i], 
-                      strip_low[boards[i]], strip_high[boards[i]],
-                      shift_clk[boards[i]], sample_clk[boards[i]],
-                      pulse_size[boards[i]],pulse_length[boards[i]]));
+      AliDebugF(20,": Board: 0x%02x\n"
+               "\tstrip_low  %3d, strip_high   %3d\n"
+               "\tshift_clk  %3d, sample_clk   %3d\n"
+               "\tpulse_size %3d, pulse_length %3d",
+               boards[i], 
+               strip_low[boards[i]], strip_high[boards[i]],
+               shift_clk[boards[i]], sample_clk[boards[i]],
+               pulse_size[boards[i]],pulse_length[boards[i]]);
     }
     
   }
@@ -1156,7 +1163,7 @@ Bool_t AliFMDRawReader::ReadSODevent(AliFMDCalibSampleRate* sampleRate,
   AliFMDParameters::Instance()->SetSampleRate(sampleRate);
   AliFMDParameters::Instance()->SetStripRange(stripRange);
   
-  AliDebug(0,Form("End of SOD/EOD"));
+  AliDebug(0,"End of SOD/EOD");
   
   return kTRUE;
 }
@@ -1178,7 +1185,7 @@ UInt_t AliFMDRawReader::Get32bitWord(Int_t idx)
   if (index < 4) {
     //  fRawReader->AddFatalErrorLog(k32bitWordReadErr,Form("pos = %d",index));
     //    PrintDebug();
-    AliWarning(Form("Invalid raw data payload position (%d) !",index));
+    AliWarningF("Invalid raw data payload position (%d) !",index);
   }
 
   UInt_t word = 0;
index 7ebf00d..1bd5002 100644 (file)
@@ -333,7 +333,8 @@ AliFMDRawWriter::WriteRCUTrailer(AliAltroBufferV3* altro,
   // WARNING: We store the noise factor in the 2nd baseline
   // filters excluded post samples, since we'll never use that
   // mode. 
-  altro->SetNPostsamples(factor); // 
+  // altro->SetNPostsamples(factor); // 
+  altro->SetNNonZSPostsamples(factor);
   // WARNING: We store the sample rate in the number of pre-trigger
   // samples, since we'll never use that mode.
   altro->SetNPretriggerSamples(rate); // fSampleRate[ddl]
index 8f972d1..efaa656 100644 (file)
@@ -13,7 +13,7 @@
 class AliFMDRecoParam : public AliDetectorRecoParam
 {
 public: 
-  AliFMDRecoParam(Float_t noiseFactor=3, 
+  AliFMDRecoParam(Float_t noiseFactor=4, 
                  Bool_t angleCorrect=kTRUE,
                  Bool_t sharingCorrect=kFALSE);
   virtual ~AliFMDRecoParam() {}
index a230b0c..38bf294 100644 (file)
@@ -188,7 +188,8 @@ AliFMDReconstructor::ConvertDigits(AliRawReader* reader,
     AliError("No digits tree passed");
     return;
   }
-  static TClonesArray* array = new TClonesArray("AliFMDDigit");
+  static TClonesArray* array = 0;
+  if (!array) array = new TClonesArray("AliFMDDigit");
   digitsTree->Branch("FMD", &array);
   array->Clear();
   
@@ -198,14 +199,15 @@ AliFMDReconstructor::ConvertDigits(AliRawReader* reader,
   rawRead.ReadAdcs(array);
 
   Int_t nWrite = digitsTree->Fill();
-  AliFMDDebug(1, ("Got a grand total of %d digits, wrote %d bytes to tree", 
-                  array->GetEntriesFast(), nWrite));
+  AliDebugF(1, "Got a grand total of %d digits, wrote %d bytes to tree", 
+           array->GetEntriesFast(), nWrite);
 
   
   AliFMDAltroMapping* map = AliFMDParameters::Instance()->GetAltroMap();
-  for (size_t i = 1; i <= 3; i++) { 
+  for (UShort_t i = 1; i <= 3; i++) { 
     fZS[i-1]       = rawRead.IsZeroSuppressed(map->Detector2DDL(i));
     fZSFactor[i-1] = rawRead.NoiseFactor(map->Detector2DDL(i));
+    AliDebugF(2, "Noise factor for FMD%hu: %d", i, fZSFactor[i-1]);
   }
 }
 
@@ -320,19 +322,23 @@ AliFMDReconstructor::MarkDeadChannels(AliESDFMD* esd) const
          // Hence, a dead strip will always be marked kInvalid here, 
          // while a non-dead bad-read strip will be filled with 0. 
          if (fBad(d, r, s, t)) { 
-           AliDebug(5, Form("Marking FMD%d%c[%2d,%3d] as bad", d, r, s, t));
+           AliDebugF(5, "Marking FMD%d%c[%2d,%3d] as bad", d, r, s, t);
            esd->SetMultiplicity(d, r, s, t, AliESDFMD::kInvalidMult);
          }         
          if (param->IsDead(d, r, s, t)) { 
-           AliDebug(5, Form("Marking FMD%d%c[%2d,%3d] as dead", d, r, s, t));
+           AliDebugF(5, "Marking FMD%d%c[%2d,%3d] as dead", d, r, s, t);
            esd->SetMultiplicity(d, r, s, t, AliESDFMD::kInvalidMult);
            // esd->SetEta(d, r, s, t, AliESDFMD::kInvalidEta);
          }
          else if (esd->Multiplicity(d, r, s, t) == AliESDFMD::kInvalidMult) {
-           AliDebug(10, Form("Setting null signal in FMD%d%c[%2d,%3d]", 
-                             d, r, s, t));
+           AliDebugF(20, "Setting null signal in FMD%d%c[%2d,%3d]", 
+                     d, r, s, t);
            esd->SetMultiplicity(d, r, s, t, 0);
          }
+         else {
+           AliDebugF(10, "Setting FMD%d%c[%2d,%3d]=%f",d,r,s,t,
+                     esd->Multiplicity(d, r, s, t));
+         }
        }
       }
     }
@@ -500,10 +506,10 @@ AliFMDReconstructor::Reconstruct(TTree* digitsTree,
   fTreeR = clusterTree;
   fTreeR->Branch("FMD", &fMult);
   
-  AliFMDDebug(5, ("Getting entry 0 from digit branch"));
+  AliDebug(5, "Getting entry 0 from digit branch");
   digitBranch->GetEntry(0);
   
-  AliFMDDebug(5, ("Processing digits"));
+  AliDebugF(5, "Processing %d digits", digits->GetEntriesFast());
   UseRecoParam(kTRUE);
   ProcessDigits(digits);
   UseRecoParam(kFALSE);
@@ -579,7 +585,7 @@ AliFMDReconstructor::ProcessDigit(AliFMDDigit* digit) const
   UShort_t sec = digit->Sector();
   UShort_t str = digit->Strip();
   Short_t  adc = digit->Counts();
+  // if (AliLog::GetDebugLevel("FMD","")>3) digit->Print();
   ProcessSignal(det, rng, sec, str, adc);
 }
 
@@ -600,8 +606,13 @@ AliFMDReconstructor::ProcessSignal(UShort_t det,
   //    rng    Strip ID
   //    adc     ADC counts
   // 
+  Int_t  dbg = AliLog::GetDebugLevel("FMD","");
+  Bool_t dhr = dbg > 3 && dbg < 10;
+  if (dhr) printf("FMD%d%c[%2d,%3d] adc=%4d ", det, rng, sec, str, adc);
+  
   if (adc >= AliFMDRawReader::kBadSignal) { 
-    AliFMDDebug(3, ("FMD%d%c[%2d,%3d] is marked bad", det, rng, sec, str));
+    AliFMDDebug(10, ("FMD%d%c[%2d,%3d] is marked bad", det, rng, sec, str));
+    if (dhr) Printf("bad");
     fBad(det,rng,sec,str) = true;
     return;
   }
@@ -609,7 +620,8 @@ AliFMDReconstructor::ProcessSignal(UShort_t det,
   // Check that the strip is not marked as dead 
   AliFMDParameters* param  = AliFMDParameters::Instance();
   if (param->IsDead(det, rng, sec, str)) {
-    AliFMDDebug(3, ("FMD%d%c[%2d,%3d] is dead", det, rng, sec, str));
+    AliFMDDebug(10, ("FMD%d%c[%2d,%3d] is dead", det, rng, sec, str));
+    if (dhr) Printf("dead");
     fBad(det,rng,sec,str) = true;
     return;
   }
@@ -620,12 +632,20 @@ AliFMDReconstructor::ProcessSignal(UShort_t det,
     
   // Substract pedestal. 
   UShort_t counts   = SubtractPedestal(det, rng, sec, str, adc);
-  if(counts == USHRT_MAX) return;
+  if(counts == USHRT_MAX)  { 
+    if (dhr) Printf("invalid");
+    return;
+  }
+  if (dhr) printf("counts=%4d ", counts);
   
     // Gain match digits. 
   Double_t edep     = Adc2Energy(det, rng, sec, str, eta, counts);
   // Get rid of nonsense energy
-  if(edep < 0)  return;
+  if(edep < 0)  { 
+    if (dhr) Printf("zero");
+    return;
+  }
+  if (dhr) printf("edep=%f ", edep);
   
   // Make rough multiplicity 
   Double_t mult     = Energy2Multiplicity(det, rng, sec, str, edep);
@@ -635,7 +655,12 @@ AliFMDReconstructor::ProcessSignal(UShort_t det,
   //               "(ADC: %d, Energy: %f)", det, rng, sec, str, mult, 
   //               counts, edep));
   // }
-  if (mult < 0)  return; 
+  if (mult < 0)  {
+    if (dhr) Printf("not hit");
+    return; 
+  }
+
+  if (dhr) Printf("mult=%f ", mult);
   AliFMDDebug(10, ("FMD%d%c[%2d,%3d]: "
                    "ADC: %d, Counts: %d, Energy: %f, Mult: %f",
                  det, rng, sec, str, adc, counts, edep, mult));
@@ -735,13 +760,13 @@ AliFMDReconstructor::SubtractPedestal(UShort_t det,
   Float_t           ped    = (zsEnabled ? 0 : 
                              param->GetPedestal(det, rng, sec, str));
   Float_t           noise  = param->GetPedestalWidth(det, rng, sec, str);
-  if(ped < 0 || noise < 0) { 
+  if (ped < 0 || noise < 0) { 
     AliWarningClass(Form("Invalid pedestal (%f) or noise (%f) "
                         "for FMD%d%c[%02d,%03d]", 
                    ped, noise, det, rng, sec, str));
     return USHRT_MAX;
   }
-  AliDebugClass(15, Form("Subtracting pedestal for FMD%d%c[%2d,%3d]=%4d "
+  AliDebugClass(10, Form("Subtracting pedestal for FMD%d%c[%2d,%3d]=%4d "
                         "(%s w/factor %d, noise factor %f, "
                         "pedestal %8.2f+/-%8.2f)",
                         det, rng, sec, str, adc, 
@@ -765,8 +790,8 @@ AliFMDReconstructor::SubtractPedestal(UShort_t det,
   //
   // In this way, we make sure that we do not suppress away too much
   // data, and that the read-factor is the most stringent cut. 
-  Float_t nf = TMath::Max(0.F, noiseFactor - (zsEnabled ? zsNoiseFactor : 0));
-  if (counts < noise * nf) counts = 0;
+  Float_t nf = zsNoiseFactor; // TMath::Max(0.F, noiseFactor - (zsEnabled ? zsNoiseFactor : 0));
+  if (counts <= noise * nf) counts = 0;
   if (counts > 0) AliDebugClass(15, "Got a hit strip");
 
   UShort_t ret = counts < 0 ? 0 : counts;
@@ -849,12 +874,12 @@ AliFMDReconstructor::Adc2Energy(UShort_t det,
   Float_t           gain  = param->GetPulseGain(det, rng, sec, str);
   // 'Tagging' bad gains as bad energy
   if (gain < 0) { 
-    AliWarning(Form("Invalid gain (%f) for FMD%d%c[%02d,%03d]", 
-                   gain, det, rng, sec, str));
+    AliDebugF(10, "Invalid gain (%f) for FMD%d%c[%02d,%03d]", 
+               gain, det, rng, sec, str);
     return -1;
   }
-  AliFMDDebug(5, ("Converting counts %d to energy (factor=%f, DAC2MIP=%f)", 
-                 count, gain,param->GetDACPerMIP()));
+  AliDebugF(10, "Converting counts %d to energy (factor=%f, DAC2MIP=%f)", 
+           count, gain,param->GetDACPerMIP());
 
   Double_t edep  = ((count * param->GetEdepMip()) 
                    / (gain * param->GetDACPerMIP()));
@@ -913,8 +938,8 @@ AliFMDReconstructor::Adc2Energy(UShort_t det,
     Double_t theta = 2 * TMath::ATan(TMath::Exp(-eta));
     Double_t corr  = TMath::Abs(TMath::Cos(theta));
     Double_t cedep = corr * edep;
-    AliFMDDebug(10, ("correcting for path %f * %f = %f (eta=%f, theta=%f)",
-                     edep, corr, cedep, eta, theta));
+    AliDebugF(10, "correcting for path %f * %f = %f (eta=%f, theta=%f)",
+             edep, corr, cedep, eta, theta);
     if (fDiagStep3) fDiagStep3->Fill(edep, cedep);  
     edep = cedep;
   }
index 0f0878f..af92981 100644 (file)
@@ -42,9 +42,9 @@ Compile(const char* script=0, Option_t* option="g")
   AddInclude("-I${ALICE_ROOT}/include");
   AddInclude("-I${ALICE_ROOT}/FMD");
   AddInclude("-I${ALICE_ROOT}/geant3/TGeant3");
-  AddInclude("-I${ALICE_ROOT}/../trunk");
-  AddInclude("-I${ALICE_ROOT}/../trunk/FMD");
-  AddInclude("-I${ALICE_ROOT}/../trunk/RAW");
+  AddInclude("-I${ALICE_ROOT}/../master-src");
+  AddInclude("-I${ALICE_ROOT}/../master-src/FMD");
+  AddInclude("-I${ALICE_ROOT}/../master-src/RAW");
   Long_t ret = gROOT->ProcessLine(Form(".L %s+%s", script, option));
   return ret == 0;
 }
index b647b24..c6e30a4 100644 (file)
@@ -1,6 +1,25 @@
 {
   gSystem->Load("libGui");
-  gROOT->LoadMacro("$ALICE_ROOT.trunk/FMD/scripts/Compile.C");
-  Compile("$ALICE_ROOT.trunk/FMD/scripts/DrawCalib.C","g");
+#if 0
+  const char* imgs[] = { 
+    "arrow_down.xpm",
+    "unchecked_t.xpm",
+    0 
+  };
+  const char** pImg = imgs;
+  while (*pImg) { 
+    Info("", "Client %p loading %s", gClient, *pImg);
+    if (!gClient->GetPicture(*pImg)) { 
+      Warning("", "Client %p failed to load %s", gClient, *pImg);
+    }
+    pImg++;
+  }
+#endif
+
+  gROOT->LoadMacro("$ALICE_ROOT/../master-src/FMD/scripts/Compile.C");
+  Compile("$ALICE_ROOT/../master-src/FMD/scripts/DrawCalib.C","g");
+  // gROOT->LoadMacro("DrawCalib.C");
+  // Info("", "Client @ %p", gClient);
+
   DrawCalib();
 }
index 9a20987..0893448 100644 (file)
@@ -17,6 +17,7 @@ class TGMainFrame;
 class TGNumberEntry;
 class TGTextEntry;
 class TGHButtonGroup;
+class TGVButtonGroup;
 class TGCheckButton;
 class TGTextButton;
 class TGLayoutHints;
@@ -25,6 +26,7 @@ class TGLabel;
 class TGHorizontalFrame;
 class AliFMDCalibDrawer;
 class TGGroupFrame;
+
 #endif
 
 
@@ -38,6 +40,8 @@ public:
   TGLabel           fLOCDB;
   TGTextEntry       fOCDB; 
   TGTextButton      fInit;
+  TGHorizontalFrame fBottom;
+  TGGroupFrame      fWhere;
   TGHorizontalFrame fFDet;
   TGLabel           fLDet;
   TGNumberEntry     fDet;
@@ -50,7 +54,7 @@ public:
   TGHorizontalFrame fFStr;
   TGLabel           fLStr;
   TGNumberEntry     fStr;
-  TGHButtonGroup    fSelection;
+  TGVButtonGroup    fSelection;
   TGCheckButton     fPedestal;
   TGCheckButton     fNoise;
   TGCheckButton     fGain;
@@ -70,34 +74,86 @@ public:
   TCanvas*          fCRange;
   TCanvas*          fCThreshold;
 
-  Menu(Int_t runNo)
+  Menu(const Menu&)
+    : fMain(gClient->GetRoot()), 
+      fSetup(&fMain, "Setup", kHorizontalFrame), 
+      fLRun(&fSetup, "Run: "),
+      fRun(&fSetup, 0, 8, -1, TGNumberFormat::kNESInteger,
+          TGNumberFormat::kNEAAnyNumber), 
+      fLOCDB(&fSetup, "OCDB:"),
+      fOCDB(&fSetup, "run"),       
+      fInit(&fSetup, "Init"),
+      fBottom(&fMain),
+      fWhere(&fBottom, "From where", kVerticalFrame),
+      fFDet(&fWhere), 
+      fLDet(&fFDet, "Detector:"),
+      fDet(&fFDet, -1, 1, -1, TGNumberFormat::kNESInteger,
+          TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax,
+          -1, 3), 
+      fFRing(&fWhere),
+      fLRing(&fFRing,"Ring:"),
+      fRing(&fFRing, ""), 
+      fFSec(&fWhere),
+      fLSec(&fFSec,"Sector:"),
+      fSec(&fFSec, -1, 1, -1, TGNumberFormat::kNESInteger,
+          TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax,
+          -1, 39), 
+      fFStr(&fWhere),
+      fLStr(&fFStr,"Strip:"),
+      fStr(&fFStr, -1, 1, -1, TGNumberFormat::kNESInteger,
+          TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax,
+          -1, 511), 
+      fSelection(&fBottom, "what"),
+      fPedestal(&fSelection, "Pedestal"), 
+      fNoise(&fSelection, "Noise"), 
+      fGain(&fSelection, "Gain"), 
+      fDead(&fSelection, "Dead"), 
+      fRate(&fSelection, "Rate"), 
+      fRange(&fSelection, "Range"), 
+      fThreshold(&fSelection, "Threshold"),
+      fDraw(&fMain, "Draw"),
+      fLayout(kLHintsExpandX, 2, 2, 2, 2),
+      fCPedestal(0),
+      fCNoise(0),
+      fCGain(0),
+      fCDead(0),
+      fCRate(0),
+      fCRange(0),
+      fCThreshold(0)
+  {}
+  Menu& operator=(const Menu&) { return *this; }
+  
+
+  Menu(Int_t runNo=0)
     : fMain(gClient->GetRoot()), 
       fSetup(&fMain, "Setup", kHorizontalFrame), 
       fLRun(&fSetup, "Run: "),
       fRun(&fSetup, runNo, 8, -1, TGNumberFormat::kNESInteger,
           TGNumberFormat::kNEAAnyNumber), 
       fLOCDB(&fSetup, "OCDB:"),
-      fOCDB(&fSetup, ""),       
+      fOCDB(&fSetup, "run"),       
       fInit(&fSetup, "Init"),
-      fFDet(&fMain), 
+      fBottom(&fMain),
+      fWhere(&fBottom, "From where", kVerticalFrame),
+      fFDet(&fWhere), 
       fLDet(&fFDet, "Detector:"),
       fDet(&fFDet, -1, 1, -1, TGNumberFormat::kNESInteger,
           TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax,
           -1, 3), 
-      fFRing(&fMain),
+      fFRing(&fWhere),
       fLRing(&fFRing,"Ring:"),
       fRing(&fFRing, ""), 
-      fFSec(&fMain),
+      fFSec(&fWhere),
       fLSec(&fFSec,"Sector:"),
       fSec(&fFSec, -1, 1, -1, TGNumberFormat::kNESInteger,
           TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax,
           -1, 39), 
-      fFStr(&fMain),
+      fFStr(&fWhere),
       fLStr(&fFStr,"Strip:"),
       fStr(&fFStr, -1, 1, -1, TGNumberFormat::kNESInteger,
           TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax,
           -1, 511), 
-      fSelection(&fMain, "what"),
+      fSelection(&fBottom, "what"),
       fPedestal(&fSelection, "Pedestal"), 
       fNoise(&fSelection, "Noise"), 
       fGain(&fSelection, "Gain"), 
@@ -130,12 +186,16 @@ public:
     fFStr.AddFrame(&fLStr,  &fLayout);
     fFStr.AddFrame(&fStr,   &fLayout);
 
+    fWhere.AddFrame(&fFDet,       &fLayout);
+    fWhere.AddFrame(&fFRing,      &fLayout);
+    fWhere.AddFrame(&fFSec,       &fLayout);
+    fWhere.AddFrame(&fFStr,       &fLayout);
+    
+    fBottom.AddFrame(&fWhere,     &fLayout);
+    fBottom.AddFrame(&fSelection, &fLayout);
+
     fMain.AddFrame(&fSetup,      &fLayout);
-    fMain.AddFrame(&fFDet,       &fLayout);
-    fMain.AddFrame(&fFRing,      &fLayout);
-    fMain.AddFrame(&fFSec,       &fLayout);
-    fMain.AddFrame(&fFStr,       &fLayout);
-    fMain.AddFrame(&fSelection,  &fLayout);
+    fMain.AddFrame(&fBottom,     &fLayout);
     fMain.AddFrame(&fDraw,       &fLayout);
 
     fRing.SetAlignment(kTextRight);
@@ -240,19 +300,48 @@ public:
 
       
 void
-DrawCalib()
+DrawCalib(Long_t runNo=145167, const char* store=0)
 {
 #ifdef __CINT__
   gSystem->Load("libFMDutil");
 #endif
 
   AliCDBManager* cdb = AliCDBManager::Instance();
-  // cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
-  // cdb->SetSpecificStorage("FMD/Calib/Pedestal", "local:///mnt/hitachi/ocdb/2011");
-  // cdb->SetSpecificStorage("FMD/Calib/PulseGain",
-  // "local:///mnt/hitachi/ocdb/2011");
-  cdb->SetDefaultStorage("local:///mnt/hitachi/ocdb/2011");
+  if (!store || store[0] == '\0') cdb->SetDefaultStorageFromRun(runNo);
+  else cdb->SetDefaultStorage(store);
+  cdb->SetRun(runNo);
 
-  Menu* m = new Menu(145167);
+  Menu* m = new Menu(runNo);
   // cd->DrawPedestals(d,r,s,t);
 }  
+#ifdef __MAKECINT__
+#pragma link C++ class Menu;
+#endif
+
+#ifndef __CINT__
+#include <TApplication.h>
+#include <cstdlib>
+/*
+  To compile: 
+
+  g++ -c `root-config --cflags --glibs` -L$ALICE_ROOT/lib/tgt_${ALICE_TARGET} \
+    -I${ALICE_ROOT}/include -I../ -lGeom -lMinuit -lPhysics -lVMC -lXMLParser \
+    -lProofPlayer -lSTEERBase -lSTEER -lCDB -lESD -lRAWDatabase -lRAWDatarec \
+    -lANALYSIS -lFMDbase -lFMDrec -lFMDutil DrawCalib.C 
+*/
+
+int main(int argc, char** argv) { 
+  int runNo = 145167;
+  if (argc > 1) runNo = atoi(argv[1]);
+  
+  TApplication app("app", 0, 0);
+
+  DrawCalib(runNo);
+
+  app.Run();
+
+  return 0;
+}
+#endif
+
+  
diff --git a/FMD/scripts/README.md b/FMD/scripts/README.md
new file mode 100644 (file)
index 0000000..d4f927a
--- /dev/null
@@ -0,0 +1,267 @@
+Content of this directory
+=========================
+
+*   `ApplyAlignment.C`
+       Read in the geometry, and get alignment data from CDB, and  apply
+       that to the geometry. 
+*   `CheckAlign.C`
+       Check if alignment is properly applied in simulations 
+*   `CheckCalibData.C`
+       Check if a file contains the right calibration data
+*   `CheckOverlaps.C`
+       Run overlap checker on a loaded geometry 
+*   `CheckRaw.C`
+       Script that contains a class to compare the raw data written to the
+       digits it's created from.
+*   `checkSizes.sh`
+       Obsolete shell script
+*   `Compare.C`
+       Compare energy loss deposition from Fluka and GEANT3.21
+*   `CompareMatDep.C`
+       (obsolete) Compare the secondary correction from variations in
+       material density 
+*   `CompareTrackRefsAndHits.C`
+       Compare number of track references and hits from simulation
+*   `Compile.C`
+       Compile other scripts using AcLIC
+*   `Convert2Raw.C`
+       Convert digits to raw data using AliFMDRawWriter 
+*   `ConvertGeom.C`
+       Write out all medium parameters in geometry 
+*   `deadChannels.C`
+       (obsolete) Extract the dead channel information from OCDB files 
+*   `Digits2Raw.C`
+       (obsolete) Convert digits to raw data using AliFMD
+*   `DisplayDigits.C`
+       Show digits using AliFMDDisplay 
+*   `DisplayESD.C`
+       Show ESD info using AliFMDDisplay 
+*   `DisplayHits.C`
+       Show MC Hit info using AliFMDDisplay 
+*   `DisplayRecs.C`
+       Show RecPoint info using AliFMDDisplay 
+*   `Document.C`
+       (obsolete) Use THtml to document the FMD code
+*   `DoDrawCalib.C`
+       Script that calls DrawCalib 
+*   `DrawBothDigits.C`
+       Draw Digits versus SDigits using AliFMDInput 
+*   `DrawCalib.C`
+       GUI to draw calibrations 
+*   `DrawCalibRaw.C`
+       Draw ELoss dist from calibrated raw data using AliFMDInput
+*   `DrawDigits.C`
+       Draw the ELoss from digits using AliFMDInput 
+*   `DrawDigitsRecs.C`
+       Draw the ELoss from digits versus multiplicity from rec points
+       using AliFMDInput 
+*   `DrawESD.C`
+       Draw the ELoss dist from ESDs using AliFMDInput - somewhat obsolete
+*   `DrawGeometry.C`
+       Draw the geometry 
+*   `DrawHits.C`
+       Draw the ELoss dist versus beta=p/m from MC hits
+*   `DrawHitsDigits.C`
+       Draw the MC ELoss versus ADCs 
+*   `DrawHitsRecs.C`
+       Draw the MC ELoss versus "multiplicity" 
+*   `DrawHitsSDigits.C`
+       Draw the MC ELoss versus sum-able ADCs 
+*   `DrawLego.C`
+       Draw summary LEGO (absorbtion, radiation length, ...) plots 
+*   `DrawSDigits.C`
+       Draw the sum-able ADCs 
+*   `DrawTrackRefs.C`
+       Draw number of track references in each ring 
+*   `DrawXsection.C`
+       Draw the x-section for ELoss from GEANT3.21 X-section run 
+*   `Dummy.C`
+       Make dummy detector classes 
+*   `DummyConfig.C`
+       An MC configuration that does no stepping in anything but FMD
+*   `dump10bit.C`
+       Dump 10bit words from a DDL file 
+*   `ESDDataSize.C`
+       Estimate the size of the FMD ESD object 
+*   `esdQA.C`
+       (obsolete) Do an ESD QA run 
+*   `FancyDigits.C`
+       Fancy display of digits using AliFMDFancy
+*   `FancyHits.C`
+       Fancy display of MC hits using AliFMDFancy
+*   `FindCommonModeNoise.C`
+       Script to estimate the common mode noise
+*   `FixOCDBEntries.C`
+       Script to correct OCDB objects according to file name 
+*   `FullMapping.C`
+       Map from Hardware address to XYZ coordinates 
+*   `GeoGeometry.C`
+       Script I used for rapid prototyping of the FMD3 geometry - in
+       particular the support cone 
+*   `GetMedia.C`
+       Script that contains a class to get the media where a certain track
+       was created.   This is used for background studies. 
+*   `GetXsection.C`
+       Script to get the various cross sections, energy loss, and ranges
+       of a particular particle type in a particular medium.  See also
+       DrawXsecttion.C 
+*   `Hits2Digits.C`
+       (obsolete) Convert MC hits to digits using AliFMD
+*   `Hits2SDigits.C`
+       (obsolete) Convert MC hits to sum-able digits using AliFMD
+*   `LoadDummy.C`
+       Load the Dummy detector class 
+*   `MakeAlignment.C`
+       Make the default alignment 
+*   `MakeCalibration.C`
+       Make dummy calibrations 
+*   `MakeFakeDigits.C`
+       Make some fake digits 
+*   `MakeFakeHits.C`
+       Make some fake hits 
+*   `MakeLego.C`
+       Create LEGO plots from geometry 
+*   `makelego.sh`
+       Steer running MakeLego.C and DrawLego.C 
+*   `MakeMap.C`
+       Script to make a class derived from AliFMDMap. 
+*   `MakeRecoParam.C`
+       Make default reconstruction parameters 
+*   `MakeResidualAlignment.C`
+       Make fake residual alignment data.
+*   `MakeSpectra.C`
+       Compile ELoss spectra in output file 
+*   `MakeXsection.C`
+       Steer generation of X-section data (see GetXsection and DrawXsection)
+*   `MediaTable.C`
+       Script to make a file with a list of medium numbers for all active
+       detectors.
+*   `NodeGeometry.C`
+       Script I used for rapid prototyping of the FMD3 geometry - in
+       particular the support cone 
+*   `PatternDigits.C`
+       Display the pattern of digits 
+*   `PatternESD.C`
+       Display the pattern of ESD information 
+*   `PatternHits.C`
+       Display the pattern of MC hits
+*   `PatternRaw.C`
+       Display the pattern of Raw digits
+*   `PatternRecs.C`
+       Display the pattern of RecPoints
+*   `PatternSDigits.C`
+       Display the pattern of MC sum-able digits
+*   `pdc06_config.C`
+       MC config 
+*   `pdc06_rec.C`
+       MC reconstruction 
+*   `pdc06_sim.C`
+       MC simulation
+*   `Poisson.C`
+       Script that illustrates the poisson Nch estimation from ESD 
+*   `PoissonHit.C`
+       Check Poisson estimate of Nch versus hits 
+*   `polar.C`
+       A test 
+*   `PrintAlignment.C`
+       Print alignment data
+*   `PrintCalibration.C`
+       Print OCDB calibration data
+*   `PrintSensorVertices.C`
+       Print senser vertices from geometry 
+*   `Raw2ESD.C`
+       Convert raw data to ESD using the AliFMDReconstructor 
+*   `RawTest.C`
+       (obsolete) Small script to test consistency of writing and
+       reading raw data. 
+*   `ReadRaw.C`
+       Read raw data using AliRawReader and AliFMDRawReader 
+*   `Resolution.C`
+       Plot resolution of sensors 
+*   `RunAnaESD.C`
+       (obsolete) Run analysis over ESD 
+*   `RunAnaKine.C`
+       (obsolete) Run analysis over MC data
+*   `RunQATest.C`
+       Run a test of QA framework
+*   `RunSimpleChain.C`
+       A script that will run the most simple chain possible.  Uses:
+        - MakeFakeHits.C
+        - Hits2Digits.C
+        - Hits2SDigits.C
+        - Digits2Raw.C
+        - Raw2ESD.C 
+*   `ShowCoordinates.C`
+      A script to dump the physical coordinates as given by the
+      geometry.
+*   `ShowFMDITS.C`
+      Draw FMD and ITS geometry 
+*   `SpectraMonitor.C`
+      Monitor data 
+*   `TestAcc.C`
+      Acceptance correction from strip length 
+*   `TestAlignable.C`
+      Test align-able volumes 
+*   `TestAltroMapping.C`
+      Check integrety of Hardware2Detector and Detector2Hardware
+*   `TestESD.C`
+      Test Read/Write of AliESDFMD object 
+*   `TestESDCompat.C`
+      Same as above 
+*   `TestESDPhi.C`
+      Test the geometry from ESD and from full geometry 
+*   `TestFloatMap.C`
+      Test I/O of floating point FMD map 
+*   `TestGainDA.C`
+      Run the gain DA
+*   `TestHWMap.C`
+      Test hardware address map by converting from detector coordinates
+      to hardware address and then back again.
+*   `TestIndex.C`
+      Test of AliFMDIndex and AliFMDObjIndex 
+*   `TestMapAccess.C`
+      Test of ForAll access to AliFMDMap 
+*   `TestMapAlgebra.C`
+      Test algebra on map 
+*   `TestMap.C`
+      Test I/O of ALiFMDMap
+*   `TestMapIO.C`
+      Test I/O of ALiFMDMap
+*   `TestPedestalDA.C`
+      Run the pedestal DA
+*   `TestPreprocessor.C`
+      Test the SHUTTLE pre-processor using fake data
+*   `TestRaw2SDigits.C`
+      Test creation of sum-able digits using AliSimulation 
+*   `TestRawIO.C`
+      Test I/O of raw data using AliFMDRawWriter and AliFMDRawReader 
+*   `TestRawReader.C`
+      Check iterative usage of AliFMDRawReader 
+*   `TestShaping.C`
+      Create an example shaping curve 
+*   `TestSurveyToAlignObjs.C`
+      Convert survey data into alignment objects 
+*   `TestZeroSuppress.C`
+      Test the zero-suppression filter of AliFMDRawWriter 
+*   `VA1Response.C`
+      Script to try to fit the reponse function of the VA1 signals, based
+      on a finite number of ALTRO samples. 
+*   `VA1Train.C`
+      Small script that shows a signal train from a VA1 pre-amp.
+*   `Wafer.C`
+      Small script that I used to make some intial testing of the wafer
+      layout and geometry. 
+*   `WriteMedArrays.C`
+      Write medium map 
+*   `XSection.C`
+       Script to get the various cross sections, energy loss, and ranges
+       of a particular particle type in a particular medium. 
+*   `dqm`
+    *   `fmd_online.C`
+             Event display using EVE 
+    *   `PatternCalib.C`
+             Event display using AliFMDPattern 
+    *   `PatternRaw.C`
+             Event display using AliFMDPattern     
+    *   `SpectraRaw.C`
+             Event display using AliFMDPattern 
index f90d9ae..c575115 100644 (file)
@@ -1,25 +1,46 @@
+/**
+ * @file   Raw2ESD.C
+ * @author Christian Holm Christensen <cholm@nbi.dk>
+ * @date   Wed Apr 23 15:06:55 2014
+ * 
+ * @brief  Convert from raw data to ESD using the AliFMDReconstructor
+ * 
+ * 
+ */
+/** 
+ * Default input file 
+ * @ingroup FMD_script
+ */
+const char* df = "/data/alice/data/pp/LHC10c/raw/118561/physics_118561.root";
+
+/** 
+ * Convert from raw data to ESD using the AliFMDReconstructor.  This
+ * illustrates the passes done in the official reconstruction.
+ * 
+ * @param file   Input raw data
+ * @param nEv    Number of events to process (<=0 means all)
+ * @param skip   Number of events to skip 
+ * @param debug  Debug level
+ *
+ * @ingroup FMD_script
+ */
 void
-Raw2ESD(const char* file="")
+Raw2ESD(const char* file=df, Int_t nEv=10, Int_t skip=300, Int_t debug=0)
 {
-  AliCDBManager::Instance()->SetRun(0);
-  AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
+  // AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
+  AliCDBManager::Instance()->SetRun(118561);
+  AliCDBManager::Instance()->SetDefaultStorageFromRun(118561);
   AliGeomManager::LoadGeometry("geometry.root");
 
-  AliRawReader* reader = 0;
-  TString rawFile(file);
-  if (rawFile.IsNull() && rawFile.EndsWith(".root")) 
-      reader = new AliRawReaderRoot(rawFile.Data());
-  else if (!rawFile.IsNull() && rawFile.EndsWith(".raw"))
-    reader = new AliRawReaderDate(rawFile.Data());
-  else
-    reader = new AliRawReaderFile(-1);
-  
-  AliFMDReconstructor* reco = new AliFMDReconstructor();
+  AliRawReader*        reader  = AliRawReader::Create(file);
+  AliFMDReconstructor* reco    = new AliFMDReconstructor();
+  reco->SetDiagnose(debug > 5);
   reco->Init();
 
+  AliLog::SetModuleDebugLevel("FMD", debug);
+
   Int_t        event       = 0;
   TFile*       digitFile   = TFile::Open("reco_digits.rot", "RECREATE");
-  TTree*       digitTree   = new TTree("digit", "FMD digits");
 
   TFile*       clusterFile   = TFile::Open("FMD.RecPoints.root", "RECREATE");
   TTree*       clusterTree = new TTree("cluster", "FMD digits");
@@ -27,19 +48,36 @@ Raw2ESD(const char* file="")
   TFile*       esdFile     = TFile::Open("AliESDs.root", "RECREATE");
   TTree*       esdTree     = new TTree("esdTree", "ESD Treee");
   AliESDEvent* esd         = new AliESDEvent();
+
   esd->CreateStdContent();
   esd->WriteToTree(esdTree);
   while ((reader && reader->NextEvent())) {
+    event++;
+    // Check for skip events 
+    if (skip > 0 && (event - skip) < 0) continue;
+    // Check if we got enough events 
+    if (nEv > 0 && (event-skip) > nEv) continue;
+
+    digitFile->cd();
+    TTree* digitTree  = new TTree("digit", "FMD digits");
+    
+    // Convert to digits first 
     reco->ConvertDigits(reader, digitTree);
+
+    // Reconstruct to RecPoints 
     reco->Reconstruct(digitTree, clusterTree);
 
-    esd->SetRunNumber(0);
-    esd->SetEventNumberInFile(event);
+    // Set stuff on the ESD 
+    esd->SetRunNumber(AliCDBManager::Instance()->GetRun());
+    esd->SetEventNumberInFile(event-1);
+    
+    // Fill the ESD objet and write to file 
     reco->FillESD((TTree*)0, (TTree*)0, esd);
     esdTree->Fill();
     esd->Reset();
-    
-    event++;    
+
+    digitFile->Write();
+    delete digitTree;
   }
   esdFile->Write();
 }
index 29300f0..d3e1a01 100644 (file)
@@ -3,13 +3,22 @@
     @date    Tue Mar 28 12:39:08 2006
     @brief   Script to read raw data 
 */
-/** @ingroup FMD_script
-    @brief Read raw data into a TClonesArray - for testing 
+/** 
+ * Default input file 
+ * @ingroup FMD_script
+ */
+const char* df = "/data/alice/data/pp/LHC10c/raw/118561/physics_118561.root";
+/** 
+ * @brief Read raw data into a TClonesArray - for testing 
+ * 
+ * @param file   Input raw data
+ * @param nEv    Number of events to process (<=0 means all)
+ * @param skip   Number of events to skip 
+ * @param debug  Debug level
  */
 void
-ReadRaw(const char* src=0, Int_t nEv=0, Int_t skip=0, Bool_t verb=false)
+ReadRaw(const char* src=df, Int_t nEv=10, Int_t skip=300, Int_t debug=4)
 {
-  // AliLog::SetModuleDebugLevel("FMD", 10);
 
   AliCDBManager* cdb = AliCDBManager::Instance();
   cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
@@ -18,7 +27,8 @@ ReadRaw(const char* src=0, Int_t nEv=0, Int_t skip=0, Bool_t verb=false)
   AliRawReader*    reader    = AliRawReader::Create(src);
   AliFMDRawReader* fmdReader = new AliFMDRawReader(reader, 0);
   TClonesArray*    array     = new TClonesArray("AliFMDDigit", 0);
-  fmdReader->SetVerbose(verb);
+  fmdReader->SetVerbose(debug > 0);
+  AliLog::SetModuleDebugLevel("FMD", debug);
 
   Int_t evCnt = 0;
   while (reader->NextEvent()) {