adding option to skip particular component libraries from the default libs by specify...
[u/mrichter/AliRoot.git] / HLT / TRD / AliHLTTRDEsdWriterComponent.cxx
1 /**************************************************************************
2  * This file is property of and copyright by the ALICE HLT Project        * 
3  * ALICE Experiment at CERN, All rights reserved.                         *
4  *                                                                        *
5  * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
6  *                  for The ALICE HLT Project.                            *
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 /** @file   AliHLTTRDEsdWriterComponent.cxx
18     @author Mateusz Ploskon
19     @date   
20     @brief  Writer component to store tracks of the HLT TRD
21
22                                                                           */
23 #include "AliHLTTRDEsdWriterComponent.h"
24 #include "AliHLTTRDDefinitions.h"
25 #include "AliHLTTRDUtils.h"
26 #include "AliHLTCTPData.h"
27 #include "AliESDEvent.h"
28 #include "AliESDfriend.h"
29 #include "AliESDtrack.h"
30 #include "AliTRDtrackV1.h"
31 #include "TTree.h"
32 #include "TFile.h"
33
34 /** ROOT macro for the implementation of ROOT specific class methods */
35 ClassImp(AliHLTTRDEsdWriterComponent)
36
37 AliHLTTRDEsdWriterComponent::AliHLTTRDEsdWriterComponent()
38 :AliHLTRootFileWriterComponent()
39   ,fTree(NULL)
40   ,fESD(NULL)
41   ,fESDfriend(NULL)
42   ,fFile(NULL)
43   ,fTracksArray(NULL)
44 {
45   // see header file for class documentation
46   // or
47   // refer to README to build package
48   // or
49   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
50 }
51
52 AliHLTTRDEsdWriterComponent::AliHLTTRDEsdWriterComponent(const AliHLTTRDEsdWriterComponent&)
53   :AliHLTRootFileWriterComponent()
54   ,fTree(NULL)
55   ,fESD(NULL)
56   ,fESDfriend(NULL)
57   ,fFile(NULL)
58   ,fTracksArray(NULL)
59 {
60 }
61
62 void AliHLTTRDEsdWriterComponent::GetInputDataTypes( vector<AliHLTComponent_DataType>& list)
63 {
64   // Get the list of input data  
65   list.clear(); // We do not have any requirements for our input data type(s).
66   list.push_back( AliHLTTRDDefinitions::fgkTracksDataType );
67   list.push_back( AliHLTTRDDefinitions::fgkHiLvlTracksDataType );
68 }
69
70 AliHLTTRDEsdWriterComponent::~AliHLTTRDEsdWriterComponent()
71 {
72   // see header file for class documentation
73 }
74
75 int AliHLTTRDEsdWriterComponent::InitWriter()
76 {
77   // see header file for class documentation
78   
79   fFile = new TFile("AliHLTTRDESDs.root", "recreate");
80   fFile->cd();
81   fESD = new AliESDEvent;
82   fESD->CreateStdContent();
83   fTree = new TTree("esdTree", "Tree with HLT ESD objects");
84   fESD->WriteToTree(fTree);
85   fESDfriend = new AliESDfriend();
86   /*TBranch* br=*/fTree->Branch("ESDfriend.","AliESDfriend", &fESDfriend);
87   //br->SetFile("AliHLTTRDESDfriends.root");
88   fESD->AddObject(fESDfriend);
89   fTree->GetUserInfo()->Add(fESD);
90   fTracksArray = new TClonesArray("AliTRDtrackV1");
91
92   SetupCTPData();
93
94   return 0;
95 }
96
97 int AliHLTTRDEsdWriterComponent::CloseWriter()
98 {
99   // see header file for class documentation
100
101   //fTree->Print();
102   fFile->Write();
103   fFile->Close();
104   delete fFile; fFile=0;
105   //delete fTree;
106   delete fTracksArray; fTracksArray=0;
107
108   return AliHLTRootFileWriterComponent::CloseWriter();
109 }
110
111 int AliHLTTRDEsdWriterComponent::DumpEvent( const AliHLTComponentEventData& /*evtData*/,
112                                             const AliHLTComponentBlockData* /*blocks*/, 
113                                             AliHLTComponentTriggerData& trigData )
114 {
115   TClonesArray* TCAarray[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
116   Int_t usedEntries = 0;
117   Int_t blockOrObject = 0;
118
119   for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(AliHLTTRDDefinitions::fgkTracksDataType); pBlock; pBlock=GetNextInputBlock()) 
120     {
121       TCAarray[0] = fTracksArray;
122       AliHLTTRDUtils::ReadTracks(TCAarray[0], pBlock->fPtr, pBlock->fSize);
123       usedEntries = 1;
124       blockOrObject = -1;
125     }
126
127   for(const TObject *iter = GetFirstInputObject(AliHLTTRDDefinitions::fgkHiLvlTracksDataType); iter; iter = GetNextInputObject()) 
128     {
129       if(blockOrObject<0){
130         HLTError("You may not mix high level and low level!");
131         return -1;
132       }
133
134       TCAarray[usedEntries] = dynamic_cast<TClonesArray*>(const_cast<TObject*>(iter));
135       if(!TCAarray[usedEntries])continue;
136       usedEntries++;
137       blockOrObject = 1;
138     }
139
140   if(!blockOrObject)
141     return 0;
142
143   fESD->Reset(); 
144   fESD->SetMagneticField(GetBz());
145   fESD->SetRunNumber(GetRunNo());
146   fESD->SetPeriodNumber(GetPeriodNumber());
147   fESD->SetOrbitNumber(GetOrbitNumber());
148   fESD->SetBunchCrossNumber(GetBunchCrossNumber());
149   fESD->SetTimeStamp(GetTimeStamp());
150   fESD->SetEventType(7);
151
152   const AliHLTCTPData* pCTPData=CTPData();
153   if (pCTPData) {
154     AliHLTUInt64_t mask=pCTPData->ActiveTriggers(trigData);
155     for (int index=0; index<gkNCTPTriggerClasses; index++) {
156       if ((mask&((AliHLTUInt64_t)0x1<<index)) == 0) continue;
157       fESD->SetTriggerClass(pCTPData->Name(index), index);
158     }
159     fESD->SetTriggerMask(mask);
160   }
161   
162   for(int i=0; i<usedEntries; i++){
163     const TClonesArray* inArr = TCAarray[i];
164     for(int ii=0; ii<inArr->GetEntriesFast(); ii++){
165       AliTRDtrackV1* inV1 = (AliTRDtrackV1*)inArr->UncheckedAt(ii);
166       AliESDtrack *esdTrack = new AliESDtrack();
167       esdTrack->UpdateTrackParams(inV1, AliESDtrack::kTRDout);
168       esdTrack->SetLabel(inV1->GetLabel());
169       inV1->UpdateESDtrack(esdTrack);
170       AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(*inV1);
171       calibTrack->SetOwner();
172       esdTrack->AddCalibObject(calibTrack);
173       fESD->AddTrack(esdTrack);
174       delete esdTrack;
175     }
176   }
177   
178   fESD->GetESDfriend(fESDfriend);
179   Int_t nb = fTree->Fill();  //endless-
180   printf("Tree filled with %i bytes\n", nb);
181   fESD->Reset();
182   fESDfriend->~AliESDfriend();
183   new (fESDfriend) AliESDfriend();
184
185   if(blockOrObject<0){
186     TCAarray[0]->Delete();
187   }
188
189   return 0;
190 }