X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;ds=sidebyside;f=MUON%2FAliMUONCalibrationData.cxx;h=eedd6f99629d93514ca929190c220f3540f7f78b;hb=47791468b84db3988e4115a27693750a86b571b6;hp=9c0ba7a324d8d8a2d6debd7e3fd4645c29d66e9c;hpb=ac0a58c356df70cf2e5f0c63f90bd9f3fb878413;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONCalibrationData.cxx b/MUON/AliMUONCalibrationData.cxx index 9c0ba7a324d..eedd6f99629 100644 --- a/MUON/AliMUONCalibrationData.cxx +++ b/MUON/AliMUONCalibrationData.cxx @@ -13,7 +13,7 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -// $Id$ +// $Id: AliMUONCalibrationData.cxx 59486 2012-11-07 22:06:24Z laphecet $ #include "AliMUONCalibrationData.h" @@ -54,6 +54,8 @@ /// \author Laurent Aphecetche //----------------------------------------------------------------------------- +using std::cout; +using std::endl; /// \cond CLASSIMP ClassImp(AliMUONCalibrationData) /// \endcond @@ -61,7 +63,9 @@ ClassImp(AliMUONCalibrationData) AliMUONVStore* AliMUONCalibrationData::fgBypassPedestals(0x0); AliMUONVStore* AliMUONCalibrationData::fgBypassGains(0x0); -namespace +UInt_t AliMUONCalibrationData::fgkDCSSt1Flag(42); + +namespace { void MarkForDeletion(Int_t* indices, Int_t first, Int_t last) { @@ -235,7 +239,8 @@ Bool_t AliMUONCalibrationData::CheckHVGroup(TObjArray& values, Int_t first, Int_ //______________________________________________________________________________ Bool_t AliMUONCalibrationData::PatchHVValues(TObjArray& values, - TString* msg) + TString* msg, + Bool_t dryRun) { /// We do here a little bit of massaging of the HV values, if needed. /// @@ -246,6 +251,8 @@ Bool_t AliMUONCalibrationData::PatchHVValues(TObjArray& values, /// This is to avoid both the "ramp-down-before-end-of-run" and the /// "ramp-up-after-start-of-run" syndroms... /// + /// Use dryRun = kTRUE to fill the messages *without* altering the values + /// /// Return kFALSE is the kind of HV (trouble) case we have here /// has not been identified... /// @@ -305,6 +312,8 @@ Bool_t AliMUONCalibrationData::PatchHVValues(TObjArray& values, Int_t nEndRD(0); Int_t nTripRD(0); Int_t nFluct(0); + TObjArray trips; + trips.SetOwner(kTRUE); while ( ( p = static_cast(nextGroup()) ) ) { @@ -356,6 +365,8 @@ Bool_t AliMUONCalibrationData::PatchHVValues(TObjArray& values, if ( d->GetFloat() < AliMpDCSNamer::TrackerHVOFF() ) { ++nTripRD; + AliDCSValue* tripStart = static_cast(values.At(p->GetFirst())); + trips.Add(new AliMpIntPair(tripStart->GetTimeStamp(),TMath::Nint(tripStart->GetFloat()))); } } else @@ -437,6 +448,11 @@ Bool_t AliMUONCalibrationData::PatchHVValues(TObjArray& values, } else if ( nTripRD > 0 ) { + const Double_t HVLOWTRIP(600); // a trip below this value is considered a "low trip" + // i.e. one starting for a non-operational voltage + + internalMsg += Form("NT:%d ",nTripRD); + if ( nRU > 0 && nRD > 0 ) { hvCase = "F"; @@ -445,56 +461,90 @@ Bool_t AliMUONCalibrationData::PatchHVValues(TObjArray& values, { hvCase = "E"; } - internalMsg += "TRIP "; - MarkForDeletion(indices,0,values.GetLast()); - values.Add(new AliDCSValue(static_cast(0),meanTimeStamp)); + + for ( Int_t iTrip = 0; iTrip <= trips.GetLast(); ++iTrip ) + { + AliMpIntPair* tripPair = static_cast(trips.At(iTrip)); + TString tripType("TRIP"); + if ( tripPair->GetSecond() < HVLOWTRIP) + { + tripType = "LOWTRIP"; + } + + internalMsg += Form("%s SV:%d TS:%d ",tripType.Data(),tripPair->GetSecond(),tripPair->GetFirst()); + } + + // we put here the TRIP value as SV:value + // for cases where there's a drop in voltage but the starting point was + // below operational voltage, so strictly speaking it's *not* a trip, but + // more a big fluctuation + if ( !dryRun ) + { + MarkForDeletion(indices,0,values.GetLast()); + values.Add(new AliDCSValue(static_cast(0),meanTimeStamp)); + } } else if ( nStartRU > 0 && nRU == 0 && nRD == 0 && nEndRD == 0 ) { hvCase = "C"; - sscanf(internalMsg.Data(),"RU%10d[%10d:%10d]%80s",&dummy,&a,&b,r); - MarkForDeletion(indices,a,b); + if (!dryRun) + { + sscanf(internalMsg.Data(),"RU%10d[%10d:%10d]%80s",&dummy,&a,&b,r); + MarkForDeletion(indices,a,b); + } } else if ( nStartRU > 0 && nEndRD > 0 && nRD == 0 && nRU == 0 ) { hvCase = "D"; - sscanf(internalMsg.Data(),"RU%10d[%10d:%10d]%80s",&dummy,&a,&b,r); - MarkForDeletion(indices,a,b-1); - Int_t i = internalMsg.Index("RD",strlen("RD"),0,TString::kExact); - sscanf(internalMsg(i,internalMsg.Length()-i).Data(), - "RD%10d[%10d:%10d]%80s",&dummy,&a,&b,r); - MarkForDeletion(indices,a+1,b); + if (!dryRun) + { + sscanf(internalMsg.Data(),"RU%10d[%10d:%10d]%80s",&dummy,&a,&b,r); + MarkForDeletion(indices,a,b-1); + Int_t i = internalMsg.Index("RD",strlen("RD"),0,TString::kExact); + sscanf(internalMsg(i,internalMsg.Length()-i).Data(), + "RD%10d[%10d:%10d]%80s",&dummy,&a,&b,r); + MarkForDeletion(indices,a+1,b); + } } else if ( nEndRD > 0 && nStartRU == 0 && nRU == 0 && nRD == 0 ) { hvCase = "B"; - Int_t i = internalMsg.Index("RD",strlen("RD"),0,TString::kExact); - sscanf(internalMsg(i,internalMsg.Length()-i).Data(), - "RD%10d[%10d:%10d]%80s",&dummy,&a,&b,r); - MarkForDeletion(indices,a,b); + if (!dryRun) + { + Int_t i = internalMsg.Index("RD",strlen("RD"),0,TString::kExact); + sscanf(internalMsg(i,internalMsg.Length()-i).Data(), + "RD%10d[%10d:%10d]%80s",&dummy,&a,&b,r); + MarkForDeletion(indices,a,b); + } } else if ( nFluct > 0 ) { hvCase = "G"; - TObjArray* af = internalMsg.Tokenize(" "); - TIter next(af); - TObjString* str; - while ( ( str = static_cast(next()) ) ) + if (!dryRun) { - TString s(str->String()); - if ( s.BeginsWith("FLUCT") ) + TObjArray* af = internalMsg.Tokenize(" "); + TIter next(af); + TObjString* str; + while ( ( str = static_cast(next()) ) ) { - sscanf(s.Data(),"FLUCT%d[%d:%d]",&dummy,&a,&b); - MarkForDeletion(indices,a,b); + TString s(str->String()); + if ( s.BeginsWith("FLUCT") ) + { + sscanf(s.Data(),"FLUCT%d[%d:%d]",&dummy,&a,&b); + MarkForDeletion(indices,a,b); + } } + delete af; } - delete af; } else if ( nEndAndShortRU > 0 && nStartRU == 0 && nRU == 0 && nRD == 0 && nEndRD == 0 ) { hvCase = "H"; - sscanf(internalMsg.Data(),"RU%10d[%10d:%10d]%80s",&dummy,&a,&b,r); - MarkForDeletion(indices,a,b); + if (!dryRun) + { + sscanf(internalMsg.Data(),"RU%10d[%10d:%10d]%80s",&dummy,&a,&b,r); + MarkForDeletion(indices,a,b); + } } else { @@ -508,19 +558,25 @@ Bool_t AliMUONCalibrationData::PatchHVValues(TObjArray& values, { hvCase = "Z"; } - MarkForDeletion(indices,1,nvalues-1); + if (!dryRun) + { + MarkForDeletion(indices,1,nvalues-1); + } } - for ( Int_t i = 0; i < nvalues; ++i ) + if (!dryRun) { - if ( indices[i] ) + for ( Int_t i = 0; i < nvalues; ++i ) { - values.RemoveAt(i); + if ( indices[i] ) + { + values.RemoveAt(i); + } } + + values.Compress(); } - values.Compress(); - delete[] indices; if ( !values.GetEntries() ) @@ -530,22 +586,25 @@ Bool_t AliMUONCalibrationData::PatchHVValues(TObjArray& values, hvCase = "OTHER"; } - // take the max of the remaining values - TIter nextA(&values); - AliDCSValue* val; - Float_t maxval(-9999); - - while ( ( val = static_cast(nextA()) ) ) + if (!dryRun) { - if ( val->GetFloat() > maxval ) + // take the max of the remaining values + TIter nextA(&values); + AliDCSValue* val; + Float_t maxval(-9999); + + while ( ( val = static_cast(nextA()) ) ) { - maxval = val->GetFloat(); + if ( val->GetFloat() > maxval ) + { + maxval = val->GetFloat(); + } } - } - values.Clear(); + values.Clear(); - values.Add(new AliDCSValue(maxval,meanTimeStamp)); + values.Add(new AliDCSValue(maxval,meanTimeStamp)); + } // once the case is inferred, add a "CASE:%10d",hvCase.Data() // to the msg @@ -558,17 +617,112 @@ Bool_t AliMUONCalibrationData::PatchHVValues(TObjArray& values, return hvCase=="OTHER" ? kFALSE : kTRUE; } +//_____________________________________________________________________________ +void AliMUONCalibrationData::AddToMap(const TMap& sourceMap, + TMap& destMap, + const TString& key, + const char* source, + const char* dest) +{ + /// Remap + + TString newkey(key); + + newkey.ReplaceAll(source,dest); + + TPair* pair = static_cast(sourceMap.FindObject(key.Data())); + + destMap.Add(new TObjString(newkey.Data()),pair->Value()); +} + +//_____________________________________________________________________________ +void AliMUONCalibrationData::PatchSt1DCSAliases(TMap& hvMap) +{ + /// It was discovered (in sept. 2013) that the DCS aliases for St1 was + /// wrongly assigned (in the hardware), so the correspondence between DCS channels + /// and actual HV channels is wrong for St1 in the DCS (and thus in the DCS archive, + /// and so in the OCDB HV object). + /// + /// It affects all the OCDB object written in 2010-2013. + /// + /// This method fixes that. + + if ( hvMap.GetUniqueID() == fgkDCSSt1Flag ) + { + // already clean object. Do nothing + return; + } + + TIter next(&hvMap); + TObjString* hvChannelName; + + TMap newmap; + newmap.SetOwnerKeyValue(kTRUE,kFALSE); + + while ( ( hvChannelName = static_cast(next()) ) ) + { + TString name(hvChannelName->String()); + TString newname(name); + + // the problem is limited to St1 = ch1+ch2 (or, in DCS parlance, ch0+ch1) + // do it "by hand" as we "only" have 8 names to change + + if ( name.Contains("Chamber00Left") ) + { + if (name.Contains("Quad1Sect0")) AddToMap(hvMap,newmap,name,"Quad1Sect0","Quad2Sect0"); // channel 0 of Board00 (alidcscae020) + + if (name.Contains("Quad1Sect1")) AddToMap(hvMap,newmap,name,"Quad1Sect1","Quad2Sect1"); // channel 1 + if (name.Contains("Quad1Sect2")) AddToMap(hvMap,newmap,name,"Quad1Sect2","Quad2Sect2"); // channel 2 + + if (name.Contains("Quad2Sect2")) AddToMap(hvMap,newmap,name,"Quad2Sect2","Quad1Sect0"); // channel 3 + if (name.Contains("Quad2Sect1")) AddToMap(hvMap,newmap,name,"Quad2Sect1","Quad1Sect1"); // channel 4 + if (name.Contains("Quad2Sect0")) AddToMap(hvMap,newmap,name,"Quad2Sect0","Quad1Sect2"); // channel 5 + } + else if ( name.Contains("Chamber01Left")) + { + if (name.Contains("Quad2Sect2")) AddToMap(hvMap,newmap,name,"Quad2Sect2","Quad2Sect0"); // channel 9 of Board00 (alidcscae020) + if (name.Contains("Quad2Sect0")) AddToMap(hvMap,newmap,name,"Quad2Sect0","Quad2Sect2"); // channel 11 + } + else + { + AddToMap(hvMap,newmap,name,name,name); + } + } + + // copy newmap to hvMap + + TIter nextNewMap(&newmap); + while ( ( hvChannelName = static_cast(nextNewMap()) ) ) + { + TPair* oldPair = static_cast(hvMap.FindObject(hvChannelName->String().Data())); + TPair* newPair = static_cast(newmap.FindObject(hvChannelName->String().Data())); + + TObjArray* newValues = static_cast(newPair->Value()); + + oldPair->SetValue(newValues); + } +} + //_____________________________________________________________________________ TMap* AliMUONCalibrationData::CreateHV(Int_t runNumber, Int_t* startOfValidity, Bool_t patched, - TList* messages) + TList* messages, + Bool_t dryRun) { /// Create a new HV map from the OCDB for a given run + /// + /// dryRun is only usefull with patched=kTRUE and non-empty messages) : + /// it allow to get the list of messages without altering the values at all + /// (A patch without a patch, so to speak...) + /// + TMap* hvMap = dynamic_cast(CreateObject(runNumber,"MUON/Calib/HV",startOfValidity)); if (!hvMap) return 0x0; + + PatchSt1DCSAliases(*hvMap); if (patched) { @@ -580,7 +734,9 @@ AliMUONCalibrationData::CreateHV(Int_t runNumber, TString name(hvChannelName->String()); if ( name.Contains("sw") ) continue; // skip switches - + + if ( name.Contains("iMon") ) continue; // skip HV currents + TPair* hvPair = static_cast(hvMap->FindObject(name.Data())); TObjArray* values = static_cast(hvPair->Value()); if (!values) @@ -592,11 +748,11 @@ AliMUONCalibrationData::CreateHV(Int_t runNumber, TString msg; AliDebugClass(1,Form("channel %s",name.Data())); - Bool_t ok = PatchHVValues(*values,&msg); + Bool_t ok = PatchHVValues(*values,&msg,dryRun); if ( messages ) { - messages->Add(new TObjString(Form("%s:%s",hvChannelName->String().Data(),msg.Data()))); + messages->Add(new TObjString(Form("%s %s",hvChannelName->String().Data(),msg.Data()))); } if (!ok) @@ -615,7 +771,7 @@ AliMUONCalibrationData::CreateHV(Int_t runNumber, Int_t a(0),b(0),c(0),d(0),e(0),f(0),g(0),h(0),u(0),z(0); TIter next(messages); TObjString* msg; - char hvCase; + char hvCase('u'); while ( ( msg = static_cast(next()) ) ) { @@ -696,6 +852,10 @@ AliMUONCalibrationData::CreateObject(Int_t runNumber, const char* path, Int_t* s entry->SetOwner(kFALSE); delete entry; } +// else +// { +// entry->SetOwner(kTRUE); //FIXME : this should be done but is causing problems with RecoParams at the end of the reco : investigate why... +// } return object; } else