Main changes:
[u/mrichter/AliRoot.git] / MUON / MUONOfflineShift.C
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 /// \ingroup macros
19 /// \file MUONOfflineShift.C
20 /// \brief Macro to be used to check raw data during MUON offline shifts.
21 ///  
22 /// You NEED an access to the Grid to run this macro.
23 ///
24 /// Basic usage is : 
25 ///
26 /// MUONOfflineShift("path_to_raw_file","basename of output file"); > log
27 ///
28 /// (the redirection to an output log file is recommended as the output from
29 /// this macro might be quite long...)
30 ///
31 /// This will read the raw data and process it several times, varying what's done :
32 /// only decoding, decoding + zero-suppression, etc... (TBE)
33 ///
34 /// Two outputs files will be created : 
35 ///
36 /// - basename.root, containing AliMUONVTrackerData objects that can then 
37 ///   be displayed using the mchview program (using mchview --use basename.root)
38 ///
39 /// - basename.log, containing (for the moment) the occupancy numbers of the various detection elements
40 ///
41 /// Unless you really know what you're doing, please use this macro together with 
42 /// the grid OCDB (i.e. don't set it to a local OCDB). There are now a lot of things
43 /// that are grabbed from the OCDB that are run dependent...
44 ///
45 /// \author Laurent Aphecetche
46
47 #if !defined(__CINT__) || defined(__MAKECINT__)
48
49 #include "AliCDBEntry.h"
50 #include "AliCDBManager.h"
51 #include "AliCodeTimer.h"
52 #include "AliMUONPainterDataRegistry.h"
53 #include "AliMUONRecoParam.h"
54 #include "AliMUONTrackerDataMaker.h"
55 #include "AliMUONVTrackerData.h"
56 #include "AliMpCDB.h"
57 #include "AliMpConstants.h"
58 #include "AliMpDEIterator.h"
59 #include "AliRawReader.h"
60 #include <Riostream.h>
61 #include <TFile.h>
62 #include <TGrid.h>
63 #include <TStopwatch.h>
64 #include <TString.h>
65 #include <TSystem.h>
66
67 #endif
68
69 //______________________________________________________________________________
70 Int_t DataMakerReading(const char* input,
71                        TStopwatch& timer,
72                        const char* cdbPath="",
73                        const char* calibMode="",
74                        Bool_t histogram=kFALSE,
75                        Double_t xmin = 0.0,
76                        Double_t xmax = 4096.0)
77 {
78   /// Run over the data and calibrate it if so required (if cdbPath != "")
79   /// calibMode can be :
80   /// - NOGAIN           : only zero-suppression will be done
81   /// - GAINCONSTANTCAPA : zero-suppression + gain, but with a single capa value for all channels
82   /// - GAIN             : zero-suppression + gain w/ individual capacitance per channel.
83   
84   TString fileName(gSystem->ExpandPathName(input));
85   
86   AliRawReader* rawReader = AliRawReader::Create(fileName.Data());
87   
88   if (!rawReader) return 0;
89   
90   AliMUONVTrackerDataMaker* dm(0x0);
91   
92   AliCDBEntry* entry = AliCDBManager::Instance()->Get("MUON/Calib/RecoParam");
93   AliMUONRecoParam* recoParam(0x0);
94   
95   if ( entry ) recoParam = static_cast<AliMUONRecoParam*>(entry->GetObject());
96   
97   if ( strlen(cdbPath) > 0 ) 
98   {
99     dm = new AliMUONTrackerDataMaker(recoParam,rawReader,cdbPath,calibMode,histogram,xmin,xmax);
100   }
101   else  
102   {
103     dm = new AliMUONTrackerDataMaker(rawReader,histogram);
104   }
105   
106   AliMUONPainterDataRegistry::Instance()->Register(dm);
107
108   timer.Start(kTRUE);
109   Int_t n(0);
110   
111   dm->SetRunning(kTRUE);
112   
113   while (dm->NextEvent())
114   {
115     ++n;
116   }
117   
118   timer.Stop();
119   
120   return n;
121 }
122
123 //______________________________________________________________________________
124 void Print(const char* method, TStopwatch& timer, Int_t n)
125 {
126   /// Get the timing for a given method
127   
128   cout << Form("%20s %10d events. Total CPU time %7.2f seconds.",
129                method,n,timer.CpuTime());
130   
131   Double_t cpu = timer.CpuTime()/n;
132   Double_t real = timer.RealTime()/n;
133   
134   cout << Form(" ms real/event = %7.2f ms CPU/event = %7.2f",real*1E3,cpu*1E3)
135     << endl;
136 }
137
138 //______________________________________________________________________________
139 void Occupancy(ostream& outfile)
140 {
141   /// Write occupancy numbers to output text file
142   
143   outfile << "-----------------------------------------------------" << endl;
144   outfile << "Occupancy numbers" << endl;
145   outfile << "-----------------------------------------------------" << endl;
146   
147   const Int_t occIndex = 2;
148   
149   AliMUONPainterDataRegistry* reg = AliMUONPainterDataRegistry::Instance();
150
151   Int_t nofDataSources = reg->NumberOfDataSources();
152
153   outfile << Form("%11s|"," ");
154   
155   for ( Int_t ids = 0; ids < nofDataSources; ++ ids ) 
156   {
157     AliMUONVTrackerData* data = reg->DataSource(ids);
158     outfile << Form(" %13s |",data->GetName());
159   }
160
161   outfile << endl;
162
163   for ( Int_t chamberId = 0; chamberId < AliMpConstants::NofTrackingChambers(); ++chamberId ) 
164   {
165     Bool_t nonZero(kFALSE);
166     for ( Int_t ids = 0; ids < nofDataSources && nonZero == kFALSE; ++ ids ) 
167     {
168       if ( reg->DataSource(ids)->Chamber(chamberId,occIndex) ) nonZero = kTRUE;
169     }
170     
171     if ( !nonZero ) continue;
172     
173     outfile << Form("Chamber %2d |",chamberId);
174     for ( Int_t ids = 0; ids < nofDataSources; ++ ids ) 
175     {
176       AliMUONVTrackerData* data = reg->DataSource(ids);
177       outfile << Form("   %7.2f %%   |",100.0*data->Chamber(chamberId,occIndex));
178     }
179     outfile << endl;
180     
181     AliMpDEIterator it;
182     it.First(chamberId);
183     while (!it.IsDone())
184     {
185       Int_t detElemId = it.CurrentDEId();
186       Bool_t nonZero(kFALSE);
187       for ( Int_t ids = 0; ids < nofDataSources && nonZero == kFALSE; ++ ids ) 
188       {
189         AliMUONVTrackerData* data = reg->DataSource(ids);
190         if ( data->DetectionElement(detElemId,occIndex) > 0 ) 
191         {
192           nonZero = kTRUE;
193         }
194       }
195       
196       if ( nonZero ) 
197       {
198         outfile << Form("   DE %04d |",detElemId);
199         for ( Int_t ids = 0; ids < nofDataSources; ++ ids ) 
200         {
201           AliMUONVTrackerData* data = reg->DataSource(ids);
202           outfile << Form("   %7.2f %%   |",100.0*data->DetectionElement(detElemId,occIndex));
203         }
204         outfile << endl;
205       }
206       it.Next();
207     }
208   }
209 }
210
211 //______________________________________________________________________________
212 void MUONOfflineShift(const char* input="alien:///alice/data/2009/LHC09a/000067495/raw/09000067495031.10.root", 
213                       const char* outputBase="67495031.10",
214                       const char* ocdbPath="alien://folder=/alice/data/2009/OCDB")
215 {
216   /// Entry point of the macro. 
217
218   AliCodeTimer::Instance()->Reset();
219   
220   TGrid::Connect("alien://");
221   
222   AliRawReader* rawReader = AliRawReader::Create(input);
223   
224   rawReader->NextEvent();
225   
226   Int_t runNumber = rawReader->GetRunNumber();
227     
228   delete rawReader;
229   
230   AliCDBManager::Instance()->SetDefaultStorage(ocdbPath);
231   AliCDBManager::Instance()->SetRun(runNumber);
232
233   AliMpCDB::LoadDDLStore();
234   AliMpCDB::LoadManuStore();
235   
236   TStopwatch timer1;
237   TStopwatch timer2;
238   TStopwatch timer3;
239   TStopwatch timer4;
240   TStopwatch timer5;
241   
242   Int_t n1 = DataMakerReading(input,timer1,"","",kTRUE,0,0);
243
244   Int_t n2 = DataMakerReading(input,timer2,ocdbPath,"NOGAIN");
245
246   Int_t n3 = DataMakerReading(input,timer3,ocdbPath,"GAINCONSTANTCAPA");
247
248   Int_t n4 = DataMakerReading(input,timer4,ocdbPath,"GAIN");
249
250   Int_t n5 = DataMakerReading(input,timer5,ocdbPath,"INJECTIONGAIN");
251
252   Print("DataMakerReading(HRAW)",timer1,n1);  
253   Print("DataMakerReading(HCALZ)",timer2,n2);
254   Print("DataMakerReading(HCALG)",timer3,n3);
255   Print("DataMakerReading(HCALC)",timer4,n4);
256   Print("DataMakerReading(HCALE)",timer5,n5);
257   
258   AliMUONPainterDataRegistry* reg = AliMUONPainterDataRegistry::Instance();
259   
260   TFile f(gSystem->ExpandPathName(Form("%s.root",outputBase)),"RECREATE");
261   ofstream out(gSystem->ExpandPathName(Form("%s.log",outputBase)));
262
263   Occupancy(out);
264
265   for ( Int_t i = 0; i < reg->NumberOfDataSources(); ++i )
266   {
267     AliMUONVTrackerData* data = reg->DataSource(i);
268     data->Write();
269   }
270   
271   f.Close();
272   
273   AliCodeTimer::Instance()->Print();
274
275 }