3 // Author: C. Loizides <loizides@ikf.uni-frankfurt.de>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliL3StandardIncludes.h"
8 #include "AliL3RootTypes.h"
9 #include "AliL3Logging.h"
10 #include "AliL3Transform.h"
11 #include "AliL3MemHandler.h"
12 #include "AliL3DigitData.h"
14 #include "AliL3RawDataFileHandler.h"
20 /** \class AliL3RawDataFileHandler
22 //_____________________________________________________________
23 // AliL3RawDataFileHandler
28 ClassImp(AliL3RawDataFileHandler)
30 AliL3RawDataFileHandler::AliL3RawDataFileHandler()
34 if((sizeof(Int_t) != 4) || (sizeof(Short_t) != 2)){
35 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::AliL3RawDataFileHandler","Constructor")
36 <<"Check architecture to run the conversion on! Int_t should be 32 and Short_t should be 16 bit."<<ENDLOG;
40 AliL3RawDataFileHandler::~AliL3RawDataFileHandler()
45 void AliL3RawDataFileHandler::FreeAll()
47 if(fInRaw) CloseRawInput();
48 if(fInRawPed) CloseRawPedestalsInput();
49 if(fMapping) CloseMappingFile();
55 if(fPedestals) delete[] fPedestals;
56 if(fOutRaw) CloseRawOutput();
67 fRowMinUsed=AliL3Transform::GetNRows();
72 for(Int_t i=0;i<AliL3Transform::GetNRows();i++) fNPads[i]=0;
77 Bool_t AliL3RawDataFileHandler::SetRawInput(Char_t *name)
80 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawInput","File Open")
81 <<"File ptr is already in use, close file first"<<ENDLOG;
85 //Open the raw data file with name.
86 fInRaw = new ifstream();
87 fInRaw->open(name,fstream::binary);
89 if(!fInRaw->is_open()){
90 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawInput","File Open")
91 <<"Pointer to ifstream = 0x0"<<ENDLOG;
98 Bool_t AliL3RawDataFileHandler::SetRawInput(ifstream *file)
101 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawInput","File Open")
102 <<"File ptr is already in use, close file first"<<ENDLOG;
106 //Open the raw data file with given file.
109 if(!fInRaw->is_open()){
110 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawInput","File Open")
111 <<"Pointer to ifstream = 0x0"<<ENDLOG;
118 void AliL3RawDataFileHandler::CloseRawInput()
121 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::CloseRawInput","File Close")
122 <<"Nothing to Close"<<ENDLOG;
125 if(fInRaw->is_open()) fInRaw->close();
130 Bool_t AliL3RawDataFileHandler::SetRawOutput(Char_t *name)
133 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawOutput","File Open")
134 <<"File ptr is already in use, close file first"<<ENDLOG;
138 fOutRaw = new ofstream();
139 fOutRaw->open(name,fstream::binary);
141 if(!fOutRaw->is_open()){
142 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawOutput","File Open")
143 <<"Pointer to ofstream = 0x0"<<ENDLOG;
150 Bool_t AliL3RawDataFileHandler::SetRawOutput(ofstream *file)
153 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawOutput","File Open")
154 <<"File ptr is already in use, close file first"<<ENDLOG;
158 //Open the raw data file with given file.
161 if(!fOutRaw->is_open()){
162 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawOutput","File Open")
163 <<"Pointer to ofstream = 0x0"<<ENDLOG;
170 void AliL3RawDataFileHandler::CloseRawOutput()
173 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::CloseRawOutput","File Close")
174 <<"Nothing to Close"<<ENDLOG;
177 if(fOutRaw->is_open()) fOutRaw->close();
183 Bool_t AliL3RawDataFileHandler::SetRawPedestalsInput(Char_t *name)
186 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawPedestalsInput","File Open")
187 <<"File ptr is already in use, close file first"<<ENDLOG;
191 //Open the raw data file with name.
192 fInRawPed = new ifstream();
193 fInRawPed->open(name,fstream::binary);
195 if(!fInRawPed->is_open()){
196 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawPedestalsInput","File Open")
197 <<"Pointer to ifstream = 0x0"<<ENDLOG;
204 Bool_t AliL3RawDataFileHandler::SetRawPedestalsInput(ifstream *file)
207 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawPedestalsInput","File Open")
208 <<"File ptr is already in use, close file first"<<ENDLOG;
212 //Open the raw data file with given file.
215 if(!fInRawPed->is_open()){
216 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetRawPedestalsInput","File Open")
217 <<"Pointer to ifstream = 0x0"<<ENDLOG;
224 void AliL3RawDataFileHandler::CloseRawPedestalsInput()
227 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::CloseRawPedestalsInput","File Close")
228 <<"Nothing to Close"<<ENDLOG;
231 if(fInRawPed->is_open()) fInRawPed->close();
236 Bool_t AliL3RawDataFileHandler::SetMappingFile(Char_t *name)
239 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetMapping","File Open")
240 <<"File ptr is already in use, close file first"<<ENDLOG;
244 fMapping = fopen(name,"r");
246 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::SetMappingFile","File Open")
247 <<"Pointer to file = 0x0"<<ENDLOG;
254 Bool_t AliL3RawDataFileHandler::SetMappingFile(FILE *file)
257 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::SetMapping","File Open")
258 <<"File ptr is already in use, close file first"<<ENDLOG;
264 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::SetMappingFile","File Open")
265 <<"Pointer to file = 0x0"<<ENDLOG;
272 void AliL3RawDataFileHandler::CloseMappingFile()
275 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::CloseMappingFile","File Close")
276 <<"Nothing to Close"<<ENDLOG;
283 Int_t AliL3RawDataFileHandler::ReadMappingFile()
286 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadMappingFile","File Open")
287 <<"Pointer to file = 0x0"<<ENDLOG;
292 fgets(dummy,80,fMapping);
295 fscanf(fMapping,"%s %d %s %d",dummy,&nboard,dummy,&nadc);
297 fNChannels=nboard*nadc;
299 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::ReadMappingFile","Data Inconsistency")
300 <<"fNChannels must be greater than 0"<<ENDLOG;
304 fRow=new Byte_t[fNChannels];
305 fPad=new Byte_t[fNChannels];
306 fRowPad=new Short_t*[AliL3Transform::GetNRows()];
307 for(Int_t i=0; i < AliL3Transform::GetNRows(); i++){
308 fRowPad[i]=new Short_t[AliL3Transform::GetNPads(i)];
309 for(Int_t j=0; j < AliL3Transform::GetNPads(i); j++) fRowPad[i][j]=-1;
312 for(UInt_t i=0;i<fNChannels;i++){
313 Int_t board,adc,row,pad;
314 if(fscanf(fMapping,"%d %d %d %d",&board,&adc,&row,&pad)!=4) break;
319 if(row>fRowMaxUsed) fRowMaxUsed=row;
320 if(row<fRowMinUsed) fRowMinUsed=row;
321 if(pad>fPadMaxUsed) fPadMaxUsed=pad;
322 if(pad<fPadMinUsed) fPadMinUsed=pad;
325 //cout << i << " " << row << " " << pad << endl;
331 inline Int_t AliL3RawDataFileHandler::Convert4(Int_t i)
332 { //BigEndian i0i1i2i3 -> LittleEndian i3i2i1i0
333 if(!fConvert) return i;
334 Char_t *p=(Char_t*)&i;
340 return (*(Int_t*)temp);
343 inline Short_t AliL3RawDataFileHandler::Convert2(Short_t s)
344 { //BigEndian i0i1 -> LittleEndian i1i0
345 if(!fConvert) return s;
346 Char_t *p=(Char_t*)&s;
350 return (*(Short_t*)temp);
353 Int_t AliL3RawDataFileHandler::ReadRawInput()
355 //Read data from cosmics file into memory
358 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInput","File Open")
359 <<"No Input avalible: no object ifstream"<<ENDLOG;
363 if(!fInRaw->is_open()){
364 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInput","File Open")
365 <<"No Input avalible: ifstream not opened"<<ENDLOG;
371 fInRaw->read((Char_t*)&dummy4,sizeof(dummy4));
372 if(dummy4==(Int_t)fNChannels) fConvert=kFALSE;
374 Int_t knumofChannels = Convert4(dummy4);
375 if(knumofChannels!=(Int_t)fNChannels){
376 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInput","Data Inconsistency")
377 <<"Number of Channels should be equal to fNChannels "<<knumofChannels<<" "<<fNChannels<<ENDLOG;
382 //read used altrochannels (for the moment
383 //this information is not really needed as
384 //all channels per FEC are used
385 for(UInt_t i = 0 ; i < fNChannels ; i++){
386 fInRaw->read((Char_t*)&dummy2,sizeof(dummy2));
387 UShort_t channel = Convert2(dummy2);
388 if(channel>fNChannels){
389 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::ReadRawInput","Data Inconsistency")
390 <<AliL3Log::kDec<<"Channel number must be smaller then fNChannels "<<channel<<" "<<fNChannels<<ENDLOG;
395 fInRaw->read((Char_t*)&dummy4,sizeof(dummy4));
396 Int_t numofChannelsTest = Convert4(dummy4);
398 if (numofChannelsTest != (Int_t)fNChannels){
399 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::ReadRawInput","Data Inconsistency")
400 <<AliL3Log::kDec<<"Number of test channels should be equal to fNChannels "<<numofChannelsTest<<" "<<fNChannels<<ENDLOG;
405 fInRaw->read((Char_t*)&dummy4,sizeof(dummy4));
406 fNTimeBins=Convert4(dummy4);
408 if(fNTimeBins!=AliL3Transform::GetNTimeBins()){
409 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawInput","Data Inconsistency")
410 <<AliL3Log::kDec<<"fNTimeBins does not match AliL3Transformer, check AliL3Transform::Init() "<<fNTimeBins<<" "<<AliL3Transform::GetNTimeBins()<<ENDLOG;
416 Short_t** AliL3RawDataFileHandler::GetRawData(Int_t &channels, Int_t &timebins)
423 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::GetRawData","Data Inconsistency")
424 <<"Call AliL3RawDataFileHandler::RawReadInput() first"<<ENDLOG;
426 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::GetRawData","Data Inconsistency")
427 <<"Something went wrong reading data header"<<ENDLOG;
432 charges=new Short_t*[fNChannels];
433 for(UInt_t c=0;c<fNChannels;c++) charges[c]=new Short_t[fNTimeBins];
435 for(UInt_t channel = 0; channel < fNChannels; channel++){
436 for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){
438 fInRaw->read((Char_t*)&dummy2,sizeof(dummy2));
439 Short_t charge = Convert2(dummy2);
440 charges[channel][timebin]=charge;
450 Int_t AliL3RawDataFileHandler::StoreRawData(Short_t **charges)
452 //store charges in the raw data format
455 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::StoreRawData","File Open")
456 <<"No Output avalible: no object ofstream"<<ENDLOG;
460 if(!fOutRaw->is_open()){
461 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::StoreRawData","File Open")
462 <<"No Output avalible: ofstream not opened"<<ENDLOG;
469 dummy4=Convert4(fNChannels);
471 fOutRaw->write((Char_t*)&dummy4,sizeof(dummy4));
472 for(UInt_t i = 0 ; i < fNChannels ; i++){
473 dummy2 = Convert2(Short_t(i));
474 fOutRaw->write((Char_t*)&dummy2,sizeof(dummy2));
477 dummy4=Convert4(fNChannels);
478 fOutRaw->write((Char_t*)&dummy4,sizeof(dummy4));
481 dummy4=Convert4(fNTimeBins);
482 fOutRaw->write((Char_t*)&dummy4,sizeof(dummy4));
484 for(UInt_t channel = 0; channel < fNChannels; channel++){
485 for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){
486 Short_t charge=charges[channel][timebin];
487 dummy2 = Convert2(charge);
488 fOutRaw->write((Char_t*)&dummy2,sizeof(dummy2));
495 Int_t AliL3RawDataFileHandler::ReadRawPedestalsInput()
498 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawPedestalsInput","File Open")
499 <<"No Input avalible: no object ifstream"<<ENDLOG;
503 if(!fInRawPed->is_open()){
504 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawPedestalsInput","File Open")
505 <<"No Input avalible: ifstream not opened"<<ENDLOG;
511 fInRawPed->read((Char_t*)&dummy4,sizeof(dummy4));
512 if(dummy4==(Int_t)fNChannels) fConvert=kFALSE;
514 Int_t knumofChannels = Convert4(dummy4);
515 if(knumofChannels!=(Int_t)fNChannels){
516 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawPedestalsInput","Data Inconsistency")
517 <<AliL3Log::kDec<<"Number of Channels should be equal to fNChannels "<<knumofChannels<<" "<<fNChannels<<ENDLOG;
522 //read used altrochannels (for the moment
523 for(UInt_t i = 0 ; i < fNChannels ; i++){
524 fInRawPed->read((Char_t*)&dummy2,sizeof(dummy2));
525 //UShort_t channel = Convert2(dummy2);
528 fInRawPed->read((Char_t*)&dummy4,sizeof(dummy4));
529 //Int_t numofChannelsTest = Convert4(dummy4);
532 fInRawPed->read((Char_t*)&dummy4,sizeof(dummy4));
533 fNTimeBins=Convert4(dummy4);
535 if(fNTimeBins!=AliL3Transform::GetNTimeBins()){
536 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::ReadRawPedestalsInput","Data Inconsistency")
537 <<AliL3Log::kDec<<"fNTimeBins does not match AliL3Transformer, check AliL3Transform::Init() "<<fNTimeBins<<" "<<AliL3Transform::GetNTimeBins()<<ENDLOG;
541 fPedestals=new Short_t*[fNChannels];
542 for(UInt_t c=0;c<fNChannels;c++) fPedestals[c]=new Short_t[fNTimeBins];
544 for(UInt_t channel = 0; channel < fNChannels; channel++){
545 for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){
547 fInRawPed->read((Char_t*)&dummy2,sizeof(dummy2));
548 Short_t charge = Convert2(dummy2);
549 fPedestals[channel][timebin]=charge;
556 AliL3DigitRowData * AliL3RawDataFileHandler::RawData2Memory(UInt_t &nrow,Int_t event)
557 { //event is not used
558 AliL3DigitRowData *data = 0;
562 LOG(AliL3Log::kWarning,"AliL3RawDataFileHandler::RawData2Memory","Data Inconsistency")
563 <<"Call AliL3RawDataFileHandler::RawReadInput() first"<<ENDLOG;
565 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::RawData2Memory","Data Inconsistency")
566 <<"Something went wrong reading data header"<<ENDLOG;
572 Short_t charges[fNChannels][fNTimeBins];
573 for(UInt_t channel = 0; channel < fNChannels; channel++){
574 for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){
576 fInRaw->read((Char_t*)&dummy2,sizeof(dummy2));
577 Short_t charge = Convert2(dummy2);
579 //Pedestal substraction
580 if(fPedestals) charge-=fPedestals[channel][timebin];
581 else charge-=fPedVal;
582 if(charge<0) charge=0;
584 charges[channel][timebin]=charge;
591 Int_t ndigits[AliL3Transform::GetNRows()];
592 for(Int_t i=0;i<AliL3Transform::GetNRows();i++) ndigits[i]=0;
594 //no need to search for slice/sector given by init
595 //but check for row/patch boundaries
597 for(Int_t slrow=0;slrow<AliL3Transform::GetNRows();slrow++){
599 if(slrow<fRowMin) continue;
600 if(slrow>fRowMax) break;
602 for(Int_t pad=0;pad<AliL3Transform::GetNPads(slrow);pad++){
603 Short_t channel=fRowPad[slrow][pad];
604 if(channel==-1) continue; //no data on that channel;
606 for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){
607 Int_t dig=charges[channel][timebin];
609 if(dig <= AliL3Transform::GetZeroSup()) continue;
610 if(dig >= AliL3Transform::GetADCSat())
611 dig = AliL3Transform::GetADCSat();
613 ndigits[slrow]++; //for this row only
614 ndigitcount++; //total number of digits to be published
618 //count number of rows
622 //test data consistency
623 Int_t ndigitcounttest=0;
624 for(Int_t slrow=0;slrow<AliL3Transform::GetNRows();slrow++)
625 ndigitcounttest+=ndigits[slrow];
626 if(ndigitcount!=ndigitcounttest)
627 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::RawData2Memory","Digits")
628 <<AliL3Log::kDec<<"Found Inconsistency "<<ndigitcount<<" != "<<ndigitcounttest<<ENDLOG;
630 Int_t size = sizeof(AliL3DigitData)*ndigitcount
631 + nrows*sizeof(AliL3DigitRowData);
632 LOG(AliL3Log::kDebug,"AliL3RawDataFileHandler::RawData2Memory","Digits")
633 <<AliL3Log::kDec<<"Found "<<ndigitcount<<" Digits on "<<nrows<<" rows"<<ENDLOG;
636 data=(AliL3DigitRowData*) Allocate(size);
637 nrow = (UInt_t)nrows;
638 //memset(data,1,size); //for debugging
640 Int_t ndigitcounttest2=0;
641 AliL3DigitRowData *tempPt = data;
642 for(Int_t slrow=0;slrow<AliL3Transform::GetNRows();slrow++){
644 if(slrow<fRowMin) continue;
645 if(slrow>fRowMax) break;
647 tempPt->fRow = slrow;
648 tempPt->fNDigit = ndigits[slrow];
651 for(Int_t pad=0;pad<AliL3Transform::GetNPads(slrow);pad++){
652 Short_t channel=fRowPad[slrow][pad];
653 if(channel==-1) continue; //no data on that channel;
655 for(Int_t timebin = 0 ; timebin < fNTimeBins ; timebin++){
656 Int_t dig=charges[channel][timebin];
658 if(dig <= AliL3Transform::GetZeroSup()) continue;
659 if(dig >= AliL3Transform::GetADCSat())
660 dig = AliL3Transform::GetADCSat();
662 //Exclude data outside cone:
663 //AliL3Transform::Raw2Local(xyz,sector,row,pad,time);
664 //if(fParam->GetPadRowRadii(sector,row)<230./250.*fabs(xyz[2])) continue;
666 tempPt->fDigitData[localcount].fCharge=(UShort_t)dig;
667 tempPt->fDigitData[localcount].fPad=(UChar_t)pad;
668 tempPt->fDigitData[localcount].fTime=(UShort_t)timebin;
670 tempPt->fDigitData[localcount].fTrackID[0] = 0;
671 tempPt->fDigitData[localcount].fTrackID[1] = 0;
672 tempPt->fDigitData[localcount].fTrackID[2] = 0;
679 if(localcount != ndigits[slrow])
680 LOG(AliL3Log::kFatal,"AliL3RawDataFileHandler::RawData2Memory","Memory")
681 <<AliL3Log::kDec<<"Mismatch: localcount "<<localcount<<" ndigits "
682 <<ndigits[slrow]<<ENDLOG;
684 Byte_t *tmp = (Byte_t*)tempPt;
685 Int_t size = sizeof(AliL3DigitRowData)
686 + ndigits[slrow]*sizeof(AliL3DigitData);
688 tempPt = (AliL3DigitRowData*)tmp;
691 if(ndigitcount!=ndigitcounttest2)
692 LOG(AliL3Log::kError,"AliL3RawDataFileHandler::RawData2Memory","Digits")
693 <<AliL3Log::kDec<<"Found Inconsistency "<<ndigitcount<<" != "<<ndigitcounttest2<<ENDLOG;
698 Bool_t AliL3RawDataFileHandler::RawData2CompBinary(Int_t event)
702 AliL3DigitRowData *digits=0;
703 digits = RawData2Memory(ndigits,event);
704 out = Memory2CompBinary(ndigits,digits);