]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliLHCData.cxx
Quick fix for bug 71658
[u/mrichter/AliRoot.git] / STEER / AliLHCData.cxx
index 16867b6b47d4db2e397f8c664bf87a12986342bf..03d28ebf86e2db48f608ff3dff48e4c84d22afa3 100755 (executable)
@@ -139,9 +139,9 @@ Bool_t AliLHCData::FillData(double tmin, double tmax)
   SetTMax(tmax);\r
   //\r
   // -------------------------- extract Fill Number\r
-  int iEntry;\r
-  TObjArray* arr = GetDCSEntry(fgkDCSNames[kFillNum],iEntry,fTMin,fTMax);\r
-  if (arr) 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
@@ -221,10 +221,11 @@ Bool_t AliLHCData::FillData(double tmin, double tmax)
 }\r
 \r
 //___________________________________________________________________\r
-TObjArray* AliLHCData::GetDCSEntry(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 or file and find the first entry within the time limits\r
   entry = -1;\r
+  last = -2;\r
   TObjArray* arr;\r
   if (fMap2Process) arr = (TObjArray*)fMap2Process->GetValue(key);\r
   else if (fFile2Process) {\r
@@ -242,11 +243,18 @@ TObjArray* AliLHCData::GetDCSEntry(const char* key,int &entry,double tmin,double
     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
@@ -256,6 +264,17 @@ TObjArray* AliLHCData::GetDCSEntry(const char* key,int &entry,double tmin,double
     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
@@ -317,42 +336,39 @@ Int_t AliLHCData::FillScalarRecord(int refs[2], const char* rec, const char* rec
   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(rec,iEntry,fTMin,fTMax)) ) 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(recErr,iEntryE,fTMin,fTMax)) ) 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
@@ -361,6 +377,7 @@ Int_t AliLHCData::FillScalarRecord(int refs[2], const char* rec, const char* rec
     //\r
     fData.Add(curValF);\r
     refs[kNStor]++;\r
+    if (last) break;\r
   }\r
   //\r
   if (fFile2Process) {\r
@@ -377,19 +394,18 @@ Int_t AliLHCData::FillBunchConfig(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(rec,iEntry,fTMin,fTMax)) ) 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
@@ -418,19 +434,17 @@ Int_t AliLHCData::FillAcqMode(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(rec,iEntry,fTMin,fTMax)) ) 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
@@ -455,18 +469,16 @@ Int_t AliLHCData::FillStringRecord(int refs[2],const char* rec)
   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(rec,iEntry,fTMin,fTMax)) ) 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
@@ -491,18 +503,16 @@ Int_t AliLHCData::FillBunchInfo(int refs[2],const char* rec, int ibm, Bool_t inR
   //\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(rec,iEntry,fTMin,fTMax)) ) 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
@@ -544,18 +554,16 @@ Int_t AliLHCData::FillBCLuminosities(int refs[2],const char* rec, const char* re
   //\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(rec,iEntry,fTMin,fTMax)) ) 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;\r
     bconf = GetBunchConfigMeasured(useBeam,tstamp);  // luminosities are stored according to beam bunches\r
@@ -585,8 +593,7 @@ Int_t AliLHCData::FillBCLuminosities(int refs[2],const char* rec, const char* re
     }\r
     //\r
     if (recErr) {\r
-      if ( !(arrE=GetDCSEntry(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
@@ -606,17 +613,16 @@ Int_t AliLHCData::FillBCLuminosities(int refs[2],const char* rec, const char* re
     //\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
@@ -703,106 +709,107 @@ 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
-  TString sdtmn = AliLHCDipValI::TimeAsString(fTMin);\r
-  TString sdtmx = AliLHCDipValI::TimeAsString(fTMax);\r
-  printf("Fill#%6d Validity: %s - %s\n",fFillNumber,sdtmn.Data(),sdtmx.Data());\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("* %-38s","Injection Scheme");\r
-  PrintAux(full,fRCInjScheme);\r
+  PrintAux(full,fRCInjScheme,opts);\r
   //\r
   printf("* %-38s","Beta Star");\r
-  PrintAux(full,fRCBeta);\r
+  PrintAux(full,fRCBeta,opts);\r
   //\r
   printf("* %-38s","Horisontal Crossing Angle");\r
-  PrintAux(full,fRCAngH);\r
+  PrintAux(full,fRCAngH,opts);\r
   //\r
   printf("* %-38s","Vertical   Crossing Angle");\r
-  PrintAux(full,fRCAngV);\r
+  PrintAux(full,fRCAngV,opts);\r
   //\r
   for (int ib=0;ib<2;ib++) {\r
     printf("* Beam%d filling  [- interacts at IR2!]  ",ib+1);\r
-    PrintAux(full,fBunchConfDecl[ib]);\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 filling  [- interacts at IR2!]  ",ib+1);\r
-    PrintAux(full,fBunchConfMeas[ib]);\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
+    PrintAux(full,fIntensTotal[ib],opts);\r
   } \r
   //\r
   for (int ib=0;ib<2;ib++) {\r
     printf("* Beam%d total intensity (bunch average) ",ib+1);\r
-    PrintAux(full,fIntensTotalAv[ib]);\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
+    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
+    PrintAux(full,fBunchLengths[ib],opts);\r
   } \r
   //\r
   for (int ib=0;ib<2;ib++) {\r
     printf("* Beam%d Horisontal emittance            ",ib+1);\r
-    PrintAux(full,fEmittanceH[ib]);\r
+    PrintAux(full,fEmittanceH[ib],opts);\r
   }\r
   //\r
   for (int ib=0;ib<2;ib++) {\r
     printf("* Beam%d Vertical emittance              ",ib+1);\r
-    PrintAux(full,fEmittanceV[ib]);\r
+    PrintAux(full,fEmittanceV[ib],opts);\r
   }\r
   //\r
   for (int ib=0;ib<2;ib++) {\r
     printf("* Beam%d Horisontal sigma                ",ib+1);\r
-    PrintAux(full,fBeamSigmaH[ib]);\r
+    PrintAux(full,fBeamSigmaH[ib],opts);\r
   }\r
   //\r
   for (int ib=0;ib<2;ib++) {\r
     printf("* Beam%d Vertical sigma                  ",ib+1);\r
-    PrintAux(full,fBeamSigmaV[ib]);\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
+    PrintAux(full,fLuminTotal[lr],opts);\r
   } \r
   //\r
   for (int lr=0;lr<2;lr++) {\r
     printf("* Luminosity acq.mode, BRANB_4%c2        ",lr ? 'R':'L');\r
-    PrintAux(full,fLuminAcqMode[lr],"bit");\r
+    PrintAux(full,fLuminAcqMode[lr],opts+"bit");\r
   } \r
   //\r
   for (int lr=0;lr<2;lr++) {\r
     printf("* Luminosity per BC from BRANB_4%c2      ",lr ? 'R':'L');\r
-    PrintAux(full,fLuminPerBC[lr]);\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
+    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 %10s:%16s",fgkDCSColNames[coll],fgkDCSColJaws[jaw]);\r
-      PrintAux(full,fCollimators[coll][jaw]);\r
+      PrintAux(full,fCollimators[coll][jaw],opts);\r
     }\r
   //\r
 }\r
@@ -930,3 +937,36 @@ void AliLHCData::FlagInteractingBunches(const Int_t beam1[2],const Int_t beam2[2
     }\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