1 ////////////////////////////////////////////////////////////
2 // Author: Henrik Tydesjo //
3 // Interface class to the containers of an online scan. //
4 // Directly connected to a TFile with all containers. //
5 // Handles reading and writing of this TFile. //
6 // Hitmaps and information on nr of events with hits //
7 // is stored in this file (AliITSOnlineSPDHitArray and //
8 // AliITSOnlineSPDHitEvent). Also some general //
9 // information is stored (AliITSOnlineSPDscanInfo). //
10 // When switching between different steps of the scan, //
11 // the previous step is automatically stored on the file. //
12 // With this scheme there is no risk of running out of //
14 ////////////////////////////////////////////////////////////
19 #include "AliITSOnlineSPDscan.h"
20 #include "AliITSOnlineSPDscanInfo.h"
21 #include "AliITSOnlineSPDHitArray.h"
22 #include "AliITSOnlineSPDHitEvent.h"
24 AliITSOnlineSPDscan::AliITSOnlineSPDscan(const Char_t *fileName) :
29 fInfoModified(kFALSE),
33 // constructor, open file for reading or writing
34 // look for a previously saved info object
35 // (if file not found create a new one and return, else read)
36 FILE* fp0 = fopen(fFileName.Data(), "r");
38 fScanInfo = new AliITSOnlineSPDscanInfo();
39 fFile = new TFile(fFileName.Data(), "RECREATE");
44 fFile = new TFile(fFileName.Data(), "READ");
46 fFile->GetObject("AliITSOnlineSPDscanInfo", fScanInfo);
51 AliITSOnlineSPDscan::AliITSOnlineSPDscan(const AliITSOnlineSPDscan& /*scan*/) :
56 fInfoModified(kFALSE),
60 printf("This object should not be copied!");
63 AliITSOnlineSPDscan::~AliITSOnlineSPDscan() {
68 for (UInt_t hs=0; hs<6; hs++) {
69 if (fCurrentHitArray[hs]!=NULL) {
70 delete fCurrentHitArray[hs];
71 fCurrentHitArray[hs]=NULL;
73 if (fCurrentHitEvent[hs]!=NULL) {
74 delete fCurrentHitEvent[hs];
75 fCurrentHitEvent[hs]=NULL;
82 fFile = new TFile(fFileName.Data(), "UPDATE");
85 fFile->Delete("AliITSOnlineSPDscanInfo;*");
86 fFile->WriteTObject(fScanInfo, "AliITSOnlineSPDscanInfo");
93 AliITSOnlineSPDscan& AliITSOnlineSPDscan::operator=(const AliITSOnlineSPDscan& scan) {
94 // assignment operator (should not be used)
95 printf("This object should not be copied!");
97 // still do nothing...
102 void AliITSOnlineSPDscan::ClearThis() {
103 // clear this scan, close file and open new
104 for (UInt_t hs=0; hs<6; hs++) {
105 if (fCurrentHitArray[hs]!=NULL) {
106 delete fCurrentHitArray[hs];
108 fCurrentHitArray[hs] = NULL;
109 if (fCurrentHitEvent[hs]!=NULL) {
110 delete fCurrentHitEvent[hs];
112 fCurrentHitEvent[hs] = NULL;
114 fScanInfo->ClearThis();
117 fFile = new TFile(fFileName.Data(), "RECREATE");
119 fFile->WriteTObject(fScanInfo, "AliITSOnlineSPDscanInfo");
123 void AliITSOnlineSPDscan::Init() {
124 // init hit arrays and hit events
125 for (UInt_t hs=0; hs<6; hs++) {
126 fCurrentHitArray[hs]=NULL;
127 fCurrentHitEvent[hs]=NULL;
132 UInt_t AliITSOnlineSPDscan::AddScanStep() {
133 // add a new scan step
135 return fScanInfo->AddScanStep();
138 void AliITSOnlineSPDscan::CreateNewStep() {
140 // save current step to file (if modified)
145 for (UInt_t hs=0; hs<6; hs++) {
146 if (fCurrentHitArray[hs]!=NULL) {
147 delete fCurrentHitArray[hs];
149 fCurrentHitArray[hs] = new AliITSOnlineSPDHitArray();
150 if (fCurrentHitEvent[hs]!=NULL) {
151 delete fCurrentHitEvent[hs];
153 fCurrentHitEvent[hs] = new AliITSOnlineSPDHitEvent();
155 fCurrentStep = fScanInfo->GetNSteps();
160 void AliITSOnlineSPDscan::SwitchToStep(UInt_t nsi) {
161 // switch to step nsi (save current step first if needed)
162 if ((Int_t)nsi!=fCurrentStep) {
166 for (UInt_t hs=0; hs<6; hs++) {
167 if (fCurrentHitArray[hs]!=NULL) {
168 delete fCurrentHitArray[hs];
169 fCurrentHitArray[hs]=NULL;
171 if (fCurrentHitEvent[hs]!=NULL) {
172 delete fCurrentHitEvent[hs];
173 fCurrentHitEvent[hs]=NULL;
176 if (nsi>=GetNSteps()) {
177 FillGap(nsi); // makes fCurrentStep = nsi
186 void AliITSOnlineSPDscan::FillGap(UInt_t nsi) {
187 //create new steps until nsi is reached
188 while (nsi>=GetNSteps()) {
189 fCurrentStep = AddScanStep();
193 void AliITSOnlineSPDscan::ReadCurrentStep() {
194 // read current step index into memory
195 for (UInt_t hs=0; hs<6; hs++) {
196 TString stepName = Form("HitArray_HS%d_Step%d",hs,fCurrentStep);
197 fFile->GetObject(stepName.Data(), fCurrentHitArray[hs]);
198 TString stepName2 = Form("HitEvent_HS%d_Step%d",hs,fCurrentStep);
199 fFile->GetObject(stepName2, fCurrentHitEvent[hs]);
203 void AliITSOnlineSPDscan::SaveCurrentStep() {
204 // save current step to file
208 fFile = new TFile(fFileName.Data(), "UPDATE");
211 for (UInt_t hs=0; hs<6; hs++) {
212 TString stepName = Form("HitArray_HS%d_Step%d",hs,fCurrentStep);
213 TString stepDelete = Form("%s;*",stepName.Data());
214 fFile->Delete(stepDelete.Data());
215 fFile->WriteTObject(fCurrentHitArray[hs], stepName.Data());
216 TString stepName2 = Form("HitEvent_HS%d_Step%d",hs,fCurrentStep);
217 TString stepDelete2 = Form("%s;*",stepName2.Data());
218 fFile->Delete(stepDelete2.Data());
219 fFile->WriteTObject(fCurrentHitEvent[hs], stepName2.Data());
224 void AliITSOnlineSPDscan::SetHits(UInt_t nsi, UInt_t hs, UInt_t chipi, UInt_t coli, UInt_t rowi, UInt_t val) {
225 // set nr of hits for pixel
227 fCurrentHitArray[hs]->SetHits(chipi,coli,rowi,val);
230 void AliITSOnlineSPDscan::IncrementHits(UInt_t nsi, UInt_t hs, UInt_t chipi, UInt_t coli, UInt_t rowi) {
231 // increment nr of hits for pixel
233 fCurrentHitArray[hs]->IncrementHits(chipi,coli,rowi);
236 void AliITSOnlineSPDscan::SetHitEvents(UInt_t nsi, UInt_t hs, UInt_t chipi, Int_t val) {
237 // set nr of hit events for a chip
239 fCurrentHitEvent[hs]->SetHitEvent(chipi,val);
242 void AliITSOnlineSPDscan::SetHitEventsTot(UInt_t nsi, UInt_t hs, Int_t val) {
243 // set nr of hit events for 10 chips together
244 SetHitEvents(nsi,hs,10,val);
246 void AliITSOnlineSPDscan::IncrementHitEvents(UInt_t nsi, UInt_t hs, UInt_t chipi) {
247 // increment nr of hit events for a chip
249 fCurrentHitEvent[hs]->IncrementHitEvent(chipi);
252 void AliITSOnlineSPDscan::IncrementHitEventsTot(UInt_t nsi, UInt_t hs) {
253 // increment nr of hit events for 10 chips
254 IncrementHitEvents(nsi,hs,10);
258 UInt_t AliITSOnlineSPDscan::GetHits(UInt_t nsi, UInt_t hs, UInt_t chipi, UInt_t coli, UInt_t rowi) {
259 // get nr of hits for pixel
260 if (nsi<GetNSteps()) {
262 return fCurrentHitArray[hs]->GetHits(chipi,coli,rowi);
268 Float_t AliITSOnlineSPDscan::GetHitsEfficiency(UInt_t nsi, UInt_t hs, UInt_t chipi, UInt_t coli, UInt_t rowi) {
269 // get the hit efficiency for pixel
270 UInt_t ntr = GetTriggers(nsi);
272 return ((Float_t)GetHits(nsi,hs,chipi,coli,rowi))/ntr;
278 Float_t AliITSOnlineSPDscan::GetHitsEfficiencyError(UInt_t nsi, UInt_t hs, UInt_t chipi, UInt_t coli, UInt_t rowi) {
279 // get error in hit efficiency for pixel
280 Float_t hits = GetHits(nsi,hs,chipi,coli,rowi);
281 UInt_t ntr = GetTriggers(nsi);
282 return sqrt(hits*(ntr-hits)/ntr)/ntr;
284 UInt_t AliITSOnlineSPDscan::GetHitEvents(UInt_t nsi, UInt_t hs, UInt_t chipi) {
285 // get nr of hit events for a chip
286 if (nsi<GetNSteps()) {
288 return fCurrentHitEvent[hs]->GetHitEvent(chipi);
294 UInt_t AliITSOnlineSPDscan::GetHitEventsTot(UInt_t nsi, UInt_t hs) {
295 // get nr of hit events for 10 chips
296 return GetHitEvents(nsi,hs,10);
298 Float_t AliITSOnlineSPDscan::GetHitEventsEfficiency(UInt_t nsi, UInt_t hs, UInt_t chipi) {
299 // get the hit events efficiency for a chip
300 UInt_t ntr = GetTriggers(nsi);
302 return ((Float_t)GetHitEvents(nsi,hs,chipi))/ntr;
308 Float_t AliITSOnlineSPDscan::GetHitEventsTotEfficiency(UInt_t nsi, UInt_t hs) {
309 // get the hit events efficiency for 10 chips
310 return GetHitEventsEfficiency(nsi,hs,10);
312 Float_t AliITSOnlineSPDscan::GetHitEventsEfficiencyError(UInt_t nsi, UInt_t hs, UInt_t chipi) {
313 // get error in hit events efficiency for a chip
314 Float_t hitevents = (Float_t) GetHitEvents(nsi,hs,chipi);
315 UInt_t ntr = GetTriggers(nsi);
316 return sqrt(hitevents*(ntr-hitevents)/ntr)/ntr;
318 Float_t AliITSOnlineSPDscan::GetHitEventsTotEfficiencyError(UInt_t nsi, UInt_t hs) {
319 // get error in hit events efficiency for 10 chips
320 return GetHitEventsEfficiencyError(nsi,hs,10);
322 Float_t AliITSOnlineSPDscan::GetAverageMultiplicity(UInt_t nsi, UInt_t hs, UInt_t chipi) {
323 // get average multiplicity for a chip
325 for (UInt_t chip=0;chip<10;chip++) {
326 if (chipi==10 || chip==chipi) {
327 for (Int_t col=0; col<32; col++) {
328 for (Int_t row=0; row<256; row++) {
329 nrhits+=GetHits(nsi,hs,chip,col,row);
334 UInt_t ntr = GetTriggers(nsi);
342 Float_t AliITSOnlineSPDscan::GetAverageMultiplicityTot(UInt_t nsi, UInt_t hs) {
343 // get average multiplicity for 10 chips
344 return GetAverageMultiplicity(nsi,hs,10);
348 void AliITSOnlineSPDscan::SetType(UInt_t val) {
350 fScanInfo->SetType(val);
353 void AliITSOnlineSPDscan::SetRunNr(UInt_t val) {
355 fScanInfo->SetRunNr(val);
358 void AliITSOnlineSPDscan::SetRouterNr(UInt_t val) {
360 fScanInfo->SetRouterNr(val);
363 void AliITSOnlineSPDscan::SetHalfStaveScanned(UInt_t val, Bool_t b) {
364 // set half stave scanned
365 fScanInfo->SetHalfStaveScanned(val,b);
368 void AliITSOnlineSPDscan::SetDataFormat(UInt_t val) {
369 // set data format (0=normal 1=histogram)
370 fScanInfo->SetDataFormat(val);
373 void AliITSOnlineSPDscan::SetTriggers(UInt_t nsi, UInt_t val) {
374 // set nr of triggers
376 fScanInfo->SetTriggers(nsi,val);
379 void AliITSOnlineSPDscan::SetChipPresent(UInt_t hs, UInt_t chipi, Bool_t val){
381 fScanInfo->SetChipPresent(hs,chipi,val);
384 void AliITSOnlineSPDscan::SetRowStart(UInt_t val){
386 fScanInfo->SetRowStart(val);
389 void AliITSOnlineSPDscan::SetRowEnd(UInt_t val){
391 fScanInfo->SetRowEnd(val);
394 void AliITSOnlineSPDscan::SetDacStart(UInt_t val){
396 fScanInfo->SetDacStart(val);
399 void AliITSOnlineSPDscan::SetDacEnd(UInt_t val){
401 fScanInfo->SetDacEnd(val);
404 void AliITSOnlineSPDscan::SetDacStep(UInt_t val){
406 fScanInfo->SetDacStep(val);
409 void AliITSOnlineSPDscan::SetDCSVersion(UInt_t val){
410 // set dcs db version
411 fScanInfo->SetDCSVersion(val);
414 void AliITSOnlineSPDscan::IncrementTriggers(UInt_t nsi) {
415 // increment nr of triggers
417 fScanInfo->IncrementTriggers(nsi);
423 UInt_t AliITSOnlineSPDscan::GetNSteps() const {
424 return fScanInfo->GetNSteps();
426 UInt_t AliITSOnlineSPDscan::GetType() const {
427 return fScanInfo->GetType();
429 UInt_t AliITSOnlineSPDscan::GetRunNr() const {
430 return fScanInfo->GetRunNr();
432 UInt_t AliITSOnlineSPDscan::GetRouterNr() const {
433 return fScanInfo->GetRouterNr();
435 Bool_t AliITSOnlineSPDscan::GetHalfStaveScanned(UInt_t val) const {
436 return fScanInfo->GetHalfStaveScanned(val);
438 UInt_t AliITSOnlineSPDscan::GetDataFormat() const {
439 return fScanInfo->GetDataFormat();
441 UInt_t AliITSOnlineSPDscan::GetTriggers(UInt_t nsi) const {
442 return fScanInfo->GetTriggers(nsi);
444 Bool_t AliITSOnlineSPDscan::GetChipPresent(UInt_t hs, UInt_t chipi) const {
445 return fScanInfo->GetChipPresent(hs,chipi);
447 UInt_t AliITSOnlineSPDscan::GetRowStart() const {
448 return fScanInfo->GetRowStart();
450 UInt_t AliITSOnlineSPDscan::GetRowEnd() const {
451 return fScanInfo->GetRowEnd();
453 UInt_t AliITSOnlineSPDscan::GetDacStart() const {
454 return fScanInfo->GetDacStart();
456 UInt_t AliITSOnlineSPDscan::GetDacEnd() const {
457 return fScanInfo->GetDacEnd();
459 UInt_t AliITSOnlineSPDscan::GetDacStep() const {
460 return fScanInfo->GetDacStep();
462 UInt_t AliITSOnlineSPDscan::GetDCSVersion() const {
463 return fScanInfo->GetDCSVersion();