b69b0504045a86d7ae03f90c87d6e3e45e168c6e
[u/mrichter/AliRoot.git] / HLT / MUON / macros / ExtractDDLs.C
1 /**************************************************************************
2  * This file is property of and copyright by the ALICE HLT Project        *
3  * All rights reserved.                                                   *
4  *                                                                        *
5  * Primary Authors:                                                       *
6  *   Artur Szostak <artursz@iafrica.com>                                  *
7  *                                                                        *
8  * Permission to use, copy, modify and distribute this software and its   *
9  * documentation strictly for non-commercial purposes is hereby granted   *
10  * without fee, provided that the above copyright notice appears in all   *
11  * copies and that both the copyright notice and this permission notice   *
12  * appear in the supporting documentation. The authors make no claims     *
13  * about the suitability of this software for any purpose. It is          *
14  * provided "as is" without express or implied warranty.                  *
15  **************************************************************************/
16
17 /// \ingroup macros
18 /// \file ExtractDDLs.C
19 /// \brief Macro for extracting DDL raw data from different AliRawReaders.
20 ///
21 /// \author Artur Szostak <artursz@iafrica.com>
22 ///
23 /// This macro is used to extract DDL raw data files for the muon spectrometer
24 /// from different data sources using an AliRawReader. This macro will generate
25 /// directories in the form rawX where X is an integer. This is the typical
26 /// directory layout generated by AliRoot simulations.
27 ///
28
29 #if !defined(__CINT__) || defined(__MAKECINT__)
30 #include "TSystem.h"
31 #include "TString.h"
32 #include "AliRawReader.h"
33 #include "AliRawDataHeader.h"
34 #include "Riostream.h"
35 #include <fstream>
36 using std::fstream;
37 #else
38 #error This macro must be compiled.
39 #endif
40
41 /**
42  * Writes all DDL files for the current event from the AliRawReader.
43  */
44 void WriteDDLs(AliRawReader* rawReader, const TString& dir, const char* detector)
45 {
46         while (rawReader->ReadHeader())
47         {
48                 // Allocate memory for the DDL.
49                 UInt_t bufferSize = rawReader->GetDataSize() + sizeof(AliRawDataHeader);
50                 UChar_t* buffer = new UChar_t[bufferSize];
51                 if (buffer == NULL)
52                 {
53                         cerr << "ERROR: Out of memory!" << endl;
54                         continue;
55                 }
56                 
57                 // Copy the CDH header.
58                 memcpy(buffer, rawReader->GetDataHeader(), sizeof(AliRawDataHeader));
59                 
60                 UChar_t* payload = buffer + sizeof(AliRawDataHeader);
61                 UInt_t payloadSize = bufferSize - sizeof(AliRawDataHeader);
62                 
63                 // Now copy the DDL payload.
64                 if (! rawReader->ReadNext(payload, payloadSize))
65                 {
66                         cerr << "ERROR: Failed to read from AliRawReader." << endl;
67                         delete [] buffer;
68                         continue;
69                 }
70                 
71                 // Write the file.
72                 TString filename = dir;
73                 filename += "/";
74                 filename += detector;
75                 filename += "_";
76                 char num[32];
77                 sprintf(num, "%d", rawReader->GetEquipmentId());
78                 filename += num;
79                 filename += ".ddl";
80                 
81                 fstream file(filename.Data(), fstream::out | fstream::binary);
82                 file.write((char*)buffer, bufferSize);
83                 file.close();
84         }
85 }
86
87 /**
88  * Extracts muon spectrometer raw DDL data files from a data source.
89  * \param dataSource  This is the raw data to use. It can either be a directory name
90  *      containing rawX directories with raw DDL files, a .root file containing raw
91  *      data or a DATE raw data file.
92  * \param firstEvent The first event number to extract.
93  * \param lastEvent The last event number to extract. If set to a negative number then
94  *      all events from <i>firstEvent</i> to the end of the data stream is extracted.
95  * \param outputDir  This is the output directory to write the raw data to. The default
96  *      is to use the current directory.
97  */
98 void ExtractDDLs(
99                 const char* dataSource = "raw.root",
100                 Int_t firstEvent = 0, Int_t lastEvent = -1,
101                 const char* outputDir = "."
102         )
103 {
104         AliRawReader* rawReader = AliRawReader::Create(dataSource);
105         if (rawReader == NULL)
106         {
107                 cerr << "ERROR: Could not create AliRawReader." << endl;
108                 return;
109         }
110         
111         Int_t count = 0;
112         if (lastEvent < 0) lastEvent = rawReader->GetNumberOfEvents() - 1;
113         Int_t event = firstEvent;
114         rawReader->GotoEvent(firstEvent);
115         while (event <= lastEvent)
116         {
117                 char num[32];
118                 sprintf(num, "%d", count);
119                 TString dir = outputDir;
120                 dir += "/raw";
121                 dir += num;
122                 gSystem->MakeDirectory(dir.Data());
123                 
124                 rawReader->Select("MUONTRK", 0, 19);
125                 WriteDDLs(rawReader, dir, "MUONTRK");
126                 rawReader->Select("MUONTRG", 0, 1);
127                 WriteDDLs(rawReader, dir, "MUONTRG");
128                 
129                 ++count;
130                 ++event;
131                 rawReader->NextEvent();
132         }
133
134         delete rawReader;
135 }
136