]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONCDB.cxx
Fixing Coverity reported problems (REVERSE INULL, UNIT_CTOR, FORWARD_NULL)
[u/mrichter/AliRoot.git] / MUON / AliMUONCDB.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 //-----------------------------------------------------------------------------
19 /// \namespace AliMUONCDB
20 ///
21 /// Helper functions to experience the OCDB
22 ///
23 /// They allow to read magnetic field, mapping and recoParam from OCDB
24 ///
25 /// And also to generate dummy (but complete) containers for all the
26 /// calibration data types we have for tracker and trigger, and to write
27 /// them into OCDB.
28 ///
29 /// For more information, please see READMEcalib
30 ///
31 /// \author Laurent Aphecetche
32 //-----------------------------------------------------------------------------
33
34 #include "AliMUONCDB.h"
35
36 #include "AliMUON1DArray.h"
37 #include "AliMUON1DMap.h"
38 #include "AliMUON2DMap.h"
39 #include "AliMUON2DStoreValidator.h"
40 #include "AliMUONCalibParamND.h"
41 #include "AliMUONCalibParamNF.h"
42 #include "AliMUONCalibParamNI.h"
43 #include "AliMUONCalibrationData.h"
44 #include "AliMUONConstants.h"
45 #include "AliMUONGlobalCrateConfig.h"
46 #include "AliMUONPadStatusMaker.h"
47 #include "AliMUONPadStatusMapMaker.h"
48 #include "AliMUONRecoParam.h"
49 #include "AliMUONRegionalTriggerConfig.h"
50 #include "AliMUONRejectList.h"
51 #include "AliMUONTrackerIO.h"
52 #include "AliMUONTriggerEfficiencyCells.h"
53 #include "AliMUONTriggerLut.h"
54 #include "AliMUONVCalibParam.h"
55 #include "AliMUONVCalibParam.h"
56 #include "AliMUONVStore.h"
57
58
59 #include "AliMpCDB.h"
60 #include "AliMpConstants.h"
61 #include "AliMpDEStore.h"
62 #include "AliMpDDLStore.h"
63 #include "AliMpManuStore.h"
64 #include "AliMpDEManager.h"
65 #include "AliMpDetElement.h"
66 #include "AliMpFiles.h"
67 #include "AliMpDCSNamer.h"
68 #include "AliMpManuIterator.h"
69 #include "AliMpSegmentation.h"
70 #include "AliMpStationType.h"
71 #include "AliMpVSegmentation.h"
72
73 #include "AliCodeTimer.h"
74 #include "AliCDBEntry.h"
75 #include "AliCDBManager.h"
76 #include "AliGRPManager.h"
77 #include "AliDCSValue.h"
78 #include "AliLog.h"
79 #include "AliMpBusPatch.h"
80
81 #include <Riostream.h>
82 #include <TArrayI.h>
83 #include <TClass.h>
84 #include <TH1F.h>
85 #include <TList.h>
86 #include <TMap.h>
87 #include <TObjString.h>
88 #include <TROOT.h>
89 #include <TRandom.h>
90 #include <TStopwatch.h>
91 #include <TSystem.h>
92 #include <TMath.h>
93 #include <TGeoGlobalMagField.h>
94 #include <TClonesArray.h>
95 #include <sstream>
96
97 namespace
98 {
99   //_____________________________________________________________________________
100 AliMUONVStore* Create2DMap()
101 {
102   return new AliMUON2DMap(true);
103 }
104
105   //_____________________________________________________________________________
106 void getBoundaries(const AliMUONVStore& store, Int_t dim,
107                    Float_t* xmin, Float_t* xmax)
108 {
109   /// Assuming the store contains AliMUONVCalibParam objects, compute the
110   /// limits of the value contained in the VCalibParam, for each of its dimensions
111   /// xmin and xmax must be of dimension dim
112   
113   for ( Int_t i = 0; i < dim; ++i ) 
114   {
115     xmin[i]=1E30;
116     xmax[i]=-1E30;
117   }
118   
119   TIter next(store.CreateIterator());
120   AliMUONVCalibParam* value;
121   
122   while ( ( value = dynamic_cast<AliMUONVCalibParam*>(next() ) ) )
123   {
124     Int_t detElemId = value->ID0();
125     Int_t manuId = value->ID1();
126     
127     const AliMpVSegmentation* seg = 
128       AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId,manuId);
129         
130     for ( Int_t manuChannel = 0; manuChannel < value->Size(); ++manuChannel )
131     {
132       AliMpPad pad = seg->PadByLocation(manuId,manuChannel,kFALSE);
133       if (!pad.IsValid()) continue;
134       
135       for ( Int_t i = 0; i < dim; ++i ) 
136       {
137         Float_t x0 = value->ValueAsFloat(manuChannel,i);
138       
139         xmin[i] = TMath::Min(xmin[i],x0);
140         xmax[i] = TMath::Max(xmax[i],x0);
141       }
142     }
143   }
144
145   for ( Int_t i = 0; i < dim; ++i ) 
146   {
147     if ( TMath::Abs(xmin[i]-xmax[i]) < 1E-3 ) 
148     {
149       xmin[i] -= 1;
150       xmax[i] += 1;
151     }
152   }
153 }
154
155 //_____________________________________________________________________________
156 Double_t GetRandom(Double_t mean, Double_t sigma, Bool_t mustBePositive)
157 {
158   Double_t x(-1);
159   if ( mustBePositive ) 
160   {
161     while ( x < 0 ) 
162     {
163       x = gRandom->Gaus(mean,sigma);
164     }
165   }
166   else
167   {
168     x = gRandom->Gaus(mean,sigma);
169   }
170   return x;
171 }
172
173 }
174
175 //_____________________________________________________________________________
176 Bool_t AliMUONCDB::CheckOCDB(Bool_t pathOnly)
177 {
178   /// Check that OCDB path and run number are properly set
179   
180   AliCDBManager* man = AliCDBManager::Instance();
181   
182   // first OCDB path
183   if (!man->IsDefaultStorageSet()) {
184     AliErrorGeneral("AliMUONCDB", "OCDB path must be properly set");
185     return kFALSE;
186   }
187   
188   // then run number if required
189   if (pathOnly) return kTRUE;
190   if (man->GetRun() < 0) {
191     AliErrorGeneral("AliMUONCDB", "Run number must be properly set");
192     return kFALSE;
193   }
194   
195   return kTRUE;
196   
197 }
198
199 //_____________________________________________________________________________
200 Bool_t AliMUONCDB::CheckMapping(Bool_t segmentationOnly)
201 {
202   /// Check that the mapping has been loaded
203   
204   // first the segmentation
205   if (!AliMpSegmentation::Instance(false)) {
206     AliErrorGeneral("AliMUONCDB", "Mapping segmentation must be loaded first");
207     return kFALSE;
208   }
209   
210   // then the others if required
211   if (segmentationOnly) return kTRUE;
212   if (!AliMpDDLStore::Instance(false) || !AliMpDEStore::Instance(false) || !AliMpManuStore::Instance(false)) {
213     AliErrorGeneral("AliMUONCDB", "Full mapping must be loaded first");
214     return kFALSE;
215   }
216   
217   return kTRUE;
218   
219 }
220
221 //_____________________________________________________________________________
222 Bool_t AliMUONCDB::LoadField()
223 {
224   /// Load magnetic field (existing field will be deleted).
225   /// OCDB path and run number are supposed to be set.
226   
227   AliInfoGeneral("AliMUONCDB","Loading field map from GRP...");
228   
229   if (!AliMUONCDB::CheckOCDB()) return kFALSE;
230   
231   AliGRPManager grpMan;
232   
233   // make sure the old field is deleted even if it is locked
234   if(TGeoGlobalMagField::Instance()->IsLocked()) delete TGeoGlobalMagField::Instance();
235   
236   if (!grpMan.ReadGRPEntry() || !grpMan.SetMagField()) {
237     AliErrorGeneral("AliMUONCDB", "failed to load magnetic field from OCDB");
238     return kFALSE;
239   }
240   
241   return kTRUE;
242   
243 }
244
245 //_____________________________________________________________________________
246 Bool_t AliMUONCDB::LoadMapping(Bool_t segmentationOnly)
247 {
248   /// Load mapping (existing mapping will be unloaded).
249   /// OCDB path and run number are supposed to be set.
250   
251   AliInfoGeneral("AliMUONCDB", "Loading mapping from OCDB...");
252   
253   if (!AliMUONCDB::CheckOCDB()) return kFALSE;
254   
255   // in case it has already been set
256   AliMpCDB::UnloadAll();
257   
258   if (segmentationOnly) {
259     
260     if (!AliMpCDB::LoadMpSegmentation(kTRUE)){
261       AliErrorGeneral("AliMUONCDB", "failed to load segmentation from OCDB");
262       return kFALSE;
263     }
264     
265   } else {
266     
267     if (!AliMpCDB::LoadAll(kTRUE)) {
268       AliErrorGeneral("AliMUONCDB", "failed to load mapping from OCDB");
269       return kFALSE;
270     }
271     
272   }
273   
274   return kTRUE;
275   
276 }
277
278 //_____________________________________________________________________________
279 AliMUONRecoParam* AliMUONCDB::LoadRecoParam()
280 {
281   /// Load and return reconstruction parameters.
282   /// OCDB path is supposed to be set.
283   
284   AliInfoGeneral("AliMUONCDB", "Loading RecoParam from OCDB...");
285   
286   if (!AliMUONCDB::CheckOCDB()) return kFALSE;
287   
288   AliMUONRecoParam* recoParam = 0x0;
289   AliCDBEntry* entry = AliCDBManager::Instance()->Get("MUON/Calib/RecoParam");
290   
291   if(entry) {
292     
293     // load recoParam according OCDB content (single or array)
294     if (!(recoParam = dynamic_cast<AliMUONRecoParam*>(entry->GetObject()))) {
295       
296       TObjArray* recoParamArray = static_cast<TObjArray*>(entry->GetObject());
297       
298       for(Int_t i = 0; i < recoParamArray->GetEntriesFast(); i++) {
299         recoParam = static_cast<AliMUONRecoParam*>(recoParamArray->UncheckedAt(i));
300         if (recoParam->IsDefault()) break;
301         recoParam = 0x0;
302       }
303       
304     }
305     
306   }
307   
308   if (!recoParam) AliErrorGeneral("AliMUONCDB", "failed to load RecoParam from OCDB");
309   
310   return recoParam;
311   
312 }
313
314 //_____________________________________________________________________________
315 TClonesArray* AliMUONCDB::LoadAlignmentData()
316 {
317   /// Load and return the array of alignment objects.
318   
319   AliInfoGeneral("AliMUONCDB", "Loading Alignemnt from OCDB...");
320   
321   if (!AliMUONCDB::CheckOCDB()) return kFALSE;
322   
323   TClonesArray* alignmentArray = 0x0;
324   AliCDBEntry* entry = AliCDBManager::Instance()->Get("MUON/Align/Data");
325   
326   if (entry) {
327     // load alignement array
328     alignmentArray = dynamic_cast<TClonesArray*>(entry->GetObject());
329   }
330   
331   if (!alignmentArray) { 
332     AliErrorGeneral("AliMUONCDB", "failed to load Alignemnt from OCDB");
333   }  
334   
335   return alignmentArray;
336 }
337
338 //_____________________________________________________________________________
339 AliMUONVStore* 
340 AliMUONCDB::Diff(AliMUONVStore& store1, AliMUONVStore& store2, 
341                  const char* opt)
342 {
343   /// creates a store which contains store1-store2
344   /// if opt="abs" the difference is absolute one,
345   /// if opt="rel" then what is stored is (store1-store2)/store1
346   /// if opt="percent" then what is stored is rel*100
347   ///
348   /// WARNING Works only for stores which holds AliMUONVCalibParam objects
349   
350   TString sopt(opt);
351   sopt.ToUpper();
352   
353   if ( !sopt.Contains("ABS") && !sopt.Contains("REL") && !sopt.Contains("PERCENT") )
354   {
355     AliErrorGeneral("AliMUONCDB", Form("opt %s not supported. Only ABS, REL, PERCENT are",opt));
356     return 0x0;
357   }
358   
359   AliMUONVStore* d = static_cast<AliMUONVStore*>(store1.Clone());
360   
361   TIter next(d->CreateIterator());
362   
363   AliMUONVCalibParam* param;
364   
365   while ( ( param = dynamic_cast<AliMUONVCalibParam*>(next() ) ) )
366   {
367     Int_t detElemId = param->ID0();
368     Int_t manuId = param->ID1();
369     
370     AliMUONVCalibParam* param2 = dynamic_cast<AliMUONVCalibParam*>(store2.FindObject(detElemId,manuId));
371     //FIXME: this might happen. Handle it.
372     if (!param2) 
373     {
374       cerr << "param2 is null : FIXME : this might happen !" << endl;
375       delete d;
376       return 0;
377     }
378     
379     for ( Int_t i = 0; i < param->Size(); ++i )
380     {
381       for ( Int_t j = 0; j < param->Dimension(); ++j )
382       {
383         Float_t value(0);
384         if ( sopt.Contains("ABS") )
385         {
386           value = param->ValueAsFloat(i,j) - param2->ValueAsFloat(i,j);
387         }
388         else if ( sopt.Contains("REL") || sopt.Contains("PERCENT") )
389         {
390           if ( param->ValueAsFloat(i,j) ) 
391           {
392             value = (param->ValueAsFloat(i,j) - param2->ValueAsFloat(i,j))/param->ValueAsFloat(i,j);
393           }
394           else 
395           {
396             continue;
397           }
398           if ( sopt.Contains("PERCENT") ) value *= 100.0;
399         }
400         param->SetValueAsFloat(i,j,value);
401       }      
402     }
403   }
404   return d;
405 }
406
407 //_____________________________________________________________________________
408 void 
409 AliMUONCDB::Plot(const AliMUONVStore& store, const char* name, Int_t nbins)
410 {
411   /// Make histograms of each dimension of the AliMUONVCalibParam
412   /// contained inside store.
413   /// It produces histograms named name_0, name_1, etc...
414   
415   if (!AliMUONCDB::CheckMapping(kTRUE)) return;
416   
417   TIter next(store.CreateIterator());
418   AliMUONVCalibParam* param;
419   Int_t n(0);
420   const Int_t kNStations = AliMpConstants::NofTrackingChambers()/2;
421   Int_t* nPerStation = new Int_t[kNStations];
422   TH1** h(0x0);
423   
424   for ( Int_t i = 0; i < kNStations; ++i ) nPerStation[i]=0;
425   
426   while ( ( param = static_cast<AliMUONVCalibParam*>(next()) ) )
427   {
428     if (!h)
429     {
430       Int_t dim = param->Dimension();
431       h = new TH1*[dim];
432       Float_t* xmin = new Float_t[dim];
433       Float_t* xmax = new Float_t[dim];
434       getBoundaries(store,dim,xmin,xmax);
435       
436       for ( Int_t i = 0; i < dim; ++i ) 
437       {
438         h[i] = new TH1F(Form("%s_%d",name,i),Form("%s_%d",name,i),
439                             nbins,xmin[i],xmax[i]);
440         AliInfoGeneral("AliMUONCDB", Form("Created histogram %s",h[i]->GetName()));
441       }
442       delete [] xmin;
443       delete [] xmax;
444     }
445     
446     Int_t detElemId = param->ID0();
447     Int_t manuId = param->ID1();
448     Int_t station = AliMpDEManager::GetChamberId(detElemId)/2;
449     
450     const AliMpVSegmentation* seg = 
451       AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId,manuId);
452     
453     for ( Int_t manuChannel = 0; manuChannel < param->Size(); ++manuChannel )
454     {
455       AliMpPad pad = seg->PadByLocation(manuId,manuChannel,kFALSE);
456       if (!pad.IsValid()) continue;
457
458       ++n;
459       ++nPerStation[station];
460       
461       for ( Int_t dim = 0; dim < param->Dimension(); ++dim ) 
462       {
463         h[dim]->Fill(param->ValueAsFloat(manuChannel,dim));
464       }
465     }
466   } 
467   
468   for ( Int_t i = 0; i < kNStations; ++i )
469   {
470     AliInfoGeneral("AliMUONCDB", Form("Station %d %d ",(i+1),nPerStation[i]));
471   }
472
473   AliInfoGeneral("AliMUONCDB", Form("Number of channels = %d",n));
474   
475   delete[] nPerStation;
476 }
477
478 //_____________________________________________________________________________
479 Int_t 
480 AliMUONCDB::MakeHVStore(TMap& aliasMap, Bool_t defaultValues)
481 {
482   /// Create a HV store
483   
484   if (!AliMUONCDB::CheckMapping()) return 0;
485   
486   AliMpDCSNamer hvNamer("TRACKER");
487   
488   TObjArray* aliases = hvNamer.GenerateAliases();
489   
490   Int_t nSwitch(0);
491   Int_t nChannels(0);
492   
493   for ( Int_t i = 0; i < aliases->GetEntries(); ++i ) 
494   {
495     TObjString* alias = static_cast<TObjString*>(aliases->At(i));
496     TString& aliasName = alias->String();
497     if ( aliasName.Contains("sw") ) 
498     {
499       // HV Switch (St345 only)
500       TObjArray* valueSet = new TObjArray;
501       valueSet->SetOwner(kTRUE);
502       
503       Bool_t value = kTRUE;
504       
505       if (!defaultValues)
506       {
507         Float_t r = gRandom->Uniform();
508         if ( r < 0.007 ) value = kFALSE;      
509       } 
510       
511       for ( UInt_t timeStamp = 0; timeStamp < 60*3; timeStamp += 60 )
512       {
513         AliDCSValue* dcsValue = new AliDCSValue(value,timeStamp);
514         valueSet->Add(dcsValue);
515       }
516       aliasMap.Add(new TObjString(*alias),valueSet);
517       ++nSwitch;
518     }
519     else
520     {
521       TObjArray* valueSet = new TObjArray;
522       valueSet->SetOwner(kTRUE);
523       for ( UInt_t timeStamp = 0; timeStamp < 60*15; timeStamp += 120 )
524       {
525         Float_t value = 1500;
526         if (!defaultValues) value = GetRandom(1750,62.5,true);
527         AliDCSValue* dcsValue = new AliDCSValue(value,timeStamp);
528         valueSet->Add(dcsValue);
529       }
530       aliasMap.Add(new TObjString(*alias),valueSet);
531       ++nChannels;
532     }
533   }
534   
535   delete aliases;
536   
537   AliInfoGeneral("AliMUONCDB", Form("%d HV channels and %d switches",nChannels,nSwitch));
538   
539   return nChannels+nSwitch;
540 }
541
542 //_____________________________________________________________________________
543 Int_t 
544 AliMUONCDB::MakeTriggerDCSStore(TMap& aliasMap, Bool_t defaultValues)
545 {
546   /// Create a Trigger HV and Currents store
547   
548   if (!AliMUONCDB::CheckMapping()) return 0;
549   
550   AliMpDCSNamer triggerDCSNamer("TRIGGER");
551   
552   TObjArray* aliases = triggerDCSNamer.GenerateAliases();
553   
554   Int_t nChannels[2] = {0, 0};
555   
556   for ( Int_t i = 0; i < aliases->GetEntries(); ++i ) 
557   {
558     TObjString* alias = static_cast<TObjString*>(aliases->At(i));
559     TString& aliasName = alias->String();
560
561     TObjArray* valueSet = new TObjArray;
562     valueSet->SetOwner(kTRUE);
563
564     Int_t measureType = triggerDCSNamer.DCSvariableFromDCSAlias(aliasName.Data());
565     if ( measureType < 0 ) {
566       AliErrorGeneralStream("AliMUONCDB") 
567         << "Failed to get DCS variable from an alias (trigger): "
568         << aliasName.Data() << endl;
569       return 0;
570     }
571         
572     for ( UInt_t timeStamp = 0; timeStamp < 60*15; timeStamp += 120 )
573     {
574       Float_t value = 
575         (measureType == AliMpDCSNamer::kDCSI) ? 2. : 8000.;
576       if (!defaultValues) {
577         switch (measureType){
578         case AliMpDCSNamer::kDCSI:
579           value = GetRandom(2.,0.4,true);
580           break;
581         case AliMpDCSNamer::kDCSHV:
582           value = GetRandom(8000.,16.,true);
583           break;
584         }
585       }
586       AliDCSValue* dcsValue = new AliDCSValue(value,timeStamp);
587       valueSet->Add(dcsValue);
588     }
589     aliasMap.Add(new TObjString(*alias),valueSet);
590     ++nChannels[measureType];
591   }
592   
593   delete aliases;
594   
595   AliInfoGeneral("AliMUONCDB", Form("Trigger channels I -> %i   HV -> %i",nChannels[0], nChannels[1]));
596   
597   return nChannels[0] + nChannels[1];
598 }
599
600 //_____________________________________________________________________________
601 Int_t 
602 AliMUONCDB::MakePedestalStore(AliMUONVStore& pedestalStore, Bool_t defaultValues)
603 {
604   /// Create a pedestal store. if defaultValues=true, ped.mean=ped.sigma=1,
605   /// otherwise mean and sigma are from a gaussian (with parameters
606   /// defined below by the kPedestal* constants)
607
608   AliCodeTimerAutoGeneral("",0);
609   
610   if (!AliMUONCDB::CheckMapping()) return 0;
611   
612   Int_t nchannels(0);
613   Int_t nmanus(0);
614   
615   const Int_t kChannels(AliMpConstants::ManuNofChannels());
616   
617   // bending
618   const Float_t kPedestalMeanMeanB(200.);
619   const Float_t kPedestalMeanSigmaB(10.);
620   const Float_t kPedestalSigmaMeanB(1.);
621   const Float_t kPedestalSigmaSigmaB(0.2);
622   
623   // non bending
624   const Float_t kPedestalMeanMeanNB(200.);
625   const Float_t kPedestalMeanSigmaNB(10.);
626   const Float_t kPedestalSigmaMeanNB(1.);
627   const Float_t kPedestalSigmaSigmaNB(0.2);
628   
629   const Float_t kFractionOfDeadManu(0.); // within [0.,1.]
630
631   Int_t detElemId;
632   Int_t manuId;
633     
634   AliMpManuIterator it;
635   
636   while ( it.Next(detElemId,manuId) )
637   {
638     // skip a given fraction of manus
639     if (kFractionOfDeadManu > 0. && gRandom->Uniform() < kFractionOfDeadManu) continue;
640     
641     ++nmanus;
642
643     AliMUONVCalibParam* ped = 
644       new AliMUONCalibParamNF(2,kChannels,detElemId,manuId,AliMUONVCalibParam::InvalidFloatValue());
645
646     AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
647     
648     for ( Int_t manuChannel = 0; manuChannel < kChannels; ++manuChannel )
649     {
650       if ( ! de->IsConnectedChannel(manuId,manuChannel) ) continue;
651       
652       ++nchannels;
653       
654       Float_t meanPedestal;
655       Float_t sigmaPedestal;
656       
657       if ( defaultValues ) 
658       {
659         meanPedestal = 0.0;
660         sigmaPedestal = 1.0;
661       }
662       else
663       {
664         Bool_t positive(kTRUE);
665         meanPedestal = 0.0;
666         
667         if ( manuId & AliMpConstants::ManuMask(AliMp::kNonBendingPlane) ) { // manu in non bending plane
668           
669           while ( meanPedestal == 0.0 ) // avoid strict zero 
670           {
671             meanPedestal = GetRandom(kPedestalMeanMeanNB,kPedestalMeanSigmaNB,positive);
672           }
673           sigmaPedestal = GetRandom(kPedestalSigmaMeanNB,kPedestalSigmaSigmaNB,positive);
674           
675         } else { // manu in bending plane
676           
677           while ( meanPedestal == 0.0 ) // avoid strict zero 
678           {
679             meanPedestal = GetRandom(kPedestalMeanMeanB,kPedestalMeanSigmaB,positive);
680           }
681           sigmaPedestal = GetRandom(kPedestalSigmaMeanB,kPedestalSigmaSigmaB,positive);
682           
683         }
684         
685       }
686       
687       ped->SetValueAsFloat(manuChannel,0,meanPedestal);
688       ped->SetValueAsFloat(manuChannel,1,sigmaPedestal);
689       
690     }
691     Bool_t ok = pedestalStore.Add(ped);
692     if (!ok)
693     {
694       AliErrorGeneral("AliMUONCDB", Form("Could not set DetElemId=%d manuId=%d",detElemId,manuId));
695     }
696   }
697   
698   AliInfoGeneral("AliMUONCDB", Form("%d Manus and %d channels.",nmanus,nchannels));
699   return nchannels;
700 }
701
702 //_____________________________________________________________________________
703 AliMUONRejectList* 
704 AliMUONCDB::MakeRejectListStore(Bool_t defaultValues)
705 {
706   /// Create a reject list
707   
708   AliCodeTimerAutoGeneral("",0);
709
710   AliMUONRejectList* rl = new AliMUONRejectList;
711   
712   if (!defaultValues)
713   {
714     rl->SetDetectionElementProbability(510);
715     rl->SetDetectionElementProbability(508);
716     return rl;
717   }
718   
719   return rl;
720 }
721
722 //_____________________________________________________________________________
723 Int_t 
724 AliMUONCDB::MakeOccupancyMapStore(AliMUONVStore& occupancyMapStore, Bool_t defaultValues)
725 {
726   /// Create an occupancy map.
727   
728   AliCodeTimerAutoGeneral("",0);
729   
730   if (!AliMUONCDB::CheckMapping()) return 0;
731   
732   Int_t nmanus(0);
733   
734   Int_t detElemId;
735   Int_t manuId;
736   
737   AliMpManuIterator it;
738   
739   Int_t nevents(1000);
740   
741   while ( it.Next(detElemId,manuId) )
742   {
743     ++nmanus;
744     
745     AliMUONVCalibParam* occupancy = new AliMUONCalibParamND(5,1,detElemId,manuId,0);
746     
747     Double_t occ = 0.0;
748
749     AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
750     
751     Int_t numberOfChannelsInManu = de->NofChannelsInManu(manuId);
752     
753     if (!defaultValues) occ = gRandom->Rndm(1);
754
755     Double_t sumn = occ*nevents;
756     
757     occupancy->SetValueAsFloat(0,0,sumn); 
758     occupancy->SetValueAsFloat(0,1,sumn);
759     occupancy->SetValueAsFloat(0,2,sumn);
760     occupancy->SetValueAsInt(0,3,numberOfChannelsInManu);
761     occupancy->SetValueAsInt(0,4,nevents);
762     
763     Bool_t ok = occupancyMapStore.Add(occupancy);
764     if (!ok)
765     {
766       AliErrorGeneral("AliMUONCDB", Form("Could not set DetElemId=%d manuId=%d",detElemId,manuId));
767     }
768   }
769   
770   return nmanus;
771 }
772
773 //_____________________________________________________________________________
774 Int_t
775 AliMUONCDB::MakeCapacitanceStore(AliMUONVStore& capaStore, const char* file)
776 {
777   /// Read the capacitance values from file and append them to the capaStore
778   
779   if (!AliMUONCDB::CheckMapping()) return 0;
780   
781   return AliMUONTrackerIO::ReadCapacitances(file,capaStore);
782 }
783
784 //_____________________________________________________________________________
785 Int_t 
786 AliMUONCDB::MakeCapacitanceStore(AliMUONVStore& capaStore, Bool_t defaultValues)
787 {
788   /// Create a capacitance store. if defaultValues=true, all capa are 1.0,
789   /// otherwise they are from a gaussian with parameters defined in the
790   /// kCapa* constants below.
791
792   AliCodeTimerAutoGeneral("",0);
793   
794   if (!AliMUONCDB::CheckMapping()) return 0;
795   
796   Int_t nchannels(0);
797   Int_t nmanus(0);
798   Int_t nmanusOK(0); // manus for which we got the serial number
799     
800   const Float_t kCapaMean(0.3);
801   const Float_t kCapaSigma(0.1);
802   const Float_t kInjectionGainMean(3);
803   const Float_t kInjectionGainSigma(1);
804
805   Int_t detElemId;
806   Int_t manuId;
807   
808   AliMpManuIterator it;
809   
810   while ( it.Next(detElemId,manuId) )
811   {
812     ++nmanus;
813     
814     AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId); 
815     Int_t serialNumber = AliMpManuStore::Instance()->GetManuSerial(detElemId, manuId);
816       
817     if ( serialNumber <= 0 ) continue;
818     
819     ++nmanusOK;
820     
821     AliMUONVCalibParam* capa = static_cast<AliMUONVCalibParam*>(capaStore.FindObject(serialNumber));
822     
823     if (!capa)
824     {
825       capa = new AliMUONCalibParamNF(2,AliMpConstants::ManuNofChannels(),serialNumber,0,1.0);
826       Bool_t ok = capaStore.Add(capa);
827       if (!ok)
828       {
829         AliErrorGeneral("AliMUONCDB", Form("Could not set serialNumber=%d manuId=%d",serialNumber,manuId));
830       }      
831     }
832     
833     for ( Int_t manuChannel = 0; manuChannel < capa->Size(); ++manuChannel )
834     {
835       if ( ! de->IsConnectedChannel(manuId,manuChannel) ) continue;
836       
837       ++nchannels;
838       
839       Float_t capaValue;
840       Float_t injectionGain;
841       
842       if ( defaultValues ) 
843       {
844         capaValue = 1.0;
845         injectionGain = 1.0;
846       }
847       else
848       {
849         capaValue = GetRandom(kCapaMean,kCapaSigma,kTRUE);
850         injectionGain = GetRandom(kInjectionGainMean,kInjectionGainSigma,kTRUE);
851       }
852       capa->SetValueAsFloat(manuChannel,0,capaValue);
853       capa->SetValueAsFloat(manuChannel,1,injectionGain);
854     }
855   }
856   
857   Float_t percent = 0;
858   if ( nmanus ) percent = 100*nmanusOK/nmanus;
859   AliInfoGeneral("AliMUONCDB", Form("%5d manus with serial number (out of %5d manus = %3.0f%%)",
860                nmanusOK,nmanus,percent));
861   AliInfoGeneral("AliMUONCDB", Form("%5d channels",nchannels));
862   if ( percent < 100 ) 
863   {
864     AliWarningGeneral("AliMUONCDB", "Did not get all serial numbers. capaStore is incomplete !!!!");
865   }
866   return nchannels;
867   
868 }
869
870 //_____________________________________________________________________________
871 Int_t 
872 AliMUONCDB::MakeGainStore(AliMUONVStore& gainStore, Bool_t defaultValues)
873 {  
874   /// Create a gain store. if defaultValues=true, all gains set so that
875   /// charge = (adc-ped)
876   ///
877   /// otherwise parameters are taken from gaussians with parameters 
878   /// defined in the k* constants below.
879   
880   AliCodeTimerAutoGeneral("",0);
881   
882   if (!AliMUONCDB::CheckMapping()) return 0;
883   
884   Int_t nchannels(0);
885   Int_t nmanus(0);
886     
887   const Int_t kSaturation(3000);
888   const Double_t kA0Mean(1.2);
889   const Double_t kA0Sigma(0.1);
890   const Double_t kA1Mean(1E-5);
891   const Double_t kA1Sigma(1E-6);
892   const Double_t kQualMean(0xFF);
893   const Double_t kQualSigma(0x10);
894   const Int_t kThresMean(1600);
895   const Int_t kThresSigma(100);
896   
897   Int_t detElemId;
898   Int_t manuId;
899   
900   AliMpManuIterator it;
901   
902   while ( it.Next(detElemId,manuId) )
903   {
904     ++nmanus;
905
906     AliMUONVCalibParam* gain = 
907       new AliMUONCalibParamNF(5,AliMpConstants::ManuNofChannels(),
908                               detElemId,
909                               manuId,
910                               AliMUONVCalibParam::InvalidFloatValue());
911
912     AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
913
914     for ( Int_t manuChannel = 0; manuChannel < gain->Size(); ++manuChannel )
915     {
916       if ( ! de->IsConnectedChannel(manuId,manuChannel) ) continue;
917       
918       ++nchannels;
919       
920       if ( defaultValues ) 
921       {
922         gain->SetValueAsFloat(manuChannel,0,1.0);
923         gain->SetValueAsFloat(manuChannel,1,0.0);
924         gain->SetValueAsInt(manuChannel,2,4095); 
925         gain->SetValueAsInt(manuChannel,3,1);
926         gain->SetValueAsInt(manuChannel,4,kSaturation);
927       }
928       else
929       {
930         Bool_t positive(kTRUE);
931         gain->SetValueAsFloat(manuChannel,0,GetRandom(kA0Mean,kA0Sigma,positive));
932         gain->SetValueAsFloat(manuChannel,1,GetRandom(kA1Mean,kA1Sigma,!positive));
933         gain->SetValueAsInt(manuChannel,2,(Int_t)TMath::Nint(GetRandom(kThresMean,kThresSigma,positive)));
934         gain->SetValueAsInt(manuChannel,3,(Int_t)TMath::Nint(GetRandom(kQualMean,kQualSigma,positive)));
935         gain->SetValueAsInt(manuChannel,4,kSaturation);        
936       }
937       
938     }
939     Bool_t ok = gainStore.Add(gain);
940     if (!ok)
941     {
942       AliErrorGeneral("AliMUONCDB", Form("Could not set DetElemId=%d manuId=%d",detElemId,manuId));
943     }
944   }
945   
946   AliInfoGeneral("AliMUONCDB", Form("%d Manus and %d channels.",nmanus,nchannels));
947   return nchannels;
948 }
949
950 //_____________________________________________________________________________
951 Int_t
952 AliMUONCDB::MakeLocalTriggerMaskStore(AliMUONVStore& localBoardMasks)
953 {
954   /// Generate local trigger masks store. All masks are set to FFFF
955   
956   AliCodeTimerAutoGeneral("",0);
957   
958   Int_t ngenerated(0);
959   // Generate fake mask values for all localboards and put that into
960   // one single container (localBoardMasks)
961   for ( Int_t i = 1; i <= AliMpConstants::TotalNofLocalBoards(); ++i )
962   {
963     AliMUONVCalibParam* localBoard = new AliMUONCalibParamNI(1,8,i,0,0);
964     for ( Int_t x = 0; x < 2; ++x )
965     {
966       for ( Int_t y = 0; y < 4; ++y )
967       {
968         Int_t index = x*4+y;
969         localBoard->SetValueAsInt(index,0,0xFFFF);
970         ++ngenerated;
971       }
972     }
973     localBoardMasks.Add(localBoard);
974   }
975   return ngenerated;
976 }
977
978 //_____________________________________________________________________________
979 Int_t
980 AliMUONCDB::MakeRegionalTriggerConfigStore(AliMUONRegionalTriggerConfig& rtm)
981 {
982   /// Make a regional trigger config store. Mask is set to FFFF for each local board (Ch.F.)
983   
984   AliCodeTimerAutoGeneral("",0);
985   
986   if ( ! rtm.ReadData(AliMpFiles::LocalTriggerBoardMapping()) ) {
987     AliErrorGeneral("AliMUONCDB", "Error when reading from mapping file");
988     return 0;
989   }
990     
991   return rtm.GetNofTriggerCrates();  
992 }
993
994
995 //_____________________________________________________________________________
996 Int_t 
997 AliMUONCDB::MakeGlobalTriggerConfigStore(AliMUONGlobalCrateConfig& gtm)
998 {
999   /// Make a global trigger config store. All masks (disable) set to 0x00 for each Darc board (Ch.F.)
1000   
1001   AliCodeTimerAutoGeneral("",0);
1002   
1003   return gtm.ReadData(AliMpFiles::GlobalTriggerBoardMapping());
1004 }
1005
1006
1007 //_____________________________________________________________________________
1008 AliMUONTriggerLut* 
1009 AliMUONCDB::MakeTriggerLUT(const char* file)
1010 {
1011   /// Make a triggerlut object, from a file.
1012   
1013   AliCodeTimerAutoGeneral("",0);
1014   
1015   AliMUONTriggerLut* lut = new AliMUONTriggerLut;
1016   lut->ReadFromFile(file);
1017   return lut;
1018 }
1019
1020 //_____________________________________________________________________________
1021 AliMUONTriggerEfficiencyCells*
1022 AliMUONCDB::MakeTriggerEfficiency(const char* file)
1023 {
1024   /// Make a trigger efficiency object from a file.
1025   
1026   AliCodeTimerAutoGeneral("",0);
1027   
1028   return new AliMUONTriggerEfficiencyCells(file);
1029 }
1030
1031 //_____________________________________________________________________________
1032 void 
1033 AliMUONCDB::WriteToCDB(const char* calibpath, TObject* object, 
1034                        Int_t startRun, Int_t endRun, 
1035                        const char* filename)
1036 {
1037   /// Write a given object to OCDB
1038   
1039   TString comment(gSystem->ExpandPathName(filename));
1040   
1041   WriteToCDB(object, calibpath, startRun, endRun, comment.Data());
1042 }
1043
1044 //_____________________________________________________________________________
1045 void 
1046 AliMUONCDB::WriteToCDB(const char* calibpath, TObject* object, 
1047                        Int_t startRun, Int_t endRun, Bool_t defaultValues)
1048 {
1049   /// Write a given object to OCDB
1050   
1051   TString comment;
1052   if ( defaultValues ) comment += "Test with default values";
1053   else comment += "Test with random values";
1054   
1055   WriteToCDB(object, calibpath, startRun, endRun, comment.Data());
1056 }
1057
1058 //_____________________________________________________________________________
1059 void
1060 AliMUONCDB::WriteToCDB(TObject* object, const char* calibpath, Int_t startRun, Int_t endRun,
1061                        const char* comment, const char* responsible)
1062 {
1063   /// Write a given object to OCDB
1064   
1065   if (!AliMUONCDB::CheckOCDB(kTRUE)) return;
1066   
1067   AliCDBId id(calibpath,startRun,endRun);
1068   AliCDBMetaData md;
1069   md.SetAliRootVersion(gROOT->GetVersion());
1070   md.SetComment(comment);
1071   md.SetResponsible(responsible);
1072   AliCDBManager::Instance()->Put(object,id,&md);
1073 }
1074
1075 //_____________________________________________________________________________
1076 Int_t 
1077 AliMUONCDB::MakeNeighbourStore(AliMUONVStore& neighbourStore)
1078 {
1079   /// Fill the neighbours store with, for each channel, a TObjArray of its
1080   /// neighbouring pads (including itself)
1081   
1082   AliCodeTimerAutoGeneral("",0);
1083   
1084   if (!AliMUONCDB::CheckMapping()) return 0;
1085   
1086   AliInfoGeneral("AliMUONCDB", "Generating NeighbourStore. This will take a while. Please be patient.");
1087   
1088   Int_t nchannels(0);
1089   
1090   TObjArray tmp;
1091
1092   Int_t detElemId;
1093   Int_t manuId;
1094   
1095   AliMpManuIterator it;
1096   
1097   while ( it.Next(detElemId,manuId) )
1098   {
1099     const AliMpVSegmentation* seg = 
1100       AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId,manuId);
1101     
1102     AliMUONVCalibParam* calibParam = static_cast<AliMUONVCalibParam*>(neighbourStore.FindObject(detElemId,manuId));
1103     if (!calibParam)
1104     {
1105       Int_t dimension(11);
1106       Int_t size(AliMpConstants::ManuNofChannels());
1107       Int_t defaultValue(-1);
1108       Int_t packingFactor(size);
1109       
1110       calibParam = new AliMUONCalibParamNI(dimension,size,detElemId,manuId,defaultValue,packingFactor);
1111       Bool_t ok = neighbourStore.Add(calibParam);
1112       if (!ok)
1113       {
1114         AliErrorGeneral("AliMUONCDB", Form("Could not set DetElemId=%d manuId=%d",detElemId,manuId));
1115         return -1;
1116       }      
1117     }
1118     
1119     for ( Int_t manuChannel = 0; manuChannel < AliMpConstants::ManuNofChannels(); ++manuChannel )
1120     {
1121       AliMpPad pad = seg->PadByLocation(manuId,manuChannel,kFALSE);
1122       
1123       if (pad.IsValid()) 
1124       {
1125         ++nchannels;
1126
1127         seg->GetNeighbours(pad,tmp,true,true);
1128         Int_t nofPadNeighbours = tmp.GetEntriesFast();
1129             
1130         for ( Int_t i = 0; i < nofPadNeighbours; ++i )
1131         {
1132           AliMpPad* p = static_cast<AliMpPad*>(tmp.UncheckedAt(i));
1133           Int_t x;
1134 //          Bool_t ok =
1135               calibParam->PackValues(p->GetManuId(),p->GetManuChannel(),x);
1136 //          if (!ok)
1137 //          {
1138 //            AliError("Could not pack value. Something is seriously wrong. Please check");
1139 //            StdoutToAliError(pad->Print(););
1140 //            return -1;
1141 //          }
1142           calibParam->SetValueAsInt(manuChannel,i,x);
1143         }
1144       }
1145     }
1146     }
1147   
1148   return nchannels;
1149 }
1150
1151 //_____________________________________________________________________________
1152 void
1153 AliMUONCDB::WriteLocalTriggerMasks(Int_t startRun, Int_t endRun)
1154 {  
1155   /// Write local trigger masks to OCDB
1156   
1157   AliMUONVStore* ltm = new AliMUON1DArray(AliMpConstants::TotalNofLocalBoards()+1);
1158   Int_t ngenerated = MakeLocalTriggerMaskStore(*ltm);
1159   AliInfoGeneral("AliMUONCDB", Form("Ngenerated = %d",ngenerated));
1160   if (ngenerated>0)
1161   {
1162     WriteToCDB("MUON/Calib/LocalTriggerBoardMasks",ltm,startRun,endRun,true);
1163   }
1164   delete ltm;
1165 }
1166
1167 //_____________________________________________________________________________
1168 void
1169 AliMUONCDB::WriteRegionalTriggerConfig(Int_t startRun, Int_t endRun)
1170 {  
1171   /// Write regional trigger masks to OCDB
1172   
1173   AliMUONRegionalTriggerConfig* rtm = new AliMUONRegionalTriggerConfig();
1174   Int_t ngenerated = MakeRegionalTriggerConfigStore(*rtm);
1175   AliInfoGeneral("AliMUONCDB", Form("Ngenerated = %d",ngenerated));
1176   if (ngenerated>0)
1177   {
1178     WriteToCDB("MUON/Calib/RegionalTriggerConfig",rtm,startRun,endRun,true);
1179   }
1180   delete rtm;
1181 }
1182
1183
1184 //_____________________________________________________________________________
1185 void
1186 AliMUONCDB::WriteGlobalTriggerConfig(Int_t startRun, Int_t endRun)
1187 {  
1188   /// Write global trigger masks to OCDB
1189   
1190   AliMUONGlobalCrateConfig* gtm = new AliMUONGlobalCrateConfig();
1191
1192   Int_t ngenerated = MakeGlobalTriggerConfigStore(*gtm);
1193   AliInfoGeneral("AliMUONCDB", Form("Ngenerated = %d",ngenerated));
1194   if (ngenerated>0)
1195   {
1196     WriteToCDB("MUON/Calib/GlobalTriggerCrateConfig",gtm,startRun,endRun,true);
1197   }
1198   delete gtm;
1199 }
1200
1201
1202 //_____________________________________________________________________________
1203 void
1204 AliMUONCDB::WriteTriggerLut(Int_t startRun, Int_t endRun)
1205 {  
1206   /// Write trigger LUT to OCDB
1207   
1208   AliMUONTriggerLut* lut = MakeTriggerLUT();
1209   if (lut)
1210   {
1211     WriteToCDB("MUON/Calib/TriggerLut",lut,startRun,endRun,true);
1212   }
1213   delete lut;
1214 }
1215
1216 //_____________________________________________________________________________
1217 void
1218 AliMUONCDB::WriteTriggerEfficiency(Int_t startRun, Int_t endRun)
1219 {  
1220   /// Write trigger efficiency to OCDB
1221   
1222   AliMUONTriggerEfficiencyCells* eff = MakeTriggerEfficiency();
1223   if (eff)
1224   {
1225     WriteToCDB("MUON/Calib/TriggerEfficiency",eff,startRun,endRun,true);
1226   }
1227   delete eff;
1228 }
1229
1230 //_____________________________________________________________________________
1231 void 
1232 AliMUONCDB::WriteNeighbours(Int_t startRun, Int_t endRun)
1233 {
1234   /// Write neighbours to OCDB
1235   
1236   AliMUONVStore* neighbours = Create2DMap();
1237   Int_t ngenerated = MakeNeighbourStore(*neighbours);
1238   AliInfoGeneral("AliMUONCDB", Form("Ngenerated = %d",ngenerated));
1239   if (ngenerated>0)
1240   {
1241     WriteToCDB("MUON/Calib/Neighbours",neighbours,startRun,endRun,true);
1242   }
1243   delete neighbours;
1244 }
1245
1246 //_____________________________________________________________________________
1247 void 
1248 AliMUONCDB::WriteHV(Bool_t defaultValues,
1249                     Int_t startRun, Int_t endRun)
1250 {
1251   /// generate HV values (either cste = 1500 V) if defaultValues=true or random
1252   /// if defaultValues=false, see makeHVStore) and
1253   /// store them into CDB located at cdbpath, with a validity period
1254   /// ranging from startRun to endRun
1255   
1256   TMap* hvStore = new TMap;
1257   Int_t ngenerated = MakeHVStore(*hvStore,defaultValues);
1258   AliInfoGeneral("AliMUONCDB", Form("Ngenerated = %d",ngenerated));
1259   if (ngenerated>0)
1260   {
1261     WriteToCDB("MUON/Calib/HV",hvStore,startRun,endRun,defaultValues);
1262   }
1263   delete hvStore;
1264 }
1265
1266 //_____________________________________________________________________________
1267 void 
1268 AliMUONCDB::WriteTriggerDCS(Bool_t defaultValues,
1269                     Int_t startRun, Int_t endRun)
1270 {
1271   /// generate Trigger HV and current values (either const if defaultValues=true or random
1272   /// if defaultValues=false, see makeTriggerDCSStore) and
1273   /// store them into CDB located at cdbpath, with a validity period
1274   /// ranging from startRun to endRun
1275   
1276   TMap* triggerDCSStore = new TMap;
1277   Int_t ngenerated = MakeTriggerDCSStore(*triggerDCSStore,defaultValues);
1278   AliInfoGeneral("AliMUONCDB", Form("Ngenerated = %d",ngenerated));
1279   if (ngenerated>0)
1280   {
1281     WriteToCDB("MUON/Calib/TriggerDCS",triggerDCSStore,startRun,endRun,defaultValues);
1282   }
1283   delete triggerDCSStore;
1284 }
1285
1286 //_____________________________________________________________________________
1287 void 
1288 AliMUONCDB::WritePedestals(Bool_t defaultValues,
1289                            Int_t startRun, Int_t endRun)
1290 {
1291   /// generate pedestal values (either 0 if defaultValues=true or random
1292   /// if defaultValues=false, see makePedestalStore) and
1293   /// store them into CDB located at cdbpath, with a validity period
1294   /// ranging from startRun to endRun
1295   
1296   AliMUONVStore* pedestalStore = Create2DMap();
1297   Int_t ngenerated = MakePedestalStore(*pedestalStore,defaultValues);
1298   AliInfoGeneral("AliMUONCDB", Form("Ngenerated = %d",ngenerated));
1299   WriteToCDB("MUON/Calib/Pedestals",pedestalStore,startRun,endRun,defaultValues);
1300   delete pedestalStore;
1301 }
1302
1303 //_____________________________________________________________________________
1304 void 
1305 AliMUONCDB::WriteOccupancyMap(Bool_t defaultValues,
1306                               Int_t startRun, Int_t endRun)
1307 {
1308   /// generate occupancy map values (either empty one if defaultValues=true, or
1309   /// random one, see MakeOccupancyMapStore) and
1310   /// store them into CDB located at cdbpath, with a validity period
1311   /// ranging from startRun to endRun
1312   
1313   AliMUONVStore* occupancyMapStore = Create2DMap();
1314   Int_t ngenerated = MakeOccupancyMapStore(*occupancyMapStore,defaultValues);
1315   AliInfoGeneral("AliMUONCDB", Form("Ngenerated = %d",ngenerated));
1316   WriteToCDB("MUON/Calib/OccupancyMap",occupancyMapStore,startRun,endRun,defaultValues);
1317   delete occupancyMapStore;
1318 }
1319
1320 //_____________________________________________________________________________
1321 void 
1322 AliMUONCDB::WriteRejectList(Bool_t defaultValues,
1323                               Int_t startRun, Int_t endRun)
1324 {
1325   /// generate reject list values (either empty one if defaultValues=true, or
1326   /// random one, see MakeRejectListStore) and
1327   /// store them into CDB located at cdbpath, with a validity period
1328   /// ranging from startRun to endRun
1329   
1330   AliMUONRejectList* rl = MakeRejectListStore(defaultValues);
1331   WriteToCDB("MUON/Calib/RejectList",rl,startRun,endRun,defaultValues);
1332   delete rl;
1333 }
1334
1335
1336 //_____________________________________________________________________________
1337 void 
1338 AliMUONCDB::WriteGains(Bool_t defaultValues,
1339                        Int_t startRun, Int_t endRun)
1340 {
1341   /// generate gain values (either 1 if defaultValues=true or random
1342   /// if defaultValues=false, see makeGainStore) and
1343   /// store them into CDB located at cdbpath, with a validity period
1344   /// ranging from startRun to endRun
1345   
1346   AliMUONVStore* gainStore = Create2DMap();
1347   Int_t ngenerated = MakeGainStore(*gainStore,defaultValues);
1348   AliInfoGeneral("AliMUONCDB", Form("Ngenerated = %d",ngenerated));  
1349   WriteToCDB("MUON/Calib/Gains",gainStore,startRun,endRun,defaultValues);
1350   delete gainStore;
1351 }
1352
1353 //_____________________________________________________________________________
1354 void 
1355 AliMUONCDB::WriteCapacitances(const char* filename,
1356                               Int_t startRun, Int_t endRun)
1357 {
1358   /// read manu capacitance and injection gain values from file 
1359   /// and store them into CDB located at cdbpath, with a validity period
1360   /// ranging from startRun to endRun
1361   
1362   AliMUONVStore* capaStore = new AliMUON1DMap(16828);
1363   Int_t ngenerated = MakeCapacitanceStore(*capaStore,filename);
1364   AliInfoGeneral("AliMUONCDB", Form("Ngenerated = %d",ngenerated));
1365   if ( ngenerated > 0 ) 
1366   {
1367     WriteToCDB("MUON/Calib/Capacitances",capaStore,startRun,endRun,filename);
1368   }
1369   delete capaStore;
1370 }
1371
1372 //_____________________________________________________________________________
1373 void 
1374 AliMUONCDB::WriteCapacitances(Bool_t defaultValues,
1375                               Int_t startRun, Int_t endRun)
1376 {
1377   /// generate manu capacitance values (either 1 if defaultValues=true or random
1378   /// if defaultValues=false, see makeCapacitanceStore) and
1379   /// store them into CDB located at cdbpath, with a validity period
1380   /// ranging from startRun to endRun
1381   
1382   AliMUONVStore* capaStore = new AliMUON1DMap(16828);
1383   Int_t ngenerated = MakeCapacitanceStore(*capaStore,defaultValues);
1384   AliInfoGeneral("AliMUONCDB", Form("Ngenerated = %d",ngenerated));
1385   WriteToCDB("MUON/Calib/Capacitances",capaStore,startRun,endRun,defaultValues);
1386   delete capaStore;
1387 }
1388
1389 //_____________________________________________________________________________
1390 void
1391 AliMUONCDB::WriteTrigger(Bool_t defaultValues, Int_t startRun, Int_t endRun)
1392 {
1393   /// Writes all Trigger related calibration to CDB
1394   WriteTriggerDCS(defaultValues,startRun,endRun);
1395   WriteLocalTriggerMasks(startRun,endRun);
1396   WriteRegionalTriggerConfig(startRun,endRun);
1397   WriteGlobalTriggerConfig(startRun,endRun);
1398   WriteTriggerLut(startRun,endRun);
1399   WriteTriggerEfficiency(startRun,endRun);
1400 }
1401
1402 //_____________________________________________________________________________
1403 void
1404 AliMUONCDB::WriteConfig(Int_t startRun, Int_t endRun)
1405 {
1406   /// Write complete tracker configuration to OCDB
1407   ostringstream lines;
1408   TIter next(AliMpDDLStore::Instance()->CreateBusPatchIterator());
1409   AliMpBusPatch* bp;
1410   while ( ( bp = static_cast<AliMpBusPatch*>(next()) ) )
1411   {
1412     for (Int_t imanu = 0; imanu < bp->GetNofManus(); ++imanu) 
1413     {
1414       lines << bp->GetId() << " " << bp->GetManuId(imanu) << endl;
1415     }
1416   }
1417   
1418   AliMUON2DMap config(kTRUE);
1419   
1420   AliMUONTrackerIO::DecodeConfig(lines.str().c_str(),config);
1421   
1422   WriteToCDB("MUON/Calib/Config",&config,startRun,endRun,kTRUE);
1423 }
1424
1425 //_____________________________________________________________________________
1426 void
1427 AliMUONCDB::WriteTracker(Bool_t defaultValues, Int_t startRun, Int_t endRun)
1428 {
1429   /// Writes all Tracker related calibration to CDB
1430   WriteHV(defaultValues,startRun,endRun);
1431   WritePedestals(defaultValues,startRun,endRun);
1432   WriteGains(defaultValues,startRun,endRun);
1433   WriteCapacitances(defaultValues,startRun,endRun);
1434   WriteNeighbours(startRun,endRun);
1435   WriteOccupancyMap(defaultValues,startRun,endRun);
1436   WriteRejectList(defaultValues,startRun,endRun);
1437   WriteConfig(startRun,endRun);
1438 }
1439
1440 //_____________________________________________________________________________
1441 void 
1442 AliMUONCDB::ShowCapacitances()
1443 {
1444   /// Show briefly the number of capa values we have in the OCDB,
1445   /// and the list of manu that are actually in the config and for which
1446   /// we miss the capa (if any).
1447   
1448   if (!AliMUONCDB::CheckOCDB()) return;
1449   
1450   AliMUONCDB::LoadMapping();
1451   
1452   if (!AliMUONCDB::CheckMapping()) return;
1453   
1454   AliCDBEntry* e = AliCDBManager::Instance()->Get("MUON/Calib/Config");
1455   
1456   if (!e) return ;
1457   
1458   AliMUONVStore* config = static_cast<AliMUONVStore*>(e->GetObject());
1459   
1460   e = AliCDBManager::Instance()->Get("MUON/Calib/Capacitances");
1461   
1462   if (!e) return;
1463   
1464   AliMUONVStore* capacitances = static_cast<AliMUONVStore*>(e->GetObject());
1465   
1466   AliInfoGeneral("ShowCapacitances",Form("%d capacitances are in OCDB",capacitances->GetSize()));
1467   
1468   TIter nextManu(config->CreateIterator());
1469   AliMUONVCalibParam* param;
1470   
1471   while ( ( param = static_cast<AliMUONVCalibParam*>(nextManu()) ) )
1472   {
1473     Int_t detElemId = param->ID0();
1474     Int_t manuId = param->ID1();
1475     
1476     Int_t serialNumber 
1477     = AliMpManuStore::Instance()->GetManuSerial(detElemId, manuId);
1478     
1479     if (serialNumber<0)
1480     {
1481       AliErrorGeneral("ShowCapacitances",Form("Did not find serial for DE %04d MANUID %04d",detElemId,manuId));
1482     }
1483     else
1484     {
1485       AliMUONVCalibParam* capa = static_cast<AliMUONVCalibParam*>(capacitances->FindObject(serialNumber));
1486       if (!capa)
1487       {
1488         AliErrorGeneral("ShowCapacitances",Form("Did not find capacitance for DE %04d MANUID %04d SERIAL %d",detElemId,manuId,serialNumber));
1489       }
1490     }
1491   }
1492   
1493 }
1494
1495 //_____________________________________________________________________________
1496 void 
1497 AliMUONCDB::ShowConfig(Bool_t withStatusMap)
1498 {  
1499   /// Dumps the current tracker configuration, i.e. number and identity of missing buspatches
1500   /// If statusMap is true, will also take into account the status map to report the number
1501   /// of good channels
1502   
1503   if (!AliMUONCDB::CheckOCDB()) return;
1504   
1505   AliMUONCDB::LoadMapping();
1506   
1507   if (!AliMUONCDB::CheckMapping()) return;
1508   
1509   AliCDBEntry* e = AliCDBManager::Instance()->Get("MUON/Calib/Config");
1510   
1511   if (!e) return ;
1512   
1513   AliMUONVStore* config = static_cast<AliMUONVStore*>(e->GetObject());
1514   
1515   AliMUONPadStatusMapMaker* statusMapMaker(0x0);
1516   AliMUONCalibrationData* cd(0x0);
1517   AliMUONPadStatusMaker* statusMaker(0x0);
1518
1519   if ( withStatusMap ) 
1520   {
1521     cd = new AliMUONCalibrationData(AliCDBManager::Instance()->GetRun());
1522   
1523     statusMaker = new AliMUONPadStatusMaker(*cd);
1524
1525     AliMUONRecoParam* recoParam = AliMUONCDB::LoadRecoParam();
1526   
1527     statusMaker->SetLimits(*recoParam);
1528   
1529     UInt_t mask = recoParam->PadGoodnessMask();
1530
1531     delete recoParam;
1532     
1533     const Bool_t deferredInitialization = kFALSE;
1534   
1535     statusMapMaker = new AliMUONPadStatusMapMaker(*cd,mask,deferredInitialization);
1536   }
1537   
1538   TIter nextManu(config->CreateIterator());
1539   AliMUONVCalibParam* param;
1540   
1541   AliMpExMap buspatches;
1542   
1543   while ( ( param = static_cast<AliMUONVCalibParam*>(nextManu()) ) )
1544   {
1545     Int_t detElemId = param->ID0();
1546     Int_t manuId = param->ID1();
1547     Int_t busPatchId = AliMpDDLStore::Instance()->GetBusPatchId(detElemId,manuId);
1548     if ( buspatches.GetValue(busPatchId) == 0x0 ) 
1549     {      
1550       buspatches.Add(busPatchId,new TObjString(Form("BP%04d",busPatchId)));
1551     }
1552   }
1553
1554   TArrayI removed(buspatches.GetSize());
1555
1556   TIter next(AliMpDDLStore::Instance()->CreateBusPatchIterator());
1557   AliMpBusPatch* bp;
1558   Int_t n(0);
1559   Int_t nok(0);
1560   Int_t nremoved(0);
1561   
1562   // accounting of bus patches first
1563   
1564   while ( ( bp = static_cast<AliMpBusPatch*>(next())))
1565   {
1566     if ( buspatches.GetValue(bp->GetId()) )
1567     {
1568       ++nok;
1569     }
1570     else
1571     {
1572       removed.SetAt(bp->GetId(),nremoved++);
1573     }
1574   }
1575   
1576   // accounting of channels
1577   
1578   AliMpManuIterator it;
1579
1580   Int_t totalNumberOfChannels(0);
1581   Int_t removedChannels(0);
1582   Int_t badChannels(0);
1583   Int_t badAndRemovedChannels(0);
1584   Int_t badOrRemovedChannels(0);
1585   
1586   Int_t detElemId, manuId;
1587   
1588   while ( it.Next(detElemId,manuId) )
1589   {
1590     AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
1591     for ( Int_t i = 0; i < AliMpConstants::ManuNofChannels(); ++i )
1592     {
1593       Int_t busPatchId = AliMpDDLStore::Instance()->GetBusPatchId(detElemId,manuId);
1594       
1595       if ( de->IsConnectedChannel(manuId,i) )
1596       {
1597         ++totalNumberOfChannels;
1598         Bool_t badBusPatch = ( buspatches.GetValue(busPatchId) == 0x0 );
1599         
1600         if ( withStatusMap ) 
1601         {
1602           Bool_t badChannel = ( ( statusMapMaker->StatusMap(detElemId,manuId,i) & AliMUONPadStatusMapMaker::SelfDeadMask() ) != 0);
1603           if ( badChannel ) ++badChannels;
1604           if ( badBusPatch && badChannel ) ++badAndRemovedChannels;
1605           if ( badBusPatch || badChannel ) ++badOrRemovedChannels;          
1606         }
1607       
1608         if ( badBusPatch) ++removedChannels;
1609       }
1610     }
1611   }
1612   
1613   
1614   Int_t* indices = new Int_t[nremoved];
1615   
1616   TMath::Sort(nremoved,removed.GetArray(),indices,kFALSE);
1617   
1618   for ( Int_t i = 0; i < nremoved; ++i ) 
1619   {
1620     Int_t busPatchId = removed[indices[i]];
1621     bp = AliMpDDLStore::Instance()->GetBusPatch(busPatchId);
1622     bp->Print();
1623   }
1624   
1625   delete[] indices;  
1626   
1627   cout << endl;
1628   cout << Form("Bus patches n=%3d nok=%3d nremoved=%3d",n,nok,nremoved) << endl;
1629
1630   cout << Form("Channels n=%6d nremoved=%6d bad=%6d bad and removed=%6d bad or removed=%6d",
1631                totalNumberOfChannels,removedChannels,badChannels,badAndRemovedChannels,badOrRemovedChannels) << endl;
1632   
1633   if (totalNumberOfChannels>0)
1634   {
1635     cout << Form("Percentage of readout channels %5.1f %%",removedChannels*100.0/totalNumberOfChannels) << endl;
1636     if ( withStatusMap )
1637     {
1638       cout << Form("Percentage of non useable channels (bad or removed) %5.1f %%",
1639                    badOrRemovedChannels*100.0/totalNumberOfChannels) << endl;
1640     }
1641   }
1642   
1643   
1644   delete statusMapMaker;
1645   delete cd;
1646   delete statusMaker;  
1647 }