+//_____________________________________________________________________________
+AliMUONTrackerData::AliMUONTrackerData(const char* name, const char* title,
+ const AliMUONVStore& manuValues)
+: AliMUONVTrackerData(name,title),
+fIsSingleEvent(kFALSE),
+fChannelValues(0x0),
+fManuValues(0x0),
+fBusPatchValues(0x0),
+fDEValues(0x0),
+fChamberValues(0x0),
+fPCBValues(0x0),
+fDimension(0),
+fNevents(0),
+fDimensionNames(0x0),
+fExternalDimensionNames(0x0),
+fExternalDimension(0),
+fHistogramming(0x0),
+fHistos(0x0),
+fXmin(0.0),
+fXmax(0.0),
+fIsChannelLevelEnabled(kFALSE),
+fIsManuLevelEnabled(kTRUE),
+fNofDDLs(0),
+fNofEventsPerDDL(0x0)
+{
+ /// ctor with pre-computed values at the manu level
+ /// In this case, we force fIsChannelLevelEnabled = kFALSE
+ /// ctor
+
+ if (manuValues.GetSize()==0)
+ {
+ AliFatal("Cannot create a tracker data from nothing in that case !");
+ }
+
+ if ( !AliMpDDLStore::Instance(kFALSE) && !AliMpManuStore::Instance(kFALSE) )
+ {
+ AliError("Cannot work without (full) mapping");
+ return;
+ }
+
+ TIter next(manuValues.CreateIterator());
+ AliMUONVCalibParam* m = static_cast<AliMUONVCalibParam*>(next());
+
+ Int_t dimension = ( m->Dimension() - fgkExtraDimension - fgkVirtualExtraDimension ) / 2;
+
+ fDimension = External2Internal(dimension)+fgkExtraDimension;
+
+ fDimensionNames = new TObjArray(fDimension+fgkVirtualExtraDimension);
+ fExternalDimensionNames = new TObjArray(dimension);
+ fExternalDimension = dimension;
+ fHistogramming = new Int_t[fExternalDimension];
+ memset(fHistogramming,0,fExternalDimension*sizeof(Int_t)); // histogramming is off by default. Use MakeHistogramForDimension to turn it on.
+
+ fExternalDimensionNames->SetOwner(kTRUE);
+ fDimensionNames->SetOwner(kTRUE);
+ fDimensionNames->AddAt(new TObjString("occ"),IndexOfOccupancyDimension());
+ fDimensionNames->AddAt(new TObjString("N"),IndexOfNumberDimension());
+ fDimensionNames->AddAt(new TObjString("n"),NumberOfDimensions()-fgkVirtualExtraDimension);
+ Clear();
+ TArrayI nevents(AliDAQ::NumberOfDdls("MUONTRK"));
+ AssertStores();
+
+ next.Reset();
+ AliMUONVCalibParam* external;
+
+ while ( ( external = static_cast<AliMUONVCalibParam*>(next()) ) )
+ {
+ Int_t detElemId, manuId;
+
+ GetDEManu(*external,detElemId,manuId);
+
+ AliMUONVCalibParam* chamber(0x0);
+ AliMUONVCalibParam* de(0x0);
+ AliMUONVCalibParam* busPatch(0x0);
+ AliMUONVCalibParam* pcb(0x0);
+ AliMUONVCalibParam* manu(0x0);
+ AliMUONVCalibParam* channel(0x0);
+ AliMpDetElement* mpde(0x0);
+
+ AliMUONVCalibParam* wec = new AliMUONCalibParamND(external->Dimension()-1,1,detElemId,manuId,0);
+ // as external, but without event count
+ wec->SetValueAsDouble(0,0,external->ValueAsDouble(0,0));
+ wec->SetValueAsDouble(0,1,external->ValueAsDouble(0,1));
+ wec->SetValueAsDouble(0,2,external->ValueAsDouble(0,2));
+ wec->SetValueAsDouble(0,3,external->ValueAsDouble(0,3));
+
+ Int_t mid = GetParts(wec,chamber,de,busPatch,pcb,manu,channel,mpde);
+
+ if ( manuId != mid )
+ {
+ AliError(Form("Something is wrong for DE %5d : manuId = %d vs mid = %d",detElemId,manuId,mid));
+ continue;
+ }
+
+ if ( manuId < 0 )
+ {
+ AliError("Got a < 0 manuId. Should not happen here !");
+ continue;
+ }
+
+ assert(channel==0x0);
+
+ Int_t n1 = manu->ValueAsInt(0,IndexOfNumberDimension());
+ Int_t n2 = external->ValueAsInt(0,IndexOfNumberDimension());
+ if ( n1 != n2 )
+ {
+ AliError(Form("Incoherent number of manu channels for DE %5d MANU %5d : %d vs %d",
+ detElemId,manuId,n1,n2));
+ }
+
+ Int_t nevt = external->ValueAsInt(0,4);
+
+ Int_t busPatchId = AliMpDDLStore::Instance()->GetBusPatchId(detElemId,manuId);
+
+ Int_t ddl = AliMpDDLStore::Instance()->GetDDLfromBus(busPatchId);
+
+ if ( nevents[ddl] == 0 )
+ {
+ nevents[ddl] = nevt;
+ }
+ else
+ {
+ if ( nevents.At(ddl) != nevt )
+ {
+ AliError(Form("Nevt mismatch for DE %5d MANU %5d DDL %d : %d vs %d",
+ detElemId,manuId,ddl,nevents.At(ddl),nevt));
+ continue;
+ }
+ }
+
+ for ( Int_t i = 0; i < wec->Dimension()-1; ++i )
+ {
+ manu->SetValueAsDouble(0,i,manu->ValueAsDouble(0,i) + wec->ValueAsDouble(0,i));
+
+ busPatch->SetValueAsDouble(0,i,busPatch->ValueAsDouble(0,i) + wec->ValueAsDouble(0,i));
+
+ de->SetValueAsDouble(0,i,de->ValueAsDouble(0,i) + wec->ValueAsDouble(0,i));
+
+ chamber->SetValueAsDouble(0,i,chamber->ValueAsDouble(0,i) + wec->ValueAsDouble(0,i));
+ }
+ delete wec;
+ }
+
+ UpdateNumberOfEvents(&nevents);
+
+}
+
+