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