]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliLHCData.cxx
AliTPCclustererMI.cxx - printf statement
[u/mrichter/AliRoot.git] / STEER / AliLHCData.cxx
index a2611b2b4e81b765bc82b044ec9a1b18cc2a3c52..03d28ebf86e2db48f608ff3dff48e4c84d22afa3 100755 (executable)
@@ -42,6 +42,7 @@
 #include "AliLHCData.h"\r
 #include "TMap.h"\r
 #include "AliDCSArray.h"\r
+#include "AliLHCReader.h"\r
 #include <TString.h>\r
 #include <TObjArray.h>\r
 \r
@@ -94,16 +95,40 @@ const Char_t* AliLHCData::fgkDCSColJaws[] = {
 \r
 //___________________________________________________________________\r
 AliLHCData::AliLHCData(const TMap* dcsMap, double tmin, double tmax)\r
-  : fTMin(tmin),fTMax(tmax),fFillNumber(0),fData(0)\r
+  : fTMin(0),fTMax(0),fFillNumber(0),fData(0),fFile2Process(0),fMap2Process(0)\r
 {\r
+  FillData(dcsMap,tmin,tmax);\r
+}\r
+\r
+//___________________________________________________________________\r
+AliLHCData::AliLHCData(const Char_t* dcsFile, double tmin, double tmax)\r
+  : fTMin(0),fTMax(0),fFillNumber(0),fData(0),fFile2Process(dcsFile),fMap2Process(0)\r
+{\r
+  FillData(dcsFile,tmin,tmax);\r
+}\r
+\r
+//___________________________________________________________________\r
+Bool_t AliLHCData::FillData(const TMap*   dcsMap,double tmin, double tmax)\r
+{\r
+  // process DCS map and fill all fields. \r
   Clear();\r
-  SetTMin(tmin);\r
-  SetTMin(tmax);\r
-  FillData(dcsMap);\r
+  fMap2Process = dcsMap;\r
+  FillData(tmin,tmax);\r
+  return kTRUE;\r
 }\r
 \r
 //___________________________________________________________________\r
-Bool_t AliLHCData::FillData(const TMap* dcsMap, double tmin, double tmax)\r
+Bool_t AliLHCData::FillData(const Char_t* dcsFile,double tmin, double tmax)\r
+{\r
+  // process DCS file and fill all fields. \r
+  Clear();\r
+  fFile2Process = dcsFile;\r
+  FillData(tmin,tmax);\r
+  return kTRUE;\r
+}\r
+\r
+//___________________________________________________________________\r
+Bool_t AliLHCData::FillData(double tmin, double tmax)\r
 {\r
   // process DCS map and fill all fields. \r
   // Accept only entries with timestamp between tmin and tmax\r
@@ -114,106 +139,142 @@ Bool_t AliLHCData::FillData(const TMap* dcsMap, double tmin, double tmax)
   SetTMax(tmax);\r
   //\r
   // -------------------------- extract Fill Number\r
-  int iEntry;\r
-  TObjArray* arr = GetDCSEntry(dcsMap, fgkDCSNames[kFillNum],iEntry,fTMin,fTMax);\r
-  if (arr && iEntry>=0) SetFillNumber( ExtractInt( (AliDCSArray*)arr->At(iEntry), 0) );\r
+  int iFirst=0,iLast=0;\r
+  TObjArray* arr = GetDCSEntry(fgkDCSNames[kFillNum],iFirst,iLast,fTMin,fTMax);\r
+  if (arr) SetFillNumber( ExtractInt( (AliDCSArray*)arr->At(iFirst), 0) );\r
+  if (fFile2Process) delete arr; // array was created on demand\r
   //\r
   for (int ibm=0;ibm<2;ibm++) {\r
     //\r
     sprintf(buff,fgkDCSNames[kBunchConf],ibm+1);         // ----- declared bunch configuration\r
-    FillBunchConfig(dcsMap, fBunchConfDecl[ibm], buff);\r
+    FillBunchConfig(fBunchConfDecl[ibm], buff);\r
     //\r
     sprintf(buff,fgkDCSNames[kBunchLgtFillB],ibm+1);     // ----- measured bunch configuration\r
-    FillBunchConfig(dcsMap, fBunchConfMeas[ibm], buff);\r
+    FillBunchConfig(fBunchConfMeas[ibm], buff);\r
     //\r
-    sprintf(buff,fgkDCSNames[kBunchLgt],ibm+1);          // ----- maesured bunch lenghts\r
-    FillBunchInfo(dcsMap, fBunchLengths[ibm],buff,ibm,kFALSE);  \r
+    sprintf(buff,fgkDCSNames[kBunchLgt],ibm+1);          // ----- measured bunch lenghts\r
+    FillBunchInfo(fBunchLengths[ibm],buff,ibm,kFALSE);  \r
     //\r
     sprintf(buff,fgkDCSNames[kIntBunchAv],ibm+1);        // ----- B-by-B intensities\r
-    FillBunchInfo(dcsMap, fIntensPerBunch[ibm],buff,ibm,kTRUE);\r
+    FillBunchInfo(fIntensPerBunch[ibm],buff,ibm,kTRUE);\r
     //\r
     //\r
     sprintf(buff,fgkDCSNames[kIntTot],ibm+1);            // ----- total intensities for beam 1 and 2\r
-    FillScalarRecord(dcsMap, fIntensTotal[ibm], buff);\r
+    FillScalarRecord(fIntensTotal[ibm], buff);\r
     //\r
     sprintf(buff,fgkDCSNames[kIntTotAv],ibm+1);          // ----- total intensities for beam 1 and 2 from B-by-B average\r
-    FillScalarRecord(dcsMap, fIntensTotalAv[ibm], buff);\r
+    FillScalarRecord(fIntensTotalAv[ibm], buff);\r
     //\r
     sprintf(buff,fgkDCSNames[kBeamSzEmittH],ibm+1);      // ----- H emittance for beam 1 and 2 \r
-    FillScalarRecord(dcsMap, fEmittanceH[ibm], buff);\r
+    FillScalarRecord(fEmittanceH[ibm], buff);\r
     //\r
     sprintf(buff,fgkDCSNames[kBeamSzEmittV],ibm+1);      // ----- V emittance for beam 1 and 2 \r
-    FillScalarRecord(dcsMap, fEmittanceV[ibm], buff);\r
+    FillScalarRecord(fEmittanceV[ibm], buff);\r
     //\r
     sprintf(buff ,fgkDCSNames[kBeamSzSigH],   ibm+1);    // ----- H sigmas and errors for beam 1 and 2 \r
     sprintf(buff1,fgkDCSNames[kBeamSzSigHErr],ibm+1);\r
-    FillScalarRecord(dcsMap, fBeamSigmaH[ibm], buff, buff1);\r
+    FillScalarRecord(fBeamSigmaH[ibm], buff, buff1);\r
     //\r
     sprintf(buff ,fgkDCSNames[kBeamSzSigV],   ibm+1);    // ----- V sigmas and errors for beam 1 and 2 \r
     sprintf(buff1,fgkDCSNames[kBeamSzSigVErr],ibm+1);\r
-    FillScalarRecord(dcsMap, fBeamSigmaV[ibm], buff, buff1);\r
+    FillScalarRecord(fBeamSigmaV[ibm], buff, buff1);\r
     //\r
   }\r
   //\r
+  FlagInteractingBunches(fBunchConfMeas[0],fBunchConfMeas[1]);\r
+  FlagInteractingBunches(fBunchConfDecl[0],fBunchConfDecl[1]);\r
+  //\r
   for (int ilr=0;ilr<2;ilr++) {\r
     //\r
     sprintf(buff ,fgkDCSNames[kLumBunch], ilr ? 'R':'L');       // ---- BC-by-BC luminosity at IP2 and its error\r
     sprintf(buff1,fgkDCSNames[kLumBunchErr], ilr ? 'R':'L');\r
-    FillBCLuminosities(dcsMap, fLuminPerBC[ilr], buff, buff1, kTRUE);\r
+    FillBCLuminosities(fLuminPerBC[ilr], buff, buff1, 0); // BRAN L uses beam2 as a reference, BRAN R - beam1\r
     //\r
     sprintf(buff ,fgkDCSNames[kLumTot]   , ilr ? 'R':'L');       // ---- total luminosity at IP2 and its error\r
     sprintf(buff1,fgkDCSNames[kLumTotErr], ilr ? 'R':'L');\r
-    FillScalarRecord(dcsMap, fLuminTotal[ilr], buff, buff1);\r
+    FillScalarRecord(fLuminTotal[ilr], buff, buff1);\r
     //\r
     sprintf(buff ,fgkDCSNames[kLumAcqMode], ilr ? 'R':'L');      // ---- luminosity acquisition mode\r
-    FillAcqMode(dcsMap, fLuminAcqMode[ilr], buff);\r
+    FillAcqMode(fLuminAcqMode[ilr], buff);\r
     //\r
     sprintf(buff, fgkDCSNames[kLumCrossAng]   , ilr ? 'R':'L');  //----- crossing angle at IP2 and its error\r
     sprintf(buff1,fgkDCSNames[kLumCrossAngErr], ilr ? 'R':'L');\r
-    FillScalarRecord(dcsMap, fCrossAngle[ilr], buff, buff1);\r
+    FillScalarRecord(fCrossAngle[ilr], buff, buff1);\r
     //    \r
   }\r
   //\r
   for (int icl=0;icl<kNCollimators;icl++) {             // ----- collimators positions\r
     for (int jaw=0;jaw<kNJaws;jaw++) {\r
       sprintf(buff,fgkDCSNames[kCollPos], fgkDCSColNames[icl],fgkDCSColJaws[jaw]);        \r
-      FillScalarRecord(dcsMap, fCollimators[icl][jaw], buff);\r
+      FillScalarRecord(fCollimators[icl][jaw], buff);\r
     } // jaws\r
   } // collimators\r
   //\r
   //\r
   // RunControl info\r
-  FillStringRecord(dcsMap, fRCInjScheme, fgkDCSNames[kRCInjSch]);   // ---- active injection scheme\r
-  FillScalarRecord(dcsMap, fRCBeta, fgkDCSNames[kRCBeta]);          // ---- target beta \r
-  FillScalarRecord(dcsMap, fRCAngH, fgkDCSNames[kRCCrossAng]);      // ---- horisontal angle\r
-  FillScalarRecord(dcsMap, fRCAngV,fgkDCSNames[kRCVang] );          // ---- vertical angle\r
+  FillStringRecord(fRCInjScheme, fgkDCSNames[kRCInjSch]);   // ---- active injection scheme\r
+  FillScalarRecord(fRCBeta, fgkDCSNames[kRCBeta]);          // ---- target beta \r
+  FillScalarRecord(fRCAngH, fgkDCSNames[kRCCrossAng]);      // ---- horisontal angle\r
+  FillScalarRecord(fRCAngV,fgkDCSNames[kRCVang] );          // ---- vertical angle\r
   //\r
   return kTRUE;\r
 }\r
 \r
 //___________________________________________________________________\r
-TObjArray* AliLHCData::GetDCSEntry(const TMap* dcsMap,const char* key,int &entry,double tmin,double tmax) const\r
+TObjArray* AliLHCData::GetDCSEntry(const char* key,int &entry,int &last,double tmin,double tmax) const\r
 {\r
-  // extract array from the DCS map and find the first entry within the time limits\r
+  // extract array from the DCS map or file and find the first entry within the time limits\r
   entry = -1;\r
-  TObjArray* arr = (TObjArray*)dcsMap->GetValue(key);\r
+  last = -2;\r
+  TObjArray* arr;\r
+  if (fMap2Process) arr = (TObjArray*)fMap2Process->GetValue(key);\r
+  else if (fFile2Process) {\r
+    AliLHCReader rd;\r
+    arr = rd.ReadSingleLHCDP(fFile2Process,key);\r
+  }\r
+  else {\r
+    AliError("Neither DCS map nor DCS filename are set");\r
+    return 0;  \r
+  }\r
+  //\r
   if (!arr || !arr->GetEntriesFast()) { \r
     AliWarning(Form("No data for %s",key)); \r
+    if (fMap2Process) delete arr; // created on demand\r
     return 0;\r
   }\r
   int ntot = arr->GetEntriesFast();\r
+  //\r
+  // search 1st entry before or at tmin\r
+  AliDCSArray* ent = 0;\r
+  Bool_t found = kFALSE;\r
   for (entry=0;entry<ntot;entry++) {\r
-    AliDCSArray* ent = (AliDCSArray*)arr->At(entry);\r
-    if (ent->GetTimeStamp()>=tmin && ent->GetTimeStamp()<=tmax) break;\r
+    ent = (AliDCSArray*)arr->At(entry);\r
+    if (ent->GetTimeStamp()>=tmin-kMarginSOR && ent->GetTimeStamp()<=tmax+kMarginEOR) {\r
+      found = kTRUE;\r
+      if (ent->GetTimeStamp()>tmin) break;\r
+    }\r
   }\r
-  if (entry==ntot) {\r
+  if (!found) {\r
     entry = -1;\r
     TString str;\r
     str += AliLHCDipValD::TimeAsString(tmin);\r
     str += " : ";\r
     str += AliLHCDipValD::TimeAsString(tmax);\r
     AliWarning(Form("All entries for %s are outside the requested range:\n%s",key,str.Data()));\r
+    if (fMap2Process) delete arr; // created on demand\r
+    return 0;\r
   }\r
+  if (entry>0) entry--;\r
+  //\r
+  // search last entry at or after tmin\r
+  ent = 0;\r
+  for (last=entry;last<ntot;last++) {\r
+    ent = (AliDCSArray*)arr->At(last);\r
+    if (ent->GetTimeStamp()>tmax) break;\r
+  }\r
+  if (last == ntot) last--;\r
+  else if (ent->GetTimeStamp()>tmax+kMarginEOR) last--;\r
+  //\r
   return arr;\r
 }\r
 \r
@@ -260,7 +321,7 @@ TObject* AliLHCData::FindRecValidFor(int start,int nrec, double tstamp) const
   AliLHCDipValI *prevObj = 0;\r
   for (int i=0;i<nrec;i++) {\r
     AliLHCDipValI* curObj = (AliLHCDipValI*)fData[start+i];\r
-    if (TimeDifference(tstamp,curObj->GetTimeStamp())>0) break;\r
+    if (TimeDifference(tstamp,curObj->GetTimeStamp())<0) break;\r
     prevObj = curObj;\r
   }\r
   if (!prevObj && nrec>0) prevObj = (AliLHCDipValI*)fData[start]; // if no exact match, return the 1st one\r
@@ -268,49 +329,46 @@ TObject* AliLHCData::FindRecValidFor(int start,int nrec, double tstamp) const
 }\r
 \r
 //___________________________________________________________________\r
-Int_t AliLHCData::FillScalarRecord(const TMap* dcsMap, int refs[2], const char* rec, const char* recErr)\r
+Int_t AliLHCData::FillScalarRecord(int refs[2], const char* rec, const char* recErr)\r
 {\r
   // fill record for scalar value, optionally accompanied by measurement error \r
   //\r
   AliInfo(Form("Acquiring record: %s",rec));\r
   //\r
   TObjArray *arr=0,*arrE=0;\r
-  Int_t nEntries=0,nEntriesE=0,iEntry=0,iEntryE=0;\r
+  Int_t iLast=0,iLastE=0,iFirst=0,iFirstE=0;\r
   //\r
   refs[kStart] = fData.GetEntriesFast();\r
   refs[kNStor] = 0;\r
   //\r
-  if ( !(arr=GetDCSEntry(dcsMap,rec,iEntry,fTMin,fTMax)) || iEntry<0 ) return -1;\r
-  nEntries = arr->GetEntriesFast();\r
+  if ( !(arr=GetDCSEntry(rec,iFirst,iLast,fTMin,fTMax)) ) return -1;\r
   //\r
   int dim = 1;\r
   if (recErr) {\r
-    if ( !(arrE=GetDCSEntry(dcsMap,recErr,iEntryE,fTMin,fTMax)) || iEntryE<0 ) nEntriesE = -999;\r
-    else nEntriesE = arrE->GetEntriesFast();\r
+    arrE = GetDCSEntry(recErr,iFirstE,iLastE,fTMin,fTMax);\r
     dim += 1;\r
   }\r
   //\r
-  while (iEntry<nEntries) {\r
-    AliDCSArray *dcsVal = (AliDCSArray*) arr->At(iEntry++);\r
+  Bool_t last = kFALSE;\r
+  while (iFirst<=iLast) {\r
+    AliDCSArray *dcsVal = (AliDCSArray*) arr->At(iFirst++);\r
     double tstamp = dcsVal->GetTimeStamp();\r
-    if (tstamp>fTMax) break;\r
     //\r
     AliLHCDipValF* curValF = new AliLHCDipValF(dim,tstamp);  // start new period\r
     (*curValF)[0] = ExtractDouble(dcsVal,0);     // value\r
     //\r
     if (recErr) {\r
       double errVal = -1;\r
-      while (iEntryE<nEntriesE) {       // try to find corresponding error\r
-       AliDCSArray *dcsValE = (AliDCSArray*) arrE->At(iEntryE);\r
+      while (iFirstE<=iLastE) {       // try to find corresponding error\r
+       AliDCSArray *dcsValE = (AliDCSArray*) arrE->At(iFirstE);\r
         double tstampE = dcsValE->GetTimeStamp();\r
-        if (tstampE>fTMax) break;\r
         int tdif = TimeDifference(tstamp,tstampE);\r
         if (!tdif) { // error matches to value\r
           errVal = ExtractDouble(dcsValE,0);\r
-         iEntryE++; \r
+         iFirstE++; \r
          break;\r
        }\r
-        else if (tdif>0) iEntryE++; // error time lags behind, read the next one\r
+        else if (tdif>0) iFirstE++; // error time lags behind, read the next one\r
         else break;                 // error time is ahead of value, no error associated\r
       }\r
       (*curValF)[dim-1] = errVal;   // error\r
@@ -319,31 +377,35 @@ Int_t AliLHCData::FillScalarRecord(const TMap* dcsMap, int refs[2], const char*
     //\r
     fData.Add(curValF);\r
     refs[kNStor]++;\r
+    if (last) break;\r
   }\r
   //\r
+  if (fFile2Process) {\r
+    delete arr;\r
+    delete arrE;\r
+  }\r
   return refs[kNStor];\r
 }\r
 \r
 //___________________________________________________________________\r
-Int_t AliLHCData::FillBunchConfig(const TMap* dcsMap, int refs[2],const char* rec)\r
+Int_t AliLHCData::FillBunchConfig(int refs[2],const char* rec)\r
 {\r
   // fill record for bunch configuration\r
   //\r
   AliInfo(Form("Acquiring record: %s",rec));\r
   TObjArray *arr;\r
-  Int_t nEntries,iEntry;\r
+  Int_t iLast,iFirst;\r
   //\r
   refs[kStart] = fData.GetEntriesFast();\r
   refs[kNStor] = 0;\r
   //\r
-  if ( !(arr=GetDCSEntry(dcsMap,rec,iEntry,fTMin,fTMax)) || iEntry<0 ) return -1;\r
-  nEntries = arr->GetEntriesFast();\r
+  if ( !(arr=GetDCSEntry(rec,iFirst,iLast,fTMin,fTMax)) ) return -1;\r
   //\r
   AliLHCDipValI* prevRecI=0;\r
-  while (iEntry<nEntries) {\r
-    AliDCSArray *dcsVal = (AliDCSArray*) arr->At(iEntry++);\r
+  //  \r
+  while (iFirst<=iLast) {\r
+    AliDCSArray *dcsVal = (AliDCSArray*) arr->At(iFirst++);\r
     double tstamp = dcsVal->GetTimeStamp();\r
-    if (tstamp>fTMax) break;\r
     //\r
     int bucket=0, nbunch=0, ndiff=0;\r
     int nSlots = dcsVal->GetNEntries();     // count number of actual bunches (non-zeros)\r
@@ -361,29 +423,28 @@ Int_t AliLHCData::FillBunchConfig(const TMap* dcsMap, int refs[2],const char* re
     prevRecI = curValI;\r
   }\r
   //\r
+  if (fFile2Process) delete arr;\r
   return refs[kNStor];\r
 }\r
  \r
 //___________________________________________________________________\r
-Int_t AliLHCData::FillAcqMode(const TMap* dcsMap, int refs[2],const char* rec)\r
+Int_t AliLHCData::FillAcqMode(int refs[2],const char* rec)\r
 {\r
   // fill acquisition mode\r
   //\r
   AliInfo(Form("Acquiring record: %s",rec));\r
   TObjArray *arr;\r
-  Int_t nEntries,iEntry;\r
+  Int_t iLast,iFirst;\r
   //\r
   refs[kStart] = fData.GetEntriesFast();\r
   refs[kNStor] = 0;\r
   //\r
-  if ( !(arr=GetDCSEntry(dcsMap,rec,iEntry,fTMin,fTMax)) || iEntry<0 ) return -1;\r
-  nEntries = arr->GetEntriesFast();\r
+  if ( !(arr=GetDCSEntry(rec,iFirst,iLast,fTMin,fTMax)) ) return -1;\r
   //\r
   AliLHCDipValI* prevRecI=0;\r
-  while (iEntry<nEntries) {\r
-    AliDCSArray *dcsVal = (AliDCSArray*) arr->At(iEntry++);\r
+  while (iFirst<=iLast) {\r
+    AliDCSArray *dcsVal = (AliDCSArray*) arr->At(iFirst++);\r
     double tstamp = dcsVal->GetTimeStamp();\r
-    if (tstamp>fTMax) break;\r
     //\r
     int nSlots = dcsVal->GetNEntries();\r
     if (nSlots<1) continue;\r
@@ -396,29 +457,28 @@ Int_t AliLHCData::FillAcqMode(const TMap* dcsMap, int refs[2],const char* rec)
     prevRecI = curValI;\r
   }\r
   //\r
+  if (fFile2Process) delete arr;\r
   return refs[kNStor];\r
 }\r
  \r
 //___________________________________________________________________\r
-Int_t AliLHCData::FillStringRecord(const TMap* dcsMap, int refs[2],const char* rec)\r
+Int_t AliLHCData::FillStringRecord(int refs[2],const char* rec)\r
 {\r
   // fill record with string value\r
   //\r
   AliInfo(Form("Acquiring record: %s",rec));\r
   TString prevRec;\r
   TObjArray *arr;\r
-  Int_t nEntries,iEntry;\r
+  Int_t iLast,iFirst;\r
   //\r
   refs[kStart] = fData.GetEntriesFast();\r
   refs[kNStor] = 0;\r
   //\r
-  if ( !(arr=GetDCSEntry(dcsMap,rec,iEntry,fTMin,fTMax)) || iEntry<0 ) return -1;\r
-  nEntries = arr->GetEntriesFast();\r
+  if ( !(arr=GetDCSEntry(rec,iFirst,iLast,fTMin,fTMax)) ) return -1;\r
   //\r
-  while (iEntry<nEntries) {\r
-    AliDCSArray *dcsVal = (AliDCSArray*) arr->At(iEntry++);\r
+  while (iFirst<=iLast) {\r
+    AliDCSArray *dcsVal = (AliDCSArray*) arr->At(iFirst++);\r
     double tstamp = dcsVal->GetTimeStamp();\r
-    if (tstamp>fTMax) break;\r
     //\r
     TString &str = ExtractString(dcsVal);\r
     if (!prevRec.IsNull()) {if (str == prevRec) continue;} // skip similar record\r
@@ -430,11 +490,12 @@ Int_t AliLHCData::FillStringRecord(const TMap* dcsMap, int refs[2],const char* r
     fData.Add(curValS);\r
     refs[kNStor]++;\r
   }\r
+  if (fFile2Process) delete arr;\r
   return refs[kNStor];\r
 }\r
 \r
 //___________________________________________________________________\r
-Int_t AliLHCData::FillBunchInfo(const TMap* dcsMap, int refs[2],const char* rec, int ibm, Bool_t inRealSlots)\r
+Int_t AliLHCData::FillBunchInfo(int refs[2],const char* rec, int ibm, Bool_t inRealSlots)\r
 {\r
   // fill bunch properties for beam ibm\r
   // if inRealSlots = true, then the value is taken from bunchRFbucket/10, otherwise, the value \r
@@ -442,18 +503,16 @@ Int_t AliLHCData::FillBunchInfo(const TMap* dcsMap, int refs[2],const char* rec,
   //\r
   AliInfo(Form("Acquiring record: %s",rec));\r
   TObjArray *arr;\r
-  Int_t nEntries,iEntry;\r
+  Int_t iLast,iFirst;\r
   //\r
   refs[kStart] = fData.GetEntriesFast();\r
   refs[kNStor] = 0;\r
   //\r
-  if ( !(arr=GetDCSEntry(dcsMap,rec,iEntry,fTMin,fTMax)) || iEntry<0 ) return -1;\r
-  nEntries = arr->GetEntriesFast();\r
+  if ( !(arr=GetDCSEntry(rec,iFirst,iLast,fTMin,fTMax)) ) return -1;\r
   //\r
-  while (iEntry<nEntries) {\r
-    AliDCSArray *dcsVal = (AliDCSArray*) arr->At(iEntry++);\r
+  while (iFirst<=iLast) {\r
+    AliDCSArray *dcsVal = (AliDCSArray*) arr->At(iFirst++);\r
     double tstamp = dcsVal->GetTimeStamp();\r
-    if (tstamp>fTMax) break;\r
     //\r
     AliLHCDipValI *bconf = GetBunchConfigMeasured(ibm,tstamp);\r
     if (!bconf) {\r
@@ -483,77 +542,87 @@ Int_t AliLHCData::FillBunchInfo(const TMap* dcsMap, int refs[2],const char* rec,
     fData.Add(curValF);\r
     refs[kNStor]++;\r
   }\r
+  if (fFile2Process) delete arr;\r
   return refs[kNStor];\r
   //\r
 }\r
  \r
 //___________________________________________________________________\r
-Int_t AliLHCData::FillBCLuminosities(const TMap* dcsMap, int refs[2],const char* rec, const char* recErr, Bool_t opt)\r
+Int_t AliLHCData::FillBCLuminosities(int refs[2],const char* rec, const char* recErr, int useBeam)\r
 {\r
   // fill luminosities per bunch crossing\r
   //\r
   AliInfo(Form("Acquiring record: %s",rec));\r
   TObjArray *arr,*arrE=0;\r
-  Int_t nEntries=0,nEntriesE=0,iEntry=0,iEntryE=0;\r
+  Int_t iLast=0,iLastE=0,iFirst=0,iFirstE=0;\r
   //\r
   refs[kStart] = fData.GetEntriesFast();\r
   refs[kNStor] = 0;\r
   //\r
-  if ( !(arr=GetDCSEntry(dcsMap,rec,iEntry,fTMin,fTMax)) || iEntry<0 ) return -1;\r
-  nEntries = arr->GetEntriesFast();\r
+  if ( !(arr=GetDCSEntry(rec,iFirst,iLast,fTMin,fTMax)) ) return -1;\r
   //\r
-  while (iEntry<nEntries) {\r
-    AliDCSArray *dcsVal = (AliDCSArray*) arr->At(iEntry++);\r
+  while (iFirst<=iLast) {\r
+    AliDCSArray *dcsVal = (AliDCSArray*) arr->At(iFirst++);\r
     double tstamp = dcsVal->GetTimeStamp();\r
-    if (tstamp>fTMax) break;\r
     //\r
-    AliLHCDipValI *bconf = GetBunchConfigMeasured(0,tstamp);  // luminosities are stored according to 1st beam bunches\r
+    AliLHCDipValI *bconf;\r
+    bconf = GetBunchConfigMeasured(useBeam,tstamp);  // luminosities are stored according to beam bunches\r
     if (!bconf) {\r
-      AliWarning(Form("Mearured bunch configuration for beam 1 at t=%.1f is not available, trying declared one",tstamp));\r
-      bconf = GetBunchConfigDeclared(0,tstamp);\r
+      AliWarning(Form("Mearured bunch configuration for beam%d at t=%.1f is not available, trying declared one",useBeam,tstamp));\r
+      bconf = GetBunchConfigDeclared(useBeam,tstamp);\r
     }\r
     if (!bconf) {\r
-      AliWarning(Form("Declared bunch configuration for beam 1 at t=%.1f is not available, skip this record",tstamp));\r
+      AliWarning(Form("Declared bunch configuration for beam%i at t=%.1f is not available, skip this record",useBeam,tstamp));\r
       return -1;\r
     }\r
     int nSlots = dcsVal->GetNEntries();     // count number of actual bunches (non-zeros)\r
     int nbunch = bconf->GetSize();\r
     double* dcsArr = dcsVal->GetDouble();\r
     //\r
-    // ATTENTION: FOR THE MOMENT STORE ALL SLOTS CORRESPONDING TO FILLED BUNCHES (until the scheme is clarified)\r
     if (nbunch>nSlots) {\r
       AliWarning(Form("More N bunches than slots in %s at time %.1f",rec,tstamp));\r
       continue;\r
     }\r
-    int dim = nbunch;\r
+    int dim = 0;\r
+    if (!bconf->IsProcessed1()) {\r
+      AliWarning(Form("Bunch conf. for beam%d has no marked interacting bunches, store all luminosity for all filled bunches",useBeam));\r
+      dim = nbunch;\r
+    }\r
+    else { // count number of interacting bunches\r
+      for (int i=nbunch;i--;) if ((*bconf)[i]<0) dim++;\r
+    }\r
+    //\r
     if (recErr) {\r
-      if ( !(arrE=GetDCSEntry(dcsMap,recErr,iEntryE,fTMin,fTMax)) || iEntryE<0 ) nEntriesE = -999;\r
-      else nEntriesE = arrE->GetEntriesFast();\r
+      arrE=GetDCSEntry(recErr,iFirstE,iLastE,fTMin,fTMax);\r
       dim += 1;\r
     }\r
     AliLHCDipValF* curValF = new AliLHCDipValF(dim,tstamp);\r
-    for (int i=nbunch;i--;) {\r
-      int ind = opt ? (*bconf)[i]/10 : i;\r
+    int cnt = 0;\r
+    for (int i=0;i<nbunch;i++) {\r
+      int slot = (*bconf)[i];\r
+      if (bconf->IsProcessed1() && slot>0) continue;\r
+      //\r
+      int ind = TMath::Abs(slot)/10;\r
       if (ind>nSlots) {\r
-       AliError(Form("Bunch %d refers to wrong slot %d, set to -1",i,(*bconf)[i]));\r
-       (*curValF)[i] = -1;\r
+       AliError(Form("Bunch %d refers to wrong slot %d, set to -1",cnt,slot));\r
+       (*curValF)[cnt] = -1;\r
       }\r
-      else (*curValF)[i] = dcsArr[ind];\r
+      else (*curValF)[cnt] = dcsArr[ind];\r
+      cnt++;\r
     }\r
     //\r
     if (recErr) {\r
       double errVal = -1;\r
-      while (iEntryE<nEntriesE) {       // try to find corresponding error\r
-       AliDCSArray *dcsValE = (AliDCSArray*) arrE->At(iEntryE);\r
+      while (iFirstE<=iLastE) {       // try to find corresponding error\r
+       AliDCSArray *dcsValE = (AliDCSArray*) arrE->At(iFirstE);\r
        double tstamp1 = dcsValE->GetTimeStamp();\r
-       if (tstamp1>fTMax) break;\r
        int tdif = TimeDifference(tstamp,tstamp1);\r
        if (!tdif) { // error matches to value\r
          errVal = dcsValE->GetDouble()[0];\r
-         iEntryE++; \r
+         iFirstE++; \r
          break;\r
        }\r
-       else if (tdif>0) iEntryE++; // error time lags behind, read the next one\r
+       else if (tdif>0) iFirstE++; // error time lags behind, read the next one\r
        else break;                 // error time is ahead of value, no error associated\r
       }\r
       (*curValF)[dim-1] = errVal;   // error\r
@@ -563,6 +632,10 @@ Int_t AliLHCData::FillBCLuminosities(const TMap* dcsMap, int refs[2],const char*
     fData.Add(curValF);\r
     refs[kNStor]++;\r
   }\r
+  if (fFile2Process) {\r
+    delete arr;\r
+    delete arrE;\r
+  }\r
   return refs[kNStor];\r
   //\r
 }\r
@@ -636,111 +709,113 @@ void AliLHCData::Print(const Option_t* opt) const
   // print full info\r
   TString opts = opt;\r
   opts.ToLower();\r
+  Bool_t utcTime = opts.Contains("loc") ? kFALSE:kTRUE;\r
   Bool_t full = kTRUE;\r
   if (!opts.Contains("f")) {\r
     printf("Use Print(\"f\") to print full info\n");\r
     printf("Printing short info:\n<RecordType>(number of records): <TimeStamp, value> for 1st record only\n");\r
     full = kFALSE;\r
   }\r
-  printf("Fill#%6d Validity: %s - %s\n",fFillNumber,\r
-        AliLHCDipValI::TimeAsString(fTMin),AliLHCDipValI::TimeAsString(fTMax));\r
+  TString sdtmn = AliLHCDipValI::TimeAsString(fTMin,utcTime);\r
+  TString sdtmx = AliLHCDipValI::TimeAsString(fTMax,utcTime);\r
+  printf("Fill#%6d Validity: %s - %s (%s)\n",fFillNumber,sdtmn.Data(),sdtmx.Data(),utcTime ? "UTC":"LOC");\r
   //\r
   printf("********** SETTINGS FROM RUN CONTROL **********\n");\r
   //\r
-  printf("*Injection Scheme");\r
-  PrintAux(full,fRCInjScheme);\r
+  printf("* %-38s","Injection Scheme");\r
+  PrintAux(full,fRCInjScheme,opts);\r
   //\r
-  printf("*Beta Star");\r
-  PrintAux(full,fRCBeta);\r
+  printf("* %-38s","Beta Star");\r
+  PrintAux(full,fRCBeta,opts);\r
   //\r
-  printf("*Horisontal Crossing Angle");\r
-  PrintAux(full,fRCAngH);\r
+  printf("* %-38s","Horisontal Crossing Angle");\r
+  PrintAux(full,fRCAngH,opts);\r
   //\r
-  printf("*Vertical   Crossing Angle");\r
-  PrintAux(full,fRCAngV);\r
+  printf("* %-38s","Vertical   Crossing Angle");\r
+  PrintAux(full,fRCAngV,opts);\r
   //\r
   for (int ib=0;ib<2;ib++) {\r
-    printf("** Beam%d bunch filling scheme [negative: bunch interacting at IR2!]",ib+1);\r
-    PrintAux(full,fBunchConfDecl[ib]);\r
+    printf("* Beam%d filling  [- interacts at IR2!]  ",ib+1);\r
+    PrintAux(full,fBunchConfDecl[ib],opts);\r
   }\r
   //\r
   printf("\n**********       MEASURED DATA       **********\n");\r
   //\r
   for (int ib=0;ib<2;ib++) {\r
-    printf("** Beam%d bunch filling scheme [negative: bunch interacts at IR2!]",ib+1);\r
-    PrintAux(full,fBunchConfMeas[ib]);\r
+    printf("* Beam%d filling  [- interacts at IR2!]  ",ib+1);\r
+    PrintAux(full,fBunchConfMeas[ib],opts);\r
   } \r
   //\r
   for (int ib=0;ib<2;ib++) {\r
-    printf("** Beam%d total intensity",ib+1);\r
-    PrintAux(full,fIntensTotal[ib]);\r
+    printf("* Beam%d total intensity                 ",ib+1);\r
+    PrintAux(full,fIntensTotal[ib],opts);\r
   } \r
   //\r
   for (int ib=0;ib<2;ib++) {\r
-    printf("** Beam%d total intensity from bunch average",ib+1);\r
-    PrintAux(full,fIntensTotalAv[ib]);\r
+    printf("* Beam%d total intensity (bunch average) ",ib+1);\r
+    PrintAux(full,fIntensTotalAv[ib],opts);\r
   } \r
   //\r
   for (int ib=0;ib<2;ib++) {\r
-    printf("** Beam%d intensity per bunch",ib+1);\r
-    PrintAux(full,fIntensPerBunch[ib]);\r
+    printf("* Beam%d intensity per bunch             ",ib+1);\r
+    PrintAux(full,fIntensPerBunch[ib],opts);\r
   }\r
   //\r
   for (int ib=0;ib<2;ib++) {\r
-    printf("** Beam%d bunch lengths",ib+1);\r
-    PrintAux(full,fBunchLengths[ib]);\r
+    printf("* Beam%d bunch lengths                   ",ib+1);\r
+    PrintAux(full,fBunchLengths[ib],opts);\r
   } \r
   //\r
   for (int ib=0;ib<2;ib++) {\r
-    printf("** Beam%d H. emittance",ib+1);\r
-    PrintAux(full,fEmittanceH[ib]);\r
+    printf("* Beam%d Horisontal emittance            ",ib+1);\r
+    PrintAux(full,fEmittanceH[ib],opts);\r
   }\r
   //\r
   for (int ib=0;ib<2;ib++) {\r
-    printf("** Beam%d V. emittance",ib+1);\r
-    PrintAux(full,fEmittanceV[ib]);\r
+    printf("* Beam%d Vertical emittance              ",ib+1);\r
+    PrintAux(full,fEmittanceV[ib],opts);\r
   }\r
   //\r
   for (int ib=0;ib<2;ib++) {\r
-    printf("** Beam%d H. sigma",ib+1);\r
-    PrintAux(full,fBeamSigmaH[ib]);\r
+    printf("* Beam%d Horisontal sigma                ",ib+1);\r
+    PrintAux(full,fBeamSigmaH[ib],opts);\r
   }\r
   //\r
   for (int ib=0;ib<2;ib++) {\r
-    printf("** Beam%d V. sigma",ib+1);\r
-    PrintAux(full,fBeamSigmaV[ib]);\r
+    printf("* Beam%d Vertical sigma                  ",ib+1);\r
+    PrintAux(full,fBeamSigmaV[ib],opts);\r
   }\r
   //\r
   for (int lr=0;lr<2;lr++) {\r
-    printf("** Total luminosity from BRANB_4%c2",lr ? 'R':'L');\r
-    PrintAux(full,fLuminTotal[lr]);\r
+    printf("* Total luminosity from BRANB_4%c2       ",lr ? 'R':'L');\r
+    PrintAux(full,fLuminTotal[lr],opts);\r
   } \r
   //\r
   for (int lr=0;lr<2;lr++) {\r
-    printf("** Luminosity acquisition mode, BRANB_4%c2",lr ? 'R':'L');\r
-    PrintAux(full,fLuminPerBC[lr]);\r
+    printf("* Luminosity acq.mode, BRANB_4%c2        ",lr ? 'R':'L');\r
+    PrintAux(full,fLuminAcqMode[lr],opts+"bit");\r
   } \r
   //\r
   for (int lr=0;lr<2;lr++) {\r
-    printf("** Luminosity per Bunch Crossing from BRANB_4%c2",lr ? 'R':'L');\r
-    PrintAux(full,fLuminPerBC[lr]);\r
+    printf("* Luminosity per BC from BRANB_4%c2      ",lr ? 'R':'L');\r
+    PrintAux(full,fLuminPerBC[lr],opts);\r
   }\r
   //\r
   for (int lr=0;lr<2;lr++) {\r
-    printf("** Crossing angle, side %c",lr ? 'R':'L');\r
-    PrintAux(full,fCrossAngle[lr]);\r
+    printf("* Crossing angle, side %c                ",lr ? 'R':'L');\r
+    PrintAux(full,fCrossAngle[lr],opts);\r
   }\r
   //\r
   for (int coll=0;coll<kNCollimators;coll++)\r
     for (int jaw=0;jaw<kNJaws;jaw++) {\r
-      printf("** Collimator %s:%s",fgkDCSColNames[coll],fgkDCSColJaws[jaw]);\r
-      PrintAux(full,fCollimators[coll][jaw]);\r
+      printf("* Collimator %10s:%16s",fgkDCSColNames[coll],fgkDCSColJaws[jaw]);\r
+      PrintAux(full,fCollimators[coll][jaw],opts);\r
     }\r
   //\r
 }\r
 \r
 //___________________________________________________________________\r
-void AliLHCData::PrintAux(Bool_t full, const Int_t refs[2]) const\r
+void AliLHCData::PrintAux(Bool_t full, const Int_t refs[2], const Option_t *opt) const\r
 {\r
   // aux method to print the reocrds of the same type\r
   int nrec = refs[kNStor];\r
@@ -748,12 +823,12 @@ void AliLHCData::PrintAux(Bool_t full, const Int_t refs[2]) const
     printf(": N/A\n"); \r
     return;\r
   }\r
-  printf(": (%d):\t",nrec); // number of records\r
+  printf(": (%3d):\t",nrec); // number of records\r
   if (!full) nrec = 1;\r
   int sz = ((AliLHCDipValI*)fData[refs[kStart]])->GetSizeTotal(); // dimension of the record\r
   Bool_t isStr = ((AliLHCDipValI*)fData[refs[kStart]])->IsTypeC();\r
   if ((!isStr && sz>2) || nrec>1) printf("\n"); // long record, open new line\r
-  for (int i=0;i<nrec;i++) fData[refs[kStart]+i]->Print();\r
+  for (int i=0;i<nrec;i++) fData[refs[kStart]+i]->Print(opt);\r
   //\r
 }\r
 \r
@@ -765,6 +840,9 @@ void AliLHCData::Clear(const Option_t *)
   fFillNumber = 0;\r
   fTMin = 0;\r
   fTMax = 1e10;\r
+  fFile2Process = 0;\r
+  fMap2Process  = 0;\r
+  //\r
   for (int i=2;i--;) {\r
     fRCInjScheme[i] = 0;\r
     fRCBeta[i] = 0;\r
@@ -825,3 +903,70 @@ Int_t AliLHCData::IsPilotPresent(int i) const
   TString scheme = rec->GetValues();\r
   return scheme.Contains("wp",TString::kIgnoreCase);\r
 }\r
+\r
+//___________________________________________________________________\r
+void AliLHCData::FlagInteractingBunches(const Int_t beam1[2],const Int_t beam2[2])\r
+{\r
+  // assign - sign to interacting bunches\r
+  const int kMaxSlots  = 3564;\r
+  const int kOffsBeam1 = 346;\r
+  const int kOffsBeam2 = 3019;\r
+  //\r
+  for (int ib1=0;ib1<beam1[kNStor];ib1++) {\r
+    AliLHCDipValI *bm1 = (AliLHCDipValI*)fData[ beam1[kStart] + ib1];\r
+    if (!bm1) continue;\r
+    AliLHCDipValI *bm2 = (AliLHCDipValI*)FindRecValidFor(beam2[kStart],beam2[kNStor], bm1->GetTimeStamp());\r
+    if (!bm2) continue;\r
+    //\r
+    int nb1 = bm1->GetSize();\r
+    int nb2 = bm2->GetSize();\r
+    int i1,i2;\r
+    for (i1=0;i1<nb1;i1++) {\r
+      int bunch2=-1, bunch1 = TMath::Abs((*bm1)[i1]);\r
+      int slot2 =-1, slot1  = (bunch1/10 + kOffsBeam1)%kMaxSlots;\r
+      for (i2=0;i2<nb2;i2++) {\r
+       bunch2 = TMath::Abs((*bm2)[i2]);\r
+       slot2 = (bunch2/10 + kOffsBeam2)%kMaxSlots;\r
+       if (slot1==slot2) break;\r
+      }\r
+      if (slot1!=slot2) continue;\r
+      (*bm1)[i1] = -bunch1;\r
+      (*bm2)[i2] = -bunch2;\r
+      bm1->SetProcessed1();\r
+      bm2->SetProcessed1();\r
+    }\r
+  }\r
+}\r
+\r
+//___________________________________________________________________\r
+Int_t AliLHCData::GetMeanIntensity(int beamID, Double_t &colliding, Double_t &noncolliding) const\r
+{\r
+  // get average intensity for all, colliding and non-colliding bunches\r
+  // on success returns number of intensity records used (1 per ~10 min)\r
+  colliding = noncolliding = -1.;\r
+  if (beamID<0||beamID>1) {\r
+    AliError(Form("BeamID must be either 0 or 1, %d requested",beamID));\r
+    return -10;\r
+  }\r
+  //\r
+  int nrec = GetNIntensityPerBunch(beamID);\r
+  if (nrec<1) return -1;\r
+  AliLHCDipValI *conf = GetBunchConfigMeasured(beamID);\r
+  if (!conf) conf = GetBunchConfigDeclared(beamID);\r
+  if (!conf) return -2;\r
+  int nb = conf->GetSize();\r
+  //\r
+  for (int irec=0;irec<nrec;irec++) {\r
+    AliLHCDipValF* rInt = GetIntensityPerBunch(beamID,irec);\r
+    for (int ib=0;ib<nb;ib++) {\r
+      double val = rInt->GetValue(ib);\r
+      if (val<0) continue;\r
+      int bID = conf->GetValue(ib);\r
+      if (bID<0) colliding += val;\r
+      else noncolliding += val;\r
+    }\r
+  }\r
+  colliding /= nrec;\r
+  noncolliding /= nrec;\r
+  return nrec;\r
+}\r