Fixs for the the DAs. Prevent tiresome clean-up and
authorcholm <Christian.Holm.Christensen@cern.ch>
Fri, 13 Feb 2015 15:00:53 +0000 (16:00 +0100)
committercholm <Christian.Holm.Christensen@cern.ch>
Fri, 13 Feb 2015 15:00:53 +0000 (16:00 +0100)
double deletes by calling _exit at end of process.  Base DA
exists earlier.

Add shell script to build DAs with dynamic linking.

12 files changed:
FMD/DA/CMakeLists.txt
FMD/DA/FMDBaseda.cxx
FMD/DA/FMDGainda.cxx
FMD/DA/FMDPedestalda.cxx
FMD/DA/FMDUtilda.h
FMD/DA/build.sh [new file with mode: 0755]
FMD/FMDutil/AliFMDBaseDA.cxx
FMD/FMDutil/AliFMDBaseDA.h
FMD/FMDutil/AliFMDGainDA.cxx
FMD/FMDutil/AliFMDGainDA.h
FMD/FMDutil/AliFMDPedestalDA.cxx
FMD/FMDutil/AliFMDPedestalDA.h

index 94ba65b..1a91f3e 100644 (file)
@@ -14,7 +14,7 @@
 # **************************************************************************
 
 # Module include folder
-include_directories(${AliRoot_SOURCE_DIR}/ACORDE/DA)
+include_directories(${AliRoot_SOURCE_DIR}/FMD/DA)
 
 # Additional include folders in alphabetical order
 include_directories(
index c472c85..2047c6b 100644 (file)
@@ -1,8 +1,7 @@
 /*
-
   FMD DA for online calibration of conditions
 
-  Contact:                 canute@nbi.dk
+  Contact:                 christian.holm.christensen@cern.ch
   Link:                    fmd.nbi.dk/fmd/offline
   Run Type:                PHYSICS
   DA Type:                 MON
@@ -59,8 +58,6 @@ int main(int argc, char **argv)
 
   AliFMDParameters::Instance()->Init(kFALSE,0);
   AliFMDParameters::Instance()->UseCompleteHeader(old);
-  struct eventHeaderStruct *event;
-  int status;
 
   Int_t  debugLevel = 0;
   Bool_t badOption  = false;
@@ -97,7 +94,7 @@ int main(int argc, char **argv)
     printf("%s: No data source specified\n", argv[0]);
     return -1;
   }
-  status=monitorSetDataSource(source);
+  int status=monitorSetDataSource(source);
   if (status!=0) {
     printf("monitorSetDataSource() failed for %s: %s\n",
           source, monitorDecodeError(status));
@@ -115,45 +112,46 @@ int main(int argc, char **argv)
   monitorSetNowait();
   monitorSetNoWaitNetworkTimeout(1000);
 
-  AliRawReader *reader = 0;
-  AliFMDBaseDA baseDA;
-  Int_t  retval = 0;
-  Int_t iev = 0;
-  Bool_t SODread = kFALSE;
-  while(!SODread && iev<1000) {
+  AliRawReader* reader  = 0;
+  AliFMDBaseDA  baseDA;
+  Int_t         retval  = 0;
+  Int_t         iev     = 0;
+  Bool_t        sodSeen = kFALSE;
+  while(!sodSeen && iev<1000) {
     
     /* check shutdown condition */
-    if (daqDA_checkShutdown()) {break;}
+    if (daqDA_checkShutdown()) break;
     
     /* get next event (blocking call until timeout) */
-    status=monitorGetEventDynamic((void **)&event);
-    if (status==MON_ERR_EOF) {
+    struct eventHeaderStruct *event = 0;    
+    status = monitorGetEventDynamic((void **)&event);
+    if (status == MON_ERR_EOF) {
       printf ("End of File detected\n");
       break; /* end of monitoring file has been reached */
     }
     
-    if (status!=0) {
+    if (status != 0) {
       printf("monitorGetEventDynamic() failed : %s\n",
             monitorDecodeError(status));
       break;
     }
     
     /* retry if got no event */
-    if (event==NULL) {
-      continue;
-    }
+    if (!event) continue;
     
     iev++; 
     
-    switch (event->eventType){
-      
+    switch (event->eventType) {
     case START_OF_DATA:
+      std::cout << "Got START OF DATA event" << std::endl;
       reader = new AliRawReaderDate((void*)event);
-      baseDA.Run(reader);
-      SODread = kTRUE;
+      baseDA.Run(reader, true);
+      sodSeen = kTRUE;
+      std::cout << "Pushing to FXS" << std::endl;
       retval = 
        daqDA_FES_storeFile("conditions.csv", 
-                           AliFMDParameters::Instance()->GetConditionsShuttleID());
+                           AliFMDParameters::Instance()
+                           ->GetConditionsShuttleID());
       if (retval != 0) std::cerr << "Base DA failed" << std::endl;
       
       break;
@@ -163,7 +161,10 @@ int main(int argc, char **argv)
     
     }
   }
+  std::cout << "End of FMD-Base - return " << retval << std::endl;
    
   return retval;
 }
+//
+// EOF
+// 
index 5a18972..a404d6a 100644 (file)
@@ -28,6 +28,7 @@ int main(int argc, char **argv)
 #ifdef ALI_AMORE
   gainDA.SetMakeSummaries(kTRUE);
 #endif
+  std::cout << "Running Gain DA" << std::endl;
   r.Exec(gainDA);
 
   const char* files[] = { "conditions.csv", 
@@ -42,6 +43,7 @@ int main(int argc, char **argv)
 
   PostSummaries(gainDA, "gain", r.RunNumber());
 
+  std::cout << "End of FMD-Gain, return " << ret << std::endl;
   return ret;
 }
 //
index 0ce1d53..96e0411 100644 (file)
 */
 #include <AliFMDPedestalDA.h>
 #include <AliFMDParameters.h>
+#include <TROOT.h>
+#include <TApplication.h>
 #include "FMDUtilda.h"
 #include <iostream>
+#include <unistd.h>
 
 int main(int argc, char **argv) 
 {
@@ -27,6 +30,7 @@ int main(int argc, char **argv)
 #ifdef ALI_AMORE
   pedDA.SetMakeSummaries(kTRUE);
 #endif
+  std::cout << "Eecuting pedestal DA" << std::endl;
   r.Exec(pedDA);
 
   const char* files[] = { "conditions.csv", 
@@ -40,7 +44,13 @@ int main(int argc, char **argv)
   if(ret > 0) std::cerr << "Pedestal DA failed" << std::endl;
 
   PostSummaries(pedDA, "ped", r.RunNumber());
-  
+
+  std::cout << "End of FMD-Gain, return " << ret << std::endl;
+  gROOT->SetMustClean(false);
+
+  std::cout << "Now calling _Exit(" << ret << ") to finish NOW!" << std::endl;
+  _exit(ret);
+
   return ret;
 }
 //
index e093451..07ff8ac 100644 (file)
 #endif
 
 void
-PostSummaries(AliFMDBaseDA& da, const char* prefix, Int_t runNumber)
+PostSummaries(AliFMDBaseDA& da, const char* prefix, Int_t runNumber, bool verb=true)
 {
 #ifndef ALI_AMORE
   std::cerr << "AMORE not found - nothing posted" << std::endl;
   return;
 #else
+  if (verb) 
+    std::cout << "Posting " << prefix << " data to AMORE" << std::endl;
   try { 
     TString daName(gSystem->Getenv("AMORE_DA_NAME"));
     if (daName.IsNull()) { 
@@ -30,38 +32,66 @@ PostSummaries(AliFMDBaseDA& da, const char* prefix, Int_t runNumber)
       if (!da.HasSeenDetector(det)) continue;
       TObject* runNo = new TObject;
       runNo->SetUniqueID(runNumber);
+      if (verb)
+       std::cout << " Posting " << prefix << "RuNoFMD" << det << " ... "
+                 << std::flush;
       myAmore.Send(Form("%sRunNoFMD%d", prefix, det), runNo);
+      if (verb) 
+       std::cout << "done" << std::endl;
     }
     
     TIter     next(&da.GetSummaries());
+    if (verb) {
+      std::cout << " Will post summaries: " << std::endl;
+      da.GetSummaries().ls();
+    }
     TObject*  obj = 0;
-    while ((obj = next())) 
+    while ((obj = next())) {
+      if (verb)
+       std::cout << " Posting " << obj->GetName() 
+                 << " ... " << std::flush;
       myAmore.Send(obj->GetName(), obj);
+      if (verb) 
+       std::cout << "done" << std::endl;
+    }
     
   }
   catch (std::exception& e) {
     std::cerr << "Failed to make AMORE instance: " << e.what() << std::endl;
   }
+  if (verb) 
+    std::cout << "All objects posted to AMORE" << std::endl;
 #endif
 }
 
 Int_t
-UploadFiles(const char** files, const char** ids)
+UploadFiles(const char** files, const char** ids, bool verb=true)
 {
   const char** pFile = files; 
   const char** pId   = ids; 
 
+  if (verb) 
+    std::cout << "Uploading files to FXS" << std::endl;
   Int_t ret = 0;
-  while (*pFile && *pId) { 
+  while (*pFile && *pId) {
+    if (verb) 
+      std::cout << " Upload " << *pFile << " (" << *pId << ") ... " << std::flush;
     Int_t lret = daqDA_FES_storeFile(*pFile, *pId);
     if (lret != 0) {
+      if (verb) 
+       std::cout << "failed" << std::endl;
       std::cerr << "Failed to upload " << *pFile << " to FES id " 
                << *pId << std::endl;
       ret++;
     }
+    if (verb)
+      std::cout << "done" << std::endl;
     pFile++;
     pId++;
   }
+  if (verb)
+    std::cout << "Done uploading with " << ret 
+             << " errors" << std::endl;
   return ret;
 }
 
diff --git a/FMD/DA/build.sh b/FMD/DA/build.sh
new file mode 100755 (executable)
index 0000000..6b1f54b
--- /dev/null
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+tgt=$1 ; shift
+if test "x$tgt" = "x" ;then 
+    tgt=FMDPedestalda
+fi
+
+
+dateCFlags=`/opt/date/.commonScripts/date-config --cflags | sed "s/long' 'long/long\\ long/"`
+dateLibs=`/opt/date/.commonScripts/date-config --monitorlibs`
+amoreCFlags=`/opt/amore/bin/amore-config --includes`
+amoreLibs=`/opt/amore/bin/amore-config --auxlibs`
+rootCFlags=`root-config --cflags`
+rootLibs=`root-config --libs`
+dateCFlags=`echo $dateCFlags | sed 's/-Dlong64="long long"//'`
+aliSrc=$HOME/source
+aliBuild=$HOME/build
+aliLibs="
+    -I${aliSrc}/FMD/FMDrec -L${aliBuild}/FMD/FMDrec -lFMDrec \
+    -I${aliSrc}/FMD/FMDsim -L${aliBuild}/FMD/FMDsim -lFMDsim \
+    -I${aliSrc}/FMD/FMDutil -L${aliBuild}/FMD/FMDutil -lFMDutil \
+    -I${aliSrc}/FMD/FMDbase -L${aliBuild}/FMD/FMDbase -lFMDbase \
+    -I${aliSrc}/ANALYSIS/ANALYSIS -L${aliBuild}/ANALYSIS/ANALYSIS -lANALYSIS \
+    -I${aliSrc}/RAW/RAWDatarecOnline  -L${aliBuild}/RAW/RAWDatarecOnline  -lRAWDatarecOnline  \
+    -I${aliSrc}/RAW/RAWDatarec  -L${aliBuild}/RAW/RAWDatarec  -lRAWDatarec  \
+    -I${aliSrc}/RAW/RAWDatasim  -L${aliBuild}/RAW/RAWDatasim  -lRAWDatasim  \
+    -I${aliSrc}/RAW/RAWDatabase -L${aliBuild}/RAW/RAWDatabase -lRAWDatabase \
+    -I${aliSrc}/HLT/BASE/HOMER -L${aliBuild}/HLT/BASE/HOMER -lAliHLTHOMER \
+    -I${aliSrc}/HLTb/BASE -L${aliBuild}/HLT/BASE -lHLTbase \
+    -I${aliSrc}/STEER/STEER -L${aliBuild}/STEER/STEER -lSTEER \
+    -I${aliSrc}/STEER/CDB  -L${aliBuild}/STEER/CDB  -lCDB  \
+    -I${aliSrc}/STEER/ESD -L${aliBuild}/STEER/ESD -lESD \
+    -I${aliSrc}/STEER/STEERBase -L${aliBuild}/STEER/STEERBase -lSTEERBase \
+"
+echo "dateCFlags=$dateCFlags"
+set -x
+g++ -DALI_AMORE \
+    ${dateCFlags} \
+    -Dlong64="long long" \
+    ${amoreCFlags} \
+    ${rootCFlags} \
+    -I/opt/daqDA-lib/ -L /opt/daqDA-lib \
+    -I$ALICE_ROOT/include -L$ALICE_ROOT/lib  \
+    ${aliLibs} \
+    -lRMySQL \
+    ${rootLibs} \
+    $@ \
+    ${tgt}.cxx \
+    ${amoreLibs} \
+    ${dateLibs} \
+    -ldaqDA \
+    -o ${tgt}_dyn
+
index 8e813ec..2ebb025 100644 (file)
@@ -1,4 +1,4 @@
-/**************************************************************************
+ /**************************************************************************
  * Copyright(c) 2004, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
  * Author: The ALICE Off-line Project.                                    *
@@ -54,7 +54,7 @@ ClassImp(AliFMDBaseDA)
 #endif
 
 //_____________________________________________________________________
-const char*
+TString
 AliFMDBaseDA::GetStripPath(UShort_t det, 
                           Char_t   ring, 
                           UShort_t sec, 
@@ -72,12 +72,12 @@ AliFMDBaseDA::GetStripPath(UShort_t det,
   // 
   // Return 
   //     The path
-  return Form("%s%sFMD%d%c[%02d,%03d]", 
-             (full ? GetSectorPath(det, ring, sec, full) : ""), 
-             (full ? "/" : ""), det, ring, sec, str);
+  return TString::Format("%s%sFMD%d%c[%02d,%03d]", 
+                        (full ? GetSectorPath(det, ring, sec, full).Data() : ""), 
+                        (full ? "/" : ""), det, ring, sec, str);
 }
 //_____________________________________________________________________
-const char*
+TString
 AliFMDBaseDA::GetSectorPath(UShort_t det, 
                            Char_t   ring, 
                            UShort_t sec, 
@@ -94,12 +94,12 @@ AliFMDBaseDA::GetSectorPath(UShort_t det,
   // 
   // Return 
   //     The path
-  return Form("%s%sFMD%d%c[%02d]", 
-             (full ? GetRingPath(det, ring, full) : ""), 
-             (full ? "/" : ""), det, ring, sec);
+  return TString::Format("%s%sFMD%d%c[%02d]", 
+                        (full ? GetRingPath(det, ring, full).Data() : ""), 
+                        (full ? "/" : ""), det, ring, sec);
 }
 //_____________________________________________________________________
-const char*
+TString
 AliFMDBaseDA::GetRingPath(UShort_t det, 
                          Char_t   ring, 
                          Bool_t   full) const
@@ -115,12 +115,12 @@ AliFMDBaseDA::GetRingPath(UShort_t det,
   // 
   // Return 
   //     The path
-  return Form("%s%sFMD%d%c", 
-             (full ? GetDetectorPath(det, full) : ""), 
-             (full ? "/" : ""), det, ring);
+  return TString::Format("%s%sFMD%d%c", 
+                        (full ? GetDetectorPath(det, full).Data() : ""), 
+                        (full ? "/" : ""), det, ring);
 }
 //_____________________________________________________________________
-const char*
+TString
 AliFMDBaseDA::GetDetectorPath(UShort_t det, 
                              Bool_t   full) const
 {
@@ -135,9 +135,9 @@ AliFMDBaseDA::GetDetectorPath(UShort_t det,
   // 
   // Return 
   //     The path
-  return Form("%s%sFMD%d", 
-             (full ? fDiagnosticsFilename.Data() : ""), 
-             (full ? ":/" : ""), det);
+  return TString::Format("%s%sFMD%d", 
+                        (full ? fDiagnosticsFilename.Data() : ""), 
+                        (full ? ":/" : ""), det);
 }
 
 //_____________________________________________________________________
@@ -190,6 +190,10 @@ AliFMDBaseDA::AliFMDBaseDA(const AliFMDBaseDA & baseDA) :
   }
 
   fDetectorArray.SetOwner();  
+  fDetectorArray.ResetBit(TObject::kMustCleanup);
+  fSummaries.ResetBit(TObject::kMustCleanup);
+  fDetectorArray.ResetBit(TObject::kIsOnHeap);
+  fSummaries.ResetBit(TObject::kIsOnHeap);
 }
 
 
@@ -197,6 +201,11 @@ AliFMDBaseDA::AliFMDBaseDA(const AliFMDBaseDA & baseDA) :
 AliFMDBaseDA::~AliFMDBaseDA() 
 {
   //destructor
+  // fDetectorArray.ls();
+  // fSummaries.ls();
+  // fDetectorArray.SetOwner(false);
+  // fSummaries.SetOwner(false);
+
 }
 
 //_____________________________________________________________________
@@ -231,7 +240,7 @@ UShort_t AliFMDBaseDA::GetProgress(Int_t nEvents) const
 }
 
 //_____________________________________________________________________
-void AliFMDBaseDA::Run(AliRawReader* reader) 
+void AliFMDBaseDA::Run(AliRawReader* reader, Bool_t isBase) 
 {
   //Run the FMD DA
   TFile* diagFile = 0;
@@ -259,12 +268,13 @@ void AliFMDBaseDA::Run(AliRawReader* reader)
        eventType == AliRawEventHeaderBase::kFormatError) { 
       
       WriteConditionsData(fmdReader);
-      Init();
       sodread = kTRUE;
       break;
     }
   }
-  
+  if (isBase) return;
+
+  Init();
   InitContainer(diagFile);
   if (AliLog::GetDebugLevel("FMD","") >= 3) { 
     fDetectorArray.ls();
@@ -274,21 +284,21 @@ void AliFMDBaseDA::Run(AliRawReader* reader)
     AliWarning("No SOD event detected!");
   
   int lastProgress = 0;
-  
+
   for(Int_t i = 0; i< 3;i++) fNEventsPerDetector[i] = 0;
 
   for(Int_t n = 1; !HaveEnough(n); n++) {
-    AliInfoF("Get the next event %d", n);
+    AliDebugF(1,"Get the next event %d", n);
     if(!reader->NextEvent()) { n--; continue; }
     UInt_t eventType = reader->GetType();
-    AliInfoF("Event type is %d", eventType);
+    AliDebugF(3, "Event type is %d", eventType);
     if(eventType != AliRawEventHeaderBase::kPhysicsEvent) { n--; continue; }
 
+    Bool_t seen[] = { false, false, false };
     SetCurrentEvent(n);
     digitArray->Clear();
     fmdReader->ReadAdcs(digitArray);
-    
-    Bool_t seen[] = { false, false, false };
+  
     for(Int_t i = 0; i<digitArray->GetEntriesFast();i++) {
       AliFMDDigit* digit = static_cast<AliFMDDigit*>(digitArray->At(i));
       UShort_t det = digit->Detector();
@@ -299,17 +309,16 @@ void AliFMDBaseDA::Run(AliRawReader* reader)
       if (Int_t(fNEventsPerDetector[det-1]) < GetRequiredEvents()) 
        FillChannels(digit);
     }
-    
     for(Int_t i = 0; i< 3;i++) 
       if (seen[i]) (fNEventsPerDetector[i])++;
       
     FinishEvent();
     
     Int_t nReq = GetRequiredEvents();
-    AliInfoF("%9d: %6d/%6d %6d/%6d %6d/%6d", n, 
-            fNEventsPerDetector[0], nReq,
-            fNEventsPerDetector[1], nReq,
-            fNEventsPerDetector[2], nReq);
+    AliDebugF(5, "%9d: %6d/%6d %6d/%6d %6d/%6d", n, 
+             fNEventsPerDetector[0], nReq,
+             fNEventsPerDetector[1], nReq,
+             fNEventsPerDetector[2], nReq);
 
     int progress = GetProgress(n);
     if (progress <= lastProgress) continue;
@@ -375,10 +384,11 @@ void AliFMDBaseDA::InitContainer(TDirectory* diagFile)
 {
   //Prepare container for diagnostics    
   TDirectory* savDir   = gDirectory;
+  Bool_t owners = true;
 
   for(UShort_t det=1;det<=3;det++) {
-    TObjArray* detArray = new TObjArray(det == 1 ? 1 : 2);
-    detArray->SetOwner();
+    Array* detArray = new Array(det == 1 ? 1 : 2);
+    detArray->SetOwner(owners);
     detArray->SetName(GetDetectorPath(det, false));
     fDetectorArray.AddAtAndExpand(detArray,det);
 
@@ -393,9 +403,10 @@ void AliFMDBaseDA::InitContainer(TDirectory* diagFile)
       Char_t   ring = (ir == 0 ? 'O' : 'I');
       UShort_t nsec = (ir == 0 ? 40  : 20);
       UShort_t nstr = (ir == 0 ? 256 : 512);
-      TObjArray* ringArray = new TObjArray(nsec);
-      ringArray->SetOwner();
+      Array* ringArray = new Array(nsec);
+      ringArray->SetOwner(owners);
       ringArray->SetName(GetRingPath(det, ring, false));
+      ringArray->ResetBit(TObject::kMustCleanup);
       detArray->AddAtAndExpand(ringArray,ir);
 
 
@@ -407,9 +418,10 @@ void AliFMDBaseDA::InitContainer(TDirectory* diagFile)
       
 
       for(UShort_t sec =0; sec < nsec;  sec++)  {
-       TObjArray* sectorArray = new TObjArray(nstr);
-       sectorArray->SetOwner();
+       Array* sectorArray = new Array(nstr);
+       sectorArray->SetOwner(owners);
        sectorArray->SetName(GetSectorPath(det, ring, sec, false));
+       sectorArray->ResetBit(TObject::kMustCleanup);
        ringArray->AddAtAndExpand(sectorArray,sec);
 
 
@@ -424,9 +436,10 @@ void AliFMDBaseDA::InitContainer(TDirectory* diagFile)
            secDir->cd();
            secDir->mkdir(GetStripPath(det, ring, sec, strip, kFALSE));
          }
-         TObjArray* stripArray = new TObjArray(0);
-         stripArray->SetOwner(true);
+         Array* stripArray = new Array(0);
+         stripArray->SetOwner(owners);
          stripArray->SetName(GetStripPath(det, ring, sec, strip, false));
+         stripArray->ResetBit(TObject::kMustCleanup);
          sectorArray->AddAtAndExpand(stripArray, strip);
          AddChannelContainer(stripArray, det, ring, sec, strip);
        }
@@ -591,56 +604,56 @@ AliFMDBaseDA::MakeSummaryHistogram(const char* prefix, const char* title,
   Int_t nX = ((d == 1 || r == 'I' || r == 'i') ?  20 :  40);
   Int_t nY = ((d == 1 || r == 'I' || r == 'i') ? 512 : 256);
   
-  TH2* ret = new TH2F(Form("%sFMD%d%c", prefix, d, r), 
-                     Form("%s for FMD%d%c", title, d, r), 
-                     nX, -0.5, nX-0.5, nY, -0.5, nY-0.5);
+  TString n = TString::Format("%sFMD%d%c", prefix, d, r);
+  TString t = TString::Format("%s for FMD%d%c", title, d, r);
+  TH2* ret = new TH2F(n, t, nX, -0.5, nX-0.5, nY, -0.5, nY-0.5);
   ret->SetXTitle("Sector #");
   ret->SetYTitle("Strip #");
   ret->SetDirectory(0);
-  // if (!fSummaries) fSummaries = new TObjArray;
+  // if (!fSummaries) fSummaries = new Array;
   fSummaries.Add(ret);
   return ret;
 }
 
 //_____________________________________________________________________ 
-TObjArray*
+AliFMDBaseDA::Array*
 AliFMDBaseDA::GetDetectorArray(UShort_t det)
 {
   if (det < 1 || det > 3) { 
     AliErrorF("Detector index %d out of bounds", det);
     return 0;
   }
-  return static_cast<TObjArray*>(fDetectorArray.At(det));
+  return static_cast<Array*>(fDetectorArray.At(det));
 }
 //_____________________________________________________________________ 
-TObjArray*
+AliFMDBaseDA::Array*
 AliFMDBaseDA::GetRingArray(UShort_t det, Char_t ring)
 {
   Int_t idx = (ring == 'O' || ring == 'o' ? 0 : 1);
-  TObjArray* array = GetDetectorArray(det);
+  Array* array = GetDetectorArray(det);
   if (!array) return 0;
-  array = static_cast<TObjArray*>(array->At(idx));
+  array = static_cast<Array*>(array->At(idx));
   if (!array) AliErrorF("No ring array for FMD%d%c (%d)", det, ring, idx);
   return array;
 }
 //_____________________________________________________________________ 
-TObjArray*
+AliFMDBaseDA::Array*
 AliFMDBaseDA::GetSectorArray(UShort_t det, Char_t ring, UShort_t sector)
 {
-  TObjArray* array = GetRingArray(det,ring);
+  Array* array = GetRingArray(det,ring);
   if (!array) return 0;
-  array = static_cast<TObjArray*>(array->At(sector));
+  array = static_cast<Array*>(array->At(sector));
   if (!array) AliErrorF("No sector array for FMD%d%c[%02d]", det, ring, sector);
   return array;
 }
 //_____________________________________________________________________ 
-TObjArray*
+AliFMDBaseDA::Array*
 AliFMDBaseDA::GetStripArray(UShort_t det, Char_t ring, 
                            UShort_t sector, UShort_t strip)
 {
-  TObjArray* array = GetSectorArray(det,ring,sector);
+  Array* array = GetSectorArray(det,ring,sector);
   if (!array) return 0;
-  array = static_cast<TObjArray*>(array->At(strip));
+  array = static_cast<Array*>(array->At(strip));
   if (!array) AliErrorF("No strip array for FMD%d%c[%02d,%03d]", 
                        det, ring, sector, strip);
   return array;
@@ -729,7 +742,7 @@ namespace {
 Int_t
 AliFMDBaseDA::Runner::Init(int argc, char** argv)
 {
-  AddHandlers();
+  // AddHandlers();
 
   // --- Process the command line ------------------------------------
   TString source;
@@ -844,33 +857,16 @@ AliFMDBaseDA::Runner::Exec(AliFMDBaseDA& da)
 
   timer.Stop();
   timer.Print();
-
-#ifdef ALI_AMORE
-  try { 
-    amore::da::AmoreDA myAmore(amore::da::AmoreDA::kSender);
-
-    for (UShort_t det = 1; det <= 3; det++) {
-      if (!da.HasSeenDetector(det)) continue;
-      TObject* runNo = new TObject;
-      runNo->SetUniqueID(fReader->GetRunNumber());
-      myAmore.Send(Form("gainRunNoFMD%d", det), runNo);
-    }
-    
-    TIter     next(&da.GetSummaries());
-    TObject*  obj = 0;
-    while ((obj = next())) 
-      myAmore.Send(obj->GetName(), obj);
-    
-  }
-  catch (exception& e) {
-    cerr << "Failed to make AMORE instance: " << e.what() << endl;
-  }
-                              
-#endif
 }
 
-
-  
+#if 0
+AliFMDBaseDA::_Array::~_Array()
+{
+  // Printf("Deleting %s (%p)", this->GetName(), this);
+  // SetOwner(false);
+  // Clear();
+}
+#endif
   
   
 //_____________________________________________________________________ 
@@ -879,3 +875,4 @@ AliFMDBaseDA::Runner::Exec(AliFMDBaseDA& da)
 //
 // EOF
 //
index 39f3181..e226ab9 100644 (file)
@@ -24,6 +24,7 @@
 #include "TObjArray.h"
 #include "TString.h"
 #include "TArrayS.h"
+#include "TList.h"
 #include <iosfwd>
 #include <fstream>
 class AliFMDDigit;
@@ -38,6 +39,29 @@ class TClonesArray;
 class AliFMDBaseDA: public TNamed 
 {
 public:
+#if 0
+  struct _Array : public TList 
+  {
+    _Array() : TList() {}
+    _Array(Int_t) : TList() {}
+    _Array(const _Array& a) : TList() {} 
+    ~_Array();
+    void AddAtAndExpand(TObject* o, Int_t idx) { AddAt(o,idx); }       
+    Int_t GetEntriesFast() { return GetEntries(); }
+  };
+  typedef _Array Array;
+#elif 0 
+  struct _Array : public TObjArray 
+  {
+    _Array() : TObjArray() {}
+    _Array(Int_t n) : TObjArray(n) {}
+    ~_Array();
+  };
+  typedef _Array Array;
+#else
+  typedef TObjArray Array;
+#endif
+
   /** 
    * Constructor 
    * 
@@ -60,8 +84,9 @@ public:
    * Run this DA
    * 
    * @param fmdReader Raw input reader
+   * @param isBase Terminate after reading SOD   
    */  
-  void Run(AliRawReader* fmdReader);
+  void Run(AliRawReader* fmdReader, Bool_t isBase=false);
   /** 
    * Set whether to save diagnostics 
    * 
@@ -104,7 +129,7 @@ public:
    *
    * @return Array of summary histograms or null if not defined 
    */
-  const TObjArray& GetSummaries() const { return fSummaries; }
+  const Array& GetSummaries() const { return fSummaries; }
   /** 
    * Check if we saw data for detector 
    * 
@@ -152,13 +177,13 @@ protected:
   /** 
    * Add a strip container 
    */
-  virtual void AddChannelContainer(TObjArray*, UShort_t, Char_t, 
+  virtual void AddChannelContainer(Array*, UShort_t, Char_t, 
                                   UShort_t, UShort_t )  {};
   /** 
    * Add summary(s) for sectors 
    * 
    */
-  virtual void AddSectorSummary(TObjArray*, UShort_t, Char_t, UShort_t, 
+  virtual void AddSectorSummary(Array*, UShort_t, Char_t, UShort_t, 
                                UShort_t) {}
   /** 
    * End of event
@@ -235,7 +260,7 @@ protected:
    * 
    * @return Path to detector
    */  
-  const char* GetDetectorPath(UShort_t det, Bool_t full=kTRUE) const;
+  TString GetDetectorPath(UShort_t det, Bool_t full=kTRUE) const;
   /** 
    * Get the ring path in diagnositcs file
    * 
@@ -245,7 +270,7 @@ protected:
    * 
    * @return Path to ring
    */  
-  const char* GetRingPath(UShort_t det, Char_t ring, Bool_t full=kTRUE) const;
+  TString GetRingPath(UShort_t det, Char_t ring, Bool_t full=kTRUE) const;
   /** 
    * Get the sector path in diagnositcs file
    * 
@@ -256,7 +281,7 @@ protected:
    * 
    * @return Path to sector
    */  
-  const char* GetSectorPath(UShort_t det, Char_t ring, UShort_t sec, 
+  TString GetSectorPath(UShort_t det, Char_t ring, UShort_t sec, 
                            Bool_t full=kTRUE) const;
   /** 
    * Get the strip path in diagnositcs file
@@ -269,12 +294,12 @@ protected:
    * 
    * @return Path to strip
    */  
-  const char* GetStripPath(UShort_t det, Char_t ring, UShort_t sec, 
+  TString GetStripPath(UShort_t det, Char_t ring, UShort_t sec, 
                           UShort_t str, Bool_t full=kTRUE) const;
-  TObjArray* GetDetectorArray(UShort_t det);
-  TObjArray* GetRingArray(UShort_t det, Char_t ring);
-  TObjArray* GetSectorArray(UShort_t det, Char_t ring, UShort_t sector);
-  TObjArray* GetStripArray(UShort_t det, Char_t ring, 
+  Array* GetDetectorArray(UShort_t det);
+  Array* GetRingArray(UShort_t det, Char_t ring);
+  Array* GetSectorArray(UShort_t det, Char_t ring, UShort_t sector);
+  Array* GetStripArray(UShort_t det, Char_t ring, 
                           UShort_t sector, UShort_t strip);
   /** 
    * Write conditions file 
@@ -313,8 +338,6 @@ protected:
   virtual Bool_t HaveEnough(Int_t nEvent) const;
   virtual UShort_t GetProgress(Int_t nEvent) const;
 
-
-
   static const UInt_t fgkBaseDDL = 3072;   // base FMD ddl
   //Char_t* fDiagnosticsFilename;
   TString       fDiagnosticsFilename;  // name of diagnostics file
@@ -322,7 +345,7 @@ protected:
   std::ofstream fConditionsFile;       // conditions file
   Bool_t        fSaveHistograms;       // save hists or not
   Bool_t        fMakeSummaries;        // save hists or not
-  TObjArray     fDetectorArray;        // array indiced by detector
+  Array         fDetectorArray;        // array indiced by detector
   TArrayS       fPulseSize;            // Pulse size for gain calib
   TArrayS       fPulseLength;          // Pulse length for gain calib
   Bool_t        fSeenDetectors[3];     // Detectors seen so far
@@ -330,7 +353,7 @@ protected:
   Int_t         fRequiredEvents;       // # events required for this calib
   Int_t         fCurrentEvent;         // the current event       
   UInt_t        fRunno;                // Current run number 
-  TObjArray     fSummaries;            // Summary histograms 
+  Array         fSummaries;            // Summary histograms 
   Bool_t        fAll;                  // Try to get data from all dets
   
   ClassDef(AliFMDBaseDA,0) // Base Detector algorithm for all run types
index b00cfc8..dadb3bc 100644 (file)
@@ -148,8 +148,8 @@ void AliFMDGainDA::InitContainer(TDirectory* dir)
       UShort_t nsec = (ir == 0 ? 40  : 20);
       UShort_t nva  = (ir == 0 ? 2 : 4);
       for(UShort_t sec =0; sec < nsec;  sec++)  {
-       TObjArray* sectorArray = GetSectorArray(det, ring, sec);
-       TObjArray* cache = new TObjArray(nva);
+       Array* sectorArray = GetSectorArray(det, ring, sec);
+       Array* cache = new Array(nva);
        cache->SetName("Cache");
        cache->SetOwner();
        Int_t n = sectorArray->GetEntriesFast();
@@ -169,7 +169,7 @@ void AliFMDGainDA::InitContainer(TDirectory* dir)
 }
 
 //_____________________________________________________________________
-void AliFMDGainDA::AddChannelContainer(TObjArray* stripArray, 
+void AliFMDGainDA::AddChannelContainer(Array* stripArray, 
                                       UShort_t det  , 
                                       Char_t   ring,  
                                       UShort_t sec, 
@@ -198,7 +198,7 @@ void AliFMDGainDA::AddChannelContainer(TObjArray* stripArray,
 }
 
 //_____________________________________________________________________
-void AliFMDGainDA::AddSectorSummary(TObjArray* sectorArray, 
+void AliFMDGainDA::AddSectorSummary(Array* sectorArray, 
                                    UShort_t det, 
                                    Char_t   ring, 
                                    UShort_t sec, 
@@ -299,7 +299,7 @@ void AliFMDGainDA::Analyse(UShort_t det,
   }
   TF1 fitFunc("fitFunc","pol1",-10,280); 
   fitFunc.SetParameters(100,3);
-  grChannel->Fit("fitFunc","Q0+","",0,fHighPulse);
+  grChannel->Fit("fitFunc","Q0","",0,fHighPulse);
      
   Float_t gain    = -1;
   Float_t error   = -1; 
@@ -406,9 +406,9 @@ TH1S* AliFMDGainDA::GetChannelHistogram(UShort_t det,
   //  ring           Ring identifier 
   //  sec            Sector number
   //  va             VA number
-  TObjArray* secArray  = GetSectorArray(det, ring, sec);
+  Array* secArray  = GetSectorArray(det, ring, sec);
   Int_t      n         = secArray->GetEntriesFast();
-  TObjArray* cache     = static_cast<TObjArray*>(secArray->At(n-1));
+  Array* cache     = static_cast<Array*>(secArray->At(n-1));
   TH1S* hChannel       = static_cast<TH1S*>(cache->At(va));
   
   return hChannel;
@@ -427,7 +427,7 @@ TGraphErrors* AliFMDGainDA::GetChannel(UShort_t det,
   //  ring           Ring identifier 
   //  sec            Sector number
   //  strip          Strip number
-  TObjArray*    stripArray = GetStripArray(det, ring, sec, strip);
+  Array*    stripArray = GetStripArray(det, ring, sec, strip);
   TGraphErrors* hChannel   = static_cast<TGraphErrors*>(stripArray->At(0));
   
   return hChannel;
@@ -438,7 +438,7 @@ TH1F* AliFMDGainDA::GetSectorSummary(UShort_t det,
                                     Char_t   ring, 
                                     UShort_t sec) 
 {
-  TObjArray* secArray    = GetSectorArray(det, ring, sec);
+  Array* secArray    = GetSectorArray(det, ring, sec);
   Int_t      n           = secArray->GetEntriesFast();
   return static_cast<TH1F*>(secArray->At(n-2)); // Cache added later
 }
@@ -508,7 +508,7 @@ void AliFMDGainDA::UpdatePulseAndADC(UShort_t det,
     out->SetTitle(Form("FMD%d%c[%02d,%03d] DAC=0x%02x (%3d)",
                       det, ring, sec, channelNo, int(pulse), int(pulse)));
     out->SetDirectory(0);
-    TObjArray* arr = GetStripArray(det, ring, sec, channelNo);
+    Array* arr = GetStripArray(det, ring, sec, channelNo);
     arr->AddAtAndExpand(out, fCurrentPulse.At(halfring)+1);
   }
     
index 0b4033f..521fb7d 100644 (file)
@@ -20,6 +20,7 @@ class TH1S;
 class AliFMDGainDA: public AliFMDBaseDA 
 {
 public:
+  typedef AliFMDBaseDA::Array Array;
   /** 
    * Constructor 
    * 
@@ -70,7 +71,7 @@ protected:
    * @param sec         Sector number
    * @param strip       Strip number
    */ 
-  void AddChannelContainer(TObjArray* sectorArray, 
+  void AddChannelContainer(Array* sectorArray, 
                           UShort_t det, Char_t ring, 
                           UShort_t sec, UShort_t strip);
   /** 
@@ -82,7 +83,7 @@ protected:
    * @param sector 
    * @param nStrip 
    */
-  virtual void AddSectorSummary(TObjArray* secArray, UShort_t det, 
+  virtual void AddSectorSummary(Array* secArray, UShort_t det, 
                                Char_t ring, UShort_t sector, 
                                UShort_t nStrip);
   /** 
index 956f15d..9420df7 100644 (file)
@@ -13,7 +13,7 @@
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/** @file    AliFMDPedestalDA.cxx
+/** @file    AliMDPedestalDA.cxx
     @author  Hans Hjersing Dalsgaard <canute@nbi.dk>
     @date    Mon Mar 10 09:46:05 2008
     @brief   Derived class for the pedestal detector algorithm.
@@ -114,7 +114,7 @@ void AliFMDPedestalDA::Init()
 }
 
 //_____________________________________________________________________
-void AliFMDPedestalDA::AddChannelContainer(TObjArray* sampleArray, 
+void AliFMDPedestalDA::AddChannelContainer(Array* sampleArray, 
                                           UShort_t det, 
                                           Char_t   ring, 
                                           UShort_t sec, 
@@ -136,12 +136,13 @@ void AliFMDPedestalDA::AddChannelContainer(TObjArray* sampleArray,
     hSample->SetXTitle("ADC");
     hSample->SetYTitle("Events");
     hSample->SetDirectory(0);
+    hSample->ResetBit(TObject::kMustCleanup);
     sampleArray->AddAtAndExpand(hSample, sample);
   }
 }
 
 //_____________________________________________________________________
-void AliFMDPedestalDA::AddSectorSummary(TObjArray* sectorArray, 
+void AliFMDPedestalDA::AddSectorSummary(Array* sectorArray, 
                                        UShort_t det, 
                                        Char_t   ring, 
                                        UShort_t sec, 
@@ -154,10 +155,12 @@ void AliFMDPedestalDA::AddSectorSummary(TObjArray* sectorArray,
   sumPed->SetXTitle("Strip");
   sumPed->SetYTitle("Pedestal [ADC]");
   sumPed->SetDirectory(0);
+  sumPed->ResetBit(TObject::kMustCleanup);
   
   TH1F* sumNoise = static_cast<TH1F*>(sumPed->Clone("Noise"));
   sumNoise->SetYTitle("Noise [ADC]");
   sumNoise->SetDirectory(0);
+  sumNoise->ResetBit(TObject::kMustCleanup);
   
   Int_t n = sectorArray->GetEntriesFast();
   sectorArray->AddAtAndExpand(sumPed,   n + kPedestalOffset - 1);
@@ -251,17 +254,9 @@ void AliFMDPedestalDA::Analyse(UShort_t det,
     }
     break;
   }
-#if 0
-  static bool first = true;
-  if (summary && first) { 
-    std::cout << "Filling summary " << summary->GetName() << std::endl;
-    first = false;
-  }
-#endif
-  // Float_t           factor   = pars->GetPedestalFactor();
-  UInt_t            samples  = pars->GetSampleRate(det, ring, sec, strip);
+
+  UInt_t samples  = pars->GetSampleRate(det, ring, sec, strip);
   for (UShort_t sample = 0; sample < samples; sample++) {
-  
     TH1S* hChannel = GetChannel(det, ring, sec, strip,sample);
     if(!hChannel || hChannel->GetEntries() == 0) {
       //AliWarning(Form("No entries for FMD%d%c, sector %d, strip %d",
@@ -269,19 +264,18 @@ void AliFMDPedestalDA::Analyse(UShort_t det,
       return;
     }
     
-    AliDebug(50, Form("Fitting FMD%d%c[%02d,%03d] with %d entries",
-                     det,ring,sec,strip, int(hChannel->GetEntries())));
-    TF1 fitFunc("fitFunc","gausn",0,300);
-    fitFunc.SetParameters(100,100,1);
-    hChannel->Fit("fitFunc","Q0+","",10,200);
+    AliDebugF(50, "Fitting FMD%d%c[%02d,%03d] with %d entries",
+             det,ring,sec,strip, int(hChannel->GetEntries()));
+    TF1* fitFunc = new TF1("fitFunc","gausn",0,300);
+    fitFunc->ResetBit(TObject::kMustCleanup);
+    fitFunc->SetParameters(100,100,1);
+    hChannel->Fit(fitFunc,"Q0","",10,200);
+    hChannel->GetListOfFunctions()->Remove(fitFunc);
     
     Float_t mean = hChannel->GetMean();
     Float_t rms  = hChannel->GetRMS();
     
-    
-    
     hChannel->GetXaxis()->SetRangeUser(mean-5*rms,mean+5*rms);
-    
     mean = hChannel->GetMean();
     rms  = hChannel->GetRMS();
   
@@ -315,8 +309,8 @@ void AliFMDPedestalDA::Analyse(UShort_t det,
     Float_t chi2ndf = 0;
     
     
-    if(fitFunc.GetNDF())
-      chi2ndf = fitFunc.GetChisquare() / fitFunc.GetNDF();
+    if(fitFunc->GetNDF())
+      chi2ndf = fitFunc->GetChisquare() / fitFunc->GetNDF();
     
     
     Int_t sampleToWrite = 2;
@@ -334,10 +328,12 @@ void AliFMDPedestalDA::Analyse(UShort_t det,
                << strip                       << ','
                << mean                        << ','
                << rms                         << ','
-               << fitFunc.GetParameter(1)     << ','
-               << fitFunc.GetParameter(2)     << ','
+               << fitFunc->GetParameter(1)    << ','
+               << fitFunc->GetParameter(2)    << ','
                << chi2ndf                     <<"\n";
 
+    delete fitFunc;
+
     if (summary) { 
       Int_t bin = summary->FindBin(sec, strip);
       summary->SetBinContent(bin, mean);
@@ -347,53 +343,13 @@ void AliFMDPedestalDA::Analyse(UShort_t det,
     if(fSaveHistograms  ) {
       TH1F* sumPed   = GetSectorSummary(det, ring, sec, true);
       TH1F* sumNoise = GetSectorSummary(det, ring, sec, false);
-#if 0
-      gDirectory->cd(GetSectorPath(det, ring, sec, kTRUE));
-      TH1F* sumPed   = dynamic_cast<TH1F*>(gDirectory->Get("Pedestals"));
-      TH1F* sumNoise = dynamic_cast<TH1F*>(gDirectory->Get("Noise"));
-      Int_t nStr = (ring == 'I' ? 512 : 256);
-      if (!sumPed) {
-       sumPed = new TH1F("Pedestals", 
-                         Form("Summary of pedestals in FMD%d%c[%02d]", 
-                              det, ring, sec), 
-                         nStr, -.5, nStr-.5);
-       sumPed->SetXTitle("Strip");
-       sumPed->SetYTitle("Pedestal [ADC]");
-       sumPed->SetDirectory(gDirectory);
-      }
-      if (!sumNoise) { 
-       sumNoise = new TH1F("Noise", 
-                           Form("Summary of noise in FMD%d%c[%02d]", 
-                                det, ring, sec), 
-                           nStr, -.5, nStr-.5);
-       sumNoise->SetXTitle("Strip");
-       sumNoise->SetYTitle("Noise [ADC]");
-       
-       sumNoise->SetDirectory(gDirectory);
-      }
-#endif
       sumPed->SetBinContent(strip+1, mean);
       sumPed->SetBinError(strip+1, rms);
       sumNoise->SetBinContent(strip+1, rms);
 
-#if 0
-      if(sumNoise->GetEntries() == nStr)
-       sumNoise->Write(sumNoise->GetName(),TObject::kOverwrite);
-      if(sumPed->GetEntries() == nStr)
-       sumPed->Write(sumPed->GetName(),TObject::kOverwrite);
-#endif
       fPedSummary.SetBinContent(fCurrentChannel,mean);
-      
       fNoiseSummary.SetBinContent(fCurrentChannel,rms);
       fCurrentChannel++;
-
-#if 0      
-      gDirectory->cd(GetStripPath(det, ring, sec, strip, kTRUE));
-      hChannel->GetXaxis()->SetRange(1,1024);
-      
-      hChannel->Write();
-#endif
     }
   }
 }
@@ -439,8 +395,8 @@ void AliFMDPedestalDA::FillinTimebins(std::ofstream& out, UShort_t /*ddl*/)
       for (UShort_t channel = 0; channel < 16; channel++) { 
        Int_t idx = HWIndex(ddl, *board, altro, channel);
        if (idx < 0) { 
-         AliWarning(Form("Invalid index for %4d/0x%02x/0x%x/0x%x: %d", 
-                         ddl, *board, altro, channel, idx));
+         AliWarningF("Invalid index for %4d/0x%02x/0x%x/0x%x: %d", 
+                     ddl, *board, altro, channel, idx);
          continue;
        }
        Short_t min = fMinTimebin[idx];
@@ -525,7 +481,7 @@ TH1S* AliFMDPedestalDA::GetChannel(UShort_t det,
   //
   // Return:
   //     ADC spectra of a strip.
-  TObjArray* sampleArray = GetStripArray(det, ring, sec, strip);
+  Array* sampleArray = GetStripArray(det, ring, sec, strip);
   if (!sampleArray) return 0;
   TH1S*      hSample     = static_cast<TH1S*>(sampleArray->At(sample));
   if (!hSample) {
@@ -548,7 +504,7 @@ TH1F* AliFMDPedestalDA::GetSectorSummary(UShort_t det,
                                         UShort_t sec, 
                                         Bool_t   pedNotNoise) 
 {
-  TObjArray* secArray    = GetSectorArray(det, ring, sec);
+  Array*     secArray    = GetSectorArray(det, ring, sec);
   Int_t      n           = secArray->GetEntriesFast();
   Int_t      i           = n - (pedNotNoise ? kNoiseOffset : kPedestalOffset);
   return static_cast<TH1F*>(secArray->At(i));
index b69ca8e..dd11fb9 100644 (file)
@@ -20,6 +20,8 @@ class TH2;
 class AliFMDPedestalDA: public AliFMDBaseDA 
 {
 public:
+  typedef AliFMDBaseDA::Array Array;
+
   /** 
    * Constructor.
    * 
@@ -62,7 +64,7 @@ protected:
    * @param sec          Sector 
    * @param strip        Strip
    */
-  void AddChannelContainer(TObjArray* sectorArray, UShort_t det, 
+  void AddChannelContainer(Array* sectorArray, UShort_t det, 
                           Char_t ring, UShort_t sec, UShort_t strip);
   /** 
    * Add summary(s) for sectors 
@@ -73,7 +75,7 @@ protected:
    * @param sector 
    * @param nStrip 
    */
-  virtual void AddSectorSummary(TObjArray* secArray, UShort_t det, 
+  virtual void AddSectorSummary(Array* secArray, UShort_t det, 
                                Char_t ring, UShort_t sector, 
                                UShort_t nStrip);
   /**