3 //**************************************************************************
4 //* This file is property of and copyright by the ALICE HLT Project *
5 //* ALICE Experiment at CERN, All rights reserved. *
7 //* Primary Authors: Jacek Otwinowski <J.Otwinowski@gsi.de> *
9 //* Permission to use, copy, modify and distribute this software and its *
10 //* documentation strictly for non-commercial purposes is hereby granted *
11 //* without fee, provided that the above copyright notice appears in all *
12 //* copies and that both the copyright notice and this permission notice *
13 //* appear in the supporting documentation. The authors make no claims *
14 //* about the suitability of this software for any purpose. It is *
15 //* provided "as is" without express or implied warranty. *
16 //**************************************************************************
18 /** @file AliHLTTPCOfflineCalibrationComponent.cxx
19 @author Jacek Otwinowski <J.Otwinowski@gsi.de>
21 @brief TPC calibration component
24 #include "AliHLTTPCOfflineCalibrationComponent.h"
26 #include "TObjArray.h"
27 #include "TObjString.h"
28 #include "AliTPCcalibAlign.h"
29 #include "AliTPCcalibTracksGain.h"
30 #include "AliTPCcalibTracks.h"
31 #include "AliESDEvent.h"
32 #include "AliESDfriend.h"
33 #include "AliCDBManager.h"
34 #include "AliTPCcalibDB.h"
35 #include "AliTPCClusterParam.h"
36 #include "AliTPCcalibTracksCuts.h"
37 #include "AliTPCseed.h"
38 #include "AliTPCcalibTracksCuts.h"
39 #include "AliTPCClusterParam.h"
40 #include "AliHLTTPCDefinitions.h"
41 #include "AliHLTReadoutList.h"
43 /** ROOT macro for the implementation of ROOT specific class methods */
44 ClassImp(AliHLTTPCOfflineCalibrationComponent)
46 AliHLTTPCOfflineCalibrationComponent::AliHLTTPCOfflineCalibrationComponent() : AliHLTCalibrationProcessor(),
47 fEnableAnalysis(kTRUE),
51 fTPCcalibTracksGain(0),
54 // see header file for class documentation
56 // refer to README to build package
58 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
61 AliHLTTPCOfflineCalibrationComponent::~AliHLTTPCOfflineCalibrationComponent()
63 // see header file for class documentation
66 const char* AliHLTTPCOfflineCalibrationComponent::GetComponentID()
68 // see header file for class documentation
69 return "TPCOfflineCalibration";
72 void AliHLTTPCOfflineCalibrationComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list)
74 // get input data type
76 list.push_back(kAliHLTDataTypeTObjArray|kAliHLTDataOriginTPC/*TObjArray of seeds*/);
79 AliHLTComponentDataType AliHLTTPCOfflineCalibrationComponent::GetOutputDataType()
81 // return ouput data type
82 return kAliHLTMultipleDataType;
86 int AliHLTTPCOfflineCalibrationComponent::GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList)
88 // create output data type
90 tgtList.push_back(AliHLTTPCDefinitions::fgkOfflineCalibAlignDataType);
91 tgtList.push_back(AliHLTTPCDefinitions::fgkOfflineCalibTracksDataType);
92 tgtList.push_back(AliHLTTPCDefinitions::fgkOfflineCalibTracksGainDataType);
94 return tgtList.size();
97 void AliHLTTPCOfflineCalibrationComponent::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier)
99 // get output data size
100 constBase = 30000000;
104 AliHLTComponent* AliHLTTPCOfflineCalibrationComponent::Spawn()
106 // create instance of the component
107 return new AliHLTTPCOfflineCalibrationComponent;
110 int AliHLTTPCOfflineCalibrationComponent::InitCalibration()
112 // init configuration
114 HLTInfo("init calibration component");
121 // Init parameters and cuts
122 fClustParam = AliTPCcalibDB::Instance()->GetClusterParam();
123 fTrackCuts = new AliTPCcalibTracksCuts(20, 0.4, 0.5, 0.13, 0.018);
125 // Init calibration componenets
126 fTPCcalibAlign = new AliTPCcalibAlign("TPCcalibAlign","TPCcalibAlign");
127 fTPCcalibTracksGain = new AliTPCcalibTracksGain("TPCcalibTracksGain","TPCcalibTracksGain",fTrackCuts);
128 fTPCcalibTracks = new AliTPCcalibTracks("TPCcalibTracks","TPCcalibTracks",fClustParam,fTrackCuts);
130 if (!fTrackCuts || !fClustParam || !fTPCcalibAlign || !fTPCcalibTracksGain || !fTPCcalibTracks) {
131 HLTError("failed creating internal objects");
138 Int_t AliHLTTPCOfflineCalibrationComponent::DeinitCalibration()
140 // deinit configuration
141 if(fClustParam) delete fClustParam; fClustParam = 0;
142 if(fTrackCuts) delete fTrackCuts; fTrackCuts = 0;
144 if(fTPCcalibAlign) delete fTPCcalibAlign; fTPCcalibAlign = 0;
145 if(fTPCcalibTracksGain) delete fTPCcalibTracksGain; fTPCcalibTracksGain = 0;
146 if(fTPCcalibTracks) delete fTPCcalibTracks; fTPCcalibTracks = 0;
151 Int_t AliHLTTPCOfflineCalibrationComponent::ScanArgument(Int_t argc, const char** argv)
156 TString configuration="";
158 for (int i=0; i<argc && iResult>=0; i++) {
160 if (argument.IsNull()) continue;
164 HLTError("missing parameter for argument %s", argument.Data());
168 if (iResult>=0 && !configuration.IsNull()) {
169 iResult=Configure(configuration.Data());
171 iResult=Reconfigure(NULL, NULL);
177 int AliHLTTPCOfflineCalibrationComponent::ProcessCalibration(const AliHLTComponentEventData& /*evtData*/, AliHLTComponentTriggerData& /*trigData*/)
179 // calibration function
180 HLTInfo("ProcessCalibration processing data");
183 TObjArray *pSeedsArray=0;
186 // calculate specification
187 const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeTObjArray|kAliHLTDataOriginTPC);
189 HLTError("Cannot get first data block 0x%08x ",pBlock);
190 iResult=-ENOMEM; return iResult;
192 int minSlice=AliHLTTPCDefinitions::GetMinSliceNr(pBlock->fSpecification);
193 int maxSlice=AliHLTTPCDefinitions::GetMaxSliceNr(pBlock->fSpecification);
194 int minPatch=AliHLTTPCDefinitions::GetMinPatchNr(pBlock->fSpecification);
195 int maxPatch=AliHLTTPCDefinitions::GetMaxPatchNr(pBlock->fSpecification);
197 if (fTPCcalibAlign && fTPCcalibTracksGain && fTPCcalibTracks)
199 // loop over input data blocks: TObjArray of TPCseed
200 for (TObject *pObj = (TObject *)GetFirstInputObject(kAliHLTDataTypeTObjArray|kAliHLTDataOriginTPC,"TObjArray",0);
201 pObj !=0 && iResult>=0;
202 pObj = (TObject *)GetNextInputObject(0)) {
204 pSeedsArray = dynamic_cast<TObjArray*>(pObj);
205 if (!pSeedsArray) continue;
207 slice=AliHLTTPCDefinitions::GetMinSliceNr(GetSpecification(pObj));
208 patch=AliHLTTPCDefinitions::GetMinPatchNr(GetSpecification(pObj));
210 if(slice < minSlice) minSlice=slice;
211 if(slice > maxSlice) maxSlice=slice;
212 if(patch < minPatch) minPatch=patch;
213 if(patch > maxPatch) maxPatch=patch;
216 Int_t nseed = pSeedsArray->GetEntriesFast();
217 HLTInfo("Number TPC seeds %d",nseed);
219 for(Int_t i=0; i<nseed; ++i) {
220 AliTPCseed *seed = (AliTPCseed*)pSeedsArray->UncheckedAt(i);
222 HLTInfo("Process calibration on seed 0x%08x", seed);
223 fTPCcalibAlign->Process(seed);
224 fTPCcalibTracksGain->Process(seed);
225 fTPCcalibTracks->Process(seed);
228 // calculate specification from the specification of input data blocks
229 AliHLTUInt32_t iSpecification = AliHLTTPCDefinitions::EncodeDataSpecification(minSlice, maxSlice, minPatch, maxPatch);
232 PushBack((TObject*)fTPCcalibAlign,AliHLTTPCDefinitions::fgkOfflineCalibAlignDataType,iSpecification);
233 PushBack((TObject*)fTPCcalibTracksGain,AliHLTTPCDefinitions::fgkOfflineCalibTracksGainDataType,iSpecification);
234 PushBack((TObject*)fTPCcalibTracks,AliHLTTPCDefinitions::fgkOfflineCalibTracksDataType,iSpecification);
236 // reset standard ESD content
237 pSeedsArray->Delete();
239 }// end loop over input objects
242 HLTError("component not initialized");
249 Int_t AliHLTTPCOfflineCalibrationComponent::ShipDataToFXS( const AliHLTComponentEventData& /*evtData*/,
250 AliHLTComponentTriggerData& /*trigData*/ ) {
251 // see header file for class documentation
252 if( fEnableAnalysis )
254 fTPCcalibAlign->Analyze();
255 fTPCcalibTracksGain->Analyze();
256 fTPCcalibTracks->Analyze();
258 static AliHLTReadoutList rdList(AliHLTReadoutList::kTPC);
259 PushToFXS((TObject*)fTPCcalibAlign, "TPC", "TPCcalibAlign", &rdList) ;
260 PushToFXS((TObject*)fTPCcalibTracksGain, "TPC", "TPCcalibTracksGain", &rdList) ;
261 PushToFXS((TObject*)fTPCcalibTracks, "TPC", "TPCcalibTracks", &rdList) ;
266 int AliHLTTPCOfflineCalibrationComponent::Configure(const char* arguments)
268 // see header file for class documentation
270 if (!arguments) return iResult;
272 TString allArgs=arguments;
276 TObjArray* pTokens=allArgs.Tokenize(" ");
278 for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
279 argument=((TObjString*)pTokens->At(i))->GetString();
280 if (argument.IsNull()) continue;
282 if (argument.CompareTo("-something")==0) {
283 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
286 HLTError("unknown argument %s", argument.Data());
294 HLTError("missing parameter for argument %s", argument.Data());
300 int AliHLTTPCOfflineCalibrationComponent::Reconfigure(const char* /*cdbEntry*/, const char* /*chainId*/)
302 // see header file for class documentation